@pipeline-builder/pipeline-data 4.1.45 → 4.1.47
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/reporting/analytics-queries.js +43 -15
- package/lib/database/index.d.ts +2 -0
- package/lib/database/index.js +5 -1
- package/lib/database/postgres-connection.js +8 -1
- package/lib/database/read-connection.d.ts +19 -0
- package/lib/database/read-connection.js +122 -0
- package/lib/database/read-lag.d.ts +31 -0
- package/lib/database/read-lag.js +202 -0
- package/lib/database/tenancy.d.ts +102 -1
- package/lib/database/tenancy.js +101 -3
- package/lib/testing/exports.json +10 -0
- package/package.json +3 -3
|
@@ -17,11 +17,39 @@
|
|
|
17
17
|
* - A ZERO AND A BLIND SPOT ARE DIFFERENT. Where a number can be absent for lack
|
|
18
18
|
* of data rather than lack of activity, the shape carries that (`null`, a
|
|
19
19
|
* `coverage` count, an explicit reason) instead of collapsing to 0.
|
|
20
|
+
*
|
|
21
|
+
* READS GO TO THE REPLICA WHEN ONE EXISTS. Every query below runs through
|
|
22
|
+
* `withTenantTxRead`, the read-only variant of `withTenantTx`. It sets the
|
|
23
|
+
* identical RLS GUCs, adds `SET TRANSACTION READ ONLY`, and falls back to the
|
|
24
|
+
* primary automatically whenever there is no replica, the kill switch is off,
|
|
25
|
+
* replay lag is beyond its threshold, the request has already written, or there
|
|
26
|
+
* is no tenant context — so this is a no-op until `DB_READ_HOST` is configured.
|
|
27
|
+
*
|
|
28
|
+
* WHY THIS FILE WAS THE FIRST TO OPT IN (Phase 4 of
|
|
29
|
+
* docs/plans/postgres-read-write-split.md). It satisfies all three of the
|
|
30
|
+
* plan's "leave it on the primary" exclusions by construction:
|
|
31
|
+
*
|
|
32
|
+
* - Nothing here writes. Thirteen aggregate SELECTs, no INSERT, no UPDATE, no
|
|
33
|
+
* `SELECT … FOR UPDATE`, no advisory lock — so none of the four call sites
|
|
34
|
+
* the Phase 0a audit found hiding behind read-looking code.
|
|
35
|
+
* - Nothing here feeds an AUTHORIZATION decision. These are dashboard
|
|
36
|
+
* aggregates; a stale permission check is a security bug, a stale chart is
|
|
37
|
+
* a stale chart.
|
|
38
|
+
* - Nobody is about to ACT on the result. A user who just created a pipeline
|
|
39
|
+
* looks for it in a list, not in a 30-day failure-rate rollup.
|
|
40
|
+
*
|
|
41
|
+
* And it is the best offload candidate for the same reason it is safe: these
|
|
42
|
+
* are the heaviest queries in the package, scanning time ranges rather than
|
|
43
|
+
* fetching rows by id.
|
|
44
|
+
*
|
|
45
|
+
* `SET TRANSACTION READ ONLY` applies on the PRIMARY path too, so if a write
|
|
46
|
+
* is ever added below it fails here, loudly, rather than at whichever target
|
|
47
|
+
* the read happened to land on.
|
|
20
48
|
*/
|
|
21
49
|
import { and, eq, gte, inArray, lt, sql } from 'drizzle-orm';
|
|
22
50
|
import { FAILURE_CATEGORY_LABELS, isTeamActionable } from './failure-classifier.js';
|
|
23
51
|
import { schema } from '../../database/drizzle-schema.js';
|
|
24
|
-
import {
|
|
52
|
+
import { withTenantTxRead } from '../../database/tenancy.js';
|
|
25
53
|
/** The org predicate: one org, or a rollup set. */
|
|
26
54
|
function orgPredicate(col, scope) {
|
|
27
55
|
return scope.orgIds && scope.orgIds.length > 0
|
|
@@ -41,7 +69,7 @@ function orgPredicate(col, scope) {
|
|
|
41
69
|
* pipeline nobody ran is not a pipeline that failed.
|
|
42
70
|
*/
|
|
43
71
|
export async function getPipelineBreakdown(scope, limit = 10) {
|
|
44
|
-
const rows = await
|
|
72
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
45
73
|
WITH totals AS (
|
|
46
74
|
SELECT
|
|
47
75
|
r.pipeline_id,
|
|
@@ -139,7 +167,7 @@ export async function getFailureAnalysis(scope, previous) {
|
|
|
139
167
|
};
|
|
140
168
|
}
|
|
141
169
|
async function categoryCounts(scope) {
|
|
142
|
-
const rows = await
|
|
170
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
143
171
|
SELECT key AS category, SUM(value::int)::int AS count
|
|
144
172
|
FROM execution_daily_rollups r, jsonb_each(r.failures_by_category)
|
|
145
173
|
WHERE r.org_id ${scope.orgIds?.length ? sql `= ANY(${scope.orgIds})` : sql `= ${scope.orgId}`}
|
|
@@ -153,7 +181,7 @@ async function categoryCounts(scope) {
|
|
|
153
181
|
return out;
|
|
154
182
|
}
|
|
155
183
|
async function topPipelinesByCategory(scope, perCategory = 3) {
|
|
156
|
-
const rows = await
|
|
184
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
157
185
|
SELECT category, pipeline_id, pipeline_name, count FROM (
|
|
158
186
|
SELECT
|
|
159
187
|
e.key AS category,
|
|
@@ -211,7 +239,7 @@ export async function getStagePerformance(scope, pipelineId, previous) {
|
|
|
211
239
|
}).sort((a, b) => (b.p95Ms ?? 0) - (a.p95Ms ?? 0));
|
|
212
240
|
}
|
|
213
241
|
async function stageRows(scope, pipelineId) {
|
|
214
|
-
const rows = await
|
|
242
|
+
const rows = await withTenantTxRead((tx) => tx.select({
|
|
215
243
|
stageName: schema.executionDailyRollup.stageName,
|
|
216
244
|
runs: sql `SUM(${schema.executionDailyRollup.runs})::int`,
|
|
217
245
|
failed: sql `SUM(${schema.executionDailyRollup.failed})::int`,
|
|
@@ -244,7 +272,7 @@ async function stageRows(scope, pipelineId) {
|
|
|
244
272
|
* thing actually measured.
|
|
245
273
|
*/
|
|
246
274
|
export async function getResourceConsumption(scope, limit = 20) {
|
|
247
|
-
const rows = await
|
|
275
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
248
276
|
SELECT
|
|
249
277
|
p.project,
|
|
250
278
|
r.pipeline_id,
|
|
@@ -283,7 +311,7 @@ export async function getResourceConsumption(scope, limit = 20) {
|
|
|
283
311
|
* one of those measures nothing happened.
|
|
284
312
|
*/
|
|
285
313
|
export async function getPromotionView(scope, productionEnv = 'production', limit = 25) {
|
|
286
|
-
const rows = await
|
|
314
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
287
315
|
SELECT commit_sha, environment, MIN(deployed_at) AS deployed_at
|
|
288
316
|
FROM dora_deployments
|
|
289
317
|
WHERE org_id ${scope.orgIds?.length ? sql `= ANY(${scope.orgIds})` : sql `= ${scope.orgId}`}
|
|
@@ -328,7 +356,7 @@ export async function getPromotionView(scope, productionEnv = 'production', limi
|
|
|
328
356
|
* section below reads the deployed side and says which it is showing.
|
|
329
357
|
*/
|
|
330
358
|
export async function getOutdatedPlugins(scope, limit = 50) {
|
|
331
|
-
const rows = await
|
|
359
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
332
360
|
SELECT
|
|
333
361
|
r.pipeline_id, p.pipeline_name, r.stage_name, r.step_name,
|
|
334
362
|
COALESCE(r.plugin_publisher || '/', '') || r.plugin_name AS plugin,
|
|
@@ -368,7 +396,7 @@ export async function getOutdatedPlugins(scope, limit = 50) {
|
|
|
368
396
|
*/
|
|
369
397
|
export async function getPluginVulnerabilities(scope, limit = 50) {
|
|
370
398
|
const now = new Date();
|
|
371
|
-
const rows = await
|
|
399
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
372
400
|
SELECT
|
|
373
401
|
v.pipeline_id, p.pipeline_name,
|
|
374
402
|
COALESCE(v.plugin_publisher || '/', '') || v.plugin_name AS plugin,
|
|
@@ -410,7 +438,7 @@ export async function getPluginVulnerabilities(scope, limit = 50) {
|
|
|
410
438
|
* feature could do.
|
|
411
439
|
*/
|
|
412
440
|
export async function getAdoption(scope, timeSavedMinutes) {
|
|
413
|
-
const rows = await
|
|
441
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
414
442
|
WITH scoped AS (
|
|
415
443
|
SELECT id::text AS id, org_id, creation_source
|
|
416
444
|
FROM pipelines
|
|
@@ -465,7 +493,7 @@ export async function getAdoption(scope, timeSavedMinutes) {
|
|
|
465
493
|
*/
|
|
466
494
|
export async function getPipelineStreaks(scope, lookbackDays = 90) {
|
|
467
495
|
const since = new Date(new Date(scope.to).getTime() - lookbackDays * 86_400_000).toISOString();
|
|
468
|
-
const rows = await
|
|
496
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
469
497
|
WITH days AS (
|
|
470
498
|
SELECT pipeline_id, day,
|
|
471
499
|
SUM(succeeded)::int AS succeeded,
|
|
@@ -504,7 +532,7 @@ export async function getPipelineStreaks(scope, lookbackDays = 90) {
|
|
|
504
532
|
* report would say so.
|
|
505
533
|
*/
|
|
506
534
|
export async function getUntrackedPipelines(scope) {
|
|
507
|
-
const rows = await
|
|
535
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
508
536
|
WITH active AS (
|
|
509
537
|
SELECT pipeline_id
|
|
510
538
|
FROM execution_daily_rollups
|
|
@@ -538,7 +566,7 @@ export async function getUntrackedPipelines(scope) {
|
|
|
538
566
|
* acceptance is a separate finding (`lapsedAcceptances`).
|
|
539
567
|
*/
|
|
540
568
|
export async function getVulnerablePipelines(scope) {
|
|
541
|
-
const rows = await
|
|
569
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
542
570
|
SELECT DISTINCT pipeline_id
|
|
543
571
|
FROM plugin_vuln_exposure
|
|
544
572
|
WHERE org_id ${scope.orgIds?.length ? sql `= ANY(${scope.orgIds})` : sql `= ${scope.orgId}`}
|
|
@@ -561,7 +589,7 @@ export async function getVulnerablePipelines(scope) {
|
|
|
561
589
|
* true of a rename too, and does not claim to name the change.
|
|
562
590
|
*/
|
|
563
591
|
export async function getPipelineConfigChanges(scope) {
|
|
564
|
-
const rows = await
|
|
592
|
+
const rows = await withTenantTxRead((tx) => tx.execute(sql `
|
|
565
593
|
SELECT id::text AS id, updated_at
|
|
566
594
|
FROM pipelines
|
|
567
595
|
WHERE org_id ${scope.orgIds?.length ? sql `= ANY(${scope.orgIds})` : sql `= ${scope.orgId}`}
|
|
@@ -595,4 +623,4 @@ function isoOrNull(v) {
|
|
|
595
623
|
const d = v instanceof Date ? v : new Date(String(v));
|
|
596
624
|
return Number.isNaN(d.getTime()) ? null : d.toISOString();
|
|
597
625
|
}
|
|
598
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLXF1ZXJpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9hbmFseXRpY3MtcXVlcmllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBV3pELG1EQUFtRDtBQUNuRCxTQUFTLFlBQVksQ0FBQyxHQUFrQyxFQUFFLEtBQXFCO0lBQzdFLE9BQU8sS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFZLEVBQUUsS0FBSyxDQUFDLEtBQWMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFtQkQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEtBQXFCLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFDMUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7Ozs7O3VCQVVqQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFD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QUFNLENBQUM7UUFBRSxPQUFPLE1BQXdDLENBQUM7SUFDM0UsTUFBTSxJQUFJLEdBQUksTUFBNkIsRUFBRSxJQUFJLENBQUM7SUFDbEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFzQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDM0UsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxTQUFTLEdBQUcsQ0FBQyxDQUFVO0lBQ3JCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLENBQVU7SUFDM0IsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBxdWVyaWVzIHRoZSBiZXNwb2tlIHJlcG9ydCBzZWN0aW9ucyByZWFkLlxuICpcbiAqIEFsbCBvZiB0aGVtIGdvIHRocm91Z2ggYGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzYCwgYGRvcmFfZGVwbG95bWVudHNgLFxuICogYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCBvciBgcGx1Z2luX3Z1bG5fZXhwb3N1cmVgIOKAlCBuZXZlciByYXdcbiAqIGBwaXBlbGluZV9ldmVudHNgLiBUaGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aG9zZSB0YWJsZXM6IGEgcXVhcnRlcmx5IHJlcG9ydFxuICogb3ZlciBhIGJ1c3kgb3JnIGNvc3RzIGEgZmV3IGh1bmRyZWQgcm93cywgYW5kIGtlZXBzIHdvcmtpbmcgYWZ0ZXIgcmV0ZW50aW9uIGhhc1xuICogc3dlcHQgdGhlIGV2ZW50cy5cbiAqXG4gKiBUV08gUlVMRVMgRVZFUlkgUVVFUlkgSEVSRSBGT0xMT1dTOlxuICpcbiAqICAtIE5PVEhJTkcgSVMgUEVSLVBFUlNPTi4gRXZlcnkgYWdncmVnYXRlIGlzIHBlciBwaXBlbGluZSwgcGVyIHN0YWdlLCBwZXJcbiAqICAgIGNhdGVnb3J5IG9yIHBlciBlbnZpcm9ubWVudC4gVGhlIHNlY3Rpb24gcmVnaXN0cnkgcmVmdXNlcyBhIHBlci1wZXJzb24gaWQgYXRcbiAqICAgIHJlZ2lzdHJhdGlvbjsgdGhlc2UgcXVlcmllcyBtYWtlIHN1cmUgdGhlcmUgaXMgbm90aGluZyB0byByZWdpc3Rlci5cbiAqICAtIEEgWkVSTyBBTkQgQSBCTElORCBTUE9UIEFSRSBESUZGRVJFTlQuIFdoZXJlIGEgbnVtYmVyIGNhbiBiZSBhYnNlbnQgZm9yIGxhY2tcbiAqICAgIG9mIGRhdGEgcmF0aGVyIHRoYW4gbGFjayBvZiBhY3Rpdml0eSwgdGhlIHNoYXBlIGNhcnJpZXMgdGhhdCAoYG51bGxgLCBhXG4gKiAgICBgY292ZXJhZ2VgIGNvdW50LCBhbiBleHBsaWNpdCByZWFzb24pIGluc3RlYWQgb2YgY29sbGFwc2luZyB0byAwLlxuICovXG5cbmltcG9ydCB7IGFuZCwgZXEsIGd0ZSwgaW5BcnJheSwgbHQsIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IEZBSUxVUkVfQ0FURUdPUllfTEFCRUxTLCBpc1RlYW1BY3Rpb25hYmxlIH0gZnJvbSAnLi9mYWlsdXJlLWNsYXNzaWZpZXIuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHR5cGUgeyBGYWlsdXJlQ2F0ZWdvcnkgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9zY2hlbWEvcmVwb3J0aW5nLWFuYWx5dGljcy5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHggfSBmcm9tICcuLi8uLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuLyoqIFRoZSB3aW5kb3cgYW5kIG9yZyBzY29wZSBldmVyeSBxdWVyeSB0YWtlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl0aWNzU2NvcGUge1xuICBvcmdJZDogc3RyaW5nO1xuICAvKiogYFtzZWxmLCAuLi5kZXNjZW5kYW50c11gIGZvciBhIHJvbGx1cDsgdW5kZWZpbmVkID0gdGhpcyBvcmcgb25seS4gKi9cbiAgb3JnSWRzPzogc3RyaW5nW107XG4gIGZyb206IHN0cmluZztcbiAgdG86IHN0cmluZztcbn1cblxuLyoqIFRoZSBvcmcgcHJlZGljYXRlOiBvbmUgb3JnLCBvciBhIHJvbGx1cCBzZXQuICovXG5mdW5jdGlvbiBvcmdQcmVkaWNhdGUoY29sOiBQYXJhbWV0ZXJzPHR5cGVvZiBpbkFycmF5PlswXSwgc2NvcGU6IEFuYWx5dGljc1Njb3BlKSB7XG4gIHJldHVybiBzY29wZS5vcmdJZHMgJiYgc2NvcGUub3JnSWRzLmxlbmd0aCA+IDBcbiAgICA/IGluQXJyYXkoY29sLCBzY29wZS5vcmdJZHMpXG4gICAgOiBlcShjb2wgYXMgbmV2ZXIsIHNjb3BlLm9yZ0lkIGFzIG5ldmVyKTtcbn1cblxuLyoqIE9uZSBwaXBlbGluZSdzIGxpbmUgaW4gdGhlIGJyZWFrZG93bi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVCcmVha2Rvd25Sb3cge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcHJvamVjdDogc3RyaW5nIHwgbnVsbDtcbiAgcnVuczogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlciB8IG51bGw7XG4gIHA5NU1zOiBudW1iZXIgfCBudWxsO1xuICBkZXBsb3lzOiBudW1iZXI7XG4gIC8qKiBUaGUgbW9zdCByZWNlbnQgZmFpbHVyZSdzIGRheSBhbmQgc3RhZ2UsIGZvciBcIndoYXQgdG8gbG9vayBhdCBmaXJzdFwiLiAqL1xuICBsYXN0RmFpbHVyZUF0OiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RmFpbHVyZVN0YWdlOiBzdHJpbmcgfCBudWxsO1xuICBidWlsZFNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgZGVsaXZlcnksIHdvcnN0IGZpcnN0LlxuICpcbiAqIFdPUlNUIEZJUlNULCBhbmQgY2FwcGVkLCBiZWNhdXNlIHRoZSBwb2ludCBvZiB0aGUgc2VjdGlvbiBpcyBcIndoZXJlIHNob3VsZFxuICogYXR0ZW50aW9uIGdvXCIuIEEgbGlzdCBzb3J0ZWQgYnkgbmFtZSwgb3IgYW4gdW5ib3VuZGVkIG9uZSwgaXMgYSBkYXRhIGR1bXA6IHRoZVxuICogbGVhZCBzdGlsbCBoYXMgdG8gZmluZCB0aGUgcHJvYmxlbSwgd2hpY2ggaXMgdGhlIHdvcmsgdGhlIHJlcG9ydCB3YXMgc3VwcG9zZWQgdG9cbiAqIGRvLiBUaWVzIGJyZWFrIG9uIHZvbHVtZSwgc28gYSA1MCUtc3VjY2VzcyBwaXBlbGluZSB0aGF0IHJhbiB0d2ljZSBkb2VzIG5vdFxuICogb3V0cmFuayBvbmUgdGhhdCByYW4gdHdvIGh1bmRyZWQgdGltZXMuXG4gKlxuICogYHN1Y2Nlc3NQY3RgIGlzIE5VTEwgZm9yIGEgcGlwZWxpbmUgd2l0aCBubyBydW5zIGluIHRoZSB3aW5kb3cg4oCUIG5vdCAwLiBBXG4gKiBwaXBlbGluZSBub2JvZHkgcmFuIGlzIG5vdCBhIHBpcGVsaW5lIHRoYXQgZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGlwZWxpbmVCcmVha2Rvd24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDEwKTogUHJvbWlzZTxQaXBlbGluZUJyZWFrZG93blJvd1tdPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBXSVRIIHRvdGFscyBBUyAoXG4gICAgICBTRUxFQ1RcbiAgICAgICAgci5waXBlbGluZV9pZCxcbiAgICAgICAgU1VNKHIucnVucyk6OmludCBBUyBydW5zLFxuICAgICAgICBTVU0oci5zdWNjZWVkZWQpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICBTVU0oci5mYWlsZWQpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICBNQVgoci5wOTVfbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICBTVU0oci5idWlsZF9zZWNvbmRzKTo6aW50IEFTIGJ1aWxkX3NlY29uZHNcbiAgICAgIEZST00gZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHMgclxuICAgICAgV0hFUkUgci5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIHIuZGF5ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCByLmRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICAtLSBUaGUgcGlwZWxpbmUtbGV2ZWwgZ3JhaW4gb25seTogc3VtbWluZyB0aGUgc3RhZ2Ugcm93cyB0b28gd291bGQgY291bnRcbiAgICAgICAgLS0gZXZlcnkgcnVuIG9uY2UgcGVyIHN0YWdlLlxuICAgICAgICBBTkQgci5zdGFnZV9uYW1lID0gJydcbiAgICAgIEdST1VQIEJZIHIucGlwZWxpbmVfaWRcbiAgICApLFxuICAgIGRlcGxveXMgQVMgKFxuICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCBDT1VOVCgqKTo6aW50IEFTIGRlcGxveXNcbiAgICAgIEZST00gZG9yYV9kZXBsb3ltZW50c1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkZXBsb3llZF9hdCA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGVwbG95ZWRfYXQgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgQU5EIHN1Y2NlZWRlZCA9IHRydWVcbiAgICAgIEdST1VQIEJZIHBpcGVsaW5lX2lkXG4gICAgKSxcbiAgICBsYXN0X2ZhaWwgQVMgKFxuICAgICAgLS0gVGhlIG1vc3QgcmVjZW50IGZhaWxpbmcgU1RBR0Ugcm93IHBlciBwaXBlbGluZTogd2hhdCB0byBsb29rIGF0IGZpcnN0LlxuICAgICAgU0VMRUNUIERJU1RJTkNUIE9OIChwaXBlbGluZV9pZCkgcGlwZWxpbmVfaWQsIGRheSwgc3RhZ2VfbmFtZVxuICAgICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwc1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgc3RhZ2VfbmFtZSA8PiAnJyBBTkQgZmFpbGVkID4gMFxuICAgICAgT1JERVIgQlkgcGlwZWxpbmVfaWQsIGRheSBERVNDLCBmYWlsZWQgREVTQ1xuICAgIClcbiAgICBTRUxFQ1RcbiAgICAgIHQucGlwZWxpbmVfaWQsXG4gICAgICBwLnBpcGVsaW5lX25hbWUsXG4gICAgICBwLnByb2plY3QsXG4gICAgICB0LnJ1bnMsIHQuc3VjY2VlZGVkLCB0LmZhaWxlZCwgdC5wOTVfbXMsIHQuYnVpbGRfc2Vjb25kcyxcbiAgICAgIENPQUxFU0NFKGQuZGVwbG95cywgMCkgQVMgZGVwbG95cyxcbiAgICAgIGYuZGF5IEFTIGxhc3RfZmFpbHVyZV9hdCxcbiAgICAgIGYuc3RhZ2VfbmFtZSBBUyBsYXN0X2ZhaWx1cmVfc3RhZ2UsXG4gICAgICBDQVNFIFdIRU4gdC5ydW5zID4gMCBUSEVOIFJPVU5EKCh0LnN1Y2NlZWRlZDo6bnVtZXJpYyAvIHQucnVucykgKiAxMDAsIDEpIEVMU0UgTlVMTCBFTkQgQVMgc3VjY2Vzc19wY3RcbiAgICBGUk9NIHRvdGFscyB0XG4gICAgTEVGVCBKT0lOIGRlcGxveXMgZCBPTiBkLnBpcGVsaW5lX2lkID0gdC5waXBlbGluZV9pZFxuICAgIExFRlQgSk9JTiBsYXN0X2ZhaWwgZiBPTiBmLnBpcGVsaW5lX2lkID0gdC5waXBlbGluZV9pZFxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gdC5waXBlbGluZV9pZFxuICAgIC0tIFdvcnN0IGZpcnN0OiBsb3dlc3Qgc3VjY2VzcyByYXRlLCB0aGVuIG1vc3QgcnVucywgc28gYSA1MCUgcGlwZWxpbmUgdGhhdCByYW5cbiAgICAtLSB0d2ljZSBkb2VzIG5vdCBvdXRyYW5rIG9uZSB0aGF0IHJhbiB0d28gaHVuZHJlZCB0aW1lcy5cbiAgICBPUkRFUiBCWSBzdWNjZXNzX3BjdCBBU0MgTlVMTFMgTEFTVCwgdC5ydW5zIERFU0NcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBwcm9qZWN0OiAoci5wcm9qZWN0IGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgcnVuczogbnVtKHIucnVucyksXG4gICAgc3VjY2VlZGVkOiBudW0oci5zdWNjZWVkZWQpLFxuICAgIGZhaWxlZDogbnVtKHIuZmFpbGVkKSxcbiAgICBzdWNjZXNzUGN0OiByLnN1Y2Nlc3NfcGN0ID09PSBudWxsID8gbnVsbCA6IE51bWJlcihyLnN1Y2Nlc3NfcGN0KSxcbiAgICBwOTVNczogci5wOTVfbXMgPT09IG51bGwgPyBudWxsIDogbnVtKHIucDk1X21zKSxcbiAgICBkZXBsb3lzOiBudW0oci5kZXBsb3lzKSxcbiAgICBsYXN0RmFpbHVyZUF0OiBpc29Pck51bGwoci5sYXN0X2ZhaWx1cmVfYXQpLFxuICAgIGxhc3RGYWlsdXJlU3RhZ2U6IChyLmxhc3RfZmFpbHVyZV9zdGFnZSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIGJ1aWxkU2Vjb25kczogbnVtKHIuYnVpbGRfc2Vjb25kcyksXG4gIH0pKTtcbn1cblxuLyoqIE9uZSBmYWlsdXJlIGNhdGVnb3J5J3Mgc2hhcmUgb2YgdGhlIHBlcmlvZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZUNhdGVnb3J5Um93IHtcbiAgY2F0ZWdvcnk6IEZhaWx1cmVDYXRlZ29yeTtcbiAgbGFiZWw6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbiAgc2hhcmVQY3Q6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRlYW0gY2FuIGFjdCBvbiBpdCwgb3IgaXQgaGFwcGVuZWQgdG8gdGhlbS4gKi9cbiAgdGVhbUFjdGlvbmFibGU6IGJvb2xlYW47XG4gIC8qKiBDaGFuZ2UgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCwgaW4gZmFpbHVyZXMuICovXG4gIGNoYW5nZTogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBwaXBlbGluZXMgaXQgaGl0IGhhcmRlc3QuICovXG4gIHRvcFBpcGVsaW5lczogQXJyYXk8eyBwaXBlbGluZUlkOiBzdHJpbmc7IHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDsgY291bnQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBGYWlsdXJlcyBieSBjYXRlZ29yeSwgd2l0aCB0aGUgcHJldmlvdXMgcGVyaW9kJ3MgY291bnRzIGZvciB0aGUgdHJlbmQuXG4gKlxuICogU1BMSVRTIEFDVElPTkFCTEUgRlJPTSBOT1QuIEEgd2VlayB3aG9zZSBmYWlsdXJlcyB3ZXJlIGFsbCBjbG91ZCB0aHJvdHRsaW5nIGlzIGFcbiAqIGRpZmZlcmVudCBjb252ZXJzYXRpb24gZnJvbSBvbmUgd2hvc2UgZmFpbHVyZXMgd2VyZSBhbGwgYnJva2VuIHRlc3RzLCBhbmRcbiAqIHByZXNlbnRpbmcgdGhlbSBpbiBvbmUgcmFua2VkIGxpc3QgaW52aXRlcyBleGFjdGx5IHRoZSB3cm9uZyBjb25jbHVzaW9uIOKAlCBhIHRlYW1cbiAqIGJlaW5nIGFza2VkIHRvIGZpeCBhbiBBV1MgY2FwYWNpdHkgcHJvYmxlbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZhaWx1cmVBbmFseXNpcyhcbiAgc2NvcGU6IEFuYWx5dGljc1Njb3BlLFxuICBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPHsgY2F0ZWdvcmllczogRmFpbHVyZUNhdGVnb3J5Um93W107IHRvdGFsOiBudW1iZXI7IGFjdGlvbmFibGVUb3RhbDogbnVtYmVyIH0+IHtcbiAgY29uc3QgY291bnRzID0gYXdhaXQgY2F0ZWdvcnlDb3VudHMoc2NvcGUpO1xuICBjb25zdCBwcmlvciA9IHByZXZpb3VzID8gYXdhaXQgY2F0ZWdvcnlDb3VudHMoeyAuLi5zY29wZSwgLi4ucHJldmlvdXMgfSkgOiBudWxsO1xuICBjb25zdCB0b3RhbCA9IFsuLi5jb3VudHMudmFsdWVzKCldLnJlZHVjZSgocywgdikgPT4gcyArIHYuY291bnQsIDApO1xuICBjb25zdCB0b3BCeUNhdGVnb3J5ID0gYXdhaXQgdG9wUGlwZWxpbmVzQnlDYXRlZ29yeShzY29wZSk7XG5cbiAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5jb3VudHMuZW50cmllcygpXVxuICAgIC5tYXAoKFtjYXRlZ29yeSwgdl0pID0+ICh7XG4gICAgICBjYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBGQUlMVVJFX0NBVEVHT1JZX0xBQkVMU1tjYXRlZ29yeV0gPz8gY2F0ZWdvcnksXG4gICAgICBjb3VudDogdi5jb3VudCxcbiAgICAgIHNoYXJlUGN0OiB0b3RhbCA+IDAgPyBOdW1iZXIoKCh2LmNvdW50IC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDEpKSA6IDAsXG4gICAgICB0ZWFtQWN0aW9uYWJsZTogaXNUZWFtQWN0aW9uYWJsZShjYXRlZ29yeSksXG4gICAgICBjaGFuZ2U6IHByaW9yID8gdi5jb3VudCAtIChwcmlvci5nZXQoY2F0ZWdvcnkpPy5jb3VudCA/PyAwKSA6IG51bGwsXG4gICAgICB0b3BQaXBlbGluZXM6IHRvcEJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSA/PyBbXSxcbiAgICB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuXG4gIHJldHVybiB7XG4gICAgY2F0ZWdvcmllcyxcbiAgICB0b3RhbCxcbiAgICBhY3Rpb25hYmxlVG90YWw6IGNhdGVnb3JpZXMuZmlsdGVyKChjKSA9PiBjLnRlYW1BY3Rpb25hYmxlKS5yZWR1Y2UoKHMsIGMpID0+IHMgKyBjLmNvdW50LCAwKSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2F0ZWdvcnlDb3VudHMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxNYXA8RmFpbHVyZUNhdGVnb3J5LCB7IGNvdW50OiBudW1iZXIgfT4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVCBrZXkgQVMgY2F0ZWdvcnksIFNVTSh2YWx1ZTo6aW50KTo6aW50IEFTIGNvdW50XG4gICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwcyByLCBqc29uYl9lYWNoKHIuZmFpbHVyZXNfYnlfY2F0ZWdvcnkpXG4gICAgV0hFUkUgci5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCByLmRheSA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgci5kYXkgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgIEFORCByLnN0YWdlX25hbWUgPSAnJ1xuICAgIEdST1VQIEJZIGtleVxuICBgKSk7XG4gIGNvbnN0IG91dCA9IG5ldyBNYXA8RmFpbHVyZUNhdGVnb3J5LCB7IGNvdW50OiBudW1iZXIgfT4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJvd3NPZihyb3dzKSkgb3V0LnNldChyLmNhdGVnb3J5IGFzIEZhaWx1cmVDYXRlZ29yeSwgeyBjb3VudDogbnVtKHIuY291bnQpIH0pO1xuICByZXR1cm4gb3V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB0b3BQaXBlbGluZXNCeUNhdGVnb3J5KFxuICBzY29wZTogQW5hbHl0aWNzU2NvcGUsXG4gIHBlckNhdGVnb3J5ID0gMyxcbik6IFByb21pc2U8TWFwPEZhaWx1cmVDYXRlZ29yeSwgQXJyYXk8eyBwaXBlbGluZUlkOiBzdHJpbmc7IHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDsgY291bnQ6IG51bWJlciB9Pj4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVCBjYXRlZ29yeSwgcGlwZWxpbmVfaWQsIHBpcGVsaW5lX25hbWUsIGNvdW50IEZST00gKFxuICAgICAgU0VMRUNUXG4gICAgICAgIGUua2V5IEFTIGNhdGVnb3J5LFxuICAgICAgICByLnBpcGVsaW5lX2lkLFxuICAgICAgICBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgIFNVTShlLnZhbHVlOjppbnQpOjppbnQgQVMgY291bnQsXG4gICAgICAgIFJPV19OVU1CRVIoKSBPVkVSIChQQVJUSVRJT04gQlkgZS5rZXkgT1JERVIgQlkgU1VNKGUudmFsdWU6OmludCkgREVTQykgQVMgcm5cbiAgICAgIC0tIENST1NTIEpPSU4gTEFURVJBTCwgbm90IGEgY29tbWEgam9pbi4gV2l0aCBGUk9NIGEsIGYoYS54KSBlIExFRlQgSk9JTiBiLFxuICAgICAgLS0gdGhlIExFRlQgSk9JTiBiaW5kcyB0byBlIGFsb25lIGFuZCByIGZhbGxzIG91dCBvZiBzY29wZSBpbiBpdHMgT04gY2xhdXNlXG4gICAgICAtLSAoXCJpbnZhbGlkIHJlZmVyZW5jZSB0byBGUk9NLWNsYXVzZSBlbnRyeVwiKS4gVGhlIGV4cGxpY2l0IGxhdGVyYWwga2VlcHMgYWxsXG4gICAgICAtLSB0aHJlZSBpbiBvbmUgam9pbiB0cmVlLlxuICAgICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwcyByXG4gICAgICBDUk9TUyBKT0lOIExBVEVSQUwganNvbmJfZWFjaChyLmZhaWx1cmVzX2J5X2NhdGVnb3J5KSBlXG4gICAgICBMRUZUIEpPSU4gcGlwZWxpbmVzIHAgT04gcC5pZDo6dGV4dCA9IHIucGlwZWxpbmVfaWRcbiAgICAgIFdIRVJFIHIub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCByLmRheSA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgci5kYXkgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgQU5EIHIuc3RhZ2VfbmFtZSA9ICcnXG4gICAgICBHUk9VUCBCWSBlLmtleSwgci5waXBlbGluZV9pZCwgcC5waXBlbGluZV9uYW1lXG4gICAgKSByYW5rZWRcbiAgICBXSEVSRSBybiA8PSAke3BlckNhdGVnb3J5fVxuICBgKSk7XG4gIGNvbnN0IG91dCA9IG5ldyBNYXA8RmFpbHVyZUNhdGVnb3J5LCBBcnJheTx7IHBpcGVsaW5lSWQ6IHN0cmluZzsgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsOyBjb3VudDogbnVtYmVyIH0+PigpO1xuICBmb3IgKGNvbnN0IHIgb2Ygcm93c09mKHJvd3MpKSB7XG4gICAgY29uc3Qga2V5ID0gci5jYXRlZ29yeSBhcyBGYWlsdXJlQ2F0ZWdvcnk7XG4gICAgY29uc3QgbGlzdCA9IG91dC5nZXQoa2V5KSA/PyBbXTtcbiAgICBsaXN0LnB1c2goe1xuICAgICAgcGlwZWxpbmVJZDogU3RyaW5nKHIucGlwZWxpbmVfaWQpLFxuICAgICAgcGlwZWxpbmVOYW1lOiAoci5waXBlbGluZV9uYW1lIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgICBjb3VudDogbnVtKHIuY291bnQpLFxuICAgIH0pO1xuICAgIG91dC5zZXQoa2V5LCBsaXN0KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogT25lIHN0YWdlJ3MgdGltaW5nLCBmb3IgdGhlIGRyaWxsLWRvd24uICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlUGVyZm9ybWFuY2VSb3cge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgcnVuczogbnVtYmVyO1xuICBwNTBNczogbnVtYmVyIHwgbnVsbDtcbiAgcDk1TXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBDaGFuZ2UgaW4gcDk1IHZzIHRoZSBwcmV2aW91cyBwZXJpb2QsIGFzIGEgcGVyY2VudGFnZS4gKi9cbiAgcDk1Q2hhbmdlUGN0OiBudW1iZXIgfCBudWxsO1xuICBmYWlsZWQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQZXItc3RhZ2UgdGltaW5ncyBmb3Igb25lIHBpcGVsaW5lLCBzbG93ZXN0IGZpcnN0LlxuICpcbiAqIFRoZSBzZWN0aW9uIGEgbGVhZCBvcGVucyBhZnRlciB0aGUgYnJlYWtkb3duIHNheXMgYSBwaXBlbGluZSBnb3Qgc2xvd2VyOiBcIndoaWNoXG4gKiBzdGFnZVwiIGlzIHRoZSBuZXh0IHF1ZXN0aW9uLCBhbmQgYW5zd2VyaW5nIGl0IGZyb20gcmF3IGV2ZW50cyB3b3VsZCBtZWFuIGFcbiAqIHNlY29uZCBzY2FuIG9mIHRoZSBzYW1lIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0YWdlUGVyZm9ybWFuY2UoXG4gIHNjb3BlOiBBbmFseXRpY3NTY29wZSxcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPFN0YWdlUGVyZm9ybWFuY2VSb3dbXT4ge1xuICBjb25zdCBjdXJyZW50ID0gYXdhaXQgc3RhZ2VSb3dzKHNjb3BlLCBwaXBlbGluZUlkKTtcbiAgY29uc3QgcHJpb3I6IE1hcDxzdHJpbmcsIHsgcDk1TXM6IG51bWJlciB8IG51bGwgfT4gPSBwcmV2aW91c1xuICAgID8gbmV3IE1hcCgoYXdhaXQgc3RhZ2VSb3dzKHsgLi4uc2NvcGUsIC4uLnByZXZpb3VzIH0sIHBpcGVsaW5lSWQpKS5tYXAoKHMpID0+IFtzLnN0YWdlTmFtZSwgc10pKVxuICAgIDogbmV3IE1hcCgpO1xuICByZXR1cm4gY3VycmVudC5tYXAoKHMpID0+IHtcbiAgICBjb25zdCBiZWZvcmUgPSBwcmlvci5nZXQocy5zdGFnZU5hbWUpPy5wOTVNcyA/PyBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zLFxuICAgICAgcDk1Q2hhbmdlUGN0OiBiZWZvcmUgJiYgYmVmb3JlID4gMCAmJiBzLnA5NU1zICE9PSBudWxsXG4gICAgICAgID8gTnVtYmVyKCgoKHMucDk1TXMgLSBiZWZvcmUpIC8gYmVmb3JlKSAqIDEwMCkudG9GaXhlZCgxKSlcbiAgICAgICAgOiBudWxsLFxuICAgIH07XG4gIH0pLnNvcnQoKGEsIGIpID0+IChiLnA5NU1zID8/IDApIC0gKGEucDk1TXMgPz8gMCkpO1xufVxuXG5pbnRlcmZhY2UgU3RhZ2VSb3cgeyBzdGFnZU5hbWU6IHN0cmluZzsgcnVuczogbnVtYmVyOyBwNTBNczogbnVtYmVyIHwgbnVsbDsgcDk1TXM6IG51bWJlciB8IG51bGw7IGZhaWxlZDogbnVtYmVyIH1cblxuYXN5bmMgZnVuY3Rpb24gc3RhZ2VSb3dzKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcGlwZWxpbmVJZDogc3RyaW5nKTogUHJvbWlzZTxTdGFnZVJvd1tdPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3Qoe1xuICAgIHN0YWdlTmFtZTogc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLnN0YWdlTmFtZSxcbiAgICBydW5zOiBzcWw8bnVtYmVyPmBTVU0oJHtzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAucnVuc30pOjppbnRgLFxuICAgIGZhaWxlZDogc3FsPG51bWJlcj5gU1VNKCR7c2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLmZhaWxlZH0pOjppbnRgLFxuICAgIC8vIE1BWCBvZiB0aGUgZGFpbHkgcDk1cywgbm90IGFuIGF2ZXJhZ2Ugb2YgcGVyY2VudGlsZXM6IGF2ZXJhZ2luZ1xuICAgIC8vIHBlcmNlbnRpbGVzIGlzIG5vdCBhIHBlcmNlbnRpbGUgb2YgYW55dGhpbmcsIGFuZCB0aGUgd29yc3QgZGF5IGlzIHRoZVxuICAgIC8vIG51bWJlciBzb21lYm9keSB3b3VsZCBhY3Qgb24uXG4gICAgcDUwTXM6IHNxbDxudW1iZXIgfCBudWxsPmBNQVgoJHtzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAucDUwTXN9KTo6aW50YCxcbiAgICBwOTVNczogc3FsPG51bWJlciB8IG51bGw+YE1BWCgke3NjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5wOTVNc30pOjppbnRgLFxuICB9KS5mcm9tKHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cClcbiAgICAud2hlcmUoYW5kKFxuICAgICAgb3JnUHJlZGljYXRlKHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5vcmdJZCwgc2NvcGUpLFxuICAgICAgZXEoc2NoZW1hLmV4ZWN1dGlvbkRhaWx5Um9sbHVwLnBpcGVsaW5lSWQsIHBpcGVsaW5lSWQpLFxuICAgICAgZ3RlKHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5kYXksIG5ldyBEYXRlKHNjb3BlLmZyb20pKSxcbiAgICAgIGx0KHNjaGVtYS5leGVjdXRpb25EYWlseVJvbGx1cC5kYXksIG5ldyBEYXRlKHNjb3BlLnRvKSksXG4gICAgICBzcWxgJHtzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAuc3RhZ2VOYW1lfSA8PiAnJ2AsXG4gICAgKSlcbiAgICAuZ3JvdXBCeShzY2hlbWEuZXhlY3V0aW9uRGFpbHlSb2xsdXAuc3RhZ2VOYW1lKSk7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZVJvdz4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSB7XG4gICAgbWFwLnNldChTdHJpbmcoci5zdGFnZU5hbWUpLCB7XG4gICAgICBzdGFnZU5hbWU6IFN0cmluZyhyLnN0YWdlTmFtZSksXG4gICAgICBydW5zOiBudW0oci5ydW5zKSxcbiAgICAgIGZhaWxlZDogbnVtKHIuZmFpbGVkKSxcbiAgICAgIHA1ME1zOiByLnA1ME1zID09PSBudWxsID8gbnVsbCA6IG51bShyLnA1ME1zKSxcbiAgICAgIHA5NU1zOiByLnA5NU1zID09PSBudWxsID8gbnVsbCA6IG51bShyLnA5NU1zKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gWy4uLm1hcC52YWx1ZXMoKV07XG59XG5cbi8qKiBCdWlsZCB0aW1lIGJ5IHByb2plY3QgYW5kIHBpcGVsaW5lLiBObyBtb25leSBhbnl3aGVyZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VSb3cge1xuICBwcm9qZWN0OiBzdHJpbmcgfCBudWxsO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgYnVpbGRTZWNvbmRzOiBudW1iZXI7XG4gIHJ1bnM6IG51bWJlcjtcbiAgc2hhcmVQY3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGVyZSB0aGUgYnVpbGQgdGltZSB3ZW50LlxuICpcbiAqIFNFQ09ORFMsIE5PVCBET0xMQVJTLiBBIGNvc3QgZmlndXJlIG5lZWRzIHRoZSBpbnN0YW5jZSB0eXBlcywgdGhlIHNwb3Qvb24tZGVtYW5kXG4gKiBtaXggYW5kIHRoZSBhY2NvdW50J3Mgb3duIGRpc2NvdW50cywgbm9uZSBvZiB3aGljaCB0aGlzIHBsYXRmb3JtIGtub3dzIOKAlCBzbyBhXG4gKiBkb2xsYXIgbnVtYmVyIGhlcmUgd291bGQgYmUgYSBndWVzcyBwcmVzZW50ZWQgYXMgYW4gaW52b2ljZS4gQnVpbGQgdGltZSBpcyB0aGVcbiAqIHRoaW5nIGFjdHVhbGx5IG1lYXN1cmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VDb25zdW1wdGlvbihzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0ID0gMjApOiBQcm9taXNlPHtcbiAgcGlwZWxpbmVzOiBSZXNvdXJjZVJvd1tdO1xuICB0b3RhbEJ1aWxkU2Vjb25kczogbnVtYmVyO1xufT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUXG4gICAgICBwLnByb2plY3QsXG4gICAgICByLnBpcGVsaW5lX2lkLFxuICAgICAgcC5waXBlbGluZV9uYW1lLFxuICAgICAgU1VNKHIuYnVpbGRfc2Vjb25kcyk6OmludCBBUyBidWlsZF9zZWNvbmRzLFxuICAgICAgU1VNKHIucnVucyk6OmludCBBUyBydW5zXG4gICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwcyByXG4gICAgTEVGVCBKT0lOIHBpcGVsaW5lcyBwIE9OIHAuaWQ6OnRleHQgPSByLnBpcGVsaW5lX2lkXG4gICAgV0hFUkUgci5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCByLmRheSA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgci5kYXkgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICAgIEFORCByLnN0YWdlX25hbWUgPSAnJ1xuICAgIEdST1VQIEJZIHAucHJvamVjdCwgci5waXBlbGluZV9pZCwgcC5waXBlbGluZV9uYW1lXG4gICAgT1JERVIgQlkgYnVpbGRfc2Vjb25kcyBERVNDXG4gICAgTElNSVQgJHtsaW1pdH1cbiAgYCkpO1xuICBjb25zdCBsaXN0ID0gcm93c09mKHJvd3MpO1xuICBjb25zdCB0b3RhbCA9IGxpc3QucmVkdWNlKChzLCByKSA9PiBzICsgbnVtKHIuYnVpbGRfc2Vjb25kcyksIDApO1xuICByZXR1cm4ge1xuICAgIHRvdGFsQnVpbGRTZWNvbmRzOiB0b3RhbCxcbiAgICBwaXBlbGluZXM6IGxpc3QubWFwKChyKSA9PiAoe1xuICAgICAgcHJvamVjdDogKHIucHJvamVjdCBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgICAgcGlwZWxpbmVJZDogU3RyaW5nKHIucGlwZWxpbmVfaWQpLFxuICAgICAgcGlwZWxpbmVOYW1lOiAoci5waXBlbGluZV9uYW1lIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgICBidWlsZFNlY29uZHM6IG51bShyLmJ1aWxkX3NlY29uZHMpLFxuICAgICAgcnVuczogbnVtKHIucnVucyksXG4gICAgICBzaGFyZVBjdDogdG90YWwgPiAwID8gTnVtYmVyKCgobnVtKHIuYnVpbGRfc2Vjb25kcykgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMSkpIDogMCxcbiAgICB9KSksXG4gIH07XG59XG5cbi8qKiBPbmUgY29tbWl0J3Mgam91cm5leSBhY3Jvc3MgZW52aXJvbm1lbnRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9tb3Rpb25Sb3cge1xuICBjb21taXRTaGE6IHN0cmluZztcbiAgLyoqIEVudmlyb25tZW50IOKGkiB3aGVuIGl0IGxhbmRlZCB0aGVyZSwgaW4gdGhlIG9yZGVyIGl0IHJlYWNoZWQgdGhlbS4gKi9cbiAgc3RvcHM6IEFycmF5PHsgZW52aXJvbm1lbnQ6IHN0cmluZzsgZGVwbG95ZWRBdDogc3RyaW5nOyBob3Vyc0Zyb21QcmV2aW91czogbnVtYmVyIHwgbnVsbCB9PjtcbiAgLyoqIFRydWUgd2hlbiB0aGUgY29tbWl0IHJlYWNoZWQgYSBub24tcHJvZHVjdGlvbiBlbnZpcm9ubWVudCBhbmQgc3RvcHBlZC4gKi9cbiAgc3R1Y2s6IGJvb2xlYW47XG4gIGZ1cnRoZXN0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hlcmUgY29tbWl0cyBnb3QgdG8sIGFuZCB3aGVyZSB0aGV5IHN0b3BwZWQuXG4gKlxuICogXCJTdHVja1wiIGlzIHRoZSBudW1iZXIgd29ydGggcmVhZGluZy4gQSBjb21taXQgdGhhdCByZWFjaGVkIHN0YWdpbmcgZm91ciBkYXlzIGFnb1xuICogYW5kIG5ldmVyIHdlbnQgZnVydGhlciBpcyB3b3JrIHRoYXQgaXMgZmluaXNoZWQgYW5kIG5vdCBkZWxpdmVyZWQg4oCUIHdoaWNoIGRvZXNcbiAqIG5vdCBhcHBlYXIgaW4gZGVwbG95bWVudCBmcmVxdWVuY3ksIHN1Y2Nlc3MgcmF0ZSBvciBsZWFkIHRpbWUsIGJlY2F1c2UgYnkgZXZlcnlcbiAqIG9uZSBvZiB0aG9zZSBtZWFzdXJlcyBub3RoaW5nIGhhcHBlbmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJvbW90aW9uVmlldyhcbiAgc2NvcGU6IEFuYWx5dGljc1Njb3BlLFxuICBwcm9kdWN0aW9uRW52ID0gJ3Byb2R1Y3Rpb24nLFxuICBsaW1pdCA9IDI1LFxuKTogUHJvbWlzZTx7IGNvbW1pdHM6IFByb21vdGlvblJvd1tdOyBzdHVja0NvdW50OiBudW1iZXIgfT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIGNvbW1pdF9zaGEsIGVudmlyb25tZW50LCBNSU4oZGVwbG95ZWRfYXQpIEFTIGRlcGxveWVkX2F0XG4gICAgRlJPTSBkb3JhX2RlcGxveW1lbnRzXG4gICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgZGVwbG95ZWRfYXQgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRlcGxveWVkX2F0IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICBBTkQgc3VjY2VlZGVkID0gdHJ1ZVxuICAgICAgQU5EIGNvbW1pdF9zaGEgSVMgTk9UIE5VTExcbiAgICBHUk9VUCBCWSBjb21taXRfc2hhLCBlbnZpcm9ubWVudFxuICAgIE9SREVSIEJZIE1JTihkZXBsb3llZF9hdCkgREVTQ1xuICBgKSk7XG5cbiAgY29uc3QgYnlDb21taXQgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8eyBlbnZpcm9ubWVudDogc3RyaW5nOyBkZXBsb3llZEF0OiBEYXRlIH0+PigpO1xuICBmb3IgKGNvbnN0IHIgb2Ygcm93c09mKHJvd3MpKSB7XG4gICAgY29uc3Qgc2hhID0gU3RyaW5nKHIuY29tbWl0X3NoYSk7XG4gICAgY29uc3QgbGlzdCA9IGJ5Q29tbWl0LmdldChzaGEpID8/IFtdO1xuICAgIGxpc3QucHVzaCh7IGVudmlyb25tZW50OiBTdHJpbmcoci5lbnZpcm9ubWVudCksIGRlcGxveWVkQXQ6IG5ldyBEYXRlKFN0cmluZyhyLmRlcGxveWVkX2F0KSkgfSk7XG4gICAgYnlDb21taXQuc2V0KHNoYSwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBjb21taXRzOiBQcm9tb3Rpb25Sb3dbXSA9IFsuLi5ieUNvbW1pdC5lbnRyaWVzKCldLm1hcCgoW2NvbW1pdFNoYSwgcmF3XSkgPT4ge1xuICAgIGNvbnN0IG9yZGVyZWQgPSBbLi4ucmF3XS5zb3J0KChhLCBiKSA9PiBhLmRlcGxveWVkQXQuZ2V0VGltZSgpIC0gYi5kZXBsb3llZEF0LmdldFRpbWUoKSk7XG4gICAgY29uc3Qgc3RvcHMgPSBvcmRlcmVkLm1hcCgoc3RvcCwgaSkgPT4gKHtcbiAgICAgIGVudmlyb25tZW50OiBzdG9wLmVudmlyb25tZW50LFxuICAgICAgZGVwbG95ZWRBdDogc3RvcC5kZXBsb3llZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBob3Vyc0Zyb21QcmV2aW91czogaSA9PT0gMFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiBOdW1iZXIoKChzdG9wLmRlcGxveWVkQXQuZ2V0VGltZSgpIC0gKG9yZGVyZWRbaSAtIDFdIGFzIHsgZGVwbG95ZWRBdDogRGF0ZSB9KS5kZXBsb3llZEF0LmdldFRpbWUoKSkgLyAzNjAwXzAwMCkudG9GaXhlZCgxKSksXG4gICAgfSkpO1xuICAgIGNvbnN0IGZ1cnRoZXN0ID0gb3JkZXJlZFtvcmRlcmVkLmxlbmd0aCAtIDFdPy5lbnZpcm9ubWVudCA/PyAnJztcbiAgICByZXR1cm4geyBjb21taXRTaGEsIHN0b3BzLCBmdXJ0aGVzdCwgc3R1Y2s6IGZ1cnRoZXN0ICE9PSBwcm9kdWN0aW9uRW52IH07XG4gIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFMYXN0ID0gYS5zdG9wc1thLnN0b3BzLmxlbmd0aCAtIDFdPy5kZXBsb3llZEF0ID8/ICcnO1xuICAgICAgY29uc3QgYkxhc3QgPSBiLnN0b3BzW2Iuc3RvcHMubGVuZ3RoIC0gMV0/LmRlcGxveWVkQXQgPz8gJyc7XG4gICAgICByZXR1cm4gYkxhc3QubG9jYWxlQ29tcGFyZShhTGFzdCk7XG4gICAgfSlcbiAgICAuc2xpY2UoMCwgbGltaXQpO1xuXG4gIHJldHVybiB7IGNvbW1pdHMsIHN0dWNrQ291bnQ6IGNvbW1pdHMuZmlsdGVyKChjKSA9PiBjLnN0dWNrKS5sZW5ndGggfTtcbn1cblxuLyoqIE91dGRhdGVkIHBsdWdpbiB1c2FnZSwgcGVyIHBpcGVsaW5lIGFuZCBzdGVwLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdXRkYXRlZFBsdWdpblJvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgcGx1Z2luOiBzdHJpbmc7XG4gIGluVXNlOiBzdHJpbmcgfCBudWxsO1xuICBsYXRlc3Q6IHN0cmluZyB8IG51bGw7XG4gIGdhcDogc3RyaW5nIHwgbnVsbDtcbiAgd2l0aGluUG9saWN5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoaWNoIHBpcGVsaW5lcyBhcmUgYmVoaW5kIG9uIGEgcGx1Z2luLCB3b3JzdCBnYXAgZmlyc3QuXG4gKlxuICogUmVhZHMgdGhlIERFQ0xBUkVEIHNpZGUgKGBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbmApLiBBIHBpcGVsaW5lJ3MgZGVjbGFyZWRcbiAqIHJhbmdlIGFuZCB3aGF0IGl0IGxhc3QgYWN0dWFsbHkgcmFuIGNhbiBkaXNhZ3JlZSDigJQgd2hpY2ggaXMgd2h5IHRoZSB2dWxuZXJhYmlsaXR5XG4gKiBzZWN0aW9uIGJlbG93IHJlYWRzIHRoZSBkZXBsb3llZCBzaWRlIGFuZCBzYXlzIHdoaWNoIGl0IGlzIHNob3dpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPdXRkYXRlZFBsdWdpbnMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKTogUHJvbWlzZTx7XG4gIHJvd3M6IE91dGRhdGVkUGx1Z2luUm93W107XG4gIGJlaGluZFBpcGVsaW5lczogbnVtYmVyO1xuICBtYWpvckJlaGluZDogbnVtYmVyO1xufT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUXG4gICAgICByLnBpcGVsaW5lX2lkLCBwLnBpcGVsaW5lX25hbWUsIHIuc3RhZ2VfbmFtZSwgci5zdGVwX25hbWUsXG4gICAgICBDT0FMRVNDRShyLnBsdWdpbl9wdWJsaXNoZXIgfHwgJy8nLCAnJykgfHwgci5wbHVnaW5fbmFtZSBBUyBwbHVnaW4sXG4gICAgICByLnJlc29sdmVkX3ZlcnNpb24sIHIubGF0ZXN0X3ZlcnNpb24sIHIudmVyc2lvbl9nYXAsIHIud2l0aGluX3BvbGljeVxuICAgIEZST00gcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb24gclxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gci5waXBlbGluZV9pZFxuICAgIFdIRVJFIHIub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgKHIudmVyc2lvbl9nYXAgSU4gKCdtYWpvcicsICdtaW5vcicsICdwYXRjaCcpIE9SIHIud2l0aGluX3BvbGljeSA9IGZhbHNlKVxuICAgIE9SREVSIEJZIENBU0Ugci52ZXJzaW9uX2dhcCBXSEVOICdtYWpvcicgVEhFTiAwIFdIRU4gJ21pbm9yJyBUSEVOIDEgV0hFTiAncGF0Y2gnIFRIRU4gMiBFTFNFIDMgRU5ELFxuICAgICAgICAgICAgIHIucGlwZWxpbmVfaWRcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIGNvbnN0IGxpc3QgPSByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBzdGFnZU5hbWU6IFN0cmluZyhyLnN0YWdlX25hbWUpLFxuICAgIHN0ZXBOYW1lOiBTdHJpbmcoci5zdGVwX25hbWUpLFxuICAgIHBsdWdpbjogU3RyaW5nKHIucGx1Z2luKSxcbiAgICBpblVzZTogKHIucmVzb2x2ZWRfdmVyc2lvbiBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIGxhdGVzdDogKHIubGF0ZXN0X3ZlcnNpb24gYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBnYXA6IChyLnZlcnNpb25fZ2FwIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgd2l0aGluUG9saWN5OiByLndpdGhpbl9wb2xpY3kgIT09IGZhbHNlLFxuICB9KSk7XG4gIHJldHVybiB7XG4gICAgcm93czogbGlzdCxcbiAgICBiZWhpbmRQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gICAgbWFqb3JCZWhpbmQ6IGxpc3QuZmlsdGVyKChyKSA9PiByLmdhcCA9PT0gJ21ham9yJykubGVuZ3RoLFxuICB9O1xufVxuXG4vKiogQSBwaXBlbGluZSdzIGV4cG9zdXJlIHRvIGEgdnVsbmVyYWJsZSBwbHVnaW4gdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnVsbmVyYWJpbGl0eVJvdyB7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwbHVnaW46IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICAvKiogYGRlcGxveWVkYCA9IHdoYXQgYWN0dWFsbHkgcmFuOyBgZGVjbGFyZWRgID0gd2hhdCB0aGUgY29uZmlnIGFza3MgZm9yLiAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgY3JpdGljYWw6IG51bWJlcjtcbiAgaGlnaDogbnVtYmVyO1xuICBmaW5kaW5nczogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBmbGFnZ2VkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQbHVnaW4gdnVsbmVyYWJpbGl0aWVzLCBwZXIgcGlwZWxpbmUsIENyaXRpY2FscyBmaXJzdC5cbiAqXG4gKiBTQVlTIFdIRVRIRVIgSVQgSVMgREVDTEFSRUQgT1IgREVQTE9ZRUQuIEEgcGlwZWxpbmUgd2hvc2UgY29uZmlnIHdhcyB1cGRhdGVkIHRvIGFcbiAqIGZpeGVkIHZlcnNpb24gYnV0IHdoaWNoIGhhcyBub3QgcmUtc3ludGhlZCBpcyBzdGlsbCBydW5uaW5nIHRoZSB2dWxuZXJhYmxlIGltYWdlLFxuICogYW5kIGEgcmVwb3J0IHRoYXQgY29sbGFwc2VkIHRoZSB0d28gd291bGQgdGVsbCBhIG1hbmFnZXIgdGhlIHByb2JsZW0gaXMgc29sdmVkXG4gKiB3aGlsZSB0aGUgb2xkIGltYWdlIGtlZXBzIHJ1bm5pbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQbHVnaW5WdWxuZXJhYmlsaXRpZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKTogUHJvbWlzZTx7XG4gIHJvd3M6IFZ1bG5lcmFiaWxpdHlSb3dbXTtcbiAgZXhwb3NlZFBpcGVsaW5lczogbnVtYmVyO1xuICBjcml0aWNhbFBpcGVsaW5lczogbnVtYmVyO1xufT4ge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUXG4gICAgICB2LnBpcGVsaW5lX2lkLCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICBDT0FMRVNDRSh2LnBsdWdpbl9wdWJsaXNoZXIgfHwgJy8nLCAnJykgfHwgdi5wbHVnaW5fbmFtZSBBUyBwbHVnaW4sXG4gICAgICB2LnBsdWdpbl92ZXJzaW9uLCB2LnNvdXJjZSwgdi5jcml0aWNhbF9jb3VudCwgdi5oaWdoX2NvdW50LCB2LnRvcF9maW5kaW5ncywgdi5mbGFnZ2VkX2F0XG4gICAgRlJPTSBwbHVnaW5fdnVsbl9leHBvc3VyZSB2XG4gICAgTEVGVCBKT0lOIHBpcGVsaW5lcyBwIE9OIHAuaWQ6OnRleHQgPSB2LnBpcGVsaW5lX2lkXG4gICAgV0hFUkUgdi5vcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCB2LmZpeGVkX2F0IElTIE5VTExcbiAgICAgIC0tIEFuIGFjY2VwdGFuY2UgcGFzdCBpdHMgZGVhZGxpbmUgaXMgbm90IGFuIGFjY2VwdGFuY2UuXG4gICAgICBBTkQgKHYudHJpYWdlX3N0YXRlIE5PVCBJTiAoJ2FjY2VwdGVkJywgJ2ZhbHNlX3Bvc2l0aXZlJylcbiAgICAgICAgICAgT1IgKHYudHJpYWdlX3N0YXRlID0gJ2FjY2VwdGVkJyBBTkQgdi5hY2NlcHRlZF91bnRpbCBJUyBOT1QgTlVMTCBBTkQgdi5hY2NlcHRlZF91bnRpbCA8PSAke25vd30pKVxuICAgIE9SREVSIEJZIHYuY3JpdGljYWxfY291bnQgREVTQywgdi5oaWdoX2NvdW50IERFU0NcbiAgICBMSU1JVCAke2xpbWl0fVxuICBgKSk7XG4gIGNvbnN0IGxpc3QgPSByb3dzT2Yocm93cykubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBwbHVnaW46IFN0cmluZyhyLnBsdWdpbiksXG4gICAgdmVyc2lvbjogU3RyaW5nKHIucGx1Z2luX3ZlcnNpb24pLFxuICAgIHNvdXJjZTogU3RyaW5nKHIuc291cmNlKSxcbiAgICBjcml0aWNhbDogbnVtKHIuY3JpdGljYWxfY291bnQpLFxuICAgIGhpZ2g6IG51bShyLmhpZ2hfY291bnQpLFxuICAgIGZpbmRpbmdzOiAoci50b3BfZmluZGluZ3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA/PyBbXSxcbiAgICBmbGFnZ2VkQXQ6IGlzb09yTnVsbChyLmZsYWdnZWRfYXQpID8/IG5ldyBEYXRlKDApLnRvSVNPU3RyaW5nKCksXG4gIH0pKTtcbiAgcmV0dXJuIHtcbiAgICByb3dzOiBsaXN0LFxuICAgIGV4cG9zZWRQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gICAgY3JpdGljYWxQaXBlbGluZXM6IG5ldyBTZXQobGlzdC5maWx0ZXIoKHIpID0+IHIuY3JpdGljYWwgPiAwKS5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkpLnNpemUsXG4gIH07XG59XG5cbi8qKiBBZG9wdGlvbiBhbmQgZGVwbG95LXRyYWNraW5nIGNvdmVyYWdlIHdpdGhpbiB0aGUgcmVwb3J0ZWQgc2NvcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkb3B0aW9uU3VtbWFyeSB7XG4gIGFjdGl2ZVBpcGVsaW5lczogbnVtYmVyO1xuICB0b3RhbFBpcGVsaW5lczogbnVtYmVyO1xuICAvKiogUGlwZWxpbmVzIHRoYXQgcHJvZHVjZWQgYSBkZXBsb3kgcm93IOKAlCBpLmUuIG9uZXMgRE9SQSBjYW4gc2VlLiAqL1xuICBkZXBsb3lUcmFja2VkUGlwZWxpbmVzOiBudW1iZXI7XG4gIC8qKiBCeSBgY3JlYXRpb25fc291cmNlYCwgZm9yIFwiYXJlIHRoZSBnb2xkZW4gcGF0aHMgYmVpbmcgdXNlZFwiLiAqL1xuICBieVNvdXJjZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgLyoqIFRlYW1zIGluIHRoZSByb2xsdXAgdGhhdCBoYWQgYWN0aXZpdHkuIDEgZm9yIGEgc2luZ2xlLW9yZyByZXBvcnQuICovXG4gIGFjdGl2ZVRlYW1zOiBudW1iZXI7XG4gIC8qKiBPbmx5IHdoZW4gdGhlIG9yZyBjb25maWd1cmVkIHRoZSBhc3N1bXB0aW9uLiBOZXZlciBwbGF0Zm9ybS1zdXBwbGllZC4gKi9cbiAgZXN0aW1hdGVkTWludXRlc1NhdmVkOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIEFkb3B0aW9uLCBjb3ZlcmFnZSBhbmQgY3JlYXRpb24gc291cmNlLlxuICpcbiAqIGBkZXBsb3lUcmFja2VkUGlwZWxpbmVzYCBpcyB0aGUgaG9uZXN0IGRlbm9taW5hdG9yIGZvciBldmVyeXRoaW5nIERPUkEgc2F5czogYVxuICogcGlwZWxpbmUgdGhhdCBoYXMgbm90IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncyBwcm9kdWNlcyBubyBkZXBsb3kgcm93cywgc28gaXRcbiAqIGlzIGludmlzaWJsZSB0byBkZXBsb3ltZW50IGZyZXF1ZW5jeSDigJQgYW5kIHJlcG9ydGluZyBcIjQgZGVwbG95c1wiIHdpdGhvdXQgc2F5aW5nXG4gKiB0aGF0IDIwIG9mIDMwIHBpcGVsaW5lcyBjYW5ub3QgYmUgc2VlbiBpcyB0aGUgc2luZ2xlIG1vc3QgbWlzbGVhZGluZyB0aGluZyB0aGlzXG4gKiBmZWF0dXJlIGNvdWxkIGRvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWRvcHRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCB0aW1lU2F2ZWRNaW51dGVzPzogbnVtYmVyIHwgbnVsbCk6IFByb21pc2U8QWRvcHRpb25TdW1tYXJ5PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBXSVRIIHNjb3BlZCBBUyAoXG4gICAgICBTRUxFQ1QgaWQ6OnRleHQgQVMgaWQsIG9yZ19pZCwgY3JlYXRpb25fc291cmNlXG4gICAgICBGUk9NIHBpcGVsaW5lc1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkZWxldGVkX2F0IElTIE5VTExcbiAgICApLFxuICAgIGFjdGl2ZSBBUyAoXG4gICAgICBTRUxFQ1QgRElTVElOQ1QgcGlwZWxpbmVfaWQsIG9yZ19pZFxuICAgICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwc1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgc3RhZ2VfbmFtZSA9ICcnIEFORCBydW5zID4gMFxuICAgICksXG4gICAgdHJhY2tlZCBBUyAoXG4gICAgICBTRUxFQ1QgRElTVElOQ1QgcGlwZWxpbmVfaWRcbiAgICAgIEZST00gZG9yYV9kZXBsb3ltZW50c1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkZXBsb3llZF9hdCA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGVwbG95ZWRfYXQgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICApXG4gICAgU0VMRUNUXG4gICAgICAoU0VMRUNUIENPVU5UKCopIEZST00gc2NvcGVkKTo6aW50IEFTIHRvdGFsX3BpcGVsaW5lcyxcbiAgICAgIChTRUxFQ1QgQ09VTlQoKikgRlJPTSBhY3RpdmUpOjppbnQgQVMgYWN0aXZlX3BpcGVsaW5lcyxcbiAgICAgIChTRUxFQ1QgQ09VTlQoRElTVElOQ1Qgb3JnX2lkKSBGUk9NIGFjdGl2ZSk6OmludCBBUyBhY3RpdmVfdGVhbXMsXG4gICAgICAoU0VMRUNUIENPVU5UKCopIEZST00gdHJhY2tlZCk6OmludCBBUyBkZXBsb3lfdHJhY2tlZCxcbiAgICAgIChTRUxFQ1QgQ09BTEVTQ0UoanNvbmJfb2JqZWN0X2FnZyhDT0FMRVNDRShjcmVhdGlvbl9zb3VyY2UsICd1bmtub3duJyksIG4pLCAne30nOjpqc29uYilcbiAgICAgICAgIEZST00gKFNFTEVDVCBjcmVhdGlvbl9zb3VyY2UsIENPVU5UKCopOjppbnQgQVMgbiBGUk9NIHNjb3BlZCBHUk9VUCBCWSBjcmVhdGlvbl9zb3VyY2UpIHNcbiAgICAgICkgQVMgYnlfc291cmNlXG4gIGApKTtcbiAgY29uc3QgciA9IHJvd3NPZihyb3dzKVswXSA/PyB7fTtcbiAgY29uc3QgY3JlYXRlZCA9IG51bShyLnRvdGFsX3BpcGVsaW5lcyk7XG4gIHJldHVybiB7XG4gICAgdG90YWxQaXBlbGluZXM6IGNyZWF0ZWQsXG4gICAgYWN0aXZlUGlwZWxpbmVzOiBudW0oci5hY3RpdmVfcGlwZWxpbmVzKSxcbiAgICBhY3RpdmVUZWFtczogTWF0aC5tYXgoMSwgbnVtKHIuYWN0aXZlX3RlYW1zKSksXG4gICAgZGVwbG95VHJhY2tlZFBpcGVsaW5lczogbnVtKHIuZGVwbG95X3RyYWNrZWQpLFxuICAgIGJ5U291cmNlOiAoci5ieV9zb3VyY2UgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPikgPz8ge30sXG4gICAgLy8gT25seSB3aGVuIHRoZSBPUkcgY29uZmlndXJlZCB0aGUgYXNzdW1wdGlvbiDigJQgYSBwbGF0Zm9ybS1zdXBwbGllZCBudW1iZXJcbiAgICAvLyBoZXJlIHdvdWxkIGJlIHRoZSBwbGF0Zm9ybSBtYXJraW5nIGl0cyBvd24gaG9tZXdvcmsuXG4gICAgZXN0aW1hdGVkTWludXRlc1NhdmVkOiB0aW1lU2F2ZWRNaW51dGVzICYmIHRpbWVTYXZlZE1pbnV0ZXMgPiAwID8gY3JlYXRlZCAqIHRpbWVTYXZlZE1pbnV0ZXMgOiBudWxsLFxuICB9O1xufVxuXG4vKiogT25lIHBpcGVsaW5lJ3MgZmFpbHVyZSBzdHJlYWsgYW5kIGxhc3Qgc3VjY2Vzc2Z1bCBkYXkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lU3RyZWFrUm93IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICAvKipcbiAgICogRmFpbHVyZXMgaW4gdGhlIHRyYWlsaW5nIHJ1biBvZiBkYXlzIG9uIHdoaWNoIE5PVEhJTkcgc3VjY2VlZGVkLlxuICAgKlxuICAgKiBBIExPV0VSIEJPVU5ELCBhbmQgZGVsaWJlcmF0ZWx5IHNvLiBUaGUgcm9sbHVwIGlzIHBlciBkYXksIHNvIHdpdGhpbiB0aGUgbW9zdFxuICAgKiByZWNlbnQgZGF5IHRoYXQgZGlkIGhhdmUgYSBzdWNjZXNzIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIHdoZXRoZXIgdGhlIGZhaWx1cmVzXG4gICAqIGNhbWUgYmVmb3JlIG9yIGFmdGVyIGl0IOKAlCB0aGF0IGRheSBpcyBleGNsdWRlZCByYXRoZXIgdGhhbiBndWVzc2VkIGF0LiBXaGF0XG4gICAqIHN1cnZpdmVzIGlzIGEgcnVuIG9mIGZhaWx1cmVzIHdpdGggbm8gc3VjY2VzcyBhbnl3aGVyZSBiZXR3ZWVuIHRoZW0sIHdoaWNoIGlzXG4gICAqIGV4YWN0bHkgdGhlIGNsYWltIHRoZSBmaW5kaW5nIG1ha2VzLlxuICAgKi9cbiAgY29uc2VjdXRpdmVGYWlsdXJlczogbnVtYmVyO1xuICAvKiogVGhlIGxhc3QgZGF5IHdpdGggYXQgbGVhc3Qgb25lIHN1Y2Nlc3MsIG9yIG51bGwgd2l0aGluIHRoZSBsb29rYmFjay4gKi9cbiAgbGFzdFN1Y2Nlc3NBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogRmFpbHVyZSBzdHJlYWtzIGFuZCBsYXN0LXN1Y2Nlc3MgZGF0ZXMsIGZvciB0aGUgbmVlZHMtYXR0ZW50aW9uIHJ1bGVzLlxuICpcbiAqIFJlYWRzIHRoZSBkYWlseSByb2xsdXAsIG5vdCBgcGlwZWxpbmVfZXZlbnRzYCDigJQgdGhlIHNhbWUgcmVhc29uIGFzIGV2ZXJ5dGhpbmdcbiAqIGVsc2UgaGVyZTogYSBzdHJlYWsgdGhhdCBlbmRlZCB0aHJlZSB3ZWVrcyBhZ28gbXVzdCBzdGlsbCBiZSByZWFkYWJsZSBhZnRlclxuICogcmV0ZW50aW9uIGhhcyBzd2VwdCB0aGUgZXZlbnRzIHRoYXQgcHJvZHVjZWQgaXQuXG4gKlxuICogYGxvb2tiYWNrRGF5c2AgZXh0ZW5kcyBQQVNUIHRoZSB3aW5kb3cgb24gcHVycG9zZS4gXCJMYXN0IHN1Y2NlZWRlZCAxMiBkYXlzIGFnb1wiXG4gKiBpcyB0aGUgZmluZGluZyBhIHdlZWtseSByZXBvcnQgbW9zdCBuZWVkcywgYW5kIGEgcXVlcnkgYm91bmRlZCBieSBhIDctZGF5IHdpbmRvd1xuICogY291bGQgbmV2ZXIgcHJvZHVjZSBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBpcGVsaW5lU3RyZWFrcyhcbiAgc2NvcGU6IEFuYWx5dGljc1Njb3BlLFxuICBsb29rYmFja0RheXMgPSA5MCxcbik6IFByb21pc2U8UGlwZWxpbmVTdHJlYWtSb3dbXT4ge1xuICBjb25zdCBzaW5jZSA9IG5ldyBEYXRlKG5ldyBEYXRlKHNjb3BlLnRvKS5nZXRUaW1lKCkgLSBsb29rYmFja0RheXMgKiA4Nl80MDBfMDAwKS50b0lTT1N0cmluZygpO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgV0lUSCBkYXlzIEFTIChcbiAgICAgIFNFTEVDVCBwaXBlbGluZV9pZCwgZGF5LFxuICAgICAgICAgICAgIFNVTShzdWNjZWVkZWQpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgICAgIFNVTShmYWlsZWQpOjppbnQgICAgQVMgZmFpbGVkXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRheSA+PSAke3NpbmNlfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgR1JPVVAgQlkgcGlwZWxpbmVfaWQsIGRheVxuICAgICksXG4gICAgbGFzdF9vayBBUyAoXG4gICAgICBTRUxFQ1QgcGlwZWxpbmVfaWQsIE1BWChkYXkpIEFTIGxhc3Rfc3VjY2Vzc19kYXlcbiAgICAgIEZST00gZGF5cyBXSEVSRSBzdWNjZWVkZWQgPiAwXG4gICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZFxuICAgIClcbiAgICBTRUxFQ1QgZC5waXBlbGluZV9pZCxcbiAgICAgICAgICAgbC5sYXN0X3N1Y2Nlc3NfZGF5LFxuICAgICAgICAgICBDT0FMRVNDRShTVU0oZC5mYWlsZWQpIEZJTFRFUiAoXG4gICAgICAgICAgICAgV0hFUkUgbC5sYXN0X3N1Y2Nlc3NfZGF5IElTIE5VTEwgT1IgZC5kYXkgPiBsLmxhc3Rfc3VjY2Vzc19kYXlcbiAgICAgICAgICAgKSwgMCk6OmludCBBUyBzdHJlYWtcbiAgICBGUk9NIGRheXMgZFxuICAgIExFRlQgSk9JTiBsYXN0X29rIGwgT04gbC5waXBlbGluZV9pZCA9IGQucGlwZWxpbmVfaWRcbiAgICBHUk9VUCBCWSBkLnBpcGVsaW5lX2lkLCBsLmxhc3Rfc3VjY2Vzc19kYXlcbiAgYCkpO1xuICByZXR1cm4gcm93c09mKHJvd3MpLm1hcCgocikgPT4gKHtcbiAgICBwaXBlbGluZUlkOiBTdHJpbmcoci5waXBlbGluZV9pZCksXG4gICAgY29uc2VjdXRpdmVGYWlsdXJlczogbnVtKHIuc3RyZWFrKSxcbiAgICBsYXN0U3VjY2Vzc0F0OiByLmxhc3Rfc3VjY2Vzc19kYXkgPyBuZXcgRGF0ZShTdHJpbmcoci5sYXN0X3N1Y2Nlc3NfZGF5KSkgOiBudWxsLFxuICB9KSk7XG59XG5cbi8qKlxuICogUGlwZWxpbmVzIHRoYXQgUkFOIGluIHRoZSB3aW5kb3cgYnV0IHByb2R1Y2VkIG5vIGRlcGxveSByb3dzLlxuICpcbiAqIEEgbWVhc3VyZW1lbnQgZ2FwLCBub3QgYSBmYWlsdXJlLCBhbmQgdGhlIHJlYXNvbiBhIGRlcGxveW1lbnQtZnJlcXVlbmN5IG51bWJlciBjYW5cbiAqIGJlIHF1aWV0bHkgd3Jvbmc6IGEgcGlwZWxpbmUgd2hvc2Ugc3ludGggcHJlZGF0ZXMgdGhlIGBwYi5kZXBsb3lzYCB0YWdzIGRlcGxveXNcbiAqIHBlcmZlY3RseSB3ZWxsIGFuZCBpcyBpbnZpc2libGUgdG8gZXZlcnkgRE9SQSBhZ2dyZWdhdGUuIE5vdGhpbmcgZWxzZSBpbiB0aGVcbiAqIHJlcG9ydCB3b3VsZCBzYXkgc28uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVbnRyYWNrZWRQaXBlbGluZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgV0lUSCBhY3RpdmUgQVMgKFxuICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRheSA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEFORCBzdGFnZV9uYW1lID0gJydcbiAgICAgIEdST1VQIEJZIHBpcGVsaW5lX2lkXG4gICAgICBIQVZJTkcgU1VNKHJ1bnMpID4gMFxuICAgICksXG4gICAgdHJhY2tlZCBBUyAoXG4gICAgICBTRUxFQ1QgRElTVElOQ1QgcGlwZWxpbmVfaWRcbiAgICAgIEZST00gZG9yYV9kZXBsb3ltZW50c1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkZXBsb3llZF9hdCA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGVwbG95ZWRfYXQgPCAke3Njb3BlLnRvfTo6dGltZXN0YW1wdHpcbiAgICApXG4gICAgU0VMRUNUIGEucGlwZWxpbmVfaWQgRlJPTSBhY3RpdmUgYVxuICAgIFdIRVJFIE5PVCBFWElTVFMgKFNFTEVDVCAxIEZST00gdHJhY2tlZCB0IFdIRVJFIHQucGlwZWxpbmVfaWQgPSBhLnBpcGVsaW5lX2lkKVxuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiBTdHJpbmcoci5waXBlbGluZV9pZCkpO1xufVxuXG4vKipcbiAqIFBpcGVsaW5lcyBydW5uaW5nIGEgcGx1Z2luIHZlcnNpb24gd2l0aCBhbiBPUEVOIENyaXRpY2FsIGV4cG9zdXJlLlxuICpcbiAqIFBvaW50LWluLXRpbWUsIG5vdCB3aW5kb3dlZDogd2hhdCBtYXR0ZXJzIGlzIHdoZXRoZXIgdGhlIHBpcGVsaW5lIGlzIHJ1bm5pbmcgb25lXG4gKiBOT1cuIEEgQ3JpdGljYWwgdGhhdCB3YXMgb3BlbiBsYXN0IFR1ZXNkYXkgYW5kIGlzIGZpeGVkIHRvZGF5IGlzIG5vdCBzb21ldGhpbmcgdG9cbiAqIHB1dCBpbiBmcm9udCBvZiBhIG1hbmFnZXIsIGFuZCBgZml4ZWRfYXRgIGlzIHdoYXQgc2F5cyBzby5cbiAqXG4gKiBBbiBBQ0NFUFRFRCBleHBvc3VyZSBpcyBleGNsdWRlZC4gU29tZW9uZSB3aXRoIHRoZSBhdXRob3JpdHkgdG8gYWNjZXB0IGEgcmlzayBoYXNcbiAqIGFscmVhZHkgZGVjaWRlZCBhYm91dCBpdCBpbiB3cml0aW5nLCB3aXRoIGEgcmVhc29uIGFuZCBhIGRlYWRsaW5lOyByZS1yYWlzaW5nIGl0XG4gKiB3ZWVrbHkgaXMgaG93IGEgcmVwb3J0IHRlYWNoZXMgaXRzIHJlYWRlciB0byBza2lwIGEgc2VjdGlvbi4gVGhlIGxhcHNlIG9mIHRoYXRcbiAqIGFjY2VwdGFuY2UgaXMgYSBzZXBhcmF0ZSBmaW5kaW5nIChgbGFwc2VkQWNjZXB0YW5jZXNgKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFZ1bG5lcmFibGVQaXBlbGluZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIERJU1RJTkNUIHBpcGVsaW5lX2lkXG4gICAgRlJPTSBwbHVnaW5fdnVsbl9leHBvc3VyZVxuICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gQU5ZKCR7c2NvcGUub3JnSWRzfSlgIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgQU5EIGZpeGVkX2F0IElTIE5VTExcbiAgICAgIEFORCBjcml0aWNhbF9jb3VudCA+IDBcbiAgICAgIEFORCB0cmlhZ2Vfc3RhdGUgPD4gJ2FjY2VwdGVkJ1xuICBgKSk7XG4gIHJldHVybiByb3dzT2Yocm93cykubWFwKChyKSA9PiBTdHJpbmcoci5waXBlbGluZV9pZCkpO1xufVxuXG4vKipcbiAqIFdoZW4gZWFjaCBwaXBlbGluZSBpbiB0aGUgd2luZG93IHdhcyBsYXN0IGNoYW5nZWQuXG4gKlxuICogYHBpcGVsaW5lcy51cGRhdGVkX2F0YCwgbm90IGFuIGF1ZGl0IHF1ZXJ5OiB0aGUgYXVkaXQgdHJhaWwgbGl2ZXMgaW4gYW5vdGhlciBzdG9yZVxuICogd2l0aCBpdHMgb3duIHJldGVudGlvbiwgYW5kIHRoZSBvbmUgZmFjdCB0aGlzIG5lZWRzIOKAlCBcIndhcyB0aGlzIHRvdWNoZWQgc2hvcnRseVxuICogYmVmb3JlIGl0IGJyb2tlXCIg4oCUIGlzIGFscmVhZHkgb24gdGhlIHJvdywgZHVyYWJseSwgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gdGhlXG4gKiBjaGFuZ2Ugd2FzIG1hZGUgaW4uXG4gKlxuICogVGhlIGNvbnNlcXVlbmNlIGlzIHN0YXRlZCByYXRoZXIgdGhhbiBoaWRkZW46IGB1cGRhdGVkX2F0YCBtb3ZlcyBmb3IgQU5ZIHdyaXRlLFxuICogaW5jbHVkaW5nIGEgcmVuYW1lLiBTbyB0aGUgZmluZGluZyBzYXlzIFwiYWZ0ZXIgYSBjb25maWd1cmF0aW9uIGNoYW5nZVwiLCB3aGljaCBpc1xuICogdHJ1ZSBvZiBhIHJlbmFtZSB0b28sIGFuZCBkb2VzIG5vdCBjbGFpbSB0byBuYW1lIHRoZSBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQaXBlbGluZUNvbmZpZ0NoYW5nZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBEYXRlPj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIGlkOjp0ZXh0IEFTIGlkLCB1cGRhdGVkX2F0XG4gICAgRlJPTSBwaXBlbGluZXNcbiAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCBkZWxldGVkX2F0IElTIE5VTExcbiAgICAgIEFORCB1cGRhdGVkX2F0IElTIE5PVCBOVUxMXG4gIGApKTtcbiAgY29uc3Qgb3V0ID0gbmV3IE1hcDxzdHJpbmcsIERhdGU+KCk7XG4gIGZvciAoY29uc3QgciBvZiByb3dzT2Yocm93cykpIHtcbiAgICBjb25zdCBhdCA9IHIudXBkYXRlZF9hdCA/IG5ldyBEYXRlKFN0cmluZyhyLnVwZGF0ZWRfYXQpKSA6IG51bGw7XG4gICAgaWYgKGF0ICYmICFOdW1iZXIuaXNOYU4oYXQuZ2V0VGltZSgpKSkgb3V0LnNldChTdHJpbmcoci5pZCksIGF0KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFJvd3MgZnJvbSBhIHJhdyBgZXhlY3V0ZWAsIHdoaWNoZXZlciBzaGFwZSB0aGUgZHJpdmVyIHJldHVybmVkLiAqL1xuZnVuY3Rpb24gcm93c09mKHJlc3VsdDogdW5rbm93bik6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJldHVybiByZXN1bHQgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCByb3dzID0gKHJlc3VsdCBhcyB7IHJvd3M/OiB1bmtub3duIH0pPy5yb3dzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IDogW107XG59XG5cbi8qKiBBIGNvdW50IGZyb20gYSBkcml2ZXIgdGhhdCBtYXkgaGFuZCBiYWNrIGEgc3RyaW5nIGZvciBhIGJpZ2ludC4gKi9cbmZ1bmN0aW9uIG51bSh2OiB1bmtub3duKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiBOdW1iZXIodiA/PyAwKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiAwO1xufVxuXG5mdW5jdGlvbiBpc29Pck51bGwodjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXYpIHJldHVybiBudWxsO1xuICBjb25zdCBkID0gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUoU3RyaW5nKHYpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZC50b0lTT1N0cmluZygpO1xufVxuIl19
|
|
626
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLXF1ZXJpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9hbmFseXRpY3MtcXVlcmllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBVzdELG1EQUFtRDtBQUNuRCxTQUFTLFlBQVksQ0FBQyxHQUFrQyxFQUFFLEtBQXFCO0lBQzdFLE9BQU8sS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFZLEVBQUUsS0FBSyxDQUFDLEtBQWMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFtQkQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEtBQXFCLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFDMUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7Ozs7Ozs7dUJBVXJDLEtB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Q3RFLFNBQVMsTUFBTSxDQUFDLE1BQWU7SUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sTUFBd0MsQ0FBQztJQUMzRSxNQUFNLElBQUksR0FBSSxNQUE2QixFQUFFLElBQUksQ0FBQztJQUNsRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQXNDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMzRSxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLFNBQVMsR0FBRyxDQUFDLENBQVU7SUFDckIsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsQ0FBVTtJQUMzQixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIHF1ZXJpZXMgdGhlIGJlc3Bva2UgcmVwb3J0IHNlY3Rpb25zIHJlYWQuXG4gKlxuICogQWxsIG9mIHRoZW0gZ28gdGhyb3VnaCBgZXhlY3V0aW9uX2RhaWx5X3JvbGx1cHNgLCBgZG9yYV9kZXBsb3ltZW50c2AsXG4gKiBgcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb25gIG9yIGBwbHVnaW5fdnVsbl9leHBvc3VyZWAg4oCUIG5ldmVyIHJhd1xuICogYHBpcGVsaW5lX2V2ZW50c2AuIFRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRob3NlIHRhYmxlczogYSBxdWFydGVybHkgcmVwb3J0XG4gKiBvdmVyIGEgYnVzeSBvcmcgY29zdHMgYSBmZXcgaHVuZHJlZCByb3dzLCBhbmQga2VlcHMgd29ya2luZyBhZnRlciByZXRlbnRpb24gaGFzXG4gKiBzd2VwdCB0aGUgZXZlbnRzLlxuICpcbiAqIFRXTyBSVUxFUyBFVkVSWSBRVUVSWSBIRVJFIEZPTExPV1M6XG4gKlxuICogIC0gTk9USElORyBJUyBQRVItUEVSU09OLiBFdmVyeSBhZ2dyZWdhdGUgaXMgcGVyIHBpcGVsaW5lLCBwZXIgc3RhZ2UsIHBlclxuICogICAgY2F0ZWdvcnkgb3IgcGVyIGVudmlyb25tZW50LiBUaGUgc2VjdGlvbiByZWdpc3RyeSByZWZ1c2VzIGEgcGVyLXBlcnNvbiBpZCBhdFxuICogICAgcmVnaXN0cmF0aW9uOyB0aGVzZSBxdWVyaWVzIG1ha2Ugc3VyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJlZ2lzdGVyLlxuICogIC0gQSBaRVJPIEFORCBBIEJMSU5EIFNQT1QgQVJFIERJRkZFUkVOVC4gV2hlcmUgYSBudW1iZXIgY2FuIGJlIGFic2VudCBmb3IgbGFja1xuICogICAgb2YgZGF0YSByYXRoZXIgdGhhbiBsYWNrIG9mIGFjdGl2aXR5LCB0aGUgc2hhcGUgY2FycmllcyB0aGF0IChgbnVsbGAsIGFcbiAqICAgIGBjb3ZlcmFnZWAgY291bnQsIGFuIGV4cGxpY2l0IHJlYXNvbikgaW5zdGVhZCBvZiBjb2xsYXBzaW5nIHRvIDAuXG4gKlxuICogUkVBRFMgR08gVE8gVEhFIFJFUExJQ0EgV0hFTiBPTkUgRVhJU1RTLiBFdmVyeSBxdWVyeSBiZWxvdyBydW5zIHRocm91Z2hcbiAqIGB3aXRoVGVuYW50VHhSZWFkYCwgdGhlIHJlYWQtb25seSB2YXJpYW50IG9mIGB3aXRoVGVuYW50VHhgLiBJdCBzZXRzIHRoZVxuICogaWRlbnRpY2FsIFJMUyBHVUNzLCBhZGRzIGBTRVQgVFJBTlNBQ1RJT04gUkVBRCBPTkxZYCwgYW5kIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiBwcmltYXJ5IGF1dG9tYXRpY2FsbHkgd2hlbmV2ZXIgdGhlcmUgaXMgbm8gcmVwbGljYSwgdGhlIGtpbGwgc3dpdGNoIGlzIG9mZixcbiAqIHJlcGxheSBsYWcgaXMgYmV5b25kIGl0cyB0aHJlc2hvbGQsIHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IHdyaXR0ZW4sIG9yIHRoZXJlXG4gKiBpcyBubyB0ZW5hbnQgY29udGV4dCDigJQgc28gdGhpcyBpcyBhIG5vLW9wIHVudGlsIGBEQl9SRUFEX0hPU1RgIGlzIGNvbmZpZ3VyZWQuXG4gKlxuICogV0hZIFRISVMgRklMRSBXQVMgVEhFIEZJUlNUIFRPIE9QVCBJTiAoUGhhc2UgNCBvZlxuICogZG9jcy9wbGFucy9wb3N0Z3Jlcy1yZWFkLXdyaXRlLXNwbGl0Lm1kKS4gSXQgc2F0aXNmaWVzIGFsbCB0aHJlZSBvZiB0aGVcbiAqIHBsYW4ncyBcImxlYXZlIGl0IG9uIHRoZSBwcmltYXJ5XCIgZXhjbHVzaW9ucyBieSBjb25zdHJ1Y3Rpb246XG4gKlxuICogICAtIE5vdGhpbmcgaGVyZSB3cml0ZXMuIFRoaXJ0ZWVuIGFnZ3JlZ2F0ZSBTRUxFQ1RzLCBubyBJTlNFUlQsIG5vIFVQREFURSwgbm9cbiAqICAgICBgU0VMRUNUIOKApiBGT1IgVVBEQVRFYCwgbm8gYWR2aXNvcnkgbG9jayDigJQgc28gbm9uZSBvZiB0aGUgZm91ciBjYWxsIHNpdGVzXG4gKiAgICAgdGhlIFBoYXNlIDBhIGF1ZGl0IGZvdW5kIGhpZGluZyBiZWhpbmQgcmVhZC1sb29raW5nIGNvZGUuXG4gKiAgIC0gTm90aGluZyBoZXJlIGZlZWRzIGFuIEFVVEhPUklaQVRJT04gZGVjaXNpb24uIFRoZXNlIGFyZSBkYXNoYm9hcmRcbiAqICAgICBhZ2dyZWdhdGVzOyBhIHN0YWxlIHBlcm1pc3Npb24gY2hlY2sgaXMgYSBzZWN1cml0eSBidWcsIGEgc3RhbGUgY2hhcnQgaXNcbiAqICAgICBhIHN0YWxlIGNoYXJ0LlxuICogICAtIE5vYm9keSBpcyBhYm91dCB0byBBQ1Qgb24gdGhlIHJlc3VsdC4gQSB1c2VyIHdobyBqdXN0IGNyZWF0ZWQgYSBwaXBlbGluZVxuICogICAgIGxvb2tzIGZvciBpdCBpbiBhIGxpc3QsIG5vdCBpbiBhIDMwLWRheSBmYWlsdXJlLXJhdGUgcm9sbHVwLlxuICpcbiAqIEFuZCBpdCBpcyB0aGUgYmVzdCBvZmZsb2FkIGNhbmRpZGF0ZSBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIHNhZmU6IHRoZXNlXG4gKiBhcmUgdGhlIGhlYXZpZXN0IHF1ZXJpZXMgaW4gdGhlIHBhY2thZ2UsIHNjYW5uaW5nIHRpbWUgcmFuZ2VzIHJhdGhlciB0aGFuXG4gKiBmZXRjaGluZyByb3dzIGJ5IGlkLlxuICpcbiAqIGBTRVQgVFJBTlNBQ1RJT04gUkVBRCBPTkxZYCBhcHBsaWVzIG9uIHRoZSBQUklNQVJZIHBhdGggdG9vLCBzbyBpZiBhIHdyaXRlXG4gKiBpcyBldmVyIGFkZGVkIGJlbG93IGl0IGZhaWxzIGhlcmUsIGxvdWRseSwgcmF0aGVyIHRoYW4gYXQgd2hpY2hldmVyIHRhcmdldFxuICogdGhlIHJlYWQgaGFwcGVuZWQgdG8gbGFuZCBvbi5cbiAqL1xuXG5pbXBvcnQgeyBhbmQsIGVxLCBndGUsIGluQXJyYXksIGx0LCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBGQUlMVVJFX0NBVEVHT1JZX0xBQkVMUywgaXNUZWFtQWN0aW9uYWJsZSB9IGZyb20gJy4vZmFpbHVyZS1jbGFzc2lmaWVyLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB0eXBlIHsgRmFpbHVyZUNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vZGF0YWJhc2Uvc2NoZW1hL3JlcG9ydGluZy1hbmFseXRpY3MuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4UmVhZCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vKiogVGhlIHdpbmRvdyBhbmQgb3JnIHNjb3BlIGV2ZXJ5IHF1ZXJ5IHRha2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXRpY3NTY29wZSB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWAgZm9yIGEgcm9sbHVwOyB1bmRlZmluZWQgPSB0aGlzIG9yZyBvbmx5LiAqL1xuICBvcmdJZHM/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+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVFxuICAgICAgdi5waXBlbGluZV9pZCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgQ09BTEVTQ0Uodi5wbHVnaW5fcHVibGlzaGVyIHx8ICcvJywgJycpIHx8IHYucGx1Z2luX25hbWUgQVMgcGx1Z2luLFxuICAgICAgdi5wbHVnaW5fdmVyc2lvbiwgdi5zb3VyY2UsIHYuY3JpdGljYWxfY291bnQsIHYuaGlnaF9jb3VudCwgdi50b3BfZmluZGluZ3MsIHYuZmxhZ2dlZF9hdFxuICAgIEZST00gcGx1Z2luX3Z1bG5fZXhwb3N1cmUgdlxuICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gdi5waXBlbGluZV9pZFxuICAgIFdIRVJFIHYub3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgdi5maXhlZF9hdCBJUyBOVUxMXG4gICAgICAtLSBBbiBhY2NlcHRhbmNlIHBhc3QgaXRzIGRlYWRsaW5lIGlzIG5vdCBhbiBhY2NlcHRhbmNlLlxuICAgICAgQU5EICh2LnRyaWFnZV9zdGF0ZSBOT1QgSU4gKCdhY2NlcHRlZCcsICdmYWxzZV9wb3NpdGl2ZScpXG4gICAgICAgICAgIE9SICh2LnRyaWFnZV9zdGF0ZSA9ICdhY2NlcHRlZCcgQU5EIHYuYWNjZXB0ZWRfdW50aWwgSVMgTk9UIE5VTEwgQU5EIHYuYWNjZXB0ZWRfdW50aWwgPD0gJHtub3d9KSlcbiAgICBPUkRFUiBCWSB2LmNyaXRpY2FsX2NvdW50IERFU0MsIHYuaGlnaF9jb3VudCBERVNDXG4gICAgTElNSVQgJHtsaW1pdH1cbiAgYCkpO1xuICBjb25zdCBsaXN0ID0gcm93c09mKHJvd3MpLm1hcCgocikgPT4gKHtcbiAgICBwaXBlbGluZUlkOiBTdHJpbmcoci5waXBlbGluZV9pZCksXG4gICAgcGlwZWxpbmVOYW1lOiAoci5waXBlbGluZV9uYW1lIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgcGx1Z2luOiBTdHJpbmcoci5wbHVnaW4pLFxuICAgIHZlcnNpb246IFN0cmluZyhyLnBsdWdpbl92ZXJzaW9uKSxcbiAgICBzb3VyY2U6IFN0cmluZyhyLnNvdXJjZSksXG4gICAgY3JpdGljYWw6IG51bShyLmNyaXRpY2FsX2NvdW50KSxcbiAgICBoaWdoOiBudW0oci5oaWdoX2NvdW50KSxcbiAgICBmaW5kaW5nczogKHIudG9wX2ZpbmRpbmdzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikgPz8gW10sXG4gICAgZmxhZ2dlZEF0OiBpc29Pck51bGwoci5mbGFnZ2VkX2F0KSA/PyBuZXcgRGF0ZSgwKS50b0lTT1N0cmluZygpLFxuICB9KSk7XG4gIHJldHVybiB7XG4gICAgcm93czogbGlzdCxcbiAgICBleHBvc2VkUGlwZWxpbmVzOiBuZXcgU2V0KGxpc3QubWFwKChyKSA9PiByLnBpcGVsaW5lSWQpKS5zaXplLFxuICAgIGNyaXRpY2FsUGlwZWxpbmVzOiBuZXcgU2V0KGxpc3QuZmlsdGVyKChyKSA9PiByLmNyaXRpY2FsID4gMCkubWFwKChyKSA9PiByLnBpcGVsaW5lSWQpKS5zaXplLFxuICB9O1xufVxuXG4vKiogQWRvcHRpb24gYW5kIGRlcGxveS10cmFja2luZyBjb3ZlcmFnZSB3aXRoaW4gdGhlIHJlcG9ydGVkIHNjb3BlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZG9wdGlvblN1bW1hcnkge1xuICBhY3RpdmVQaXBlbGluZXM6IG51bWJlcjtcbiAgdG90YWxQaXBlbGluZXM6IG51bWJlcjtcbiAgLyoqIFBpcGVsaW5lcyB0aGF0IHByb2R1Y2VkIGEgZGVwbG95IHJvdyDigJQgaS5lLiBvbmVzIERPUkEgY2FuIHNlZS4gKi9cbiAgZGVwbG95VHJhY2tlZFBpcGVsaW5lczogbnVtYmVyO1xuICAvKiogQnkgYGNyZWF0aW9uX3NvdXJjZWAsIGZvciBcImFyZSB0aGUgZ29sZGVuIHBhdGhzIGJlaW5nIHVzZWRcIi4gKi9cbiAgYnlTb3VyY2U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIC8qKiBUZWFtcyBpbiB0aGUgcm9sbHVwIHRoYXQgaGFkIGFjdGl2aXR5LiAxIGZvciBhIHNpbmdsZS1vcmcgcmVwb3J0LiAqL1xuICBhY3RpdmVUZWFtczogbnVtYmVyO1xuICAvKiogT25seSB3aGVuIHRoZSBvcmcgY29uZmlndXJlZCB0aGUgYXNzdW1wdGlvbi4gTmV2ZXIgcGxhdGZvcm0tc3VwcGxpZWQuICovXG4gIGVzdGltYXRlZE1pbnV0ZXNTYXZlZDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBBZG9wdGlvbiwgY292ZXJhZ2UgYW5kIGNyZWF0aW9uIHNvdXJjZS5cbiAqXG4gKiBgZGVwbG95VHJhY2tlZFBpcGVsaW5lc2AgaXMgdGhlIGhvbmVzdCBkZW5vbWluYXRvciBmb3IgZXZlcnl0aGluZyBET1JBIHNheXM6IGFcbiAqIHBpcGVsaW5lIHRoYXQgaGFzIG5vdCByZS1zeW50aGVkIHdpdGggZGVwbG95IHRhZ3MgcHJvZHVjZXMgbm8gZGVwbG95IHJvd3MsIHNvIGl0XG4gKiBpcyBpbnZpc2libGUgdG8gZGVwbG95bWVudCBmcmVxdWVuY3kg4oCUIGFuZCByZXBvcnRpbmcgXCI0IGRlcGxveXNcIiB3aXRob3V0IHNheWluZ1xuICogdGhhdCAyMCBvZiAzMCBwaXBlbGluZXMgY2Fubm90IGJlIHNlZW4gaXMgdGhlIHNpbmdsZSBtb3N0IG1pc2xlYWRpbmcgdGhpbmcgdGhpc1xuICogZmVhdHVyZSBjb3VsZCBkby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFkb3B0aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgdGltZVNhdmVkTWludXRlcz86IG51bWJlciB8IG51bGwpOiBQcm9taXNlPEFkb3B0aW9uU3VtbWFyeT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFdJVEggc2NvcGVkIEFTIChcbiAgICAgIFNFTEVDVCBpZDo6dGV4dCBBUyBpZCwgb3JnX2lkLCBjcmVhdGlvbl9zb3VyY2VcbiAgICAgIEZST00gcGlwZWxpbmVzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRlbGV0ZWRfYXQgSVMgTlVMTFxuICAgICksXG4gICAgYWN0aXZlIEFTIChcbiAgICAgIFNFTEVDVCBESVNUSU5DVCBwaXBlbGluZV9pZCwgb3JnX2lkXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRheSA+PSAke3Njb3BlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZGF5IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEFORCBzdGFnZV9uYW1lID0gJycgQU5EIHJ1bnMgPiAwXG4gICAgKSxcbiAgICB0cmFja2VkIEFTIChcbiAgICAgIFNFTEVDVCBESVNUSU5DVCBwaXBlbGluZV9pZFxuICAgICAgRlJPTSBkb3JhX2RlcGxveW1lbnRzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRlcGxveWVkX2F0ID49ICR7c2NvcGUuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBkZXBsb3llZF9hdCA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgIClcbiAgICBTRUxFQ1RcbiAgICAgIChTRUxFQ1QgQ09VTlQoKikgRlJPTSBzY29wZWQpOjppbnQgQVMgdG90YWxfcGlwZWxpbmVzLFxuICAgICAgKFNFTEVDVCBDT1VOVCgqKSBGUk9NIGFjdGl2ZSk6OmludCBBUyBhY3RpdmVfcGlwZWxpbmVzLFxuICAgICAgKFNFTEVDVCBDT1VOVChESVNUSU5DVCBvcmdfaWQpIEZST00gYWN0aXZlKTo6aW50IEFTIGFjdGl2ZV90ZWFtcyxcbiAgICAgIChTRUxFQ1QgQ09VTlQoKikgRlJPTSB0cmFja2VkKTo6aW50IEFTIGRlcGxveV90cmFja2VkLFxuICAgICAgKFNFTEVDVCBDT0FMRVNDRShqc29uYl9vYmplY3RfYWdnKENPQUxFU0NFKGNyZWF0aW9uX3NvdXJjZSwgJ3Vua25vd24nKSwgbiksICd7fSc6Ompzb25iKVxuICAgICAgICAgRlJPTSAoU0VMRUNUIGNyZWF0aW9uX3NvdXJjZSwgQ09VTlQoKik6OmludCBBUyBuIEZST00gc2NvcGVkIEdST1VQIEJZIGNyZWF0aW9uX3NvdXJjZSkgc1xuICAgICAgKSBBUyBieV9zb3VyY2VcbiAgYCkpO1xuICBjb25zdCByID0gcm93c09mKHJvd3MpWzBdID8/IHt9O1xuICBjb25zdCBjcmVhdGVkID0gbnVtKHIudG90YWxfcGlwZWxpbmVzKTtcbiAgcmV0dXJuIHtcbiAgICB0b3RhbFBpcGVsaW5lczogY3JlYXRlZCxcbiAgICBhY3RpdmVQaXBlbGluZXM6IG51bShyLmFjdGl2ZV9waXBlbGluZXMpLFxuICAgIGFjdGl2ZVRlYW1zOiBNYXRoLm1heCgxLCBudW0oci5hY3RpdmVfdGVhbXMpKSxcbiAgICBkZXBsb3lUcmFja2VkUGlwZWxpbmVzOiBudW0oci5kZXBsb3lfdHJhY2tlZCksXG4gICAgYnlTb3VyY2U6IChyLmJ5X3NvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSA/PyB7fSxcbiAgICAvLyBPbmx5IHdoZW4gdGhlIE9SRyBjb25maWd1cmVkIHRoZSBhc3N1bXB0aW9uIOKAlCBhIHBsYXRmb3JtLXN1cHBsaWVkIG51bWJlclxuICAgIC8vIGhlcmUgd291bGQgYmUgdGhlIHBsYXRmb3JtIG1hcmtpbmcgaXRzIG93biBob21ld29yay5cbiAgICBlc3RpbWF0ZWRNaW51dGVzU2F2ZWQ6IHRpbWVTYXZlZE1pbnV0ZXMgJiYgdGltZVNhdmVkTWludXRlcyA+IDAgPyBjcmVhdGVkICogdGltZVNhdmVkTWludXRlcyA6IG51bGwsXG4gIH07XG59XG5cbi8qKiBPbmUgcGlwZWxpbmUncyBmYWlsdXJlIHN0cmVhayBhbmQgbGFzdCBzdWNjZXNzZnVsIGRheS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdHJlYWtSb3cge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGYWlsdXJlcyBpbiB0aGUgdHJhaWxpbmcgcnVuIG9mIGRheXMgb24gd2hpY2ggTk9USElORyBzdWNjZWVkZWQuXG4gICAqXG4gICAqIEEgTE9XRVIgQk9VTkQsIGFuZCBkZWxpYmVyYXRlbHkgc28uIFRoZSByb2xsdXAgaXMgcGVyIGRheSwgc28gd2l0aGluIHRoZSBtb3N0XG4gICAqIHJlY2VudCBkYXkgdGhhdCBkaWQgaGF2ZSBhIHN1Y2Nlc3MgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgd2hldGhlciB0aGUgZmFpbHVyZXNcbiAgICogY2FtZSBiZWZvcmUgb3IgYWZ0ZXIgaXQg4oCUIHRoYXQgZGF5IGlzIGV4Y2x1ZGVkIHJhdGhlciB0aGFuIGd1ZXNzZWQgYXQuIFdoYXRcbiAgICogc3Vydml2ZXMgaXMgYSBydW4gb2YgZmFpbHVyZXMgd2l0aCBubyBzdWNjZXNzIGFueXdoZXJlIGJldHdlZW4gdGhlbSwgd2hpY2ggaXNcbiAgICogZXhhY3RseSB0aGUgY2xhaW0gdGhlIGZpbmRpbmcgbWFrZXMuXG4gICAqL1xuICBjb25zZWN1dGl2ZUZhaWx1cmVzOiBudW1iZXI7XG4gIC8qKiBUaGUgbGFzdCBkYXkgd2l0aCBhdCBsZWFzdCBvbmUgc3VjY2Vzcywgb3IgbnVsbCB3aXRoaW4gdGhlIGxvb2tiYWNrLiAqL1xuICBsYXN0U3VjY2Vzc0F0OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBGYWlsdXJlIHN0cmVha3MgYW5kIGxhc3Qtc3VjY2VzcyBkYXRlcywgZm9yIHRoZSBuZWVkcy1hdHRlbnRpb24gcnVsZXMuXG4gKlxuICogUmVhZHMgdGhlIGRhaWx5IHJvbGx1cCwgbm90IGBwaXBlbGluZV9ldmVudHNgIOKAlCB0aGUgc2FtZSByZWFzb24gYXMgZXZlcnl0aGluZ1xuICogZWxzZSBoZXJlOiBhIHN0cmVhayB0aGF0IGVuZGVkIHRocmVlIHdlZWtzIGFnbyBtdXN0IHN0aWxsIGJlIHJlYWRhYmxlIGFmdGVyXG4gKiByZXRlbnRpb24gaGFzIHN3ZXB0IHRoZSBldmVudHMgdGhhdCBwcm9kdWNlZCBpdC5cbiAqXG4gKiBgbG9va2JhY2tEYXlzYCBleHRlbmRzIFBBU1QgdGhlIHdpbmRvdyBvbiBwdXJwb3NlLiBcIkxhc3Qgc3VjY2VlZGVkIDEyIGRheXMgYWdvXCJcbiAqIGlzIHRoZSBmaW5kaW5nIGEgd2Vla2x5IHJlcG9ydCBtb3N0IG5lZWRzLCBhbmQgYSBxdWVyeSBib3VuZGVkIGJ5IGEgNy1kYXkgd2luZG93XG4gKiBjb3VsZCBuZXZlciBwcm9kdWNlIGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGlwZWxpbmVTdHJlYWtzKFxuICBzY29wZTogQW5hbHl0aWNzU2NvcGUsXG4gIGxvb2tiYWNrRGF5cyA9IDkwLFxuKTogUHJvbWlzZTxQaXBlbGluZVN0cmVha1Jvd1tdPiB7XG4gIGNvbnN0IHNpbmNlID0gbmV3IERhdGUobmV3IERhdGUoc2NvcGUudG8pLmdldFRpbWUoKSAtIGxvb2tiYWNrRGF5cyAqIDg2XzQwMF8wMDApLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgV0lUSCBkYXlzIEFTIChcbiAgICAgIFNFTEVDVCBwaXBlbGluZV9pZCwgZGF5LFxuICAgICAgICAgICAgIFNVTShzdWNjZWVkZWQpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgICAgIFNVTShmYWlsZWQpOjppbnQgICAgQVMgZmFpbGVkXG4gICAgICBGUk9NIGV4ZWN1dGlvbl9kYWlseV9yb2xsdXBzXG4gICAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgICAgQU5EIGRheSA+PSAke3NpbmNlfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgR1JPVVAgQlkgcGlwZWxpbmVfaWQsIGRheVxuICAgICksXG4gICAgbGFzdF9vayBBUyAoXG4gICAgICBTRUxFQ1QgcGlwZWxpbmVfaWQsIE1BWChkYXkpIEFTIGxhc3Rfc3VjY2Vzc19kYXlcbiAgICAgIEZST00gZGF5cyBXSEVSRSBzdWNjZWVkZWQgPiAwXG4gICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZFxuICAgIClcbiAgICBTRUxFQ1QgZC5waXBlbGluZV9pZCxcbiAgICAgICAgICAgbC5sYXN0X3N1Y2Nlc3NfZGF5LFxuICAgICAgICAgICBDT0FMRVNDRShTVU0oZC5mYWlsZWQpIEZJTFRFUiAoXG4gICAgICAgICAgICAgV0hFUkUgbC5sYXN0X3N1Y2Nlc3NfZGF5IElTIE5VTEwgT1IgZC5kYXkgPiBsLmxhc3Rfc3VjY2Vzc19kYXlcbiAgICAgICAgICAgKSwgMCk6OmludCBBUyBzdHJlYWtcbiAgICBGUk9NIGRheXMgZFxuICAgIExFRlQgSk9JTiBsYXN0X29rIGwgT04gbC5waXBlbGluZV9pZCA9IGQucGlwZWxpbmVfaWRcbiAgICBHUk9VUCBCWSBkLnBpcGVsaW5lX2lkLCBsLmxhc3Rfc3VjY2Vzc19kYXlcbiAgYCkpO1xuICByZXR1cm4gcm93c09mKHJvd3MpLm1hcCgocikgPT4gKHtcbiAgICBwaXBlbGluZUlkOiBTdHJpbmcoci5waXBlbGluZV9pZCksXG4gICAgY29uc2VjdXRpdmVGYWlsdXJlczogbnVtKHIuc3RyZWFrKSxcbiAgICBsYXN0U3VjY2Vzc0F0OiByLmxhc3Rfc3VjY2Vzc19kYXkgPyBuZXcgRGF0ZShTdHJpbmcoci5sYXN0X3N1Y2Nlc3NfZGF5KSkgOiBudWxsLFxuICB9KSk7XG59XG5cbi8qKlxuICogUGlwZWxpbmVzIHRoYXQgUkFOIGluIHRoZSB3aW5kb3cgYnV0IHByb2R1Y2VkIG5vIGRlcGxveSByb3dzLlxuICpcbiAqIEEgbWVhc3VyZW1lbnQgZ2FwLCBub3QgYSBmYWlsdXJlLCBhbmQgdGhlIHJlYXNvbiBhIGRlcGxveW1lbnQtZnJlcXVlbmN5IG51bWJlciBjYW5cbiAqIGJlIHF1aWV0bHkgd3Jvbmc6IGEgcGlwZWxpbmUgd2hvc2Ugc3ludGggcHJlZGF0ZXMgdGhlIGBwYi5kZXBsb3lzYCB0YWdzIGRlcGxveXNcbiAqIHBlcmZlY3RseSB3ZWxsIGFuZCBpcyBpbnZpc2libGUgdG8gZXZlcnkgRE9SQSBhZ2dyZWdhdGUuIE5vdGhpbmcgZWxzZSBpbiB0aGVcbiAqIHJlcG9ydCB3b3VsZCBzYXkgc28uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVbnRyYWNrZWRQaXBlbGluZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4UmVhZCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFdJVEggYWN0aXZlIEFTIChcbiAgICAgIFNFTEVDVCBwaXBlbGluZV9pZFxuICAgICAgRlJPTSBleGVjdXRpb25fZGFpbHlfcm9sbHVwc1xuICAgICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICAgIEFORCBkYXkgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRheSA8ICR7c2NvcGUudG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBBTkQgc3RhZ2VfbmFtZSA9ICcnXG4gICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZFxuICAgICAgSEFWSU5HIFNVTShydW5zKSA+IDBcbiAgICApLFxuICAgIHRyYWNrZWQgQVMgKFxuICAgICAgU0VMRUNUIERJU1RJTkNUIHBpcGVsaW5lX2lkXG4gICAgICBGUk9NIGRvcmFfZGVwbG95bWVudHNcbiAgICAgIFdIRVJFIG9yZ19pZCAke3Njb3BlLm9yZ0lkcz8ubGVuZ3RoID8gc3FsYD0gQU5ZKCR7c2NvcGUub3JnSWRzfSlgIDogc3FsYD0gJHtzY29wZS5vcmdJZH1gfVxuICAgICAgICBBTkQgZGVwbG95ZWRfYXQgPj0gJHtzY29wZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGRlcGxveWVkX2F0IDwgJHtzY29wZS50b306OnRpbWVzdGFtcHR6XG4gICAgKVxuICAgIFNFTEVDVCBhLnBpcGVsaW5lX2lkIEZST00gYWN0aXZlIGFcbiAgICBXSEVSRSBOT1QgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIHRyYWNrZWQgdCBXSEVSRSB0LnBpcGVsaW5lX2lkID0gYS5waXBlbGluZV9pZClcbiAgYCkpO1xuICByZXR1cm4gcm93c09mKHJvd3MpLm1hcCgocikgPT4gU3RyaW5nKHIucGlwZWxpbmVfaWQpKTtcbn1cblxuLyoqXG4gKiBQaXBlbGluZXMgcnVubmluZyBhIHBsdWdpbiB2ZXJzaW9uIHdpdGggYW4gT1BFTiBDcml0aWNhbCBleHBvc3VyZS5cbiAqXG4gKiBQb2ludC1pbi10aW1lLCBub3Qgd2luZG93ZWQ6IHdoYXQgbWF0dGVycyBpcyB3aGV0aGVyIHRoZSBwaXBlbGluZSBpcyBydW5uaW5nIG9uZVxuICogTk9XLiBBIENyaXRpY2FsIHRoYXQgd2FzIG9wZW4gbGFzdCBUdWVzZGF5IGFuZCBpcyBmaXhlZCB0b2RheSBpcyBub3Qgc29tZXRoaW5nIHRvXG4gKiBwdXQgaW4gZnJvbnQgb2YgYSBtYW5hZ2VyLCBhbmQgYGZpeGVkX2F0YCBpcyB3aGF0IHNheXMgc28uXG4gKlxuICogQW4gQUNDRVBURUQgZXhwb3N1cmUgaXMgZXhjbHVkZWQuIFNvbWVvbmUgd2l0aCB0aGUgYXV0aG9yaXR5IHRvIGFjY2VwdCBhIHJpc2sgaGFzXG4gKiBhbHJlYWR5IGRlY2lkZWQgYWJvdXQgaXQgaW4gd3JpdGluZywgd2l0aCBhIHJlYXNvbiBhbmQgYSBkZWFkbGluZTsgcmUtcmFpc2luZyBpdFxuICogd2Vla2x5IGlzIGhvdyBhIHJlcG9ydCB0ZWFjaGVzIGl0cyByZWFkZXIgdG8gc2tpcCBhIHNlY3Rpb24uIFRoZSBsYXBzZSBvZiB0aGF0XG4gKiBhY2NlcHRhbmNlIGlzIGEgc2VwYXJhdGUgZmluZGluZyAoYGxhcHNlZEFjY2VwdGFuY2VzYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRWdWxuZXJhYmxlUGlwZWxpbmVzKHNjb3BlOiBBbmFseXRpY3NTY29wZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeFJlYWQoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBTRUxFQ1QgRElTVElOQ1QgcGlwZWxpbmVfaWRcbiAgICBGUk9NIHBsdWdpbl92dWxuX2V4cG9zdXJlXG4gICAgV0hFUkUgb3JnX2lkICR7c2NvcGUub3JnSWRzPy5sZW5ndGggPyBzcWxgPSBBTlkoJHtzY29wZS5vcmdJZHN9KWAgOiBzcWxgPSAke3Njb3BlLm9yZ0lkfWB9XG4gICAgICBBTkQgZml4ZWRfYXQgSVMgTlVMTFxuICAgICAgQU5EIGNyaXRpY2FsX2NvdW50ID4gMFxuICAgICAgQU5EIHRyaWFnZV9zdGF0ZSA8PiAnYWNjZXB0ZWQnXG4gIGApKTtcbiAgcmV0dXJuIHJvd3NPZihyb3dzKS5tYXAoKHIpID0+IFN0cmluZyhyLnBpcGVsaW5lX2lkKSk7XG59XG5cbi8qKlxuICogV2hlbiBlYWNoIHBpcGVsaW5lIGluIHRoZSB3aW5kb3cgd2FzIGxhc3QgY2hhbmdlZC5cbiAqXG4gKiBgcGlwZWxpbmVzLnVwZGF0ZWRfYXRgLCBub3QgYW4gYXVkaXQgcXVlcnk6IHRoZSBhdWRpdCB0cmFpbCBsaXZlcyBpbiBhbm90aGVyIHN0b3JlXG4gKiB3aXRoIGl0cyBvd24gcmV0ZW50aW9uLCBhbmQgdGhlIG9uZSBmYWN0IHRoaXMgbmVlZHMg4oCUIFwid2FzIHRoaXMgdG91Y2hlZCBzaG9ydGx5XG4gKiBiZWZvcmUgaXQgYnJva2VcIiDigJQgaXMgYWxyZWFkeSBvbiB0aGUgcm93LCBkdXJhYmx5LCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiB0aGVcbiAqIGNoYW5nZSB3YXMgbWFkZSBpbi5cbiAqXG4gKiBUaGUgY29uc2VxdWVuY2UgaXMgc3RhdGVkIHJhdGhlciB0aGFuIGhpZGRlbjogYHVwZGF0ZWRfYXRgIG1vdmVzIGZvciBBTlkgd3JpdGUsXG4gKiBpbmNsdWRpbmcgYSByZW5hbWUuIFNvIHRoZSBmaW5kaW5nIHNheXMgXCJhZnRlciBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlXCIsIHdoaWNoIGlzXG4gKiB0cnVlIG9mIGEgcmVuYW1lIHRvbywgYW5kIGRvZXMgbm90IGNsYWltIHRvIG5hbWUgdGhlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBpcGVsaW5lQ29uZmlnQ2hhbmdlcyhzY29wZTogQW5hbHl0aWNzU2NvcGUpOiBQcm9taXNlPE1hcDxzdHJpbmcsIERhdGU+PiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHhSZWFkKCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgU0VMRUNUIGlkOjp0ZXh0IEFTIGlkLCB1cGRhdGVkX2F0XG4gICAgRlJPTSBwaXBlbGluZXNcbiAgICBXSEVSRSBvcmdfaWQgJHtzY29wZS5vcmdJZHM/Lmxlbmd0aCA/IHNxbGA9IEFOWSgke3Njb3BlLm9yZ0lkc30pYCA6IHNxbGA9ICR7c2NvcGUub3JnSWR9YH1cbiAgICAgIEFORCBkZWxldGVkX2F0IElTIE5VTExcbiAgICAgIEFORCB1cGRhdGVkX2F0IElTIE5PVCBOVUxMXG4gIGApKTtcbiAgY29uc3Qgb3V0ID0gbmV3IE1hcDxzdHJpbmcsIERhdGU+KCk7XG4gIGZvciAoY29uc3QgciBvZiByb3dzT2Yocm93cykpIHtcbiAgICBjb25zdCBhdCA9IHIudXBkYXRlZF9hdCA/IG5ldyBEYXRlKFN0cmluZyhyLnVwZGF0ZWRfYXQpKSA6IG51bGw7XG4gICAgaWYgKGF0ICYmICFOdW1iZXIuaXNOYU4oYXQuZ2V0VGltZSgpKSkgb3V0LnNldChTdHJpbmcoci5pZCksIGF0KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFJvd3MgZnJvbSBhIHJhdyBgZXhlY3V0ZWAsIHdoaWNoZXZlciBzaGFwZSB0aGUgZHJpdmVyIHJldHVybmVkLiAqL1xuZnVuY3Rpb24gcm93c09mKHJlc3VsdDogdW5rbm93bik6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJldHVybiByZXN1bHQgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCByb3dzID0gKHJlc3VsdCBhcyB7IHJvd3M/OiB1bmtub3duIH0pPy5yb3dzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShyb3dzKSA/IHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IDogW107XG59XG5cbi8qKiBBIGNvdW50IGZyb20gYSBkcml2ZXIgdGhhdCBtYXkgaGFuZCBiYWNrIGEgc3RyaW5nIGZvciBhIGJpZ2ludC4gKi9cbmZ1bmN0aW9uIG51bSh2OiB1bmtub3duKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiBOdW1iZXIodiA/PyAwKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiAwO1xufVxuXG5mdW5jdGlvbiBpc29Pck51bGwodjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXYpIHJldHVybiBudWxsO1xuICBjb25zdCBkID0gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUoU3RyaW5nKHYpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZC50b0lTT1N0cmluZygpO1xufVxuIl19
|
package/lib/database/index.d.ts
CHANGED
|
@@ -3,4 +3,6 @@ export { getSslConfig, getConnection, closeConnection, testConnection, type Conn
|
|
|
3
3
|
export * from './retry-strategy.js';
|
|
4
4
|
export * from './tenancy.js';
|
|
5
5
|
export * from './public-reader.js';
|
|
6
|
+
export * from './read-connection.js';
|
|
7
|
+
export * from './read-lag.js';
|
|
6
8
|
export { isUniqueViolation, resultRows, executeRows, type SqlExecutor, } from './pg-result.js';
|
package/lib/database/index.js
CHANGED
|
@@ -7,5 +7,9 @@ export { getSslConfig, getConnection, closeConnection, testConnection, Connectio
|
|
|
7
7
|
export * from './retry-strategy.js';
|
|
8
8
|
export * from './tenancy.js';
|
|
9
9
|
export * from './public-reader.js';
|
|
10
|
+
// The read-replica pool. Exported alongside public-reader because they are the
|
|
11
|
+
// same shape: a second, smaller pool with a narrower remit than the primary.
|
|
12
|
+
export * from './read-connection.js';
|
|
13
|
+
export * from './read-lag.js';
|
|
10
14
|
export { isUniqueViolation, resultRows, executeRows, } from './pg-result.js';
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsTUFBTSxFQU1OLE1BQU0sRUFJTixRQUFRLEVBQ1IsZ0JBQWdCLEVBRWhCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFFBQVEsRUFDUixZQUFZLEVBS1osZ0JBQWdCLEVBTWhCLE9BQU8sRUFJUCxpQkFBaUIsRUFRakIsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMseUJBQXlCLEVBU3pCLFNBQVMsRUFDVCxjQUFjO0FBQ2Qsc0JBQXNCO0FBQ3RCLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLGVBQWUsRUFlZixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBTWxCLG1CQUFtQixFQUNuQixZQUFZLEVBSVosZUFBZSxFQUlmLDZCQUE2QixFQUU3Qix3QkFBd0IsRUFReEIsd0JBQXdCLEVBT3hCLFNBQVMsRUFDVCxhQUFhLEVBRWIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCx5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLDBCQUEwQixHQStCM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixlQUFlLEVBQ2YsY0FBYyxFQUVkLFVBQVUsRUFDVixFQUFFLEdBQ0gsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsR0FFWixNQUFNLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHNjaGVtYSxcbiAgdHlwZSBQbHVnaW5TZWNyZXQsXG4gIHR5cGUgSW1hZ2VTb3VyY2UsXG4gIHR5cGUgUGx1Z2luTGlmZWN5Y2xlLFxuICB0eXBlIFBsdWdpbkNvbnRyYWN0VmFsdWVUeXBlLFxuICB0eXBlIFBsdWdpbkljb24sXG4gIHBsdWdpbixcbiAgdHlwZSBQbHVnaW4sXG4gIHR5cGUgUGx1Z2luSW5zZXJ0LFxuICB0eXBlIFBsdWdpblVwZGF0ZSxcbiAgcGlwZWxpbmUsXG4gIHBpcGVsaW5lUmVnaXN0cnksXG4gIHR5cGUgRXZlbnRTb3VyY2UsXG4gIHBpcGVsaW5lRXZlbnQsXG4gIGRlcGxveW1lbnRPdXRjb21lLFxuICBpbmdlc3RIZWFsdGgsXG4gIGluY2lkZW50LFxuICBkb3JhU2V0dGluZ3MsXG4gIHR5cGUgUGlwZWxpbmUsXG4gIHR5cGUgUGlwZWxpbmVJbnNlcnQsXG4gIHR5cGUgSW5jaWRlbnQsXG4gIHR5cGUgUGlwZWxpbmVVcGRhdGUsXG4gIHBpcGVsaW5lVGVtcGxhdGUsXG4gIHR5cGUgUGlwZWxpbmVUZW1wbGF0ZSxcbiAgdHlwZSBQaXBlbGluZVRlbXBsYXRlSW5zZXJ0LFxuICB0eXBlIFBpcGVsaW5lVGVtcGxhdGVVcGRhdGUsXG4gIHR5cGUgTWVzc2FnZVR5cGUsXG4gIHR5cGUgTWVzc2FnZVByaW9yaXR5LFxuICBtZXNzYWdlLFxuICB0eXBlIE1lc3NhZ2UsXG4gIHR5cGUgTWVzc2FnZUluc2VydCxcbiAgdHlwZSBNZXNzYWdlVXBkYXRlLFxuICBtZXNzYWdlQXR0YWNobWVudCxcbiAgdHlwZSBNZXNzYWdlQXR0YWNobWVudCxcbiAgdHlwZSBSdWxlU2V2ZXJpdHksXG4gIHR5cGUgUnVsZVRhcmdldCxcbiAgdHlwZSBSdWxlT3BlcmF0b3IsXG4gIHR5cGUgUnVsZUNvbmRpdGlvbk1vZGUsXG4gIHR5cGUgUnVsZVNjb3BlLFxuICB0eXBlIFJ1bGVDb25kaXRpb24sXG4gIGNvbXBsaWFuY2VQb2xpY3ksXG4gIGNvbXBsaWFuY2VSdWxlLFxuICBjb21wbGlhbmNlUnVsZUhpc3RvcnksXG4gIGNvbXBsaWFuY2VBdWRpdExvZyxcbiAgY29tcGxpYW5jZUV4ZW1wdGlvbixcbiAgY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24sXG4gIGNvbXBsaWFuY2VTY2FuLFxuICBjb21wbGlhbmNlU2NhblNjaGVkdWxlLFxuICBjb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZyxcbiAgdHlwZSBDb21wbGlhbmNlUG9saWN5LFxuICB0eXBlIENvbXBsaWFuY2VQb2xpY3lJbnNlcnQsXG4gIHR5cGUgQ29tcGxpYW5jZVJ1bGUsXG4gIHR5cGUgQ29tcGxpYW5jZVJ1bGVJbnNlcnQsXG4gIHR5cGUgQ29tcGxpYW5jZUV4ZW1wdGlvbixcbiAgdHlwZSBDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbixcbiAgdHlwZSBDb21wbGlhbmNlU2NhbixcbiAgdHlwZSBDb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSxcbiAgZGFzaGJvYXJkLFxuICBkYXNoYm9hcmRQYW5lbCxcbiAgLy8gU3Rha2Vob2xkZXIgcmVwb3J0c1xuICByZXBvcnREZWZpbml0aW9uLFxuICByZXBvcnRSdW4sXG4gIHJlcG9ydFNoYXJlTGluayxcbiAgcmVwb3J0UmVjaXBpZW50LFxuICB0eXBlIFJlcG9ydERlZmluaXRpb24sXG4gIHR5cGUgUmVwb3J0RGVmaW5pdGlvbkluc2VydCxcbiAgdHlwZSBSZXBvcnRSdW4sXG4gIHR5cGUgUmVwb3J0UnVuSW5zZXJ0LFxuICB0eXBlIFJlcG9ydFNoYXJlTGluayxcbiAgdHlwZSBSZXBvcnRTaGFyZUxpbmtJbnNlcnQsXG4gIHR5cGUgUmVwb3J0UmVjaXBpZW50LFxuICB0eXBlIFJlcG9ydFJlY2lwaWVudEluc2VydCxcbiAgdHlwZSBSZXBvcnRDYWRlbmNlLFxuICB0eXBlIFJlcG9ydFRlbXBsYXRlLFxuICB0eXBlIFJlcG9ydFJ1blN0YXR1cyxcbiAgdHlwZSBSZXBvcnRQYXVzZVJlYXNvbixcbiAgdHlwZSBSZXBvcnRTY29wZSxcbiAgdHlwZSBSZXBvcnRTY29wZUtpbmQsXG4gIFJFUE9SVF9DQURFTkNFUyxcbiAgUkVQT1JUX1RFTVBMQVRFUyxcbiAgUkVQT1JUX1JVTl9TVEFUVVNFUyxcbiAgUkVQT1JUX1BBVVNFX1JFQVNPTlMsXG4gIFJFUE9SVF9TQ09QRV9LSU5EUyxcbiAgdHlwZSBEYXNoYm9hcmQsXG4gIHR5cGUgRGFzaGJvYXJkSW5zZXJ0LFxuICB0eXBlIERhc2hib2FyZFVwZGF0ZSxcbiAgdHlwZSBEYXNoYm9hcmRQYW5lbCxcbiAgdHlwZSBEYXNoYm9hcmRQYW5lbEluc2VydCxcbiAgb3JnQWxlcnREZXN0aW5hdGlvbixcbiAgb3JnQWxlcnRSdWxlLFxuICB0eXBlIE9yZ0FsZXJ0RGVzdGluYXRpb24sXG4gIHR5cGUgT3JnQWxlcnREZXN0aW5hdGlvbkluc2VydCxcbiAgdHlwZSBIZWFsdGhCcmVha2Rvd24sXG4gIFBVQkxJU0hFUl9USUVSUyxcbiAgdHlwZSBQdWJsaXNoZXJUaWVyLFxuICB0eXBlIFB1Ymxpc2hSZXF1ZXN0S2luZCxcbiAgdHlwZSBQdWJsaXNoUmVxdWVzdFN0YXR1cyxcbiAgT1BFTl9QVUJMSVNIX1JFUVVFU1RfU1RBVFVTRVMsXG4gIHR5cGUgUHVibGlzaFJlcXVlc3RMYW5lLFxuICBJTlNUQUxMX1ZFUlNJT05fUE9MSUNJRVMsXG4gIHR5cGUgSW5zdGFsbFZlcnNpb25Qb2xpY3ksXG4gIHR5cGUgSW5zdGFsbFN0YXR1cyxcbiAgdHlwZSBJbnN0YWxsQ2hhbmdlUmVxdWVzdCxcbiAgdHlwZSBCbG9ja09uQWR2aXNvcnksXG4gIHR5cGUgT2ZmaWNpYWxJbnN0YWxscyxcbiAgdHlwZSBSZXZpZXdTdGF0dXMsXG4gIHR5cGUgUmV2aWV3SG9sZFJlYXNvbixcbiAgUkVWSUVXX1JFUE9SVF9DQVRFR09SSUVTLFxuICB0eXBlIFJldmlld1JlcG9ydENhdGVnb3J5LFxuICB0eXBlIEFkdmlzb3J5U2V2ZXJpdHksXG4gIHR5cGUgQWR2aXNvcnlTdGF0ZSxcbiAgdHlwZSBBZHZpc29yeVNvdXJjZSxcbiAgdHlwZSBTdWJtaXNzaW9uQ2F0YWxvZyxcbiAgdHlwZSBTdWJtaXNzaW9uU3RhdHVzLFxuICBwdWJsaXNoZXIsXG4gIHBsdWdpbkxpc3RpbmcsXG4gIHR5cGUgTGlzdGluZ1ZlcnNpb25TcGVjU25hcHNob3QsXG4gIHBsdWdpbkxpc3RpbmdWZXJzaW9uLFxuICBwbHVnaW5BZHZpc29yeSxcbiAgZWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZSxcbiAgcGx1Z2luUHVibGlzaFJlcXVlc3QsXG4gIGVjb3N5c3RlbVJlc2VydmVkTmFtZSxcbiAgZWNvc3lzdGVtU2V0dGluZyxcbiAgcGx1Z2luUmV2aWV3LFxuICBwbHVnaW5SZXZpZXdSZXBseSxcbiAgcGx1Z2luUmV2aWV3UmVwb3J0LFxuICBwbHVnaW5SZXZpZXdWb3RlLFxuICBwbHVnaW5SZXZpZXdIaXN0b3J5LFxuICBwbHVnaW5TdGF0cyxcbiAgcGx1Z2luU3VibWlzc2lvbixcbiAgZWNvc3lzdGVtU2VhcmNoTWlzcyxcbiAgZWNvc3lzdGVtTm90aWZpY2F0aW9uUXVldWUsXG4gIHBpcGVsaW5lU3RlcE1hbmlmZXN0LFxuICBwbHVnaW5JbnN0YWxsLFxuICBwbHVnaW5JbnN0YWxsUG9saWN5LFxuICBwbHVnaW5BZHZpc29yeURlbGl2ZXJ5LFxuICBwbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvblByZWYsXG4gIHB1YmxpY0xpc3RpbmdzLFxuICBwdWJsaWNMaXN0ZWRWZXJzaW9ucyxcbiAgcHVibGljQWR2aXNvcmllcyxcbiAgcHVibGljUmV2aWV3cyxcbiAgT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSxcbiAgQ09NTVVOSVRZX1BVQkxJU0hFUl9IQU5ETEUsXG4gIHR5cGUgUHVibGlzaGVyLFxuICB0eXBlIFB1Ymxpc2hlckluc2VydCxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nLFxuICB0eXBlIFBsdWdpbkxpc3RpbmdJbnNlcnQsXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb24sXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb25JbnNlcnQsXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnksXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnlJbnNlcnQsXG4gIHR5cGUgRWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZSxcbiAgdHlwZSBFY29zeXN0ZW1BdXRvQXBwcm92YWxSdWxlSW5zZXJ0LFxuICB0eXBlIFBsdWdpblB1Ymxpc2hSZXF1ZXN0LFxuICB0eXBlIFBsdWdpblB1Ymxpc2hSZXF1ZXN0SW5zZXJ0LFxuICB0eXBlIEVjb3N5c3RlbVJlc2VydmVkTmFtZSxcbiAgdHlwZSBQbHVnaW5SZXZpZXcsXG4gIHR5cGUgUGx1Z2luUmV2aWV3SW5zZXJ0LFxuICB0eXBlIFBsdWdpblJldmlld1JlcGx5LFxuICB0eXBlIFBsdWdpblJldmlld1JlcGx5SW5zZXJ0LFxuICB0eXBlIFBsdWdpblJldmlld1JlcG9ydCxcbiAgdHlwZSBQbHVnaW5SZXZpZXdSZXBvcnRJbnNlcnQsXG4gIHR5cGUgUGx1Z2luUmV2aWV3SGlzdG9yeUluc2VydCxcbiAgdHlwZSBQbHVnaW5TdGF0cyxcbiAgdHlwZSBQbHVnaW5TdGF0c0luc2VydCxcbiAgdHlwZSBQbHVnaW5TdWJtaXNzaW9uLFxuICB0eXBlIFBsdWdpblN1Ym1pc3Npb25JbnNlcnQsXG4gIHR5cGUgUGx1Z2luSW5zdGFsbCxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsSW5zZXJ0LFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUGx1Z2luSW5zdGFsbFBvbGljeUluc2VydCxcbiAgdHlwZSBQbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvblByZWYsXG4gIHR5cGUgUHVibGljUmV2aWV3LFxufSBmcm9tICcuL2RyaXp6bGUtc2NoZW1hLmpzJztcbmV4cG9ydCB7XG4gIGdldFNzbENvbmZpZyxcbiAgZ2V0Q29ubmVjdGlvbixcbiAgY2xvc2VDb25uZWN0aW9uLFxuICB0ZXN0Q29ubmVjdGlvbixcbiAgdHlwZSBDb25uZWN0aW9uT3B0aW9ucyxcbiAgQ29ubmVjdGlvbixcbiAgZGIsXG59IGZyb20gJy4vcG9zdGdyZXMtY29ubmVjdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGVuYW5jeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1yZWFkZXIuanMnO1xuLy8gVGhlIHJlYWQtcmVwbGljYSBwb29sLiBFeHBvcnRlZCBhbG9uZ3NpZGUgcHVibGljLXJlYWRlciBiZWNhdXNlIHRoZXkgYXJlIHRoZVxuLy8gc2FtZSBzaGFwZTogYSBzZWNvbmQsIHNtYWxsZXIgcG9vbCB3aXRoIGEgbmFycm93ZXIgcmVtaXQgdGhhbiB0aGUgcHJpbWFyeS5cbmV4cG9ydCAqIGZyb20gJy4vcmVhZC1jb25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhZC1sYWcuanMnO1xuZXhwb3J0IHtcbiAgaXNVbmlxdWVWaW9sYXRpb24sXG4gIHJlc3VsdFJvd3MsXG4gIGV4ZWN1dGVSb3dzLFxuICB0eXBlIFNxbEV4ZWN1dG9yLFxufSBmcm9tICcuL3BnLXJlc3VsdC5qcyc7XG4iXX0=
|