@pipeline-builder/pipeline-data 4.3.7 → 4.3.9
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/pipeline-step-resolution.js +4 -4
- package/lib/api/reporting/analytics-queries.js +19 -18
- package/lib/api/reporting/plugin-exposure.js +3 -2
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +2 -2
- package/lib/database/pg-result.d.ts +11 -1
- package/lib/database/pg-result.js +14 -1
- package/lib/testing/exports.json +1 -0
- package/package.json +2 -2
|
@@ -51,6 +51,7 @@ import { and, eq, gte, inArray, lt, sql } from 'drizzle-orm';
|
|
|
51
51
|
import { FAILURE_CATEGORY_LABELS, isTeamActionable } from './failure-classifier.js';
|
|
52
52
|
import { liveExposurePredicate } from './plugin-exposure.js';
|
|
53
53
|
import { schema } from '../../database/drizzle-schema.js';
|
|
54
|
+
import { anyText } from '../../database/pg-result.js';
|
|
54
55
|
import { withTenantTxRead } from '../../database/tenancy.js';
|
|
55
56
|
/** The org predicate: one org, or a rollup set. */
|
|
56
57
|
function orgPredicate(col, scope) {
|
|
@@ -81,7 +82,7 @@ export async function getPipelineBreakdown(scope, limit = 10) {
|
|
|
81
82
|
MAX(r.p95_ms)::int AS p95_ms,
|
|
82
83
|
SUM(r.build_seconds)::int AS build_seconds
|
|
83
84
|
FROM execution_daily_rollups r
|
|
84
|
-
WHERE r.org_id ${scope.orgIds?.length ? sql `=
|
|
85
|
+
WHERE r.org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
85
86
|
AND r.day >= ${scope.from}::timestamptz AND r.day < ${scope.to}::timestamptz
|
|
86
87
|
-- The pipeline-level grain only: summing the stage rows too would count
|
|
87
88
|
-- every run once per stage.
|
|
@@ -91,7 +92,7 @@ export async function getPipelineBreakdown(scope, limit = 10) {
|
|
|
91
92
|
deploys AS (
|
|
92
93
|
SELECT pipeline_id, COUNT(*)::int AS deploys
|
|
93
94
|
FROM dora_deployments
|
|
94
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
95
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
95
96
|
AND deployed_at >= ${scope.from}::timestamptz AND deployed_at < ${scope.to}::timestamptz
|
|
96
97
|
AND succeeded = true
|
|
97
98
|
GROUP BY pipeline_id
|
|
@@ -100,7 +101,7 @@ export async function getPipelineBreakdown(scope, limit = 10) {
|
|
|
100
101
|
-- The most recent failing STAGE row per pipeline: what to look at first.
|
|
101
102
|
SELECT DISTINCT ON (pipeline_id) pipeline_id, day, stage_name
|
|
102
103
|
FROM execution_daily_rollups
|
|
103
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
104
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
104
105
|
AND day >= ${scope.from}::timestamptz AND day < ${scope.to}::timestamptz
|
|
105
106
|
AND stage_name <> '' AND failed > 0
|
|
106
107
|
ORDER BY pipeline_id, day DESC, failed DESC
|
|
@@ -172,7 +173,7 @@ async function categoryCounts(scope) {
|
|
|
172
173
|
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
173
174
|
SELECT key AS category, SUM(value::int)::int AS count
|
|
174
175
|
FROM execution_daily_rollups r, jsonb_each(r.failures_by_category)
|
|
175
|
-
WHERE r.org_id ${scope.orgIds?.length ? sql `=
|
|
176
|
+
WHERE r.org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
176
177
|
AND r.day >= ${scope.from}::timestamptz AND r.day < ${scope.to}::timestamptz
|
|
177
178
|
AND r.stage_name = ''
|
|
178
179
|
GROUP BY key
|
|
@@ -198,7 +199,7 @@ async function topPipelinesByCategory(scope, perCategory = 3) {
|
|
|
198
199
|
FROM execution_daily_rollups r
|
|
199
200
|
CROSS JOIN LATERAL jsonb_each(r.failures_by_category) e
|
|
200
201
|
LEFT JOIN pipelines p ON p.id::text = r.pipeline_id
|
|
201
|
-
WHERE r.org_id ${scope.orgIds?.length ? sql `=
|
|
202
|
+
WHERE r.org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
202
203
|
AND r.day >= ${scope.from}::timestamptz AND r.day < ${scope.to}::timestamptz
|
|
203
204
|
AND r.stage_name = ''
|
|
204
205
|
GROUP BY e.key, r.pipeline_id, p.pipeline_name
|
|
@@ -283,7 +284,7 @@ export async function getResourceConsumption(scope, limit = 20) {
|
|
|
283
284
|
SUM(r.runs)::int AS runs
|
|
284
285
|
FROM execution_daily_rollups r
|
|
285
286
|
LEFT JOIN pipelines p ON p.id::text = r.pipeline_id
|
|
286
|
-
WHERE r.org_id ${scope.orgIds?.length ? sql `=
|
|
287
|
+
WHERE r.org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
287
288
|
AND r.day >= ${scope.from}::timestamptz AND r.day < ${scope.to}::timestamptz
|
|
288
289
|
AND r.stage_name = ''
|
|
289
290
|
GROUP BY p.project, r.pipeline_id, p.pipeline_name
|
|
@@ -316,7 +317,7 @@ export async function getPromotionView(scope, productionEnv = 'production', limi
|
|
|
316
317
|
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
317
318
|
SELECT commit_sha, environment, MIN(deployed_at) AS deployed_at
|
|
318
319
|
FROM dora_deployments
|
|
319
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
320
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
320
321
|
AND deployed_at >= ${scope.from}::timestamptz AND deployed_at < ${scope.to}::timestamptz
|
|
321
322
|
AND succeeded = true
|
|
322
323
|
AND commit_sha IS NOT NULL
|
|
@@ -365,7 +366,7 @@ export async function getOutdatedPlugins(scope, limit = 50) {
|
|
|
365
366
|
r.resolved_version, r.latest_version, r.version_gap, r.within_policy
|
|
366
367
|
FROM pipeline_plugin_resolution r
|
|
367
368
|
LEFT JOIN pipelines p ON p.id::text = r.pipeline_id
|
|
368
|
-
WHERE r.org_id ${scope.orgIds?.length ? sql `=
|
|
369
|
+
WHERE r.org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
369
370
|
AND (r.version_gap IN ('major', 'minor', 'patch') OR r.within_policy = false)
|
|
370
371
|
ORDER BY CASE r.version_gap WHEN 'major' THEN 0 WHEN 'minor' THEN 1 WHEN 'patch' THEN 2 ELSE 3 END,
|
|
371
372
|
r.pipeline_id
|
|
@@ -405,7 +406,7 @@ export async function getPluginVulnerabilities(scope, limit = 50) {
|
|
|
405
406
|
v.plugin_version, v.source, v.critical_count, v.high_count, v.top_findings, v.flagged_at
|
|
406
407
|
FROM plugin_vuln_exposure v
|
|
407
408
|
LEFT JOIN pipelines p ON p.id::text = v.pipeline_id
|
|
408
|
-
WHERE v.org_id ${scope.orgIds?.length ? sql `=
|
|
409
|
+
WHERE v.org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
409
410
|
AND ${liveExposurePredicate(now, 'v')}
|
|
410
411
|
ORDER BY v.critical_count DESC, v.high_count DESC
|
|
411
412
|
LIMIT ${limit}
|
|
@@ -441,20 +442,20 @@ export async function getAdoption(scope, timeSavedMinutes) {
|
|
|
441
442
|
WITH scoped AS (
|
|
442
443
|
SELECT id::text AS id, org_id, creation_source
|
|
443
444
|
FROM pipelines
|
|
444
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
445
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
445
446
|
AND deleted_at IS NULL
|
|
446
447
|
),
|
|
447
448
|
active AS (
|
|
448
449
|
SELECT DISTINCT pipeline_id, org_id
|
|
449
450
|
FROM execution_daily_rollups
|
|
450
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
451
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
451
452
|
AND day >= ${scope.from}::timestamptz AND day < ${scope.to}::timestamptz
|
|
452
453
|
AND stage_name = '' AND runs > 0
|
|
453
454
|
),
|
|
454
455
|
tracked AS (
|
|
455
456
|
SELECT DISTINCT pipeline_id
|
|
456
457
|
FROM dora_deployments
|
|
457
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
458
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
458
459
|
AND deployed_at >= ${scope.from}::timestamptz AND deployed_at < ${scope.to}::timestamptz
|
|
459
460
|
)
|
|
460
461
|
SELECT
|
|
@@ -498,7 +499,7 @@ export async function getPipelineStreaks(scope, lookbackDays = 90) {
|
|
|
498
499
|
SUM(succeeded)::int AS succeeded,
|
|
499
500
|
SUM(failed)::int AS failed
|
|
500
501
|
FROM execution_daily_rollups
|
|
501
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
502
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
502
503
|
AND day >= ${since}::timestamptz AND day < ${scope.to}::timestamptz
|
|
503
504
|
GROUP BY pipeline_id, day
|
|
504
505
|
),
|
|
@@ -535,7 +536,7 @@ export async function getUntrackedPipelines(scope) {
|
|
|
535
536
|
WITH active AS (
|
|
536
537
|
SELECT pipeline_id
|
|
537
538
|
FROM execution_daily_rollups
|
|
538
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
539
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
539
540
|
AND day >= ${scope.from}::timestamptz AND day < ${scope.to}::timestamptz
|
|
540
541
|
AND stage_name = ''
|
|
541
542
|
GROUP BY pipeline_id
|
|
@@ -544,7 +545,7 @@ export async function getUntrackedPipelines(scope) {
|
|
|
544
545
|
tracked AS (
|
|
545
546
|
SELECT DISTINCT pipeline_id
|
|
546
547
|
FROM dora_deployments
|
|
547
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
548
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
548
549
|
AND deployed_at >= ${scope.from}::timestamptz AND deployed_at < ${scope.to}::timestamptz
|
|
549
550
|
)
|
|
550
551
|
SELECT a.pipeline_id FROM active a
|
|
@@ -571,7 +572,7 @@ export async function getVulnerablePipelines(scope) {
|
|
|
571
572
|
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
572
573
|
SELECT DISTINCT pipeline_id
|
|
573
574
|
FROM plugin_vuln_exposure
|
|
574
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
575
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
575
576
|
AND critical_count > 0
|
|
576
577
|
AND ${liveExposurePredicate(now)}
|
|
577
578
|
`));
|
|
@@ -593,7 +594,7 @@ export async function getPipelineConfigChanges(scope) {
|
|
|
593
594
|
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
594
595
|
SELECT id::text AS id, updated_at
|
|
595
596
|
FROM pipelines
|
|
596
|
-
WHERE org_id ${scope.orgIds?.length ? sql `=
|
|
597
|
+
WHERE org_id ${scope.orgIds?.length ? sql `= ${anyText(scope.orgIds)}` : sql `= ${scope.orgId}`}
|
|
597
598
|
AND deleted_at IS NULL
|
|
598
599
|
AND updated_at IS NOT NULL
|
|
599
600
|
`));
|
|
@@ -624,4 +625,4 @@ function isoOrNull(v) {
|
|
|
624
625
|
const d = v instanceof Date ? v : new Date(String(v));
|
|
625
626
|
return Number.isNaN(d.getTime()) ? null : d.toISOString();
|
|
626
627
|
}
|
|
627
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLXF1ZXJpZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBVzdELG1EQUFtRDtBQUNuRCxTQUFTLFlBQVksQ0FBQyxHQUFrQyxFQUFFLEtBQXFCO0lBQzdFLE9BQU8sS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFZLEVBQUUsS0FBSyxDQUFDLEtBQWMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFtQkQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEtBQXFCLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFDMUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7Ozs7Ozs7dUJBVXJDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsU0FBUyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7dUJBQzFFLEtBQUssQ0FBQyxJQUFJLDZCQUE2QixLQUFLLENBQUMsRUFBRTs7Ozs7Ozs7O3FCQVNqRCxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLFNBQVMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFOzZCQUNsRSxLQUFLLENBQUMsSUFBSSxtQ0FBbUMsS0FBSyxDQUFDLEVBQUU7Ozs7Ozs7O3FCQVE3RCxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLFNBQVMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFO3FCQUMxRSxLQUFLLENBQUMsSUFBSSwyQkFBMkIsS0FBSyxDQUFDLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBb0J0RCxLQUFLO0dBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDSixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ2pDLFlBQVksRUFBRyxDQUFDLENBQUMsYUFBK0IsSUFBSSxJQUFJO1FBQ3hELE9BQU8sRUFBRyxDQUFDLENBQUMsT0FBeUIsSUFBSSxJQUFJO1FBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqQixTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3JCLFVBQVUsRUFBRSxDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUNqRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDL0MsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUMzQyxnQkFBZ0IsRUFBRyxDQUFDLENBQUMsa0JBQW9DLElBQUksSUFBSTtRQUNqRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7S0FDbkMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBZ0JEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxLQUFxQixFQUNyQixRQUF1QztJQUV2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sY0FBYyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sYUFBYSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixRQUFRO1FBQ1IsS0FBSyxFQUFFLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVE7UUFDcEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO1FBQ2QsUUFBUSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQzFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNsRSxZQUFZLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO0tBQ2hELENBQUMsQ0FBQztTQUNGLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXJDLE9BQU87UUFDTCxVQUFVO1FBQ1YsS0FBSztRQUNMLGVBQWUsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdGLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxLQUFxQjtJQUNqRCxNQUFNLElBQUksR0FBRyxNQUFNLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7O3FCQUd2QyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLFNBQVMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFO3FCQUMxRSxLQUFLLENBQUMsSUFBSSw2QkFBNkIsS0FBSyxDQUFDLEVBQUU7OztHQUdqRSxDQUFDLENBQUMsQ0FBQztJQUNKLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFzQyxDQUFDO0lBQzFELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztRQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQTJCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUYsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsS0FBSyxVQUFVLHNCQUFzQixDQUNuQyxLQUFxQixFQUNyQixXQUFXLEdBQUcsQ0FBQztJQUVmLE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7dUJBZXJDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsU0FBUyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7dUJBQzFFLEtBQUssQ0FBQyxJQUFJLDZCQUE2QixLQUFLLENBQUMsRUFBRTs7OztrQkFJcEQsV0FBVztHQUMxQixDQUFDLENBQUMsQ0FBQztJQUNKLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUE4RixDQUFDO0lBQ2xILEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQTJCLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNSLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNqQyxZQUFZLEVBQUcsQ0FBQyxDQUFDLGFBQStCLElBQUksSUFBSTtZQUN4RCxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQWFEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLEtBQXFCLEVBQ3JCLFVBQWtCLEVBQ2xCLFFBQXVDO0lBRXZDLE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNuRCxNQUFNLEtBQUssR0FBMEMsUUFBUTtRQUMzRCxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsUUFBUSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDdkIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNyRCxPQUFPO1lBQ0wsR0FBRyxDQUFDO1lBQ0osWUFBWSxFQUFFLE1BQU0sSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSTtnQkFDcEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFJRCxLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQXFCLEVBQUUsVUFBa0I7SUFDaEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNwRCxTQUFTLEVBQUUsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFNBQVM7UUFDaEQsSUFBSSxFQUFFLEdBQUcsQ0FBUSxPQUFPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLFFBQVE7UUFDaEUsTUFBTSxFQUFFLEdBQUcsQ0FBUSxPQUFPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLFFBQVE7UUFDcEUsa0VBQWtFO1FBQ2xFLHdFQUF3RTtRQUN4RSxnQ0FBZ0M7UUFDaEMsS0FBSyxFQUFFLEdBQUcsQ0FBZSxPQUFPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLFFBQVE7UUFDekUsS0FBSyxFQUFFLEdBQUcsQ0FBZSxPQUFPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLFFBQVE7S0FDMUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7U0FDakMsS0FBSyxDQUFDLEdBQUcsQ0FDUixZQUFZLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFDdEQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQ3RELEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUMxRCxFQUFFLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDdkQsR0FBRyxDQUFBLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsUUFBUSxDQUNwRCxDQUFDO1NBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ3hDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBc0MsRUFBRSxDQUFDO1FBQ3ZELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMzQixTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNyQixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDN0MsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQzlDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBWUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQUMsS0FBcUIsRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUk1RSxNQUFNLElBQUksR0FBRyxNQUFNLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7Ozs7Ozs7O3FCQVN2QyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLFNBQVMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFO3FCQUMxRSxLQUFLLENBQUMsSUFBSSw2QkFBNkIsS0FBSyxDQUFDLEVBQUU7Ozs7WUFJeEQsS0FBSztHQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0osTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRSxPQUFPO1FBQ0wsaUJBQWlCLEVBQUUsS0FBSztRQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQixPQUFPLEVBQUcsQ0FBQyxDQUFDLE9BQXlCLElBQUksSUFBSTtZQUM3QyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDakMsWUFBWSxFQUFHLENBQUMsQ0FBQyxhQUErQixJQUFJLElBQUk7WUFDeEQsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNqQixRQUFRLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BGLENBQUMsQ0FBQztLQUNKLENBQUM7QUFDSixDQUFDO0FBWUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLEtBQXFCLEVBQ3JCLGFBQWEsR0FBRyxZQUFZLEVBQzVCLEtBQUssR0FBRyxFQUFFO0lBRVYsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7OzttQkFHekMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxTQUFTLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRTsyQkFDbEUsS0FBSyxDQUFDLElBQUksbUNBQW1DLEtBQUssQ0FBQyxFQUFFOzs7OztHQUs3RSxDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUE0RCxDQUFDO0lBQ3JGLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0YsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFtQixDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtRQUMvRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekYsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtZQUN6QyxpQkFBaUIsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDeEIsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBMEIsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEksQ0FBQyxDQUFDLENBQUM7UUFDSixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO0lBQzNFLENBQUMsQ0FBQztTQUNDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNiLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDNUQsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQztTQUNELEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3hFLENBQUM7QUFlRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLEtBQXFCLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFLeEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7Ozs7cUJBT3ZDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsU0FBUyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7Ozs7WUFJbkYsS0FBSztHQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0osTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDakMsWUFBWSxFQUFHLENBQUMsQ0FBQyxhQUErQixJQUFJLElBQUk7UUFDeEQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQy9CLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3QixNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEIsS0FBSyxFQUFHLENBQUMsQ0FBQyxnQkFBa0MsSUFBSSxJQUFJO1FBQ3BELE1BQU0sRUFBRyxDQUFDLENBQUMsY0FBZ0MsSUFBSSxJQUFJO1FBQ25ELEdBQUcsRUFBRyxDQUFDLENBQUMsV0FBNkIsSUFBSSxJQUFJO1FBQzdDLFlBQVksRUFBRSxDQUFDLENBQUMsYUFBYSxLQUFLLEtBQUs7S0FDeEMsQ0FBQyxDQUFDLENBQUM7SUFDSixPQUFPO1FBQ0wsSUFBSSxFQUFFLElBQUk7UUFDVixlQUFlLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUM1RCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxNQUFNO0tBQzFELENBQUM7QUFDSixDQUFDO0FBZ0JEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QixDQUFDLEtBQXFCLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFLOUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7Ozs7OztxQkFPdkMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxTQUFTLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNuRixxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDOztZQUUvQixLQUFLO0dBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDSixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUNqQyxZQUFZLEVBQUcsQ0FBQyxDQUFDLGFBQStCLElBQUksSUFBSTtRQUN4RCxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN4QixRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDL0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3ZCLFFBQVEsRUFBRyxDQUFDLENBQUMsWUFBK0MsSUFBSSxFQUFFO1FBQ2xFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtLQUNoRSxDQUFDLENBQUMsQ0FBQztJQUNKLE9BQU87UUFDTCxJQUFJLEVBQUUsSUFBSTtRQUNWLGdCQUFnQixFQUFFLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDN0QsaUJBQWlCLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUk7S0FDN0YsQ0FBQztBQUNKLENBQUM7QUFnQkQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxLQUFxQixFQUFFLGdCQUFnQztJQUN2RixNQUFNLElBQUksR0FBRyxNQUFNLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7OztxQkFJdkMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxTQUFTLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRTs7Ozs7O3FCQU0xRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLFNBQVMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFO3FCQUMxRSxLQUFLLENBQUMsSUFBSSwyQkFBMkIsS0FBSyxDQUFDLEVBQUU7Ozs7OztxQkFNN0MsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxTQUFTLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRTs2QkFDbEUsS0FBSyxDQUFDLElBQUksbUNBQW1DLEtBQUssQ0FBQyxFQUFFOzs7Ozs7Ozs7O0dBVS9FLENBQUMsQ0FBQyxDQUFDO0lBQ0osTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU87UUFDTCxjQUFjLEVBQUUsT0FBTztRQUN2QixlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN4QyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUM3QyxRQUFRLEVBQUcsQ0FBQyxDQUFDLFNBQW9DLElBQUksRUFBRTtRQUN2RCwyRUFBMkU7UUFDM0UsdURBQXVEO1FBQ3ZELHFCQUFxQixFQUFFLGdCQUFnQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJO0tBQ3BHLENBQUM7QUFDSixDQUFDO0FBbUJEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxLQUFxQixFQUNyQixZQUFZLEdBQUcsRUFBRTtJQUVqQixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsWUFBWSxHQUFHLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9GLE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7cUJBTXZDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsU0FBUyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7cUJBQzFFLEtBQUssMkJBQTJCLEtBQUssQ0FBQyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0IxRCxDQUFDLENBQUMsQ0FBQztJQUNKLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5QixVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDakMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDbEMsYUFBYSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7S0FDaEYsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQUMsS0FBcUI7SUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7cUJBSXZDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsU0FBUyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7cUJBQzFFLEtBQUssQ0FBQyxJQUFJLDJCQUEyQixLQUFLLENBQUMsRUFBRTs7Ozs7Ozs7cUJBUTdDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsU0FBUyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7NkJBQ2xFLEtBQUssQ0FBQyxJQUFJLG1DQUFtQyxLQUFLLENBQUMsRUFBRTs7OztHQUkvRSxDQUFDLENBQUMsQ0FBQztJQUNKLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxLQUFxQjtJQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7bUJBR3pDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsU0FBUyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7O1lBRWpGLHFCQUFxQixDQUFDLEdBQUcsQ0FBQztHQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNKLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCLENBQUMsS0FBcUI7SUFDbEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7OzttQkFHekMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxTQUFTLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRTs7O0dBRzFGLENBQUMsQ0FBQyxDQUFDO0lBQ0osTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWdCLENBQUM7SUFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCwrRUFBK0U7QUFFL0Usc0VBQXNFO0FBQ3RFLFNBQVMsTUFBTSxDQUFDLE1BQWU7SUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBd0MsQ0FBQztJQUMzRSxNQUFNLElBQUksR0FBSSxNQUE2QixFQUFFLElBQUksQ0FBQztJQUNsRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQXNDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMzRSxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLFNBQVMsR0FBRyxDQUFDLENBQVU7SUFDckIsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsQ0FBVTtJQUMzQixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIHF1ZXJpZXMgdGhlIGJlc3Bva2UgcmVwb3J0IHNlY3Rpb25zIHJlYWQuXG4gKlxuICogQWxsIG9mIHRoZW0gZ28gdGhyb3VnaCBgZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNgLCBgZG9yYV9kZXBsb3ltZW50c2AsXG4gKiBgcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb25gIG9yIGBwbHVnaW5fdnVsbl9leHBvc3VyZWAg4oCUIG5ldmVyIHJhd1xuICogYHBpcGVsaW5lX2V2ZW50c2AuIFRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRob3NlIHRhYmxlczogYSBxdWFydGVybHkgcmVwb3J0XG4gKiBvdmVyIGEgYnVzeSBvcmcgY29zdHMgYSBmZXcgaHVuZHJlZCByb3dzLCBhbmQga2VlcHMgd29ya2luZyBhZnRlciByZXRlbnRpb24gaGFzXG4gKiBzd2VwdCB0aGUgZXZlbnRzLlxuICpcbiAqIFRXTyBSVUxFUyBFVkVSWSBRVUVSWSBIRVJFIEZPTExPV1M6XG4gKlxuICogIC0gTk9USElORyBJUyBQRVItUEVSU09OLiBFdmVyeSBhZ2dyZWdhdGUgaXMgcGVyIHBpcGVsaW5lLCBwZXIgc3RhZ2UsIHBlclxuICogICAgY2F0ZWdvcnkgb3IgcGVyIGVudmlyb25tZW50LiBUaGUgc2VjdGlvbiByZWdpc3RyeSByZWZ1c2VzIGEgcGVyLXBlcnNvbiBpZCBhdFxuICogICAgcmVnaXN0cmF0aW9uOyB0aGVzZSBxdWVyaWVzIG1ha2Ugc3VyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJlZ2lzdGVyLlxuICogIC0gQSBaRVJPIEFORCBBIEJMSU5EIFNQT1QgQVJFIERJRkZFUkVOVC4gV2hlcmUgYSBudW1iZXIgY2FuIGJlIGFic2VudCBmb3IgbGFja1xuICogICAgb2YgZGF0YSByYXRoZXIgdGhhbiBsYWNrIG9mIGFjdGl2aXR5LCB0aGUgc2hhcGUgY2FycmllcyB0aGF0IChgbnVsbGAsIGFcbiAqICAgIGBjb3ZlcmFnZWAgY291bnQsIGFuIGV4cGxpY2l0IHJlYXNvbikgaW5zdGVhZCBvZiBjb2xsYXBzaW5nIHRvIDAuXG4gKlxuICogUkVBRFMgR08gVE8gVEhFIFJFUExJQ0EgV0hFTiBPTkUgRVhJU1RTLiBFdmVyeSBxdWVyeSBiZWxvdyBydW5zIHRocm91Z2hcbiAqIGB3aXRoVGVuYW50VHhSZWFkYCwgdGhlIHJlYWQtb25seSB2YXJpYW50IG9mIGB3aXRoVGVuYW50VHhgLiBJdCBzZXRzIHRoZVxuICogaWRlbnRpY2FsIFJMUyBHVUNzLCBhZGRzIGBTRVQgVFJBTlNBQ1RJT04gUkVBRCBPTkxZYCwgYW5kIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiBwcmltYXJ5IGF1dG9tYXRpY2FsbHkgd2hlbmV2ZXIgdGhlcmUgaXMgbm8gcmVwbGljYSwgdGhlIGtpbGwgc3dpdGNoIGlzIG9mZixcbiAqIHJlcGxheSBsYWcgaXMgYmV5b25kIGl0cyB0aHJlc2hvbGQsIHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IHdyaXR0ZW4sIG9yIHRoZXJlXG4gKiBpcyBubyB0ZW5hbnQgY29udGV4dCDigJQgc28gdGhpcyBpcyBhIG5vLW9wIHVudGlsIGBEQl9SRUFEX0hPU1RgIGlzIGNvbmZpZ3VyZWQuXG4gKlxuICogV0hZIFRISVMgRklMRSBXQVMgVEhFIEZJUlNUIFRPIE9QVCBJTi4gVGhyZWUgY29uZGl0aW9ucyBkZWNpZGUgd2hldGhlciBhXG4gKiBxdWVyeSBtYXkgbGVhdmUgdGhlIHByaW1hcnksIGFuZCB0aGlzIGZpbGUgc2F0aXNmaWVzIGFsbCB0aHJlZSBieVxuICogY29uc3RydWN0aW9uIOKAlCBzbyB0aGV5IGFyZSBzdGF0ZWQgaGVyZSByYXRoZXIgdGhhbiBjaXRlZCwgbm93IHRoYXQgdGhlIHBsYW5cbiAqIHRoYXQgaW50cm9kdWNlZCB0aGVtIGlzIHJldGlyZWQ6XG4gKlxuICogICAtIE5vdGhpbmcgaGVyZSB3cml0ZXMuIFRoaXJ0ZWVuIGFnZ3JlZ2F0ZSBTRUxFQ1RzLCBubyBJTlNFUlQsIG5vIFVQREFURSwgbm9cbiAqICAgICBgU0VMRUNUIOKApiBGT1IgVVBEQVRFYCwgbm8gYWR2aXNvcnkgbG9jayDigJQgc28gbm9uZSBvZiB0aGUgZm91ciBjYWxsIHNpdGVzXG4gKiAgICAgdGhlIFBoYXNlIDBhIGF1ZGl0IGZvdW5kIGhpZGluZyBiZWhpbmQgcmVhZC1sb29raW5nIGNvZGUuXG4gKiAgIC0gTm90aGluZyBoZXJlIGZlZWRzIGFuIEFVVEhPUklaQVRJT04gZGVjaXNpb24uIFRoZXNlIGFyZSBkYXNoYm9hcmRcbiAqICAgICBhZ2dyZWdhdGVzOyBhIHN0YWxlIHBlcm1pc3Npb24gY2hlY2sgaXMgYSBzZWN1cml0eSBidWcsIGEgc3RhbGUgY2hhcnQgaXNcbiAqICAgICBhIHN0YWxlIGNoYXJ0LlxuICogICAtIE5vYm9keSBpcyBhYm91dCB0byBBQ1Qgb24gdGhlIHJlc3VsdC4gQSB1c2VyIHdobyBqdXN0IGNyZWF0ZWQgYSBwaXBlbGluZVxuICogICAgIGxvb2tzIGZvciBpdCBpbiBhIGxpc3QsIG5vdCBpbiBhIDMwLWRheSBmYWlsdXJlLXJhdGUgcm9sbHVwLlxuICpcbiAqIEFuZCBpdCBpcyB0aGUgYmVzdCBvZmZsb2FkIGNhbmRpZGF0ZSBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIHNhZmU6IHRoZXNlXG4gKiBhcmUgdGhlIGhlYXZpZXN0IHF1ZXJpZXMgaW4gdGhlIHBhY2thZ2UsIHNjYW5uaW5nIHRpbWUgcmFuZ2VzIHJhdGhlciB0aGFuXG4gKiBmZXRjaGluZyByb3dzIGJ5IGlkLlxuICpcbiAqIGBTRVQgVFJBTlNBQ1RJT04gUkVBRCBPTkxZYCBhcHBsaWVzIG9uIHRoZSBQUklNQVJZIHBhdGggdG9vLCBzbyBpZiBhIHdyaXRlXG4gKiBpcyBldmVyIGFkZGVkIGJlbG93IGl0IGZhaWxzIGhlcmUsIGxvdWRseSwgcmF0aGVyIHRoYW4gYXQgd2hpY2hldmVyIHRhcmdldFxuICogdGhlIHJlYWQgaGFwcGVuZWQgdG8gbGFuZCBvbi5cbiAqL1xuXG5pbXBvcnQgeyBhbmQsIGVxLCBndGUsIGluQXJyYXksIGx0LCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBGQUlMVVJFX0NBVEVHT1JZX0xBQkVMUywgaXNUZWFtQWN0aW9uYWJsZSB9IGZyb20gJy4vZmFpbHVyZS1jbGFzc2lmaWVyLmpzJztcbmltcG9ydCB7IGxpdmVFeHBvc3VyZVByZWRpY2F0ZSB9IGZyb20gJy4vcGx1Z2luLWV4cG9zdXJlLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB0eXBlIHsgRmFpbHVyZUNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vZGF0YWJhc2Uvc2NoZW1hL3JlcG9ydGluZy1hbmFseXRpY3MuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4UmVhZCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vKiogVGhlIHdpbmRvdyBhbmQgb3JnIHNjb3BlIGV2ZXJ5IHF1ZXJ5IHRha2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXRpY3NTY29wZSB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWAgZm9yIGEgcm9sbHVwOyB1bmRlZmluZWQgPSB0aGlzIG9yZyBvbmx5LiAqL1xuICBvcmdJZHM/OiBzdHJpbmdbXTtcbiAgZnJvbTogc3RyaW5nO1xuICB0bzogc3RyaW5nO1xufVxuXG4vKiogVGhlIG9yZyBwcmVkaWNhdGU6IG9uZSBvcmcsIG9yIGEgcm9sbHVwIHNldC4gKi9cbmZ1bmN0aW9uIG9yZ1ByZWRpY2F0ZShjb2w6IFBhcmFtZXRlcnM8dHlwZW9mIGluQXJyYXk+WzBdLCBzY29wZTogQW5hbHl0aWNzU2NvcGUpIHtcbiAgcmV0dXJuIHNjb3BlLm9yZ0lkcyAmJiBzY29wZS5vcmdJZHMubGVuZ3RoID4gMFxuICAgID8gaW5BcnJheShjb2wsIHNjb3BlLm9yZ0lkcylcbiAgICA6IGVxKGNvbCBhcyBuZXZlciwgc2NvcGUub3JnSWQgYXMgbmV2ZXIpO1xufVxuXG4vKiogT25lIHBpcGVsaW5lJ3MgbGluZSBpbiB0aGUgYnJlYWtkb3duLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUJyZWFrZG93blJvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwcm9qZWN0OiBzdHJpbmcgfCBudWxsO1xuICBydW5zOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyIHwgbnVsbDtcbiAgcDk1TXM6IG51bWJlciB8IG51bGw7XG4gIGRlcGxveXM6IG51bWJlcjtcbiAgLyoqIFRoZSBtb3N0IHJlY2VudCBmYWlsdXJlJ3MgZGF5IGFuZCBzdGFnZSwgZm9yIFwid2hhdCB0byBsb29rIGF0IGZpcnN0XCIuICovXG4gIGxhc3RGYWlsdXJlQXQ6IHN0cmluZyB8IG51bGw7XG4gIGxhc3RGYWlsdXJlU3RhZ2U6IHN0cmluZyB8IG51bGw7XG4gIGJ1aWxkU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBlci1waXBlbGluZSBkZWxpdmVyeSwgd29yc3QgZmlyc3QuXG4gKlxuICogV09SU1QgRklSU1QsIGFuZCBjYXBwZWQsIGJlY2F1c2UgdGhlIHBvaW50IG9mIHRoZSBzZWN0aW9uIGlzIFwid2hlcmUgc2hvdWxkXG4gKiBhdHRlbnRpb24gZ29cIi4gQSBsaXN0IHNvcnRlZCBieSBuYW1lLCBvciBhbiB1bmJvdW5kZWQgb25lLCBpcyBhIGRhdGEgZHVtcDogdGhlXG4gKiBsZWFkIHN0aWxsIGhhcyB0byBmaW5kIHRoZSBwcm9ibGVtLCB3aGljaCBpcyB0aGUgd29yayB0aGUgcmVwb3J0IHdhcyBzdXBwb3NlZCB0b1xuICogZG8uIFRpZXMgYnJlYWsgb24gdm9sdW1lLCBzbyBhIDUwJS1zdWNjZXNzIHBpcGVsaW5lIHRoYXQgcmFuIHR3aWNlIGRvZXMgbm90XG4gKiBvdXRyYW5rIG9uZSB0aGF0IHJhbiB0d28gaHVuZHJlZCB0aW1lcy5cbiAqXG4gKiBgc3VjY2Vzc1BjdGAgaXMgTlVMTCBmb3IgYSBwaXBlbGluZSB3aXRoIG5vIHJ1bnMgaW4gdGhlIHdpbmRvdyDigJQgbm90IDAuIEFcbiAqIHBpcGVsaW5lIG5vYm9keSByYW4gaXMgbm90IGEgcGlwZWxpbmUgdGhhdCBmYWlsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQaXBlbGluZUJyZWFrZG93bihzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gMTApOiBQcm9taXNlPFBpcGVsaW5lQnJlYWtkb3duUm93W10+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBXSVRIIHRvdGFscyBBUyAoXG4gICAgICBTRUxFQ1RcbiAgICAgICAgci5waXBlbGluZV9pZCxcbiAgICAgICAgU1VNKHIucnVucyk6OmludCBBUyBydW5zLFxuICAgICAgICBTVU0oci5zdWNjZWVkZWQpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICBTVU0oci5mYWlsZWQpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICBNQVgoci5wOTVfbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICBTVU0oci5idWlsZF9zZWNvbmRzKTo6aW50IEFTIGJ1aWxkX3NlY29uZHNcbiAgICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHMgclxuICAgICAgV0hFUkUgci5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIHIuZGF5ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCByLmRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICAtLSBUaGUgcGlwZWxpbmUtbGV2ZWwgZ3JhaW4gb25seTogc3VtbWluZyB0aGUgc3RhZ2Ugcm93cyB0b28gd291bGQgY291bnRcbiAgICAgICAgLS0gZXZlcnkgcnVuIG9uY2UgcGVyIHN0YWdlLlxuICAgICAgICBBTkQgci5zdGFnZV9uYW1lID0gJydcbiAgICAgIEdST1VQIEJZIHIucGlwZWxpbmVfaWRcbiAgICApLFxuICAgIGRlcGxveXMgQVMgKFxuICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCBDT1VOVCgqKTo6aW50IEFTIGRlcGxveXNcbiAgICAgIEZST00gZG9yYV9kZXBsb3ltZW50c1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkZXBsb3llZF9hdCA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGVwbG95ZWRfYXQgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgQU5EIHN1Y2NlZWRlZCA9IHRydWVcbiAgICAgIEdST1VQIEJZIHBpcGVsaW5lX2lkXG4gICAgKSxcbiAgICBsYXN0X2ZhaWwgQVMgKFxuICAgICAgLS0gVGhlIG1vc3QgcmVjZW50IGZhaWxpbmcgU1RBR0Ugcm93IHBlciBwaXBlbGluZTogd2hhdCB0byBsb29rIGF0IGZpcnN0LlxuICAgICAgU0VMRUNUIERJU1RJTkNUIE9OIChwaXBlbGluZV9pZCkgcGlwZWxpbmVfaWQsIGRheSwgc3RhZ2VfbmFtZVxuICAgICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwc1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgc3RhZ2VfbmFtZSA8PiAnJyBBTkQgZmFpbGVkID4gMFxuICAgICAgT1JERVIgQlkgcGlwZWxpbmVfaWQsIGRheSBERVNDLCBmYWlsZWQgREVTQ1xuICAgIClcbiAgICBTRUxFQ1RcbiAgICAgIHQucGlwZWxpbmVfaWQsXG4gICAgICBwLnBpcGVsaW5lX25hbWUsXG4gICAgICBwLnByb2plY3QsXG4gICAgICB0LnJ1bnMsIHQuc3VjY2VlZGVkLCB0LmZhaWxlZCwgdC5wOTVfbXMsIHQuYnVpbGRfc2Vjb25kcyxcbiAgICAgIENPQUxFU0NFKGQuZGVwbG95cywgMCkgQVMgZGVwbG95cyxcbiAgICAgIGYuZGF5IEFTIGxhc3RfZmFpbHVyZV9hdCxcbiAgICAgIGYuc3RhZ2VfbmFtZSBBUyBsYXN0X2ZhaWx1cmVfc3RhZ2UsXG4gICAgICBDQVNFIFdIRU4gdC5ydW5zID4gMCBUSEVOIFJPVU5EKCh0LnN1Y2NlZWRlZDo6bnVtZXJpYyAvIHQucnVucykgKiAxMDAsIDEpIEVMU0UgTlVMTCBFTkQgQVMgc3VjY2Vzc19wY3RcbiAgICBGUk9NIHRvdGFscyB0XG4gICAgTEVGVCBKT0lOIGRlcGxveXMgZCBPTiBkLnBpcGVsaW5lX2lkID0gdC5waXBlbGluZV9pZFxuICAgIExFRlQgSk9JTiBsYXN0X2ZhaWwgZiBPTiBmLnBpcGVsaW5lX2lkID0gdC5waXBlbGluZV9pZFxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gdC5waXBlbGluZV9pZFxuICAgIC0tIFdvcnN0IGZpcnN0OiBsb3dlc3Qgc3VjY2VzcyByYXRlLCB0aGVuIG1vc3QgcnVucywgc28gYSA1MCUgcGlwZWxpbmUgdGhhdCByYW5cbiAgICAtLSB0d2ljZSBkb2VzIG5vdCBvdXRyYW5rIG9uZSB0aGF0IHJhbiB0d28gaHVuZHJlZCB0aW1lcy5cbiAgICBPUkRFUiBCWSBzdWNjZXNzX3BjdCBBU0MgTlVMTFMgTEFTVCwgdC5ydW5zIERFU0NcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBwcm9qZWN0OiAoci5wcm9qZWN0IGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgcnVuczogbnVtKHIucnVucyksXG4gICAgc3VjY2VlZGVkOiBudW0oci5zdWNjZWVkZWQpLFxuICAgIGZhaWxlZDogbnVtKHIuZmFpbGVkKSxcbiAgICBzdWNjZXNzUGN0OiByLnN1Y2Nlc3NfcGN0ID09PSBudWxsID8gbnVsbCA6IE51bWJlcihyLnN1Y2Nlc3NfcGN0KSxcbiAgICBwOTVNczogci5wOTVfbXMgPT09IG51bGwgPyBudWxsIDogbnVtKHIucDk1X21zKSxcbiAgICBkZXBsb3lzOiBudW0oci5kZXBsb3lzKSxcbiAgICBsYXN0RmFpbHVyZUF0OiBpc29Pck51bGwoci5sYXN0X2ZhaWx1cmVfYXQpLFxuICAgIGxhc3RGYWlsdXJlU3RhZ2U6IChyLmxhc3RfZmFpbHVyZV9zdGFnZSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIGJ1aWxkU2Vjb25kczogbnVtKHIuYnVpbGRfc2Vjb25kcyksXG4gIH0pKTtcbn1cblxuLyoqIE9uZSBmYWlsdXJlIGNhdGVnb3J5J3Mgc2hhcmUgb2YgdGhlIHBlcmlvZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZUNhdGVnb3J5Um93IHtcbiAgY2F0ZWdvcnk6IEZhaWx1cmVDYXRlZ29yeTtcbiAgbGFiZWw6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbiAgc2hhcmVQY3Q6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRlYW0gY2FuIGFjdCBvbiBpdCwgb3IgaXQgaGFwcGVuZWQgdG8gdGhlbS4gKi9cbiAgdGVhbUFjdGlvbmFibGU6IGJvb2xlYW47XG4gIC8qKiBDaGFuZ2UgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCwgaW4gZmFpbHVyZXMuICovXG4gIGNoYW5nZTogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBwaXBlbGluZXMgaXQgaGl0IGhhcmRlc3QuICovXG4gIHRvcFBpcGVsaW5lczogQXJyYXk8eyBwaXBlbGluZUlkOiBzdHJpbmc7IHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDsgY291bnQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBGYWlsdXJlcyBieSBjYXRlZ29yeSwgd2l0aCB0aGUgcHJldmlvdXMgcGVyaW9kJ3MgY291bnRzIGZvciB0aGUgdHJlbmQuXG4gKlxuICogU1BMSVRTIEFDVElPTkFCTEUgRlJPTSBOT1QuIEEgd2VlayB3aG9zZSBmYWlsdXJlcyB3ZXJlIGFsbCBjbG91ZCB0aHJvdHRsaW5nIGlzIGFcbiAqIGRpZmZlcmVudCBjb252ZXJzYXRpb24gZnJvbSBvbmUgd2hvc2UgZmFpbHVyZXMgd2VyZSBhbGwgYnJva2VuIHRlc3RzLCBhbmRcbiAqIHByZXNlbnRpbmcgdGhlbSBpbiBvbmUgcmFua2VkIGxpc3QgaW52aXRlcyBleGFjdGx5IHRoZSB3cm9uZyBjb25jbHVzaW9uIOKAlCBhIHRlYW1cbiAqIGJlaW5nIGFza2VkIHRvIGZpeCBhbiBBV1MgY2FwYWNpdHkgcHJvYmxlbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZhaWx1cmVBbmFseXNpcyhcbiAgc2NvcGU6IEFuYWx5dGljc1Njb3BlLFxuICBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPHsgY2F0ZWdvcmllczogRmFpbHVyZUNhdGVnb3J5Um93W107IHRvdGFsOiBudW1iZXI7IGFjdGlvbmFibGVUb3RhbDogbnVtYmVyIH0+IHtcbiAgY29uc3QgY291bnRzID0gYXdhaXQgY2F0ZWdvcnlDb3VudHMoc2NvcGUpO1xuICBjb25zdCBwcmlvciA9IHByZXZpb3VzID8gYXdhaXQgY2F0ZWdvcnlDb3VudHMoeyAuLi5zY29wZSwgLi4ucHJldmlvdXMgfSkgOiBudWxsO1xuICBjb25zdCB0b3RhbCA9IFsuLi5jb3VudHMudmFsdWVzKCldLnJlZHVjZSgocywgdikgPT4gcyArIHYuY291bnQsIDApO1xuICBjb25zdCB0b3BCeUNhdGVnb3J5ID0gYXdhaXQgdG9wUGlwZWxpbmVzQnlDYXRlZ29yeShzY29wZSk7XG5cbiAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5jb3VudHMuZW50cmllcygpXVxuICAgIC5tYXAoKFtjYXRlZ29yeSwgdl0pID0+ICh7XG4gICAgICBjYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBGQUlMVVJFX0NBVEVHT1JZX0xBQkVMU1tjYXRlZ29yeV0gPz8gY2F0ZWdvcnksXG4gICAgICBjb3VudDogdi5jb3VudCxcbiAgICAgIHNoYXJlUGN0OiB0b3RhbCA+IDAgPyBOdW1iZXIoKCh2LmNvdW50IC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpKSA6IDAsXG4gICAgICB0ZWFtQWN0aW9uYWJsZTogaXNUZWFtQWN0aW9uYWJsZShjYXRlZ29yeSksXG4gICAgICBjaGFuZ2U6IHByaW9yID8gdi5jb3VudCAtIChwcmlvci5nZXQoY2F0ZWdvcnkpPy5jb3VudCA/PyAwKSA6IG51bGwsXG4gICAgICB0b3BQaXBlbGluZXM6IHRvcEJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSA/PyBbXSxcbiAgICB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuXG4gIHJldHVybiB7XG4gICAgY2F0ZWdvcmllcyxcbiAgICB0b3RhbCxcbiAgICBhY3Rpb25hYmxlVG90YWw6IGNhdGVnb3JpZXMuZmlsdGVyKChjKSA9PiBjLnRlYW1BY3Rpb25hYmxlKS5yZWR1Y2UoKHMsIGMpID0+IHMgKyBjLmNvdW50LCAwKSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2F0ZWdvcnlDb3VudHMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxNYXA8RmFpbHVyZUNhdGVnb3J5LCB7IGNvdW50OiBudW1iZXIgfT4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBTRUxFQ1Qga2V5IEFTIGNhdGVnb3J5LCBTVU0odmFsdWU6OmludCk6OmludCBBUyBjb3VudFxuICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHMgciwganNvbmJfZWFjaChyLmZhaWx1cmVzX2J5X2NhdGVnb3J5KVxuICAgIFdIRVJFIHIub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgci5kYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIHIuZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICBBTkQgci5zdGFnZV9uYW1lID0gJydcbiAgICBHUk9VUCBCWSBrZXlcbiAgYCkpO1xuICBjb25zdCBvdXQgPSBuZXcgTWFwPEZhaWx1cmVDYXRlZ29yeSwgeyBjb3VudDogbnVtYmVyIH0+KCk7XG4gIGZvciAoY29uc3QgciBvZiByb3dzT2Yocm93cykpIG91dC5zZXQoci5jYXRlZ29yeSBhcyBGYWlsdXJlQ2F0ZWdvcnksIHsgY291bnQ6IG51bShyLmNvdW50KSB9KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdG9wUGlwZWxpbmVzQnlDYXRlZ29yeShcbiAgc2NvcGU6IEFuYWx5dGljc1Njb3BlLFxuICBwZXJDYXRlZ29yeSA9IDMsXG4pOiBQcm9taXNlPE1hcDxGYWlsdXJlQ2F0ZWdvcnksIEFycmF5PHsgcGlwZWxpbmVJZDogc3RyaW5nOyBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7IGNvdW50OiBudW1iZXIgfT4+PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIGNhdGVnb3J5LCBwaXBlbGluZV9pZCwgcGlwZWxpbmVfbmFtZSwgY291bnQgRlJPTSAoXG4gICAgICBTRUxFQ1RcbiAgICAgICAgZS5rZXkgQVMgY2F0ZWdvcnksXG4gICAgICAgIHIucGlwZWxpbmVfaWQsXG4gICAgICAgIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgU1VNKGUudmFsdWU6OmludCk6OmludCBBUyBjb3VudCxcbiAgICAgICAgUk9XX05VTUJFUigpIE9WRVIgKFBBUlRJVElPTiBCWSBlLmtleSBPUkRFUiBCWSBTVU0oZS52YWx1ZTo6aW50KSBERVNDKSBBUyByblxuICAgICAgLS0gQ1JPU1MgSk9JTiBMQVRFUkFMLCBub3QgYSBjb21tYSBqb2luLiBXaXRoIEZST00gYSwgZihhLngpIGUgTEVGVCBKT0lOIGIsXG4gICAgICAtLSB0aGUgTEVGVCBKT0lOIGJpbmRzIHRvIGUgYWxvbmUgYW5kIHIgZmFsbHMgb3V0IG9mIHNjb3BlIGluIGl0cyBPTiBjbGF1c2VcbiAgICAgIC0tIChcImludmFsaWQgcmVmZXJlbmNlIHRvIEZST00tY2xhdXNlIGVudHJ5XCIpLiBUaGUgZXhwbGljaXQgbGF0ZXJhbCBrZWVwcyBhbGxcbiAgICAgIC0tIHRocmVlIGluIG9uZSBqb2luIHRyZWUuXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzIHJcbiAgICAgIENST1NTIEpPSU4gTEFURVJBTCBqc29uYl9lYWNoKHIuZmFpbHVyZXNfYnlfY2F0ZWdvcnkpIGVcbiAgICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gci5waXBlbGluZV9pZFxuICAgICAgV0hFUkUgci5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIHIuZGF5ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCByLmRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgci5zdGFnZV9uYW1lID0gJydcbiAgICAgIEdST1VQIEJZIGUua2V5LCByLnBpcGVsaW5lX2lkLCBwLnBpcGVsaW5lX25hbWVcbiAgICApIHJhbmtlZFxuICAgIFdIRVJFIHJuIDw9ICR7cGVyQ2F0ZWdvcnl9XG4gIGApKTtcbiAgY29uc3Qgb3V0ID0gbmV3IE1hcDxGYWlsdXJlQ2F0ZWdvcnksIEFycmF5PHsgcGlwZWxpbmVJZDogc3RyaW5nOyBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7IGNvdW50OiBudW1iZXIgfT4+KCk7XG4gIGZvciAoY29uc3QgciBvZiByb3dzT2Yocm93cykpIHtcbiAgICBjb25zdCBrZXkgPSByLmNhdGVnb3J5IGFzIEZhaWx1cmVDYXRlZ29yeTtcbiAgICBjb25zdCBsaXN0ID0gb3V0LmdldChrZXkpID8/IFtdO1xuICAgIGxpc3QucHVzaCh7XG4gICAgICBwaXBlbGluZUlkOiBTdHJpbmcoci5waXBlbGluZV9pZCksXG4gICAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICAgIGNvdW50OiBudW0oci5jb3VudCksXG4gICAgfSk7XG4gICAgb3V0LnNldChrZXksIGxpc3QpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBPbmUgc3RhZ2UncyB0aW1pbmcsIGZvciB0aGUgZHJpbGwtZG93bi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VQZXJmb3JtYW5jZVJvdyB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBydW5zOiBudW1iZXI7XG4gIHA1ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTVNczogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBpbiBwOTUgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCwgYXMgYSBwZXJjZW50YWdlLiAqL1xuICBwOTVDaGFuZ2VQY3Q6IG51bWJlciB8IG51bGw7XG4gIGZhaWxlZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBlci1zdGFnZSB0aW1pbmdzIGZvciBvbmUgcGlwZWxpbmUsIHNsb3dlc3QgZmlyc3QuXG4gKlxuICogVGhlIHNlY3Rpb24gYSBsZWFkIG9wZW5zIGFmdGVyIHRoZSBicmVha2Rvd24gc2F5cyBhIHBpcGVsaW5lIGdvdCBzbG93ZXI6IFwid2hpY2hcbiAqIHN0YWdlXCIgaXMgdGhlIG5leHQgcXVlc3Rpb24sIGFuZCBhbnN3ZXJpbmcgaXQgZnJvbSByYXcgZXZlbnRzIHdvdWxkIG1lYW4gYVxuICogc2Vjb25kIHNjYW4gb2YgdGhlIHNhbWUgd2luZG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3RhZ2VQZXJmb3JtYW5jZShcbiAgc2NvcGU6IEFuYWx5dGljc1Njb3BlLFxuICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gIHByZXZpb3VzPzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSxcbik6IFByb21pc2U8U3RhZ2VQZXJmb3JtYW5jZVJvd1tdPiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBzdGFnZVJvd3Moc2NvcGUsIHBpcGVsaW5lSWQpO1xuICBjb25zdCBwcmlvcjogTWFwPHN0cmluZywgeyBwOTVNczogbnVtYmVyIHwgbnVsbCB9PiA9IHByZXZpb3VzXG4gICAgPyBuZXcgTWFwKChhd2FpdCBzdGFnZVJvd3MoeyAuLi5zY29wZSwgLi4ucHJldmlvdXMgfSwgcGlwZWxpbmVJZCkpLm1hcCgocykgPT4gW3Muc3RhZ2VOYW1lLCBzXSkpXG4gICAgOiBuZXcgTWFwKCk7XG4gIHJldHVybiBjdXJyZW50Lm1hcCgocykgPT4ge1xuICAgIGNvbnN0IGJlZm9yZSA9IHByaW9yLmdldChzLnN0YWdlTmFtZSk/LnA5NU1zID8/IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnMsXG4gICAgICBwOTVDaGFuZ2VQY3Q6IGJlZm9yZSAmJiBiZWZvcmUgPiAwICYmIHMucDk1TXMgIT09IG51bGxcbiAgICAgICAgPyBOdW1iZXIoKCgocy5wOTVNcyAtIGJlZm9yZSkgLyBiZWZvcmUpICogMTAwKS50b0ZpeGVkKDEpKVxuICAgICAgICA6IG51bGwsXG4gICAgfTtcbiAgfSkuc29ydCgoYSwgYikgPT4gKGIucDk1TXMgPz8gMCkgLSAoYS5wOTVNcyA/PyAwKSk7XG59XG5cbmludGVyZmFjZSBTdGFnZVJvdyB7IHN0YWdlTmFtZTogc3RyaW5nOyBydW5zOiBudW1iZXI7IHA1ME1zOiBudW1iZXIgfCBudWxsOyBwOTVNczogbnVtYmVyIHwgbnVsbDsgZmFpbGVkOiBudW1iZXIgfVxuXG5hc3luYyBmdW5jdGlvbiBzdGFnZVJvd3Moc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwaXBlbGluZUlkOiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlUm93W10+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5zZWxlY3Qoe1xuICAgIHN0YWdlTmFtZTogc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLnN0YWdlTmFtZSxcbiAgICBydW5zOiBzcWw8bnVtYmVyPmBTVU0oJHtzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAucnVuc30pOjppbnRgLFxuICAgIGZhaWxlZDogc3FsPG51bWJlcj5gU1VNKCR7c2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLmZhaWxlZH0pOjppbnRgLFxuICAgIC8vIE1BWCBvZiB0aGUgZGFpbHkgcDk1cywgbm90IGFuIGF2ZXJhZ2Ugb2YgcGVyY2VudGlsZXM6IGF2ZXJhZ2luZ1xuICAgIC8vIHBlcmNlbnRpbGVzIGlzIG5vdCBhIHBlcmNlbnRpbGUgb2YgYW55dGhpbmcsIGFuZCB0aGUgd29yc3QgZGF5IGlzIHRoZVxuICAgIC8vIG51bWJlciBzb21lYm9keSB3b3VsZCBhY3Qgb24uXG4gICAgcDUwTXM6IHNxbDxudW1iZXIgfCBudWxsPmBNQVgoJHtzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAucDUwTXN9KTo6aW50YCxcbiAgICBwOTVNczogc3FsPG51bWJlciB8IG51bGw+YE1BWCgke3NjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5wOTVNc30pOjppbnRgLFxuICB9KS5mcm9tKHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cClcbiAgICAud2hlcmUoYW5kKFxuICAgICAgb3JnUHJlZGljYXRlKHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5vcmdJZCwgc2NvcGUpLFxuICAgICAgZXEoc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLnBpcGVsaW5lSWQsIHBpcGVsaW5lSWQpLFxuICAgICAgZ3RlKHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5kYXksIG5ldyBEYXRlKHNjb3BlLmZyb20pKSxcbiAgICAgIGx0KHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5kYXksIG5ldyBEYXRlKHNjb3BlLnRvKSksXG4gICAgICBzcWxgJHtzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAuc3RhZ2VOYW1lfSA8PiAnJ2AsXG4gICAgKSlcbiAgICAuZ3JvdXBCeShzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAuc3RhZ2VOYW1lKSk7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZVJvdz4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSB7XG4gICAgbWFwLnNldChTdHJpbmcoci5zdGFnZU5hbWUpLCB7XG4gICAgICBzdGFnZU5hbWU6IFN0cmluZyhyLnN0YWdlTmFtZSksXG4gICAgICBydW5zOiBudW0oci5ydW5zKSxcbiAgICAgIGZhaWxlZDogbnVtKHIuZmFpbGVkKSxcbiAgICAgIHA1ME1zOiByLnA1ME1zID09PSBudWxsID8gbnVsbCA6IG51bShyLnA1ME1zKSxcbiAgICAgIHA5NU1zOiByLnA5NU1zID09PSBudWxsID8gbnVsbCA6IG51bShyLnA5NU1zKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gWy4uLm1hcC52YWx1ZXMoKV07XG59XG5cbi8qKiBCdWlsZCB0aW1lIGJ5IHByb2plY3QgYW5kIHBpcGVsaW5lLiBObyBtb25leSBhbnl3aGVyZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VSb3cge1xuICBwcm9qZWN0OiBzdHJpbmcgfCBudWxsO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgYnVpbGRTZWNvbmRzOiBudW1iZXI7XG4gIHJ1bnM6IG51bWJlcjtcbiAgc2hhcmVQY3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGVyZSB0aGUgYnVpbGQgdGltZSB3ZW50LlxuICpcbiAqIFNFQ09ORFMsIE5PVCBET0xMQVJTLiBBIGNvc3QgZmlndXJlIG5lZWRzIHRoZSBpbnN0YW5jZSB0eXBlcywgdGhlIHNwb3Qvb24tZGVtYW5kXG4gKiBtaXggYW5kIHRoZSBhY2NvdW50J3Mgb3duIGRpc2NvdW50cywgbm9uZSBvZiB3aGljaCB0aGlzIHBsYXRmb3JtIGtub3dzIOKAlCBzbyBhXG4gKiBkb2xsYXIgbnVtYmVyIGhlcmUgd291bGQgYmUgYSBndWVzcyBwcmVzZW50ZWQgYXMgYW4gaW52b2ljZS4gQnVpbGQgdGltZSBpcyB0aGVcbiAqIHRoaW5nIGFjdHVhbGx5IG1lYXN1cmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VDb25zdW1wdGlvbihzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gMjApOiBQcm9taXNlPHtcbiAgcGlwZWxpbmVzOiBSZXNvdXJjZVJvd1tdO1xuICB0b3RhbEJ1aWxkU2Vjb25kczogbnVtYmVyO1xufT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVFxuICAgICAgcC5wcm9qZWN0LFxuICAgICAgci5waXBlbGluZV9pZCxcbiAgICAgIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgIFNVTShyLmJ1aWxkX3NlY29uZHMpOjppbnQgQVMgYnVpbGRfc2Vjb25kcyxcbiAgICAgIFNVTShyLnJ1bnMpOjppbnQgQVMgcnVuc1xuICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHMgclxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gci5waXBlbGluZV9pZFxuICAgIFdIRVJFIHIub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgci5kYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIHIuZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICBBTkQgci5zdGFnZV9uYW1lID0gJydcbiAgICBHUk9VUCBCWSBwLnByb2plY3QsIHIucGlwZWxpbmVfaWQsIHAucGlwZWxpbmVfbmFtZVxuICAgIE9SREVSIEJZIGJ1aWxkX3NlY29uZHMgREVTQ1xuICAgIExJTUlUICR7bGltaXR9XG4gIGApKTtcbiAgY29uc3QgbGlzdCA9IHJvd3NPZihyb3dzKTtcbiAgY29uc3QgdG90YWwgPSBsaXN0LnJlZHVjZSgocywgcikgPT4gcyArIG51bShyLmJ1aWxkX3NlY29uZHMpLCAwKTtcbiAgcmV0dXJuIHtcbiAgICB0b3RhbEJ1aWxkU2Vjb25kczogdG90YWwsXG4gICAgcGlwZWxpbmVzOiBsaXN0Lm1hcCgocikgPT4gKHtcbiAgICAgIHByb2plY3Q6IChyLnByb2plY3QgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICAgIHBpcGVsaW5lTmFtZTogKHIucGlwZWxpbmVfbmFtZSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgICAgYnVpbGRTZWNvbmRzOiBudW0oci5idWlsZF9zZWNvbmRzKSxcbiAgICAgIHJ1bnM6IG51bShyLnJ1bnMpLFxuICAgICAgc2hhcmVQY3Q6IHRvdGFsID4gMCA/IE51bWJlcigoKG51bShyLmJ1aWxkX3NlY29uZHMpIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpKSA6IDAsXG4gICAgfSkpLFxuICB9O1xufVxuXG4vKiogT25lIGNvbW1pdCdzIGpvdXJuZXkgYWNyb3NzIGVudmlyb25tZW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbW90aW9uUm93IHtcbiAgY29tbWl0U2hhOiBzdHJpbmc7XG4gIC8qKiBFbnZpcm9ubWVudCDihpIgd2hlbiBpdCBsYW5kZWQgdGhlcmUsIGluIHRoZSBvcmRlciBpdCByZWFjaGVkIHRoZW0uICovXG4gIHN0b3BzOiBBcnJheTx7IGVudmlyb25tZW50OiBzdHJpbmc7IGRlcGxveWVkQXQ6IHN0cmluZzsgaG91cnNGcm9tUHJldmlvdXM6IG51bWJlciB8IG51bGwgfT47XG4gIC8qKiBUcnVlIHdoZW4gdGhlIGNvbW1pdCByZWFjaGVkIGEgbm9uLXByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYW5kIHN0b3BwZWQuICovXG4gIHN0dWNrOiBib29sZWFuO1xuICBmdXJ0aGVzdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXJlIGNvbW1pdHMgZ290IHRvLCBhbmQgd2hlcmUgdGhleSBzdG9wcGVkLlxuICpcbiAqIFwiU3R1Y2tcIiBpcyB0aGUgbnVtYmVyIHdvcnRoIHJlYWRpbmcuIEEgY29tbWl0IHRoYXQgcmVhY2hlZCBzdGFnaW5nIGZvdXIgZGF5cyBhZ29cbiAqIGFuZCBuZXZlciB3ZW50IGZ1cnRoZXIgaXMgd29yayB0aGF0IGlzIGZpbmlzaGVkIGFuZCBub3QgZGVsaXZlcmVkIOKAlCB3aGljaCBkb2VzXG4gKiBub3QgYXBwZWFyIGluIGRlcGxveW1lbnQgZnJlcXVlbmN5LCBzdWNjZXNzIHJhdGUgb3IgbGVhZCB0aW1lLCBiZWNhdXNlIGJ5IGV2ZXJ5XG4gKiBvbmUgb2YgdGhvc2UgbWVhc3VyZXMgbm90aGluZyBoYXBwZW5lZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb21vdGlvblZpZXcoXG4gIHNjb3BlOiBBbmFseXRpY3NTY29wZSxcbiAgcHJvZHVjdGlvbkVudiA9ICdwcm9kdWN0aW9uJyxcbiAgbGltaXQgPSAyNSxcbik6IFByb21pc2U8eyBjb21taXRzOiBQcm9tb3Rpb25Sb3dbXTsgc3R1Y2tDb3VudDogbnVtYmVyIH0+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBTRUxFQ1QgY29tbWl0X3NoYSwgZW52aXJvbm1lbnQsIE1JTihkZXBsb3llZF9hdCkgQVMgZGVwbG95ZWRfYXRcbiAgICBGUk9NIGRvcmFfZGVwbG95bWVudHNcbiAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCBkZXBsb3llZF9hdCA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGVwbG95ZWRfYXQgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgIEFORCBzdWNjZWVkZWQgPSB0cnVlXG4gICAgICBBTkQgY29tbWl0X3NoYSBJUyBOT1QgTlVMTFxuICAgIEdST1VQIEJZIGNvbW1pdF9zaGEsIGVudmlyb25tZW50XG4gICAgT1JERVIgQlkgTUlOKGRlcGxveWVkX2F0KSBERVNDXG4gIGApKTtcblxuICBjb25zdCBieUNvbW1pdCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTx7IGVudmlyb25tZW50OiBzdHJpbmc7IGRlcGxveWVkQXQ6IERhdGUgfT4+KCk7XG4gIGZvciAoY29uc3QgciBvZiByb3dzT2Yocm93cykpIHtcbiAgICBjb25zdCBzaGEgPSBTdHJpbmcoci5jb21taXRfc2hhKTtcbiAgICBjb25zdCBsaXN0ID0gYnlDb21taXQuZ2V0KHNoYSkgPz8gW107XG4gICAgbGlzdC5wdXNoKHsgZW52aXJvbm1lbnQ6IFN0cmluZyhyLmVudmlyb25tZW50KSwgZGVwbG95ZWRBdDogbmV3IERhdGUoU3RyaW5nKHIuZGVwbG95ZWRfYXQpKSB9KTtcbiAgICBieUNvbW1pdC5zZXQoc2hhLCBsaXN0KTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1pdHM6IFByb21vdGlvblJvd1tdID0gWy4uLmJ5Q29tbWl0LmVudHJpZXMoKV0ubWFwKChbY29tbWl0U2hhLCByYXddKSA9PiB7XG4gICAgY29uc3Qgb3JkZXJlZCA9IFsuLi5yYXddLnNvcnQoKGEsIGIpID0+IGEuZGVwbG95ZWRBdC5nZXRUaW1lKCkgLSBiLmRlcGxveWVkQXQuZ2V0VGltZSgpKTtcbiAgICBjb25zdCBzdG9wcyA9IG9yZGVyZWQubWFwKChzdG9wLCBpKSA9PiAoe1xuICAgICAgZW52aXJvbm1lbnQ6IHN0b3AuZW52aXJvbm1lbnQsXG4gICAgICBkZXBsb3llZEF0OiBzdG9wLmRlcGxveWVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGhvdXJzRnJvbVByZXZpb3VzOiBpID09PSAwXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IE51bWJlcigoKHN0b3AuZGVwbG95ZWRBdC5nZXRUaW1lKCkgLSAob3JkZXJlZFtpIC0gMV0gYXMgeyBkZXBsb3llZEF0OiBEYXRlIH0pLmRlcGxveWVkQXQuZ2V0VGltZSgpKSAvIDM2MDBfMDAwKS50b0ZpeGVkKDEpKSxcbiAgICB9KSk7XG4gICAgY29uc3QgZnVydGhlc3QgPSBvcmRlcmVkW29yZGVyZWQubGVuZ3RoIC0gMV0/LmVudmlyb25tZW50ID8/ICcnO1xuICAgIHJldHVybiB7IGNvbW1pdFNoYSwgc3RvcHMsIGZ1cnRoZXN0LCBzdHVjazogZnVydGhlc3QgIT09IHByb2R1Y3Rpb25FbnYgfTtcbiAgfSlcbiAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYUxhc3QgPSBhLnN0b3BzW2Euc3RvcHMubGVuZ3RoIC0gMV0/LmRlcGxveWVkQXQgPz8gJyc7XG4gICAgICBjb25zdCBiTGFzdCA9IGIuc3RvcHNbYi5zdG9wcy5sZW5ndGggLSAxXT8uZGVwbG95ZWRBdCA/PyAnJztcbiAgICAgIHJldHVybiBiTGFzdC5sb2NhbGVDb21wYXJlKGFMYXN0KTtcbiAgICB9KVxuICAgIC5zbGljZSgwLCBsaW1pdCk7XG5cbiAgcmV0dXJuIHsgY29tbWl0cywgc3R1Y2tDb3VudDogY29tbWl0cy5maWx0ZXIoKGMpID0+IGMuc3R1Y2spLmxlbmd0aCB9O1xufVxuXG4vKiogT3V0ZGF0ZWQgcGx1Z2luIHVzYWdlLCBwZXIgcGlwZWxpbmUgYW5kIHN0ZXAuICovXG5leHBvcnQgaW50ZXJmYWNlIE91dGRhdGVkUGx1Z2luUm93IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBzdGVwTmFtZTogc3RyaW5nO1xuICBwbHVnaW46IHN0cmluZztcbiAgaW5Vc2U6IHN0cmluZyB8IG51bGw7XG4gIGxhdGVzdDogc3RyaW5nIHwgbnVsbDtcbiAgZ2FwOiBzdHJpbmcgfCBudWxsO1xuICB3aXRoaW5Qb2xpY3k6IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hpY2ggcGlwZWxpbmVzIGFyZSBiZWhpbmQgb24gYSBwbHVnaW4sIHdvcnN0IGdhcCBmaXJzdC5cbiAqXG4gKiBSZWFkcyB0aGUgREVDTEFSRUQgc2lkZSAoYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCkuIEEgcGlwZWxpbmUncyBkZWNsYXJlZFxuICogcmFuZ2UgYW5kIHdoYXQgaXQgbGFzdCBhY3R1YWxseSByYW4gY2FuIGRpc2FncmVlIOKAlCB3aGljaCBpcyB3aHkgdGhlIHZ1bG5lcmFiaWxpdHlcbiAqIHNlY3Rpb24gYmVsb3cgcmVhZHMgdGhlIGRlcGxveWVkIHNpZGUgYW5kIHNheXMgd2hpY2ggaXQgaXMgc2hvd2luZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE91dGRhdGVkUGx1Z2lucyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gNTApOiBQcm9taXNlPHtcbiAgcm93czogT3V0ZGF0ZWRQbHVnaW5Sb3dbXTtcbiAgYmVoaW5kUGlwZWxpbmVzOiBudW1iZXI7XG4gIG1ham9yQmVoaW5kOiBudW1iZXI7XG59PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUXG4gICAgICByLnBpcGVsaW5lX2lkLCBwLnBpcGVsaW5lX25hbWUsIHIuc3RhZ2VfbmFtZSwgci5zdGVwX25hbWUsXG4gICAgICBDT0FMRVNDRShyLnBsdWdpbl9wdWJsaXNoZXIgfHwgJy8nLCAnJykgfHwgci5wbHVnaW5fbmFtZSBBUyBwbHVnaW4sXG4gICAgICByLnJlc29sdmVkX3ZlcnNpb24sIHIubGF0ZXN0X3ZlcnNpb24sIHIudmVyc2lvbl9nYXAsIHIud2l0aGluX3BvbGljeVxuICAgIEZST00gcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb24gclxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gci5waXBlbGluZV9pZFxuICAgIFdIRVJFIHIub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgKHIudmVyc2lvbl9nYXAgSU4gKCdtYWpvcicsICdtaW5vcicsICdwYXRjaCcpIE9SIHIud2l0aGluX3BvbGljeSA9IGZhbHNlKVxuICAgIE9SREVSIEJZIENBU0Ugci52ZXJzaW9uX2dhcCBXSEVOICdtYWpvcicgVEhFTiAwIFdIRU4gJ21pbm9yJyBUSEVOIDEgV0hFTiAncGF0Y2gnIFRIRU4gMiBFTFNFIDMgRU5ELFxuICAgICAgICAgICAgIHIucGlwZWxpbmVfaWRcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIGNvbnN0IGxpc3QgPSByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBzdGFnZU5hbWU6IFN0cmluZyhyLnN0YWdlX25hbWUpLFxuICAgIHN0ZXBOYW1lOiBTdHJpbmcoci5zdGVwX25hbWUpLFxuICAgIHBsdWdpbjogU3RyaW5nKHIucGx1Z2luKSxcbiAgICBpblVzZTogKHIucmVzb2x2ZWRfdmVyc2lvbiBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIGxhdGVzdDogKHIubGF0ZXN0X3ZlcnNpb24gYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBnYXA6IChyLnZlcnNpb25fZ2FwIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgd2l0aGluUG9saWN5OiByLndpdGhpbl9wb2xpY3kgIT09IGZhbHNlLFxuICB9KSk7XG4gIHJldHVybiB7XG4gICAgcm93czogbGlzdCxcbiAgICBiZWhpbmRQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gICAgbWFqb3JCZWhpbmQ6IGxpc3QuZmlsdGVyKChyKSA9PiByLmdhcCA9PT0gJ21ham9yJykubGVuZ3RoLFxuICB9O1xufVxuXG4vKiogQSBwaXBlbGluZSdzIGV4cG9zdXJlIHRvIGEgdnVsbmVyYWJsZSBwbHVnaW4gdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnVsbmVyYWJpbGl0eVJvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwbHVnaW46IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICAvKiogYGRlcGxveWVkYCA9IHdoYXQgYWN0dWFsbHkgcmFuOyBgZGVjbGFyZWRgID0gd2hhdCB0aGUgY29uZmlnIGFza3MgZm9yLiAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgY3JpdGljYWw6IG51bWJlcjtcbiAgaGlnaDogbnVtYmVyO1xuICBmaW5kaW5nczogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBmbGFnZ2VkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQbHVnaW4gdnVsbmVyYWJpbGl0aWVzLCBwZXIgcGlwZWxpbmUsIENyaXRpY2FscyBmaXJzdC5cbiAqXG4gKiBTQVlTIFdIRVRIRVIgSVQgSVMgREVDTEFSRUQgT1IgREVQTE9ZRUQuIEEgcGlwZWxpbmUgd2hvc2UgY29uZmlnIHdhcyB1cGRhdGVkIHRvIGFcbiAqIGZpeGVkIHZlcnNpb24gYnV0IHdoaWNoIGhhcyBub3QgcmUtc3ludGhlZCBpcyBzdGlsbCBydW5uaW5nIHRoZSB2dWxuZXJhYmxlIGltYWdlLFxuICogYW5kIGEgcmVwb3J0IHRoYXQgY29sbGFwc2VkIHRoZSB0d28gd291bGQgdGVsbCBhIG1hbmFnZXIgdGhlIHByb2JsZW0gaXMgc29sdmVkXG4gKiB3aGlsZSB0aGUgb2xkIGltYWdlIGtlZXBzIHJ1bm5pbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQbHVnaW5WdWxuZXJhYmlsaXRpZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKTogUHJvbWlzZTx7XG4gIHJvd3M6IFZ1bG5lcmFiaWxpdHlSb3dbXTtcbiAgZXhwb3NlZFBpcGVsaW5lczogbnVtYmVyO1xuICBjcml0aWNhbFBpcGVsaW5lczogbnVtYmVyO1xufT4ge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVFxuICAgICAgdi5waXBlbGluZV9pZCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgQ09BTEVTQ0Uodi5wbHVnaW5fcHVibGlzaGVyIHx8ICcvJywgJycpIHx8IHYucGx1Z2luX25hbWUgQVMgcGx1Z2luLFxuICAgICAgdi5wbHVnaW5fdmVyc2lvbiwgdi5zb3VyY2UsIHYuY3JpdGljYWxfY291bnQsIHYuaGlnaF9jb3VudCwgdi50b3BfZmluZGluZ3MsIHYuZmxhZ2dlZF9hdFxuICAgIEZST00gcGx1Z2luX3Z1bG5fZXhwb3N1cmUgdlxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gdi5waXBlbGluZV9pZFxuICAgIFdIRVJFIHYub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgJHtsaXZlRXhwb3N1cmVQcmVkaWNhdGUobm93LCAndicpfVxuICAgIE9SREVSIEJZIHYuY3JpdGljYWxfY291bnQgREVTQywgdi5oaWdoX2NvdW50IERFU0NcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIGNvbnN0IGxpc3QgPSByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBwbHVnaW46IFN0cmluZyhyLnBsdWdpbiksXG4gICAgdmVyc2lvbjogU3RyaW5nKHIucGx1Z2luX3ZlcnNpb24pLFxuICAgIHNvdXJjZTogU3RyaW5nKHIuc291cmNlKSxcbiAgICBjcml0aWNhbDogbnVtKHIuY3JpdGljYWxfY291bnQpLFxuICAgIGhpZ2g6IG51bShyLmhpZ2hfY291bnQpLFxuICAgIGZpbmRpbmdzOiAoci50b3BfZmluZGluZ3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA/PyBbXSxcbiAgICBmbGFnZ2VkQXQ6IGlzb09yTnVsbChyLmZsYWdnZWRfYXQpID8/IG5ldyBEYXRlKDApLnRvSVNPU3RyaW5nKCksXG4gIH0pKTtcbiAgcmV0dXJuIHtcbiAgICByb3dzOiBsaXN0LFxuICAgIGV4cG9zZWRQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gICAgY3JpdGljYWxQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5maWx0ZXIoKHIpID0+IHIuY3JpdGljYWwgPiAwKS5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gIH07XG59XG5cbi8qKiBBZG9wdGlvbiBhbmQgZGVwbG95LXRyYWNraW5nIGNvdmVyYWdlIHdpdGhpbiB0aGUgcmVwb3J0ZWQgc2NvcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkb3B0aW9uU3VtbWFyeSB7XG4gIGFjdGl2ZVBpcGVsaW5lczogbnVtYmVyO1xuICB0b3RhbFBpcGVsaW5lczogbnVtYmVyO1xuICAvKiogUGlwZWxpbmVzIHRoYXQgcHJvZHVjZWQgYSBkZXBsb3kgcm93IOKAlCBpLmUuIG9uZXMgRE9SQSBjYW4gc2VlLiAqL1xuICBkZXBsb3lUcmFja2VkUGlwZWxpbmVzOiBudW1iZXI7XG4gIC8qKiBCeSBgY3JlYXRpb25fc291cmNlYCwgZm9yIFwiYXJlIHRoZSBnb2xkZW4gcGF0aHMgYmVpbmcgdXNlZFwiLiAqL1xuICBieVNvdXJjZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgLyoqIFRlYW1zIGluIHRoZSByb2xsdXAgdGhhdCBoYWQgYWN0aXZpdHkuIDEgZm9yIGEgc2luZ2xlLW9yZyByZXBvcnQuICovXG4gIGFjdGl2ZVRlYW1zOiBudW1iZXI7XG4gIC8qKiBPbmx5IHdoZW4gdGhlIG9yZyBjb25maWd1cmVkIHRoZSBhc3N1bXB0aW9uLiBOZXZlciBwbGF0Zm9ybS1zdXBwbGllZC4gKi9cbiAgZXN0aW1hdGVkTWludXRlc1NhdmVkOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIEFkb3B0aW9uLCBjb3ZlcmFnZSBhbmQgY3JlYXRpb24gc291cmNlLlxuICpcbiAqIGBkZXBsb3lUcmFja2VkUGlwZWxpbmVzYCBpcyB0aGUgaG9uZXN0IGRlbm9taW5hdG9yIGZvciBldmVyeXRoaW5nIERPUkEgc2F5czogYVxuICogcGlwZWxpbmUgdGhhdCBoYXMgbm90IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncyBwcm9kdWNlcyBubyBkZXBsb3kgcm93cywgc28gaXRcbiAqIGlzIGludmlzaWJsZSB0byBkZXBsb3ltZW50IGZyZXF1ZW5jeSDigJQgYW5kIHJlcG9ydGluZyBcIjQgZGVwbG95c1wiIHdpdGhvdXQgc2F5aW5nXG4gKiB0aGF0IDIwIG9mIDMwIHBpcGVsaW5lcyBjYW5ub3QgYmUgc2VlbiBpcyB0aGUgc2luZ2xlIG1vc3QgbWlzbGVhZGluZyB0aGluZyB0aGlzXG4gKiBmZWF0dXJlIGNvdWxkIGRvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWRvcHRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCB0aW1lU2F2ZWRNaW51dGVzPzogbnVtYmVyIHwgbnVsbCk6IFByb21pc2U8QWRvcHRpb25TdW1tYXJ5PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgV0lUSCBzY29wZWQgQVMgKFxuICAgICAgU0VMRUNUIGlkOjp0ZXh0IEFTIGlkLCBvcmdfaWQsIGNyZWF0aW9uX3NvdXJjZVxuICAgICAgRlJPTSBwaXBlbGluZXNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gQU5ZKCR7c2NvcGUub3JnSWRzfSlgIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgZGVsZXRlZF9hdCBJUyBOVUxMXG4gICAgKSxcbiAgICBhY3RpdmUgQVMgKFxuICAgICAgU0VMRUNUIERJU1RJTkNUIHBpcGVsaW5lX2lkLCBvcmdfaWRcbiAgICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gQU5ZKCR7c2NvcGUub3JnSWRzfSlgIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgZGF5ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBkYXkgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgQU5EIHN0YWdlX25hbWUgPSAnJyBBTkQgcnVucyA+IDBcbiAgICApLFxuICAgIHRyYWNrZWQgQVMgKFxuICAgICAgU0VMRUNUIERJU1RJTkNUIHBpcGVsaW5lX2lkXG4gICAgICBGUk9NIGRvcmFfZGVwbG95bWVudHNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gQU5ZKCR7c2NvcGUub3JnSWRzfSlgIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgZGVwbG95ZWRfYXQgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRlcGxveWVkX2F0IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgKVxuICAgIFNFTEVDVFxuICAgICAgKFNFTEVDVCBDT1VOVCgqKSBGUk9NIHNjb3BlZCk6OmludCBBUyB0b3RhbF9waXBlbGluZXMsXG4gICAgICAoU0VMRUNUIENPVU5UKCopIEZST00gYWN0aXZlKTo6aW50IEFTIGFjdGl2ZV9waXBlbGluZXMsXG4gICAgICAoU0VMRUNUIENPVU5UKERJU1RJTkNUIG9yZ19pZCkgRlJPTSBhY3RpdmUpOjppbnQgQVMgYWN0aXZlX3RlYW1zLFxuICAgICAgKFNFTEVDVCBDT1VOVCgqKSBGUk9NIHRyYWNrZWQpOjppbnQgQVMgZGVwbG95X3RyYWNrZWQsXG4gICAgICAoU0VMRUNUIENPQUxFU0NFKGpzb25iX29iamVjdF9hZ2coQ09BTEVTQ0UoY3JlYXRpb25fc291cmNlLCAndW5rbm93bicpLCBuKSwgJ3t9Jzo6anNvbmIpXG4gICAgICAgICBGUk9NIChTRUxFQ1QgY3JlYXRpb25fc291cmNlLCBDT1VOVCgqKTo6aW50IEFTIG4gRlJPTSBzY29wZWQgR1JPVVAgQlkgY3JlYXRpb25fc291cmNlKSBzXG4gICAgICApIEFTIGJ5X3NvdXJjZVxuICBgKSk7XG4gIGNvbnN0IHIgPSByb3dzT2Yocm93cylbMF0gPz8ge307XG4gIGNvbnN0IGNyZWF0ZWQgPSBudW0oci50b3RhbF9waXBlbGluZXMpO1xuICByZXR1cm4ge1xuICAgIHRvdGFsUGlwZWxpbmVzOiBjcmVhdGVkLFxuICAgIGFjdGl2ZVBpcGVsaW5lczogbnVtKHIuYWN0aXZlX3BpcGVsaW5lcyksXG4gICAgYWN0aXZlVGVhbXM6IE1hdGgubWF4KDEsIG51bShyLmFjdGl2ZV90ZWFtcykpLFxuICAgIGRlcGxveVRyYWNrZWRQaXBlbGluZXM6IG51bShyLmRlcGxveV90cmFja2VkKSxcbiAgICBieVNvdXJjZTogKHIuYnlfc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pID8/IHt9LFxuICAgIC8vIE9ubHkgd2hlbiB0aGUgT1JHIGNvbmZpZ3VyZWQgdGhlIGFzc3VtcHRpb24g4oCUIGEgcGxhdGZvcm0tc3VwcGxpZWQgbnVtYmVyXG4gICAgLy8gaGVyZSB3b3VsZCBiZSB0aGUgcGxhdGZvcm0gbWFya2luZyBpdHMgb3duIGhvbWV3b3JrLlxuICAgIGVzdGltYXRlZE1pbnV0ZXNTYXZlZDogdGltZVNhdmVkTWludXRlcyAmJiB0aW1lU2F2ZWRNaW51dGVzID4gMCA/IGNyZWF0ZWQgKiB0aW1lU2F2ZWRNaW51dGVzIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqIE9uZSBwaXBlbGluZSdzIGZhaWx1cmUgc3RyZWFrIGFuZCBsYXN0IHN1Y2Nlc3NmdWwgZGF5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0cmVha1JvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEZhaWx1cmVzIGluIHRoZSB0cmFpbGluZyBydW4gb2YgZGF5cyBvbiB3aGljaCBOT1RISU5HIHN1Y2NlZWRlZC5cbiAgICpcbiAgICogQSBMT1dFUiBCT1VORCwgYW5kIGRlbGliZXJhdGVseSBzby4gVGhlIHJvbGx1cCBpcyBwZXIgZGF5LCBzbyB3aXRoaW4gdGhlIG1vc3RcbiAgICogcmVjZW50IGRheSB0aGF0IGRpZCBoYXZlIGEgc3VjY2VzcyB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB3aGV0aGVyIHRoZSBmYWlsdXJlc1xuICAgKiBjYW1lIGJlZm9yZSBvciBhZnRlciBpdCDigJQgdGhhdCBkYXkgaXMgZXhjbHVkZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZCBhdC4gV2hhdFxuICAgKiBzdXJ2aXZlcyBpcyBhIHJ1biBvZiBmYWlsdXJlcyB3aXRoIG5vIHN1Y2Nlc3MgYW55d2hlcmUgYmV0d2VlbiB0aGVtLCB3aGljaCBpc1xuICAgKiBleGFjdGx5IHRoZSBjbGFpbSB0aGUgZmluZGluZyBtYWtlcy5cbiAgICovXG4gIGNvbnNlY3V0aXZlRmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIFRoZSBsYXN0IGRheSB3aXRoIGF0IGxlYXN0IG9uZSBzdWNjZXNzLCBvciBudWxsIHdpdGhpbiB0aGUgbG9va2JhY2suICovXG4gIGxhc3RTdWNjZXNzQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIEZhaWx1cmUgc3RyZWFrcyBhbmQgbGFzdC1zdWNjZXNzIGRhdGVzLCBmb3IgdGhlIG5lZWRzLWF0dGVudGlvbiBydWxlcy5cbiAqXG4gKiBSZWFkcyB0aGUgZGFpbHkgcm9sbHVwLCBub3QgYHBpcGVsaW5lX2V2ZW50c2Ag4oCUIHRoZSBzYW1lIHJlYXNvbiBhcyBldmVyeXRoaW5nXG4gKiBlbHNlIGhlcmU6IGEgc3RyZWFrIHRoYXQgZW5kZWQgdGhyZWUgd2Vla3MgYWdvIG11c3Qgc3RpbGwgYmUgcmVhZGFibGUgYWZ0ZXJcbiAqIHJldGVudGlvbiBoYXMgc3dlcHQgdGhlIGV2ZW50cyB0aGF0IHByb2R1Y2VkIGl0LlxuICpcbiAqIGBsb29rYmFja0RheXNgIGV4dGVuZHMgUEFTVCB0aGUgd2luZG93IG9uIHB1cnBvc2UuIFwiTGFzdCBzdWNjZWVkZWQgMTIgZGF5cyBhZ29cIlxuICogaXMgdGhlIGZpbmRpbmcgYSB3ZWVrbHkgcmVwb3J0IG1vc3QgbmVlZHMsIGFuZCBhIHF1ZXJ5IGJvdW5kZWQgYnkgYSA3LWRheSB3aW5kb3dcbiAqIGNvdWxkIG5ldmVyIHByb2R1Y2UgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQaXBlbGluZVN0cmVha3MoXG4gIHNjb3BlOiBBbmFseXRpY3NTY29wZSxcbiAgbG9va2JhY2tEYXlzID0gOTAsXG4pOiBQcm9taXNlPFBpcGVsaW5lU3RyZWFrUm93W10+IHtcbiAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShuZXcgRGF0ZShzY29wZS50bykuZ2V0VGltZSgpIC0gbG9va2JhY2tEYXlzICogODZfNDAwXzAwMCkudG9JU09TdHJpbmcoKTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBXSVRIIGRheXMgQVMgKFxuICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCBkYXksXG4gICAgICAgICAgICAgU1VNKHN1Y2NlZWRlZCk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgICAgU1VNKGZhaWxlZCk6OmludCAgICBBUyBmYWlsZWRcbiAgICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gQU5ZKCR7c2NvcGUub3JnSWRzfSlgIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgZGF5ID49ICR7c2luY2V9Ojp0aW1lc3RhbXB0eiBBTkQgZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZCwgZGF5XG4gICAgKSxcbiAgICBsYXN0X29rIEFTIChcbiAgICAgIFNFTEVDVCBwaXBlbGluZV9pZCwgTUFYKGRheSkgQVMgbGFzdF9zdWNjZXNzX2RheVxuICAgICAgRlJPTSBkYXlzIFdIRVJFIHN1Y2NlZWRlZCA+IDBcbiAgICAgIEdST1VQIEJZIHBpcGVsaW5lX2lkXG4gICAgKVxuICAgIFNFTEVDVCBkLnBpcGVsaW5lX2lkLFxuICAgICAgICAgICBsLmxhc3Rfc3VjY2Vzc19kYXksXG4gICAgICAgICAgIENPQUxFU0NFKFNVTShkLmZhaWxlZCkgRklMVEVSIChcbiAgICAgICAgICAgICBXSEVSRSBsLmxhc3Rfc3VjY2Vzc19kYXkgSVMgTlVMTCBPUiBkLmRheSA+IGwubGFzdF9zdWNjZXNzX2RheVxuICAgICAgICAgICApLCAwKTo6aW50IEFTIHN0cmVha1xuICAgIEZST00gZGF5cyBkXG4gICAgTEVGVCBKT0lOIGxhc3Rfb2sgbCBPTiBsLnBpcGVsaW5lX2lkID0gZC5waXBlbGluZV9pZFxuICAgIEdST1VQIEJZIGQucGlwZWxpbmVfaWQsIGwubGFzdF9zdWNjZXNzX2RheVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBjb25zZWN1dGl2ZUZhaWx1cmVzOiBudW0oci5zdHJlYWspLFxuICAgIGxhc3RTdWNjZXNzQXQ6IHIubGFzdF9zdWNjZXNzX2RheSA/IG5ldyBEYXRlKFN0cmluZyhyLmxhc3Rfc3VjY2Vzc19kYXkpKSA6IG51bGwsXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBQaXBlbGluZXMgdGhhdCBSQU4gaW4gdGhlIHdpbmRvdyBidXQgcHJvZHVjZWQgbm8gZGVwbG95IHJvd3MuXG4gKlxuICogQSBtZWFzdXJlbWVudCBnYXAsIG5vdCBhIGZhaWx1cmUsIGFuZCB0aGUgcmVhc29uIGEgZGVwbG95bWVudC1mcmVxdWVuY3kgbnVtYmVyIGNhblxuICogYmUgcXVpZXRseSB3cm9uZzogYSBwaXBlbGluZSB3aG9zZSBzeW50aCBwcmVkYXRlcyB0aGUgYHBiLmRlcGxveXNgIHRhZ3MgZGVwbG95c1xuICogcGVyZmVjdGx5IHdlbGwgYW5kIGlzIGludmlzaWJsZSB0byBldmVyeSBET1JBIGFnZ3JlZ2F0ZS4gTm90aGluZyBlbHNlIGluIHRoZVxuICogcmVwb3J0IHdvdWxkIHNheSBzby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFVudHJhY2tlZFBpcGVsaW5lcyhzY29wZTogQW5hbHl0aWNzU2NvcGUpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgV0lUSCBhY3RpdmUgQVMgKFxuICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRheSA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEFORCBzdGFnZV9uYW1lID0gJydcbiAgICAgIEdST1VQIEJZIHBpcGVsaW5lX2lkXG4gICAgICBIQVZJTkcgU1VNKHJ1bnMpID4gMFxuICAgICksXG4gICAgdHJhY2tlZCBBUyAoXG4gICAgICBTRUxFQ1QgRElTVElOQ1QgcGlwZWxpbmVfaWRcbiAgICAgIEZST00gZG9yYV9kZXBsb3ltZW50c1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkZXBsb3llZF9hdCA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGVwbG95ZWRfYXQgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICApXG4gICAgU0VMRUNUIGEucGlwZWxpbmVfaWQgRlJPTSBhY3RpdmUgYVxuICAgIFdIRVJFIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gdHJhY2tlZCB0IFdIRVJFIHQucGlwZWxpbmVfaWQgPSBhLnBpcGVsaW5lX2lkKVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiBTdHJpbmcoci5waXBlbGluZV9pZCkpO1xufVxuXG4vKipcbiAqIFBpcGVsaW5lcyBydW5uaW5nIGEgcGx1Z2luIHZlcnNpb24gd2l0aCBhbiBPUEVOIENyaXRpY2FsIGV4cG9zdXJlLlxuICpcbiAqIFBvaW50LWluLXRpbWUsIG5vdCB3aW5kb3dlZDogd2hhdCBtYXR0ZXJzIGlzIHdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgb25lXG4gKiBOT1cuIEEgQ3JpdGljYWwgdGhhdCB3YXMgb3BlbiBsYXN0IFR1ZXNkYXkgYW5kIGlzIGZpeGVkIHRvZGF5IGlzIG5vdCBzb21ldGhpbmcgdG9cbiAqIHB1dCBpbiBmcm9udCBvZiBhIG1hbmFnZXIsIGFuZCBgZml4ZWRfYXRgIGlzIHdoYXQgc2F5cyBzby5cbiAqXG4gKiBUaGUgU0FNRSBsaXZlIHByZWRpY2F0ZSBhcyB0aGUgdnVsbmVyYWJpbGl0eSBzZWN0aW9uIChgbGl2ZUV4cG9zdXJlUHJlZGljYXRlYCk6XG4gKiBhbiBhY2NlcHRhbmNlIHN0aWxsIGluIGZvcmNlIGFuZCBhIGZhbHNlIHBvc2l0aXZlIGFyZSBleGNsdWRlZCDigJQgc29tZW9uZSB3aXRoXG4gKiB0aGUgYXV0aG9yaXR5IHRvIGRlY2lkZSBoYXMgZG9uZSBzbyBpbiB3cml0aW5nIOKAlCB3aGlsZSBhbiBhY2NlcHRhbmNlIFBBU1QgaXRzXG4gKiBkZWFkbGluZSBjb3VudHMgYWdhaW4sIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZSBkZWFkbGluZSB3YXMgZm9yLiBUaGUgdHdvXG4gKiByZWFkZXJzIG9uY2UgZGlzYWdyZWVkICh0aGlzIG9uZSBrZXB0IGZhbHNlIHBvc2l0aXZlcyBhbmQgZHJvcHBlZCBleHBpcmVkXG4gKiBhY2NlcHRhbmNlcyksIHNvIHRoZSBwYW5lbCBhbmQgdGhlIG5lZWRzLWF0dGVudGlvbiBsaXN0IGNvbnRyYWRpY3RlZCBlYWNoIG90aGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VnVsbmVyYWJsZVBpcGVsaW5lcyhzY29wZTogQW5hbHl0aWNzU2NvcGUpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIERJU1RJTkNUIHBpcGVsaW5lX2lkXG4gICAgRlJPTSBwbHVnaW5fdnVsbl9leHBvc3VyZVxuICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gQU5ZKCR7c2NvcGUub3JnSWRzfSlgIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgQU5EIGNyaXRpY2FsX2NvdW50ID4gMFxuICAgICAgQU5EICR7bGl2ZUV4cG9zdXJlUHJlZGljYXRlKG5vdyl9XG4gIGApKTtcbiAgcmV0dXJuIHJvd3NPZihyb3dzKS5tYXAoKHIpID0+IFN0cmluZyhyLnBpcGVsaW5lX2lkKSk7XG59XG5cbi8qKlxuICogV2hlbiBlYWNoIHBpcGVsaW5lIGluIHRoZSB3aW5kb3cgd2FzIGxhc3QgY2hhbmdlZC5cbiAqXG4gKiBgcGlwZWxpbmVzLnVwZGF0ZWRfYXRgLCBub3QgYW4gYXVkaXQgcXVlcnk6IHRoZSBhdWRpdCB0cmFpbCBsaXZlcyBpbiBhbm90aGVyIHN0b3JlXG4gKiB3aXRoIGl0cyBvd24gcmV0ZW50aW9uLCBhbmQgdGhlIG9uZSBmYWN0IHRoaXMgbmVlZHMg4oCUIFwid2FzIHRoaXMgdG91Y2hlZCBzaG9ydGx5XG4gKiBiZWZvcmUgaXQgYnJva2VcIiDigJQgaXMgYWxyZWFkeSBvbiB0aGUgcm93LCBkdXJhYmx5LCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiB0aGVcbiAqIGNoYW5nZSB3YXMgbWFkZSBpbi5cbiAqXG4gKiBUaGUgY29uc2VxdWVuY2UgaXMgc3RhdGVkIHJhdGhlciB0aGFuIGhpZGRlbjogYHVwZGF0ZWRfYXRgIG1vdmVzIGZvciBBTlkgd3JpdGUsXG4gKiBpbmNsdWRpbmcgYSByZW5hbWUuIFNvIHRoZSBmaW5kaW5nIHNheXMgXCJhZnRlciBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlXCIsIHdoaWNoIGlzXG4gKiB0cnVlIG9mIGEgcmVuYW1lIHRvbywgYW5kIGRvZXMgbm90IGNsYWltIHRvIG5hbWUgdGhlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBpcGVsaW5lQ29uZmlnQ2hhbmdlcyhzY29wZTogQW5hbHl0aWNzU2NvcGUpOiBQcm9taXNlPE1hcDxzdHJpbmcsIERhdGU+PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIGlkOjp0ZXh0IEFTIGlkLCB1cGRhdGVkX2F0XG4gICAgRlJPTSBwaXBlbGluZXNcbiAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCBkZWxldGVkX2F0IElTIE5VTExcbiAgICAgIEFORCB1cGRhdGVkX2F0IElTIE5PVCBOVUxMXG4gIGApKTtcbiAgY29uc3Qgb3V0ID0gbmV3IE1hcDxzdHJpbmcsIERhdGU+KCk7XG4gIGZvciAoY29uc3QgciBvZiByb3dzT2Yocm93cykpIHtcbiAgICBjb25zdCBhdCA9IHIudXBkYXRlZF9hdCA/IG5ldyBEYXRlKFN0cmluZyhyLnVwZGF0ZWRfYXQpKSA6IG51bGw7XG4gICAgaWYgKGF0ICYmICFOdW1iZXIuaXNOYU4oYXQuZ2V0VGltZSgpKSkgb3V0LnNldChTdHJpbmcoci5pZCksIGF0KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFJvd3MgZnJvbSBhIHJhdyBgZXhlY3V0ZWAsIHdoaWNoZXZlciBzaGFwZSB0aGUgZHJpdmVyIHJldHVybmVkLiAqL1xuZnVuY3Rpb24gcm93c09mKHJlc3VsdDogdW5rbm93bik6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJldHVybiByZXN1bHQgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCByb3dzID0gKHJlc3VsdCBhcyB7IHJvd3M/OiB1bmtub3duIH0pPy5yb3dzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IDogW107XG59XG5cbi8qKiBBIGNvdW50IGZyb20gYSBkcml2ZXIgdGhhdCBtYXkgaGFuZCBiYWNrIGEgc3RyaW5nIGZvciBhIGJpZ2ludC4gKi9cbmZ1bmN0aW9uIG51bSh2OiB1bmtub3duKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiBOdW1iZXIodiA/PyAwKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiAwO1xufVxuXG5mdW5jdGlvbiBpc29Pck51bGwodjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXYpIHJldHVybiBudWxsO1xuICBjb25zdCBkID0gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUoU3RyaW5nKHYpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZC50b0lTT1N0cmluZygpO1xufVxuIl19
|
|
628
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLXF1ZXJpZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVc3RCxtREFBbUQ7QUFDbkQsU0FBUyxZQUFZLENBQUMsR0FBa0MsRUFBRSxLQUFxQjtJQUM3RSxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUM1QyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBWSxFQUFFLEtBQUssQ0FBQyxLQUFjLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBbUJEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxLQUFxQixFQUFFLEtBQUssR0FBRyxFQUFFO0lBQzFFLE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMs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TSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUU7MkJBQ3RFLEtBQUssQ0FBQyxJQUFJLG1DQUFtQyxLQUFLLENBQUMsRUFBRTs7Ozs7R0FLN0UsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBNEQsQ0FBQztJQUNyRixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBbUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUU7UUFDL0UsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pG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QVMsU0FBUyxDQUFDLENBQVU7SUFDM0IsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBxdWVyaWVzIHRoZSBiZXNwb2tlIHJlcG9ydCBzZWN0aW9ucyByZWFkLlxuICpcbiAqIEFsbCBvZiB0aGVtIGdvIHRocm91Z2ggYGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzYCwgYGRvcmFfZGVwbG95bWVudHNgLFxuICogYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCBvciBgcGx1Z2luX3Z1bG5fZXhwb3N1cmVgIOKAlCBuZXZlciByYXdcbiAqIGBwaXBlbGluZV9ldmVudHNgLiBUaGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aG9zZSB0YWJsZXM6IGEgcXVhcnRlcmx5IHJlcG9ydFxuICogb3ZlciBhIGJ1c3kgb3JnIGNvc3RzIGEgZmV3IGh1bmRyZWQgcm93cywgYW5kIGtlZXBzIHdvcmtpbmcgYWZ0ZXIgcmV0ZW50aW9uIGhhc1xuICogc3dlcHQgdGhlIGV2ZW50cy5cbiAqXG4gKiBUV08gUlVMRVMgRVZFUlkgUVVFUlkgSEVSRSBGT0xMT1dTOlxuICpcbiAqICAtIE5PVEhJTkcgSVMgUEVSLVBFUlNPTi4gRXZlcnkgYWdncmVnYXRlIGlzIHBlciBwaXBlbGluZSwgcGVyIHN0YWdlLCBwZXJcbiAqICAgIGNhdGVnb3J5IG9yIHBlciBlbnZpcm9ubWVudC4gVGhlIHNlY3Rpb24gcmVnaXN0cnkgcmVmdXNlcyBhIHBlci1wZXJzb24gaWQgYXRcbiAqICAgIHJlZ2lzdHJhdGlvbjsgdGhlc2UgcXVlcmllcyBtYWtlIHN1cmUgdGhlcmUgaXMgbm90aGluZyB0byByZWdpc3Rlci5cbiAqICAtIEEgWkVSTyBBTkQgQSBCTElORCBTUE9UIEFSRSBESUZGRVJFTlQuIFdoZXJlIGEgbnVtYmVyIGNhbiBiZSBhYnNlbnQgZm9yIGxhY2tcbiAqICAgIG9mIGRhdGEgcmF0aGVyIHRoYW4gbGFjayBvZiBhY3Rpdml0eSwgdGhlIHNoYXBlIGNhcnJpZXMgdGhhdCAoYG51bGxgLCBhXG4gKiAgICBgY292ZXJhZ2VgIGNvdW50LCBhbiBleHBsaWNpdCByZWFzb24pIGluc3RlYWQgb2YgY29sbGFwc2luZyB0byAwLlxuICpcbiAqIFJFQURTIEdPIFRPIFRIRSBSRVBMSUNBIFdIRU4gT05FIEVYSVNUUy4gRXZlcnkgcXVlcnkgYmVsb3cgcnVucyB0aHJvdWdoXG4gKiBgd2l0aFRlbmFudFR4UmVhZGAsIHRoZSByZWFkLW9ubHkgdmFyaWFudCBvZiBgd2l0aFRlbmFudFR4YC4gSXQgc2V0cyB0aGVcbiAqIGlkZW50aWNhbCBSTFMgR1VDcywgYWRkcyBgU0VUIFRSQU5TQUNUSU9OIFJFQUQgT05MWWAsIGFuZCBmYWxscyBiYWNrIHRvIHRoZVxuICogcHJpbWFyeSBhdXRvbWF0aWNhbGx5IHdoZW5ldmVyIHRoZXJlIGlzIG5vIHJlcGxpY2EsIHRoZSBraWxsIHN3aXRjaCBpcyBvZmYsXG4gKiByZXBsYXkgbGFnIGlzIGJleW9uZCBpdHMgdGhyZXNob2xkLCB0aGUgcmVxdWVzdCBoYXMgYWxyZWFkeSB3cml0dGVuLCBvciB0aGVyZVxuICogaXMgbm8gdGVuYW50IGNvbnRleHQg4oCUIHNvIHRoaXMgaXMgYSBuby1vcCB1bnRpbCBgREJfUkVBRF9IT1NUYCBpcyBjb25maWd1cmVkLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgV0FTIFRIRSBGSVJTVCBUTyBPUFQgSU4uIFRocmVlIGNvbmRpdGlvbnMgZGVjaWRlIHdoZXRoZXIgYVxuICogcXVlcnkgbWF5IGxlYXZlIHRoZSBwcmltYXJ5LCBhbmQgdGhpcyBmaWxlIHNhdGlzZmllcyBhbGwgdGhyZWUgYnlcbiAqIGNvbnN0cnVjdGlvbiDigJQgc28gdGhleSBhcmUgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gY2l0ZWQsIG5vdyB0aGF0IHRoZSBwbGFuXG4gKiB0aGF0IGludHJvZHVjZWQgdGhlbSBpcyByZXRpcmVkOlxuICpcbiAqICAgLSBOb3RoaW5nIGhlcmUgd3JpdGVzLiBUaGlydGVlbiBhZ2dyZWdhdGUgU0VMRUNUcywgbm8gSU5TRVJULCBubyBVUERBVEUsIG5vXG4gKiAgICAgYFNFTEVDVCDigKYgRk9SIFVQREFURWAsIG5vIGFkdmlzb3J5IGxvY2sg4oCUIHNvIG5vbmUgb2YgdGhlIGZvdXIgY2FsbCBzaXRlc1xuICogICAgIHRoZSBQaGFzZSAwYSBhdWRpdCBmb3VuZCBoaWRpbmcgYmVoaW5kIHJlYWQtbG9va2luZyBjb2RlLlxuICogICAtIE5vdGhpbmcgaGVyZSBmZWVkcyBhbiBBVVRIT1JJWkFUSU9OIGRlY2lzaW9uLiBUaGVzZSBhcmUgZGFzaGJvYXJkXG4gKiAgICAgYWdncmVnYXRlczsgYSBzdGFsZSBwZXJtaXNzaW9uIGNoZWNrIGlzIGEgc2VjdXJpdHkgYnVnLCBhIHN0YWxlIGNoYXJ0IGlzXG4gKiAgICAgYSBzdGFsZSBjaGFydC5cbiAqICAgLSBOb2JvZHkgaXMgYWJvdXQgdG8gQUNUIG9uIHRoZSByZXN1bHQuIEEgdXNlciB3aG8ganVzdCBjcmVhdGVkIGEgcGlwZWxpbmVcbiAqICAgICBsb29rcyBmb3IgaXQgaW4gYSBsaXN0LCBub3QgaW4gYSAzMC1kYXkgZmFpbHVyZS1yYXRlIHJvbGx1cC5cbiAqXG4gKiBBbmQgaXQgaXMgdGhlIGJlc3Qgb2ZmbG9hZCBjYW5kaWRhdGUgZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBpcyBzYWZlOiB0aGVzZVxuICogYXJlIHRoZSBoZWF2aWVzdCBxdWVyaWVzIGluIHRoZSBwYWNrYWdlLCBzY2FubmluZyB0aW1lIHJhbmdlcyByYXRoZXIgdGhhblxuICogZmV0Y2hpbmcgcm93cyBieSBpZC5cbiAqXG4gKiBgU0VUIFRSQU5TQUNUSU9OIFJFQUQgT05MWWAgYXBwbGllcyBvbiB0aGUgUFJJTUFSWSBwYXRoIHRvbywgc28gaWYgYSB3cml0ZVxuICogaXMgZXZlciBhZGRlZCBiZWxvdyBpdCBmYWlscyBoZXJlLCBsb3VkbHksIHJhdGhlciB0aGFuIGF0IHdoaWNoZXZlciB0YXJnZXRcbiAqIHRoZSByZWFkIGhhcHBlbmVkIHRvIGxhbmQgb24uXG4gKi9cblxuaW1wb3J0IHsgYW5kLCBlcSwgZ3RlLCBpbkFycmF5LCBsdCwgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgRkFJTFVSRV9DQVRFR09SWV9MQUJFTFMsIGlzVGVhbUFjdGlvbmFibGUgfSBmcm9tICcuL2ZhaWx1cmUtY2xhc3NpZmllci5qcyc7XG5pbXBvcnQgeyBsaXZlRXhwb3N1cmVQcmVkaWNhdGUgfSBmcm9tICcuL3BsdWdpbi1leHBvc3VyZS5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyBhbnlUZXh0IH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvcGctcmVzdWx0LmpzJztcbmltcG9ydCB0eXBlIHsgRmFpbHVyZUNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vZGF0YWJhc2Uvc2NoZW1hL3JlcG9ydGluZy1hbmFseXRpY3MuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4UmVhZCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vKiogVGhlIHdpbmRvdyBhbmQgb3JnIHNjb3BlIGV2ZXJ5IHF1ZXJ5IHRha2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXRpY3NTY29wZSB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWAgZm9yIGEgcm9sbHVwOyB1bmRlZmluZWQgPSB0aGlzIG9yZyBvbmx5LiAqL1xuICBvcmdJZHM/OiBzdHJpbmdbXTtcbiAgZnJvbTogc3RyaW5nO1xuICB0bzogc3RyaW5nO1xufVxuXG4vKiogVGhlIG9yZyBwcmVkaWNhdGU6IG9uZSBvcmcsIG9yIGEgcm9sbHVwIHNldC4gKi9cbmZ1bmN0aW9uIG9yZ1ByZWRpY2F0ZShjb2w6IFBhcmFtZXRlcnM8dHlwZW9mIGluQXJyYXk+WzBdLCBzY29wZTogQW5hbHl0aWNzU2NvcGUpIHtcbiAgcmV0dXJuIHNjb3BlLm9yZ0lkcyAmJiBzY29wZS5vcmdJZHMubGVuZ3RoID4gMFxuICAgID8gaW5BcnJheShjb2wsIHNjb3BlLm9yZ0lkcylcbiAgICA6IGVxKGNvbCBhcyBuZXZlciwgc2NvcGUub3JnSWQgYXMgbmV2ZXIpO1xufVxuXG4vKiogT25lIHBpcGVsaW5lJ3MgbGluZSBpbiB0aGUgYnJlYWtkb3duLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUJyZWFrZG93blJvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwcm9qZWN0OiBzdHJpbmcgfCBudWxsO1xuICBydW5zOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyIHwgbnVsbDtcbiAgcDk1TXM6IG51bWJlciB8IG51bGw7XG4gIGRlcGxveXM6IG51bWJlcjtcbiAgLyoqIFRoZSBtb3N0IHJlY2VudCBmYWlsdXJlJ3MgZGF5IGFuZCBzdGFnZSwgZm9yIFwid2hhdCB0byBsb29rIGF0IGZpcnN0XCIuICovXG4gIGxhc3RGYWlsdXJlQXQ6IHN0cmluZyB8IG51bGw7XG4gIGxhc3RGYWlsdXJlU3RhZ2U6IHN0cmluZyB8IG51bGw7XG4gIGJ1aWxkU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBlci1waXBlbGluZSBkZWxpdmVyeSwgd29yc3QgZmlyc3QuXG4gKlxuICogV09SU1QgRklSU1QsIGFuZCBjYXBwZWQsIGJlY2F1c2UgdGhlIHBvaW50IG9mIHRoZSBzZWN0aW9uIGlzIFwid2hlcmUgc2hvdWxkXG4gKiBhdHRlbnRpb24gZ29cIi4gQSBsaXN0IHNvcnRlZCBieSBuYW1lLCBvciBhbiB1bmJvdW5kZWQgb25lLCBpcyBhIGRhdGEgZHVtcDogdGhlXG4gKiBsZWFkIHN0aWxsIGhhcyB0byBmaW5kIHRoZSBwcm9ibGVtLCB3aGljaCBpcyB0aGUgd29yayB0aGUgcmVwb3J0IHdhcyBzdXBwb3NlZCB0b1xuICogZG8uIFRpZXMgYnJlYWsgb24gdm9sdW1lLCBzbyBhIDUwJS1zdWNjZXNzIHBpcGVsaW5lIHRoYXQgcmFuIHR3aWNlIGRvZXMgbm90XG4gKiBvdXRyYW5rIG9uZSB0aGF0IHJhbiB0d28gaHVuZHJlZCB0aW1lcy5cbiAqXG4gKiBgc3VjY2Vzc1BjdGAgaXMgTlVMTCBmb3IgYSBwaXBlbGluZSB3aXRoIG5vIHJ1bnMgaW4gdGhlIHdpbmRvdyDigJQgbm90IDAuIEFcbiAqIHBpcGVsaW5lIG5vYm9keSByYW4gaXMgbm90IGEgcGlwZWxpbmUgdGhhdCBmYWlsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQaXBlbGluZUJyZWFrZG93bihzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gMTApOiBQcm9taXNlPFBpcGVsaW5lQnJlYWtkb3duUm93W10+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBXSVRIIHRvdGFscyBBUyAoXG4gICAgICBTRUxFQ1RcbiAgICAgICAgci5waXBlbGluZV9pZCxcbiAgICAgICAgU1VNKHIucnVucyk6OmludCBBUyBydW5zLFxuICAgICAgICBTVU0oci5zdWNjZWVkZWQpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICBTVU0oci5mYWlsZWQpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICBNQVgoci5wOTVfbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICBTVU0oci5idWlsZF9zZWNvbmRzKTo6aW50IEFTIGJ1aWxkX3NlY29uZHNcbiAgICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHMgclxuICAgICAgV0hFUkUgci5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9ICR7YW55VGV4dChzY29wZS5vcmdJZHMpfWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCByLmRheSA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgci5kYXkgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgLS0gVGhlIHBpcGVsaW5lLWxldmVsIGdyYWluIG9ubHk6IHN1bW1pbmcgdGhlIHN0YWdlIHJvd3MgdG9vIHdvdWxkIGNvdW50XG4gICAgICAgIC0tIGV2ZXJ5IHJ1biBvbmNlIHBlciBzdGFnZS5cbiAgICAgICAgQU5EIHIuc3RhZ2VfbmFtZSA9ICcnXG4gICAgICBHUk9VUCBCWSByLnBpcGVsaW5lX2lkXG4gICAgKSxcbiAgICBkZXBsb3lzIEFTIChcbiAgICAgIFNFTEVDVCBwaXBlbGluZV9pZCwgQ09VTlQoKik6OmludCBBUyBkZXBsb3lzXG4gICAgICBGUk9NIGRvcmFfZGVwbG95bWVudHNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gJHthbnlUZXh0KHNjb3BlLm9yZ0lkcyl9YCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRlcGxveWVkX2F0ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBkZXBsb3llZF9hdCA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgc3VjY2VlZGVkID0gdHJ1ZVxuICAgICAgR1JPVVAgQlkgcGlwZWxpbmVfaWRcbiAgICApLFxuICAgIGxhc3RfZmFpbCBBUyAoXG4gICAgICAtLSBUaGUgbW9zdCByZWNlbnQgZmFpbGluZyBTVEFHRSByb3cgcGVyIHBpcGVsaW5lOiB3aGF0IHRvIGxvb2sgYXQgZmlyc3QuXG4gICAgICBTRUxFQ1QgRElTVElOQ1QgT04gKHBpcGVsaW5lX2lkKSBwaXBlbGluZV9pZCwgZGF5LCBzdGFnZV9uYW1lXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9ICR7YW55VGV4dChzY29wZS5vcmdJZHMpfWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgc3RhZ2VfbmFtZSA8PiAnJyBBTkQgZmFpbGVkID4gMFxuICAgICAgT1JERVIgQlkgcGlwZWxpbmVfaWQsIGRheSBERVNDLCBmYWlsZWQgREVTQ1xuICAgIClcbiAgICBTRUxFQ1RcbiAgICAgIHQucGlwZWxpbmVfaWQsXG4gICAgICBwLnBpcGVsaW5lX25hbWUsXG4gICAgICBwLnByb2plY3QsXG4gICAgICB0LnJ1bnMsIHQuc3VjY2VlZGVkLCB0LmZhaWxlZCwgdC5wOTVfbXMsIHQuYnVpbGRfc2Vjb25kcyxcbiAgICAgIENPQUxFU0NFKGQuZGVwbG95cywgMCkgQVMgZGVwbG95cyxcbiAgICAgIGYuZGF5IEFTIGxhc3RfZmFpbHVyZV9hdCxcbiAgICAgIGYuc3RhZ2VfbmFtZSBBUyBsYXN0X2ZhaWx1cmVfc3RhZ2UsXG4gICAgICBDQVNFIFdIRU4gdC5ydW5zID4gMCBUSEVOIFJPVU5EKCh0LnN1Y2NlZWRlZDo6bnVtZXJpYyAvIHQucnVucykgKiAxMDAsIDEpIEVMU0UgTlVMTCBFTkQgQVMgc3VjY2Vzc19wY3RcbiAgICBGUk9NIHRvdGFscyB0XG4gICAgTEVGVCBKT0lOIGRlcGxveXMgZCBPTiBkLnBpcGVsaW5lX2lkID0gdC5waXBlbGluZV9pZFxuICAgIExFRlQgSk9JTiBsYXN0X2ZhaWwgZiBPTiBmLnBpcGVsaW5lX2lkID0gdC5waXBlbGluZV9pZFxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gdC5waXBlbGluZV9pZFxuICAgIC0tIFdvcnN0IGZpcnN0OiBsb3dlc3Qgc3VjY2VzcyByYXRlLCB0aGVuIG1vc3QgcnVucywgc28gYSA1MCUgcGlwZWxpbmUgdGhhdCByYW5cbiAgICAtLSB0d2ljZSBkb2VzIG5vdCBvdXRyYW5rIG9uZSB0aGF0IHJhbiB0d28gaHVuZHJlZCB0aW1lcy5cbiAgICBPUkRFUiBCWSBzdWNjZXNzX3BjdCBBU0MgTlVMTFMgTEFTVCwgdC5ydW5zIERFU0NcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBwcm9qZWN0OiAoci5wcm9qZWN0IGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgcnVuczogbnVtKHIucnVucyksXG4gICAgc3VjY2VlZGVkOiBudW0oci5zdWNjZWVkZWQpLFxuICAgIGZhaWxlZDogbnVtKHIuZmFpbGVkKSxcbiAgICBzdWNjZXNzUGN0OiByLnN1Y2Nlc3NfcGN0ID09PSBudWxsID8gbnVsbCA6IE51bWJlcihyLnN1Y2Nlc3NfcGN0KSxcbiAgICBwOTVNczogci5wOTVfbXMgPT09IG51bGwgPyBudWxsIDogbnVtKHIucDk1X21zKSxcbiAgICBkZXBsb3lzOiBudW0oci5kZXBsb3lzKSxcbiAgICBsYXN0RmFpbHVyZUF0OiBpc29Pck51bGwoci5sYXN0X2ZhaWx1cmVfYXQpLFxuICAgIGxhc3RGYWlsdXJlU3RhZ2U6IChyLmxhc3RfZmFpbHVyZV9zdGFnZSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIGJ1aWxkU2Vjb25kczogbnVtKHIuYnVpbGRfc2Vjb25kcyksXG4gIH0pKTtcbn1cblxuLyoqIE9uZSBmYWlsdXJlIGNhdGVnb3J5J3Mgc2hhcmUgb2YgdGhlIHBlcmlvZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZUNhdGVnb3J5Um93IHtcbiAgY2F0ZWdvcnk6IEZhaWx1cmVDYXRlZ29yeTtcbiAgbGFiZWw6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbiAgc2hhcmVQY3Q6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRlYW0gY2FuIGFjdCBvbiBpdCwgb3IgaXQgaGFwcGVuZWQgdG8gdGhlbS4gKi9cbiAgdGVhbUFjdGlvbmFibGU6IGJvb2xlYW47XG4gIC8qKiBDaGFuZ2UgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCwgaW4gZmFpbHVyZXMuICovXG4gIGNoYW5nZTogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBwaXBlbGluZXMgaXQgaGl0IGhhcmRlc3QuICovXG4gIHRvcFBpcGVsaW5lczogQXJyYXk8eyBwaXBlbGluZUlkOiBzdHJpbmc7IHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDsgY291bnQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBGYWlsdXJlcyBieSBjYXRlZ29yeSwgd2l0aCB0aGUgcHJldmlvdXMgcGVyaW9kJ3MgY291bnRzIGZvciB0aGUgdHJlbmQuXG4gKlxuICogU1BMSVRTIEFDVElPTkFCTEUgRlJPTSBOT1QuIEEgd2VlayB3aG9zZSBmYWlsdXJlcyB3ZXJlIGFsbCBjbG91ZCB0aHJvdHRsaW5nIGlzIGFcbiAqIGRpZmZlcmVudCBjb252ZXJzYXRpb24gZnJvbSBvbmUgd2hvc2UgZmFpbHVyZXMgd2VyZSBhbGwgYnJva2VuIHRlc3RzLCBhbmRcbiAqIHByZXNlbnRpbmcgdGhlbSBpbiBvbmUgcmFua2VkIGxpc3QgaW52aXRlcyBleGFjdGx5IHRoZSB3cm9uZyBjb25jbHVzaW9uIOKAlCBhIHRlYW1cbiAqIGJlaW5nIGFza2VkIHRvIGZpeCBhbiBBV1MgY2FwYWNpdHkgcHJvYmxlbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZhaWx1cmVBbmFseXNpcyhcbiAgc2NvcGU6IEFuYWx5dGljc1Njb3BlLFxuICBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPHsgY2F0ZWdvcmllczogRmFpbHVyZUNhdGVnb3J5Um93W107IHRvdGFsOiBudW1iZXI7IGFjdGlvbmFibGVUb3RhbDogbnVtYmVyIH0+IHtcbiAgY29uc3QgY291bnRzID0gYXdhaXQgY2F0ZWdvcnlDb3VudHMoc2NvcGUpO1xuICBjb25zdCBwcmlvciA9IHByZXZpb3VzID8gYXdhaXQgY2F0ZWdvcnlDb3VudHMoeyAuLi5zY29wZSwgLi4ucHJldmlvdXMgfSkgOiBudWxsO1xuICBjb25zdCB0b3RhbCA9IFsuLi5jb3VudHMudmFsdWVzKCldLnJlZHVjZSgocywgdikgPT4gcyArIHYuY291bnQsIDApO1xuICBjb25zdCB0b3BCeUNhdGVnb3J5ID0gYXdhaXQgdG9wUGlwZWxpbmVzQnlDYXRlZ29yeShzY29wZSk7XG5cbiAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5jb3VudHMuZW50cmllcygpXVxuICAgIC5tYXAoKFtjYXRlZ29yeSwgdl0pID0+ICh7XG4gICAgICBjYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBGQUlMVVJFX0NBVEVHT1JZX0xBQkVMU1tjYXRlZ29yeV0gPz8gY2F0ZWdvcnksXG4gICAgICBjb3VudDogdi5jb3VudCxcbiAgICAgIHNoYXJlUGN0OiB0b3RhbCA+IDAgPyBOdW1iZXIoKCh2LmNvdW50IC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpKSA6IDAsXG4gICAgICB0ZWFtQWN0aW9uYWJsZTogaXNUZWFtQWN0aW9uYWJsZShjYXRlZ29yeSksXG4gICAgICBjaGFuZ2U6IHByaW9yID8gdi5jb3VudCAtIChwcmlvci5nZXQoY2F0ZWdvcnkpPy5jb3VudCA/PyAwKSA6IG51bGwsXG4gICAgICB0b3BQaXBlbGluZXM6IHRvcEJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSA/PyBbXSxcbiAgICB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuXG4gIHJldHVybiB7XG4gICAgY2F0ZWdvcmllcyxcbiAgICB0b3RhbCxcbiAgICBhY3Rpb25hYmxlVG90YWw6IGNhdGVnb3JpZXMuZmlsdGVyKChjKSA9PiBjLnRlYW1BY3Rpb25hYmxlKS5yZWR1Y2UoKHMsIGMpID0+IHMgKyBjLmNvdW50LCAwKSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2F0ZWdvcnlDb3VudHMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxNYXA8RmFpbHVyZUNhdGVnb3J5LCB7IGNvdW50OiBudW1iZXIgfT4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBTRUxFQ1Qga2V5IEFTIGNhdGVnb3J5LCBTVU0odmFsdWU6OmludCk6OmludCBBUyBjb3VudFxuICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHMgciwganNvbmJfZWFjaChyLmZhaWx1cmVzX2J5X2NhdGVnb3J5KVxuICAgIFdIRVJFIHIub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSAke2FueVRleHQoc2NvcGUub3JnSWRzKX1gIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgQU5EIHIuZGF5ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCByLmRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgQU5EIHIuc3RhZ2VfbmFtZSA9ICcnXG4gICAgR1JPVVAgQlkga2V5XG4gIGApKTtcbiAgY29uc3Qgb3V0ID0gbmV3IE1hcDxGYWlsdXJlQ2F0ZWdvcnksIHsgY291bnQ6IG51bWJlciB9PigpO1xuICBmb3IgKGNvbnN0IHIgb2Ygcm93c09mKHJvd3MpKSBvdXQuc2V0KHIuY2F0ZWdvcnkgYXMgRmFpbHVyZUNhdGVnb3J5LCB7IGNvdW50OiBudW0oci5jb3VudCkgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRvcFBpcGVsaW5lc0J5Q2F0ZWdvcnkoXG4gIHNjb3BlOiBBbmFseXRpY3NTY29wZSxcbiAgcGVyQ2F0ZWdvcnkgPSAzLFxuKTogUHJvbWlzZTxNYXA8RmFpbHVyZUNhdGVnb3J5LCBBcnJheTx7IHBpcGVsaW5lSWQ6IHN0cmluZzsgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsOyBjb3VudDogbnVtYmVyIH0+Pj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVCBjYXRlZ29yeSwgcGlwZWxpbmVfaWQsIHBpcGVsaW5lX25hbWUsIGNvdW50IEZST00gKFxuICAgICAgU0VMRUNUXG4gICAgICAgIGUua2V5IEFTIGNhdGVnb3J5LFxuICAgICAgICByLnBpcGVsaW5lX2lkLFxuICAgICAgICBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgIFNVTShlLnZhbHVlOjppbnQpOjppbnQgQVMgY291bnQsXG4gICAgICAgIFJPV19OVU1CRVIoKSBPVkVSIChQQVJUSVRJT04gQlkgZS5rZXkgT1JERVIgQlkgU1VNKGUudmFsdWU6OmludCkgREVTQykgQVMgcm5cbiAgICAgIC0tIENST1NTIEpPSU4gTEFURVJBTCwgbm90IGEgY29tbWEgam9pbi4gV2l0aCBGUk9NIGEsIGYoYS54KSBlIExFRlQgSk9JTiBiLFxuICAgICAgLS0gdGhlIExFRlQgSk9JTiBiaW5kcyB0byBlIGFsb25lIGFuZCByIGZhbGxzIG91dCBvZiBzY29wZSBpbiBpdHMgT04gY2xhdXNlXG4gICAgICAtLSAoXCJpbnZhbGlkIHJlZmVyZW5jZSB0byBGUk9NLWNsYXVzZSBlbnRyeVwiKS4gVGhlIGV4cGxpY2l0IGxhdGVyYWwga2VlcHMgYWxsXG4gICAgICAtLSB0aHJlZSBpbiBvbmUgam9pbiB0cmVlLlxuICAgICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwcyByXG4gICAgICBDUk9TUyBKT0lOIExBVEVSQUwganNvbmJfZWFjaChyLmZhaWx1cmVzX2J5X2NhdGVnb3J5KSBlXG4gICAgICBMRUZUIEpPSU4gcGlwZWxpbmVzIHAgT04gcC5pZDo6dGV4dCA9IHIucGlwZWxpbmVfaWRcbiAgICAgIFdIRVJFIHIub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSAke2FueVRleHQoc2NvcGUub3JnSWRzKX1gIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgci5kYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIHIuZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEFORCByLnN0YWdlX25hbWUgPSAnJ1xuICAgICAgR1JPVVAgQlkgZS5rZXksIHIucGlwZWxpbmVfaWQsIHAucGlwZWxpbmVfbmFtZVxuICAgICkgcmFua2VkXG4gICAgV0hFUkUgcm4gPD0gJHtwZXJDYXRlZ29yeX1cbiAgYCkpO1xuICBjb25zdCBvdXQgPSBuZXcgTWFwPEZhaWx1cmVDYXRlZ29yeSwgQXJyYXk8eyBwaXBlbGluZUlkOiBzdHJpbmc7IHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDsgY291bnQ6IG51bWJlciB9Pj4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJvd3NPZihyb3dzKSkge1xuICAgIGNvbnN0IGtleSA9IHIuY2F0ZWdvcnkgYXMgRmFpbHVyZUNhdGVnb3J5O1xuICAgIGNvbnN0IGxpc3QgPSBvdXQuZ2V0KGtleSkgPz8gW107XG4gICAgbGlzdC5wdXNoKHtcbiAgICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICAgIHBpcGVsaW5lTmFtZTogKHIucGlwZWxpbmVfbmFtZSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgICAgY291bnQ6IG51bShyLmNvdW50KSxcbiAgICB9KTtcbiAgICBvdXQuc2V0KGtleSwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIE9uZSBzdGFnZSdzIHRpbWluZywgZm9yIHRoZSBkcmlsbC1kb3duLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZVBlcmZvcm1hbmNlUm93IHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHJ1bnM6IG51bWJlcjtcbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5NU1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogQ2hhbmdlIGluIHA5NSB2cyB0aGUgcHJldmlvdXMgcGVyaW9kLCBhcyBhIHBlcmNlbnRhZ2UuICovXG4gIHA5NUNoYW5nZVBjdDogbnVtYmVyIHwgbnVsbDtcbiAgZmFpbGVkOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGVyLXN0YWdlIHRpbWluZ3MgZm9yIG9uZSBwaXBlbGluZSwgc2xvd2VzdCBmaXJzdC5cbiAqXG4gKiBUaGUgc2VjdGlvbiBhIGxlYWQgb3BlbnMgYWZ0ZXIgdGhlIGJyZWFrZG93biBzYXlzIGEgcGlwZWxpbmUgZ290IHNsb3dlcjogXCJ3aGljaFxuICogc3RhZ2VcIiBpcyB0aGUgbmV4dCBxdWVzdGlvbiwgYW5kIGFuc3dlcmluZyBpdCBmcm9tIHJhdyBldmVudHMgd291bGQgbWVhbiBhXG4gKiBzZWNvbmQgc2NhbiBvZiB0aGUgc2FtZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTdGFnZVBlcmZvcm1hbmNlKFxuICBzY29wZTogQW5hbHl0aWNzU2NvcGUsXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9LFxuKTogUHJvbWlzZTxTdGFnZVBlcmZvcm1hbmNlUm93W10+IHtcbiAgY29uc3QgY3VycmVudCA9IGF3YWl0IHN0YWdlUm93cyhzY29wZSwgcGlwZWxpbmVJZCk7XG4gIGNvbnN0IHByaW9yOiBNYXA8c3RyaW5nLCB7IHA5NU1zOiBudW1iZXIgfCBudWxsIH0+ID0gcHJldmlvdXNcbiAgICA/IG5ldyBNYXAoKGF3YWl0IHN0YWdlUm93cyh7IC4uLnNjb3BlLCAuLi5wcmV2aW91cyB9LCBwaXBlbGluZUlkKSkubWFwKChzKSA9PiBbcy5zdGFnZU5hbWUsIHNdKSlcbiAgICA6IG5ldyBNYXAoKTtcbiAgcmV0dXJuIGN1cnJlbnQubWFwKChzKSA9PiB7XG4gICAgY29uc3QgYmVmb3JlID0gcHJpb3IuZ2V0KHMuc3RhZ2VOYW1lKT8ucDk1TXMgPz8gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucyxcbiAgICAgIHA5NUNoYW5nZVBjdDogYmVmb3JlICYmIGJlZm9yZSA+IDAgJiYgcy5wOTVNcyAhPT0gbnVsbFxuICAgICAgICA/IE51bWJlcigoKChzLnA5NU1zIC0gYmVmb3JlKSAvIGJlZm9yZSkgKiAxMDApLnRvRml4ZWQoMSkpXG4gICAgICAgIDogbnVsbCxcbiAgICB9O1xuICB9KS5zb3J0KChhLCBiKSA9PiAoYi5wOTVNcyA/PyAwKSAtIChhLnA5NU1zID8/IDApKTtcbn1cblxuaW50ZXJmYWNlIFN0YWdlUm93IHsgc3RhZ2VOYW1lOiBzdHJpbmc7IHJ1bnM6IG51bWJlcjsgcDUwTXM6IG51bWJlciB8IG51bGw7IHA5NU1zOiBudW1iZXIgfCBudWxsOyBmYWlsZWQ6IG51bWJlciB9XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlUm93cyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIHBpcGVsaW5lSWQ6IHN0cmluZyk6IFByb21pc2U8U3RhZ2VSb3dbXT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LnNlbGVjdCh7XG4gICAgc3RhZ2VOYW1lOiBzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAuc3RhZ2VOYW1lLFxuICAgIHJ1bnM6IHNxbDxudW1iZXI+YFNVTSgke3NjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5ydW5zfSk6OmludGAsXG4gICAgZmFpbGVkOiBzcWw8bnVtYmVyPmBTVU0oJHtzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAuZmFpbGVkfSk6OmludGAsXG4gICAgLy8gTUFYIG9mIHRoZSBkYWlseSBwOTVzLCBub3QgYW4gYXZlcmFnZSBvZiBwZXJjZW50aWxlczogYXZlcmFnaW5nXG4gICAgLy8gcGVyY2VudGlsZXMgaXMgbm90IGEgcGVyY2VudGlsZSBvZiBhbnl0aGluZywgYW5kIHRoZSB3b3JzdCBkYXkgaXMgdGhlXG4gICAgLy8gbnVtYmVyIHNvbWVib2R5IHdvdWxkIGFjdCBvbi5cbiAgICBwNTBNczogc3FsPG51bWJlciB8IG51bGw+YE1BWCgke3NjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5wNTBNc30pOjppbnRgLFxuICAgIHA5NU1zOiBzcWw8bnVtYmVyIHwgbnVsbD5gTUFYKCR7c2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLnA5NU1zfSk6OmludGAsXG4gIH0pLmZyb20oc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBvcmdQcmVkaWNhdGUoc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLm9yZ0lkLCBzY29wZSksXG4gICAgICBlcShzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAucGlwZWxpbmVJZCwgcGlwZWxpbmVJZCksXG4gICAgICBndGUoc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLmRheSwgbmV3IERhdGUoc2NvcGUuZnJvbSkpLFxuICAgICAgbHQoc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLmRheSwgbmV3IERhdGUoc2NvcGUudG8pKSxcbiAgICAgIHNxbGAke3NjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5zdGFnZU5hbWV9IDw+ICcnYCxcbiAgICApKVxuICAgIC5ncm91cEJ5KHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5zdGFnZU5hbWUpKTtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFN0YWdlUm93PigpO1xuICBmb3IgKGNvbnN0IHIgb2Ygcm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pIHtcbiAgICBtYXAuc2V0KFN0cmluZyhyLnN0YWdlTmFtZSksIHtcbiAgICAgIHN0YWdlTmFtZTogU3RyaW5nKHIuc3RhZ2VOYW1lKSxcbiAgICAgIHJ1bnM6IG51bShyLnJ1bnMpLFxuICAgICAgZmFpbGVkOiBudW0oci5mYWlsZWQpLFxuICAgICAgcDUwTXM6IHIucDUwTXMgPT09IG51bGwgPyBudWxsIDogbnVtKHIucDUwTXMpLFxuICAgICAgcDk1TXM6IHIucDk1TXMgPT09IG51bGwgPyBudWxsIDogbnVtKHIucDk1TXMpLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4ubWFwLnZhbHVlcygpXTtcbn1cblxuLyoqIEJ1aWxkIHRpbWUgYnkgcHJvamVjdCBhbmQgcGlwZWxpbmUuIE5vIG1vbmV5IGFueXdoZXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVJvdyB7XG4gIHByb2plY3Q6IHN0cmluZyB8IG51bGw7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBidWlsZFNlY29uZHM6IG51bWJlcjtcbiAgcnVuczogbnVtYmVyO1xuICBzaGFyZVBjdDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoZXJlIHRoZSBidWlsZCB0aW1lIHdlbnQuXG4gKlxuICogU0VDT05EUywgTk9UIERPTExBUlMuIEEgY29zdCBmaWd1cmUgbmVlZHMgdGhlIGluc3RhbmNlIHR5cGVzLCB0aGUgc3BvdC9vbi1kZW1hbmRcbiAqIG1peCBhbmQgdGhlIGFjY291bnQncyBvd24gZGlzY291bnRzLCBub25lIG9mIHdoaWNoIHRoaXMgcGxhdGZvcm0ga25vd3Mg4oCUIHNvIGFcbiAqIGRvbGxhciBudW1iZXIgaGVyZSB3b3VsZCBiZSBhIGd1ZXNzIHByZXNlbnRlZCBhcyBhbiBpbnZvaWNlLiBCdWlsZCB0aW1lIGlzIHRoZVxuICogdGhpbmcgYWN0dWFsbHkgbWVhc3VyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQgPSAyMCk6IFByb21pc2U8e1xuICBwaXBlbGluZXM6IFJlc291cmNlUm93W107XG4gIHRvdGFsQnVpbGRTZWNvbmRzOiBudW1iZXI7XG59PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUXG4gICAgICBwLnByb2plY3QsXG4gICAgICByLnBpcGVsaW5lX2lkLFxuICAgICAgcC5waXBlbGluZV9uYW1lLFxuICAgICAgU1VNKHIuYnVpbGRfc2Vjb25kcyk6OmludCBBUyBidWlsZF9zZWNvbmRzLFxuICAgICAgU1VNKHIucnVucyk6OmludCBBUyBydW5zXG4gICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwcyByXG4gICAgTEVGVCBKT0lOIHBpcGVsaW5lcyBwIE9OIHAuaWQ6OnRleHQgPSByLnBpcGVsaW5lX2lkXG4gICAgV0hFUkUgci5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9ICR7YW55VGV4dChzY29wZS5vcmdJZHMpfWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgci5kYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIHIuZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICBBTkQgci5zdGFnZV9uYW1lID0gJydcbiAgICBHUk9VUCBCWSBwLnByb2plY3QsIHIucGlwZWxpbmVfaWQsIHAucGlwZWxpbmVfbmFtZVxuICAgIE9SREVSIEJZIGJ1aWxkX3NlY29uZHMgREVTQ1xuICAgIExJTUlUICR7bGltaXR9XG4gIGApKTtcbiAgY29uc3QgbGlzdCA9IHJvd3NPZihyb3dzKTtcbiAgY29uc3QgdG90YWwgPSBsaXN0LnJlZHVjZSgocywgcikgPT4gcyArIG51bShyLmJ1aWxkX3NlY29uZHMpLCAwKTtcbiAgcmV0dXJuIHtcbiAgICB0b3RhbEJ1aWxkU2Vjb25kczogdG90YWwsXG4gICAgcGlwZWxpbmVzOiBsaXN0Lm1hcCgocikgPT4gKHtcbiAgICAgIHByb2plY3Q6IChyLnByb2plY3QgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICAgIHBpcGVsaW5lTmFtZTogKHIucGlwZWxpbmVfbmFtZSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgICAgYnVpbGRTZWNvbmRzOiBudW0oci5idWlsZF9zZWNvbmRzKSxcbiAgICAgIHJ1bnM6IG51bShyLnJ1bnMpLFxuICAgICAgc2hhcmVQY3Q6IHRvdGFsID4gMCA/IE51bWJlcigoKG51bShyLmJ1aWxkX3NlY29uZHMpIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpKSA6IDAsXG4gICAgfSkpLFxuICB9O1xufVxuXG4vKiogT25lIGNvbW1pdCdzIGpvdXJuZXkgYWNyb3NzIGVudmlyb25tZW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbW90aW9uUm93IHtcbiAgY29tbWl0U2hhOiBzdHJpbmc7XG4gIC8qKiBFbnZpcm9ubWVudCDihpIgd2hlbiBpdCBsYW5kZWQgdGhlcmUsIGluIHRoZSBvcmRlciBpdCByZWFjaGVkIHRoZW0uICovXG4gIHN0b3BzOiBBcnJheTx7IGVudmlyb25tZW50OiBzdHJpbmc7IGRlcGxveWVkQXQ6IHN0cmluZzsgaG91cnNGcm9tUHJldmlvdXM6IG51bWJlciB8IG51bGwgfT47XG4gIC8qKiBUcnVlIHdoZW4gdGhlIGNvbW1pdCByZWFjaGVkIGEgbm9uLXByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYW5kIHN0b3BwZWQuICovXG4gIHN0dWNrOiBib29sZWFuO1xuICBmdXJ0aGVzdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXJlIGNvbW1pdHMgZ290IHRvLCBhbmQgd2hlcmUgdGhleSBzdG9wcGVkLlxuICpcbiAqIFwiU3R1Y2tcIiBpcyB0aGUgbnVtYmVyIHdvcnRoIHJlYWRpbmcuIEEgY29tbWl0IHRoYXQgcmVhY2hlZCBzdGFnaW5nIGZvdXIgZGF5cyBhZ29cbiAqIGFuZCBuZXZlciB3ZW50IGZ1cnRoZXIgaXMgd29yayB0aGF0IGlzIGZpbmlzaGVkIGFuZCBub3QgZGVsaXZlcmVkIOKAlCB3aGljaCBkb2VzXG4gKiBub3QgYXBwZWFyIGluIGRlcGxveW1lbnQgZnJlcXVlbmN5LCBzdWNjZXNzIHJhdGUgb3IgbGVhZCB0aW1lLCBiZWNhdXNlIGJ5IGV2ZXJ5XG4gKiBvbmUgb2YgdGhvc2UgbWVhc3VyZXMgbm90aGluZyBoYXBwZW5lZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb21vdGlvblZpZXcoXG4gIHNjb3BlOiBBbmFseXRpY3NTY29wZSxcbiAgcHJvZHVjdGlvbkVudiA9ICdwcm9kdWN0aW9uJyxcbiAgbGltaXQgPSAyNSxcbik6IFByb21pc2U8eyBjb21taXRzOiBQcm9tb3Rpb25Sb3dbXTsgc3R1Y2tDb3VudDogbnVtYmVyIH0+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBTRUxFQ1QgY29tbWl0X3NoYSwgZW52aXJvbm1lbnQsIE1JTihkZXBsb3llZF9hdCkgQVMgZGVwbG95ZWRfYXRcbiAgICBGUk9NIGRvcmFfZGVwbG95bWVudHNcbiAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9ICR7YW55VGV4dChzY29wZS5vcmdJZHMpfWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgZGVwbG95ZWRfYXQgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRlcGxveWVkX2F0IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICBBTkQgc3VjY2VlZGVkID0gdHJ1ZVxuICAgICAgQU5EIGNvbW1pdF9zaGEgSVMgTk9UIE5VTExcbiAgICBHUk9VUCBCWSBjb21taXRfc2hhLCBlbnZpcm9ubWVudFxuICAgIE9SREVSIEJZIE1JTihkZXBsb3llZF9hdCkgREVTQ1xuICBgKSk7XG5cbiAgY29uc3QgYnlDb21taXQgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8eyBlbnZpcm9ubWVudDogc3RyaW5nOyBkZXBsb3llZEF0OiBEYXRlIH0+PigpO1xuICBmb3IgKGNvbnN0IHIgb2Ygcm93c09mKHJvd3MpKSB7XG4gICAgY29uc3Qgc2hhID0gU3RyaW5nKHIuY29tbWl0X3NoYSk7XG4gICAgY29uc3QgbGlzdCA9IGJ5Q29tbWl0LmdldChzaGEpID8/IFtdO1xuICAgIGxpc3QucHVzaCh7IGVudmlyb25tZW50OiBTdHJpbmcoci5lbnZpcm9ubWVudCksIGRlcGxveWVkQXQ6IG5ldyBEYXRlKFN0cmluZyhyLmRlcGxveWVkX2F0KSkgfSk7XG4gICAgYnlDb21taXQuc2V0KHNoYSwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBjb21taXRzOiBQcm9tb3Rpb25Sb3dbXSA9IFsuLi5ieUNvbW1pdC5lbnRyaWVzKCldLm1hcCgoW2NvbW1pdFNoYSwgcmF3XSkgPT4ge1xuICAgIGNvbnN0IG9yZGVyZWQgPSBbLi4ucmF3XS5zb3J0KChhLCBiKSA9PiBhLmRlcGxveWVkQXQuZ2V0VGltZSgpIC0gYi5kZXBsb3llZEF0LmdldFRpbWUoKSk7XG4gICAgY29uc3Qgc3RvcHMgPSBvcmRlcmVkLm1hcCgoc3RvcCwgaSkgPT4gKHtcbiAgICAgIGVudmlyb25tZW50OiBzdG9wLmVudmlyb25tZW50LFxuICAgICAgZGVwbG95ZWRBdDogc3RvcC5kZXBsb3llZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBob3Vyc0Zyb21QcmV2aW91czogaSA9PT0gMFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiBOdW1iZXIoKChzdG9wLmRlcGxveWVkQXQuZ2V0VGltZSgpIC0gKG9yZGVyZWRbaSAtIDFdIGFzIHsgZGVwbG95ZWRBdDogRGF0ZSB9KS5kZXBsb3llZEF0LmdldFRpbWUoKSkgLyAzNjAwXzAwMCkudG9GaXhlZCgxKSksXG4gICAgfSkpO1xuICAgIGNvbnN0IGZ1cnRoZXN0ID0gb3JkZXJlZFtvcmRlcmVkLmxlbmd0aCAtIDFdPy5lbnZpcm9ubWVudCA/PyAnJztcbiAgICByZXR1cm4geyBjb21taXRTaGEsIHN0b3BzLCBmdXJ0aGVzdCwgc3R1Y2s6IGZ1cnRoZXN0ICE9PSBwcm9kdWN0aW9uRW52IH07XG4gIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFMYXN0ID0gYS5zdG9wc1thLnN0b3BzLmxlbmd0aCAtIDFdPy5kZXBsb3llZEF0ID8/ICcnO1xuICAgICAgY29uc3QgYkxhc3QgPSBiLnN0b3BzW2Iuc3RvcHMubGVuZ3RoIC0gMV0/LmRlcGxveWVkQXQgPz8gJyc7XG4gICAgICByZXR1cm4gYkxhc3QubG9jYWxlQ29tcGFyZShhTGFzdCk7XG4gICAgfSlcbiAgICAuc2xpY2UoMCwgbGltaXQpO1xuXG4gIHJldHVybiB7IGNvbW1pdHMsIHN0dWNrQ291bnQ6IGNvbW1pdHMuZmlsdGVyKChjKSA9PiBjLnN0dWNrKS5sZW5ndGggfTtcbn1cblxuLyoqIE91dGRhdGVkIHBsdWdpbiB1c2FnZSwgcGVyIHBpcGVsaW5lIGFuZCBzdGVwLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdXRkYXRlZFBsdWdpblJvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgcGx1Z2luOiBzdHJpbmc7XG4gIGluVXNlOiBzdHJpbmcgfCBudWxsO1xuICBsYXRlc3Q6IHN0cmluZyB8IG51bGw7XG4gIGdhcDogc3RyaW5nIHwgbnVsbDtcbiAgd2l0aGluUG9saWN5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoaWNoIHBpcGVsaW5lcyBhcmUgYmVoaW5kIG9uIGEgcGx1Z2luLCB3b3JzdCBnYXAgZmlyc3QuXG4gKlxuICogUmVhZHMgdGhlIERFQ0xBUkVEIHNpZGUgKGBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbmApLiBBIHBpcGVsaW5lJ3MgZGVjbGFyZWRcbiAqIHJhbmdlIGFuZCB3aGF0IGl0IGxhc3QgYWN0dWFsbHkgcmFuIGNhbiBkaXNhZ3JlZSDigJQgd2hpY2ggaXMgd2h5IHRoZSB2dWxuZXJhYmlsaXR5XG4gKiBzZWN0aW9uIGJlbG93IHJlYWRzIHRoZSBkZXBsb3llZCBzaWRlIGFuZCBzYXlzIHdoaWNoIGl0IGlzIHNob3dpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPdXRkYXRlZFBsdWdpbnMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKTogUHJvbWlzZTx7XG4gIHJvd3M6IE91dGRhdGVkUGx1Z2luUm93W107XG4gIGJlaGluZFBpcGVsaW5lczogbnVtYmVyO1xuICBtYWpvckJlaGluZDogbnVtYmVyO1xufT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVFxuICAgICAgci5waXBlbGluZV9pZCwgcC5waXBlbGluZV9uYW1lLCByLnN0YWdlX25hbWUsIHIuc3RlcF9uYW1lLFxuICAgICAgQ09BTEVTQ0Uoci5wbHVnaW5fcHVibGlzaGVyIHx8ICcvJywgJycpIHx8IHIucGx1Z2luX25hbWUgQVMgcGx1Z2luLFxuICAgICAgci5yZXNvbHZlZF92ZXJzaW9uLCByLmxhdGVzdF92ZXJzaW9uLCByLnZlcnNpb25fZ2FwLCByLndpdGhpbl9wb2xpY3lcbiAgICBGUk9NIHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uIHJcbiAgICBMRUZUIEpPSU4gcGlwZWxpbmVzIHAgT04gcC5pZDo6dGV4dCA9IHIucGlwZWxpbmVfaWRcbiAgICBXSEVSRSByLm9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gJHthbnlUZXh0KHNjb3BlLm9yZ0lkcyl9YCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCAoci52ZXJzaW9uX2dhcCBJTiAoJ21ham9yJywgJ21pbm9yJywgJ3BhdGNoJykgT1Igci53aXRoaW5fcG9saWN5ID0gZmFsc2UpXG4gICAgT1JERVIgQlkgQ0FTRSByLnZlcnNpb25fZ2FwIFdIRU4gJ21ham9yJyBUSEVOIDAgV0hFTiAnbWlub3InIFRIRU4gMSBXSEVOICdwYXRjaCcgVEhFTiAyIEVMU0UgMyBFTkQsXG4gICAgICAgICAgICAgci5waXBlbGluZV9pZFxuICAgIExJTUlUICR7bGltaXR9XG4gIGApKTtcbiAgY29uc3QgbGlzdCA9IHJvd3NPZihyb3dzKS5tYXAoKHIpID0+ICh7XG4gICAgcGlwZWxpbmVJZDogU3RyaW5nKHIucGlwZWxpbmVfaWQpLFxuICAgIHBpcGVsaW5lTmFtZTogKHIucGlwZWxpbmVfbmFtZSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIHN0YWdlTmFtZTogU3RyaW5nKHIuc3RhZ2VfbmFtZSksXG4gICAgc3RlcE5hbWU6IFN0cmluZyhyLnN0ZXBfbmFtZSksXG4gICAgcGx1Z2luOiBTdHJpbmcoci5wbHVnaW4pLFxuICAgIGluVXNlOiAoci5yZXNvbHZlZF92ZXJzaW9uIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgbGF0ZXN0OiAoci5sYXRlc3RfdmVyc2lvbiBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIGdhcDogKHIudmVyc2lvbl9nYXAgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICB3aXRoaW5Qb2xpY3k6IHIud2l0aGluX3BvbGljeSAhPT0gZmFsc2UsXG4gIH0pKTtcbiAgcmV0dXJuIHtcbiAgICByb3dzOiBsaXN0LFxuICAgIGJlaGluZFBpcGVsaW5lczogbmV3IFNldChsaXN0Lm1hcCgocikgPT4gci5waXBlbGluZUlkKSkuc2l6ZSxcbiAgICBtYWpvckJlaGluZDogbGlzdC5maWx0ZXIoKHIpID0+IHIuZ2FwID09PSAnbWFqb3InKS5sZW5ndGgsXG4gIH07XG59XG5cbi8qKiBBIHBpcGVsaW5lJ3MgZXhwb3N1cmUgdG8gYSB2dWxuZXJhYmxlIHBsdWdpbiB2ZXJzaW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuZXJhYmlsaXR5Um93IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBgZGVwbG95ZWRgID0gd2hhdCBhY3R1YWxseSByYW47IGBkZWNsYXJlZGAgPSB3aGF0IHRoZSBjb25maWcgYXNrcyBmb3IuICovXG4gIHNvdXJjZTogc3RyaW5nO1xuICBjcml0aWNhbDogbnVtYmVyO1xuICBoaWdoOiBudW1iZXI7XG4gIGZpbmRpbmdzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIGZsYWdnZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBsdWdpbiB2dWxuZXJhYmlsaXRpZXMsIHBlciBwaXBlbGluZSwgQ3JpdGljYWxzIGZpcnN0LlxuICpcbiAqIFNBWVMgV0hFVEhFUiBJVCBJUyBERUNMQVJFRCBPUiBERVBMT1lFRC4gQSBwaXBlbGluZSB3aG9zZSBjb25maWcgd2FzIHVwZGF0ZWQgdG8gYVxuICogZml4ZWQgdmVyc2lvbiBidXQgd2hpY2ggaGFzIG5vdCByZS1zeW50aGVkIGlzIHN0aWxsIHJ1bm5pbmcgdGhlIHZ1bG5lcmFibGUgaW1hZ2UsXG4gKiBhbmQgYSByZXBvcnQgdGhhdCBjb2xsYXBzZWQgdGhlIHR3byB3b3VsZCB0ZWxsIGEgbWFuYWdlciB0aGUgcHJvYmxlbSBpcyBzb2x2ZWRcbiAqIHdoaWxlIHRoZSBvbGQgaW1hZ2Uga2VlcHMgcnVubmluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gNTApOiBQcm9taXNlPHtcbiAgcm93czogVnVsbmVyYWJpbGl0eVJvd1tdO1xuICBleHBvc2VkUGlwZWxpbmVzOiBudW1iZXI7XG4gIGNyaXRpY2FsUGlwZWxpbmVzOiBudW1iZXI7XG59PiB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUXG4gICAgICB2LnBpcGVsaW5lX2lkLCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICBDT0FMRVNDRSh2LnBsdWdpbl9wdWJsaXNoZXIgfHwgJy8nLCAnJykgfHwgdi5wbHVnaW5fbmFtZSBBUyBwbHVnaW4sXG4gICAgICB2LnBsdWdpbl92ZXJzaW9uLCB2LnNvdXJjZSwgdi5jcml0aWNhbF9jb3VudCwgdi5oaWdoX2NvdW50LCB2LnRvcF9maW5kaW5ncywgdi5mbGFnZ2VkX2F0XG4gICAgRlJPTSBwbHVnaW5fdnVsbl9leHBvc3VyZSB2XG4gICAgTEVGVCBKT0lOIHBpcGVsaW5lcyBwIE9OIHAuaWQ6OnRleHQgPSB2LnBpcGVsaW5lX2lkXG4gICAgV0hFUkUgdi5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9ICR7YW55VGV4dChzY29wZS5vcmdJZHMpfWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgJHtsaXZlRXhwb3N1cmVQcmVkaWNhdGUobm93LCAndicpfVxuICAgIE9SREVSIEJZIHYuY3JpdGljYWxfY291bnQgREVTQywgdi5oaWdoX2NvdW50IERFU0NcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIGNvbnN0IGxpc3QgPSByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBwbHVnaW46IFN0cmluZyhyLnBsdWdpbiksXG4gICAgdmVyc2lvbjogU3RyaW5nKHIucGx1Z2luX3ZlcnNpb24pLFxuICAgIHNvdXJjZTogU3RyaW5nKHIuc291cmNlKSxcbiAgICBjcml0aWNhbDogbnVtKHIuY3JpdGljYWxfY291bnQpLFxuICAgIGhpZ2g6IG51bShyLmhpZ2hfY291bnQpLFxuICAgIGZpbmRpbmdzOiAoci50b3BfZmluZGluZ3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA/PyBbXSxcbiAgICBmbGFnZ2VkQXQ6IGlzb09yTnVsbChyLmZsYWdnZWRfYXQpID8/IG5ldyBEYXRlKDApLnRvSVNPU3RyaW5nKCksXG4gIH0pKTtcbiAgcmV0dXJuIHtcbiAgICByb3dzOiBsaXN0LFxuICAgIGV4cG9zZWRQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gICAgY3JpdGljYWxQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5maWx0ZXIoKHIpID0+IHIuY3JpdGljYWwgPiAwKS5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gIH07XG59XG5cbi8qKiBBZG9wdGlvbiBhbmQgZGVwbG95LXRyYWNraW5nIGNvdmVyYWdlIHdpdGhpbiB0aGUgcmVwb3J0ZWQgc2NvcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkb3B0aW9uU3VtbWFyeSB7XG4gIGFjdGl2ZVBpcGVsaW5lczogbnVtYmVyO1xuICB0b3RhbFBpcGVsaW5lczogbnVtYmVyO1xuICAvKiogUGlwZWxpbmVzIHRoYXQgcHJvZHVjZWQgYSBkZXBsb3kgcm93IOKAlCBpLmUuIG9uZXMgRE9SQSBjYW4gc2VlLiAqL1xuICBkZXBsb3lUcmFja2VkUGlwZWxpbmVzOiBudW1iZXI7XG4gIC8qKiBCeSBgY3JlYXRpb25fc291cmNlYCwgZm9yIFwiYXJlIHRoZSBnb2xkZW4gcGF0aHMgYmVpbmcgdXNlZFwiLiAqL1xuICBieVNvdXJjZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgLyoqIFRlYW1zIGluIHRoZSByb2xsdXAgdGhhdCBoYWQgYWN0aXZpdHkuIDEgZm9yIGEgc2luZ2xlLW9yZyByZXBvcnQuICovXG4gIGFjdGl2ZVRlYW1zOiBudW1iZXI7XG4gIC8qKiBPbmx5IHdoZW4gdGhlIG9yZyBjb25maWd1cmVkIHRoZSBhc3N1bXB0aW9uLiBOZXZlciBwbGF0Zm9ybS1zdXBwbGllZC4gKi9cbiAgZXN0aW1hdGVkTWludXRlc1NhdmVkOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIEFkb3B0aW9uLCBjb3ZlcmFnZSBhbmQgY3JlYXRpb24gc291cmNlLlxuICpcbiAqIGBkZXBsb3lUcmFja2VkUGlwZWxpbmVzYCBpcyB0aGUgaG9uZXN0IGRlbm9taW5hdG9yIGZvciBldmVyeXRoaW5nIERPUkEgc2F5czogYVxuICogcGlwZWxpbmUgdGhhdCBoYXMgbm90IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncyBwcm9kdWNlcyBubyBkZXBsb3kgcm93cywgc28gaXRcbiAqIGlzIGludmlzaWJsZSB0byBkZXBsb3ltZW50IGZyZXF1ZW5jeSDigJQgYW5kIHJlcG9ydGluZyBcIjQgZGVwbG95c1wiIHdpdGhvdXQgc2F5aW5nXG4gKiB0aGF0IDIwIG9mIDMwIHBpcGVsaW5lcyBjYW5ub3QgYmUgc2VlbiBpcyB0aGUgc2luZ2xlIG1vc3QgbWlzbGVhZGluZyB0aGluZyB0aGlzXG4gKiBmZWF0dXJlIGNvdWxkIGRvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWRvcHRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCB0aW1lU2F2ZWRNaW51dGVzPzogbnVtYmVyIHwgbnVsbCk6IFByb21pc2U8QWRvcHRpb25TdW1tYXJ5PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgV0lUSCBzY29wZWQgQVMgKFxuICAgICAgU0VMRUNUIGlkOjp0ZXh0IEFTIGlkLCBvcmdfaWQsIGNyZWF0aW9uX3NvdXJjZVxuICAgICAgRlJPTSBwaXBlbGluZXNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gJHthbnlUZXh0KHNjb3BlLm9yZ0lkcyl9YCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRlbGV0ZWRfYXQgSVMgTlVMTFxuICAgICksXG4gICAgYWN0aXZlIEFTIChcbiAgICAgIFNFTEVDVCBESVNUSU5DVCBwaXBlbGluZV9pZCwgb3JnX2lkXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9ICR7YW55VGV4dChzY29wZS5vcmdJZHMpfWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgc3RhZ2VfbmFtZSA9ICcnIEFORCBydW5zID4gMFxuICAgICksXG4gICAgdHJhY2tlZCBBUyAoXG4gICAgICBTRUxFQ1QgRElTVElOQ1QgcGlwZWxpbmVfaWRcbiAgICAgIEZST00gZG9yYV9kZXBsb3ltZW50c1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSAke2FueVRleHQoc2NvcGUub3JnSWRzKX1gIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgZGVwbG95ZWRfYXQgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRlcGxveWVkX2F0IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgKVxuICAgIFNFTEVDVFxuICAgICAgKFNFTEVDVCBDT1VOVCgqKSBGUk9NIHNjb3BlZCk6OmludCBBUyB0b3RhbF9waXBlbGluZXMsXG4gICAgICAoU0VMRUNUIENPVU5UKCopIEZST00gYWN0aXZlKTo6aW50IEFTIGFjdGl2ZV9waXBlbGluZXMsXG4gICAgICAoU0VMRUNUIENPVU5UKERJU1RJTkNUIG9yZ19pZCkgRlJPTSBhY3RpdmUpOjppbnQgQVMgYWN0aXZlX3RlYW1zLFxuICAgICAgKFNFTEVDVCBDT1VOVCgqKSBGUk9NIHRyYWNrZWQpOjppbnQgQVMgZGVwbG95X3RyYWNrZWQsXG4gICAgICAoU0VMRUNUIENPQUxFU0NFKGpzb25iX29iamVjdF9hZ2coQ09BTEVTQ0UoY3JlYXRpb25fc291cmNlLCAndW5rbm93bicpLCBuKSwgJ3t9Jzo6anNvbmIpXG4gICAgICAgICBGUk9NIChTRUxFQ1QgY3JlYXRpb25fc291cmNlLCBDT1VOVCgqKTo6aW50IEFTIG4gRlJPTSBzY29wZWQgR1JPVVAgQlkgY3JlYXRpb25fc291cmNlKSBzXG4gICAgICApIEFTIGJ5X3NvdXJjZVxuICBgKSk7XG4gIGNvbnN0IHIgPSByb3dzT2Yocm93cylbMF0gPz8ge307XG4gIGNvbnN0IGNyZWF0ZWQgPSBudW0oci50b3RhbF9waXBlbGluZXMpO1xuICByZXR1cm4ge1xuICAgIHRvdGFsUGlwZWxpbmVzOiBjcmVhdGVkLFxuICAgIGFjdGl2ZVBpcGVsaW5lczogbnVtKHIuYWN0aXZlX3BpcGVsaW5lcyksXG4gICAgYWN0aXZlVGVhbXM6IE1hdGgubWF4KDEsIG51bShyLmFjdGl2ZV90ZWFtcykpLFxuICAgIGRlcGxveVRyYWNrZWRQaXBlbGluZXM6IG51bShyLmRlcGxveV90cmFja2VkKSxcbiAgICBieVNvdXJjZTogKHIuYnlfc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pID8/IHt9LFxuICAgIC8vIE9ubHkgd2hlbiB0aGUgT1JHIGNvbmZpZ3VyZWQgdGhlIGFzc3VtcHRpb24g4oCUIGEgcGxhdGZvcm0tc3VwcGxpZWQgbnVtYmVyXG4gICAgLy8gaGVyZSB3b3VsZCBiZSB0aGUgcGxhdGZvcm0gbWFya2luZyBpdHMgb3duIGhvbWV3b3JrLlxuICAgIGVzdGltYXRlZE1pbnV0ZXNTYXZlZDogdGltZVNhdmVkTWludXRlcyAmJiB0aW1lU2F2ZWRNaW51dGVzID4gMCA/IGNyZWF0ZWQgKiB0aW1lU2F2ZWRNaW51dGVzIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqIE9uZSBwaXBlbGluZSdzIGZhaWx1cmUgc3RyZWFrIGFuZCBsYXN0IHN1Y2Nlc3NmdWwgZGF5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVN0cmVha1JvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEZhaWx1cmVzIGluIHRoZSB0cmFpbGluZyBydW4gb2YgZGF5cyBvbiB3aGljaCBOT1RISU5HIHN1Y2NlZWRlZC5cbiAgICpcbiAgICogQSBMT1dFUiBCT1VORCwgYW5kIGRlbGliZXJhdGVseSBzby4gVGhlIHJvbGx1cCBpcyBwZXIgZGF5LCBzbyB3aXRoaW4gdGhlIG1vc3RcbiAgICogcmVjZW50IGRheSB0aGF0IGRpZCBoYXZlIGEgc3VjY2VzcyB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB3aGV0aGVyIHRoZSBmYWlsdXJlc1xuICAgKiBjYW1lIGJlZm9yZSBvciBhZnRlciBpdCDigJQgdGhhdCBkYXkgaXMgZXhjbHVkZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZCBhdC4gV2hhdFxuICAgKiBzdXJ2aXZlcyBpcyBhIHJ1biBvZiBmYWlsdXJlcyB3aXRoIG5vIHN1Y2Nlc3MgYW55d2hlcmUgYmV0d2VlbiB0aGVtLCB3aGljaCBpc1xuICAgKiBleGFjdGx5IHRoZSBjbGFpbSB0aGUgZmluZGluZyBtYWtlcy5cbiAgICovXG4gIGNvbnNlY3V0aXZlRmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIFRoZSBsYXN0IGRheSB3aXRoIGF0IGxlYXN0IG9uZSBzdWNjZXNzLCBvciBudWxsIHdpdGhpbiB0aGUgbG9va2JhY2suICovXG4gIGxhc3RTdWNjZXNzQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIEZhaWx1cmUgc3RyZWFrcyBhbmQgbGFzdC1zdWNjZXNzIGRhdGVzLCBmb3IgdGhlIG5lZWRzLWF0dGVudGlvbiBydWxlcy5cbiAqXG4gKiBSZWFkcyB0aGUgZGFpbHkgcm9sbHVwLCBub3QgYHBpcGVsaW5lX2V2ZW50c2Ag4oCUIHRoZSBzYW1lIHJlYXNvbiBhcyBldmVyeXRoaW5nXG4gKiBlbHNlIGhlcmU6IGEgc3RyZWFrIHRoYXQgZW5kZWQgdGhyZWUgd2Vla3MgYWdvIG11c3Qgc3RpbGwgYmUgcmVhZGFibGUgYWZ0ZXJcbiAqIHJldGVudGlvbiBoYXMgc3dlcHQgdGhlIGV2ZW50cyB0aGF0IHByb2R1Y2VkIGl0LlxuICpcbiAqIGBsb29rYmFja0RheXNgIGV4dGVuZHMgUEFTVCB0aGUgd2luZG93IG9uIHB1cnBvc2UuIFwiTGFzdCBzdWNjZWVkZWQgMTIgZGF5cyBhZ29cIlxuICogaXMgdGhlIGZpbmRpbmcgYSB3ZWVrbHkgcmVwb3J0IG1vc3QgbmVlZHMsIGFuZCBhIHF1ZXJ5IGJvdW5kZWQgYnkgYSA3LWRheSB3aW5kb3dcbiAqIGNvdWxkIG5ldmVyIHByb2R1Y2UgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQaXBlbGluZVN0cmVha3MoXG4gIHNjb3BlOiBBbmFseXRpY3NTY29wZSxcbiAgbG9va2JhY2tEYXlzID0gOTAsXG4pOiBQcm9taXNlPFBpcGVsaW5lU3RyZWFrUm93W10+IHtcbiAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShuZXcgRGF0ZShzY29wZS50bykuZ2V0VGltZSgpIC0gbG9va2JhY2tEYXlzICogODZfNDAwXzAwMCkudG9JU09TdHJpbmcoKTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBXSVRIIGRheXMgQVMgKFxuICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCBkYXksXG4gICAgICAgICAgICAgU1VNKHN1Y2NlZWRlZCk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgICAgU1VNKGZhaWxlZCk6OmludCAgICBBUyBmYWlsZWRcbiAgICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gJHthbnlUZXh0KHNjb3BlLm9yZ0lkcyl9YCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRheSA+PSAke3NpbmNlfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgR1JPVVAgQlkgcGlwZWxpbmVfaWQsIGRheVxuICAgICksXG4gICAgbGFzdF9vayBBUyAoXG4gICAgICBTRUxFQ1QgcGlwZWxpbmVfaWQsIE1BWChkYXkpIEFTIGxhc3Rfc3VjY2Vzc19kYXlcbiAgICAgIEZST00gZGF5cyBXSEVSRSBzdWNjZWVkZWQgPiAwXG4gICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZFxuICAgIClcbiAgICBTRUxFQ1QgZC5waXBlbGluZV9pZCxcbiAgICAgICAgICAgbC5sYXN0X3N1Y2Nlc3NfZGF5LFxuICAgICAgICAgICBDT0FMRVNDRShTVU0oZC5mYWlsZWQpIEZJTFRFUiAoXG4gICAgICAgICAgICAgV0hFUkUgbC5sYXN0X3N1Y2Nlc3NfZGF5IElTIE5VTEwgT1IgZC5kYXkgPiBsLmxhc3Rfc3VjY2Vzc19kYXlcbiAgICAgICAgICAgKSwgMCk6OmludCBBUyBzdHJlYWtcbiAgICBGUk9NIGRheXMgZFxuICAgIExFRlQgSk9JTiBsYXN0X29rIGwgT04gbC5waXBlbGluZV9pZCA9IGQucGlwZWxpbmVfaWRcbiAgICBHUk9VUCBCWSBkLnBpcGVsaW5lX2lkLCBsLmxhc3Rfc3VjY2Vzc19kYXlcbiAgYCkpO1xuICByZXR1cm4gcm93c09mKHJvd3MpLm1hcCgocikgPT4gKHtcbiAgICBwaXBlbGluZUlkOiBTdHJpbmcoci5waXBlbGluZV9pZCksXG4gICAgY29uc2VjdXRpdmVGYWlsdXJlczogbnVtKHIuc3RyZWFrKSxcbiAgICBsYXN0U3VjY2Vzc0F0OiByLmxhc3Rfc3VjY2Vzc19kYXkgPyBuZXcgRGF0ZShTdHJpbmcoci5sYXN0X3N1Y2Nlc3NfZGF5KSkgOiBudWxsLFxuICB9KSk7XG59XG5cbi8qKlxuICogUGlwZWxpbmVzIHRoYXQgUkFOIGluIHRoZSB3aW5kb3cgYnV0IHByb2R1Y2VkIG5vIGRlcGxveSByb3dzLlxuICpcbiAqIEEgbWVhc3VyZW1lbnQgZ2FwLCBub3QgYSBmYWlsdXJlLCBhbmQgdGhlIHJlYXNvbiBhIGRlcGxveW1lbnQtZnJlcXVlbmN5IG51bWJlciBjYW5cbiAqIGJlIHF1aWV0bHkgd3Jvbmc6IGEgcGlwZWxpbmUgd2hvc2Ugc3ludGggcHJlZGF0ZXMgdGhlIGBwYi5kZXBsb3lzYCB0YWdzIGRlcGxveXNcbiAqIHBlcmZlY3RseSB3ZWxsIGFuZCBpcyBpbnZpc2libGUgdG8gZXZlcnkgRE9SQSBhZ2dyZWdhdGUuIE5vdGhpbmcgZWxzZSBpbiB0aGVcbiAqIHJlcG9ydCB3b3VsZCBzYXkgc28uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVbnRyYWNrZWRQaXBlbGluZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFdJVEggYWN0aXZlIEFTIChcbiAgICAgIFNFTEVDVCBwaXBlbGluZV9pZFxuICAgICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwc1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSAke2FueVRleHQoc2NvcGUub3JnSWRzKX1gIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgZGF5ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBkYXkgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgQU5EIHN0YWdlX25hbWUgPSAnJ1xuICAgICAgR1JPVVAgQlkgcGlwZWxpbmVfaWRcbiAgICAgIEhBVklORyBTVU0ocnVucykgPiAwXG4gICAgKSxcbiAgICB0cmFja2VkIEFTIChcbiAgICAgIFNFTEVDVCBESVNUSU5DVCBwaXBlbGluZV9pZFxuICAgICAgRlJPTSBkb3JhX2RlcGxveW1lbnRzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9ICR7YW55VGV4dChzY29wZS5vcmdJZHMpfWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkZXBsb3llZF9hdCA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGVwbG95ZWRfYXQgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICApXG4gICAgU0VMRUNUIGEucGlwZWxpbmVfaWQgRlJPTSBhY3RpdmUgYVxuICAgIFdIRVJFIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gdHJhY2tlZCB0IFdIRVJFIHQucGlwZWxpbmVfaWQgPSBhLnBpcGVsaW5lX2lkKVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiBTdHJpbmcoci5waXBlbGluZV9pZCkpO1xufVxuXG4vKipcbiAqIFBpcGVsaW5lcyBydW5uaW5nIGEgcGx1Z2luIHZlcnNpb24gd2l0aCBhbiBPUEVOIENyaXRpY2FsIGV4cG9zdXJlLlxuICpcbiAqIFBvaW50LWluLXRpbWUsIG5vdCB3aW5kb3dlZDogd2hhdCBtYXR0ZXJzIGlzIHdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgb25lXG4gKiBOT1cuIEEgQ3JpdGljYWwgdGhhdCB3YXMgb3BlbiBsYXN0IFR1ZXNkYXkgYW5kIGlzIGZpeGVkIHRvZGF5IGlzIG5vdCBzb21ldGhpbmcgdG9cbiAqIHB1dCBpbiBmcm9udCBvZiBhIG1hbmFnZXIsIGFuZCBgZml4ZWRfYXRgIGlzIHdoYXQgc2F5cyBzby5cbiAqXG4gKiBUaGUgU0FNRSBsaXZlIHByZWRpY2F0ZSBhcyB0aGUgdnVsbmVyYWJpbGl0eSBzZWN0aW9uIChgbGl2ZUV4cG9zdXJlUHJlZGljYXRlYCk6XG4gKiBhbiBhY2NlcHRhbmNlIHN0aWxsIGluIGZvcmNlIGFuZCBhIGZhbHNlIHBvc2l0aXZlIGFyZSBleGNsdWRlZCDigJQgc29tZW9uZSB3aXRoXG4gKiB0aGUgYXV0aG9yaXR5IHRvIGRlY2lkZSBoYXMgZG9uZSBzbyBpbiB3cml0aW5nIOKAlCB3aGlsZSBhbiBhY2NlcHRhbmNlIFBBU1QgaXRzXG4gKiBkZWFkbGluZSBjb3VudHMgYWdhaW4sIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZSBkZWFkbGluZSB3YXMgZm9yLiBUaGUgdHdvXG4gKiByZWFkZXJzIG9uY2UgZGlzYWdyZWVkICh0aGlzIG9uZSBrZXB0IGZhbHNlIHBvc2l0aXZlcyBhbmQgZHJvcHBlZCBleHBpcmVkXG4gKiBhY2NlcHRhbmNlcyksIHNvIHRoZSBwYW5lbCBhbmQgdGhlIG5lZWRzLWF0dGVudGlvbiBsaXN0IGNvbnRyYWRpY3RlZCBlYWNoIG90aGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VnVsbmVyYWJsZVBpcGVsaW5lcyhzY29wZTogQW5hbHl0aWNzU2NvcGUpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIERJU1RJTkNUIHBpcGVsaW5lX2lkXG4gICAgRlJPTSBwbHVnaW5fdnVsbl9leHBvc3VyZVxuICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gJHthbnlUZXh0KHNjb3BlLm9yZ0lkcyl9YCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCBjcml0aWNhbF9jb3VudCA+IDBcbiAgICAgIEFORCAke2xpdmVFeHBvc3VyZVByZWRpY2F0ZShub3cpfVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiBTdHJpbmcoci5waXBlbGluZV9pZCkpO1xufVxuXG4vKipcbiAqIFdoZW4gZWFjaCBwaXBlbGluZSBpbiB0aGUgd2luZG93IHdhcyBsYXN0IGNoYW5nZWQuXG4gKlxuICogYHBpcGVsaW5lcy51cGRhdGVkX2F0YCwgbm90IGFuIGF1ZGl0IHF1ZXJ5OiB0aGUgYXVkaXQgdHJhaWwgbGl2ZXMgaW4gYW5vdGhlciBzdG9yZVxuICogd2l0aCBpdHMgb3duIHJldGVudGlvbiwgYW5kIHRoZSBvbmUgZmFjdCB0aGlzIG5lZWRzIOKAlCBcIndhcyB0aGlzIHRvdWNoZWQgc2hvcnRseVxuICogYmVmb3JlIGl0IGJyb2tlXCIg4oCUIGlzIGFscmVhZHkgb24gdGhlIHJvdywgZHVyYWJseSwgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gdGhlXG4gKiBjaGFuZ2Ugd2FzIG1hZGUgaW4uXG4gKlxuICogVGhlIGNvbnNlcXVlbmNlIGlzIHN0YXRlZCByYXRoZXIgdGhhbiBoaWRkZW46IGB1cGRhdGVkX2F0YCBtb3ZlcyBmb3IgQU5ZIHdyaXRlLFxuICogaW5jbHVkaW5nIGEgcmVuYW1lLiBTbyB0aGUgZmluZGluZyBzYXlzIFwiYWZ0ZXIgYSBjb25maWd1cmF0aW9uIGNoYW5nZVwiLCB3aGljaCBpc1xuICogdHJ1ZSBvZiBhIHJlbmFtZSB0b28sIGFuZCBkb2VzIG5vdCBjbGFpbSB0byBuYW1lIHRoZSBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQaXBlbGluZUNvbmZpZ0NoYW5nZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBEYXRlPj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVCBpZDo6dGV4dCBBUyBpZCwgdXBkYXRlZF9hdFxuICAgIEZST00gcGlwZWxpbmVzXG4gICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSAke2FueVRleHQoc2NvcGUub3JnSWRzKX1gIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgQU5EIGRlbGV0ZWRfYXQgSVMgTlVMTFxuICAgICAgQU5EIHVwZGF0ZWRfYXQgSVMgTk9UIE5VTExcbiAgYCkpO1xuICBjb25zdCBvdXQgPSBuZXcgTWFwPHN0cmluZywgRGF0ZT4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJvd3NPZihyb3dzKSkge1xuICAgIGNvbnN0IGF0ID0gci51cGRhdGVkX2F0ID8gbmV3IERhdGUoU3RyaW5nKHIudXBkYXRlZF9hdCkpIDogbnVsbDtcbiAgICBpZiAoYXQgJiYgIU51bWJlci5pc05hTihhdC5nZXRUaW1lKCkpKSBvdXQuc2V0KFN0cmluZyhyLmlkKSwgYXQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUm93cyBmcm9tIGEgcmF3IGBleGVjdXRlYCwgd2hpY2hldmVyIHNoYXBlIHRoZSBkcml2ZXIgcmV0dXJuZWQuICovXG5mdW5jdGlvbiByb3dzT2YocmVzdWx0OiB1bmtub3duKTogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkgcmV0dXJuIHJlc3VsdCBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIGNvbnN0IHJvd3MgPSAocmVzdWx0IGFzIHsgcm93cz86IHVua25vd24gfSk/LnJvd3M7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHJvd3MpID8gcm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gOiBbXTtcbn1cblxuLyoqIEEgY291bnQgZnJvbSBhIGRyaXZlciB0aGF0IG1heSBoYW5kIGJhY2sgYSBzdHJpbmcgZm9yIGEgYmlnaW50LiAqL1xuZnVuY3Rpb24gbnVtKHY6IHVua25vd24pOiBudW1iZXIge1xuICBjb25zdCBuID0gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IE51bWJlcih2ID8/IDApO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDA7XG59XG5cbmZ1bmN0aW9uIGlzb09yTnVsbCh2OiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghdikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGQgPSB2IGluc3RhbmNlb2YgRGF0ZSA/IHYgOiBuZXcgRGF0ZShTdHJpbmcodikpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkLnRvSVNPU3RyaW5nKCk7XG59XG4iXX0=
|