@pipeline-builder/pipeline-data 3.4.96 → 3.4.97

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.
@@ -280,7 +280,10 @@ export declare class ReportingService {
280
280
  */
281
281
  private runReport;
282
282
  /** 1.1 Execution count per pipeline with status breakdown. */
283
- getExecutionCount(orgId: string, orgIds?: string[]): Promise<ExecutionCount[]>;
283
+ getExecutionCount(orgId: string, orgIds?: string[], range?: {
284
+ from?: string;
285
+ to?: string;
286
+ }): Promise<ExecutionCount[]>;
284
287
  /**
285
288
  * 1.1b Per-pipeline execution history — DISTINCT executions for one pipeline,
286
289
  * newest first. Groups all events by `execution_id` in a single scan and
@@ -71,6 +71,14 @@ function doraLevelForLeadTime(medianSeconds) {
71
71
  return 'medium';
72
72
  return 'low';
73
73
  }
74
+ /**
75
+ * Round `value` to `digits` decimal places, returning a real number. Small
76
+ * module-private helper so the DORA shaping doesn't repeat the
77
+ * `Number(Number(x).toFixed(n))` pattern (toFixed alone yields a string).
78
+ */
79
+ function round(value, digits) {
80
+ return Number(value.toFixed(digits));
81
+ }
74
82
  /**
75
83
  * Shared per-execution terminal-status roll-up for the DORA `execs` CTEs:
76
84
  * FAILED wins, then SUCCEEDED, else CANCELED/STOPPED. Kept in one place so
@@ -297,8 +305,17 @@ export class ReportingService {
297
305
  : timeseriesCache.getOrSet(cacheKey, exec);
298
306
  }
299
307
  /** 1.1 Execution count per pipeline with status breakdown. */
300
- async getExecutionCount(orgId, orgIds) {
308
+ async getExecutionCount(orgId, orgIds, range) {
301
309
  const { pred, multi } = this.orgScope(orgId, orgIds);
310
+ // Optional [from,to] window on the execution's started_at, mirroring the
311
+ // sibling timeseries reports so the dashboard date-range picker narrows the
312
+ // count too (an empty range = all-time, preserving the prior behavior). The
313
+ // range rides the JOIN so pipelines with no in-window events still list
314
+ // (LEFT semantics preserved via the inner-join filter — a pipeline with zero
315
+ // matching events drops from the count, same as before for its window).
316
+ const rangeClause = range?.from && range?.to
317
+ ? sql `AND e.started_at >= ${range.from}::timestamptz AND e.started_at <= ${range.to}::timestamptz`
318
+ : sql ``;
302
319
  const exec = () => withTenantTx((tx) => tx.execute(sql `
303
320
  SELECT
304
321
  p.id, p.project, p.organization, p.pipeline_name,
@@ -311,11 +328,12 @@ export class ReportingService {
311
328
  FROM ${schema.pipeline} p
312
329
  JOIN ${schema.pipelineEvent} e ON e.pipeline_id = p.id
313
330
  AND e.event_type = 'PIPELINE' AND e.status != 'STARTED'
331
+ ${rangeClause}
314
332
  WHERE p.org_id ${pred} AND p.is_active = true
315
333
  GROUP BY p.id
316
334
  ORDER BY total DESC
317
335
  `).then(r => drizzleRows(r.rows)));
318
- return this.runReport(`${orgId}:exec-count`, multi, exec);
336
+ return this.runReport(`${orgId}:exec-count:${range?.from ?? ''}:${range?.to ?? ''}`, multi, exec);
319
337
  }
320
338
  /**
321
339
  * 1.1b Per-pipeline execution history — DISTINCT executions for one pipeline,
@@ -600,7 +618,13 @@ export class ReportingService {
600
618
  mttr.avg_seconds AS mttr_avg_seconds
601
619
  FROM df, cfr, lt, mttr
602
620
  `).then(r => this.shapeDora(drizzleRows(r.rows)[0], from, to, basis, { pipelineId, environment })));
603
- const key = `${orgId}:dora:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${deploysOnly ? 'd' : ''}`;
621
+ // `environment` WINS over `deploysOnly` in doraScopeClauses, so with an
622
+ // environment set the deploysOnly flag never affects the SQL — append the
623
+ // 'd' marker only when it genuinely changes the query (environment absent),
624
+ // otherwise `{environment:'prod', deploysOnly:true}` would mint a redundant
625
+ // cache entry identical to `{environment:'prod'}`.
626
+ const deployMarker = !environment && deploysOnly ? 'd' : '';
627
+ const key = `${orgId}:dora:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${deployMarker}`;
604
628
  return this.runReport(key, multi, exec);
605
629
  }
606
630
  /** Shape a single DORA aggregate row into the public {@link DoraMetrics}. */
@@ -621,28 +645,34 @@ export class ReportingService {
621
645
  // mislabel exact weekly/monthly boundaries (e.g. 1 deploy / 30 days →
622
646
  // 0.0333 rounds to 0.03 < 1/30 → wrongly "low" instead of "medium").
623
647
  const rawPerDay = deployments / days;
624
- const perDay = Number(rawPerDay.toFixed(2));
648
+ const perDay = round(rawPerDay, 2);
625
649
  const failed = Number(r.cfr_failed) || 0;
626
650
  const total = Number(r.cfr_total) || 0;
627
651
  const rawPct = total > 0 ? (failed / total) * 100 : 0;
628
- const pct = Number(rawPct.toFixed(1));
652
+ const pct = round(rawPct, 1);
653
+ // Band restore/lead-time on the RAW (pre-round) seconds, the same "band on
654
+ // the unrounded value" principle used for perDay/pct above; keep the rounded
655
+ // values for the response fields. Immaterial at the hour/day thresholds, but
656
+ // it makes the principle uniform across all four metrics.
629
657
  const failures = Number(r.mttr_failures) || 0;
630
658
  const restored = Number(r.mttr_restored) || 0;
631
- const avgSeconds = failures > 0 && r.mttr_avg_seconds != null
632
- ? Number(Number(r.mttr_avg_seconds).toFixed(1))
659
+ const rawAvgSeconds = failures > 0 && r.mttr_avg_seconds != null
660
+ ? Number(r.mttr_avg_seconds)
633
661
  : null;
662
+ const avgSeconds = rawAvgSeconds != null ? round(rawAvgSeconds, 1) : null;
634
663
  const ltDeployments = Number(r.lt_deployments) || 0;
635
- const medianSeconds = r.lt_median_ms != null
636
- ? Number((Number(r.lt_median_ms) / 1000).toFixed(1))
664
+ const rawMedianSeconds = r.lt_median_ms != null
665
+ ? Number(r.lt_median_ms) / 1000
637
666
  : null;
667
+ const medianSeconds = rawMedianSeconds != null ? round(rawMedianSeconds, 1) : null;
638
668
  return {
639
669
  window: { from, to },
640
670
  basis,
641
671
  filters: { pipelineId: filters.pipelineId ?? null, environment: filters.environment ?? null },
642
672
  deploymentFrequency: { deployments, perDay, level: doraLevelForFrequency(rawPerDay, deployments) },
643
673
  changeFailureRate: { failed, total, pct, level: doraLevelForChangeFailure(rawPct, total) },
644
- meanTimeToRestore: { failures, restored, avgSeconds, level: doraLevelForRestore(avgSeconds) },
645
- leadTime: { deployments: ltDeployments, medianSeconds, approx: true, level: doraLevelForLeadTime(medianSeconds) },
674
+ meanTimeToRestore: { failures, restored, avgSeconds, level: doraLevelForRestore(rawAvgSeconds) },
675
+ leadTime: { deployments: ltDeployments, medianSeconds, approx: true, level: doraLevelForLeadTime(rawMedianSeconds) },
646
676
  };
647
677
  }
648
678
  /**
@@ -683,7 +713,11 @@ export class ReportingService {
683
713
  FROM execs
684
714
  GROUP BY period ORDER BY period
685
715
  `).then(r => drizzleRows(r.rows)));
686
- const key = `${orgId}:dora-trend:${interval}:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${deploysOnly ? 'd' : ''}`;
716
+ // Omit the deploysOnly marker when environment is set: it wins in
717
+ // doraScopeClauses, so the SQL (and thus the correct cache key) is identical
718
+ // to the environment-only case. Only append 'd' when it changes the query.
719
+ const deployMarker = !environment && deploysOnly ? 'd' : '';
720
+ const key = `${orgId}:dora-trend:${interval}:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${deployMarker}`;
687
721
  return this.runReport(key, multi, exec);
688
722
  }
689
723
  // ── Category 2: Plugin Inventory & Builds ──
@@ -792,4 +826,4 @@ export class ReportingService {
792
826
  }
793
827
  }
794
828
  export const reportingService = new ReportingService();
795
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoSixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixJQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hILE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQXdIekgsK0VBQStFO0FBQy9FOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFtQnpDLDZFQUE2RTtBQUM3RSw0REFBNEQ7QUFDNUQsd0ZBQXdGO0FBQ3hGLFNBQVMscUJBQXFCLENBQUMsTUFBYyxFQUFFLFdBQW1CO0lBQ2hFLElBQUksV0FBVyxJQUFJLENBQUM7UUFBRSxP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LE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsMkVBQTJFO1FBQzNFLHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLElBQUksSUFBSTtZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLElBQUks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QUUsR0FBRyxFQUFFLENBQ3JGLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7OztlQU0xQixNQUFNLENBQUMsYUFBYTsyQkFDUixLQUFLO2dDQUNBLElBQUkscUNBQXFDLEVBQUU7OztnQkFHM0QsS0FBSztPQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDakQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVDYWNoZVNlcnZpY2UsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBzY3J1YkF3c0lkZW50aWZpZXJzLCBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGluQXJyYXksIHNxbCwgdHlwZSBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4vY3J1ZC1zZXJ2aWNlLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGZvciByZXBvcnRpbmcgYWdncmVnYXRpb25zLiBUd28gdGllcnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVEwg4oCUIGNoYW5nZXMgb24gcGx1Z2luIENSVURcbiAqIC0gRXhlY3V0aW9uL2J1aWxkIHF1ZXJpZXMgd2l0aCBkYXRlIHJhbmdlczogMiBtaW4gVFRMIOKAlCBuZXcgZXZlbnRzIGFycml2ZSBjb250aW51b3VzbHlcbiAqL1xuY29uc3QgaW52ZW50b3J5Q2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDppbnY6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9JTlZFTlRPUlkgfHwgJzMwMCcsIDEwKSk7XG5jb25zdCB0aW1lc2VyaWVzQ2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDp0czonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX1RJTUVTRVJJRVMgfHwgJzEyMCcsIDEwKSk7XG5cbi8vIOKUgOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRHVyYXRpb25TdGF0cyB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBhdmdNczogbnVtYmVyO1xuICBtaW5NczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBwOTVNczogbnVtYmVyO1xuICBleGVjdXRpb25zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIFN0YWdlRmFpbHVyZSB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTdGFnZUJvdHRsZW5lY2sge1xuICBpZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXJyb3JFbnRyeSB7XG4gIGVycm9yUGF0dGVybjogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBhZmZlY3RlZFBpcGVsaW5lczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luU3VtbWFyeSB7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGFjdGl2ZTogbnVtYmVyO1xuICBpbmFjdGl2ZTogbnVtYmVyO1xuICBwdWJsaWM6IG51bWJlcjtcbiAgcHJpdmF0ZTogbnVtYmVyO1xuICB1bmlxdWVOYW1lczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVHlwZUNvbXB1dGVEaXN0cmlidXRpb24ge1xuICBwbHVnaW5UeXBlOiBzdHJpbmc7XG4gIGNvbXB1dGVUeXBlOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBCdWlsZFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRHVyYXRpb24ge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIGJ1aWxkczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqIFJhdyBzaW5nbGUtcm93IHNoYXBlIHJldHVybmVkIGJ5IHRoZSBET1JBIGFnZ3JlZ2F0ZSBxdWVyeSAocHJlLXNoYXBpbmcpLiAqL1xuLyoqXG4gKiBIb3cgZmFyIHBhc3QgdGhlIHJlcG9ydCdzIGB0b2AgYm91bmQgdGhlIERPUkEgTVRUUiBxdWVyeSBtYXkgbG9vayBmb3IgYVxuICogZmFpbHVyZSdzIHJlY292ZXJpbmcgcnVuLiBCb3VuZHMgdGhlIHNjYW4gd2hpbGUgc3RvcHBpbmcgYSBmYWlsdXJlIG5lYXIgdGhlXG4gKiB3aW5kb3cgZWRnZSBmcm9tIGJlaW5nIHNwdXJpb3VzbHkgc2NvcmVkIFwibmV2ZXIgcmVzdG9yZWRcIi4gQSBmYWlsdXJlIHRoYXRcbiAqIGhhcyBub3QgcmVjb3ZlcmVkIHdpdGhpbiB0aGlzIHdpbmRvdyBzdGF5cyBjb3VudGVkIGFzIGFuIG9wZW4gaW5jaWRlbnQuXG4gKi9cbmNvbnN0IE1UVFJfUkVTVE9SRV9MT09LQUhFQUQgPSAnMzAgZGF5cyc7XG5cbi8qKlxuICogRE9SQSBwZXJmb3JtYW5jZSBiYW5kLiBgbnVsbGAgPSBpbnN1ZmZpY2llbnQgZGF0YSB0byBjbGFzc2lmeSAobm9cbiAqIGRlcGxveW1lbnRzL2ZhaWx1cmVzL2xlYWQtdGltZSBzYW1wbGUgaW4gdGhlIHdpbmRvdyksIHNvIHRoZSBVSSBzaG93cyBhXG4gKiBuZXV0cmFsIHN0YXRlIHJhdGhlciB0aGFuIG1pc2xhYmVsaW5nIGFuIGVtcHR5IHdpbmRvdyBhcyBcImxvd1wiLlxuICovXG5leHBvcnQgdHlwZSBEb3JhTGV2ZWwgPSAnZWxpdGUnIHwgJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyB8IG51bGw7XG5cbi8qKiBPcHRpb25hbCBzY29waW5nIGZvciB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXREb3JhTWV0cmljc30uICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFPcHRpb25zIHtcbiAgLyoqIFJlc3RyaWN0IHRvIGEgc2luZ2xlIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSkuICovXG4gIHBpcGVsaW5lSWQ/OiBzdHJpbmc7XG4gIC8qKiBDb3VudCBvbmx5IGV4ZWN1dGlvbnMgZGVwbG95ZWQgdG8gdGhpcyBlbnZpcm9ubWVudCAoZGVwbG95LXNjb3BlZCkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKiogQ291bnQgb25seSBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIEFOWSBlbnZpcm9ubWVudCAocmVhbCBkZXBsb3ltZW50cykuICovXG4gIGRlcGxveXNPbmx5PzogYm9vbGVhbjtcbn1cblxuLy8gRE9SQSBwZXJmb3JtYW5jZSBiYW5kcyAodGhyZXNob2xkcyBmcm9tIHRoZSBET1JBL0FjY2VsZXJhdGUgcmVwb3J0cykuIEVhY2hcbi8vIGhlbHBlciByZXR1cm5zIGBudWxsYCB3aGVuIHRoZXJlJ3Mgbm8gc2FtcGxlIHRvIGNsYXNzaWZ5LlxuLyoqIERlcGxveW1lbnQgZnJlcXVlbmN5IGJ5IGRlcGxveXMvZGF5OiBlbGl0ZSDiiaUxL2RheSwgaGlnaCDiiaUxL3dlZWssIG1lZGl1bSDiiaUxL21vbnRoLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yRnJlcXVlbmN5KHBlckRheTogbnVtYmVyLCBkZXBsb3ltZW50czogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKGRlcGxveW1lbnRzIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGVyRGF5ID49IDEpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGVyRGF5ID49IDEgLyA3KSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGVyRGF5ID49IDEgLyAzMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogQ2hhbmdlIGZhaWx1cmUgcmF0ZSBieSBwZXJjZW50OiBlbGl0ZSDiiaQ1JSwgaGlnaCDiiaQxMCUsIG1lZGl1bSDiiaQxNSUuICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlKHBjdDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKHRvdGFsIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGN0IDw9IDUpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGN0IDw9IDEwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGN0IDw9IDE1KSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cbi8qKiBUaW1lIHRvIHJlc3RvcmUgYnkgc2Vjb25kczogZWxpdGUgPDFoLCBoaWdoIDwxIGRheSwgbWVkaXVtIDwxIHdlZWsuICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JSZXN0b3JlKGF2Z1NlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAoYXZnU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKGF2Z1NlY29uZHMgPCAzNjAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIExlYWQgdGltZSBieSBzZWNvbmRzOiBlbGl0ZSA8MSBkYXksIGhpZ2ggPDEgd2VlaywgbWVkaXVtIDwxIG1vbnRoLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yTGVhZFRpbWUobWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChtZWRpYW5TZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnaGlnaCc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgMjU5MjAwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG5cbi8qKlxuICogU2hhcmVkIHBlci1leGVjdXRpb24gdGVybWluYWwtc3RhdHVzIHJvbGwtdXAgZm9yIHRoZSBET1JBIGBleGVjc2AgQ1RFczpcbiAqIEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgZWxzZSBDQU5DRUxFRC9TVE9QUEVELiBLZXB0IGluIG9uZSBwbGFjZSBzb1xuICogZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBjYW4ndCBkcmlmdCBvbiB0aGUgcHJlY2VkZW5jZS5cbiAqL1xuY29uc3QgRE9SQV9URVJNSU5BTF9TVEFUVVNfQ0FTRSA9IHNxbGBcbiAgICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ0ZBSUxFRCdcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgICAgRUxTRSAnQ0FOQ0VMRUQnXG4gICAgICAgICAgICBFTkRgO1xuXG4vKipcbiAqIE9wdGlvbmFsIHBlci1waXBlbGluZSAvIGRlcGxveS1zY29waW5nIHByZWRpY2F0ZXMgKyB0aGUgcmVzdWx0aW5nIGBiYXNpc2AsXG4gKiBzaGFyZWQgYnkgZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBzbyB0aGUgZW52L2RlcGxveXNPbmx5IHByZWNlZGVuY2VcbiAqIGNhbid0IGRpdmVyZ2UuIGBlbnZpcm9ubWVudGAgKG9uZSB0YXJnZXQpIHdpbnMgb3ZlciBgZGVwbG95c09ubHlgIChhbnkgZW52KS5cbiAqL1xuZnVuY3Rpb24gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzOiBEb3JhT3B0aW9ucykge1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50LCBkZXBsb3lzT25seSB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgZGVwbG95Q2xhdXNlID0gZW52aXJvbm1lbnRcbiAgICA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YFxuICAgIDogZGVwbG95c09ubHkgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExgIDogc3FsYGA7XG4gIGNvbnN0IGJhc2lzOiAnZGVwbG95JyB8ICdydW4nID0gZW52aXJvbm1lbnQgfHwgZGVwbG95c09ubHkgPyAnZGVwbG95JyA6ICdydW4nO1xuICByZXR1cm4geyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBiYXNpcyB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBgZXhlY3NgIENURSBib2R5IOKAlCB0aGUgcGVyLWV4ZWN1dGlvbiB0ZXJtaW5hbCByb2xsLXVwIHRoYXQgQk9USCBET1JBXG4gKiBtZXRob2RzIHNjYW4uIE9ubHkgdGhlIFNFTEVDVGVkIGNvbHVtbnMgYW5kIHRoZSB1cHBlciByYW5nZSBib3VuZCBkaWZmZXJcbiAqIChnZXREb3JhTWV0cmljcyBuZWVkcyBwaXBlbGluZV9pZC9lbmRlZF9hdC9kdXJhdGlvbl9tcyBwbHVzIGEgbG9vay1haGVhZCB0YWlsXG4gKiBmb3IgTVRUUiByZWNvdmVyeTsgZ2V0RG9yYVRyZW5kIG5lZWRzIG9ubHkgc3RhcnRlZF9hdCBvdmVyIHRoZSBjb3JlIHdpbmRvdyksXG4gKiBzbyB0aG9zZSBhcmUgdGhlIHBhcmFtZXRlcnMuIFRoZSBgZXZlbnRfdHlwZT0nUElQRUxJTkUnYCBnYXRlLCB0aGVcbiAqIFNVQ0NFRURFRC9GQUlMRUQvQ0FOQ0VMRUQvU1RPUFBFRCBzdGF0dXMgc2V0LCB0aGUgYGV4ZWN1dGlvbl9pZGAgZmlsdGVyLCB0aGVcbiAqIG9yZyArIGRlcGxveS9waXBlbGluZSBzY29wZSBjbGF1c2VzLCBhbmQgdGhlIGBHUk9VUCBCWWAgYWxsIGxpdmUgaGVyZSBzbyB0aGVcbiAqIHR3byBjYWxsZXJzIGNhbid0IGRyaWZ0IG9uIHRoZSBzdGF0dXMgc2V0IG9yIHRoZSBwcmVkaWNhdGUuXG4gKlxuICogQHBhcmFtIGNvbHVtbnMgIHRyYWlsaW5nIFNFTEVDVCBjb2x1bW5zIChhZnRlciBgZS5leGVjdXRpb25faWQsYClcbiAqIEBwYXJhbSB0b0JvdW5kICB0aGUgYDw9YCB1cHBlci1ib3VuZCBleHByZXNzaW9uIG9uIGBlLnN0YXJ0ZWRfYXRgXG4gKiAgICAgICAgICAgICAgICAgKGNvcmUgd2luZG93IGZvciB0aGUgdHJlbmQ7IGNvcmUgKyBsb29rLWFoZWFkIGZvciBtZXRyaWNzKVxuICovXG5mdW5jdGlvbiBleGVjc0N0ZShhcmdzOiB7XG4gIHByZWQ6IFNRTDtcbiAgY29sdW1uczogU1FMO1xuICBwaXBlbGluZUNsYXVzZTogU1FMO1xuICBkZXBsb3lDbGF1c2U6IFNRTDtcbiAgZnJvbTogc3RyaW5nO1xuICB0b0JvdW5kOiBTUUw7XG59KTogU1FMIHtcbiAgY29uc3QgeyBwcmVkLCBjb2x1bW5zLCBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBmcm9tLCB0b0JvdW5kIH0gPSBhcmdzO1xuICByZXR1cm4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke2NvbHVtbnN9XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICAtLSBTVE9QUEVEIChtYW51YWxseSBhYm9ydGVkKSBqb2lucyBDQU5DRUxFRCBpbiB0aGUgRUxTRSBidWNrZXQ7IGJvdGhcbiAgICAgICAgICAtLSBhcmUgdGVybWluYWwgbm9uLWRlcGxveSBvdXRjb21lcy4gU1VQRVJTRURFRCBzdGF5cyBleGNsdWRlZCAoYVxuICAgICAgICAgIC0tIHJlcGxhY2VkIGV4ZWN1dGlvbiwgbm90IGFuIG91dGNvbWUpLlxuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnLCAnU1RPUFBFRCcpXG4gICAgICAgICAgQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX1cbiAgICAgICAgICAke2RlcGxveUNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6XG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvQm91bmR9XG4gICAgICAgIEdST1VQIEJZIGUuZXhlY3V0aW9uX2lkLCBlLnBpcGVsaW5lX2lkYDtcbn1cblxuaW50ZXJmYWNlIERvcmFSb3cge1xuICBkZl9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNmcl9mYWlsZWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjZnJfdG90YWw/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBsdF9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGx0X21lZGlhbl9tcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIG10dHJfZmFpbHVyZXM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBtdHRyX3Jlc3RvcmVkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbXR0cl9hdmdfc2Vjb25kcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBBIFwiZGVwbG95bWVudFwiIGlzIGEgVEVSTUlOQUwgcGlwZWxpbmUtbGV2ZWwgZXZlbnQsIHJvbGxlZCB1cCB0byBvbmUgcm93IHBlclxuICogYGV4ZWN1dGlvbl9pZGAgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRC9TVE9QUEVEIOKAlCBzYW1lXG4gKiBwcmVjZWRlbmNlIGFzIGBsaXN0UGlwZWxpbmVFeGVjdXRpb25zYCkuXG4gKlxuICogRElTQ0xPU1VSRSDigJQgdGhlc2UgYXJlIFJVTi1CQVNFRCBhcHByb3hpbWF0aW9ucyBvZiBET1JBLiBBIFwiZGVwbG95bWVudFwiIGhlcmVcbiAqIGlzIGFueSBzdWNjZXNzZnVsIHBpcGVsaW5lIFJVTiwgbm90IGEgdmVyaWZpZWQgcHJvZHVjdGlvbiBkZXBsb3ltZW50OiB0aGVcbiAqIGV2ZW50IHN0cmVhbSBjYXJyaWVzIG5vIGRlcGxveS1zdGFnZS9lbnZpcm9ubWVudCBtYXJrZXIsIHNvIGEgQ0ktb25seVxuICogYnVpbGQvdGVzdCBwaXBlbGluZSBjb3VudHMgdGhlIHNhbWUgYXMgb25lIHRoYXQgc2hpcHMgdG8gcHJvZC4gVGhhdCBtYWtlc1xuICogYGRlcGxveW1lbnRGcmVxdWVuY3lgIGEgcGlwZWxpbmUtdGhyb3VnaHB1dCBzaWduYWwgYW5kIGBjaGFuZ2VGYWlsdXJlUmF0ZWAgYVxuICogcGlwZWxpbmUtZmFpbHVyZSByYXRlIChidWlsZC90ZXN0IGZhaWx1cmVzIGNhdWdodCBpbiBDSSBjb3VudCB0b28pLCBhbmQgTVRUUlxuICogYSBwaXBlbGluZS1yZWNvdmVyeSB0aW1lLiBPbmx5IGBsZWFkVGltZWAgY2FycmllcyBhbiBleHBsaWNpdCBgYXBwcm94YCBmbGFnXG4gKiAoaXQgaXMgYWRkaXRpb25hbGx5IGEgcnVuLXRpbWUgcHJveHkpLCBidXQgQUxMIGZvdXIgc2hhcmUgdGhlIHJ1buKJoGRlcGxveVxuICogY2F2ZWF0IHVudGlsIGRlcGxveS9jb21taXQgbWV0YWRhdGEgaXMgY2FwdHVyZWQuIFNlZSBkb2NzL2RvcmEtbWV0cmljcy5tZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhTWV0cmljcyB7XG4gIC8qKiBUaGUgW2Zyb20sdG9dIHdpbmRvdyBlY2hvZWQgYmFjayAoc3RhcnRlZF9hdCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG51bWJlcnMgY291bnQgcmVhbCBkZXBsb3ltZW50cyBvciBwaXBlbGluZSBydW5zOlxuICAgKiAtIGAnZGVwbG95J2Ag4oCUIHNjb3BlZCB0byBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGEgZGVwbG95IGBlbnZpcm9ubWVudGBcbiAgICogICAodmlhIGBlbnZpcm9ubWVudGAvYGRlcGxveXNPbmx5YCk7IGEgZ2VudWluZSBkZXBsb3ltZW50IHNpZ25hbC5cbiAgICogLSBgJ3J1bidgIOKAlCBkZWZhdWx0OiBldmVyeSBzdWNjZXNzZnVsIFBJUEVMSU5FIHJ1biBjb3VudHMgKG5vIGRlcGxveVxuICAgKiAgIG1hcmtlciBhcHBsaWVkKS4gREYvQ0ZSL01UVFIgdGhlbiByZWZsZWN0IHBpcGVsaW5lIGFjdGl2aXR5LCBub3QgZGVwbG95cy5cbiAgICovXG4gIGJhc2lzOiAnZGVwbG95JyB8ICdydW4nO1xuICAvKiogVGhlIHNjb3BpbmcgYXBwbGllZCAoZWNob2VkIGZvciB0aGUgVUkpOyBgbnVsbGAgd2hlbiB1bnNjb3BlZC4gKi9cbiAgZmlsdGVyczogeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbCB9O1xuICAvKiogRGVwbG95bWVudCBGcmVxdWVuY3kg4oCUIFNVQ0NFRURFRCB0ZXJtaW5hbCBkZXBsb3ltZW50cyBpbiB0aGUgd2luZG93LiAqL1xuICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgLyoqIENvdW50IG9mIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ltZW50cyBwZXIgZGF5IG92ZXIgdGhlIHdpbmRvdy4gKi9cbiAgICBwZXJEYXk6IG51bWJlcjtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIENoYW5nZSBGYWlsdXJlIFJhdGUg4oCUIGZhaWxlZCAvIChzdWNjZWVkZWQgKyBmYWlsZWQpOyBDQU5DRUxFRCBleGNsdWRlZC4gKi9cbiAgY2hhbmdlRmFpbHVyZVJhdGU6IHtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICAvKiogc3VjY2VlZGVkICsgZmFpbGVkICh0aGUgQ0ZSIGRlbm9taW5hdG9yKS4gKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50YWdlLCAw4oCTMTAwLCAxIGRlY2ltYWwuICovXG4gICAgcGN0OiBudW1iZXI7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGRlcGxveW1lbnRzIHRvIGp1ZGdlLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBNZWFuIFRpbWUgVG8gUmVzdG9yZSDigJQgYXZnIGdhcCBmcm9tIGEgZmFpbHVyZSBJTkNJREVOVCB0byBpdHMgcmVjb3ZlcnkuXG4gICAqICBDb25zZWN1dGl2ZSBmYWlsZWQgcnVucyBvZiBhIHBpcGVsaW5lICh3aXRoIG5vIGdyZWVuIHJ1biBiZXR3ZWVuKSBjb2xsYXBzZVxuICAgKiAgaW50byBvbmUgaW5jaWRlbnQ7IHRoZSBnYXAgaXMgbWVhc3VyZWQgZnJvbSB0aGUgZmlyc3QgZmFpbHVyZSdzIEVORCB0byB0aGVcbiAgICogIHJlY292ZXJpbmcgcnVuJ3MgRU5ELiBUaGUgcmVjb3ZlcnkgaXMgdmlzaWJsZSB1cCB0byBhIGxvb2stYWhlYWQgcGFzdCBgdG9gXG4gICAqICBzbyBhIGZhaWx1cmUgbmVhciB0aGUgd2luZG93IGVkZ2UgaXNuJ3Qgc3B1cmlvdXNseSBjb3VudGVkIHVucmVzdG9yZWQuICovXG4gIG1lYW5UaW1lVG9SZXN0b3JlOiB7XG4gICAgLyoqIEZhaWx1cmUgaW5jaWRlbnRzIGluIHRoZSB3aW5kb3cgKG1heGltYWwgcnVucyBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcykuICovXG4gICAgZmFpbHVyZXM6IG51bWJlcjtcbiAgICAvKiogSW5jaWRlbnRzIHRoYXQgd2VyZSBmb2xsb3dlZCBieSBhIHN1Y2NlZWRlZCBydW4gKHJlY292ZXJlZCkuICovXG4gICAgcmVzdG9yZWQ6IG51bWJlcjtcbiAgICAvKiogQXZlcmFnZSByZXN0b3JlIGdhcCBpbiBzZWNvbmRzOyBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBpbmNpZGVudHMuICovXG4gICAgYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gaW5jaWRlbnRzLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBMZWFkIFRpbWUg4oCUIFBST1hZOiBtZWRpYW4gcGlwZWxpbmUgUlVOIFRJTUUgb2Ygc3VjY2VlZGVkIGRlcGxveW1lbnRzLlxuICAgKiAgTk9UIHRydWUgY29tbWl04oaScHJvZCBsZWFkIHRpbWUgKGV4ZWN1dGlvbnMgZG9uJ3QgY2FwdHVyZSBjb21taXQgdGltZSksXG4gICAqICBoZW5jZSBgYXBwcm94OiB0cnVlYCBzbyB0aGUgVUkvZG9jcyBjYW4gbGFiZWwgaXQuICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2NlZWRlZCBkZXBsb3ltZW50cyB3aXRoIGEgZHVyYXRpb24gKHRoZSBtZWRpYW4gc2FtcGxlKS4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIC8qKiBNZWRpYW4gcnVuIHRpbWUgaW4gc2Vjb25kczsgbnVsbCB3aGVuIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBhcHByb3g6IHRydWU7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbn1cblxuLyoqIE9uZSBpbnRlcnZhbCBidWNrZXQgb2YgdGhlIERPUkEgdHJlbmQgKGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlIGZhaWx1cmUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhVHJlbmRQb2ludCB7XG4gIC8qKiBCdWNrZXQgc3RhcnQgKERBVEVfVFJVTkMgb2Ygc3RhcnRlZF9hdCksIElTTyB0ZXh0LiAqL1xuICBwZXJpb2Q6IHN0cmluZztcbiAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95bWVudHMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCBkZXBsb3ltZW50cyBpbiB0aGUgYnVja2V0LiAqL1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIHN1Y2NlZWRlZCArIGZhaWxlZCBpbiB0aGUgYnVja2V0LiAqL1xuICB0b3RhbDogbnVtYmVyO1xuICAvKiogZmFpbGVkL3RvdGFsIGFzIGEgcGVyY2VudCAoMCB3aGVuIHRvdGFsIGlzIDApLiAqL1xuICBjaGFuZ2VGYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIC8qKiBTdGFibGUgcGlwZWxpbmUgaWQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZCBmcm9tIHRoZSBgUElQRUxJTkVfRVZFTlRfSURgXG4gICAqICB0YWcgKD0gdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGUgcmVnaXN0cnkgam9pbiBrZXkuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcbiAgZXZlbnRUeXBlOiAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiAoQWN0aW9uIGV2ZW50cykuICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgb2YgdGhlIGNoYW5nZSBiZWluZyBzaGlwcGVkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSByZWYvYnJhbmNoIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIERlcGxveSB0YXJnZXQgKGUuZy4gXCJwcm9kdWN0aW9uXCIpLiBJdHMgcHJlc2VuY2UgbWFya3MgYSByZWFsIGRlcGxveW1lbnQuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSAIFNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGFyZSBkcm9wcGVkIChhbmQgbG9nZ2VkIGF0IFdBUk5cbiAgICogd2l0aCBzYW1wbGUgaWRzIHNvIGFuIG9wZXJhdG9yIGNhbiBzZWUgd2hlbiBFdmVudEJyaWRnZSBpcyBkZWxpdmVyaW5nXG4gICAqIGV2ZW50cyBmb3IgcGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCkuXG4gICAqXG4gICAqIFJldHVybnMgY291bnRzICsgYSBzYW1wbGUgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gICAgLy8gcGlwZWxpbmUtcmVnaXN0cnkgbG9va3VwIGJlbG93LCBzbyB0aGUgcm91dGUgbGF5ZXIgTVVTVCBlc3RhYmxpc2ggYVxuICAgIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAgIC8vIHRoaXMgbWV0aG9kLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgICAvLyB0aGUgcmlnaHQgZ2F0ZSBmb3IgdGhpcyBzZXJ2ZXItaW50ZXJuYWwgY3Jvc3MtdGVuYW50IGVuZHBvaW50LiBTZWVcbiAgICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgICAvLyBSdW4gaW5zZXJ0IGluc2lkZSB0aGUgdHgsIGJ1dCBDT0xMRUNUIGFmZmVjdGVkIG9yZ3MgYW5kIGludmFsaWRhdGVcbiAgICAvLyBjYWNoZXMgQUZURVIgdGhlIHR4IHJlc29sdmVzLiBLZWVwaW5nIGludmFsaWRhdGlvbiBpbnNpZGUgdGhlIHR4IGhlbGRcbiAgICAvLyB0aGUgcGcgbG9ja3Mgb3BlbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWNoZSByb3VuZC10cmlwcyAoUmVkaXMgb3JcbiAgICAvLyBpbi1tZW1vcnkgaW52YWxpZGF0aW9ucyBhcmUgdW5yZWxhdGVkIHRvIHRoZSB0eCBidXQgc3RpbGwgc2VyaWFsaXplZFxuICAgIC8vIGl0cyBjb21taXQpLiBDYWNoZSBUVEwgaXMgMi01IG1pbiBzbyBmaXJlLWFuZC1mb3JnZXQgcG9zdC1jb21taXQgaXNcbiAgICAvLyBhbiBhY2NlcHRhYmxlIHRyYWRlIGZvciB0aWdodGVyIGxvY2sgd2luZG93cy5cbiAgICBjb25zdCB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcywgYWZmZWN0ZWRPcmdzIH0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBCYXRjaC1yZXNvbHZlIGFsbCB1bmlxdWUgcGlwZWxpbmUgaWRzIGluIG9uZSBxdWVyeVxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQoZXZlbnRzLm1hcChlID0+IGUucGlwZWxpbmVJZCkpXTtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5Um93cyA9IGF3YWl0IHR4XG4gICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICB9KVxuICAgICAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeSlcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCwgdW5pcXVlSWRzKSk7XG5cbiAgICAgIGNvbnN0IGlkTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVJZCwgcl0pKTtcblxuICAgICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIGV2ZW50cyB3aG9zZSBwaXBlbGluZSBpc24ndCByZWdpc3RlcmVkKVxuICAgICAgY29uc3Qgcm93czogQXJyYXk8dHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydD4gPSBbXTtcbiAgICAgIGxldCBza2lwcGVkTG9jYWwgPSAwO1xuICAgICAgY29uc3QgdW5yZWdpc3RlcmVkTG9jYWw6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaWRNYXAuZ2V0KGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgc2tpcHBlZExvY2FsKys7XG4gICAgICAgICAgdW5yZWdpc3RlcmVkTG9jYWwucHVzaChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgLy8gcmVnaXN0cnkucGlwZWxpbmVJZCA9PT0gZXZlbnQucGlwZWxpbmVJZDsgdXNlIHRoZSByZWdpc3RyeSdzIHNvIHRoZVxuICAgICAgICAgIC8vIEZLIGlzIGFsd2F5cyBhIHJvdyB0aGF0IGV4aXN0cywgYW5kIHB1bGwgb3JnSWQgZnJvbSB0aGUgcmVnaXN0cnkgZm9yXG4gICAgICAgICAgLy8gdGVuYW5jeSAobmV2ZXIgdHJ1c3QgdGhlIGNhbGxlcidzIGNsYWltZWQgb3JnKS5cbiAgICAgICAgICBwaXBlbGluZUlkOiByZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiByZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgICBldmVudFNvdXJjZTogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgc3RhdHVzOiBldmVudC5zdGF0dXMsXG4gICAgICAgICAgZXhlY3V0aW9uSWQ6IGV2ZW50LmV4ZWN1dGlvbklkLFxuICAgICAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgICAgIGFjdGlvbk5hbWU6IGV2ZW50LmFjdGlvbk5hbWUsXG4gICAgICAgICAgLy8gSEFSRCBDT05TVFJBSU5UOiBhbiBBV1MgYWNjb3VudCBpZCBtdXN0IE5FVkVSIGJlIHBlcnNpc3RlZC4gVGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBEVVJBQkxFIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGFuZCBtdXN0IG5vdCB0cnVzdCB1cHN0cmVhbTpcbiAgICAgICAgICAvLyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGZhaWx1cmUgZGV0YWlsICYgbWVzc2FnZXMgcm91dGluZWx5IGNhcnJ5XG4gICAgICAgICAgLy8gQVJOcyAoYXJuOmF3czrigKY6PGFjY291bnQtaWQ+OuKApikgYW5kIGJhcmUgMTItZGlnaXQgYWNjb3VudCBpZHMuIFNjcnViXG4gICAgICAgICAgLy8gYm90aCBmcmVlLWZvcm0gZmllbGRzIGhlcmUgYmVmb3JlIGluc2VydCAocGVyLWV2ZW50LCBub24tbXV0YXRpbmcpLlxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXZlbnQuZXJyb3JNZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBldmVudC5zdGFydGVkQXQgPyBuZXcgRGF0ZShldmVudC5zdGFydGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBldmVudC5jb21wbGV0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LmNvbXBsZXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICAgIC8vIERlcGxveS1hdHRyaWJ1dGlvbiBmaWVsZHMg4oCUIHNjcnViYmVkIGxpa2UgdGhlIG90aGVyIGZyZWUtZm9ybSBzdHJpbmdzXG4gICAgICAgICAgLy8gc28gYW4gQVJOL2FjY291bnQgaWQgY2FuIG5ldmVyIGVudGVyIHZpYSBhIHJlZiBvciBlbnZpcm9ubWVudCBuYW1lLlxuICAgICAgICAgIGNvbW1pdFNoYTogZXZlbnQuY29tbWl0U2hhICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuY29tbWl0U2hhKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tbWl0UmVmOiBldmVudC5jb21taXRSZWYgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5jb21taXRSZWYpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbnZpcm9ubWVudDogZXZlbnQuZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5lbnZpcm9ubWVudClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRldGFpbDogZXZlbnQuZGV0YWlsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVycyhldmVudC5kZXRhaWwpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNRUyBpcyBhdC1sZWFzdC1vbmNlLCBzbyBFdmVudEJyaWRnZSBjYW4gZGVsaXZlciB0aGUgc2FtZSBzdGF0ZS1jaGFuZ2VcbiAgICAgIC8vIHR3aWNlLiBgb25Db25mbGljdERvTm90aGluZ2AgKyB0aGUgcGFydGlhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIChwaXBlbGluZV9pZCwgZXhlY3V0aW9uX2lkLCBldmVudF90eXBlLCBzdGF0dXMsIHN0YWdlX25hbWUsIGFjdGlvbl9uYW1lKVxuICAgICAgLy8gbWFrZXMgcmUtZGVsaXZlcnkgaWRlbXBvdGVudC4gYHJldHVybmluZ2AgZ2l2ZXMgdGhlIFJFQUwgaW5zZXJ0ZWQgc2V0IHNvXG4gICAgICAvLyBjb3VudHMgKyBjYWNoZSBpbnZhbGlkYXRpb24gaWdub3JlIGR1cGxpY2F0ZXMuXG4gICAgICBjb25zdCBpbnNlcnRlZFJvd3MgPSByb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lRXZlbnQpLnZhbHVlcyhyb3dzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKClcbiAgICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkIH0pXG4gICAgICAgIDogW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc2VydGVkOiBpbnNlcnRlZFJvd3MubGVuZ3RoLFxuICAgICAgICBza2lwcGVkOiBza2lwcGVkTG9jYWwsXG4gICAgICAgIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiB1bnJlZ2lzdGVyZWRMb2NhbCxcbiAgICAgICAgYWZmZWN0ZWRPcmdzOiBbLi4ubmV3IFNldChpbnNlcnRlZFJvd3MubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBTdXJmYWNlIHRoZSBzaWxlbnQgc2tpcDogYW4gdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkIHVzdWFsbHkgbWVhbnMgdGhlXG4gICAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgICAvLyBQSVBFTElORV9FVkVOVF9JRCB0YWcgaXMgbWlzc2luZy91bnJlYWRhYmxlIGJ5IHRoZSBMYW1iZGEpLiBMb2dnaW5nIGl0XG4gICAgLy8gbWFrZXMgYSBicm9rZW4gam9pbiB2aXNpYmxlIGluc3RlYWQgb2YgbG9va2luZyBsaWtlIFwibm8gYWN0aXZpdHlcIi5cbiAgICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV2ZW50cyBza2lwcGVkOiBwaXBlbGluZSBpZCBub3QgZm91bmQgaW4gcmVnaXN0cnknLCB7XG4gICAgICAgIGNvdW50OiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGgsXG4gICAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAgIC8vIHNob3J0IGVub3VnaCB0aGF0IGEgbWlzc2VkIGludmFsaWRhdGlvbiBzZWxmLWhlYWxzLlxuICAgIGlmIChhZmZlY3RlZE9yZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZU9yZyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkOiBvcmcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgfSksXG4gICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIG9yZy1zY29wZSBwcmVkaWNhdGUgZm9yIGEgcmVwb3J0IHF1ZXJ5LiBXaXRoIGBvcmdJZHNgICh0aGVcbiAgICogb3JnIOKGkiB0ZWFtIHJvbGx1cCDigJQgYSBwYXJlbnQncyBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWApIGl0IGJlY29tZXMgYW5cbiAgICogYElOICguLi4pYCBvdmVyIHRoZSBzdWJ0cmVlOyBvdGhlcndpc2UgdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2AuIFJldHVybnMgYVxuICAgKiBgbXVsdGlgIGZsYWcgc28gY2FsbGVycyBjYW4gcnVuIG11bHRpLW9yZyByZWFkcyB1bmRlciBzeXNhZG1pbiBjb250ZXh0XG4gICAqICh0aGUgc3VidHJlZSBzcGFucyBvcmdzIG91dHNpZGUgdGhlIHJlcXVlc3QncyBSTFMgc2NvcGUpIGFuZCBzYWx0IHRoZVxuICAgKiBjYWNoZSBrZXkuXG4gICAqL1xuICBwcml2YXRlIG9yZ1Njb3BlKG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaWRzID0gb3JnSWRzICYmIG9yZ0lkcy5sZW5ndGggPiAwID8gb3JnSWRzIDogW29yZ0lkXTtcbiAgICBjb25zdCBtdWx0aSA9IGlkcy5sZW5ndGggPiAxO1xuICAgIGNvbnN0IHByZWQgPSBtdWx0aVxuICAgICAgPyBzcWxgSU4gKCR7c3FsLmpvaW4oaWRzLm1hcCgoaWQpID0+IHNxbGAke2lkfWApLCBzcWxgLCBgKX0pYFxuICAgICAgOiBzcWxgPSAke2lkc1swXX1gO1xuICAgIHJldHVybiB7IHByZWQsIG11bHRpIH07XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcmVwb3J0IHJlYWQuIFNpbmdsZS1vcmcgcmVhZHMgdXNlIHRoZSBwZXItb3JnIGNhY2hlIChpbnZhbGlkYXRlZCBvblxuICAgKiB0aGF0IG9yZydzIGV2ZW50IGluZ2VzdCkuIFJvbGx1cCAobXVsdGktb3JnKSByZWFkcyAqKmJ5cGFzcyB0aGUgY2FjaGUqKiBhbmRcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQ6IHRoZXkncmUgYWRtaW4tb25seSBhbmQgbG93ZXItZnJlcXVlbmN5LCBhbmQgYVxuICAgKiBjaGlsZCBvcmcncyBldmVudCBpbmdlc3QgY2FuJ3QgaW52YWxpZGF0ZSBhIHBhcmVudCdzIHJvbGx1cCBlbnRyeSAocmVwb3J0aW5nXG4gICAqIGhhcyBubyBvcmcgdHJlZSksIHNvIGNhY2hpbmcgdGhlbSB3b3VsZCBzZXJ2ZSBzdGFsZSBhZ2dyZWdhdGVzLiBBbHdheXMgZnJlc2guXG4gICAqL1xuICBwcml2YXRlIHJ1blJlcG9ydDxUPihjYWNoZUtleTogc3RyaW5nLCBtdWx0aTogYm9vbGVhbiwgZXhlYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBtdWx0aVxuICAgICAgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBleGVjKVxuICAgICAgOiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoY2FjaGVLZXksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMSBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEV4ZWN1dGlvbkNvdW50W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgcC5pc19hY3RpdmUgPSB0cnVlXG4gICAgICAgIEdST1VQIEJZIHAuaWRcbiAgICAgICAgT1JERVIgQlkgdG90YWwgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEV4ZWN1dGlvbkNvdW50PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpleGVjLWNvdW50YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuMWIgUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gcmFuZ2U/LmZyb20gJiYgcmFuZ2U/LnRvXG4gICAgICA/IHNxbGBBTkQgZS5zdGFydGVkX2F0ID49ICR7cmFuZ2UuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHtyYW5nZS50b306OnRpbWVzdGFtcHR6YFxuICAgICAgOiBzcWxgYDtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdmYWlsZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0NBTkNFTEVEJykgVEhFTiAnY2FuY2VsZWQnXG4gICAgICAgICAgICBFTFNFICdpbi1wcm9ncmVzcydcbiAgICAgICAgICBFTkQgQVMgc3RhdHVzLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OmludCBBUyBkdXJhdGlvbl9tcyxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuc3RhZ2VfbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19zdGFnZSxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuYWN0aW9uX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX2FjdGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8UGlwZWxpbmVFeGVjdXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4yIFN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUgZm9yIGFuIG9yZy4gKi9cbiAgYXN5bmMgZ2V0U3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN1Y2Nlc3MtcmF0ZToke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPER1cmF0aW9uU3RhdHM+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS42IFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUJvdHRsZW5lY2s+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTphY3Rpb24tZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjggRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06ZXJyb3JzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIFNVQlNUUklORyhlLmVycm9yX21lc3NhZ2UgRlJPTSAxIEZPUiAyMDApIEFTIGVycm9yX3BhdHRlcm4sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEFTIGFmZmVjdGVkX3BpcGVsaW5lcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJyBBTkQgZS5lcnJvcl9tZXNzYWdlIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFcnJvckVudHJ5PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjkgRE9SQSBtZXRyaWNzIG92ZXIgW2Zyb20sdG9dIChzdGFydGVkX2F0IHJhbmdlKSwgb3JnLXNjb3BlZCArIHJvbGx1cC1hd2FyZS5cbiAgICpcbiAgICogQWxsIGZvdXIgbWV0cmljcyBkZXJpdmUgZnJvbSBhIHBlci1leGVjdXRpb24gcm9sbC11cCBvZiBURVJNSU5BTCBQSVBFTElORVxuICAgKiBldmVudHMgKG9uZSByb3cgcGVyIGV4ZWN1dGlvbl9pZCtwaXBlbGluZV9pZDsgRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELFxuICAgKiB0aGVuIENBTkNFTEVEL1NUT1BQRUQg4oCUIG1pcnJvcmluZyBgbGlzdFBpcGVsaW5lRXhlY3V0aW9uc2ApLiBUaGUgc2NhbiBpc1xuICAgKiBnYXRlZCBieSB0aGUgYHAub3JnX2lkICR7cHJlZH1gIGpvaW4gZXhhY3RseSBsaWtlIHRoZSBzaWJsaW5nIHJlcG9ydHMsIHNvIGFcbiAgICogcm9sbHVwIHBhc3NlcyB0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlIGFuZCBhIGZvcmVpZ24gb3JnJ3MgZXhlY3V0aW9ucyBuZXZlclxuICAgKiBlbnRlciB0aGUgYWdncmVnYXRlLlxuICAgKlxuICAgKiBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgQ09SRS13aW5kb3cgZXhlY3V0aW9ucyAoW2Zyb20sdG9dKS4gTVRUUiBpc1xuICAgKiBwZXItSU5DSURFTlQ6IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGNvbGxhcHNlIGludG8gb25lIGluY2lkZW50IGFuZCB0aGVcbiAgICogcmVjb3ZlcnkgbG9va3VwIG1heSBzZWUgdGhlIG5leHQgc3VjY2VzcyB1cCB0byBNVFRSX1JFU1RPUkVfTE9PS0FIRUFEIHBhc3RcbiAgICogYHRvYCwgc28gYSBmYWlsdXJlIG5lYXIgdGhlIGVkZ2UgaXNuJ3QgcmlnaHQtY2Vuc29yZWQgaW50byBcIm5ldmVyIHJlc3RvcmVkXCIuXG4gICAqIFRoZSBzY2FuIGJvdW5kIGlzIHRoZXJlZm9yZSBgW2Zyb20sIHRvICsgbG9vay1haGVhZF1gOyB0aGUgc3RhcnRlZF9hdCByYW5nZVxuICAgKiBzdGlsbCByaWRlcyB0aGUgc2FtZSBpbmRleCBhcyB0aGUgc2libGluZyByZXBvcnRzLlxuICAgKlxuICAgKiBESVNDTE9TVVJFOiBieSBkZWZhdWx0IERGL0NGUi9NVFRSIGFyZSBSVU4tYmFzZWQgKGFueSBzdWNjZXNzZnVsIFBJUEVMSU5FXG4gICAqIHJ1biA9IGEgXCJkZXBsb3ltZW50XCIpLCBhbmQgTGVhZCBUaW1lIGlzIGFkZGl0aW9uYWxseSBhIHJ1bi10aW1lIFBST1hZXG4gICAqIGZsYWdnZWQgYGFwcHJveDogdHJ1ZWAuIFBhc3MgYGVudmlyb25tZW50YCBvciBgZGVwbG95c09ubHlgIHRvIHNjb3BlIHRvXG4gICAqIGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggYSByZWFsIGRlcGxveSB0YXJnZXQg4oCUIHRoZSByZXNwb25zZSBgYmFzaXNgIHJlcG9ydHNcbiAgICogd2hpY2ggd2FzIHVzZWQuIFNlZSB0aGUgRG9yYU1ldHJpY3MgZG9jICsgZG9jcy9kb3JhLW1ldHJpY3MubWQuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzLnBpcGVsaW5lSWQgICAgcmVzdHJpY3QgdG8gb25lIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSlcbiAgICogQHBhcmFtIG9wdHMuZW52aXJvbm1lbnQgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgZGVwbG95ZWQgdG8gdGhpcyB0YXJnZXRcbiAgICogQHBhcmFtIG9wdHMuZGVwbG95c09ubHkgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggQU5ZIGVudmlyb25tZW50XG4gICAqL1xuICBhc3luYyBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYU1ldHJpY3M+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICAgIC8vIE9wdGlvbmFsIGRlcGxveS1zY29waW5nIC8gcGVyLXBpcGVsaW5lIHByZWRpY2F0ZXMsIGZvbGRlZCBpbnRvIHRoZSBleGVjc1xuICAgIC8vIHNjYW4gc28gZmFpbHVyZXMgQU5EIHRoZWlyIHJlY292ZXJ5IHN1Y2Nlc3NlcyBhcmUgZmlsdGVyZWQgY29uc2lzdGVudGx5LlxuICAgIGNvbnN0IHsgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSwgYmFzaXMgfSA9IGRvcmFTY29wZUNsYXVzZXMob3B0cyk7XG4gICAgLy8gU2NhbiB0aGUgQ09SRSB3aW5kb3cgcGx1cyBhIGxvb2stYWhlYWQgdGFpbDogdGhlIGV4dHJhIHRhaWwgZXhpc3RzIG9ubHlcbiAgICAvLyBzbyBhIGxhdGUgZmFpbHVyZSBjYW4gc3RpbGwgZmluZCBpdHMgcmVjb3ZlcnkgKHNlZSB0aGUgcmVzdG9yZSBDVEUpLlxuICAgIGNvbnN0IGV4ZWNzID0gZXhlY3NDdGUoe1xuICAgICAgcHJlZCxcbiAgICAgIHBpcGVsaW5lQ2xhdXNlLFxuICAgICAgZGVwbG95Q2xhdXNlLFxuICAgICAgZnJvbSxcbiAgICAgIGNvbHVtbnM6IHNxbGBcbiAgICAgICAgICAgIGUucGlwZWxpbmVfaWQsXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGVuZGVkX2F0LFxuICAgICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEFTIGR1cmF0aW9uX21zYCxcbiAgICAgIHRvQm91bmQ6IHNxbGAke3RvfTo6dGltZXN0YW1wdHogKyAke01UVFJfUkVTVE9SRV9MT09LQUhFQUR9OjppbnRlcnZhbGAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApLFxuICAgICAgICAtLSBDb3JlLXdpbmRvdyBleGVjdXRpb25zIChbZnJvbSx0b10pOyBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgdGhlc2UuXG4gICAgICAgIC0tIFRoZSBsb29rLWFoZWFkIHJvd3MgYWJvdmUgYXJlIHVzZWQgT05MWSBhcyBNVFRSIHJlY292ZXJ5IGNhbmRpZGF0ZXMuXG4gICAgICAgIGNvcmUgQVMgKFxuICAgICAgICAgIFNFTEVDVCAqIEZST00gZXhlY3MgV0hFUkUgc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgKSxcbiAgICAgICAgZGYgQVMgKFxuICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGNmciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGx0IEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZGVwbG95bWVudHMsXG4gICAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC41KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6ZmxvYXQgQVMgbWVkaWFuX21zXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICAgV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcgQU5EIGR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICksXG4gICAgICAgIC0tIEZvciBlYWNoIGNvcmUtd2luZG93IGZhaWx1cmUsIGZpbmQgdGhlIEVORCBvZiBpdHMgcmVjb3ZlcmluZyBydW46IHRoZVxuICAgICAgICAtLSBuZXh0IFNVQ0NFRURFRCBydW4gb2YgdGhlIHNhbWUgcGlwZWxpbmUgdGhhdCBFTkRFRCBhZnRlciB0aGlzIGZhaWx1cmVcbiAgICAgICAgLS0gZW5kZWQgKHZpc2libGUgaW50byB0aGUgbG9vay1haGVhZCB0YWlsKS4gU0VMRUNUIGFuZCBNRUFTVVJFIGJvdGgga2V5XG4gICAgICAgIC0tIG9mZiBlbmRlZF9hdCBzbyB0aGV5IHN0YXkgY29uc2lzdGVudCAtLSB0aGUgaW5jaWRlbnQgZ2FwIGlzXG4gICAgICAgIC0tIHJlc3RvcmVkX2F0IChzdWNjZXNzIGVuZCkgbWludXMgaW5jaWRlbnRfc3RhcnRlZCAoZmlyc3QgZmFpbHVyZSBlbmQpLFxuICAgICAgICAtLSBzbyBwaWNraW5nIHRoZSByZWNvdmVyeSBieSBlbmRlZF9hdCAobm90IHN0YXJ0ZWRfYXQpIHJ1bGVzIG91dCB0aGVcbiAgICAgICAgLS0gbmVnYXRpdmUgZ2FwIHRoYXQgYSBjb25jdXJyZW50IHN1Y2Nlc3Mgd2hpY2ggU1RBUlRFRCBhZnRlciB0aGUgZmFpbHVyZVxuICAgICAgICAtLSBidXQgRU5ERUQgYmVmb3JlIGl0IHdvdWxkIG90aGVyd2lzZSBmb2xkIGludG8gQVZHLiBNZWFzdXJpbmcgZnJvbSB0aGVcbiAgICAgICAgLS0gZmFpbHVyZSdzIEVORCAobm90IHN0YXJ0KSBhbHNvIGtlZXBzIHRoZSBmYWlsZWQgcnVuJ3Mgb3duIGR1cmF0aW9uIG91dFxuICAgICAgICAtLSBvZiByZXN0b3JlIHRpbWUuIE9yZGVyaW5nIGJ5IGVuZGVkX2F0IG1ha2VzIHRoZSBpbmNpZGVudCBjb2xsYXBzZSBmYWxsXG4gICAgICAgIC0tIG91dCBuYXR1cmFsbHk6IGEgZ3JlZW4gcnVuIGVuZGluZyBiZXR3ZWVuIHR3byBmYWlsdXJlcyBzcGxpdHMgdGhlbS5cbiAgICAgICAgcmVzdG9yZSBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBmLnBpcGVsaW5lX2lkLFxuICAgICAgICAgICAgZi5lbmRlZF9hdCBBUyBmYWlsX2VuZGVkLFxuICAgICAgICAgICAgKFNFTEVDVCBzLmVuZGVkX2F0IEZST00gZXhlY3Mgc1xuICAgICAgICAgICAgICBXSEVSRSBzLnBpcGVsaW5lX2lkID0gZi5waXBlbGluZV9pZCBBTkQgcy5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgICAgICAgIEFORCBzLmVuZGVkX2F0ID4gZi5lbmRlZF9hdFxuICAgICAgICAgICAgICBPUkRFUiBCWSBzLmVuZGVkX2F0IEFTQyBMSU1JVCAxKSBBUyByZXN0b3JlZF9hdFxuICAgICAgICAgIEZST00gY29yZSBmXG4gICAgICAgICAgV0hFUkUgZi5zdGF0dXMgPSAnRkFJTEVEJ1xuICAgICAgICApLFxuICAgICAgICAtLSBDb2xsYXBzZSB0byBJTkNJREVOVFM6IGZhaWx1cmVzIHNoYXJpbmcgdGhlIHNhbWUgcmVjb3ZlcnkgKGkuZS4gd2l0aFxuICAgICAgICAtLSBubyBncmVlbiBydW4gYmV0d2VlbiB0aGVtKSBhcmUgb25lIGluY2lkZW50LCBzdGFydGluZyBhdCB0aGUgZmlyc3RcbiAgICAgICAgLS0gZmFpbHVyZSdzIGVuZC4gVW5yZWNvdmVyZWQgZmFpbHVyZXMgc2hhcmUgcmVzdG9yZWRfYXQgPSBOVUxMIGFuZCBmb3JtXG4gICAgICAgIC0tIHRoZSBzaW5nbGUgdHJhaWxpbmcgb3BlbiBpbmNpZGVudCBwZXIgcGlwZWxpbmUuXG4gICAgICAgIGluY2lkZW50cyBBUyAoXG4gICAgICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCByZXN0b3JlZF9hdCwgTUlOKGZhaWxfZW5kZWQpIEFTIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICBGUk9NIHJlc3RvcmVcbiAgICAgICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZCwgcmVzdG9yZWRfYXRcbiAgICAgICAgKSxcbiAgICAgICAgbXR0ciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgICAgLS0gcmVzdG9yZWQgbXVzdCBlcXVhbCB0aGUgY291bnQgb2YgaW5jaWRlbnRzIHRoYXQgYWN0dWFsbHlcbiAgICAgICAgICAgIC0tIGNvbnRyaWJ1dGUgdG8gYXZnX3NlY29uZHMuIEd1YXJkIG9uIGluY2lkZW50X3N0YXJ0ZWQgdG9vOiBhXG4gICAgICAgICAgICAtLSBmYWlsdXJlIHdpdGggYSBOVUxMIGNvbXBsZXRlZF9hdCB5aWVsZHMgYSBOVUxMIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICAgIC0tIHRoYXQgY29udHJpYnV0ZXMgTlVMTCAobm90IGEgcmVhbCBnYXApIHRvIEFWRywgc28gaXQgbXVzdCBub3QgYmVcbiAgICAgICAgICAgIC0tIGNvdW50ZWQgYXMgcmVzdG9yZWQgZWl0aGVyIC0tIG90aGVyd2lzZSByZXN0b3JlZCBjb3VsZCBleGNlZWRcbiAgICAgICAgICAgIC0tIHRoZSBudW1iZXIgb2YgbWVhc3VyZWQgaW5jaWRlbnRzLlxuICAgICAgICAgICAgQ09VTlQoKikgRklMVEVSIChcbiAgICAgICAgICAgICAgV0hFUkUgcmVzdG9yZWRfYXQgSVMgTk9UIE5VTEwgQU5EIGluY2lkZW50X3N0YXJ0ZWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAgICk6OmludCBBUyByZXN0b3JlZCxcbiAgICAgICAgICAgIEFWRyhFWFRSQUNUKEVQT0NIIEZST00gKHJlc3RvcmVkX2F0IC0gaW5jaWRlbnRfc3RhcnRlZCkpKVxuICAgICAgICAgICAgICBGSUxURVIgKFdIRVJFIHJlc3RvcmVkX2F0IElTIE5PVCBOVUxMIEFORCBpbmNpZGVudF9zdGFydGVkIElTIE5PVCBOVUxMKTo6ZmxvYXQgQVMgYXZnX3NlY29uZHNcbiAgICAgICAgICBGUk9NIGluY2lkZW50c1xuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGRmLmRlcGxveW1lbnRzIEFTIGRmX2RlcGxveW1lbnRzLFxuICAgICAgICAgIGNmci5mYWlsZWQgQVMgY2ZyX2ZhaWxlZCxcbiAgICAgICAgICBjZnIudG90YWwgQVMgY2ZyX3RvdGFsLFxuICAgICAgICAgIGx0LmRlcGxveW1lbnRzIEFTIGx0X2RlcGxveW1lbnRzLFxuICAgICAgICAgIGx0Lm1lZGlhbl9tcyBBUyBsdF9tZWRpYW5fbXMsXG4gICAgICAgICAgbXR0ci5mYWlsdXJlcyBBUyBtdHRyX2ZhaWx1cmVzLFxuICAgICAgICAgIG10dHIucmVzdG9yZWQgQVMgbXR0cl9yZXN0b3JlZCxcbiAgICAgICAgICBtdHRyLmF2Z19zZWNvbmRzIEFTIG10dHJfYXZnX3NlY29uZHNcbiAgICAgICAgRlJPTSBkZiwgY2ZyLCBsdCwgbXR0clxuICAgICAgYCkudGhlbihyID0+IHRoaXMuc2hhcGVEb3JhKGRyaXp6bGVSb3dzPERvcmFSb3c+KHIucm93cylbMF0sIGZyb20sIHRvLCBiYXNpcywgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9KSkpO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhOiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveXNPbmx5ID8gJ2QnIDogJyd9YDtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogU2hhcGUgYSBzaW5nbGUgRE9SQSBhZ2dyZWdhdGUgcm93IGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9LiAqL1xuICBwcml2YXRlIHNoYXBlRG9yYShcbiAgICByb3c6IERvcmFSb3cgfCB1bmRlZmluZWQsXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgYmFzaXM6IERvcmFNZXRyaWNzWydiYXNpcyddLFxuICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZD86IHN0cmluZzsgZW52aXJvbm1lbnQ/OiBzdHJpbmcgfSxcbiAgKTogRG9yYU1ldHJpY3Mge1xuICAgIC8vIGBGUk9NIGRmLCBjZnIsIGx0LCBtdHRyYCBhbHdheXMgeWllbGRzIGV4YWN0bHkgb25lIHJvdyAoZWFjaCBDVEUgaXMgYVxuICAgIC8vIHNpbmdsZS1yb3cgYWdncmVnYXRlKSwgYnV0IGd1YXJkIGFnYWluc3QgYW4gZW1wdHkgcmVzdWx0IGRlZmVuc2l2ZWx5LlxuICAgIGNvbnN0IHI6IERvcmFSb3cgPSByb3cgPz8ge307XG5cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IE51bWJlcihyLmRmX2RlcGxveW1lbnRzKSB8fCAwO1xuICAgIC8vIEZsb29yIHRoZSBkaXZpc29yIGF0IG9uZSBkYXk6IGEgd2luZG93IHNob3J0ZXIgdGhhbiBhIGRheSAoaW5jbC4gdGhlXG4gICAgLy8gZGVnZW5lcmF0ZSBmcm9tPT10bykgaGFzIG5vIG1lYW5pbmdmdWwgc3ViLWRheSByYXRlLCBzbyBpdCdzIHRyZWF0ZWQgYXMgYVxuICAgIC8vIHNpbmdsZSBkYXkgcmF0aGVyIHRoYW4gZXh0cmFwb2xhdGVkIG9yIG1pc2xhYmVsZWQgYXMgYSByYXcgY291bnQuXG4gICAgLy8gRmxvb3IgYXQgb25lIGRheSBhbmQgZ3VhcmQgYWdhaW5zdCB1bnBhcnNlYWJsZSBkYXRlcyAoRGF0ZS5wYXJzZSDihpIgTmFOLFxuICAgIC8vIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBwcm9wYWdhdGUgdGhyb3VnaCBwZXJEYXkpLiBGYWxscyBiYWNrIHRvIGEgMS1kYXlcbiAgICAvLyB3aW5kb3cgc28gYSBiYWQgcmFuZ2UgeWllbGRzIHRoZSByYXcgY291bnQgYXMgdGhlIHJhdGUsIG5ldmVyIE5hTi5cbiAgICBjb25zdCBzcGFuRGF5cyA9IChEYXRlLnBhcnNlKHRvKSAtIERhdGUucGFyc2UoZnJvbSkpIC8gODY0MDAwMDA7XG4gICAgY29uc3QgZGF5cyA9IE51bWJlci5pc0Zpbml0ZShzcGFuRGF5cykgPyBNYXRoLm1heChzcGFuRGF5cywgMSkgOiAxO1xuICAgIC8vIEJhbmQgb24gdGhlIFVOUk9VTkRFRCByYXRlOyByb3VuZCBvbmx5IGZvciBkaXNwbGF5LiBSb3VuZGluZyBmaXJzdCB3b3VsZFxuICAgIC8vIG1pc2xhYmVsIGV4YWN0IHdlZWtseS9tb250aGx5IGJvdW5kYXJpZXMgKGUuZy4gMSBkZXBsb3kgLyAzMCBkYXlzIOKGklxuICAgIC8vIDAuMDMzMyByb3VuZHMgdG8gMC4wMyA8IDEvMzAg4oaSIHdyb25nbHkgXCJsb3dcIiBpbnN0ZWFkIG9mIFwibWVkaXVtXCIpLlxuICAgIGNvbnN0IHJhd1BlckRheSA9IGRlcGxveW1lbnRzIC8gZGF5cztcbiAgICBjb25zdCBwZXJEYXkgPSBOdW1iZXIocmF3UGVyRGF5LnRvRml4ZWQoMikpO1xuXG4gICAgY29uc3QgZmFpbGVkID0gTnVtYmVyKHIuY2ZyX2ZhaWxlZCkgfHwgMDtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihyLmNmcl90b3RhbCkgfHwgMDtcbiAgICBjb25zdCByYXdQY3QgPSB0b3RhbCA+IDAgPyAoZmFpbGVkIC8gdG90YWwpICogMTAwIDogMDtcbiAgICBjb25zdCBwY3QgPSBOdW1iZXIocmF3UGN0LnRvRml4ZWQoMSkpO1xuXG4gICAgY29uc3QgZmFpbHVyZXMgPSBOdW1iZXIoci5tdHRyX2ZhaWx1cmVzKSB8fCAwO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gTnVtYmVyKHIubXR0cl9yZXN0b3JlZCkgfHwgMDtcbiAgICBjb25zdCBhdmdTZWNvbmRzID0gZmFpbHVyZXMgPiAwICYmIHIubXR0cl9hdmdfc2Vjb25kcyAhPSBudWxsXG4gICAgICA/IE51bWJlcihOdW1iZXIoci5tdHRyX2F2Z19zZWNvbmRzKS50b0ZpeGVkKDEpKVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgbHREZXBsb3ltZW50cyA9IE51bWJlcihyLmx0X2RlcGxveW1lbnRzKSB8fCAwO1xuICAgIGNvbnN0IG1lZGlhblNlY29uZHMgPSByLmx0X21lZGlhbl9tcyAhPSBudWxsXG4gICAgICA/IE51bWJlcigoTnVtYmVyKHIubHRfbWVkaWFuX21zKSAvIDEwMDApLnRvRml4ZWQoMSkpXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93OiB7IGZyb20sIHRvIH0sXG4gICAgICBiYXNpcyxcbiAgICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICAgIGRlcGxveW1lbnRGcmVxdWVuY3k6IHsgZGVwbG95bWVudHMsIHBlckRheSwgbGV2ZWw6IGRvcmFMZXZlbEZvckZyZXF1ZW5jeShyYXdQZXJEYXksIGRlcGxveW1lbnRzKSB9LFxuICAgICAgY2hhbmdlRmFpbHVyZVJhdGU6IHsgZmFpbGVkLCB0b3RhbCwgcGN0LCBsZXZlbDogZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShyYXdQY3QsIHRvdGFsKSB9LFxuICAgICAgbWVhblRpbWVUb1Jlc3RvcmU6IHsgZmFpbHVyZXMsIHJlc3RvcmVkLCBhdmdTZWNvbmRzLCBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShhdmdTZWNvbmRzKSB9LFxuICAgICAgbGVhZFRpbWU6IHsgZGVwbG95bWVudHM6IGx0RGVwbG95bWVudHMsIG1lZGlhblNlY29uZHMsIGFwcHJveDogdHJ1ZSwgbGV2ZWw6IGRvcmFMZXZlbEZvckxlYWRUaW1lKG1lZGlhblNlY29uZHMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjliIERPUkEgdHJlbmQg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlLWZhaWx1cmUgcmF0ZSBidWNrZXRlZCBieVxuICAgKiBgaW50ZXJ2YWxgIChkYXkvd2Vlay9tb250aCkgZm9yIGEgc3BhcmtsaW5lLiBQZXItZXhlY3V0aW9uIHJvbGx1cCAob25lIHJvd1xuICAgKiBwZXIgZXhlY3V0aW9uLCBGQUlMRUQgd2lucykgYnVja2V0ZWQgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQuIFNoYXJlc1xuICAgKiB0aGUgYGdldERvcmFNZXRyaWNzYCBzY29waW5nIChvcmcvcm9sbHVwLCBwaXBlbGluZUlkLCBkZXBsb3ktc2NvcGluZyk7IE1UVFJcbiAgICogYW5kIGxlYWQgdGltZSBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkICh0b28gaGVhdnkgdG8gYnVja2V0IG1lYW5pbmdmdWxseSkuXG4gICAqL1xuICBhc3luYyBnZXREb3JhVHJlbmQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnRlcnZhbDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgZGVwbG95c09ubHkgfSA9IG9wdHM7XG4gICAgY29uc3QgeyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlIH0gPSBkb3JhU2NvcGVDbGF1c2VzKG9wdHMpO1xuICAgIC8vIFNhbWUgZXhlY3Mgcm9sbC11cCBhcyBnZXREb3JhTWV0cmljcyAoc2hhcmVkIGJ1aWxkZXIg4oCUIHN0YXR1cyBzZXQgK1xuICAgIC8vIHByZWRpY2F0ZSBjYW4ndCBkcmlmdCk7IHRoZSB0cmVuZCBuZWVkcyBvbmx5IHN0YXJ0ZWRfYXQgb3ZlciB0aGUgY29yZVxuICAgIC8vIHdpbmRvdyAobm8gTVRUUiBsb29rLWFoZWFkLCBubyBlbmRlZF9hdC9kdXJhdGlvbiBjb2x1bW5zKS5cbiAgICBjb25zdCBleGVjcyA9IGV4ZWNzQ3RlKHtcbiAgICAgIHByZWQsXG4gICAgICBwaXBlbGluZUNsYXVzZSxcbiAgICAgIGRlcGxveUNsYXVzZSxcbiAgICAgIGZyb20sXG4gICAgICBjb2x1bW5zOiBzcWxgXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXRgLFxuICAgICAgdG9Cb3VuZDogc3FsYCR7dG99Ojp0aW1lc3RhbXB0emAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIHN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIC0tIHF1b3RlZCBhbGlhcyBzbyB0aGUgcmF3IHJvdyBrZXkgaXMgZXhhY3RseSB0aGUgRG9yYVRyZW5kUG9pbnQgZmllbGRcbiAgICAgICAgICBDT0FMRVNDRShST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpLCAwKSAqIDEwMCwgMSksIDApOjpmbG9hdCBBUyBcImNoYW5nZUZhaWx1cmVQY3RcIlxuICAgICAgICBGUk9NIGV4ZWNzXG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxEb3JhVHJlbmRQb2ludD4oci5yb3dzKSkpO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhLXRyZW5kOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveXNPbmx5ID8gJ2QnIDogJyd9YDtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMjogUGx1Z2luIEludmVudG9yeSAmIEJ1aWxkcyDilIDilIBcblxuICAvKiogMi4xIFBsdWdpbiBzdW1tYXJ5IOKAlCBjb3VudHMgYW5kIGJyZWFrZG93bnMuICovXG4gIGFzeW5jIGdldFBsdWdpblN1bW1hcnkob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luU3VtbWFyeT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXN1bW1hcnlgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIE5PVCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGluYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmFjY2Vzc01vZGlmaWVyfSA9ICdwdWJsaWMnKTo6aW50IEFTIHB1YmxpYyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5hY2Nlc3NNb2RpZmllcn0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIHByaXZhdGU6IDAsIHVuaXF1ZU5hbWVzOiAwIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIDIuMiBUeXBlICYgY29tcHV0ZSBkaXN0cmlidXRpb24uICovXG4gIGFzeW5jIGdldFBsdWdpbkRpc3RyaWJ1dGlvbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbltdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tZGlzdHJpYnV0aW9uYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0gQVMgcGx1Z2luX3R5cGUsXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfSBBUyBjb21wdXRlX3R5cGUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBjb3VudFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0sICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX1cbiAgICAgICAgT1JERVIgQlkgY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAyLjMgVmVyc2lvbiBjb3VudHMgcGVyIHBsdWdpbiBuYW1lLiAqL1xuICBhc3luYyBnZXRQbHVnaW5WZXJzaW9ucyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxWZXJzaW9uQ291bnRbXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXZlcnNpb25zYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ubmFtZX0sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB2ZXJzaW9uX2NvdW50LFxuICAgICAgICAgIE1BWCgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0pIEFTIGxhdGVzdF92ZXJzaW9uLFxuICAgICAgICAgIGJvb2xfb3IoJHtzY2hlbWEucGx1Z2luLmlzRGVmYXVsdH0pIEFTIGhhc19kZWZhdWx0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5uYW1lfVxuICAgICAgICBPUkRFUiBCWSB2ZXJzaW9uX2NvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxWZXJzaW9uQ291bnQ+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIDIuNCBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YnVpbGQtc3VjY2Vzczoke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnZmFpbGVkJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdjb21wbGV0ZWQnLCAnZmFpbGVkJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi41IEJ1aWxkIGR1cmF0aW9uIHBlciBwbHVnaW4uICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogUHJvbWlzZTxCdWlsZER1cmF0aW9uW10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpidWlsZC1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgYnVpbGRzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRHVyYXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuNiBCdWlsZCBmYWlsdXJlcyDigJQgdG9wIGVycm9yIG1lc3NhZ2VzLiAqL1xuICBhc3luYyBnZXRCdWlsZEZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmJ1aWxkLWZhaWx1cmVzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUsIGUuZXJyb3JfbWVzc2FnZVxuICAgICAgICBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRGYWlsdXJlPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVwb3J0aW5nU2VydmljZSA9IG5ldyBSZXBvcnRpbmdTZXJ2aWNlKCk7XG4iXX0=
829
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoSixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixJQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hILE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQXdIekgsK0VBQStFO0FBQy9FOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFtQnpDLDZFQUE2RTtBQUM3RSw0REFBNEQ7QUFDNUQsd0ZBQXdGO0FBQ3hGLFNBQVMscUJBQXFCLENBQUMsTUFBYyxFQUFFLFdBQW1CO0lBQ2hFLElBQUksV0FBVyxJQUFJLENBQUM7UUFBRSxP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QUFhOzJCQUNSLEtBQUs7Z0NBQ0EsSUFBSSxxQ0FBcUMsRUFBRTs7O2dCQUczRCxLQUFLO09BQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNqRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUNhY2hlU2VydmljZSwgY3JlYXRlTG9nZ2VyLCBlcnJvck1lc3NhZ2UsIHNjcnViQXdzSWRlbnRpZmllcnMsIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgaW5BcnJheSwgc3FsLCB0eXBlIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1zZXJ2aWNlJyk7XG5cbi8qKlxuICogQ2FjaGUgZm9yIHJlcG9ydGluZyBhZ2dyZWdhdGlvbnMuIFR3byB0aWVyczpcbiAqIC0gSW52ZW50b3J5IHF1ZXJpZXMgKHBsdWdpbiBzdW1tYXJ5L2Rpc3RyaWJ1dGlvbi92ZXJzaW9ucyk6IDUgbWluIFRUTCDigJQgY2hhbmdlcyBvbiBwbHVnaW4gQ1JVRFxuICogLSBFeGVjdXRpb24vYnVpbGQgcXVlcmllcyB3aXRoIGRhdGUgcmFuZ2VzOiAyIG1pbiBUVEwg4oCUIG5ldyBldmVudHMgYXJyaXZlIGNvbnRpbnVvdXNseVxuICovXG5jb25zdCBpbnZlbnRvcnlDYWNoZSA9IGNyZWF0ZUNhY2hlU2VydmljZSgncmVwb3J0OmludjonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX0lOVkVOVE9SWSB8fCAnMzAwJywgMTApKTtcbmNvbnN0IHRpbWVzZXJpZXNDYWNoZSA9IGNyZWF0ZUNhY2hlU2VydmljZSgncmVwb3J0OnRzOicsIHBhcnNlSW50KHByb2Nlc3MuZW52LkNBQ0hFX1RUTF9SRVBPUlRfVElNRVNFUklFUyB8fCAnMTIwJywgMTApKTtcblxuLy8g4pSA4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgRXhlY3V0aW9uQ291bnQge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgZmlyc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG4gIGxhc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBjYW5jZWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBEdXJhdGlvblN0YXRzIHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1pbk1zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIHA5NU1zOiBudW1iZXI7XG4gIGV4ZWN1dGlvbnM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFBpcGVsaW5lRXhlY3V0aW9uIHtcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbiAgLyoqIFJvbGxlZC11cCB0ZXJtaW5hbCBzdGF0dXM6IHN1Y2NlZWRlZCB8IGZhaWxlZCB8IGNhbmNlbGVkIHwgaW4tcHJvZ3Jlc3MuICovXG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGVuZGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBGaXJzdCBmYWlsaW5nIHN0YWdlL2FjdGlvbiBmb3IgdGhlIGV4ZWN1dGlvbiAobnVsbCB3aGVuIGl0IGRpZG4ndCBmYWlsKS4gKi9cbiAgZmFpbGluZ1N0YWdlOiBzdHJpbmcgfCBudWxsO1xuICBmYWlsaW5nQWN0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgU3RhZ2VGYWlsdXJlIHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFN0YWdlQm90dGxlbmVjayB7XG4gIGlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBBY3Rpb25GYWlsdXJlIHtcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBFcnJvckVudHJ5IHtcbiAgZXJyb3JQYXR0ZXJuOiBzdHJpbmc7XG4gIG9jY3VycmVuY2VzOiBudW1iZXI7XG4gIGFmZmVjdGVkUGlwZWxpbmVzOiBudW1iZXI7XG4gIGxhc3RTZWVuOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQbHVnaW5TdW1tYXJ5IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgYWN0aXZlOiBudW1iZXI7XG4gIGluYWN0aXZlOiBudW1iZXI7XG4gIHB1YmxpYzogbnVtYmVyO1xuICBwcml2YXRlOiBudW1iZXI7XG4gIHVuaXF1ZU5hbWVzOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiB7XG4gIHBsdWdpblR5cGU6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZlcnNpb25Db3VudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbkNvdW50OiBudW1iZXI7XG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbiAgaGFzRGVmYXVsdDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQnVpbGREdXJhdGlvbiB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgYnVpbGRzOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBCdWlsZEZhaWx1cmUge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG4vKiogUmF3IHNpbmdsZS1yb3cgc2hhcGUgcmV0dXJuZWQgYnkgdGhlIERPUkEgYWdncmVnYXRlIHF1ZXJ5IChwcmUtc2hhcGluZykuICovXG4vKipcbiAqIEhvdyBmYXIgcGFzdCB0aGUgcmVwb3J0J3MgYHRvYCBib3VuZCB0aGUgRE9SQSBNVFRSIHF1ZXJ5IG1heSBsb29rIGZvciBhXG4gKiBmYWlsdXJlJ3MgcmVjb3ZlcmluZyBydW4uIEJvdW5kcyB0aGUgc2NhbiB3aGlsZSBzdG9wcGluZyBhIGZhaWx1cmUgbmVhciB0aGVcbiAqIHdpbmRvdyBlZGdlIGZyb20gYmVpbmcgc3B1cmlvdXNseSBzY29yZWQgXCJuZXZlciByZXN0b3JlZFwiLiBBIGZhaWx1cmUgdGhhdFxuICogaGFzIG5vdCByZWNvdmVyZWQgd2l0aGluIHRoaXMgd2luZG93IHN0YXlzIGNvdW50ZWQgYXMgYW4gb3BlbiBpbmNpZGVudC5cbiAqL1xuY29uc3QgTVRUUl9SRVNUT1JFX0xPT0tBSEVBRCA9ICczMCBkYXlzJztcblxuLyoqXG4gKiBET1JBIHBlcmZvcm1hbmNlIGJhbmQuIGBudWxsYCA9IGluc3VmZmljaWVudCBkYXRhIHRvIGNsYXNzaWZ5IChub1xuICogZGVwbG95bWVudHMvZmFpbHVyZXMvbGVhZC10aW1lIHNhbXBsZSBpbiB0aGUgd2luZG93KSwgc28gdGhlIFVJIHNob3dzIGFcbiAqIG5ldXRyYWwgc3RhdGUgcmF0aGVyIHRoYW4gbWlzbGFiZWxpbmcgYW4gZW1wdHkgd2luZG93IGFzIFwibG93XCIuXG4gKi9cbmV4cG9ydCB0eXBlIERvcmFMZXZlbCA9ICdlbGl0ZScgfCAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgbnVsbDtcblxuLyoqIE9wdGlvbmFsIHNjb3BpbmcgZm9yIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmdldERvcmFNZXRyaWNzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU9wdGlvbnMge1xuICAvKiogUmVzdHJpY3QgdG8gYSBzaW5nbGUgcGlwZWxpbmUgKHBlci1waXBlbGluZSBET1JBKS4gKi9cbiAgcGlwZWxpbmVJZD86IHN0cmluZztcbiAgLyoqIENvdW50IG9ubHkgZXhlY3V0aW9ucyBkZXBsb3llZCB0byB0aGlzIGVudmlyb25tZW50IChkZXBsb3ktc2NvcGVkKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBDb3VudCBvbmx5IGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggQU5ZIGVudmlyb25tZW50IChyZWFsIGRlcGxveW1lbnRzKS4gKi9cbiAgZGVwbG95c09ubHk/OiBib29sZWFuO1xufVxuXG4vLyBET1JBIHBlcmZvcm1hbmNlIGJhbmRzICh0aHJlc2hvbGRzIGZyb20gdGhlIERPUkEvQWNjZWxlcmF0ZSByZXBvcnRzKS4gRWFjaFxuLy8gaGVscGVyIHJldHVybnMgYG51bGxgIHdoZW4gdGhlcmUncyBubyBzYW1wbGUgdG8gY2xhc3NpZnkuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JGcmVxdWVuY3kocGVyRGF5OiBudW1iZXIsIGRlcGxveW1lbnRzOiBudW1iZXIpOiBEb3JhTGV2ZWwge1xuICBpZiAoZGVwbG95bWVudHMgPD0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChwZXJEYXkgPj0gMSkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChwZXJEYXkgPj0gMSAvIDcpIHJldHVybiAnaGlnaCc7XG4gIGlmIChwZXJEYXkgPj0gMSAvIDMwKSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cbi8qKiBDaGFuZ2UgZmFpbHVyZSByYXRlIGJ5IHBlcmNlbnQ6IGVsaXRlIOKJpDUlLCBoaWdoIOKJpDEwJSwgbWVkaXVtIOKJpDE1JS4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocGN0OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpOiBEb3JhTGV2ZWwge1xuICBpZiAodG90YWwgPD0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChwY3QgPD0gNSkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChwY3QgPD0gMTApIHJldHVybiAnaGlnaCc7XG4gIGlmIChwY3QgPD0gMTUpIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIFRpbWUgdG8gcmVzdG9yZSBieSBzZWNvbmRzOiBlbGl0ZSA8MWgsIGhpZ2ggPDEgZGF5LCBtZWRpdW0gPDEgd2Vlay4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvclJlc3RvcmUoYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChhdmdTZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAoYXZnU2Vjb25kcyA8IDM2MDApIHJldHVybiAnZWxpdGUnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDYwNDgwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogTGVhZCB0aW1lIGJ5IHNlY29uZHM6IGVsaXRlIDwxIGRheSwgaGlnaCA8MSB3ZWVrLCBtZWRpdW0gPDEgbW9udGguICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JMZWFkVGltZShtZWRpYW5TZWNvbmRzOiBudW1iZXIgfCBudWxsKTogRG9yYUxldmVsIHtcbiAgaWYgKG1lZGlhblNlY29uZHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgODY0MDApIHJldHVybiAnZWxpdGUnO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDYwNDgwMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKG1lZGlhblNlY29uZHMgPCAyNTkyMDAwKSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cblxuLyoqXG4gKiBSb3VuZCBgdmFsdWVgIHRvIGBkaWdpdHNgIGRlY2ltYWwgcGxhY2VzLCByZXR1cm5pbmcgYSByZWFsIG51bWJlci4gU21hbGxcbiAqIG1vZHVsZS1wcml2YXRlIGhlbHBlciBzbyB0aGUgRE9SQSBzaGFwaW5nIGRvZXNuJ3QgcmVwZWF0IHRoZVxuICogYE51bWJlcihOdW1iZXIoeCkudG9GaXhlZChuKSlgIHBhdHRlcm4gKHRvRml4ZWQgYWxvbmUgeWllbGRzIGEgc3RyaW5nKS5cbiAqL1xuZnVuY3Rpb24gcm91bmQodmFsdWU6IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoZGlnaXRzKSk7XG59XG5cbi8qKlxuICogU2hhcmVkIHBlci1leGVjdXRpb24gdGVybWluYWwtc3RhdHVzIHJvbGwtdXAgZm9yIHRoZSBET1JBIGBleGVjc2AgQ1RFczpcbiAqIEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgZWxzZSBDQU5DRUxFRC9TVE9QUEVELiBLZXB0IGluIG9uZSBwbGFjZSBzb1xuICogZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBjYW4ndCBkcmlmdCBvbiB0aGUgcHJlY2VkZW5jZS5cbiAqL1xuY29uc3QgRE9SQV9URVJNSU5BTF9TVEFUVVNfQ0FTRSA9IHNxbGBcbiAgICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ0ZBSUxFRCdcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgICAgRUxTRSAnQ0FOQ0VMRUQnXG4gICAgICAgICAgICBFTkRgO1xuXG4vKipcbiAqIE9wdGlvbmFsIHBlci1waXBlbGluZSAvIGRlcGxveS1zY29waW5nIHByZWRpY2F0ZXMgKyB0aGUgcmVzdWx0aW5nIGBiYXNpc2AsXG4gKiBzaGFyZWQgYnkgZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBzbyB0aGUgZW52L2RlcGxveXNPbmx5IHByZWNlZGVuY2VcbiAqIGNhbid0IGRpdmVyZ2UuIGBlbnZpcm9ubWVudGAgKG9uZSB0YXJnZXQpIHdpbnMgb3ZlciBgZGVwbG95c09ubHlgIChhbnkgZW52KS5cbiAqL1xuZnVuY3Rpb24gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzOiBEb3JhT3B0aW9ucykge1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50LCBkZXBsb3lzT25seSB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgZGVwbG95Q2xhdXNlID0gZW52aXJvbm1lbnRcbiAgICA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YFxuICAgIDogZGVwbG95c09ubHkgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExgIDogc3FsYGA7XG4gIGNvbnN0IGJhc2lzOiAnZGVwbG95JyB8ICdydW4nID0gZW52aXJvbm1lbnQgfHwgZGVwbG95c09ubHkgPyAnZGVwbG95JyA6ICdydW4nO1xuICByZXR1cm4geyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBiYXNpcyB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBgZXhlY3NgIENURSBib2R5IOKAlCB0aGUgcGVyLWV4ZWN1dGlvbiB0ZXJtaW5hbCByb2xsLXVwIHRoYXQgQk9USCBET1JBXG4gKiBtZXRob2RzIHNjYW4uIE9ubHkgdGhlIFNFTEVDVGVkIGNvbHVtbnMgYW5kIHRoZSB1cHBlciByYW5nZSBib3VuZCBkaWZmZXJcbiAqIChnZXREb3JhTWV0cmljcyBuZWVkcyBwaXBlbGluZV9pZC9lbmRlZF9hdC9kdXJhdGlvbl9tcyBwbHVzIGEgbG9vay1haGVhZCB0YWlsXG4gKiBmb3IgTVRUUiByZWNvdmVyeTsgZ2V0RG9yYVRyZW5kIG5lZWRzIG9ubHkgc3RhcnRlZF9hdCBvdmVyIHRoZSBjb3JlIHdpbmRvdyksXG4gKiBzbyB0aG9zZSBhcmUgdGhlIHBhcmFtZXRlcnMuIFRoZSBgZXZlbnRfdHlwZT0nUElQRUxJTkUnYCBnYXRlLCB0aGVcbiAqIFNVQ0NFRURFRC9GQUlMRUQvQ0FOQ0VMRUQvU1RPUFBFRCBzdGF0dXMgc2V0LCB0aGUgYGV4ZWN1dGlvbl9pZGAgZmlsdGVyLCB0aGVcbiAqIG9yZyArIGRlcGxveS9waXBlbGluZSBzY29wZSBjbGF1c2VzLCBhbmQgdGhlIGBHUk9VUCBCWWAgYWxsIGxpdmUgaGVyZSBzbyB0aGVcbiAqIHR3byBjYWxsZXJzIGNhbid0IGRyaWZ0IG9uIHRoZSBzdGF0dXMgc2V0IG9yIHRoZSBwcmVkaWNhdGUuXG4gKlxuICogQHBhcmFtIGNvbHVtbnMgIHRyYWlsaW5nIFNFTEVDVCBjb2x1bW5zIChhZnRlciBgZS5leGVjdXRpb25faWQsYClcbiAqIEBwYXJhbSB0b0JvdW5kICB0aGUgYDw9YCB1cHBlci1ib3VuZCBleHByZXNzaW9uIG9uIGBlLnN0YXJ0ZWRfYXRgXG4gKiAgICAgICAgICAgICAgICAgKGNvcmUgd2luZG93IGZvciB0aGUgdHJlbmQ7IGNvcmUgKyBsb29rLWFoZWFkIGZvciBtZXRyaWNzKVxuICovXG5mdW5jdGlvbiBleGVjc0N0ZShhcmdzOiB7XG4gIHByZWQ6IFNRTDtcbiAgY29sdW1uczogU1FMO1xuICBwaXBlbGluZUNsYXVzZTogU1FMO1xuICBkZXBsb3lDbGF1c2U6IFNRTDtcbiAgZnJvbTogc3RyaW5nO1xuICB0b0JvdW5kOiBTUUw7XG59KTogU1FMIHtcbiAgY29uc3QgeyBwcmVkLCBjb2x1bW5zLCBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBmcm9tLCB0b0JvdW5kIH0gPSBhcmdzO1xuICByZXR1cm4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke2NvbHVtbnN9XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICAtLSBTVE9QUEVEIChtYW51YWxseSBhYm9ydGVkKSBqb2lucyBDQU5DRUxFRCBpbiB0aGUgRUxTRSBidWNrZXQ7IGJvdGhcbiAgICAgICAgICAtLSBhcmUgdGVybWluYWwgbm9uLWRlcGxveSBvdXRjb21lcy4gU1VQRVJTRURFRCBzdGF5cyBleGNsdWRlZCAoYVxuICAgICAgICAgIC0tIHJlcGxhY2VkIGV4ZWN1dGlvbiwgbm90IGFuIG91dGNvbWUpLlxuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnLCAnU1RPUFBFRCcpXG4gICAgICAgICAgQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX1cbiAgICAgICAgICAke2RlcGxveUNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6XG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvQm91bmR9XG4gICAgICAgIEdST1VQIEJZIGUuZXhlY3V0aW9uX2lkLCBlLnBpcGVsaW5lX2lkYDtcbn1cblxuaW50ZXJmYWNlIERvcmFSb3cge1xuICBkZl9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNmcl9mYWlsZWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjZnJfdG90YWw/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBsdF9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGx0X21lZGlhbl9tcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIG10dHJfZmFpbHVyZXM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBtdHRyX3Jlc3RvcmVkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbXR0cl9hdmdfc2Vjb25kcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBBIFwiZGVwbG95bWVudFwiIGlzIGEgVEVSTUlOQUwgcGlwZWxpbmUtbGV2ZWwgZXZlbnQsIHJvbGxlZCB1cCB0byBvbmUgcm93IHBlclxuICogYGV4ZWN1dGlvbl9pZGAgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRC9TVE9QUEVEIOKAlCBzYW1lXG4gKiBwcmVjZWRlbmNlIGFzIGBsaXN0UGlwZWxpbmVFeGVjdXRpb25zYCkuXG4gKlxuICogRElTQ0xPU1VSRSDigJQgdGhlc2UgYXJlIFJVTi1CQVNFRCBhcHByb3hpbWF0aW9ucyBvZiBET1JBLiBBIFwiZGVwbG95bWVudFwiIGhlcmVcbiAqIGlzIGFueSBzdWNjZXNzZnVsIHBpcGVsaW5lIFJVTiwgbm90IGEgdmVyaWZpZWQgcHJvZHVjdGlvbiBkZXBsb3ltZW50OiB0aGVcbiAqIGV2ZW50IHN0cmVhbSBjYXJyaWVzIG5vIGRlcGxveS1zdGFnZS9lbnZpcm9ubWVudCBtYXJrZXIsIHNvIGEgQ0ktb25seVxuICogYnVpbGQvdGVzdCBwaXBlbGluZSBjb3VudHMgdGhlIHNhbWUgYXMgb25lIHRoYXQgc2hpcHMgdG8gcHJvZC4gVGhhdCBtYWtlc1xuICogYGRlcGxveW1lbnRGcmVxdWVuY3lgIGEgcGlwZWxpbmUtdGhyb3VnaHB1dCBzaWduYWwgYW5kIGBjaGFuZ2VGYWlsdXJlUmF0ZWAgYVxuICogcGlwZWxpbmUtZmFpbHVyZSByYXRlIChidWlsZC90ZXN0IGZhaWx1cmVzIGNhdWdodCBpbiBDSSBjb3VudCB0b28pLCBhbmQgTVRUUlxuICogYSBwaXBlbGluZS1yZWNvdmVyeSB0aW1lLiBPbmx5IGBsZWFkVGltZWAgY2FycmllcyBhbiBleHBsaWNpdCBgYXBwcm94YCBmbGFnXG4gKiAoaXQgaXMgYWRkaXRpb25hbGx5IGEgcnVuLXRpbWUgcHJveHkpLCBidXQgQUxMIGZvdXIgc2hhcmUgdGhlIHJ1buKJoGRlcGxveVxuICogY2F2ZWF0IHVudGlsIGRlcGxveS9jb21taXQgbWV0YWRhdGEgaXMgY2FwdHVyZWQuIFNlZSBkb2NzL2RvcmEtbWV0cmljcy5tZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhTWV0cmljcyB7XG4gIC8qKiBUaGUgW2Zyb20sdG9dIHdpbmRvdyBlY2hvZWQgYmFjayAoc3RhcnRlZF9hdCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG51bWJlcnMgY291bnQgcmVhbCBkZXBsb3ltZW50cyBvciBwaXBlbGluZSBydW5zOlxuICAgKiAtIGAnZGVwbG95J2Ag4oCUIHNjb3BlZCB0byBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGEgZGVwbG95IGBlbnZpcm9ubWVudGBcbiAgICogICAodmlhIGBlbnZpcm9ubWVudGAvYGRlcGxveXNPbmx5YCk7IGEgZ2VudWluZSBkZXBsb3ltZW50IHNpZ25hbC5cbiAgICogLSBgJ3J1bidgIOKAlCBkZWZhdWx0OiBldmVyeSBzdWNjZXNzZnVsIFBJUEVMSU5FIHJ1biBjb3VudHMgKG5vIGRlcGxveVxuICAgKiAgIG1hcmtlciBhcHBsaWVkKS4gREYvQ0ZSL01UVFIgdGhlbiByZWZsZWN0IHBpcGVsaW5lIGFjdGl2aXR5LCBub3QgZGVwbG95cy5cbiAgICovXG4gIGJhc2lzOiAnZGVwbG95JyB8ICdydW4nO1xuICAvKiogVGhlIHNjb3BpbmcgYXBwbGllZCAoZWNob2VkIGZvciB0aGUgVUkpOyBgbnVsbGAgd2hlbiB1bnNjb3BlZC4gKi9cbiAgZmlsdGVyczogeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbCB9O1xuICAvKiogRGVwbG95bWVudCBGcmVxdWVuY3kg4oCUIFNVQ0NFRURFRCB0ZXJtaW5hbCBkZXBsb3ltZW50cyBpbiB0aGUgd2luZG93LiAqL1xuICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgLyoqIENvdW50IG9mIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ltZW50cyBwZXIgZGF5IG92ZXIgdGhlIHdpbmRvdy4gKi9cbiAgICBwZXJEYXk6IG51bWJlcjtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIENoYW5nZSBGYWlsdXJlIFJhdGUg4oCUIGZhaWxlZCAvIChzdWNjZWVkZWQgKyBmYWlsZWQpOyBDQU5DRUxFRCBleGNsdWRlZC4gKi9cbiAgY2hhbmdlRmFpbHVyZVJhdGU6IHtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICAvKiogc3VjY2VlZGVkICsgZmFpbGVkICh0aGUgQ0ZSIGRlbm9taW5hdG9yKS4gKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50YWdlLCAw4oCTMTAwLCAxIGRlY2ltYWwuICovXG4gICAgcGN0OiBudW1iZXI7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGRlcGxveW1lbnRzIHRvIGp1ZGdlLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBNZWFuIFRpbWUgVG8gUmVzdG9yZSDigJQgYXZnIGdhcCBmcm9tIGEgZmFpbHVyZSBJTkNJREVOVCB0byBpdHMgcmVjb3ZlcnkuXG4gICAqICBDb25zZWN1dGl2ZSBmYWlsZWQgcnVucyBvZiBhIHBpcGVsaW5lICh3aXRoIG5vIGdyZWVuIHJ1biBiZXR3ZWVuKSBjb2xsYXBzZVxuICAgKiAgaW50byBvbmUgaW5jaWRlbnQ7IHRoZSBnYXAgaXMgbWVhc3VyZWQgZnJvbSB0aGUgZmlyc3QgZmFpbHVyZSdzIEVORCB0byB0aGVcbiAgICogIHJlY292ZXJpbmcgcnVuJ3MgRU5ELiBUaGUgcmVjb3ZlcnkgaXMgdmlzaWJsZSB1cCB0byBhIGxvb2stYWhlYWQgcGFzdCBgdG9gXG4gICAqICBzbyBhIGZhaWx1cmUgbmVhciB0aGUgd2luZG93IGVkZ2UgaXNuJ3Qgc3B1cmlvdXNseSBjb3VudGVkIHVucmVzdG9yZWQuICovXG4gIG1lYW5UaW1lVG9SZXN0b3JlOiB7XG4gICAgLyoqIEZhaWx1cmUgaW5jaWRlbnRzIGluIHRoZSB3aW5kb3cgKG1heGltYWwgcnVucyBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcykuICovXG4gICAgZmFpbHVyZXM6IG51bWJlcjtcbiAgICAvKiogSW5jaWRlbnRzIHRoYXQgd2VyZSBmb2xsb3dlZCBieSBhIHN1Y2NlZWRlZCBydW4gKHJlY292ZXJlZCkuICovXG4gICAgcmVzdG9yZWQ6IG51bWJlcjtcbiAgICAvKiogQXZlcmFnZSByZXN0b3JlIGdhcCBpbiBzZWNvbmRzOyBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBpbmNpZGVudHMuICovXG4gICAgYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gaW5jaWRlbnRzLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBMZWFkIFRpbWUg4oCUIFBST1hZOiBtZWRpYW4gcGlwZWxpbmUgUlVOIFRJTUUgb2Ygc3VjY2VlZGVkIGRlcGxveW1lbnRzLlxuICAgKiAgTk9UIHRydWUgY29tbWl04oaScHJvZCBsZWFkIHRpbWUgKGV4ZWN1dGlvbnMgZG9uJ3QgY2FwdHVyZSBjb21taXQgdGltZSksXG4gICAqICBoZW5jZSBgYXBwcm94OiB0cnVlYCBzbyB0aGUgVUkvZG9jcyBjYW4gbGFiZWwgaXQuICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2NlZWRlZCBkZXBsb3ltZW50cyB3aXRoIGEgZHVyYXRpb24gKHRoZSBtZWRpYW4gc2FtcGxlKS4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIC8qKiBNZWRpYW4gcnVuIHRpbWUgaW4gc2Vjb25kczsgbnVsbCB3aGVuIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBhcHByb3g6IHRydWU7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbn1cblxuLyoqIE9uZSBpbnRlcnZhbCBidWNrZXQgb2YgdGhlIERPUkEgdHJlbmQgKGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlIGZhaWx1cmUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhVHJlbmRQb2ludCB7XG4gIC8qKiBCdWNrZXQgc3RhcnQgKERBVEVfVFJVTkMgb2Ygc3RhcnRlZF9hdCksIElTTyB0ZXh0LiAqL1xuICBwZXJpb2Q6IHN0cmluZztcbiAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95bWVudHMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCBkZXBsb3ltZW50cyBpbiB0aGUgYnVja2V0LiAqL1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIHN1Y2NlZWRlZCArIGZhaWxlZCBpbiB0aGUgYnVja2V0LiAqL1xuICB0b3RhbDogbnVtYmVyO1xuICAvKiogZmFpbGVkL3RvdGFsIGFzIGEgcGVyY2VudCAoMCB3aGVuIHRvdGFsIGlzIDApLiAqL1xuICBjaGFuZ2VGYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIC8qKiBTdGFibGUgcGlwZWxpbmUgaWQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZCBmcm9tIHRoZSBgUElQRUxJTkVfRVZFTlRfSURgXG4gICAqICB0YWcgKD0gdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGUgcmVnaXN0cnkgam9pbiBrZXkuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcbiAgZXZlbnRUeXBlOiAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiAoQWN0aW9uIGV2ZW50cykuICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgb2YgdGhlIGNoYW5nZSBiZWluZyBzaGlwcGVkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSByZWYvYnJhbmNoIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIERlcGxveSB0YXJnZXQgKGUuZy4gXCJwcm9kdWN0aW9uXCIpLiBJdHMgcHJlc2VuY2UgbWFya3MgYSByZWFsIGRlcGxveW1lbnQuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSAIFNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGFyZSBkcm9wcGVkIChhbmQgbG9nZ2VkIGF0IFdBUk5cbiAgICogd2l0aCBzYW1wbGUgaWRzIHNvIGFuIG9wZXJhdG9yIGNhbiBzZWUgd2hlbiBFdmVudEJyaWRnZSBpcyBkZWxpdmVyaW5nXG4gICAqIGV2ZW50cyBmb3IgcGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCkuXG4gICAqXG4gICAqIFJldHVybnMgY291bnRzICsgYSBzYW1wbGUgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gICAgLy8gcGlwZWxpbmUtcmVnaXN0cnkgbG9va3VwIGJlbG93LCBzbyB0aGUgcm91dGUgbGF5ZXIgTVVTVCBlc3RhYmxpc2ggYVxuICAgIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAgIC8vIHRoaXMgbWV0aG9kLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgICAvLyB0aGUgcmlnaHQgZ2F0ZSBmb3IgdGhpcyBzZXJ2ZXItaW50ZXJuYWwgY3Jvc3MtdGVuYW50IGVuZHBvaW50LiBTZWVcbiAgICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgICAvLyBSdW4gaW5zZXJ0IGluc2lkZSB0aGUgdHgsIGJ1dCBDT0xMRUNUIGFmZmVjdGVkIG9yZ3MgYW5kIGludmFsaWRhdGVcbiAgICAvLyBjYWNoZXMgQUZURVIgdGhlIHR4IHJlc29sdmVzLiBLZWVwaW5nIGludmFsaWRhdGlvbiBpbnNpZGUgdGhlIHR4IGhlbGRcbiAgICAvLyB0aGUgcGcgbG9ja3Mgb3BlbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWNoZSByb3VuZC10cmlwcyAoUmVkaXMgb3JcbiAgICAvLyBpbi1tZW1vcnkgaW52YWxpZGF0aW9ucyBhcmUgdW5yZWxhdGVkIHRvIHRoZSB0eCBidXQgc3RpbGwgc2VyaWFsaXplZFxuICAgIC8vIGl0cyBjb21taXQpLiBDYWNoZSBUVEwgaXMgMi01IG1pbiBzbyBmaXJlLWFuZC1mb3JnZXQgcG9zdC1jb21taXQgaXNcbiAgICAvLyBhbiBhY2NlcHRhYmxlIHRyYWRlIGZvciB0aWdodGVyIGxvY2sgd2luZG93cy5cbiAgICBjb25zdCB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcywgYWZmZWN0ZWRPcmdzIH0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBCYXRjaC1yZXNvbHZlIGFsbCB1bmlxdWUgcGlwZWxpbmUgaWRzIGluIG9uZSBxdWVyeVxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQoZXZlbnRzLm1hcChlID0+IGUucGlwZWxpbmVJZCkpXTtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5Um93cyA9IGF3YWl0IHR4XG4gICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICB9KVxuICAgICAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeSlcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCwgdW5pcXVlSWRzKSk7XG5cbiAgICAgIGNvbnN0IGlkTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVJZCwgcl0pKTtcblxuICAgICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIGV2ZW50cyB3aG9zZSBwaXBlbGluZSBpc24ndCByZWdpc3RlcmVkKVxuICAgICAgY29uc3Qgcm93czogQXJyYXk8dHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydD4gPSBbXTtcbiAgICAgIGxldCBza2lwcGVkTG9jYWwgPSAwO1xuICAgICAgY29uc3QgdW5yZWdpc3RlcmVkTG9jYWw6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaWRNYXAuZ2V0KGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgc2tpcHBlZExvY2FsKys7XG4gICAgICAgICAgdW5yZWdpc3RlcmVkTG9jYWwucHVzaChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgLy8gcmVnaXN0cnkucGlwZWxpbmVJZCA9PT0gZXZlbnQucGlwZWxpbmVJZDsgdXNlIHRoZSByZWdpc3RyeSdzIHNvIHRoZVxuICAgICAgICAgIC8vIEZLIGlzIGFsd2F5cyBhIHJvdyB0aGF0IGV4aXN0cywgYW5kIHB1bGwgb3JnSWQgZnJvbSB0aGUgcmVnaXN0cnkgZm9yXG4gICAgICAgICAgLy8gdGVuYW5jeSAobmV2ZXIgdHJ1c3QgdGhlIGNhbGxlcidzIGNsYWltZWQgb3JnKS5cbiAgICAgICAgICBwaXBlbGluZUlkOiByZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiByZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgICBldmVudFNvdXJjZTogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgc3RhdHVzOiBldmVudC5zdGF0dXMsXG4gICAgICAgICAgZXhlY3V0aW9uSWQ6IGV2ZW50LmV4ZWN1dGlvbklkLFxuICAgICAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgICAgIGFjdGlvbk5hbWU6IGV2ZW50LmFjdGlvbk5hbWUsXG4gICAgICAgICAgLy8gSEFSRCBDT05TVFJBSU5UOiBhbiBBV1MgYWNjb3VudCBpZCBtdXN0IE5FVkVSIGJlIHBlcnNpc3RlZC4gVGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBEVVJBQkxFIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGFuZCBtdXN0IG5vdCB0cnVzdCB1cHN0cmVhbTpcbiAgICAgICAgICAvLyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGZhaWx1cmUgZGV0YWlsICYgbWVzc2FnZXMgcm91dGluZWx5IGNhcnJ5XG4gICAgICAgICAgLy8gQVJOcyAoYXJuOmF3czrigKY6PGFjY291bnQtaWQ+OuKApikgYW5kIGJhcmUgMTItZGlnaXQgYWNjb3VudCBpZHMuIFNjcnViXG4gICAgICAgICAgLy8gYm90aCBmcmVlLWZvcm0gZmllbGRzIGhlcmUgYmVmb3JlIGluc2VydCAocGVyLWV2ZW50LCBub24tbXV0YXRpbmcpLlxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXZlbnQuZXJyb3JNZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBldmVudC5zdGFydGVkQXQgPyBuZXcgRGF0ZShldmVudC5zdGFydGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBldmVudC5jb21wbGV0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LmNvbXBsZXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICAgIC8vIERlcGxveS1hdHRyaWJ1dGlvbiBmaWVsZHMg4oCUIHNjcnViYmVkIGxpa2UgdGhlIG90aGVyIGZyZWUtZm9ybSBzdHJpbmdzXG4gICAgICAgICAgLy8gc28gYW4gQVJOL2FjY291bnQgaWQgY2FuIG5ldmVyIGVudGVyIHZpYSBhIHJlZiBvciBlbnZpcm9ubWVudCBuYW1lLlxuICAgICAgICAgIGNvbW1pdFNoYTogZXZlbnQuY29tbWl0U2hhICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuY29tbWl0U2hhKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tbWl0UmVmOiBldmVudC5jb21taXRSZWYgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5jb21taXRSZWYpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbnZpcm9ubWVudDogZXZlbnQuZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5lbnZpcm9ubWVudClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRldGFpbDogZXZlbnQuZGV0YWlsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVycyhldmVudC5kZXRhaWwpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNRUyBpcyBhdC1sZWFzdC1vbmNlLCBzbyBFdmVudEJyaWRnZSBjYW4gZGVsaXZlciB0aGUgc2FtZSBzdGF0ZS1jaGFuZ2VcbiAgICAgIC8vIHR3aWNlLiBgb25Db25mbGljdERvTm90aGluZ2AgKyB0aGUgcGFydGlhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIChwaXBlbGluZV9pZCwgZXhlY3V0aW9uX2lkLCBldmVudF90eXBlLCBzdGF0dXMsIHN0YWdlX25hbWUsIGFjdGlvbl9uYW1lKVxuICAgICAgLy8gbWFrZXMgcmUtZGVsaXZlcnkgaWRlbXBvdGVudC4gYHJldHVybmluZ2AgZ2l2ZXMgdGhlIFJFQUwgaW5zZXJ0ZWQgc2V0IHNvXG4gICAgICAvLyBjb3VudHMgKyBjYWNoZSBpbnZhbGlkYXRpb24gaWdub3JlIGR1cGxpY2F0ZXMuXG4gICAgICBjb25zdCBpbnNlcnRlZFJvd3MgPSByb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lRXZlbnQpLnZhbHVlcyhyb3dzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKClcbiAgICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkIH0pXG4gICAgICAgIDogW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc2VydGVkOiBpbnNlcnRlZFJvd3MubGVuZ3RoLFxuICAgICAgICBza2lwcGVkOiBza2lwcGVkTG9jYWwsXG4gICAgICAgIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiB1bnJlZ2lzdGVyZWRMb2NhbCxcbiAgICAgICAgYWZmZWN0ZWRPcmdzOiBbLi4ubmV3IFNldChpbnNlcnRlZFJvd3MubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBTdXJmYWNlIHRoZSBzaWxlbnQgc2tpcDogYW4gdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkIHVzdWFsbHkgbWVhbnMgdGhlXG4gICAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgICAvLyBQSVBFTElORV9FVkVOVF9JRCB0YWcgaXMgbWlzc2luZy91bnJlYWRhYmxlIGJ5IHRoZSBMYW1iZGEpLiBMb2dnaW5nIGl0XG4gICAgLy8gbWFrZXMgYSBicm9rZW4gam9pbiB2aXNpYmxlIGluc3RlYWQgb2YgbG9va2luZyBsaWtlIFwibm8gYWN0aXZpdHlcIi5cbiAgICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV2ZW50cyBza2lwcGVkOiBwaXBlbGluZSBpZCBub3QgZm91bmQgaW4gcmVnaXN0cnknLCB7XG4gICAgICAgIGNvdW50OiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGgsXG4gICAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAgIC8vIHNob3J0IGVub3VnaCB0aGF0IGEgbWlzc2VkIGludmFsaWRhdGlvbiBzZWxmLWhlYWxzLlxuICAgIGlmIChhZmZlY3RlZE9yZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZU9yZyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkOiBvcmcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgfSksXG4gICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIG9yZy1zY29wZSBwcmVkaWNhdGUgZm9yIGEgcmVwb3J0IHF1ZXJ5LiBXaXRoIGBvcmdJZHNgICh0aGVcbiAgICogb3JnIOKGkiB0ZWFtIHJvbGx1cCDigJQgYSBwYXJlbnQncyBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWApIGl0IGJlY29tZXMgYW5cbiAgICogYElOICguLi4pYCBvdmVyIHRoZSBzdWJ0cmVlOyBvdGhlcndpc2UgdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2AuIFJldHVybnMgYVxuICAgKiBgbXVsdGlgIGZsYWcgc28gY2FsbGVycyBjYW4gcnVuIG11bHRpLW9yZyByZWFkcyB1bmRlciBzeXNhZG1pbiBjb250ZXh0XG4gICAqICh0aGUgc3VidHJlZSBzcGFucyBvcmdzIG91dHNpZGUgdGhlIHJlcXVlc3QncyBSTFMgc2NvcGUpIGFuZCBzYWx0IHRoZVxuICAgKiBjYWNoZSBrZXkuXG4gICAqL1xuICBwcml2YXRlIG9yZ1Njb3BlKG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaWRzID0gb3JnSWRzICYmIG9yZ0lkcy5sZW5ndGggPiAwID8gb3JnSWRzIDogW29yZ0lkXTtcbiAgICBjb25zdCBtdWx0aSA9IGlkcy5sZW5ndGggPiAxO1xuICAgIGNvbnN0IHByZWQgPSBtdWx0aVxuICAgICAgPyBzcWxgSU4gKCR7c3FsLmpvaW4oaWRzLm1hcCgoaWQpID0+IHNxbGAke2lkfWApLCBzcWxgLCBgKX0pYFxuICAgICAgOiBzcWxgPSAke2lkc1swXX1gO1xuICAgIHJldHVybiB7IHByZWQsIG11bHRpIH07XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcmVwb3J0IHJlYWQuIFNpbmdsZS1vcmcgcmVhZHMgdXNlIHRoZSBwZXItb3JnIGNhY2hlIChpbnZhbGlkYXRlZCBvblxuICAgKiB0aGF0IG9yZydzIGV2ZW50IGluZ2VzdCkuIFJvbGx1cCAobXVsdGktb3JnKSByZWFkcyAqKmJ5cGFzcyB0aGUgY2FjaGUqKiBhbmRcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQ6IHRoZXkncmUgYWRtaW4tb25seSBhbmQgbG93ZXItZnJlcXVlbmN5LCBhbmQgYVxuICAgKiBjaGlsZCBvcmcncyBldmVudCBpbmdlc3QgY2FuJ3QgaW52YWxpZGF0ZSBhIHBhcmVudCdzIHJvbGx1cCBlbnRyeSAocmVwb3J0aW5nXG4gICAqIGhhcyBubyBvcmcgdHJlZSksIHNvIGNhY2hpbmcgdGhlbSB3b3VsZCBzZXJ2ZSBzdGFsZSBhZ2dyZWdhdGVzLiBBbHdheXMgZnJlc2guXG4gICAqL1xuICBwcml2YXRlIHJ1blJlcG9ydDxUPihjYWNoZUtleTogc3RyaW5nLCBtdWx0aTogYm9vbGVhbiwgZXhlYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBtdWx0aVxuICAgICAgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBleGVjKVxuICAgICAgOiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoY2FjaGVLZXksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMSBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9KTogUHJvbWlzZTxFeGVjdXRpb25Db3VudFtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICAvLyBPcHRpb25hbCBbZnJvbSx0b10gd2luZG93IG9uIHRoZSBleGVjdXRpb24ncyBzdGFydGVkX2F0LCBtaXJyb3JpbmcgdGhlXG4gICAgLy8gc2libGluZyB0aW1lc2VyaWVzIHJlcG9ydHMgc28gdGhlIGRhc2hib2FyZCBkYXRlLXJhbmdlIHBpY2tlciBuYXJyb3dzIHRoZVxuICAgIC8vIGNvdW50IHRvbyAoYW4gZW1wdHkgcmFuZ2UgPSBhbGwtdGltZSwgcHJlc2VydmluZyB0aGUgcHJpb3IgYmVoYXZpb3IpLiBUaGVcbiAgICAvLyByYW5nZSByaWRlcyB0aGUgSk9JTiBzbyBwaXBlbGluZXMgd2l0aCBubyBpbi13aW5kb3cgZXZlbnRzIHN0aWxsIGxpc3RcbiAgICAvLyAoTEVGVCBzZW1hbnRpY3MgcHJlc2VydmVkIHZpYSB0aGUgaW5uZXItam9pbiBmaWx0ZXIg4oCUIGEgcGlwZWxpbmUgd2l0aCB6ZXJvXG4gICAgLy8gbWF0Y2hpbmcgZXZlbnRzIGRyb3BzIGZyb20gdGhlIGNvdW50LCBzYW1lIGFzIGJlZm9yZSBmb3IgaXRzIHdpbmRvdykuXG4gICAgY29uc3QgcmFuZ2VDbGF1c2UgPSByYW5nZT8uZnJvbSAmJiByYW5nZT8udG9cbiAgICAgID8gc3FsYEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtyYW5nZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3JhbmdlLnRvfTo6dGltZXN0YW1wdHpgXG4gICAgICA6IHNxbGBgO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBwLmlzX2FjdGl2ZSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgcC5pZFxuICAgICAgICBPUkRFUiBCWSB0b3RhbCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RXhlY3V0aW9uQ291bnQ+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmV4ZWMtY291bnQ6JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuMWIgUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gcmFuZ2U/LmZyb20gJiYgcmFuZ2U/LnRvXG4gICAgICA/IHNxbGBBTkQgZS5zdGFydGVkX2F0ID49ICR7cmFuZ2UuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHtyYW5nZS50b306OnRpbWVzdGFtcHR6YFxuICAgICAgOiBzcWxgYDtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdmYWlsZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0NBTkNFTEVEJykgVEhFTiAnY2FuY2VsZWQnXG4gICAgICAgICAgICBFTFNFICdpbi1wcm9ncmVzcydcbiAgICAgICAgICBFTkQgQVMgc3RhdHVzLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OmludCBBUyBkdXJhdGlvbl9tcyxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuc3RhZ2VfbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19zdGFnZSxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuYWN0aW9uX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX2FjdGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8UGlwZWxpbmVFeGVjdXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4yIFN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUgZm9yIGFuIG9yZy4gKi9cbiAgYXN5bmMgZ2V0U3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN1Y2Nlc3MtcmF0ZToke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPER1cmF0aW9uU3RhdHM+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS42IFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUJvdHRsZW5lY2s+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTphY3Rpb24tZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjggRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06ZXJyb3JzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIFNVQlNUUklORyhlLmVycm9yX21lc3NhZ2UgRlJPTSAxIEZPUiAyMDApIEFTIGVycm9yX3BhdHRlcm4sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEFTIGFmZmVjdGVkX3BpcGVsaW5lcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJyBBTkQgZS5lcnJvcl9tZXNzYWdlIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFcnJvckVudHJ5PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjkgRE9SQSBtZXRyaWNzIG92ZXIgW2Zyb20sdG9dIChzdGFydGVkX2F0IHJhbmdlKSwgb3JnLXNjb3BlZCArIHJvbGx1cC1hd2FyZS5cbiAgICpcbiAgICogQWxsIGZvdXIgbWV0cmljcyBkZXJpdmUgZnJvbSBhIHBlci1leGVjdXRpb24gcm9sbC11cCBvZiBURVJNSU5BTCBQSVBFTElORVxuICAgKiBldmVudHMgKG9uZSByb3cgcGVyIGV4ZWN1dGlvbl9pZCtwaXBlbGluZV9pZDsgRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELFxuICAgKiB0aGVuIENBTkNFTEVEL1NUT1BQRUQg4oCUIG1pcnJvcmluZyBgbGlzdFBpcGVsaW5lRXhlY3V0aW9uc2ApLiBUaGUgc2NhbiBpc1xuICAgKiBnYXRlZCBieSB0aGUgYHAub3JnX2lkICR7cHJlZH1gIGpvaW4gZXhhY3RseSBsaWtlIHRoZSBzaWJsaW5nIHJlcG9ydHMsIHNvIGFcbiAgICogcm9sbHVwIHBhc3NlcyB0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlIGFuZCBhIGZvcmVpZ24gb3JnJ3MgZXhlY3V0aW9ucyBuZXZlclxuICAgKiBlbnRlciB0aGUgYWdncmVnYXRlLlxuICAgKlxuICAgKiBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgQ09SRS13aW5kb3cgZXhlY3V0aW9ucyAoW2Zyb20sdG9dKS4gTVRUUiBpc1xuICAgKiBwZXItSU5DSURFTlQ6IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGNvbGxhcHNlIGludG8gb25lIGluY2lkZW50IGFuZCB0aGVcbiAgICogcmVjb3ZlcnkgbG9va3VwIG1heSBzZWUgdGhlIG5leHQgc3VjY2VzcyB1cCB0byBNVFRSX1JFU1RPUkVfTE9PS0FIRUFEIHBhc3RcbiAgICogYHRvYCwgc28gYSBmYWlsdXJlIG5lYXIgdGhlIGVkZ2UgaXNuJ3QgcmlnaHQtY2Vuc29yZWQgaW50byBcIm5ldmVyIHJlc3RvcmVkXCIuXG4gICAqIFRoZSBzY2FuIGJvdW5kIGlzIHRoZXJlZm9yZSBgW2Zyb20sIHRvICsgbG9vay1haGVhZF1gOyB0aGUgc3RhcnRlZF9hdCByYW5nZVxuICAgKiBzdGlsbCByaWRlcyB0aGUgc2FtZSBpbmRleCBhcyB0aGUgc2libGluZyByZXBvcnRzLlxuICAgKlxuICAgKiBESVNDTE9TVVJFOiBieSBkZWZhdWx0IERGL0NGUi9NVFRSIGFyZSBSVU4tYmFzZWQgKGFueSBzdWNjZXNzZnVsIFBJUEVMSU5FXG4gICAqIHJ1biA9IGEgXCJkZXBsb3ltZW50XCIpLCBhbmQgTGVhZCBUaW1lIGlzIGFkZGl0aW9uYWxseSBhIHJ1bi10aW1lIFBST1hZXG4gICAqIGZsYWdnZWQgYGFwcHJveDogdHJ1ZWAuIFBhc3MgYGVudmlyb25tZW50YCBvciBgZGVwbG95c09ubHlgIHRvIHNjb3BlIHRvXG4gICAqIGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggYSByZWFsIGRlcGxveSB0YXJnZXQg4oCUIHRoZSByZXNwb25zZSBgYmFzaXNgIHJlcG9ydHNcbiAgICogd2hpY2ggd2FzIHVzZWQuIFNlZSB0aGUgRG9yYU1ldHJpY3MgZG9jICsgZG9jcy9kb3JhLW1ldHJpY3MubWQuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzLnBpcGVsaW5lSWQgICAgcmVzdHJpY3QgdG8gb25lIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSlcbiAgICogQHBhcmFtIG9wdHMuZW52aXJvbm1lbnQgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgZGVwbG95ZWQgdG8gdGhpcyB0YXJnZXRcbiAgICogQHBhcmFtIG9wdHMuZGVwbG95c09ubHkgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggQU5ZIGVudmlyb25tZW50XG4gICAqL1xuICBhc3luYyBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYU1ldHJpY3M+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICAgIC8vIE9wdGlvbmFsIGRlcGxveS1zY29waW5nIC8gcGVyLXBpcGVsaW5lIHByZWRpY2F0ZXMsIGZvbGRlZCBpbnRvIHRoZSBleGVjc1xuICAgIC8vIHNjYW4gc28gZmFpbHVyZXMgQU5EIHRoZWlyIHJlY292ZXJ5IHN1Y2Nlc3NlcyBhcmUgZmlsdGVyZWQgY29uc2lzdGVudGx5LlxuICAgIGNvbnN0IHsgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSwgYmFzaXMgfSA9IGRvcmFTY29wZUNsYXVzZXMob3B0cyk7XG4gICAgLy8gU2NhbiB0aGUgQ09SRSB3aW5kb3cgcGx1cyBhIGxvb2stYWhlYWQgdGFpbDogdGhlIGV4dHJhIHRhaWwgZXhpc3RzIG9ubHlcbiAgICAvLyBzbyBhIGxhdGUgZmFpbHVyZSBjYW4gc3RpbGwgZmluZCBpdHMgcmVjb3ZlcnkgKHNlZSB0aGUgcmVzdG9yZSBDVEUpLlxuICAgIGNvbnN0IGV4ZWNzID0gZXhlY3NDdGUoe1xuICAgICAgcHJlZCxcbiAgICAgIHBpcGVsaW5lQ2xhdXNlLFxuICAgICAgZGVwbG95Q2xhdXNlLFxuICAgICAgZnJvbSxcbiAgICAgIGNvbHVtbnM6IHNxbGBcbiAgICAgICAgICAgIGUucGlwZWxpbmVfaWQsXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGVuZGVkX2F0LFxuICAgICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEFTIGR1cmF0aW9uX21zYCxcbiAgICAgIHRvQm91bmQ6IHNxbGAke3RvfTo6dGltZXN0YW1wdHogKyAke01UVFJfUkVTVE9SRV9MT09LQUhFQUR9OjppbnRlcnZhbGAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApLFxuICAgICAgICAtLSBDb3JlLXdpbmRvdyBleGVjdXRpb25zIChbZnJvbSx0b10pOyBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgdGhlc2UuXG4gICAgICAgIC0tIFRoZSBsb29rLWFoZWFkIHJvd3MgYWJvdmUgYXJlIHVzZWQgT05MWSBhcyBNVFRSIHJlY292ZXJ5IGNhbmRpZGF0ZXMuXG4gICAgICAgIGNvcmUgQVMgKFxuICAgICAgICAgIFNFTEVDVCAqIEZST00gZXhlY3MgV0hFUkUgc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgKSxcbiAgICAgICAgZGYgQVMgKFxuICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGNmciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGx0IEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZGVwbG95bWVudHMsXG4gICAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC41KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6ZmxvYXQgQVMgbWVkaWFuX21zXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICAgV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcgQU5EIGR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICksXG4gICAgICAgIC0tIEZvciBlYWNoIGNvcmUtd2luZG93IGZhaWx1cmUsIGZpbmQgdGhlIEVORCBvZiBpdHMgcmVjb3ZlcmluZyBydW46IHRoZVxuICAgICAgICAtLSBuZXh0IFNVQ0NFRURFRCBydW4gb2YgdGhlIHNhbWUgcGlwZWxpbmUgdGhhdCBFTkRFRCBhZnRlciB0aGlzIGZhaWx1cmVcbiAgICAgICAgLS0gZW5kZWQgKHZpc2libGUgaW50byB0aGUgbG9vay1haGVhZCB0YWlsKS4gU0VMRUNUIGFuZCBNRUFTVVJFIGJvdGgga2V5XG4gICAgICAgIC0tIG9mZiBlbmRlZF9hdCBzbyB0aGV5IHN0YXkgY29uc2lzdGVudCAtLSB0aGUgaW5jaWRlbnQgZ2FwIGlzXG4gICAgICAgIC0tIHJlc3RvcmVkX2F0IChzdWNjZXNzIGVuZCkgbWludXMgaW5jaWRlbnRfc3RhcnRlZCAoZmlyc3QgZmFpbHVyZSBlbmQpLFxuICAgICAgICAtLSBzbyBwaWNraW5nIHRoZSByZWNvdmVyeSBieSBlbmRlZF9hdCAobm90IHN0YXJ0ZWRfYXQpIHJ1bGVzIG91dCB0aGVcbiAgICAgICAgLS0gbmVnYXRpdmUgZ2FwIHRoYXQgYSBjb25jdXJyZW50IHN1Y2Nlc3Mgd2hpY2ggU1RBUlRFRCBhZnRlciB0aGUgZmFpbHVyZVxuICAgICAgICAtLSBidXQgRU5ERUQgYmVmb3JlIGl0IHdvdWxkIG90aGVyd2lzZSBmb2xkIGludG8gQVZHLiBNZWFzdXJpbmcgZnJvbSB0aGVcbiAgICAgICAgLS0gZmFpbHVyZSdzIEVORCAobm90IHN0YXJ0KSBhbHNvIGtlZXBzIHRoZSBmYWlsZWQgcnVuJ3Mgb3duIGR1cmF0aW9uIG91dFxuICAgICAgICAtLSBvZiByZXN0b3JlIHRpbWUuIE9yZGVyaW5nIGJ5IGVuZGVkX2F0IG1ha2VzIHRoZSBpbmNpZGVudCBjb2xsYXBzZSBmYWxsXG4gICAgICAgIC0tIG91dCBuYXR1cmFsbHk6IGEgZ3JlZW4gcnVuIGVuZGluZyBiZXR3ZWVuIHR3byBmYWlsdXJlcyBzcGxpdHMgdGhlbS5cbiAgICAgICAgcmVzdG9yZSBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBmLnBpcGVsaW5lX2lkLFxuICAgICAgICAgICAgZi5lbmRlZF9hdCBBUyBmYWlsX2VuZGVkLFxuICAgICAgICAgICAgKFNFTEVDVCBzLmVuZGVkX2F0IEZST00gZXhlY3Mgc1xuICAgICAgICAgICAgICBXSEVSRSBzLnBpcGVsaW5lX2lkID0gZi5waXBlbGluZV9pZCBBTkQgcy5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgICAgICAgIEFORCBzLmVuZGVkX2F0ID4gZi5lbmRlZF9hdFxuICAgICAgICAgICAgICBPUkRFUiBCWSBzLmVuZGVkX2F0IEFTQyBMSU1JVCAxKSBBUyByZXN0b3JlZF9hdFxuICAgICAgICAgIEZST00gY29yZSBmXG4gICAgICAgICAgV0hFUkUgZi5zdGF0dXMgPSAnRkFJTEVEJ1xuICAgICAgICApLFxuICAgICAgICAtLSBDb2xsYXBzZSB0byBJTkNJREVOVFM6IGZhaWx1cmVzIHNoYXJpbmcgdGhlIHNhbWUgcmVjb3ZlcnkgKGkuZS4gd2l0aFxuICAgICAgICAtLSBubyBncmVlbiBydW4gYmV0d2VlbiB0aGVtKSBhcmUgb25lIGluY2lkZW50LCBzdGFydGluZyBhdCB0aGUgZmlyc3RcbiAgICAgICAgLS0gZmFpbHVyZSdzIGVuZC4gVW5yZWNvdmVyZWQgZmFpbHVyZXMgc2hhcmUgcmVzdG9yZWRfYXQgPSBOVUxMIGFuZCBmb3JtXG4gICAgICAgIC0tIHRoZSBzaW5nbGUgdHJhaWxpbmcgb3BlbiBpbmNpZGVudCBwZXIgcGlwZWxpbmUuXG4gICAgICAgIGluY2lkZW50cyBBUyAoXG4gICAgICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCByZXN0b3JlZF9hdCwgTUlOKGZhaWxfZW5kZWQpIEFTIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICBGUk9NIHJlc3RvcmVcbiAgICAgICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZCwgcmVzdG9yZWRfYXRcbiAgICAgICAgKSxcbiAgICAgICAgbXR0ciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgICAgLS0gcmVzdG9yZWQgbXVzdCBlcXVhbCB0aGUgY291bnQgb2YgaW5jaWRlbnRzIHRoYXQgYWN0dWFsbHlcbiAgICAgICAgICAgIC0tIGNvbnRyaWJ1dGUgdG8gYXZnX3NlY29uZHMuIEd1YXJkIG9uIGluY2lkZW50X3N0YXJ0ZWQgdG9vOiBhXG4gICAgICAgICAgICAtLSBmYWlsdXJlIHdpdGggYSBOVUxMIGNvbXBsZXRlZF9hdCB5aWVsZHMgYSBOVUxMIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICAgIC0tIHRoYXQgY29udHJpYnV0ZXMgTlVMTCAobm90IGEgcmVhbCBnYXApIHRvIEFWRywgc28gaXQgbXVzdCBub3QgYmVcbiAgICAgICAgICAgIC0tIGNvdW50ZWQgYXMgcmVzdG9yZWQgZWl0aGVyIC0tIG90aGVyd2lzZSByZXN0b3JlZCBjb3VsZCBleGNlZWRcbiAgICAgICAgICAgIC0tIHRoZSBudW1iZXIgb2YgbWVhc3VyZWQgaW5jaWRlbnRzLlxuICAgICAgICAgICAgQ09VTlQoKikgRklMVEVSIChcbiAgICAgICAgICAgICAgV0hFUkUgcmVzdG9yZWRfYXQgSVMgTk9UIE5VTEwgQU5EIGluY2lkZW50X3N0YXJ0ZWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAgICk6OmludCBBUyByZXN0b3JlZCxcbiAgICAgICAgICAgIEFWRyhFWFRSQUNUKEVQT0NIIEZST00gKHJlc3RvcmVkX2F0IC0gaW5jaWRlbnRfc3RhcnRlZCkpKVxuICAgICAgICAgICAgICBGSUxURVIgKFdIRVJFIHJlc3RvcmVkX2F0IElTIE5PVCBOVUxMIEFORCBpbmNpZGVudF9zdGFydGVkIElTIE5PVCBOVUxMKTo6ZmxvYXQgQVMgYXZnX3NlY29uZHNcbiAgICAgICAgICBGUk9NIGluY2lkZW50c1xuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGRmLmRlcGxveW1lbnRzIEFTIGRmX2RlcGxveW1lbnRzLFxuICAgICAgICAgIGNmci5mYWlsZWQgQVMgY2ZyX2ZhaWxlZCxcbiAgICAgICAgICBjZnIudG90YWwgQVMgY2ZyX3RvdGFsLFxuICAgICAgICAgIGx0LmRlcGxveW1lbnRzIEFTIGx0X2RlcGxveW1lbnRzLFxuICAgICAgICAgIGx0Lm1lZGlhbl9tcyBBUyBsdF9tZWRpYW5fbXMsXG4gICAgICAgICAgbXR0ci5mYWlsdXJlcyBBUyBtdHRyX2ZhaWx1cmVzLFxuICAgICAgICAgIG10dHIucmVzdG9yZWQgQVMgbXR0cl9yZXN0b3JlZCxcbiAgICAgICAgICBtdHRyLmF2Z19zZWNvbmRzIEFTIG10dHJfYXZnX3NlY29uZHNcbiAgICAgICAgRlJPTSBkZiwgY2ZyLCBsdCwgbXR0clxuICAgICAgYCkudGhlbihyID0+IHRoaXMuc2hhcGVEb3JhKGRyaXp6bGVSb3dzPERvcmFSb3c+KHIucm93cylbMF0sIGZyb20sIHRvLCBiYXNpcywgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9KSkpO1xuICAgIC8vIGBlbnZpcm9ubWVudGAgV0lOUyBvdmVyIGBkZXBsb3lzT25seWAgaW4gZG9yYVNjb3BlQ2xhdXNlcywgc28gd2l0aCBhblxuICAgIC8vIGVudmlyb25tZW50IHNldCB0aGUgZGVwbG95c09ubHkgZmxhZyBuZXZlciBhZmZlY3RzIHRoZSBTUUwg4oCUIGFwcGVuZCB0aGVcbiAgICAvLyAnZCcgbWFya2VyIG9ubHkgd2hlbiBpdCBnZW51aW5lbHkgY2hhbmdlcyB0aGUgcXVlcnkgKGVudmlyb25tZW50IGFic2VudCksXG4gICAgLy8gb3RoZXJ3aXNlIGB7ZW52aXJvbm1lbnQ6J3Byb2QnLCBkZXBsb3lzT25seTp0cnVlfWAgd291bGQgbWludCBhIHJlZHVuZGFudFxuICAgIC8vIGNhY2hlIGVudHJ5IGlkZW50aWNhbCB0byBge2Vudmlyb25tZW50Oidwcm9kJ31gLlxuICAgIGNvbnN0IGRlcGxveU1hcmtlciA9ICFlbnZpcm9ubWVudCAmJiBkZXBsb3lzT25seSA/ICdkJyA6ICcnO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhOiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveU1hcmtlcn1gO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiBTaGFwZSBhIHNpbmdsZSBET1JBIGFnZ3JlZ2F0ZSByb3cgaW50byB0aGUgcHVibGljIHtAbGluayBEb3JhTWV0cmljc30uICovXG4gIHByaXZhdGUgc2hhcGVEb3JhKFxuICAgIHJvdzogRG9yYVJvdyB8IHVuZGVmaW5lZCxcbiAgICBmcm9tOiBzdHJpbmcsXG4gICAgdG86IHN0cmluZyxcbiAgICBiYXNpczogRG9yYU1ldHJpY3NbJ2Jhc2lzJ10sXG4gICAgZmlsdGVyczogeyBwaXBlbGluZUlkPzogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICApOiBEb3JhTWV0cmljcyB7XG4gICAgLy8gYEZST00gZGYsIGNmciwgbHQsIG10dHJgIGFsd2F5cyB5aWVsZHMgZXhhY3RseSBvbmUgcm93IChlYWNoIENURSBpcyBhXG4gICAgLy8gc2luZ2xlLXJvdyBhZ2dyZWdhdGUpLCBidXQgZ3VhcmQgYWdhaW5zdCBhbiBlbXB0eSByZXN1bHQgZGVmZW5zaXZlbHkuXG4gICAgY29uc3QgcjogRG9yYVJvdyA9IHJvdyA/PyB7fTtcblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gTnVtYmVyKHIuZGZfZGVwbG95bWVudHMpIHx8IDA7XG4gICAgLy8gRmxvb3IgdGhlIGRpdmlzb3IgYXQgb25lIGRheTogYSB3aW5kb3cgc2hvcnRlciB0aGFuIGEgZGF5IChpbmNsLiB0aGVcbiAgICAvLyBkZWdlbmVyYXRlIGZyb209PXRvKSBoYXMgbm8gbWVhbmluZ2Z1bCBzdWItZGF5IHJhdGUsIHNvIGl0J3MgdHJlYXRlZCBhcyBhXG4gICAgLy8gc2luZ2xlIGRheSByYXRoZXIgdGhhbiBleHRyYXBvbGF0ZWQgb3IgbWlzbGFiZWxlZCBhcyBhIHJhdyBjb3VudC5cbiAgICAvLyBGbG9vciBhdCBvbmUgZGF5IGFuZCBndWFyZCBhZ2FpbnN0IHVucGFyc2VhYmxlIGRhdGVzIChEYXRlLnBhcnNlIOKGkiBOYU4sXG4gICAgLy8gd2hpY2ggd291bGQgb3RoZXJ3aXNlIHByb3BhZ2F0ZSB0aHJvdWdoIHBlckRheSkuIEZhbGxzIGJhY2sgdG8gYSAxLWRheVxuICAgIC8vIHdpbmRvdyBzbyBhIGJhZCByYW5nZSB5aWVsZHMgdGhlIHJhdyBjb3VudCBhcyB0aGUgcmF0ZSwgbmV2ZXIgTmFOLlxuICAgIGNvbnN0IHNwYW5EYXlzID0gKERhdGUucGFyc2UodG8pIC0gRGF0ZS5wYXJzZShmcm9tKSkgLyA4NjQwMDAwMDtcbiAgICBjb25zdCBkYXlzID0gTnVtYmVyLmlzRmluaXRlKHNwYW5EYXlzKSA/IE1hdGgubWF4KHNwYW5EYXlzLCAxKSA6IDE7XG4gICAgLy8gQmFuZCBvbiB0aGUgVU5ST1VOREVEIHJhdGU7IHJvdW5kIG9ubHkgZm9yIGRpc3BsYXkuIFJvdW5kaW5nIGZpcnN0IHdvdWxkXG4gICAgLy8gbWlzbGFiZWwgZXhhY3Qgd2Vla2x5L21vbnRobHkgYm91bmRhcmllcyAoZS5nLiAxIGRlcGxveSAvIDMwIGRheXMg4oaSXG4gICAgLy8gMC4wMzMzIHJvdW5kcyB0byAwLjAzIDwgMS8zMCDihpIgd3JvbmdseSBcImxvd1wiIGluc3RlYWQgb2YgXCJtZWRpdW1cIikuXG4gICAgY29uc3QgcmF3UGVyRGF5ID0gZGVwbG95bWVudHMgLyBkYXlzO1xuICAgIGNvbnN0IHBlckRheSA9IHJvdW5kKHJhd1BlckRheSwgMik7XG5cbiAgICBjb25zdCBmYWlsZWQgPSBOdW1iZXIoci5jZnJfZmFpbGVkKSB8fCAwO1xuICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHIuY2ZyX3RvdGFsKSB8fCAwO1xuICAgIGNvbnN0IHJhd1BjdCA9IHRvdGFsID4gMCA/IChmYWlsZWQgLyB0b3RhbCkgKiAxMDAgOiAwO1xuICAgIGNvbnN0IHBjdCA9IHJvdW5kKHJhd1BjdCwgMSk7XG5cbiAgICAvLyBCYW5kIHJlc3RvcmUvbGVhZC10aW1lIG9uIHRoZSBSQVcgKHByZS1yb3VuZCkgc2Vjb25kcywgdGhlIHNhbWUgXCJiYW5kIG9uXG4gICAgLy8gdGhlIHVucm91bmRlZCB2YWx1ZVwiIHByaW5jaXBsZSB1c2VkIGZvciBwZXJEYXkvcGN0IGFib3ZlOyBrZWVwIHRoZSByb3VuZGVkXG4gICAgLy8gdmFsdWVzIGZvciB0aGUgcmVzcG9uc2UgZmllbGRzLiBJbW1hdGVyaWFsIGF0IHRoZSBob3VyL2RheSB0aHJlc2hvbGRzLCBidXRcbiAgICAvLyBpdCBtYWtlcyB0aGUgcHJpbmNpcGxlIHVuaWZvcm0gYWNyb3NzIGFsbCBmb3VyIG1ldHJpY3MuXG4gICAgY29uc3QgZmFpbHVyZXMgPSBOdW1iZXIoci5tdHRyX2ZhaWx1cmVzKSB8fCAwO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gTnVtYmVyKHIubXR0cl9yZXN0b3JlZCkgfHwgMDtcbiAgICBjb25zdCByYXdBdmdTZWNvbmRzID0gZmFpbHVyZXMgPiAwICYmIHIubXR0cl9hdmdfc2Vjb25kcyAhPSBudWxsXG4gICAgICA/IE51bWJlcihyLm10dHJfYXZnX3NlY29uZHMpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgYXZnU2Vjb25kcyA9IHJhd0F2Z1NlY29uZHMgIT0gbnVsbCA/IHJvdW5kKHJhd0F2Z1NlY29uZHMsIDEpIDogbnVsbDtcblxuICAgIGNvbnN0IGx0RGVwbG95bWVudHMgPSBOdW1iZXIoci5sdF9kZXBsb3ltZW50cykgfHwgMDtcbiAgICBjb25zdCByYXdNZWRpYW5TZWNvbmRzID0gci5sdF9tZWRpYW5fbXMgIT0gbnVsbFxuICAgICAgPyBOdW1iZXIoci5sdF9tZWRpYW5fbXMpIC8gMTAwMFxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IG1lZGlhblNlY29uZHMgPSByYXdNZWRpYW5TZWNvbmRzICE9IG51bGwgPyByb3VuZChyYXdNZWRpYW5TZWNvbmRzLCAxKSA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93OiB7IGZyb20sIHRvIH0sXG4gICAgICBiYXNpcyxcbiAgICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICAgIGRlcGxveW1lbnRGcmVxdWVuY3k6IHsgZGVwbG95bWVudHMsIHBlckRheSwgbGV2ZWw6IGRvcmFMZXZlbEZvckZyZXF1ZW5jeShyYXdQZXJEYXksIGRlcGxveW1lbnRzKSB9LFxuICAgICAgY2hhbmdlRmFpbHVyZVJhdGU6IHsgZmFpbGVkLCB0b3RhbCwgcGN0LCBsZXZlbDogZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShyYXdQY3QsIHRvdGFsKSB9LFxuICAgICAgbWVhblRpbWVUb1Jlc3RvcmU6IHsgZmFpbHVyZXMsIHJlc3RvcmVkLCBhdmdTZWNvbmRzLCBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShyYXdBdmdTZWNvbmRzKSB9LFxuICAgICAgbGVhZFRpbWU6IHsgZGVwbG95bWVudHM6IGx0RGVwbG95bWVudHMsIG1lZGlhblNlY29uZHMsIGFwcHJveDogdHJ1ZSwgbGV2ZWw6IGRvcmFMZXZlbEZvckxlYWRUaW1lKHJhd01lZGlhblNlY29uZHMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjliIERPUkEgdHJlbmQg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlLWZhaWx1cmUgcmF0ZSBidWNrZXRlZCBieVxuICAgKiBgaW50ZXJ2YWxgIChkYXkvd2Vlay9tb250aCkgZm9yIGEgc3BhcmtsaW5lLiBQZXItZXhlY3V0aW9uIHJvbGx1cCAob25lIHJvd1xuICAgKiBwZXIgZXhlY3V0aW9uLCBGQUlMRUQgd2lucykgYnVja2V0ZWQgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQuIFNoYXJlc1xuICAgKiB0aGUgYGdldERvcmFNZXRyaWNzYCBzY29waW5nIChvcmcvcm9sbHVwLCBwaXBlbGluZUlkLCBkZXBsb3ktc2NvcGluZyk7IE1UVFJcbiAgICogYW5kIGxlYWQgdGltZSBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkICh0b28gaGVhdnkgdG8gYnVja2V0IG1lYW5pbmdmdWxseSkuXG4gICAqL1xuICBhc3luYyBnZXREb3JhVHJlbmQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnRlcnZhbDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgZGVwbG95c09ubHkgfSA9IG9wdHM7XG4gICAgY29uc3QgeyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlIH0gPSBkb3JhU2NvcGVDbGF1c2VzKG9wdHMpO1xuICAgIC8vIFNhbWUgZXhlY3Mgcm9sbC11cCBhcyBnZXREb3JhTWV0cmljcyAoc2hhcmVkIGJ1aWxkZXIg4oCUIHN0YXR1cyBzZXQgK1xuICAgIC8vIHByZWRpY2F0ZSBjYW4ndCBkcmlmdCk7IHRoZSB0cmVuZCBuZWVkcyBvbmx5IHN0YXJ0ZWRfYXQgb3ZlciB0aGUgY29yZVxuICAgIC8vIHdpbmRvdyAobm8gTVRUUiBsb29rLWFoZWFkLCBubyBlbmRlZF9hdC9kdXJhdGlvbiBjb2x1bW5zKS5cbiAgICBjb25zdCBleGVjcyA9IGV4ZWNzQ3RlKHtcbiAgICAgIHByZWQsXG4gICAgICBwaXBlbGluZUNsYXVzZSxcbiAgICAgIGRlcGxveUNsYXVzZSxcbiAgICAgIGZyb20sXG4gICAgICBjb2x1bW5zOiBzcWxgXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXRgLFxuICAgICAgdG9Cb3VuZDogc3FsYCR7dG99Ojp0aW1lc3RhbXB0emAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIHN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIC0tIHF1b3RlZCBhbGlhcyBzbyB0aGUgcmF3IHJvdyBrZXkgaXMgZXhhY3RseSB0aGUgRG9yYVRyZW5kUG9pbnQgZmllbGRcbiAgICAgICAgICBDT0FMRVNDRShST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpLCAwKSAqIDEwMCwgMSksIDApOjpmbG9hdCBBUyBcImNoYW5nZUZhaWx1cmVQY3RcIlxuICAgICAgICBGUk9NIGV4ZWNzXG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxEb3JhVHJlbmRQb2ludD4oci5yb3dzKSkpO1xuICAgIC8vIE9taXQgdGhlIGRlcGxveXNPbmx5IG1hcmtlciB3aGVuIGVudmlyb25tZW50IGlzIHNldDogaXQgd2lucyBpblxuICAgIC8vIGRvcmFTY29wZUNsYXVzZXMsIHNvIHRoZSBTUUwgKGFuZCB0aHVzIHRoZSBjb3JyZWN0IGNhY2hlIGtleSkgaXMgaWRlbnRpY2FsXG4gICAgLy8gdG8gdGhlIGVudmlyb25tZW50LW9ubHkgY2FzZS4gT25seSBhcHBlbmQgJ2QnIHdoZW4gaXQgY2hhbmdlcyB0aGUgcXVlcnkuXG4gICAgY29uc3QgZGVwbG95TWFya2VyID0gIWVudmlyb25tZW50ICYmIGRlcGxveXNPbmx5ID8gJ2QnIDogJyc7XG4gICAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmEtdHJlbmQ6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZGVwbG95TWFya2VyfWA7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGtleSwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDI6IFBsdWdpbiBJbnZlbnRvcnkgJiBCdWlsZHMg4pSA4pSAXG5cbiAgLyoqIDIuMSBQbHVnaW4gc3VtbWFyeSDigJQgY291bnRzIGFuZCBicmVha2Rvd25zLiAqL1xuICBhc3luYyBnZXRQbHVnaW5TdW1tYXJ5KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpblN1bW1hcnk+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1zdW1tYXJ5YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBhY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBOT1QgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBpbmFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5hY2Nlc3NNb2RpZmllcn0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uYWNjZXNzTW9kaWZpZXJ9ID0gJ3ByaXZhdGUnKTo6aW50IEFTIHByaXZhdGUsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgJHtzY2hlbWEucGx1Z2luLm5hbWV9KTo6aW50IEFTIHVuaXF1ZV9uYW1lc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICBgKSk7XG4gICAgICByZXR1cm4gKGRyaXp6bGVSb3dzPFBsdWdpblN1bW1hcnk+KHJvd3Mucm93cylbMF0gfHwgeyB0b3RhbDogMCwgYWN0aXZlOiAwLCBpbmFjdGl2ZTogMCwgcHVibGljOiAwLCBwcml2YXRlOiAwLCB1bmlxdWVOYW1lczogMCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAyLjIgVHlwZSAmIGNvbXB1dGUgZGlzdHJpYnV0aW9uLiAqL1xuICBhc3luYyBnZXRQbHVnaW5EaXN0cmlidXRpb24ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VHlwZUNvbXB1dGVEaXN0cmlidXRpb25bXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLWRpc3RyaWJ1dGlvbmAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9IEFTIHBsdWdpbl90eXBlLFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX0gQVMgY29tcHV0ZV90eXBlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgY291bnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9LCAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9XG4gICAgICAgIE9SREVSIEJZIGNvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbj4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi4zIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luVmVyc2lvbnMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VmVyc2lvbkNvdW50W10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi12ZXJzaW9uc2AsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLm5hbWV9LFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdmVyc2lvbl9jb3VudCxcbiAgICAgICAgICBNQVgoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259KSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAyLjQgQnVpbGQgc3VjY2VzcyByYXRlIG92ZXIgdGltZS5cbiAgICpcbiAgICogU1RBVFVTIENBU0lORyBOT1RFOiBUaGlzIHF1ZXJ5IGZpbHRlcnMgYnkgYGV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnYFxuICAgKiBhbmQgdXNlcyBsb3dlcmNhc2Ugc3RhdHVzIHZhbHVlcyAoYCdjb21wbGV0ZWQnYCwgYCdmYWlsZWQnYCksIHdoaWxlXG4gICAqIGBnZXRTdWNjZXNzUmF0ZWAgKDEuMikgZmlsdGVycyBieSBgZXZlbnRfdHlwZSA9ICdQSVBFTElORSdgIHdpdGhcbiAgICogdXBwZXJjYXNlIEFXUy1zdHlsZSBzdGF0dXNlcyAoYCdTVUNDRUVERUQnYCwgYCdGQUlMRUQnYCwgYCdDQU5DRUxFRCdgKS5cbiAgICogVGhlIGNhc2luZyBkcmlmdCBpcyBpbnRlbnRpb25hbCBhbmQgdHJhY2tzIHRoZSBwcm9kdWNlcjpcbiAgICogICAtIGBwbHVnaW4tYnVpbGRgIGV2ZW50cyBjb21lIGZyb20gb3VyIG93biBidWlsZCBwaXBlbGluZSAobG93ZXJjYXNlKVxuICAgKiAgIC0gYFBJUEVMSU5FYCBldmVudHMgY29tZSBmcm9tIEFXUyBDb2RlUGlwZWxpbmUgKHVwcGVyY2FzZSlcbiAgICogVGhlIGluZ2VzdCBab2Qgc2NoZW1hIGF0IGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHNcbiAgICogU0hPVUxEIGVudW0gdGhlc2UgcGVyLWV2ZW50U291cmNlIHNvIHdlIGNhdGNoIGRyaWZ0IGF0IGluZ2VzdCByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBwcm9kdWNpbmcgemVybyByb3dzIGhlcmUuIFNlZSBmaW5kaW5ncyBONzEuXG4gICAqL1xuICBhc3luYyBnZXRCdWlsZFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8QnVpbGRUaW1lU2VyaWVzRW50cnlbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuNSBCdWlsZCBkdXJhdGlvbiBwZXIgcGx1Z2luLiAqL1xuICBhc3luYyBnZXRCdWlsZER1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGJ1aWxkc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZER1cmF0aW9uPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAyLjYgQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gKi9cbiAgYXN5bmMgZ2V0QnVpbGRGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCk6IFByb21pc2U8QnVpbGRGYWlsdXJlW10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpidWlsZC1mYWlsdXJlczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBlLmVycm9yX21lc3NhZ2UsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuc3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRmFpbHVyZT4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19
@@ -175,9 +175,18 @@ export const pipelineEvent = pgTable('pipeline_events', {
175
175
  // tags EVERY event of a deployed pipeline (STAGE/ACTION too), while the DORA
176
176
  // scan wants only `event_type='PIPELINE'` — including it restores selectivity.
177
177
  // Partial (environment IS NOT NULL) keeps it small — legacy/CI-only events
178
- // aren't indexed. MIGRATION REQUIRED: drizzle-kit generate.
178
+ // aren't indexed. The default run-based DORA path (no environment) can't use
179
+ // this partial index; it relies on event_pipeline_type_started_idx below.
180
+ // MIGRATION REQUIRED: drizzle-kit generate.
179
181
  envTypeStartedIdx: index('event_env_type_started_idx')
180
182
  .on(table.environment, table.eventType, table.startedAt)
181
183
  .where(sql `environment IS NOT NULL`),
184
+ // started_at range scans: every Category-1 report and the default run-based
185
+ // DORA path filters `event_type='PIPELINE' AND started_at BETWEEN …` joined on
186
+ // pipeline_id, but the other event composite index is on created_at, not
187
+ // started_at — so the range scan had no ideal index. This composite serves the
188
+ // join-driven scan by pipeline_id. MIGRATION REQUIRED: drizzle-kit generate.
189
+ pipelineTypeStartedIdx: index('event_pipeline_type_started_idx')
190
+ .on(table.pipelineId, table.eventType, table.startedAt),
182
191
  }));
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2Uvc2NoZW1hL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUEwQjNIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRTtJQUMzQyxjQUFjO0lBQ2QsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUU7SUFFM0Msa0NBQWtDO0lBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ3RDLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBRVosZUFBZTtJQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFCLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkQsVUFBVSxFQUFFO1NBQ1osT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUIsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixP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RixxRkFBcUY7SUFDckYsUUFBUSxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztTQUNyQyxFQUFFLENBQ0QsR0FBRyxDQUFBLFlBQVksS0FBSyxDQUFDLFVBQVUsYUFBYSxFQUM1QyxLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsU0FBUyxFQUNmLEtBQUssQ0FBQyxNQUFNLEVBQ1osR0FBRyxDQUFBLFlBQVksS0FBSyxDQUFDLFNBQVMsT0FBTyxFQUNyQyxHQUFHLENBQUEsWUFBWSxLQUFLLENBQUMsVUFBVSxPQUFPLENBQ3ZDO1NBQ0EsS0FBSyxDQUFDLEdBQUcsQ0FBQSwwQkFBMEIsQ0FBQztJQUN2Qyx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsMkVBQTJFO0lBQzNFLDREQUE0RDtJQUM1RCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUM7U0FDbkQsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQ3ZELEtBQUssQ0FBQyxHQUFHLENBQUEseUJBQXlCLENBQUM7Q0FDdkMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWNjZXNzTW9kaWZpZXIsIFNZU1RFTV9PUkdfSUQsIHR5cGUgTWV0YURhdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4IH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8qKlxuICogUGlwZWxpbmUgYnVpbGRlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgc3RvcmVkIGluIGRhdGFiYXNlLlxuICogTWlycm9ycyB0aGUgY2Fub25pY2FsIEJ1aWxkZXJQcm9wcyBmcm9tIHBpcGVsaW5lLWNvcmUgKEpTT04tc2VyaWFsaXphYmxlIGZvcm0pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQnVpbGRlckNvbmZpZyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsPzogTWV0YURhdGFUeXBlO1xuICByZWFkb25seSBzeW50aDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IHJvbGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgc3RhZ2VzPzogUGlwZWxpbmVTdGFnZUNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIFN0YWdlIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIGRhdGFiYXNlIChKU09OLXNlcmlhbGl6YWJsZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFnZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RlcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG59XG5cbi8qKlxuICogVGFibGUgZm9yIHN0b3JpbmcgcGlwZWxpbmUgaW5zdGFuY2VzIGFuZCB0aGVpciBmdWxsIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRmVhdHVyZXMgKiAtIEZ1bGwgQnVpbGRlclByb3BzIHNlcmlhbGl6YXRpb24gZm9yIHJlY29uc3RydWN0aW9uXG4gKiAtIE9yZ2FuaXphdGlvbi1sZXZlbCBpc29sYXRpb25cbiAqIC0gUGlwZWxpbmUgc3RhdHVzIHRyYWNraW5nXG4gKiAtIEV4ZWN1dGlvbiBoaXN0b3J5IHRyYWNraW5nXG4gKiAtIEZsZXhpYmxlIHRhZ2dpbmcgc3lzdGVtXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lc1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmUgPSBwZ1RhYmxlKCdwaXBlbGluZXMnLCB7XG4gIC8vIFByaW1hcnkga2V5XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG5cbiAgLy8gT3JnYW5pemF0aW9uIGFuZCBhY2Nlc3MgY29udHJvbFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBdWRpdCBmaWVsZHNcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBDb3JlIHBpcGVsaW5lIGluZm9ybWF0aW9uXG4gIHByb2plY3Q6IHZhcmNoYXIoJ3Byb2plY3QnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIGtleXdvcmRzOiBqc29uYigna2V5d29yZHMnKVxuICAgIC4kdHlwZTxzdHJpbmdbXT4oKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gUGlwZWxpbmUgY29uZmlndXJhdGlvblxuICBwcm9wczoganNvbmIoJ3Byb3BzJylcbiAgICAuJHR5cGU8UGlwZWxpbmVCdWlsZGVyQ29uZmlnPigpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKVxuICAgIC5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcilcbiAgICAubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKVxuICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKVxuICAgIC5kZWZhdWx0KHRydWUpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBEZWxldGlvbiB0cmFja2luZyAoc29mdCBkZWxldGUpXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBJbmRleGVzIGZvciBjb21tb24gcXVlcmllc1xuICBwcm9qZWN0SWR4OiBpbmRleCgncGlwZWxpbmVfcHJvamVjdF9pZHgnKS5vbih0YWJsZS5wcm9qZWN0KSxcbiAgb3JnYW5pemF0aW9uSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnYW5pemF0aW9uX2lkeCcpLm9uKHRhYmxlLm9yZ2FuaXphdGlvbiksXG4gIG9yZ0lkSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgYWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLmlzQWN0aXZlKSxcbiAgY3JlYXRlZEF0SWR4OiBpbmRleCgncGlwZWxpbmVfY3JlYXRlZF9hdF9pZHgnKS5vbih0YWJsZS5jcmVhdGVkQXQpLFxuICB1cGRhdGVkQXRJZHg6IGluZGV4KCdwaXBlbGluZV91cGRhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLnVwZGF0ZWRBdCksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBjb21tb24gYWNjZXNzIHBhdHRlcm4gKG9yZ0lkICsgaXNBY3RpdmUpXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGZpbHRlcmVkIHF1ZXJpZXMgKG9yZ0lkICsgYWNjZXNzTW9kaWZpZXIgKyBpc0FjdGl2ZSlcbiAgb3JnQWNjZXNzQWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2FjY2Vzc19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmFjY2Vzc01vZGlmaWVyLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gUGFydGlhbCBpbmRleCBmb3IgYWN0aXZlLW9ubHkgcXVlcmllcyAoc21hbGxlciwgZmFzdGVyIHRoYW4gZnVsbCBpbmRleClcbiAgYWN0aXZlT25seU9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX2FjdGl2ZV9vbmx5X29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KS53aGVyZShzcWxgaXNfYWN0aXZlID0gdHJ1ZWApLFxuXG4gIC8vIFVuaXF1ZSBjb25zdHJhaW50IG9uIHByb2plY3QgKyBvcmdhbml6YXRpb24gKyBvcmdJZFxuICBwcm9qZWN0T3JnVW5pcXVlOiB1bmlxdWVJbmRleCgncGlwZWxpbmVfcHJvamVjdF9vcmdfdW5pcXVlJylcbiAgICAub24odGFibGUucHJvamVjdCwgdGFibGUub3JnYW5pemF0aW9uLCB0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8qKlxuICogUGlwZWxpbmUgZGVwbG95bWVudCByZWdpc3RyeS5cbiAqIE1hcHMgZGVwbG95ZWQgQ29kZVBpcGVsaW5lIEFSTnMgYmFjayB0byBwaXBlbGluZSByZWNvcmRzIGFuZCBvcmcgSURzLlxuICogUG9wdWxhdGVkIGJ5IHRoZSBkZXBsb3kgY29tbWFuZCBhZnRlciBzdWNjZXNzZnVsIENESyBkZXBsb3kuXG4gKiBVc2VkIGJ5IHRoZSBwaXBlbGluZS1ldmVudHMgTGFtYmRhIHRvIHJlc29sdmUgRXZlbnRCcmlkZ2UgZXZlbnRzIHRvIG9yZy1zY29wZWQgcmVjb3Jkcy5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lUmVnaXN0cnkgPSBwZ1RhYmxlKCdwaXBlbGluZV9yZWdpc3RyeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgLy8gVGhlIHBsYXRmb3JtJ3MgcGlwZWxpbmUgcmVjb3JkIGlkIOKAlCBhIFNUQUJMRSB1dWlkIGNyZWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgLy8gcmVjb3JkLCBrbm93biBhdCBDREsgc3ludGgsIGFuZCBhcHBsaWVkIHRvIHRoZSBsaXZlIENvZGVQaXBlbGluZSBhcyB0aGVcbiAgLy8gYFBJUEVMSU5FX0VWRU5UX0lEYCB0YWcuIFRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoYXQgdGFnIGFuZCByZXBvcnRzXG4gIC8vIGFnYWluc3QgdGhpcyBpZCwgc28gaXQgSVMgdGhlIGV2ZW50IGpvaW4ga2V5IChyZXBsYWNpbmcgdGhlIG1hc2tlZCBBUk4g4oCUXG4gIC8vIGl0IGNhcnJpZXMgbm8gQVdTIGFjY291bnQvcmVnaW9uLCBzbyBubyBtYXNraW5nIGlzIG5lZWRlZCkuIFVuaXF1ZTogb25lXG4gIC8vIHJlZ2lzdHJ5IHJvdyBwZXIgcGlwZWxpbmUgKyB0aGUgdXBzZXJ0IGtleSBmb3IgKHJlKXJlZ2lzdHJhdGlvbi5cbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlZ2lvbjogdmFyY2hhcigncmVnaW9uJywgeyBsZW5ndGg6IDMwIH0pLFxuICBwcm9qZWN0OiB2YXJjaGFyKCdwcm9qZWN0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pLFxuICBsYXN0RGVwbG95ZWQ6IHRpbWVzdGFtcCgnbGFzdF9kZXBsb3llZCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBzdGFja05hbWU6IHZhcmNoYXIoJ3N0YWNrX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnSWRJZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBvcmdSZWdpb25JZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfcmVnaW9uX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5yZWdpb24pLFxufSkpO1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFNvdXJjZSA9ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcblxuLyoqXG4gKiBFdmVudCB0eXBlIGdyYW51bGFyaXR5IGxldmVscyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFR5cGUgPSAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcblxuLyoqXG4gKiBQaXBlbGluZSBleGVjdXRpb24gYW5kIGJ1aWxkIGV2ZW50cy5cbiAqIENhcHR1cmVzIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgc3RhdGUgY2hhbmdlcyBmcm9tIEV2ZW50QnJpZGdlXG4gKiBhbmQgcGx1Z2luIERvY2tlciBidWlsZCBvdXRjb21lcyBmcm9tIEJ1bGxNUS5cbiAqIEFsbCBldmVudHMgYXJlIG9yZy1zY29wZWQgZm9yIG11bHRpLXRlbmFudCByZXBvcnRpbmcuXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX2V2ZW50c1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVFdmVudCA9IHBnVGFibGUoJ3BpcGVsaW5lX2V2ZW50cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBldmVudFNvdXJjZTogdmFyY2hhcignZXZlbnRfc291cmNlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50U291cmNlPigpLm5vdE51bGwoKSxcbiAgZXZlbnRUeXBlOiB2YXJjaGFyKCdldmVudF90eXBlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50VHlwZT4oKS5ub3ROdWxsKCksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIHN0YWdlTmFtZTogdmFyY2hhcignc3RhZ2VfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGFjdGlvbk5hbWU6IHZhcmNoYXIoJ2FjdGlvbl9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZXJyb3JNZXNzYWdlOiB0ZXh0KCdlcnJvcl9tZXNzYWdlJyksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkdXJhdGlvbk1zOiBpbnRlZ2VyKCdkdXJhdGlvbl9tcycpLFxuICAvLyBET1JBIGRlcGxveS1hdHRyaWJ1dGlvbiAoYWxsIG51bGxhYmxlOyBwb3B1bGF0ZWQgYXQgaW5nZXN0IHdoZW4gdGhlIHNvdXJjZVxuICAvLyBldmVudCBjYXJyaWVzIHRoZW0g4oCUIGxlZ2FjeS9DSS1vbmx5IGV2ZW50cyBsZWF2ZSB0aGVtIE5VTEwpLiBgZW52aXJvbm1lbnRgXG4gIC8vIGlzIHRoZSBkZXBsb3kgdGFyZ2V0IChlLmcuIFwicHJvZHVjdGlvblwiKTsgaXRzIHByZXNlbmNlIG1hcmtzIGFuIGV4ZWN1dGlvblxuICAvLyBhcyBhIHJlYWwgZGVwbG95bWVudCwgbGV0dGluZyBET1JBIHNjb3BlIHBhc3QgZ2VuZXJpYyBwaXBlbGluZSBydW5zLlxuICAvLyBgY29tbWl0U2hhYC9gY29tbWl0UmVmYCBjYXB0dXJlIHRoZSBzb3VyY2UgcmV2aXNpb24gZm9yIGxlYWQtdGltZSB3b3JrLlxuICBjb21taXRTaGE6IHZhcmNoYXIoJ2NvbW1pdF9zaGEnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjb21taXRSZWY6IHZhcmNoYXIoJ2NvbW1pdF9yZWYnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBlbnZpcm9ubWVudDogdmFyY2hhcignZW52aXJvbm1lbnQnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBkZXRhaWw6IGpzb25iKCdkZXRhaWwnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwaXBlbGluZUlkSWR4OiBpbmRleCgnZXZlbnRfcGlwZWxpbmVfaWRfaWR4Jykub24odGFibGUucGlwZWxpbmVJZCksXG4gIG9yZ0lkSWR4OiBpbmRleCgnZXZlbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgZXZlbnRUeXBlSWR4OiBpbmRleCgnZXZlbnRfdHlwZV9pZHgnKS5vbih0YWJsZS5ldmVudFR5cGUpLFxuICBzdGF0dXNJZHg6IGluZGV4KCdldmVudF9zdGF0dXNfaWR4Jykub24odGFibGUuc3RhdHVzKSxcbiAgZXhlY3V0aW9uSWRJZHg6IGluZGV4KCdldmVudF9leGVjdXRpb25faWRfaWR4Jykub24odGFibGUuZXhlY3V0aW9uSWQpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdldmVudF9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIG9yZ1R5cGVDcmVhdGVkSWR4OiBpbmRleCgnZXZlbnRfb3JnX3R5cGVfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRUeXBlLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdTb3VyY2VTdGF0dXNJZHg6IGluZGV4KCdldmVudF9vcmdfc291cmNlX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRTb3VyY2UsIHRhYmxlLnN0YXR1cyksXG4gIC8vIElkZW1wb3RlbmN5OiBFdmVudEJyaWRnZSDihpIgU1FTIGlzIGF0LWxlYXN0LW9uY2UsIHNvIHRoZSBzYW1lIHN0YXRlLWNoYW5nZVxuICAvLyBjYW4gYmUgZGVsaXZlcmVkIHR3aWNlLiBUaGlzIHBhcnRpYWwgdW5pcXVlIGluZGV4IGRlZHVwcyByZS1kZWxpdmVyaWVzXG4gIC8vIChwYWlyZWQgd2l0aCBgb25Db25mbGljdERvTm90aGluZ2AgaW4gcmVwb3J0aW5nLXNlcnZpY2UuaW5nZXN0RXZlbnRzKS5cbiAgLy8gUGFydGlhbCAoZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMKSBiZWNhdXNlIHRoYXQncyB0aGUgbmF0dXJhbCBwZXItZXZlbnRcbiAgLy8ga2V5OyBldmVudHMgd2l0aG91dCBhbiBleGVjdXRpb25JZCAocmFyZSkgYXJlbid0IGRlZHVwZWQsIHdoaWNoIGlzIHNhZmUuXG4gIC8vIEluY2x1ZGVzIHBpcGVsaW5lX2lkIHNvIGEgKHRoZW9yZXRpY2FsKSBleGVjdXRpb24taWQgcmV1c2UgYWNyb3NzIHBpcGVsaW5lc1xuICAvLyBjYW4ndCBjb2xsaWRlIG5vdyB0aGF0IHRoZSBBUk4gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHJvdy5cbiAgLy9cbiAgLy8gQ09BTEVTQ0UgdGhlIG51bGxhYmxlIHBhcnRzIHRvIHNlbnRpbmVscyAoZXhwcmVzc2lvbiBpbmRleCk6IFBJUEVMSU5FL1NUQUdFL1xuICAvLyBCVUlMRCBldmVudHMgbGVhdmUgc3RhZ2VfbmFtZS9hY3Rpb25fbmFtZSBOVUxMIChwbHVnaW4tYnVpbGQgYWxzbyBwaXBlbGluZV9pZFxuICAvLyBOVUxMKSwgYW5kIFBvc3RncmVzIHRyZWF0cyBOVUxMcyBhcyBESVNUSU5DVCBpbiBhIHVuaXF1ZSBpbmRleCDigJQgc28gdGhlIHBsYWluXG4gIC8vIGNvbHVtbiBpbmRleCBuZXZlciBtYXRjaGVzIGZvciB0aG9zZSB0eXBlcyBhbmQgb25Db25mbGljdERvTm90aGluZyBjYW4ndCBkZWR1cFxuICAvLyB0aGVpciBhdC1sZWFzdC1vbmNlIHJlLWRlbGl2ZXJpZXMuIENvbGxhcHNpbmcgTlVMTOKGkicnIG1ha2VzIGVxdWFsIGV2ZW50cyBlcXVhbC5cbiAgLy8gKGRyaXp6bGUncyB1bmlxdWVJbmRleCBjYW4ndCBleHByZXNzIE5VTExTIE5PVCBESVNUSU5DVCBvbiBhIHBhcnRpYWwgaW5kZXgsIHNvXG4gIC8vIHdlIHVzZSB0aGUgZXF1aXZhbGVudCBleHByZXNzaW9uIGluZGV4LikgTUlHUkFUSU9OIFJFUVVJUkVEOiBkcml6emxlLWtpdCBnZW5lcmF0ZS5cbiAgZGVkdXBJZHg6IHVuaXF1ZUluZGV4KCdldmVudF9kZWR1cF9pZHgnKVxuICAgIC5vbihcbiAgICAgIHNxbGBjb2FsZXNjZSgke3RhYmxlLnBpcGVsaW5lSWR9Ojp0ZXh0LCAnJylgLFxuICAgICAgdGFibGUuZXhlY3V0aW9uSWQsXG4gICAgICB0YWJsZS5ldmVudFR5cGUsXG4gICAgICB0YWJsZS5zdGF0dXMsXG4gICAgICBzcWxgY29hbGVzY2UoJHt0YWJsZS5zdGFnZU5hbWV9LCAnJylgLFxuICAgICAgc3FsYGNvYWxlc2NlKCR7dGFibGUuYWN0aW9uTmFtZX0sICcnKWAsXG4gICAgKVxuICAgIC53aGVyZShzcWxgZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMYCksXG4gIC8vIERPUkEgZGVwbG95LXNjb3BlZCByZWFkczogb25seSBQSVBFTElORS1sZXZlbCBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGFcbiAgLy8gZGVwbG95IGVudmlyb25tZW50LiBgZXZlbnRfdHlwZWAgaXMgaW4gdGhlIGluZGV4IGJlY2F1c2UgdGhlIGV2ZW50cyBMYW1iZGFcbiAgLy8gdGFncyBFVkVSWSBldmVudCBvZiBhIGRlcGxveWVkIHBpcGVsaW5lIChTVEFHRS9BQ1RJT04gdG9vKSwgd2hpbGUgdGhlIERPUkFcbiAgLy8gc2NhbiB3YW50cyBvbmx5IGBldmVudF90eXBlPSdQSVBFTElORSdgIOKAlCBpbmNsdWRpbmcgaXQgcmVzdG9yZXMgc2VsZWN0aXZpdHkuXG4gIC8vIFBhcnRpYWwgKGVudmlyb25tZW50IElTIE5PVCBOVUxMKSBrZWVwcyBpdCBzbWFsbCDigJQgbGVnYWN5L0NJLW9ubHkgZXZlbnRzXG4gIC8vIGFyZW4ndCBpbmRleGVkLiBNSUdSQVRJT04gUkVRVUlSRUQ6IGRyaXp6bGUta2l0IGdlbmVyYXRlLlxuICBlbnZUeXBlU3RhcnRlZElkeDogaW5kZXgoJ2V2ZW50X2Vudl90eXBlX3N0YXJ0ZWRfaWR4JylcbiAgICAub24odGFibGUuZW52aXJvbm1lbnQsIHRhYmxlLmV2ZW50VHlwZSwgdGFibGUuc3RhcnRlZEF0KVxuICAgIC53aGVyZShzcWxgZW52aXJvbm1lbnQgSVMgTk9UIE5VTExgKSxcbn0pKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IHR5cGVzIHJlcHJlc2VudGluZyBkYXRhYmFzZSByb3dzXG4gKi9cbmV4cG9ydCB0eXBlIFBpcGVsaW5lID0gdHlwZW9mIHBpcGVsaW5lLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lSW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGlwZWxpbmVSZWdpc3RyeSA9IHR5cGVvZiBwaXBlbGluZVJlZ2lzdHJ5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lUmVnaXN0cnlJbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmVSZWdpc3RyeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lRXZlbnQgPSB0eXBlb2YgcGlwZWxpbmVFdmVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZUV2ZW50SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lRXZlbnQuJGluZmVySW5zZXJ0O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlcyBmb3Igd29ya2luZyB3aXRoIHBhcnRpYWwgdXBkYXRlc1xuICovXG5leHBvcnQgdHlwZSBQaXBlbGluZVVwZGF0ZSA9IFBhcnRpYWw8T21pdDxQaXBlbGluZUluc2VydCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ2NyZWF0ZWRCeSc+PjtcbiJdfQ==
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2Uvc2NoZW1hL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUEwQjNIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRTtJQUMzQyxjQUFjO0lBQ2QsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUU7SUFFM0Msa0NBQWtDO0lBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ3RDLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBRVosZUFBZTtJQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFCLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkQsVUFBVSxFQUFFO1NBQ1osT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUIsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixP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RixxRkFBcUY7SUFDckYsUUFBUSxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztTQUNyQyxFQUFFLENBQ0QsR0FBRyxDQUFBLFlBQVksS0FBSyxDQUFDLFVBQVUsYUFBYSxFQUM1QyxLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsU0FBUyxFQUNmLEtBQUssQ0FBQyxNQUFNLEVBQ1osR0FBRyxDQUFBLFlBQVksS0FBSyxDQUFDLFNBQVMsT0FBTyxFQUNyQyxHQUFHLENBQUEsWUFBWSxLQUFLLENBQUMsVUFBVSxPQUFPLENBQ3ZDO1NBQ0EsS0FBSyxDQUFDLEdBQUcsQ0FBQSwwQkFBMEIsQ0FBQztJQUN2Qyx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsNENBQTRDO0lBQzVDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQztTQUNuRCxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDdkQsS0FBSyxDQUFDLEdBQUcsQ0FBQSx5QkFBeUIsQ0FBQztJQUN0Qyw0RUFBNEU7SUFDNUUsK0VBQStFO0lBQy9FLHlFQUF5RTtJQUN6RSwrRUFBK0U7SUFDL0UsNkVBQTZFO0lBQzdFLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQztTQUM3RCxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUM7Q0FDMUQsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWNjZXNzTW9kaWZpZXIsIFNZU1RFTV9PUkdfSUQsIHR5cGUgTWV0YURhdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4IH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8qKlxuICogUGlwZWxpbmUgYnVpbGRlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgc3RvcmVkIGluIGRhdGFiYXNlLlxuICogTWlycm9ycyB0aGUgY2Fub25pY2FsIEJ1aWxkZXJQcm9wcyBmcm9tIHBpcGVsaW5lLWNvcmUgKEpTT04tc2VyaWFsaXphYmxlIGZvcm0pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQnVpbGRlckNvbmZpZyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsPzogTWV0YURhdGFUeXBlO1xuICByZWFkb25seSBzeW50aDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IHJvbGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgc3RhZ2VzPzogUGlwZWxpbmVTdGFnZUNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIFN0YWdlIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIGRhdGFiYXNlIChKU09OLXNlcmlhbGl6YWJsZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFnZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RlcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG59XG5cbi8qKlxuICogVGFibGUgZm9yIHN0b3JpbmcgcGlwZWxpbmUgaW5zdGFuY2VzIGFuZCB0aGVpciBmdWxsIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRmVhdHVyZXMgKiAtIEZ1bGwgQnVpbGRlclByb3BzIHNlcmlhbGl6YXRpb24gZm9yIHJlY29uc3RydWN0aW9uXG4gKiAtIE9yZ2FuaXphdGlvbi1sZXZlbCBpc29sYXRpb25cbiAqIC0gUGlwZWxpbmUgc3RhdHVzIHRyYWNraW5nXG4gKiAtIEV4ZWN1dGlvbiBoaXN0b3J5IHRyYWNraW5nXG4gKiAtIEZsZXhpYmxlIHRhZ2dpbmcgc3lzdGVtXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lc1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmUgPSBwZ1RhYmxlKCdwaXBlbGluZXMnLCB7XG4gIC8vIFByaW1hcnkga2V5XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG5cbiAgLy8gT3JnYW5pemF0aW9uIGFuZCBhY2Nlc3MgY29udHJvbFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBdWRpdCBmaWVsZHNcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBDb3JlIHBpcGVsaW5lIGluZm9ybWF0aW9uXG4gIHByb2plY3Q6IHZhcmNoYXIoJ3Byb2plY3QnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIGtleXdvcmRzOiBqc29uYigna2V5d29yZHMnKVxuICAgIC4kdHlwZTxzdHJpbmdbXT4oKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gUGlwZWxpbmUgY29uZmlndXJhdGlvblxuICBwcm9wczoganNvbmIoJ3Byb3BzJylcbiAgICAuJHR5cGU8UGlwZWxpbmVCdWlsZGVyQ29uZmlnPigpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKVxuICAgIC5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcilcbiAgICAubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKVxuICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKVxuICAgIC5kZWZhdWx0KHRydWUpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBEZWxldGlvbiB0cmFja2luZyAoc29mdCBkZWxldGUpXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBJbmRleGVzIGZvciBjb21tb24gcXVlcmllc1xuICBwcm9qZWN0SWR4OiBpbmRleCgncGlwZWxpbmVfcHJvamVjdF9pZHgnKS5vbih0YWJsZS5wcm9qZWN0KSxcbiAgb3JnYW5pemF0aW9uSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnYW5pemF0aW9uX2lkeCcpLm9uKHRhYmxlLm9yZ2FuaXphdGlvbiksXG4gIG9yZ0lkSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgYWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLmlzQWN0aXZlKSxcbiAgY3JlYXRlZEF0SWR4OiBpbmRleCgncGlwZWxpbmVfY3JlYXRlZF9hdF9pZHgnKS5vbih0YWJsZS5jcmVhdGVkQXQpLFxuICB1cGRhdGVkQXRJZHg6IGluZGV4KCdwaXBlbGluZV91cGRhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLnVwZGF0ZWRBdCksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBjb21tb24gYWNjZXNzIHBhdHRlcm4gKG9yZ0lkICsgaXNBY3RpdmUpXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGZpbHRlcmVkIHF1ZXJpZXMgKG9yZ0lkICsgYWNjZXNzTW9kaWZpZXIgKyBpc0FjdGl2ZSlcbiAgb3JnQWNjZXNzQWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2FjY2Vzc19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmFjY2Vzc01vZGlmaWVyLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gUGFydGlhbCBpbmRleCBmb3IgYWN0aXZlLW9ubHkgcXVlcmllcyAoc21hbGxlciwgZmFzdGVyIHRoYW4gZnVsbCBpbmRleClcbiAgYWN0aXZlT25seU9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX2FjdGl2ZV9vbmx5X29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KS53aGVyZShzcWxgaXNfYWN0aXZlID0gdHJ1ZWApLFxuXG4gIC8vIFVuaXF1ZSBjb25zdHJhaW50IG9uIHByb2plY3QgKyBvcmdhbml6YXRpb24gKyBvcmdJZFxuICBwcm9qZWN0T3JnVW5pcXVlOiB1bmlxdWVJbmRleCgncGlwZWxpbmVfcHJvamVjdF9vcmdfdW5pcXVlJylcbiAgICAub24odGFibGUucHJvamVjdCwgdGFibGUub3JnYW5pemF0aW9uLCB0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8qKlxuICogUGlwZWxpbmUgZGVwbG95bWVudCByZWdpc3RyeS5cbiAqIE1hcHMgZGVwbG95ZWQgQ29kZVBpcGVsaW5lIEFSTnMgYmFjayB0byBwaXBlbGluZSByZWNvcmRzIGFuZCBvcmcgSURzLlxuICogUG9wdWxhdGVkIGJ5IHRoZSBkZXBsb3kgY29tbWFuZCBhZnRlciBzdWNjZXNzZnVsIENESyBkZXBsb3kuXG4gKiBVc2VkIGJ5IHRoZSBwaXBlbGluZS1ldmVudHMgTGFtYmRhIHRvIHJlc29sdmUgRXZlbnRCcmlkZ2UgZXZlbnRzIHRvIG9yZy1zY29wZWQgcmVjb3Jkcy5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lUmVnaXN0cnkgPSBwZ1RhYmxlKCdwaXBlbGluZV9yZWdpc3RyeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgLy8gVGhlIHBsYXRmb3JtJ3MgcGlwZWxpbmUgcmVjb3JkIGlkIOKAlCBhIFNUQUJMRSB1dWlkIGNyZWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgLy8gcmVjb3JkLCBrbm93biBhdCBDREsgc3ludGgsIGFuZCBhcHBsaWVkIHRvIHRoZSBsaXZlIENvZGVQaXBlbGluZSBhcyB0aGVcbiAgLy8gYFBJUEVMSU5FX0VWRU5UX0lEYCB0YWcuIFRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoYXQgdGFnIGFuZCByZXBvcnRzXG4gIC8vIGFnYWluc3QgdGhpcyBpZCwgc28gaXQgSVMgdGhlIGV2ZW50IGpvaW4ga2V5IChyZXBsYWNpbmcgdGhlIG1hc2tlZCBBUk4g4oCUXG4gIC8vIGl0IGNhcnJpZXMgbm8gQVdTIGFjY291bnQvcmVnaW9uLCBzbyBubyBtYXNraW5nIGlzIG5lZWRlZCkuIFVuaXF1ZTogb25lXG4gIC8vIHJlZ2lzdHJ5IHJvdyBwZXIgcGlwZWxpbmUgKyB0aGUgdXBzZXJ0IGtleSBmb3IgKHJlKXJlZ2lzdHJhdGlvbi5cbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlZ2lvbjogdmFyY2hhcigncmVnaW9uJywgeyBsZW5ndGg6IDMwIH0pLFxuICBwcm9qZWN0OiB2YXJjaGFyKCdwcm9qZWN0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pLFxuICBsYXN0RGVwbG95ZWQ6IHRpbWVzdGFtcCgnbGFzdF9kZXBsb3llZCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBzdGFja05hbWU6IHZhcmNoYXIoJ3N0YWNrX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnSWRJZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBvcmdSZWdpb25JZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfcmVnaW9uX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5yZWdpb24pLFxufSkpO1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFNvdXJjZSA9ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcblxuLyoqXG4gKiBFdmVudCB0eXBlIGdyYW51bGFyaXR5IGxldmVscyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFR5cGUgPSAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcblxuLyoqXG4gKiBQaXBlbGluZSBleGVjdXRpb24gYW5kIGJ1aWxkIGV2ZW50cy5cbiAqIENhcHR1cmVzIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgc3RhdGUgY2hhbmdlcyBmcm9tIEV2ZW50QnJpZGdlXG4gKiBhbmQgcGx1Z2luIERvY2tlciBidWlsZCBvdXRjb21lcyBmcm9tIEJ1bGxNUS5cbiAqIEFsbCBldmVudHMgYXJlIG9yZy1zY29wZWQgZm9yIG11bHRpLXRlbmFudCByZXBvcnRpbmcuXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX2V2ZW50c1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVFdmVudCA9IHBnVGFibGUoJ3BpcGVsaW5lX2V2ZW50cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBldmVudFNvdXJjZTogdmFyY2hhcignZXZlbnRfc291cmNlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50U291cmNlPigpLm5vdE51bGwoKSxcbiAgZXZlbnRUeXBlOiB2YXJjaGFyKCdldmVudF90eXBlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50VHlwZT4oKS5ub3ROdWxsKCksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIHN0YWdlTmFtZTogdmFyY2hhcignc3RhZ2VfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGFjdGlvbk5hbWU6IHZhcmNoYXIoJ2FjdGlvbl9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZXJyb3JNZXNzYWdlOiB0ZXh0KCdlcnJvcl9tZXNzYWdlJyksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkdXJhdGlvbk1zOiBpbnRlZ2VyKCdkdXJhdGlvbl9tcycpLFxuICAvLyBET1JBIGRlcGxveS1hdHRyaWJ1dGlvbiAoYWxsIG51bGxhYmxlOyBwb3B1bGF0ZWQgYXQgaW5nZXN0IHdoZW4gdGhlIHNvdXJjZVxuICAvLyBldmVudCBjYXJyaWVzIHRoZW0g4oCUIGxlZ2FjeS9DSS1vbmx5IGV2ZW50cyBsZWF2ZSB0aGVtIE5VTEwpLiBgZW52aXJvbm1lbnRgXG4gIC8vIGlzIHRoZSBkZXBsb3kgdGFyZ2V0IChlLmcuIFwicHJvZHVjdGlvblwiKTsgaXRzIHByZXNlbmNlIG1hcmtzIGFuIGV4ZWN1dGlvblxuICAvLyBhcyBhIHJlYWwgZGVwbG95bWVudCwgbGV0dGluZyBET1JBIHNjb3BlIHBhc3QgZ2VuZXJpYyBwaXBlbGluZSBydW5zLlxuICAvLyBgY29tbWl0U2hhYC9gY29tbWl0UmVmYCBjYXB0dXJlIHRoZSBzb3VyY2UgcmV2aXNpb24gZm9yIGxlYWQtdGltZSB3b3JrLlxuICBjb21taXRTaGE6IHZhcmNoYXIoJ2NvbW1pdF9zaGEnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjb21taXRSZWY6IHZhcmNoYXIoJ2NvbW1pdF9yZWYnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBlbnZpcm9ubWVudDogdmFyY2hhcignZW52aXJvbm1lbnQnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBkZXRhaWw6IGpzb25iKCdkZXRhaWwnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwaXBlbGluZUlkSWR4OiBpbmRleCgnZXZlbnRfcGlwZWxpbmVfaWRfaWR4Jykub24odGFibGUucGlwZWxpbmVJZCksXG4gIG9yZ0lkSWR4OiBpbmRleCgnZXZlbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgZXZlbnRUeXBlSWR4OiBpbmRleCgnZXZlbnRfdHlwZV9pZHgnKS5vbih0YWJsZS5ldmVudFR5cGUpLFxuICBzdGF0dXNJZHg6IGluZGV4KCdldmVudF9zdGF0dXNfaWR4Jykub24odGFibGUuc3RhdHVzKSxcbiAgZXhlY3V0aW9uSWRJZHg6IGluZGV4KCdldmVudF9leGVjdXRpb25faWRfaWR4Jykub24odGFibGUuZXhlY3V0aW9uSWQpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdldmVudF9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIG9yZ1R5cGVDcmVhdGVkSWR4OiBpbmRleCgnZXZlbnRfb3JnX3R5cGVfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRUeXBlLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdTb3VyY2VTdGF0dXNJZHg6IGluZGV4KCdldmVudF9vcmdfc291cmNlX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRTb3VyY2UsIHRhYmxlLnN0YXR1cyksXG4gIC8vIElkZW1wb3RlbmN5OiBFdmVudEJyaWRnZSDihpIgU1FTIGlzIGF0LWxlYXN0LW9uY2UsIHNvIHRoZSBzYW1lIHN0YXRlLWNoYW5nZVxuICAvLyBjYW4gYmUgZGVsaXZlcmVkIHR3aWNlLiBUaGlzIHBhcnRpYWwgdW5pcXVlIGluZGV4IGRlZHVwcyByZS1kZWxpdmVyaWVzXG4gIC8vIChwYWlyZWQgd2l0aCBgb25Db25mbGljdERvTm90aGluZ2AgaW4gcmVwb3J0aW5nLXNlcnZpY2UuaW5nZXN0RXZlbnRzKS5cbiAgLy8gUGFydGlhbCAoZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMKSBiZWNhdXNlIHRoYXQncyB0aGUgbmF0dXJhbCBwZXItZXZlbnRcbiAgLy8ga2V5OyBldmVudHMgd2l0aG91dCBhbiBleGVjdXRpb25JZCAocmFyZSkgYXJlbid0IGRlZHVwZWQsIHdoaWNoIGlzIHNhZmUuXG4gIC8vIEluY2x1ZGVzIHBpcGVsaW5lX2lkIHNvIGEgKHRoZW9yZXRpY2FsKSBleGVjdXRpb24taWQgcmV1c2UgYWNyb3NzIHBpcGVsaW5lc1xuICAvLyBjYW4ndCBjb2xsaWRlIG5vdyB0aGF0IHRoZSBBUk4gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHJvdy5cbiAgLy9cbiAgLy8gQ09BTEVTQ0UgdGhlIG51bGxhYmxlIHBhcnRzIHRvIHNlbnRpbmVscyAoZXhwcmVzc2lvbiBpbmRleCk6IFBJUEVMSU5FL1NUQUdFL1xuICAvLyBCVUlMRCBldmVudHMgbGVhdmUgc3RhZ2VfbmFtZS9hY3Rpb25fbmFtZSBOVUxMIChwbHVnaW4tYnVpbGQgYWxzbyBwaXBlbGluZV9pZFxuICAvLyBOVUxMKSwgYW5kIFBvc3RncmVzIHRyZWF0cyBOVUxMcyBhcyBESVNUSU5DVCBpbiBhIHVuaXF1ZSBpbmRleCDigJQgc28gdGhlIHBsYWluXG4gIC8vIGNvbHVtbiBpbmRleCBuZXZlciBtYXRjaGVzIGZvciB0aG9zZSB0eXBlcyBhbmQgb25Db25mbGljdERvTm90aGluZyBjYW4ndCBkZWR1cFxuICAvLyB0aGVpciBhdC1sZWFzdC1vbmNlIHJlLWRlbGl2ZXJpZXMuIENvbGxhcHNpbmcgTlVMTOKGkicnIG1ha2VzIGVxdWFsIGV2ZW50cyBlcXVhbC5cbiAgLy8gKGRyaXp6bGUncyB1bmlxdWVJbmRleCBjYW4ndCBleHByZXNzIE5VTExTIE5PVCBESVNUSU5DVCBvbiBhIHBhcnRpYWwgaW5kZXgsIHNvXG4gIC8vIHdlIHVzZSB0aGUgZXF1aXZhbGVudCBleHByZXNzaW9uIGluZGV4LikgTUlHUkFUSU9OIFJFUVVJUkVEOiBkcml6emxlLWtpdCBnZW5lcmF0ZS5cbiAgZGVkdXBJZHg6IHVuaXF1ZUluZGV4KCdldmVudF9kZWR1cF9pZHgnKVxuICAgIC5vbihcbiAgICAgIHNxbGBjb2FsZXNjZSgke3RhYmxlLnBpcGVsaW5lSWR9Ojp0ZXh0LCAnJylgLFxuICAgICAgdGFibGUuZXhlY3V0aW9uSWQsXG4gICAgICB0YWJsZS5ldmVudFR5cGUsXG4gICAgICB0YWJsZS5zdGF0dXMsXG4gICAgICBzcWxgY29hbGVzY2UoJHt0YWJsZS5zdGFnZU5hbWV9LCAnJylgLFxuICAgICAgc3FsYGNvYWxlc2NlKCR7dGFibGUuYWN0aW9uTmFtZX0sICcnKWAsXG4gICAgKVxuICAgIC53aGVyZShzcWxgZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMYCksXG4gIC8vIERPUkEgZGVwbG95LXNjb3BlZCByZWFkczogb25seSBQSVBFTElORS1sZXZlbCBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGFcbiAgLy8gZGVwbG95IGVudmlyb25tZW50LiBgZXZlbnRfdHlwZWAgaXMgaW4gdGhlIGluZGV4IGJlY2F1c2UgdGhlIGV2ZW50cyBMYW1iZGFcbiAgLy8gdGFncyBFVkVSWSBldmVudCBvZiBhIGRlcGxveWVkIHBpcGVsaW5lIChTVEFHRS9BQ1RJT04gdG9vKSwgd2hpbGUgdGhlIERPUkFcbiAgLy8gc2NhbiB3YW50cyBvbmx5IGBldmVudF90eXBlPSdQSVBFTElORSdgIOKAlCBpbmNsdWRpbmcgaXQgcmVzdG9yZXMgc2VsZWN0aXZpdHkuXG4gIC8vIFBhcnRpYWwgKGVudmlyb25tZW50IElTIE5PVCBOVUxMKSBrZWVwcyBpdCBzbWFsbCDigJQgbGVnYWN5L0NJLW9ubHkgZXZlbnRzXG4gIC8vIGFyZW4ndCBpbmRleGVkLiBUaGUgZGVmYXVsdCBydW4tYmFzZWQgRE9SQSBwYXRoIChubyBlbnZpcm9ubWVudCkgY2FuJ3QgdXNlXG4gIC8vIHRoaXMgcGFydGlhbCBpbmRleDsgaXQgcmVsaWVzIG9uIGV2ZW50X3BpcGVsaW5lX3R5cGVfc3RhcnRlZF9pZHggYmVsb3cuXG4gIC8vIE1JR1JBVElPTiBSRVFVSVJFRDogZHJpenpsZS1raXQgZ2VuZXJhdGUuXG4gIGVudlR5cGVTdGFydGVkSWR4OiBpbmRleCgnZXZlbnRfZW52X3R5cGVfc3RhcnRlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5lbnZpcm9ubWVudCwgdGFibGUuZXZlbnRUeXBlLCB0YWJsZS5zdGFydGVkQXQpXG4gICAgLndoZXJlKHNxbGBlbnZpcm9ubWVudCBJUyBOT1QgTlVMTGApLFxuICAvLyBzdGFydGVkX2F0IHJhbmdlIHNjYW5zOiBldmVyeSBDYXRlZ29yeS0xIHJlcG9ydCBhbmQgdGhlIGRlZmF1bHQgcnVuLWJhc2VkXG4gIC8vIERPUkEgcGF0aCBmaWx0ZXJzIGBldmVudF90eXBlPSdQSVBFTElORScgQU5EIHN0YXJ0ZWRfYXQgQkVUV0VFTiDigKZgIGpvaW5lZCBvblxuICAvLyBwaXBlbGluZV9pZCwgYnV0IHRoZSBvdGhlciBldmVudCBjb21wb3NpdGUgaW5kZXggaXMgb24gY3JlYXRlZF9hdCwgbm90XG4gIC8vIHN0YXJ0ZWRfYXQg4oCUIHNvIHRoZSByYW5nZSBzY2FuIGhhZCBubyBpZGVhbCBpbmRleC4gVGhpcyBjb21wb3NpdGUgc2VydmVzIHRoZVxuICAvLyBqb2luLWRyaXZlbiBzY2FuIGJ5IHBpcGVsaW5lX2lkLiBNSUdSQVRJT04gUkVRVUlSRUQ6IGRyaXp6bGUta2l0IGdlbmVyYXRlLlxuICBwaXBlbGluZVR5cGVTdGFydGVkSWR4OiBpbmRleCgnZXZlbnRfcGlwZWxpbmVfdHlwZV9zdGFydGVkX2lkeCcpXG4gICAgLm9uKHRhYmxlLnBpcGVsaW5lSWQsIHRhYmxlLmV2ZW50VHlwZSwgdGFibGUuc3RhcnRlZEF0KSxcbn0pKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IHR5cGVzIHJlcHJlc2VudGluZyBkYXRhYmFzZSByb3dzXG4gKi9cbmV4cG9ydCB0eXBlIFBpcGVsaW5lID0gdHlwZW9mIHBpcGVsaW5lLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lSW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGlwZWxpbmVSZWdpc3RyeSA9IHR5cGVvZiBwaXBlbGluZVJlZ2lzdHJ5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lUmVnaXN0cnlJbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmVSZWdpc3RyeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lRXZlbnQgPSB0eXBlb2YgcGlwZWxpbmVFdmVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZUV2ZW50SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lRXZlbnQuJGluZmVySW5zZXJ0O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlcyBmb3Igd29ya2luZyB3aXRoIHBhcnRpYWwgdXBkYXRlc1xuICovXG5leHBvcnQgdHlwZSBQaXBlbGluZVVwZGF0ZSA9IFBhcnRpYWw8T21pdDxQaXBlbGluZUluc2VydCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ2NyZWF0ZWRCeSc+PjtcbiJdfQ==
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "dependencies": {
25
25
  "drizzle-orm": "0.45.2",
26
26
  "pg": "8.22.0",
27
- "@pipeline-builder/api-core": "3.4.93"
27
+ "@pipeline-builder/api-core": "3.4.94"
28
28
  },
29
29
  "keywords": [
30
30
  "ci-cd",
@@ -80,7 +80,7 @@
80
80
  "access": "public",
81
81
  "registry": "https://registry.npmjs.org/"
82
82
  },
83
- "version": "3.4.96",
83
+ "version": "3.4.97",
84
84
  "bugs": {
85
85
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
86
86
  },