footprintjs 9.45.0 → 9.46.0

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.
@@ -2,21 +2,21 @@
2
2
  * StageContext — Execution context for a single stage in a flowchart run
3
3
  *
4
4
  * Like a stack frame in a compiler/runtime:
5
- * - Reference to SharedMemory (accessing heap memory)
6
- * - TransactionBuffer for staging mutations (transaction buffer)
5
+ * - A RecordFrame — the record half (C3): the heap, the address, the
6
+ * first-touch base, the lazy transaction buffer, the readKeys list
7
7
  * - Links to parent/child/next contexts (call stack frames)
8
+ * - What belongs to a stage inside a run: retention of reads and writes, the
9
+ * redaction verdict per write, the dev-mode warnings, the commit observer
8
10
  * - DiagnosticCollector for logs, errors, metrics
9
11
  */
10
12
  import { summarizeReadValue, summarizeWriteValue } from '../capture/summarize.js';
11
13
  import { isDevMode } from '../devMode.js';
12
14
  import { borrowedMutationMessage, committedMutationMessage, firstDifferingPath } from './borrowedMutation.js';
13
15
  import { DiagnosticCollector } from './DiagnosticCollector.js';
14
- import { nativeGet } from './pathOps.js';
15
16
  import { SCOPE_PLACEHOLDER } from './placeholders.js';
16
- import { recordCommit } from './recordCommit.js';
17
+ import { RecordFrame } from './RecordFrame.js';
17
18
  import { CLEAR, RedactionRule } from './redaction.js';
18
19
  import { DEFAULT_RUN_POLICY, withRedaction } from './runPolicy.js';
19
- import { TransactionBuffer } from './TransactionBuffer.js';
20
20
  /** The user-level key of a write or read — dotted only for a nested path (a
21
21
  * subflow seed's `['profile'] + 'auth'`); no allocation for the common
22
22
  * single-segment case. */
@@ -26,25 +26,28 @@ function userKeyOf(path, key) {
26
26
  /**
27
27
  * The key run namespaces sit under — a frame with run id `c0` (a fork or
28
28
  * selector child takes its own id at the top level) writes at `runs/c0/…`. The
29
- * engine's one spelling of it: every frame's address is built from it, and the
30
- * record layer takes that address as data (C2).
29
+ * engine's one spelling of it: every frame's address is built from it
30
+ * ({@link runAddress}), and the record layer takes that address as data (C2).
31
31
  */
32
32
  const RUN_NAMESPACE = 'runs';
33
+ /** The root's address, shared by every frame without a run id (most of them). Never edited. */
34
+ const ROOT_ADDRESS = Object.freeze([]);
35
+ /** Where a frame with run id `runId` reads and writes: `['runs', <id>]`, or `[]` (the root) with none. */
36
+ function runAddress(runId) {
37
+ return runId ? [RUN_NAMESPACE, runId] : ROOT_ADDRESS;
38
+ }
33
39
  export class StageContext {
34
- sharedMemory;
35
40
  /**
36
- * Parallel redacted mirror of `sharedMemory`. Populated in `commit()` with
37
- * the already-computed redacted patches (the same ones fed to `eventLog`).
38
- * Present **only** when the executor has been told to maintain a redacted
39
- * view — i.e. when a `RedactionPolicy` is configured. Otherwise undefined,
40
- * zero extra work per commit.
41
- *
42
- * The mirror is read via `FlowChartExecutor.getSnapshot({ redact: true })`
43
- * and is the foundation for the "export trace" / paste-into-viewer feature
44
- * — consumers share the redacted view externally without leaking raw PII
45
- * through `sharedState`.
41
+ * The record half of this frame (`RecordFrame.ts`, L3, C3): the heap and,
42
+ * when the run keeps them, the redacted mirror and the log; the address;
43
+ * the first-touch base; the lazy transaction buffer; the readKeys list.
44
+ * Every state read of this frame goes through it, and so does every
45
+ * commit. The mirror is present **only** when the run's policy keeps a
46
+ * redacted view (a `RedactionPolicy` is configured) — read via
47
+ * `FlowChartExecutor.getSnapshot({ redact: true })`, the foundation for
48
+ * sharing a trace without leaking raw PII through `sharedState`.
46
49
  */
47
- redactedSharedMemory;
50
+ record;
48
51
  /**
49
52
  * The run's policy — the four dials, the redaction rule, the mirror flag
50
53
  * (`runPolicy.ts`, F5). Held BY REFERENCE: one frozen object per run (and
@@ -54,15 +57,6 @@ export class StageContext {
54
57
  * ({@link usePolicy}). Never edited; a change is a new object.
55
58
  */
56
59
  policy = DEFAULT_RUN_POLICY;
57
- buffer;
58
- /**
59
- * Committed-state view captured at this stage's FIRST touch (first read OR
60
- * first write) — held by REFERENCE, never cloned. See
61
- * {@link firstTouchState} for the algorithm and the immutability invariant
62
- * that makes a bare reference safe.
63
- */
64
- stateView;
65
- eventLog;
66
60
  /** The emitting frame's logical leg, never the mutable executor's current leg. */
67
61
  emitRunId;
68
62
  stageName = '';
@@ -79,6 +73,12 @@ export class StageContext {
79
73
  * none — the same once-per-execution law `_untrackedSources` keeps.
80
74
  */
81
75
  tags;
76
+ /**
77
+ * The run this frame belongs to — its identity on every event, and the run
78
+ * namespace it reads and writes in ({@link runAddress}), read once, when the
79
+ * frame is built (C3). Only {@link useAddressOf} moves the address after
80
+ * that, and only before the first write.
81
+ */
82
82
  runId;
83
83
  /**
84
84
  * The run namespace this frame writes and reads in when that is not its own
@@ -142,11 +142,6 @@ export class StageContext {
142
142
  * tier (`ScopeFacade`, one per stage execution), not here.
143
143
  */
144
144
  _committed = false;
145
- /** Lazily-allocated ordered registry of keys tracked-read in THIS stage —
146
- * the source of the per-write prefix. Only allocated under the
147
- * `'reads-prefix'` dial; insertion-ordered (a Set) and monotonic, which
148
- * is what makes "last write's prefix == union" hold in delta mode. */
149
- _provenanceReads;
150
145
  /** Tracked reads of a selected value ({@link selectedReads}). */
151
146
  _selectedReads = 0;
152
147
  /** Each object this frame read under a selected name → that read's verdict (`stageWrite` hands it on). */
@@ -167,40 +162,40 @@ export class StageContext {
167
162
  this.runId = runId;
168
163
  this.stageName = name;
169
164
  this.stageId = stageId;
170
- this.sharedMemory = sharedMemory;
165
+ this.record = new RecordFrame(sharedMemory, eventLog, runAddress(runId));
166
+ this.record.useEncoding(this.policy);
171
167
  this.branchId = branchId;
172
- this.eventLog = eventLog;
173
168
  this.isDecider = !!isDecider;
174
169
  this.isFork = false;
175
170
  }
176
171
  /** Returns the SharedMemory instance (needed by scope layer). */
177
172
  getSharedMemory() {
178
- return this.sharedMemory;
173
+ return this.record.state;
179
174
  }
180
175
  /** @internal Stamped beside runtimeStageId, before scope construction. */
181
176
  bindEmitOrigin(runId, drillPath) {
182
177
  this.emitRunId = drillPath === undefined ? undefined : runId;
183
178
  if (drillPath !== undefined)
184
- this.eventLog?.bindAddress(runId, drillPath);
179
+ this.record.log?.bindAddress(runId, drillPath);
185
180
  }
186
181
  /** Capture from this frame's OWN log. A manual/unaddressable frame stays unknown. */
187
182
  captureEmitPosition() {
188
- return this.emitRunId === undefined ? undefined : this.eventLog?.capturePosition(this.emitRunId);
183
+ return this.emitRunId === undefined ? undefined : this.record.log?.capturePosition(this.emitRunId);
189
184
  }
190
185
  /**
191
186
  * Install a parallel redacted mirror. Subsequent `commit()` calls apply
192
187
  * the already-computed redacted patches — the ones the log records — to
193
- * this mirror, beside the raw patches on `sharedMemory` (`recordCommit`).
188
+ * this mirror, beside the raw patches on the heap (`recordCommit`).
194
189
  * Child / next contexts inherit the mirror via `createNext` / `createChild`.
195
190
  *
196
191
  * Called on a runtime's root frame by `ExecutionRuntime` when the run's policy keeps a mirror.
197
192
  */
198
193
  useRedactedMirror(mirror) {
199
- this.redactedSharedMemory = mirror;
194
+ this.record.useMirror(mirror);
200
195
  }
201
196
  /** Returns the redacted mirror if installed, else undefined. */
202
197
  getRedactedSharedMemory() {
203
- return this.redactedSharedMemory;
198
+ return this.record.mirror;
204
199
  }
205
200
  /**
206
201
  * Install the run's policy (`runPolicy.ts`) on this frame — called on a
@@ -211,7 +206,7 @@ export class StageContext {
211
206
  * frame after commit under the run's dials too.
212
207
  */
213
208
  usePolicy(policy) {
214
- this.policy = policy;
209
+ this.adoptPolicy(policy);
215
210
  }
216
211
  /** The run's policy this frame retains, encodes and scrubs under. */
217
212
  getPolicy() {
@@ -230,7 +225,7 @@ export class StageContext {
230
225
  */
231
226
  useRedactionRule(rule) {
232
227
  if (this.policy.redaction !== rule)
233
- this.policy = withRedaction(this.policy, rule);
228
+ this.adoptPolicy(withRedaction(this.policy, rule));
234
229
  }
235
230
  /** The installed redaction rule, if any (the facade's lookup). */
236
231
  getRedactionRule() {
@@ -242,8 +237,17 @@ export class StageContext {
242
237
  * {@link createChild} both call it, and it names no dial.
243
238
  */
244
239
  inheritRun(from) {
245
- this.policy = from.policy;
246
- this.redactedSharedMemory = from.redactedSharedMemory;
240
+ this.adoptPolicy(from.policy);
241
+ this.record.useMirror(from.record.mirror);
242
+ }
243
+ /**
244
+ * The ONE place this frame's policy changes: the frame holds it, and its
245
+ * record frame encodes under the same reference (`commitValues`,
246
+ * `writeProvenance` — `RecordFrame · useEncoding`), so the two never differ.
247
+ */
248
+ adoptPolicy(policy) {
249
+ this.policy = policy;
250
+ this.record.useEncoding(policy);
247
251
  }
248
252
  /**
249
253
  * Record a tracked user-level write, policy-gated (#13c-A) — the single
@@ -365,7 +369,7 @@ export class StageContext {
365
369
  verdict = rule.verdictAt(path, key);
366
370
  }
367
371
  const whole = verdict.kind === 'whole';
368
- const buffer = this.getTransactionBuffer();
372
+ const buffer = this.record.getTransactionBuffer();
369
373
  if (verb === 'merge')
370
374
  buffer.merge(nsPath, value, whole);
371
375
  else if (verb === 'delete')
@@ -384,95 +388,6 @@ export class StageContext {
384
388
  }
385
389
  return verdict;
386
390
  }
387
- /**
388
- * ── The first-touch state view (#13) ────────────────────────────────────
389
- *
390
- * WHAT: returns the committed shared state as it was at this stage's FIRST
391
- * touch (first read or first write), capturing the reference on first call.
392
- * Serves two consumers: reads before the first write ({@link readState})
393
- * and the transaction buffer's diff base ({@link getTransactionBuffer}).
394
- *
395
- * WHY A BARE REFERENCE IS SAFE — the invariant this rests on: committed
396
- * state is immutable-after-swap. Every write to `SharedMemory` builds the
397
- * NEXT generation and swaps it in (copy-on-write, 9.29.0: `applyPatch` via
398
- * `nextGeneration`, and `setValue`/`updateValue` too) — it copies the root
399
- * and the containers on each written path, shares the rest, and never
400
- * edits a container of the generation a stage captured here. Holding the
401
- * reference therefore gives this stage a stable snapshot at zero cost — no
402
- * clone, which is the entire point of #13. The transaction buffer's
403
- * net-change diff base rests on the same guarantee: it IS this view.
404
- *
405
- * WHY FIRST TOUCH, not first write: the pre-#13 eager engine cloned the
406
- * state into the buffer at the stage's first ACCESS, anchoring both its
407
- * snapshot reads and its commit baseline (the net-change diff base) there.
408
- * #13's first cut anchored the lazy buffer at first WRITE — observably
409
- * different when something else commits in the gap between this stage's
410
- * first read and its first write. That gap is REACHABLE: fork siblings are
411
- * namespace-isolated for run-scoped keys (each child writes under
412
- * `runs/<childId>/`), but ROOT-level keys are shared — written via
413
- * `setGlobal` from consumer scope code and, critically, by
414
- * `SubflowInputMapper`'s output mapping (`parentContext.setGlobal`), which
415
- * is exactly what runs when a subflow is a fork branch. A sibling's
416
- * root-key commit landing in the gap would shift this stage's diff base,
417
- * making its CommitBundle record a phantom change (or swallow a real one)
418
- * relative to the eager engine. Anchoring the view at first touch restores
419
- * the EXACT eager semantics — sequential AND parallel — at zero clone cost.
420
- *
421
- * Read visibility is two-tier, matching eager byte-for-byte: keys present
422
- * in the view at first touch read repeatably from it; keys ABSENT from it
423
- * fall back to LIVE state (the eager engine's exact fallback — a
424
- * mid-flight sibling root-key write was always visible to reads, and
425
- * stays visible; only the DIFF BASE is pinned).
426
- */
427
- firstTouchState() {
428
- if (!this.stateView) {
429
- this.stateView = this.sharedMemory.getState();
430
- }
431
- return this.stateView;
432
- }
433
- /** Lazily creates the transaction buffer on the stage's FIRST WRITE (#13).
434
- *
435
- * Reads NEVER construct it: read-your-writes only matters once a staged
436
- * write exists, so before that {@link getValue}/{@link getValueDirect}
437
- * serve from the first-touch state view and {@link commit} records an
438
- * empty bundle — all with ZERO `structuredClone`s of the shared state.
439
- *
440
- * The buffer's base is the FIRST-TOUCH view, NOT the live state at write
441
- * time: under parallel forks a sibling may have committed between this
442
- * stage's first read and this write, and the net-change diff base must
443
- * stay anchored at first touch to match the eager engine — see
444
- * {@link firstTouchState}. */
445
- getTransactionBuffer() {
446
- if (!this.buffer) {
447
- // Per-write provenance (#P1): hand the buffer a live view of this
448
- // stage's read prefix — evaluated AT EACH WRITE, so each staged op
449
- // captures exactly the reads that preceded it (temporal prefix).
450
- const readKeysProvider = this.policy.writeProvenance === 'reads-prefix' ? () => [...(this._provenanceReads ?? [])] : undefined;
451
- // The stage's address (9.30.0: the admitted record reads the containers
452
- // there as where the stage writes, never as a value it read).
453
- this.buffer = new TransactionBuffer(this.firstTouchState(), this.policy.commitValues, readKeysProvider, this.address);
454
- }
455
- return this.buffer;
456
- }
457
- /**
458
- * Where this frame writes and reads: `['runs', <id>]`, or `[]` (the root) with
459
- * no run id. Handed to the record layer as data (C2): the buffer's address,
460
- * and where `SharedMemory · getValue` looks before the root.
461
- */
462
- get address() {
463
- return this.namespaceId ? [RUN_NAMESPACE, this.namespaceId] : [];
464
- }
465
- /** Builds an absolute path inside the shared memory: this frame's {@link address}, then the path. */
466
- withNamespace(path, key) {
467
- // Spelled out, not `[...this.address, …]`: every read and write builds one, and the spread
468
- // allocates the address array per call (+3% on a namespaced frame's read/write loop).
469
- const id = this.namespaceId;
470
- return id ? [RUN_NAMESPACE, id, ...path, key] : [...path, key];
471
- }
472
- /** The run namespace writes and reads go to: {@link addressRunId}, else `runId`. */
473
- get namespaceId() {
474
- return this.addressRunId ?? this.runId;
475
- }
476
391
  /**
477
392
  * Write and read at ANOTHER frame's address (its run namespace) while this
478
393
  * frame keeps its own identity on the record — `stage`, `stageId`,
@@ -480,23 +395,30 @@ export class StageContext {
480
395
  * (`SubflowExecutor · executeSubflow`, R13): the mount frame of a branch or
481
396
  * fork child lands its values where its parent writes, as before, and its
482
397
  * bundle now names the mount instead of the stage before it. Refused once
483
- * the frame has staged anything — its buffer's address is fixed then.
398
+ * the frame has staged anything — its buffer's address is fixed then. The
399
+ * decision is the engine's (namespace ids, as since R13); the record frame
400
+ * takes the address it comes to (`RecordFrame · useAddress`).
484
401
  */
485
402
  useAddressOf(frame) {
486
- if (this.buffer && frame.namespaceId !== this.namespaceId) {
403
+ if (this.record.hasStaged && frame.namespaceId !== this.namespaceId) {
487
404
  throw new Error(`[footprint] StageContext.useAddressOf: '${this.stageId}' has already staged writes at its own address.`);
488
405
  }
489
406
  this.addressRunId = frame.namespaceId;
407
+ this.record.useAddress(runAddress(this.namespaceId));
408
+ }
409
+ /** The run namespace writes and reads go to: {@link addressRunId}, else `runId`. */
410
+ get namespaceId() {
411
+ return this.addressRunId ?? this.runId;
490
412
  }
491
413
  // ── Write operations ───────────────────────────────────────────────────
492
414
  patch(path, key, value, shouldRedact = false) {
493
- return this.stageWrite(this.withNamespace(path, key), path, key, value, shouldRedact, 'set');
415
+ return this.stageWrite(this.record.at(path, key), path, key, value, shouldRedact, 'set');
494
416
  }
495
417
  set(path, key, value) {
496
418
  this.patch(path, key, value);
497
419
  }
498
420
  merge(path, key, value, shouldRedact) {
499
- return this.stageWrite(this.withNamespace(path, key), path, key, value, shouldRedact, 'merge');
421
+ return this.stageWrite(this.record.at(path, key), path, key, value, shouldRedact, 'merge');
500
422
  }
501
423
  setObject(path, key, value, shouldRedact, description, operationOverride) {
502
424
  // Explicit deletion (ScopeFacade.deleteValue) stages a distinct op so
@@ -504,8 +426,8 @@ export class StageContext {
504
426
  // Under the default 'full' mode the buffer commits it as a
505
427
  // set-of-undefined — byte-identical to the historical flattening.
506
428
  const verdict = operationOverride === 'delete'
507
- ? this.stageWrite(this.withNamespace(path, key), path, key, undefined, shouldRedact, 'delete')
508
- : this.stageWrite(this.withNamespace(path, key), path, key, value, shouldRedact, 'set');
429
+ ? this.stageWrite(this.record.at(path, key), path, key, undefined, shouldRedact, 'delete')
430
+ : this.stageWrite(this.record.at(path, key), path, key, value, shouldRedact, 'set');
509
431
  // Track user-level write (pre-namespace) for memory view + onCommit —
510
432
  // policy-gated (#13c-A), see trackWrite.
511
433
  this.trackWrite(userKeyOf(path, key), value, verdict, operationOverride ?? 'set');
@@ -551,36 +473,6 @@ export class StageContext {
551
473
  this.setObject(path, key, merged, false, description);
552
474
  }
553
475
  // ── Read operations ────────────────────────────────────────────────────
554
- /** Buffer-aware read, mirroring the eager engine's read order byte-for-byte:
555
- *
556
- * 1. staged writes + first-touch snapshot — `buffer.get` over its
557
- * workingCopy when the buffer exists, else `nativeGet` over the
558
- * zero-clone state view (the buffer's base IS that view, so the two
559
- * tiers agree on content);
560
- * 2. LIVE state via `sharedMemory.getValue` for keys absent from the
561
- * snapshot — including its run→global namespace fallback. The eager
562
- * engine had this exact live fallback for snapshot-missing keys;
563
- * byte-identity over purity. After the stage's first write such a
564
- * value can be the very container the buffer's diff base holds at
565
- * the path (the stage deleted or unset it, or replaced a container
566
- * above it), so the base is detached there first
567
- * (`TransactionBuffer · detachBase`): an in-place edit of the value
568
- * (out of contract) written back is recorded, as on 9.28.0, whose
569
- * base was a clone taken at the first write.
570
- *
571
- * Reads never construct the buffer (#13): a stage that never writes
572
- * performs zero clones of the shared state. */
573
- readState(path, key) {
574
- const namespaced = this.withNamespace(path, key);
575
- const fromSnapshot = this.buffer ? this.buffer.get(namespaced) : nativeGet(this.firstTouchState(), namespaced);
576
- if (typeof fromSnapshot !== 'undefined')
577
- return fromSnapshot;
578
- const live = this.sharedMemory.getValue(this.address, path, key);
579
- // Tier 2 after the first write: keep the diff base exact (see above).
580
- if (this.buffer && live !== null && typeof live === 'object')
581
- this.buffer.detachBase(namespaced);
582
- return live;
583
- }
584
476
  /**
585
477
  * Tracked read. The returned value is BORROWED — see the contract on
586
478
  * `ScopeFacade.getValue`. Read-tracking cost is policy-gated (#14):
@@ -588,12 +480,12 @@ export class StageContext {
588
480
  * `'summary'` records a cheap marker, `'off'` records nothing.
589
481
  */
590
482
  getValue(path, key, description) {
591
- const value = this.readState(path, key);
592
- // Per-write provenance registry (#P1) — key strings only, independent of
593
- // the readTracking retention dial (which governs VALUE retention below).
594
- if (key !== undefined && this.policy.writeProvenance === 'reads-prefix') {
595
- (this._provenanceReads ??= new Set()).add(path.length > 0 ? [...path, key].join('.') : key);
596
- }
483
+ // The record frame serves the value (two tiers) and keeps the per-write
484
+ // provenance registry (#P1) — key strings only, independent of the
485
+ // readTracking retention dial (which governs VALUE retention below).
486
+ const value = this.record.read(path, key);
487
+ if (key !== undefined)
488
+ this.record.noteRead(path, key);
597
489
  // The verdict, once — for the retained read below and the selected-read
598
490
  // count (`selectedReads`). No policy and no marks → no verdict call, no
599
491
  // allocation (activeRule).
@@ -612,7 +504,7 @@ export class StageContext {
612
504
  if (path.length > 0)
613
505
  (this._nestedReads ??= new Set()).add(userKeyOf(path, key));
614
506
  else if (this.policy.readTracking === 'full' && isDevMode()) {
615
- if (this.buffer)
507
+ if (this.record.hasStaged)
616
508
  this._viewReads?.delete(key);
617
509
  else
618
510
  (this._viewReads ??= new Set()).add(key);
@@ -640,16 +532,16 @@ export class StageContext {
640
532
  /** Read state without tracking in _stageReads or paying structuredClone cost.
641
533
  * Used by ScopeFacade.getValueSilent() for array proxy internal operations. */
642
534
  getValueDirect(path, key) {
643
- return this.readState(path, key);
535
+ return this.record.read(path, key);
644
536
  }
645
537
  getRoot(key) {
646
- return this.sharedMemory.getValue(this.address, [], key);
538
+ return this.record.readLive(key);
647
539
  }
648
540
  getGlobal(key) {
649
- return this.sharedMemory.getValue([], [], key);
541
+ return this.record.readGlobal(key);
650
542
  }
651
543
  getScope() {
652
- return this.sharedMemory.getState();
544
+ return this.record.state.getState();
653
545
  }
654
546
  getRunId() {
655
547
  return this.runId;
@@ -692,8 +584,8 @@ export class StageContext {
692
584
  * those are engine reads (the subflow merge-back), not user reads.
693
585
  *
694
586
  * It also only looks at keys served from the PINNED source — the first-touch
695
- * view or this stage's own buffer. A key absent from both was served by
696
- * `readState`'s live fallback, which a parallel sibling's root-key commit can
587
+ * view or this stage's own buffer. A key absent from both was served by the
588
+ * read's live fallback (`RecordFrame · read`, tier 2), which a parallel sibling's root-key commit can
697
589
  * legitimately move; accusing the stage there would be a false alarm. For
698
590
  * the same reason it runs on the frame's FIRST commit only: the reads belong
699
591
  * to that round, and by the engine's second round (a fork double-commit, a
@@ -723,15 +615,15 @@ export class StageContext {
723
615
  continue;
724
616
  if (rule !== undefined && rule.verdictAt([], key).kind !== 'clear')
725
617
  continue;
726
- const namespaced = this.withNamespace([], key);
727
- if (Object.prototype.hasOwnProperty.call(this._stageWrites, key) || this.buffer?.wasStaged(namespaced)) {
618
+ const namespaced = this.record.at([], key);
619
+ if (Object.prototype.hasOwnProperty.call(this._stageWrites, key) || this.record.wasStaged(namespaced)) {
728
620
  this.warnOnCommittedMutation(key, namespaced, retained);
729
621
  continue;
730
622
  }
731
623
  // The pinned source only — see the note on the live fallback above.
732
624
  // `peek`, not `get`: a report compares, and must not take the private
733
625
  // copy a stage's read would (copy-on-write, 9.29.0).
734
- const current = this.buffer ? this.buffer.peek(namespaced) : nativeGet(this.firstTouchState(), namespaced);
626
+ const current = this.record.peek(namespaced);
735
627
  if (current === undefined)
736
628
  continue;
737
629
  const path = firstDifferingPath(retained, current);
@@ -745,7 +637,7 @@ export class StageContext {
745
637
  warnOnCommittedMutation(key, namespaced, retained) {
746
638
  if (!this._viewReads?.has(key))
747
639
  return;
748
- const committed = nativeGet(this.firstTouchState(), namespaced);
640
+ const committed = this.record.baseAt(namespaced);
749
641
  if (committed === undefined)
750
642
  return;
751
643
  const path = firstDifferingPath(retained, committed);
@@ -766,21 +658,16 @@ export class StageContext {
766
658
  * `outputMapper` (a lazy mount, every `parallelForEach` branch), whose exit
767
659
  * is its only bundle, records that bundle as its own, tags and all.
768
660
  *
769
- * Commit is the stage's lifecycle end: `buffer` (its working copy and
770
- * whatever private copies its reads took) and `stateView` (a reference that
771
- * pins one committed-state GENERATION) are only needed DURING execution,
772
- * as the read snapshot + net-change diff base. The execution tree retains
773
- * every StageContext for the lifetime of the run, so WITHOUT the release a
774
- * long loop retains one state generation per executed stage — measured
775
- * O(N²) before copy-on-write (9.29.0), when each generation and each
776
- * buffer was a whole-state clone: 563.8MB at N=200 on an agent-style
777
- * chart; a 500-iteration agent OOMed a default Node heap (backlog #18).
778
- * Generations now share every unchanged subtree, but a pinned one still
779
- * keeps the containers later commits replaced alive.
661
+ * Commit is the stage's lifecycle end: the record frame's buffer and
662
+ * first-touch base are only needed DURING execution, as the read snapshot +
663
+ * net-change diff base, so the record frame releases them once the commit
664
+ * has landed and the observer has seen it (`RecordFrame · release` — why a
665
+ * frame that kept them would retain one state generation per executed
666
+ * stage, and why a re-used frame re-anchors on current state, is there).
780
667
  *
781
- * RE-USE AFTER COMMIT stays correct because both fields re-create lazily:
782
- * - a later READ re-anchors via {@link firstTouchState} on the CURRENT
783
- * committed state (which includes this stage's own flushed writes);
668
+ * RE-USE AFTER COMMIT stays correct because both re-create lazily:
669
+ * - a later READ re-anchors on the CURRENT committed state (which includes
670
+ * this stage's own flushed writes);
784
671
  * - a later WRITE constructs a fresh buffer on that re-anchored view, so a
785
672
  * second commit diffs against post-first-commit state. The pre-release
786
673
  * buffer behaved the same for VALUES (its `workingCopy` was reset on
@@ -804,16 +691,17 @@ export class StageContext {
804
691
  const continuation = this._committed ? phase : undefined;
805
692
  this.materialiseWrites();
806
693
  this.warnOnBorrowedMutation();
807
- // The record's half (`recordCommit.ts`). No buffer = no write ever built
808
- // one (#13): the commit is empty by construction, recorded with ZERO clones.
809
- recordCommit(this.buffer?.commit(), {
694
+ // The record's half (`RecordFrame · commit` → `recordCommit.ts`). No buffer
695
+ // = no write ever built one (#13): the commit is empty by construction,
696
+ // recorded with ZERO clones. The names are read once the payload is built.
697
+ this.record.commit(() => ({
810
698
  stage: this.stageName,
811
699
  stageId: this.stageId,
812
700
  runtimeStageId: this.runtimeStageId,
813
701
  untrackedSources: this._untrackedSources,
814
702
  tags: this.tags,
815
703
  phase: continuation,
816
- }, { state: this.sharedMemory, mirror: this.redactedSharedMemory, log: this.eventLog });
704
+ }));
817
705
  // The observer (ScopeFacade) sees the tracked mutations, THEN the staging
818
706
  // state is released (#13b), so it sees the world as it was. D2's markers
819
707
  // and the declared tags release with it — one stamp per execution, so the
@@ -821,8 +709,7 @@ export class StageContext {
821
709
  if (this._commitObserver) {
822
710
  this._commitObserver({ ...this._stageWrites });
823
711
  }
824
- this.buffer = undefined;
825
- this.stateView = undefined;
712
+ this.record.release();
826
713
  this._untrackedSources = undefined;
827
714
  this.tags = undefined;
828
715
  this._committed = true;
@@ -838,20 +725,18 @@ export class StageContext {
838
725
  * (M1: the transaction buffer holds writes until `commit()` flushes them).
839
726
  *
840
727
  * What is released, and why each one matters for the next attempt:
841
- * - `buffer` — the staged writes themselves; the next attempt starts
842
- * with nothing staged;
843
- * - `stateView` — the first-touch anchor; the next attempt re-anchors on
844
- * committed state as it stands NOW (a sibling fork branch
845
- * may legitimately have committed in between);
728
+ * - the record frame's staged state (`RecordFrame · discard`) — the buffer
729
+ * (the next attempt starts with nothing staged), the
730
+ * first-touch base (it re-anchors on committed state as
731
+ * it stands NOW — a sibling fork branch may legitimately
732
+ * have committed in between) and the readKeys list (#P1:
733
+ * a discarded attempt's reads must never reach the next
734
+ * attempt's `TraceEntry.readKeys`);
846
735
  * - `_stageWrites` / `_pendingWrites` / `_stageReads` — the snapshot
847
736
  * payload; without the reset the execution tree would
848
737
  * report writes that were discarded, which is the exact
849
738
  * lie this feature exists to prevent (the pending map
850
739
  * holds bare references — dropping it un-clones nothing);
851
- * - `_provenanceReads` — the per-write read prefix (#P1); a discarded
852
- * attempt's reads must never appear in the next attempt's
853
- * `TraceEntry.readKeys`, or a backward slice would follow
854
- * an edge that no committed write ever had;
855
740
  * - `_untrackedSources` — the D2 honesty markers, released with the rest.
856
741
  *
857
742
  * What is deliberately KEPT: `debug` (logs, metrics, errors, flow messages).
@@ -862,10 +747,8 @@ export class StageContext {
862
747
  * cursor stop, because from shared state's point of view it never happened.
863
748
  */
864
749
  discardStaged() {
865
- this.buffer = undefined;
866
- this.stateView = undefined;
750
+ this.record.discard();
867
751
  this._untrackedSources = undefined;
868
- this._provenanceReads = undefined;
869
752
  this._pendingWrites = undefined;
870
753
  this._stageWrites = {};
871
754
  this._stageReads = {};
@@ -885,7 +768,7 @@ export class StageContext {
885
768
  */
886
769
  createNext(path, stageName, stageId, isDecider = false) {
887
770
  if (!this.next) {
888
- this.next = new StageContext(path, stageName, stageId, this.sharedMemory, '', this.eventLog, isDecider);
771
+ this.next = new StageContext(path, stageName, stageId, this.record.state, '', this.record.log, isDecider);
889
772
  this.next.parent = this;
890
773
  this.next.inheritRun(this);
891
774
  }
@@ -901,7 +784,7 @@ export class StageContext {
901
784
  if (!this.children) {
902
785
  this.children = [];
903
786
  }
904
- const child = new StageContext(runId, stageName, stageId, this.sharedMemory, branchId, this.eventLog, isDecider);
787
+ const child = new StageContext(runId, stageName, stageId, this.record.state, branchId, this.record.log, isDecider);
905
788
  child.parent = this;
906
789
  child.inheritRun(this);
907
790
  this.children.push(child);
@@ -1017,4 +900,4 @@ export class StageContext {
1017
900
  return snapshot;
1018
901
  }
1019
902
  }
1020
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXM0Q7OzJCQUUyQjtBQUMzQixTQUFTLFNBQVMsQ0FBQyxJQUFjLEVBQUUsR0FBVztJQUM1QyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QixNQUFNLE9BQU8sWUFB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QUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIFJlZmVyZW5jZSB0byBTaGFyZWRNZW1vcnkgKGFjY2Vzc2luZyBoZWFwIG1lbW9yeSlcbiAqIC0gVHJhbnNhY3Rpb25CdWZmZXIgZm9yIHN0YWdpbmcgbXV0YXRpb25zICh0cmFuc2FjdGlvbiBidWZmZXIpXG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSwgY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlLCBmaXJzdERpZmZlcmluZ1BhdGggfSBmcm9tICcuL2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgdHlwZSBEaWFnbm9zdGljQ2hhbm5lbCwgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0U291cmNlUG9zaXRpb24gfSBmcm9tICcuL2V2ZW50UG9zaXRpb24uanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHsgcmVjb3JkQ29tbWl0IH0gZnJvbSAnLi9yZWNvcmRDb21taXQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgQ0xFQVIsIFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1blBvbGljeSB9IGZyb20gJy4vcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IERFRkFVTFRfUlVOX1BPTElDWSwgd2l0aFJlZGFjdGlvbiB9IGZyb20gJy4vcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1pdFBoYXNlLFxuICBGbG93Q29udHJvbFR5cGUsXG4gIEZsb3dNZXNzYWdlLFxuICBSZWFkVHJhY2tpbmdNb2RlLFxuICBTdGFnZVNuYXBzaG90LFxuICBVbnRyYWNrZWRTb3VyY2UsXG4gIFdyaXRlVHJhY2tpbmdNb2RlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSB1c2VyLWxldmVsIGtleSBvZiBhIHdyaXRlIG9yIHJlYWQg4oCUIGRvdHRlZCBvbmx5IGZvciBhIG5lc3RlZCBwYXRoIChhXG4gKiAgc3ViZmxvdyBzZWVkJ3MgYFsncHJvZmlsZSddICsgJ2F1dGgnYCk7IG5vIGFsbG9jYXRpb24gZm9yIHRoZSBjb21tb25cbiAqICBzaW5nbGUtc2VnbWVudCBjYXNlLiAqL1xuZnVuY3Rpb24gdXNlcktleU9mKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG59XG5cbi8qKlxuICogVGhlIGtleSBydW4gbmFtZXNwYWNlcyBzaXQgdW5kZXIg4oCUIGEgZnJhbWUgd2l0aCBydW4gaWQgYGMwYCAoYSBmb3JrIG9yXG4gKiBzZWxlY3RvciBjaGlsZCB0YWtlcyBpdHMgb3duIGlkIGF0IHRoZSB0b3AgbGV2ZWwpIHdyaXRlcyBhdCBgcnVucy9jMC/igKZgLiBUaGVcbiAqIGVuZ2luZSdzIG9uZSBzcGVsbGluZyBvZiBpdDogZXZlcnkgZnJhbWUncyBhZGRyZXNzIGlzIGJ1aWx0IGZyb20gaXQsIGFuZCB0aGVcbiAqIHJlY29yZCBsYXllciB0YWtlcyB0aGF0IGFkZHJlc3MgYXMgZGF0YSAoQzIpLlxuICovXG5jb25zdCBSVU5fTkFNRVNQQUNFID0gJ3J1bnMnO1xuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgcHJpdmF0ZSBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciBvZiBgc2hhcmVkTWVtb3J5YC4gUG9wdWxhdGVkIGluIGBjb21taXQoKWAgd2l0aFxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzICh0aGUgc2FtZSBvbmVzIGZlZCB0byBgZXZlbnRMb2dgKS5cbiAgICogUHJlc2VudCAqKm9ubHkqKiB3aGVuIHRoZSBleGVjdXRvciBoYXMgYmVlbiB0b2xkIHRvIG1haW50YWluIGEgcmVkYWN0ZWRcbiAgICogdmlldyDigJQgaS5lLiB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZC4gT3RoZXJ3aXNlIHVuZGVmaW5lZCxcbiAgICogemVybyBleHRyYSB3b3JrIHBlciBjb21taXQuXG4gICAqXG4gICAqIFRoZSBtaXJyb3IgaXMgcmVhZCB2aWEgYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgKiBhbmQgaXMgdGhlIGZvdW5kYXRpb24gZm9yIHRoZSBcImV4cG9ydCB0cmFjZVwiIC8gcGFzdGUtaW50by12aWV3ZXIgZmVhdHVyZVxuICAgKiDigJQgY29uc3VtZXJzIHNoYXJlIHRoZSByZWRhY3RlZCB2aWV3IGV4dGVybmFsbHkgd2l0aG91dCBsZWFraW5nIHJhdyBQSUlcbiAgICogdGhyb3VnaCBgc2hhcmVkU3RhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWRhY3RlZFNoYXJlZE1lbW9yeT86IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBwb2xpY3kg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZ1xuICAgKiAoYHJ1blBvbGljeS50c2AsIEY1KS4gSGVsZCBCWSBSRUZFUkVOQ0U6IG9uZSBmcm96ZW4gb2JqZWN0IHBlciBydW4gKGFuZFxuICAgKiBwZXIgcmVzdW1lKSwgc2hhcmVkIGJ5IGV2ZXJ5IGZyYW1lIG9mIHRoZSBydW4sIGEgc3ViZmxvdydzIGluY2x1ZGVkIOKAlFxuICAgKiB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSBwYXNzIHRoZSByZWZlcmVuY2VcbiAgICogKHtAbGluayBpbmhlcml0UnVufSksIHRoZSBydW50aW1lIGluc3RhbGxzIGl0IG9uIGl0cyByb290XG4gICAqICh7QGxpbmsgdXNlUG9saWN5fSkuIE5ldmVyIGVkaXRlZDsgYSBjaGFuZ2UgaXMgYSBuZXcgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWTtcbiAgcHJpdmF0ZSBidWZmZXI/OiBUcmFuc2FjdGlvbkJ1ZmZlcjtcbiAgLyoqXG4gICAqIENvbW1pdHRlZC1zdGF0ZSB2aWV3IGNhcHR1cmVkIGF0IHRoaXMgc3RhZ2UncyBGSVJTVCB0b3VjaCAoZmlyc3QgcmVhZCBPUlxuICAgKiBmaXJzdCB3cml0ZSkg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuIFNlZVxuICAgKiB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfSBmb3IgdGhlIGFsZ29yaXRobSBhbmQgdGhlIGltbXV0YWJpbGl0eSBpbnZhcmlhbnRcbiAgICogdGhhdCBtYWtlcyBhIGJhcmUgcmVmZXJlbmNlIHNhZmUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRlVmlldz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcml2YXRlIGV2ZW50TG9nPzogRXZlbnRMb2c7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHB1YmxpYyBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBuYW1lc3BhY2UgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzIGluIHdoZW4gdGhhdCBpcyBub3QgaXRzIG93blxuICAgKiBgcnVuSWRgIOKAlCBzZXQgb25jZSwgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlLCBieVxuICAgKiB7QGxpbmsgdXNlQWRkcmVzc09mfS4gSXRzIG9uZSB1c2VyIGlzIGEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgKFIxMyk6XG4gICAqIHRoZSByZWNvcmQgbmFtZXMgdGhlIG1vdW50LCB0aGUgdmFsdWVzIGxhbmQgd2hlcmUgdGhlIG1vdW50J3MgcGFyZW50XG4gICAqIHdyaXRlcy4gQWJzZW50IOKGkiBgcnVuSWRgLCBzbyBldmVyeSBvdGhlciBmcmFtZSBpcyB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZHJlc3NSdW5JZD86IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCgpID0+IHRoaXMucG9saWN5LnJlZGFjdGlvbik7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXYgbW9kZSBvbmx5OiB0aGUgcm9vdCBrZXlzIHdob3NlIExBU1QgdHJhY2tlZCByZWFkIHdhcyBzZXJ2ZWQgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUg4oCUIGJlZm9yZSB0aGlzIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIHdoZW4gbm8gdHJhbnNhY3Rpb25cbiAgICogYnVmZmVyIGV4aXN0cyB5ZXQuIFN1Y2ggYSByZWFkIGlzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgc28gYW5cbiAgICogaW4tcGxhY2UgZWRpdCBvZiBpdCBtb3ZlcyB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIHRvbyAoY29weS1vbi13cml0ZSxcbiAgICogOS4yOS4wKTsge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259IGNoZWNrcyB0aGVzZSBrZXlzIGV2ZW4gd2hlbiB0aGVcbiAgICogc3RhZ2Ugd3JvdGUgdGhlbS4gTmV2ZXIgYWxsb2NhdGVkIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIF92aWV3UmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogSGFzIHRoaXMgZnJhbWUgY29tbWl0dGVkIGF0IGxlYXN0IG9uY2U/IFRoZSBib3Jyb3dlZC1yZWFkIGd1YXJkIHJ1bnMgb25cbiAgICogdGhlIEZJUlNUIGNvbW1pdCBvbmx5IOKAlCBzZWUge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259LiBUaGUgZnJhbWVcbiAgICogaXRzZWxmIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgKCMxM2IpOiB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCByZWx5IG9uIGl0LiBUaGVcbiAgICogdXNlci1sZXZlbCByZWZ1c2FsIG9mIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgbGl2ZXMgYXQgdGhlIHNjb3BlXG4gICAqIHRpZXIgKGBTY29wZUZhY2FkZWAsIG9uZSBwZXIgc3RhZ2UgZXhlY3V0aW9uKSwgbm90IGhlcmUuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKiogTGF6aWx5LWFsbG9jYXRlZCBvcmRlcmVkIHJlZ2lzdHJ5IG9mIGtleXMgdHJhY2tlZC1yZWFkIGluIFRISVMgc3RhZ2Ug4oCUXG4gICAqICB0aGUgc291cmNlIG9mIHRoZSBwZXItd3JpdGUgcHJlZml4LiBPbmx5IGFsbG9jYXRlZCB1bmRlciB0aGVcbiAgICogIGAncmVhZHMtcHJlZml4J2AgZGlhbDsgaW5zZXJ0aW9uLW9yZGVyZWQgKGEgU2V0KSBhbmQgbW9ub3RvbmljLCB3aGljaFxuICAgKiAgaXMgd2hhdCBtYWtlcyBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuICovXG4gIHByaXZhdGUgX3Byb3ZlbmFuY2VSZWFkcz86IFNldDxzdHJpbmc+O1xuICAvKiogVHJhY2tlZCByZWFkcyBvZiBhIHNlbGVjdGVkIHZhbHVlICh7QGxpbmsgc2VsZWN0ZWRSZWFkc30pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZFJlYWRzID0gMDtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoaXMgZnJhbWUgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUg4oaSIHRoYXQgcmVhZCdzIHZlcmRpY3QgKGBzdGFnZVdyaXRlYCBoYW5kcyBpdCBvbikuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkT2JqZWN0cz86IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHVzZWQgZHVyaW5nIFRISVNcbiAgICogc3RhZ2UncyBleGVjdXRpb24gKGAnYXJncydgIC8gYCdlbnYnYCAvIGAnc2lsZW50J2ApLiBNYXJrZWQgYnlcbiAgICogYFNjb3BlRmFjYWRlYCwgc3VyZmFjZWQgb24gdGhlIHN0YWdlJ3MgQ29tbWl0QnVuZGxlIGFzXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzYCwgdGhlbiBSRUxFQVNFRCB3aXRoIHRoZSBzdGFnaW5nIHN0YXRlIGF0IGNvbW1pdCBlbmRcbiAgICogKHNvIHRoZSByb3V0aW5lIGRvdWJsZS1jb21taXQgcGF0aHMg4oCUIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgbW91bnRzIOKAlFxuICAgKiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZSwgb24gdGhlIGZpcnN0IGNvbW1pdCkuIExhemlseSBhbGxvY2F0ZWQ6XG4gICAqIHN0YWdlcyB0aGF0IG5ldmVyIHRvdWNoIGFuIHVudHJhY2tlZCBwYXRoIHBheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdW50cmFja2VkU291cmNlcz86IFNldDxVbnRyYWNrZWRTb3VyY2U+O1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMuc2hhcmVkTWVtb3J5ID0gc2hhcmVkTWVtb3J5O1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmV2ZW50TG9nID0gZXZlbnRMb2c7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSAhIWlzRGVjaWRlcjtcbiAgICB0aGlzLmlzRm9yayA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIFNoYXJlZE1lbW9yeSBpbnN0YW5jZSAobmVlZGVkIGJ5IHNjb3BlIGxheWVyKS4gKi9cbiAgZ2V0U2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBTdGFtcGVkIGJlc2lkZSBydW50aW1lU3RhZ2VJZCwgYmVmb3JlIHNjb3BlIGNvbnN0cnVjdGlvbi4gKi9cbiAgYmluZEVtaXRPcmlnaW4ocnVuSWQ6IHN0cmluZywgZHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuZW1pdFJ1bklkID0gZHJpbGxQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBydW5JZDtcbiAgICBpZiAoZHJpbGxQYXRoICE9PSB1bmRlZmluZWQpIHRoaXMuZXZlbnRMb2c/LmJpbmRBZGRyZXNzKHJ1bklkLCBkcmlsbFBhdGgpO1xuICB9XG5cbiAgLyoqIENhcHR1cmUgZnJvbSB0aGlzIGZyYW1lJ3MgT1dOIGxvZy4gQSBtYW51YWwvdW5hZGRyZXNzYWJsZSBmcmFtZSBzdGF5cyB1bmtub3duLiAqL1xuICBjYXB0dXJlRW1pdFBvc2l0aW9uKCk6IEVtaXRTb3VyY2VQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdFJ1bklkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLmV2ZW50TG9nPy5jYXB0dXJlUG9zaXRpb24odGhpcy5lbWl0UnVuSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyBhcHBseVxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCB0aGUgb25lcyB0aGUgbG9nIHJlY29yZHMg4oCUIHRvXG4gICAqIHRoaXMgbWlycm9yLCBiZXNpZGUgdGhlIHJhdyBwYXRjaGVzIG9uIGBzaGFyZWRNZW1vcnlgIChgcmVjb3JkQ29tbWl0YCkuXG4gICAqIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0IHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbiBhIHJ1bnRpbWUncyByb290IGZyYW1lIGJ5IGBFeGVjdXRpb25SdW50aW1lYCB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCkgb24gdGhpcyBmcmFtZSDigJQgY2FsbGVkIG9uIGFcbiAgICogcnVudGltZSdzIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIChhdCBjb25zdHJ1Y3Rpb24sIGFuZCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VQb2xpY3lgIG9uIGEgc2FtZS1leGVjdXRvciByZXN1bWUpLiBEZXNjZW5kYW50cyBnZXRcbiAgICogdGhlIHNhbWUgcmVmZXJlbmNlIHRocm91Z2gge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH07IGFcbiAgICogc3ViZmxvdydzIHJ1bnRpbWUgaXMgY29uc3RydWN0ZWQgd2l0aCBpdCwgc28gaXRzIHNlZWQgZnJhbWUgYW5kIGV2ZXJ5XG4gICAqIGZyYW1lIGFmdGVyIGNvbW1pdCB1bmRlciB0aGUgcnVuJ3MgZGlhbHMgdG9vLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHBvbGljeSB0aGlzIGZyYW1lIHJldGFpbnMsIGVuY29kZXMgYW5kIHNjcnVicyB1bmRlci4gKi9cbiAgZ2V0UG9saWN5KCk6IFJ1blBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5IHNheVxuICAgKiBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSDigJQgYXMgYSBORVcgcG9saWN5IGZvciB0aGlzIGZyYW1lXG4gICAqICh0aGUgc2hhcmVkIG9uZSBpcyBuZXZlciBlZGl0ZWQpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBhcnJpdmVzXG4gICAqIHdpdGggdGhlIHJ1bidzIHBvbGljeTsgdGhpcyBkb29yIGlzIGZvciBhIGBTY29wZUZhY2FkZWAgb24gYSBiYXJlIGZyYW1lXG4gICAqICh1bml0IHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcyksIHdoaWNoIGJyaW5ncyBpdHMgb3duIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuICAgKiB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIGFza3MgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBwYXNzZXMgYVxuICAgKiBmYWNhZGUg4oCUIGEgc3ViZmxvdyBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlFxuICAgKiBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZSB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQ6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9saWN5LnJlZGFjdGlvbiAhPT0gcnVsZSkgdGhpcy5wb2xpY3kgPSB3aXRoUmVkYWN0aW9uKHRoaXMucG9saWN5LCBydWxlKTtcbiAgfVxuXG4gIC8qKiBUaGUgaW5zdGFsbGVkIHJlZGFjdGlvbiBydWxlLCBpZiBhbnkgKHRoZSBmYWNhZGUncyBsb29rdXApLiAqL1xuICBnZXRSZWRhY3Rpb25SdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcnVuIGZyb20gYGZyb21gOiB0aGUgcG9saWN5IChieSByZWZlcmVuY2UpIGFuZCB0aGUgcnVuJ3MgbWlycm9yXG4gICAqIHN0b3JlLiBUaGUgT05FIGluaGVyaXRhbmNlIHN0ZXAg4oCUIHtAbGluayBjcmVhdGVOZXh0fSBhbmRcbiAgICoge0BsaW5rIGNyZWF0ZUNoaWxkfSBib3RoIGNhbGwgaXQsIGFuZCBpdCBuYW1lcyBubyBkaWFsLlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0UnVuKGZyb206IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gZnJvbS5wb2xpY3k7XG4gICAgdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSA9IGZyb20ucmVkYWN0ZWRTaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgdHJhY2tlZCB1c2VyLWxldmVsIHdyaXRlLCBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGVcbiAgICogYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kIHtAbGluayB1cGRhdGVPYmplY3R9LiBIb2xkc1xuICAgKiB0aGUgUkVGRVJFTkNFIGFuZCB0aGUgdmVyZGljdCAoOS4yMy4wKTsgdGhlIHJldGFpbmVkIGZvcm0gaXMgdGFrZW4gYXRcbiAgICogY29tbWl0IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30sIG9uY2UgcGVyIGtleS5cbiAgICpcbiAgICogUmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlhbCBpbiBFVkVSWSBtb2RlOiBhIHJlZGFjdGVkXG4gICAqIHdyaXRlIHN0b3JlcyB0aGUgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgdW5kZXIgYCdmdWxsJ2AgQU5EXG4gICAqIGAnc3VtbWFyeSdgIChhIHN1bW1hcnkgbWFya2VyIHdvdWxkIGxlYWsgdGhlIHZhbHVlJ3MgcHJldmlldy9zaXplKSxcbiAgICogYW5kIHN0b3JlcyBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AgKGVudHJ5IHNraXBwZWQgZW50aXJlbHkg4oCUIG5vdGhpbmcgdG9cbiAgICogbGVhaykuIEEgZmllbGQtbGV2ZWwgdmVyZGljdCBzY3J1YnMgYSBjbG9uZSBCRUZPUkUgdGhlIGRpYWwgc2VlcyBpdCwgc29cbiAgICogYSBzdW1tYXJ5IHByZXZpZXcgY2FuIG5ldmVyIHNob3cgdGhlIHNlY3JldCBlaXRoZXIuIFRoZSB2ZXJkaWN0IGlzIHRoZVxuICAgKiBvbmUgYHN0YWdlV3JpdGVgIGFza2VkIHRoZSBydWxlIGZvciBCRUZPUkUgc3RhZ2luZywgY2FycmllZCB0byBjb21taXRcbiAgICogd2l0aCB0aGUgdmFsdWUuIFRoZSBzdGFnZWQgd3JpdGUgaXRzZWxmIGlzIHVuYWZmZWN0ZWQg4oCUIHJlZGFjdGlvbiBvZlxuICAgKiB0aGUgY29tbWl0dGVkIHBheWxvYWQgaXMgaGFuZGxlZCBieSB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogYHJlZGFjdGVkUGF0aHNgLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1dyaXRlKFxuICAgIHVzZXJLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnLFxuICApIHtcbiAgICBpZiAodGhpcy5wb2xpY3kud3JpdGVUcmFja2luZyA9PT0gJ29mZicpIHJldHVybjtcbiAgICAodGhpcy5fcGVuZGluZ1dyaXRlcyA/Pz0gbmV3IE1hcCgpKS5zZXQodXNlcktleSwgeyB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBfc3RhZ2VXcml0ZXNgIHdpdGggZXZlcnkgcGVuZGluZyB3cml0ZSBmb2xkZWQgaW4gYXMgaXRzIHJldGFpbmVkIGZvcm1cbiAgICog4oCUIHRoZSByZWNvcmQgYSByZWFkZXIgc2Vlcy4gQ29uc3VtZXMgbm90aGluZzogYSBtaWQtcnVuIHNuYXBzaG90IHJlYWRzXG4gICAqIHRoZSB3cml0ZXMgc28gZmFyLCBhbmQgY29tbWl0IHN0aWxsIG1hdGVyaWFsaXNlcyB0aGUgZmluYWwgdmFsdWVzLlxuICAgKiBSZXR1cm5zIGBfc3RhZ2VXcml0ZXNgIGl0c2VsZiB3aGVuIG5vdGhpbmcgaXMgcGVuZGluZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRXcml0ZXMoKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4ge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuIHRoaXMuX3N0YWdlV3JpdGVzO1xuICAgIGNvbnN0IG91dCA9IHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHddIG9mIHRoaXMuX3BlbmRpbmdXcml0ZXMpIHtcbiAgICAgIG91dFtrZXldID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5yZXRhaW5lZEZvcm0ody52ZXJkaWN0LCB3LnZhbHVlLCB0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nLCBzdW1tYXJpemVXcml0ZVZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiB3Lm9wZXJhdGlvbixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcmV0YWluZWQgZm9ybSBvZiBldmVyeSBwZW5kaW5nIHdyaXRlIOKAlCBPTkNFIHBlciBrZXksIGZyb20gdGhlXG4gICAqIHZhbHVlIGFzIGl0IHN0YW5kcyBhdCBjb21taXQgKDkuMjMuMCkg4oCUIGFuZCByZWxlYXNlIHRoZSByZWZlcmVuY2VzLiBUaGVcbiAgICogZmlyc3QgdGhpbmcgYGNvbW1pdCgpYCBkb2VzLCBzbyB0aGUgYm9ycm93ZWQtbXV0YXRpb24gZ3VhcmQgYW5kIHRoZVxuICAgKiBjb21taXQgb2JzZXJ2ZXIgc2VlIHRoZSBmaW5pc2hlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIG1hdGVyaWFsaXNlV3JpdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVsZWFzZWQgZXZlbiB3aGVuIGEgcmV0YWluZWQgZm9ybSBjYW5ub3QgYmUgdGFrZW4g4oCUIGFuIHVuY2xvbmVhYmxlXG4gICAgICAvLyB2YWx1ZSAoYSBmdW5jdGlvbiwgYSBQcm94eSkgaXMgYSBjb250cmFjdCB2aW9sYXRpb24gKFwic3RhdGUgdmFsdWVzXG4gICAgICAvLyBtdXN0IHN1cnZpdmUgc3RydWN0dXJlZENsb25lXCIpIHRoYXQgbm93IHN1cmZhY2VzIEhFUkUsIGF0IGNvbW1pdCxcbiAgICAgIC8vIGFuZCBmYWlscyB0aGUgcnVuIGxvdWRseTsgYSBsYXRlciBzbmFwc2hvdCBvZiB0aGUgZmFpbGVkIHJ1biBtdXN0XG4gICAgICAvLyBub3QgdGhyb3cgdGhlIHNhbWUgZXJyb3IgYWdhaW4uXG4gICAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBvZiBhIHZhbHVlIHRoZSBlbmdpbmUgUkVUQUlOUyAocmVhZHMgYW5kIHdyaXRlcyByZXRlbnRpb24pOlxuICAgKiB0aGUgcGxhY2Vob2xkZXIgYmVhdHMgZXZlcnkgZGlhbDsgYSBmaWVsZC1sZXZlbCBzY3J1YiBoYXBwZW5zIGJlZm9yZSB0aGVcbiAgICogZGlhbCBzZWVzIHRoZSB2YWx1ZTsgYSBjbGVhciB2YWx1ZSBpcyBzdW1tYXJpemVkIG9yIGNsb25lZCBhcyB0aGUgZGlhbFxuICAgKiBzYXlzLiBDYWxsZXJzIGhhbmRsZSBgdW5kZWZpbmVkYCBiZWZvcmUgYXNraW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZEZvcm0oXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBSZWFkVHJhY2tpbmdNb2RlIHwgV3JpdGVUcmFja2luZ01vZGUsXG4gICAgc3VtbWFyaXplOiAodmFsdWU6IHVua25vd24pID0+IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBzY3J1YmJlZCA9IHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobW9kZSA9PT0gJ3N1bW1hcnknKSByZXR1cm4gc3VtbWFyaXplKHNjcnViYmVkID8/IHZhbHVlKTtcbiAgICByZXR1cm4gc2NydWJiZWQgPz8gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVsZSB3aXRoIHNvbWV0aGluZyB0byBzYXkg4oCUIGB1bmRlZmluZWRgIG9uIHRoZSBuby1wb2xpY3kgcGF0aCAobm9cbiAgICogcnVsZSBpbnN0YWxsZWQsIG9yIGEgcnVsZSB3aXRoIG5vIHBvbGljeSBlbnRyaWVzIGFuZCBubyBtYXJrZWQga2V5cyksIHNvXG4gICAqIGEgdHJhY2tlZCByZWFkIG9yIGEgc3RhZ2VkIHdyaXRlIHRoZXJlIHBheXMgbm8gdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoXG4gICAqIGFsbG9jYXRpb24uIFRoZSBkZWZhdWx0IHJ1biBpcyBieXRlLWlkZW50aWNhbCBBTkQgY29zdC1pZGVudGljYWwuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IHJ1bGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIE9ORSBGVU5ORUwgZXZlcnkgc3RhZ2VkIHdyaXRlIHBhc3NlcyB0aHJvdWdoIOKAlCBmYWNhZGUgd3JpdGVzIEFORFxuICAgKiB0aGUgcGF0aHMgdGhhdCBieXBhc3MgdGhlIGZhY2FkZSAoc3ViZmxvdyBzZWVkLCBgb3V0cHV0TWFwcGVyYFxuICAgKiBtZXJnZS1iYWNrLCByZXN1bWUgcmUtc2VlZCkuIFRoZSBPTkUgZGVjaXNpb24gaXMgbWFkZSBoZXJlOiBhbiBleHBsaWNpdFxuICAgKiBwZXItY2FsbCBmbGFnIG1ha2VzIHRoZSB2YWx1ZSBzZWNyZXQgb3V0cmlnaHQgKGFuZCBtYXJrcyB0aGUga2V5IGZvciB0aGVcbiAgICogcmVzdCBvZiB0aGUgcnVuLCB0aGUgZGVjbGFyZS1vbmNlIGNvbnRyYWN0KTsgb3RoZXJ3aXNlIHRoZSBpbnN0YWxsZWRcbiAgICogcnVsZSBkZWNpZGVzIGZyb20gdGhlIHVzZXItbGV2ZWwgcGF0aC4gSXQgc3RhZ2VzIHRoZSB3cml0ZSwgcmVnaXN0ZXJzXG4gICAqIHRoZSByZWRhY3RlZCBwYXRocyB0aGUgY29tbWl0IGxvZyBhbmQgbWlycm9yIHdpbGwgc2NydWIgKHdob2xlIGtleSwgb3JcbiAgICogdGhlIGZpZWxkcyBpbnNpZGUgdGhlIHZhbHVlKSwgYW5kIGtlZXBzIHRoZSBydW4ncyBtYXJrZWQta2V5cyBzZXQgaW5cbiAgICogc3RlcCAoYSB3aG9sZSB2ZXJkaWN0IG1hcmtzIGl0cyBrZXk7IGEgZGVsZXRlIGNsZWFycyB0aGUgbWFyaykuIFJldHVybnNcbiAgICogdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBsZXQgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9IGV4cGxpY2l0XG4gICAgICA/IHsga2luZDogJ3dob2xlJywga2V5OiB1c2VyS2V5T2YocGF0aCwga2V5KSB9XG4gICAgICA6IHJ1bGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkpXG4gICAgICA6IENMRUFSO1xuICAgIC8vIEEgY29weSBJTlNJREUgdGhlIHN0YWdlOiB0aGUgdmVyeSBvYmplY3QgaXQgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gdW5kZXJcbiAgICAvLyBhbm90aGVyIChgcy5wZXJzb24gPSBzLnByb2ZpbGVgKSwga2VlcHMgdGhhdCBydWxlIOKAlCBtYXRjaGVkIGJ5IElERU5USVRZLiBBIG5ldyBvYmplY3RcbiAgICAvLyBvciBhIHByaW1pdGl2ZSBjb3BpZWQgYWNyb3NzIG5hbWVzIGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gbmFtZSBvbmx5LlxuICAgIGNvbnN0IHJlYWQgPVxuICAgICAgcnVsZSAhPT0gdW5kZWZpbmVkICYmIHZlcmRpY3Qua2luZCAhPT0gJ3dob2xlJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgID8gdGhpcy5fc2VsZWN0ZWRPYmplY3RzPy5nZXQodmFsdWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChyZWFkICE9PSB1bmRlZmluZWQgJiYgcnVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocmVhZC5raW5kID09PSAnd2hvbGUnKSBydWxlLm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAocmVhZC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgICBjb25zdCBhdCA9IFsuLi5wYXRoLnNsaWNlKDEpLCAuLi4ocGF0aC5sZW5ndGggPiAwID8gW2tleV0gOiBbXSldO1xuICAgICAgICBydWxlLmluaGVyaXRGaWVsZHMoXG4gICAgICAgICAgcGF0aFswXSA/PyBrZXksXG4gICAgICAgICAgcmVhZC5wYXRocy5tYXAoKGZpZWxkKSA9PiBbLi4uYXQsIGZpZWxkXS5qb2luKCcuJykpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdmVyZGljdCA9IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSk7XG4gICAgfVxuICAgIGNvbnN0IHdob2xlID0gdmVyZGljdC5raW5kID09PSAnd2hvbGUnO1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgYnVmZmVyLm1lcmdlKG5zUGF0aCwgdmFsdWUsIHdob2xlKTtcbiAgICBlbHNlIGlmICh2ZXJiID09PSAnZGVsZXRlJykgYnVmZmVyLmRlbGV0ZShuc1BhdGgsIHdob2xlKTtcbiAgICBlbHNlIGJ1ZmZlci5zZXQobnNQYXRoLCB2YWx1ZSwgd2hvbGUpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSBidWZmZXIubWFya1JlZGFjdGVkRmllbGRzKG5zUGF0aCwgdmVyZGljdC5wYXRocyk7XG4gICAgaWYgKHZlcmIgPT09ICdkZWxldGUnKSB7XG4gICAgICBydWxlPy51bm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgIH0gZWxzZSBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSB7XG4gICAgICAvLyBUaGUgUkVBTCBydWxlLCBub3QgdGhlIGFjdGl2ZSBvbmU6IGFuIGV4cGxpY2l0IG1hcmsgb24gYW4gaW5lcnQgcnVsZVxuICAgICAgLy8gaXMgZXhhY3RseSB3aGF0IG1ha2VzIGl0IGFjdGl2ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAgIHRoaXMucG9saWN5LnJlZGFjdGlvbj8ubWFyayh2ZXJkaWN0LmtleSk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBzdGFnZSdzIEZJUlNUXG4gICAqIHRvdWNoIChmaXJzdCByZWFkIG9yIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC5cbiAgICogU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgKHtAbGluayByZWFkU3RhdGV9KVxuICAgKiBhbmQgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGRpZmYgYmFzZSAoe0BsaW5rIGdldFRyYW5zYWN0aW9uQnVmZmVyfSkuXG4gICAqXG4gICAqIFdIWSBBIEJBUkUgUkVGRVJFTkNFIElTIFNBRkUg4oCUIHRoZSBpbnZhcmlhbnQgdGhpcyByZXN0cyBvbjogY29tbWl0dGVkXG4gICAqIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwLiBFdmVyeSB3cml0ZSB0byBgU2hhcmVkTWVtb3J5YCBidWlsZHMgdGhlXG4gICAqIE5FWFQgZ2VuZXJhdGlvbiBhbmQgc3dhcHMgaXQgaW4gKGNvcHktb24td3JpdGUsIDkuMjkuMDogYGFwcGx5UGF0Y2hgIHZpYVxuICAgKiBgbmV4dEdlbmVyYXRpb25gLCBhbmQgYHNldFZhbHVlYC9gdXBkYXRlVmFsdWVgIHRvbykg4oCUIGl0IGNvcGllcyB0aGUgcm9vdFxuICAgKiBhbmQgdGhlIGNvbnRhaW5lcnMgb24gZWFjaCB3cml0dGVuIHBhdGgsIHNoYXJlcyB0aGUgcmVzdCwgYW5kIG5ldmVyXG4gICAqIGVkaXRzIGEgY29udGFpbmVyIG9mIHRoZSBnZW5lcmF0aW9uIGEgc3RhZ2UgY2FwdHVyZWQgaGVyZS4gSG9sZGluZyB0aGVcbiAgICogcmVmZXJlbmNlIHRoZXJlZm9yZSBnaXZlcyB0aGlzIHN0YWdlIGEgc3RhYmxlIHNuYXBzaG90IGF0IHplcm8gY29zdCDigJQgbm9cbiAgICogY2xvbmUsIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgIzEzLiBUaGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UgcmVzdHMgb24gdGhlIHNhbWUgZ3VhcmFudGVlOiBpdCBJUyB0aGlzIHZpZXcuXG4gICAqXG4gICAqIFdIWSBGSVJTVCBUT1VDSCwgbm90IGZpcnN0IHdyaXRlOiB0aGUgcHJlLSMxMyBlYWdlciBlbmdpbmUgY2xvbmVkIHRoZVxuICAgKiBzdGF0ZSBpbnRvIHRoZSBidWZmZXIgYXQgdGhlIHN0YWdlJ3MgZmlyc3QgQUNDRVNTLCBhbmNob3JpbmcgYm90aCBpdHNcbiAgICogc25hcHNob3QgcmVhZHMgYW5kIGl0cyBjb21taXQgYmFzZWxpbmUgKHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSkgdGhlcmUuXG4gICAqICMxMydzIGZpcnN0IGN1dCBhbmNob3JlZCB0aGUgbGF6eSBidWZmZXIgYXQgZmlyc3QgV1JJVEUg4oCUIG9ic2VydmFibHlcbiAgICogZGlmZmVyZW50IHdoZW4gc29tZXRoaW5nIGVsc2UgY29tbWl0cyBpbiB0aGUgZ2FwIGJldHdlZW4gdGhpcyBzdGFnZSdzXG4gICAqIGZpcnN0IHJlYWQgYW5kIGl0cyBmaXJzdCB3cml0ZS4gVGhhdCBnYXAgaXMgUkVBQ0hBQkxFOiBmb3JrIHNpYmxpbmdzIGFyZVxuICAgKiBuYW1lc3BhY2UtaXNvbGF0ZWQgZm9yIHJ1bi1zY29wZWQga2V5cyAoZWFjaCBjaGlsZCB3cml0ZXMgdW5kZXJcbiAgICogYHJ1bnMvPGNoaWxkSWQ+L2ApLCBidXQgUk9PVC1sZXZlbCBrZXlzIGFyZSBzaGFyZWQg4oCUIHdyaXR0ZW4gdmlhXG4gICAqIGBzZXRHbG9iYWxgIGZyb20gY29uc3VtZXIgc2NvcGUgY29kZSBhbmQsIGNyaXRpY2FsbHksIGJ5XG4gICAqIGBTdWJmbG93SW5wdXRNYXBwZXJgJ3Mgb3V0cHV0IG1hcHBpbmcgKGBwYXJlbnRDb250ZXh0LnNldEdsb2JhbGApLCB3aGljaFxuICAgKiBpcyBleGFjdGx5IHdoYXQgcnVucyB3aGVuIGEgc3ViZmxvdyBpcyBhIGZvcmsgYnJhbmNoLiBBIHNpYmxpbmcnc1xuICAgKiByb290LWtleSBjb21taXQgbGFuZGluZyBpbiB0aGUgZ2FwIHdvdWxkIHNoaWZ0IHRoaXMgc3RhZ2UncyBkaWZmIGJhc2UsXG4gICAqIG1ha2luZyBpdHMgQ29tbWl0QnVuZGxlIHJlY29yZCBhIHBoYW50b20gY2hhbmdlIChvciBzd2FsbG93IGEgcmVhbCBvbmUpXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBlYWdlciBlbmdpbmUuIEFuY2hvcmluZyB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZXN0b3Jlc1xuICAgKiB0aGUgRVhBQ1QgZWFnZXIgc2VtYW50aWNzIOKAlCBzZXF1ZW50aWFsIEFORCBwYXJhbGxlbCDigJQgYXQgemVybyBjbG9uZSBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpc2liaWxpdHkgaXMgdHdvLXRpZXIsIG1hdGNoaW5nIGVhZ2VyIGJ5dGUtZm9yLWJ5dGU6IGtleXMgcHJlc2VudFxuICAgKiBpbiB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZWFkIHJlcGVhdGFibHkgZnJvbSBpdDsga2V5cyBBQlNFTlQgZnJvbSBpdFxuICAgKiBmYWxsIGJhY2sgdG8gTElWRSBzdGF0ZSAodGhlIGVhZ2VyIGVuZ2luZSdzIGV4YWN0IGZhbGxiYWNrIOKAlCBhXG4gICAqIG1pZC1mbGlnaHQgc2libGluZyByb290LWtleSB3cml0ZSB3YXMgYWx3YXlzIHZpc2libGUgdG8gcmVhZHMsIGFuZFxuICAgKiBzdGF5cyB2aXNpYmxlOyBvbmx5IHRoZSBESUZGIEJBU0UgaXMgcGlubmVkKS5cbiAgICovXG4gIHByaXZhdGUgZmlyc3RUb3VjaFN0YXRlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuc3RhdGVWaWV3KSB7XG4gICAgICB0aGlzLnN0YXRlVmlldyA9IHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlVmlldztcbiAgfVxuXG4gIC8qKiBMYXppbHkgY3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIG9uIHRoZSBzdGFnZSdzIEZJUlNUIFdSSVRFICgjMTMpLlxuICAgKlxuICAgKiAgUmVhZHMgTkVWRVIgY29uc3RydWN0IGl0OiByZWFkLXlvdXItd3JpdGVzIG9ubHkgbWF0dGVycyBvbmNlIGEgc3RhZ2VkXG4gICAqICB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0IHtAbGluayBnZXRWYWx1ZX0ve0BsaW5rIGdldFZhbHVlRGlyZWN0fVxuICAgKiAgc2VydmUgZnJvbSB0aGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhblxuICAgKiAgZW1wdHkgYnVuZGxlIOKAlCBhbGwgd2l0aCBaRVJPIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiAgVGhlIGJ1ZmZlcidzIGJhc2UgaXMgdGhlIEZJUlNULVRPVUNIIHZpZXcsIE5PVCB0aGUgbGl2ZSBzdGF0ZSBhdCB3cml0ZVxuICAgKiAgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3MgYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXNcbiAgICogIHN0YWdlJ3MgZmlyc3QgcmVhZCBhbmQgdGhpcyB3cml0ZSwgYW5kIHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSBtdXN0XG4gICAqICBzdGF5IGFuY2hvcmVkIGF0IGZpcnN0IHRvdWNoIHRvIG1hdGNoIHRoZSBlYWdlciBlbmdpbmUg4oCUIHNlZVxuICAgKiAge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0uICovXG4gIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKTogaGFuZCB0aGUgYnVmZmVyIGEgbGl2ZSB2aWV3IG9mIHRoaXNcbiAgICAgIC8vIHN0YWdlJ3MgcmVhZCBwcmVmaXgg4oCUIGV2YWx1YXRlZCBBVCBFQUNIIFdSSVRFLCBzbyBlYWNoIHN0YWdlZCBvcFxuICAgICAgLy8gY2FwdHVyZXMgZXhhY3RseSB0aGUgcmVhZHMgdGhhdCBwcmVjZWRlZCBpdCAodGVtcG9yYWwgcHJlZml4KS5cbiAgICAgIGNvbnN0IHJlYWRLZXlzUHJvdmlkZXIgPVxuICAgICAgICB0aGlzLnBvbGljeS53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnID8gKCkgPT4gWy4uLih0aGlzLl9wcm92ZW5hbmNlUmVhZHMgPz8gW10pXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBzdGFnZSdzIGFkZHJlc3MgKDkuMzAuMDogdGhlIGFkbWl0dGVkIHJlY29yZCByZWFkcyB0aGUgY29udGFpbmVyc1xuICAgICAgLy8gdGhlcmUgYXMgd2hlcmUgdGhlIHN0YWdlIHdyaXRlcywgbmV2ZXIgYXMgYSB2YWx1ZSBpdCByZWFkKS5cbiAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFRyYW5zYWN0aW9uQnVmZmVyKFxuICAgICAgICB0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLFxuICAgICAgICB0aGlzLnBvbGljeS5jb21taXRWYWx1ZXMsXG4gICAgICAgIHJlYWRLZXlzUHJvdmlkZXIsXG4gICAgICAgIHRoaXMuYWRkcmVzcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGlzIGZyYW1lIHdyaXRlcyBhbmQgcmVhZHM6IGBbJ3J1bnMnLCA8aWQ+XWAsIG9yIGBbXWAgKHRoZSByb290KSB3aXRoXG4gICAqIG5vIHJ1biBpZC4gSGFuZGVkIHRvIHRoZSByZWNvcmQgbGF5ZXIgYXMgZGF0YSAoQzIpOiB0aGUgYnVmZmVyJ3MgYWRkcmVzcyxcbiAgICogYW5kIHdoZXJlIGBTaGFyZWRNZW1vcnkgwrcgZ2V0VmFsdWVgIGxvb2tzIGJlZm9yZSB0aGUgcm9vdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGFkZHJlc3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZUlkID8gW1JVTl9OQU1FU1BBQ0UsIHRoaXMubmFtZXNwYWNlSWRdIDogW107XG4gIH1cblxuICAvKiogQnVpbGRzIGFuIGFic29sdXRlIHBhdGggaW5zaWRlIHRoZSBzaGFyZWQgbWVtb3J5OiB0aGlzIGZyYW1lJ3Mge0BsaW5rIGFkZHJlc3N9LCB0aGVuIHRoZSBwYXRoLiAqL1xuICBwcml2YXRlIHdpdGhOYW1lc3BhY2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIC8vIFNwZWxsZWQgb3V0LCBub3QgYFsuLi50aGlzLmFkZHJlc3MsIOKApl1gOiBldmVyeSByZWFkIGFuZCB3cml0ZSBidWlsZHMgb25lLCBhbmQgdGhlIHNwcmVhZFxuICAgIC8vIGFsbG9jYXRlcyB0aGUgYWRkcmVzcyBhcnJheSBwZXIgY2FsbCAoKzMlIG9uIGEgbmFtZXNwYWNlZCBmcmFtZSdzIHJlYWQvd3JpdGUgbG9vcCkuXG4gICAgY29uc3QgaWQgPSB0aGlzLm5hbWVzcGFjZUlkO1xuICAgIHJldHVybiBpZCA/IFtSVU5fTkFNRVNQQUNFLCBpZCwgLi4ucGF0aCwga2V5XSA6IFsuLi5wYXRoLCBrZXldO1xuICB9XG5cbiAgLyoqIFRoZSBydW4gbmFtZXNwYWNlIHdyaXRlcyBhbmQgcmVhZHMgZ28gdG86IHtAbGluayBhZGRyZXNzUnVuSWR9LCBlbHNlIGBydW5JZGAuICovXG4gIHByaXZhdGUgZ2V0IG5hbWVzcGFjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkcmVzc1J1bklkID8/IHRoaXMucnVuSWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYW5kIHJlYWQgYXQgQU5PVEhFUiBmcmFtZSdzIGFkZHJlc3MgKGl0cyBydW4gbmFtZXNwYWNlKSB3aGlsZSB0aGlzXG4gICAqIGZyYW1lIGtlZXBzIGl0cyBvd24gaWRlbnRpdHkgb24gdGhlIHJlY29yZCDigJQgYHN0YWdlYCwgYHN0YWdlSWRgLFxuICAgKiBgcnVudGltZVN0YWdlSWRgLCB0YWdzLiBBIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIGlzIHRoZSBvbmUgY2FsbGVyXG4gICAqIChgU3ViZmxvd0V4ZWN1dG9yIMK3IGV4ZWN1dGVTdWJmbG93YCwgUjEzKTogdGhlIG1vdW50IGZyYW1lIG9mIGEgYnJhbmNoIG9yXG4gICAqIGZvcmsgY2hpbGQgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHMgcGFyZW50IHdyaXRlcywgYXMgYmVmb3JlLCBhbmQgaXRzXG4gICAqIGJ1bmRsZSBub3cgbmFtZXMgdGhlIG1vdW50IGluc3RlYWQgb2YgdGhlIHN0YWdlIGJlZm9yZSBpdC4gUmVmdXNlZCBvbmNlXG4gICAqIHRoZSBmcmFtZSBoYXMgc3RhZ2VkIGFueXRoaW5nIOKAlCBpdHMgYnVmZmVyJ3MgYWRkcmVzcyBpcyBmaXhlZCB0aGVuLlxuICAgKi9cbiAgdXNlQWRkcmVzc09mKGZyYW1lOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5idWZmZXIgJiYgZnJhbWUubmFtZXNwYWNlSWQgIT09IHRoaXMubmFtZXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC51c2VBZGRyZXNzT2Y6ICcke3RoaXMuc3RhZ2VJZH0nIGhhcyBhbHJlYWR5IHN0YWdlZCB3cml0ZXMgYXQgaXRzIG93biBhZGRyZXNzLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFkZHJlc3NSdW5JZCA9IGZyYW1lLm5hbWVzcGFjZUlkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyaXRlIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGF0Y2gocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdtZXJnZScpO1xuICB9XG5cbiAgc2V0T2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uT3ZlcnJpZGU/OiAnc2V0JyB8ICdkZWxldGUnLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICAvLyBFeHBsaWNpdCBkZWxldGlvbiAoU2NvcGVGYWNhZGUuZGVsZXRlVmFsdWUpIHN0YWdlcyBhIGRpc3RpbmN0IG9wIHNvXG4gICAgLy8gZGVsdGEtbW9kZSBjb21taXRzICgjMTNjLUIpIGNhbiBlbWl0IGEgcmVhbCBgZGVsZXRlYCB0cmFjZSBlbnRyeS5cbiAgICAvLyBVbmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSB0aGUgYnVmZmVyIGNvbW1pdHMgaXQgYXMgYVxuICAgIC8vIHNldC1vZi11bmRlZmluZWQg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcuXG4gICAgY29uc3QgdmVyZGljdCA9XG4gICAgICBvcGVyYXRpb25PdmVycmlkZSA9PT0gJ2RlbGV0ZSdcbiAgICAgICAgPyB0aGlzLnN0YWdlV3JpdGUodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHBhdGgsIGtleSwgdW5kZWZpbmVkLCBzaG91bGRSZWRhY3QsICdkZWxldGUnKVxuICAgICAgICA6IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1ZmZlci1hd2FyZSByZWFkLCBtaXJyb3JpbmcgdGhlIGVhZ2VyIGVuZ2luZSdzIHJlYWQgb3JkZXIgYnl0ZS1mb3ItYnl0ZTpcbiAgICpcbiAgICogICAgMS4gc3RhZ2VkIHdyaXRlcyArIGZpcnN0LXRvdWNoIHNuYXBzaG90IOKAlCBgYnVmZmVyLmdldGAgb3ZlciBpdHNcbiAgICogICAgICAgd29ya2luZ0NvcHkgd2hlbiB0aGUgYnVmZmVyIGV4aXN0cywgZWxzZSBgbmF0aXZlR2V0YCBvdmVyIHRoZVxuICAgKiAgICAgICB6ZXJvLWNsb25lIHN0YXRlIHZpZXcgKHRoZSBidWZmZXIncyBiYXNlIElTIHRoYXQgdmlldywgc28gdGhlIHR3b1xuICAgKiAgICAgICB0aWVycyBhZ3JlZSBvbiBjb250ZW50KTtcbiAgICogICAgMi4gTElWRSBzdGF0ZSB2aWEgYHNoYXJlZE1lbW9yeS5nZXRWYWx1ZWAgZm9yIGtleXMgYWJzZW50IGZyb20gdGhlXG4gICAqICAgICAgIHNuYXBzaG90IOKAlCBpbmNsdWRpbmcgaXRzIHJ1buKGkmdsb2JhbCBuYW1lc3BhY2UgZmFsbGJhY2suIFRoZSBlYWdlclxuICAgKiAgICAgICBlbmdpbmUgaGFkIHRoaXMgZXhhY3QgbGl2ZSBmYWxsYmFjayBmb3Igc25hcHNob3QtbWlzc2luZyBrZXlzO1xuICAgKiAgICAgICBieXRlLWlkZW50aXR5IG92ZXIgcHVyaXR5LiBBZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBzdWNoIGFcbiAgICogICAgICAgdmFsdWUgY2FuIGJlIHRoZSB2ZXJ5IGNvbnRhaW5lciB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGhvbGRzIGF0XG4gICAqICAgICAgIHRoZSBwYXRoICh0aGUgc3RhZ2UgZGVsZXRlZCBvciB1bnNldCBpdCwgb3IgcmVwbGFjZWQgYSBjb250YWluZXJcbiAgICogICAgICAgYWJvdmUgaXQpLCBzbyB0aGUgYmFzZSBpcyBkZXRhY2hlZCB0aGVyZSBmaXJzdFxuICAgKiAgICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKTogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGUgdmFsdWVcbiAgICogICAgICAgKG91dCBvZiBjb250cmFjdCkgd3JpdHRlbiBiYWNrIGlzIHJlY29yZGVkLCBhcyBvbiA5LjI4LjAsIHdob3NlXG4gICAqICAgICAgIGJhc2Ugd2FzIGEgY2xvbmUgdGFrZW4gYXQgdGhlIGZpcnN0IHdyaXRlLlxuICAgKlxuICAgKiAgUmVhZHMgbmV2ZXIgY29uc3RydWN0IHRoZSBidWZmZXIgKCMxMyk6IGEgc3RhZ2UgdGhhdCBuZXZlciB3cml0ZXNcbiAgICogIHBlcmZvcm1zIHplcm8gY2xvbmVzIG9mIHRoZSBzaGFyZWQgc3RhdGUuICovXG4gIHByaXZhdGUgcmVhZFN0YXRlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGZyb21TbmFwc2hvdCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuZ2V0KG5hbWVzcGFjZWQpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIG5hbWVzcGFjZWQpO1xuICAgIGlmICh0eXBlb2YgZnJvbVNuYXBzaG90ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZyb21TbmFwc2hvdDtcbiAgICBjb25zdCBsaXZlID0gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5hZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIC8vIFRpZXIgMiBhZnRlciB0aGUgZmlyc3Qgd3JpdGU6IGtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCAoc2VlIGFib3ZlKS5cbiAgICBpZiAodGhpcy5idWZmZXIgJiYgbGl2ZSAhPT0gbnVsbCAmJiB0eXBlb2YgbGl2ZSA9PT0gJ29iamVjdCcpIHRoaXMuYnVmZmVyLmRldGFjaEJhc2UobmFtZXNwYWNlZCk7XG4gICAgcmV0dXJuIGxpdmU7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tlZCByZWFkLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgQk9SUk9XRUQg4oCUIHNlZSB0aGUgY29udHJhY3Qgb25cbiAgICogYFNjb3BlRmFjYWRlLmdldFZhbHVlYC4gUmVhZC10cmFja2luZyBjb3N0IGlzIHBvbGljeS1nYXRlZCAoIzE0KTpcbiAgICogYCdmdWxsJ2AgY2xvbmVzIHRoZSB2YWx1ZSBpbnRvIGBfc3RhZ2VSZWFkc2AgKGhpc3RvcmljYWwgZGVmYXVsdCksXG4gICAqIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcCBtYXJrZXIsIGAnb2ZmJ2AgcmVjb3JkcyBub3RoaW5nLlxuICAgKi9cbiAgZ2V0VmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVhZFN0YXRlKHBhdGgsIGtleSk7XG4gICAgLy8gUGVyLXdyaXRlIHByb3ZlbmFuY2UgcmVnaXN0cnkgKCNQMSkg4oCUIGtleSBzdHJpbmdzIG9ubHksIGluZGVwZW5kZW50IG9mXG4gICAgLy8gdGhlIHJlYWRUcmFja2luZyByZXRlbnRpb24gZGlhbCAod2hpY2ggZ292ZXJucyBWQUxVRSByZXRlbnRpb24gYmVsb3cpLlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBvbGljeS53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnKSB7XG4gICAgICAodGhpcy5fcHJvdmVuYW5jZVJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZChwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXkpO1xuICAgIH1cbiAgICAvLyBUaGUgdmVyZGljdCwgb25jZSDigJQgZm9yIHRoZSByZXRhaW5lZCByZWFkIGJlbG93IGFuZCB0aGUgc2VsZWN0ZWQtcmVhZFxuICAgIC8vIGNvdW50IChgc2VsZWN0ZWRSZWFkc2ApLiBObyBwb2xpY3kgYW5kIG5vIG1hcmtzIOKGkiBubyB2ZXJkaWN0IGNhbGwsIG5vXG4gICAgLy8gYWxsb2NhdGlvbiAoYWN0aXZlUnVsZSkuXG4gICAgY29uc3QgcnVsZSA9IGtleSAhPT0gdW5kZWZpbmVkID8gdGhpcy5hY3RpdmVSdWxlKCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmVyZGljdCA9IHJ1bGUgIT09IHVuZGVmaW5lZCA/IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSBhcyBzdHJpbmcpIDogQ0xFQVI7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlYWRzICs9IDE7XG4gICAgICAvLyBBbiBvYmplY3QgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gYmFjayB1bmRlciBhbm90aGVyLCBrZWVwcyBpdHMgcnVsZSAoc3RhZ2VXcml0ZSkuXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgKHRoaXMuX3NlbGVjdGVkT2JqZWN0cyA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcg4oCUIHJldGFpbmVkIHVuZGVyXG4gICAgLy8gdGhlIHJ1bGUncyB2ZXJkaWN0ICg5LjE5LjApOiBhIHJlZGFjdGVkIGtleSBpcyByZXRhaW5lZCBhcyB0aGVcbiAgICAvLyBwbGFjZWhvbGRlciwgYSBmaWVsZC1sZXZlbCBrZXkgYXMgYSBzY3J1YmJlZCBjbG9uZSwgbmV2ZXIgdGhlIHNlY3JldC5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgPT09ICdmdWxsJyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMuX3ZpZXdSZWFkcz8uZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2UgKHRoaXMuX3ZpZXdSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleU9mKHBhdGgsIGtleSldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJldGFpbmVkRm9ybSh2ZXJkaWN0LCB2YWx1ZSwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nLCBzdW1tYXJpemVSZWFkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgYFtSRUFEXSAke2Rlc2NyaXB0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgdHJhY2tlZCByZWFkcyBvZiB0aGlzIGZyYW1lIHJlYWQgYSB2YWx1ZSB0aGUgcnVuJ3MgcnVsZSBzZWxlY3RzXG4gICAqIChhIGtleSBpdCBtYXNrcyB3aG9sZSwgb3Igb25lIHdpdGggc2VjcmV0IGZpZWxkcykuIEEgYm91bmRhcnkgdGhhdCBtYXBzXG4gICAqIHdoYXQgYSBzdGFnZSBmdW5jdGlvbiBSRUFEIGludG8gYSBuZXcgbmFtZSDigJQgdGhlIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zXG4gICAqIHNlbGVjdG9yIOKAlCBjb21wYXJlcyBpdCBiZWZvcmUgYW5kIGFmdGVyLCBhcyBhIHN1YmZsb3cgbWFwcGVyJ3MgdGFpbnQgZG9lc1xuICAgKiAoYG1lbW9yeS9yZWRhY3Rpb24udHMgwrcgTWFwcGVyVGFpbnRgKS4gQWx3YXlzIDAgd2l0aG91dCBhIHBvbGljeSBvciBhIG1hcmsuXG4gICAqL1xuICBnZXQgc2VsZWN0ZWRSZWFkcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJlYWRzO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkU3RhdGUocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5hZGRyZXNzLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZShbXSwgW10sIGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogcmVjb3JkIHRoYXQgdGhpcyBzdGFnZSBjb25zdW1lZCBhbiB1bnRyYWNrZWQgcmVhZCBwYXRoLlxuICAgKiBDYWxsZWQgYnkgYFNjb3BlRmFjYWRlYCAoYGdldEFyZ3NgL2BnZXRFbnZgL3Vuc2hhZG93ZWQgYGdldFZhbHVlU2lsZW50YCk7XG4gICAqIHN1cmZhY2VkIGFzIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2Agb24gdGhpcyBzdGFnZSdzIGNvbW1pdC5cbiAgICovXG4gIG1hcmtVbnRyYWNrZWRTb3VyY2Uoc291cmNlOiBVbnRyYWNrZWRTb3VyY2UpOiB2b2lkIHtcbiAgICAodGhpcy5fdW50cmFja2VkU291cmNlcyA/Pz0gbmV3IFNldCgpKS5hZGQoc291cmNlKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBldmVudHMuICovXG4gIHNldENvbW1pdE9ic2VydmVyKFxuICAgIG9ic2VydmVyOiAobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXYtbW9kZSBvbmx5OiBkaWQgdGhpcyBzdGFnZSBjaGFuZ2UsIElOIFBMQUNFLCBhIHZhbHVlIGl0IG1lcmVseSBSRUFEP1xuICAgKlxuICAgKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2gg4oCUIGEgcHJvcGVydHkgYXQgYW55XG4gICAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAgICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgcmVhZCBtZXRob2QgKGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsXG4gICAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyk6IHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0XG4gICAqIG9mIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gU28gdGhhdCBmYW1pbHlcbiAgICogaXMgV0FSTkVEIEFCT1VUIHJhdGhlciB0aGFuIGludGVyY2VwdGVkIOKAlCBsb3VkbHksIGhlcmUsIGluc3RlYWQgb2YgZW5kaW5nXG4gICAqIHRoZSBydW4gd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBzaWxlbnRseSBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIFJFUE9SVCBhZnRlciB0aGUgZmFjdCwgbm90IGEgcmVmdXNhbCBhdCB0aGUgd3JpdGU6IHRoZSB3cml0ZSBoYXNcbiAgICogYWxyZWFkeSBoYXBwZW5lZCBpbiBwbGFjZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcmNlcHQuIEl0IHJ1bnMgdW5kZXJcbiAgICogVFdPIHByZWNvbmRpdGlvbnMsIGJvdGggbmFtZWQgaW4gdGhlIFJFQURNRSDigJQgYGVuYWJsZURldk1vZGUoKWAsIGFuZFxuICAgKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCksIGJlY2F1c2UgdGhlIGNvbXBhcmlzb24gbmVlZHMgdGhlXG4gICAqIGNsb25lIG9mIHRoZSB2YWx1ZSB0aGF0IG1vZGUgcmV0YWlucyBhdCByZWFkIHRpbWUuIEEga2V5IHRoZSBzdGFnZSBuZXZlclxuICAgKiBzdGFnZWQgbXVzdCBzdGlsbCBob2xkIHRoYXQgY2xvbmUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcFxuICAgKiBhbmQgdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlIHRvIHRoaXMgc3RhZ2UuIEtleXMgdGhlIHN0YWdlIERJRFxuICAgKiBzdGFnZSBhcmUgc2tpcHBlZCAodGhleSBhcmUgZXhwZWN0ZWQgdG8gZGlmZmVyLCBhbmQgdGhleSBhcmUgaW4gdGhlIHJlY29yZCksXG4gICAqIHNvIGFyZSBrZXlzIHVuZGVyIGEgcmVkYWN0aW9uIHZlcmRpY3QsIHdob3NlIHJldGFpbmVkIGZvcm0gaXMgZGVsaWJlcmF0ZWx5XG4gICAqIG5vdCB0aGUgdmFsdWUsIGFuZCBzbyBhcmUga2V5cyByZWFkIGF0IGEgbmVzdGVkIHBhdGggKGBfbmVzdGVkUmVhZHNgKSDigJRcbiAgICogdGhvc2UgYXJlIGVuZ2luZSByZWFkcyAodGhlIHN1YmZsb3cgbWVyZ2UtYmFjayksIG5vdCB1c2VyIHJlYWRzLlxuICAgKlxuICAgKiBJdCBhbHNvIG9ubHkgbG9va3MgYXQga2V5cyBzZXJ2ZWQgZnJvbSB0aGUgUElOTkVEIHNvdXJjZSDigJQgdGhlIGZpcnN0LXRvdWNoXG4gICAqIHZpZXcgb3IgdGhpcyBzdGFnZSdzIG93biBidWZmZXIuIEEga2V5IGFic2VudCBmcm9tIGJvdGggd2FzIHNlcnZlZCBieVxuICAgKiBgcmVhZFN0YXRlYCdzIGxpdmUgZmFsbGJhY2ssIHdoaWNoIGEgcGFyYWxsZWwgc2libGluZydzIHJvb3Qta2V5IGNvbW1pdCBjYW5cbiAgICogbGVnaXRpbWF0ZWx5IG1vdmU7IGFjY3VzaW5nIHRoZSBzdGFnZSB0aGVyZSB3b3VsZCBiZSBhIGZhbHNlIGFsYXJtLiBGb3JcbiAgICogdGhlIHNhbWUgcmVhc29uIGl0IHJ1bnMgb24gdGhlIGZyYW1lJ3MgRklSU1QgY29tbWl0IG9ubHk6IHRoZSByZWFkcyBiZWxvbmdcbiAgICogdG8gdGhhdCByb3VuZCwgYW5kIGJ5IHRoZSBlbmdpbmUncyBzZWNvbmQgcm91bmQgKGEgZm9yayBkb3VibGUtY29tbWl0LCBhXG4gICAqIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkIGJyYW5jaCBwYXJlbnQpIG90aGVyIHN0YWdlcyBoYXZlXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlZCB0aGUgc3RhdGUgdGhleSB3ZXJlIGNvbXBhcmVkIGFnYWluc3QuXG4gICAqXG4gICAqIEEga2V5IHRoZSBzdGFnZSBESUQgc3RhZ2UgaXMgc3RpbGwgY2hlY2tlZCB3aGVuIGl0cyBsYXN0IHJlYWQgY2FtZSBmcm9tXG4gICAqIGNvbW1pdHRlZCBzdGF0ZSAoe0BsaW5rIF92aWV3UmVhZHN9IOKAlCByZWFkIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUpOlxuICAgKiB0aGF0IHJlYWQgd2FzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgYW5kIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgSVNcbiAgICogdGhhdCBvYmplY3QgKGNvcHktb24td3JpdGUsIDkuMjkuMCksIHNvIGFuIGluLXBsYWNlIGVkaXQgZm9sbG93ZWQgYnkgYVxuICAgKiB3cml0ZSBvZiB0aGUga2V5IGNvbW1pdHMgTk8gY2hhbmdlIOKAlCBsaXZlIHN0YXRlIGtlZXBzIHRoZSBlZGl0LCB0aGUgbG9nXG4gICAqIGRvZXMgbm90LiBDb21wYXJlZCBhZ2FpbnN0IGNvbW1pdHRlZCBzdGF0ZSwgbm90IHRoZSB3cml0dGVuIHZhbHVlLCBzbyBhXG4gICAqIGxlZ2l0aW1hdGUgd3JpdGUgbmV2ZXIgdHJpcHMgaXQuXG4gICAqXG4gICAqIENvc3RzIG5vdGhpbmcgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpIHx8IHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnIHx8IHRoaXMuX2NvbW1pdHRlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKSkge1xuICAgICAgY29uc3QgcmV0YWluZWQgPSB0aGlzLl9zdGFnZVJlYWRzW2tleV07XG4gICAgICAvLyBPbmx5IGEgY29udGFpbmVyIGNhbiBiZSBtdXRhdGVkIGluIHBsYWNlOyBhIHByaW1pdGl2ZSByZWFkIGNhbm5vdC5cbiAgICAgIGlmIChyZXRhaW5lZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmV0YWluZWQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLl9uZXN0ZWRSZWFkcz8uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHJ1bGUgIT09IHVuZGVmaW5lZCAmJiBydWxlLnZlcmRpY3RBdChbXSwga2V5KS5raW5kICE9PSAnY2xlYXInKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWQgPSB0aGlzLndpdGhOYW1lc3BhY2UoW10sIGtleSk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3N0YWdlV3JpdGVzLCBrZXkpIHx8IHRoaXMuYnVmZmVyPy53YXNTdGFnZWQobmFtZXNwYWNlZCkpIHtcbiAgICAgICAgdGhpcy53YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXksIG5hbWVzcGFjZWQsIHJldGFpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIC8vIGBwZWVrYCwgbm90IGBnZXRgOiBhIHJlcG9ydCBjb21wYXJlcywgYW5kIG11c3Qgbm90IHRha2UgdGhlIHByaXZhdGVcbiAgICAgIC8vIGNvcHkgYSBzdGFnZSdzIHJlYWQgd291bGQgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5wZWVrKG5hbWVzcGFjZWQpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIG5hbWVzcGFjZWQpO1xuICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGN1cnJlbnQpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHN0YWdlZC1rZXkgaGFsZiBvZiB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn06IGRpZCBjb21taXR0ZWQgc3RhdGUgaXRzZWxmIG1vdmUgdW5kZXIgYSByZWFkPyAqL1xuICBwcml2YXRlIHdhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleTogc3RyaW5nLCBuYW1lc3BhY2VkOiBzdHJpbmdbXSwgcmV0YWluZWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZpZXdSZWFkcz8uaGFzKGtleSkpIHJldHVybjtcbiAgICBjb25zdCBjb21taXR0ZWQgPSBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoU3RhdGUoKSwgbmFtZXNwYWNlZCk7XG4gICAgaWYgKGNvbW1pdHRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY29tbWl0dGVkKTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBzdGFnZWQgd3JpdGVzIHRvIHNoYXJlZCBtZW1vcnkgYW5kIFJFTEVBU0UgdGhlIHBlci1zdGFnZSBzdGFnaW5nXG4gICAqIHN0YXRlICgjMTNiKS5cbiAgICpcbiAgICogYHBoYXNlYCAoOS4zOS4wKSBpcyB0aGUgY2FsbGVyJ3Mgc3RhdGVtZW50IG9mIHdoYXQgYSBDT05USU5VQVRJT04gY29tbWl0XG4gICAqIGlzIOKAlCBgJ2V4aXQnYCBmcm9tIGEgc3ViZmxvdyBtb3VudCdzIGV4aXQsIGAncmVwZWF0J2AgZnJvbSBhIGZvcmtcbiAgICogZmFuLW91dCdzIHNldHRsZS4gSXQgaXMgc3RhbXBlZCBvbiB0aGUgYnVuZGxlIChgQ29tbWl0QnVuZGxlLnBoYXNlYCkgb25seVxuICAgKiB3aGVuIHRoaXMgZnJhbWUgaGFzIEFMUkVBRFkgY29tbWl0dGVkOiB0aGUgRklSU1QgYnVuZGxlIG9mIGFuIGV4ZWN1dGlvblxuICAgKiBpcyB0aGUgc3RhZ2UncyBvd24gYW5kIG5ldmVyIGNhcnJpZXMgYSBgcGhhc2VgIOKAlCBzbyBhIG1vdW50IHdpdGhvdXQgYW5cbiAgICogYG91dHB1dE1hcHBlcmAgKGEgbGF6eSBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoKSwgd2hvc2UgZXhpdFxuICAgKiBpcyBpdHMgb25seSBidW5kbGUsIHJlY29yZHMgdGhhdCBidW5kbGUgYXMgaXRzIG93biwgdGFncyBhbmQgYWxsLlxuICAgKlxuICAgKiBDb21taXQgaXMgdGhlIHN0YWdlJ3MgbGlmZWN5Y2xlIGVuZDogYGJ1ZmZlcmAgKGl0cyB3b3JraW5nIGNvcHkgYW5kXG4gICAqIHdoYXRldmVyIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rKSBhbmQgYHN0YXRlVmlld2AgKGEgcmVmZXJlbmNlIHRoYXRcbiAgICogcGlucyBvbmUgY29tbWl0dGVkLXN0YXRlIEdFTkVSQVRJT04pIGFyZSBvbmx5IG5lZWRlZCBEVVJJTkcgZXhlY3V0aW9uLFxuICAgKiBhcyB0aGUgcmVhZCBzbmFwc2hvdCArIG5ldC1jaGFuZ2UgZGlmZiBiYXNlLiBUaGUgZXhlY3V0aW9uIHRyZWUgcmV0YWluc1xuICAgKiBldmVyeSBTdGFnZUNvbnRleHQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcnVuLCBzbyBXSVRIT1VUIHRoZSByZWxlYXNlIGFcbiAgICogbG9uZyBsb29wIHJldGFpbnMgb25lIHN0YXRlIGdlbmVyYXRpb24gcGVyIGV4ZWN1dGVkIHN0YWdlIOKAlCBtZWFzdXJlZFxuICAgKiBPKE7CsikgYmVmb3JlIGNvcHktb24td3JpdGUgKDkuMjkuMCksIHdoZW4gZWFjaCBnZW5lcmF0aW9uIGFuZCBlYWNoXG4gICAqIGJ1ZmZlciB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZTogNTYzLjhNQiBhdCBOPTIwMCBvbiBhbiBhZ2VudC1zdHlsZVxuICAgKiBjaGFydDsgYSA1MDAtaXRlcmF0aW9uIGFnZW50IE9PTWVkIGEgZGVmYXVsdCBOb2RlIGhlYXAgKGJhY2tsb2cgIzE4KS5cbiAgICogR2VuZXJhdGlvbnMgbm93IHNoYXJlIGV2ZXJ5IHVuY2hhbmdlZCBzdWJ0cmVlLCBidXQgYSBwaW5uZWQgb25lIHN0aWxsXG4gICAqIGtlZXBzIHRoZSBjb250YWluZXJzIGxhdGVyIGNvbW1pdHMgcmVwbGFjZWQgYWxpdmUuXG4gICAqXG4gICAqIFJFLVVTRSBBRlRFUiBDT01NSVQgc3RheXMgY29ycmVjdCBiZWNhdXNlIGJvdGggZmllbGRzIHJlLWNyZWF0ZSBsYXppbHk6XG4gICAqIC0gYSBsYXRlciBSRUFEIHJlLWFuY2hvcnMgdmlhIHtAbGluayBmaXJzdFRvdWNoU3RhdGV9IG9uIHRoZSBDVVJSRU5UXG4gICAqICAgY29tbWl0dGVkIHN0YXRlICh3aGljaCBpbmNsdWRlcyB0aGlzIHN0YWdlJ3Mgb3duIGZsdXNoZWQgd3JpdGVzKTtcbiAgICogLSBhIGxhdGVyIFdSSVRFIGNvbnN0cnVjdHMgYSBmcmVzaCBidWZmZXIgb24gdGhhdCByZS1hbmNob3JlZCB2aWV3LCBzbyBhXG4gICAqICAgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHBvc3QtZmlyc3QtY29tbWl0IHN0YXRlLiBUaGUgcHJlLXJlbGVhc2VcbiAgICogICBidWZmZXIgYmVoYXZlZCB0aGUgc2FtZSBmb3IgVkFMVUVTIChpdHMgYHdvcmtpbmdDb3B5YCB3YXMgcmVzZXQgb25cbiAgICogICBjb21taXQsIGZhbGxpbmcgcmVhZHMgdGhyb3VnaCB0byBsaXZlIHN0YXRlKSBidXQga2VwdCB0aGUgT1JJR0lOQUxcbiAgICogICBgYmFzZVNuYXBzaG90YCBhcyBkaWZmIGJhc2Ug4oCUIHVucmVhY2hhYmxlIGluIHByYWN0aWNlOiB0aGUgZW5naW5lJ3NcbiAgICogICBvbmx5IHdyaXRlcyBhZnRlciBhIGNvbW1pdCBhcmUgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkXG4gICAqICAgYnJhbmNoIHBhcmVudCAoYSBkZWNpZGVyIG9yIGZvcmsgZnJhbWUgY29tbWl0cyBiZWZvcmUgaXRzIGJyYW5jaCBydW5zKTtcbiAgICogICB0aGUgb3RoZXIgXCJ3cml0ZSBhZnRlciBjb21taXRcIlxuICAgKiAgIHNpdGVzIChTdWJmbG93RXhlY3V0b3Igc2VlZCDihpIgcmVwbGFjZXMgdGhlIGNvbnRleHQ7IHJlc3VtZSDihpIgZnJlc2hcbiAgICogICBjb250ZXh0IHZpYSBgbGVhZi5jcmVhdGVOZXh0YCkgbmV2ZXIgcmUtdXNlIGEgY29tbWl0dGVkIGNvbnRleHQuXG4gICAqIC0gQSBVU0VSIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGlzIGEgZGlmZmVyZW50IG1hdHRlcjogaXRzIHdyaXRlc1xuICAgKiAgIHdvdWxkIGxhbmQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMuIFRoYXQgcmVmdXNhbCBsaXZlcyBvbiB0aGVcbiAgICogICBzY29wZSB0aWVyIChgU2NvcGVGYWNhZGVgLCBzZWFsZWQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlciDigJQgOS4yMi4wKSxcbiAgICogICBiZWNhdXNlIHRoZSBmcmFtZSdzIHJlLXVzYWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgdGhlIGVuZ2luZSBwYXRoc1xuICAgKiAgIGFib3ZlIG5lZWQuXG4gICAqIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIGFyZSBOT1QgcmVsZWFzZWQg4oCUIGBzbmFwc2hvdFNlbGYoKWBcbiAgICogICByZWFkcyB0aGVtIHBvc3QtcnVuIGZvciB0aGUgZXhlY3V0aW9uLXRyZWUgc25hcHNob3QuXG4gICAqL1xuICBjb21taXQocGhhc2U/OiBDb21taXRQaGFzZSk6IHZvaWQge1xuICAgIC8vIEEgY29udGludWF0aW9uIG9ubHkgQUZURVIgdGhlIGV4ZWN1dGlvbidzIG93biBidW5kbGUgKHNlZSBhYm92ZSkuXG4gICAgY29uc3QgY29udGludWF0aW9uID0gdGhpcy5fY29tbWl0dGVkID8gcGhhc2UgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXRlcmlhbGlzZVdyaXRlcygpO1xuICAgIHRoaXMud2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpO1xuICAgIC8vIFRoZSByZWNvcmQncyBoYWxmIChgcmVjb3JkQ29tbWl0LnRzYCkuIE5vIGJ1ZmZlciA9IG5vIHdyaXRlIGV2ZXIgYnVpbHRcbiAgICAvLyBvbmUgKCMxMyk6IHRoZSBjb21taXQgaXMgZW1wdHkgYnkgY29uc3RydWN0aW9uLCByZWNvcmRlZCB3aXRoIFpFUk8gY2xvbmVzLlxuICAgIHJlY29yZENvbW1pdChcbiAgICAgIHRoaXMuYnVmZmVyPy5jb21taXQoKSxcbiAgICAgIHtcbiAgICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICB1bnRyYWNrZWRTb3VyY2VzOiB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLFxuICAgICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICAgIHBoYXNlOiBjb250aW51YXRpb24sXG4gICAgICB9LFxuICAgICAgeyBzdGF0ZTogdGhpcy5zaGFyZWRNZW1vcnksIG1pcnJvcjogdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSwgbG9nOiB0aGlzLmV2ZW50TG9nIH0sXG4gICAgKTtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSBzZWVzIHRoZSB0cmFja2VkIG11dGF0aW9ucywgVEhFTiB0aGUgc3RhZ2luZ1xuICAgIC8vIHN0YXRlIGlzIHJlbGVhc2VkICgjMTNiKSwgc28gaXQgc2VlcyB0aGUgd29ybGQgYXMgaXQgd2FzLiBEMidzIG1hcmtlcnNcbiAgICAvLyBhbmQgdGhlIGRlY2xhcmVkIHRhZ3MgcmVsZWFzZSB3aXRoIGl0IOKAlCBvbmUgc3RhbXAgcGVyIGV4ZWN1dGlvbiwgc28gdGhlXG4gICAgLy8gZW5naW5lJ3MgZG91YmxlLWNvbW1pdCBwYXRocyByZWNvcmQgdGhlbSBleGFjdGx5IG9uY2UuXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0YXRlVmlldyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGFncyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jb21taXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGF3YXkgZXZlcnl0aGluZyB0aGlzIHN0YWdlIGhhcyBTVEFHRUQsIHdpdGhvdXQgY29tbWl0dGluZyBhbnkgb2YgaXQuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gcHJpbWl0aXZlIGJlaGluZCBkZWNsYXJhdGl2ZSByZXRyeTogd2hlbiBhIG5vbi1maW5hbCBhdHRlbXB0XG4gICAqIGZhaWxzLCB0aGUgd3JpdGVzIGl0IHN0YWdlZCBtdXN0IG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBuZXh0IGF0dGVtcHQsIG11c3RcbiAgICogbm90IHJlYWNoIHNoYXJlZCBzdGF0ZSwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgY29tbWl0IGxvZyBvciBpbiB0aGlzXG4gICAqIHN0YWdlJ3Mgc25hcHNob3QuIERyb3BwaW5nIHRoZSBzdGFnaW5nIHN0YXRlIGFjaGlldmVzIGFsbCBmb3VyIGF0IG9uY2Ug4oCUXG4gICAqIHRoZXJlIGlzIG5vIHJvbGxiYWNrIG1hY2hpbmVyeSB0byBpbnZva2UgYmVjYXVzZSBub3RoaW5nIHdhcyBldmVyIGFwcGxpZWRcbiAgICogKE0xOiB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIGhvbGRzIHdyaXRlcyB1bnRpbCBgY29tbWl0KClgIGZsdXNoZXMgdGhlbSkuXG4gICAqXG4gICAqIFdoYXQgaXMgcmVsZWFzZWQsIGFuZCB3aHkgZWFjaCBvbmUgbWF0dGVycyBmb3IgdGhlIG5leHQgYXR0ZW1wdDpcbiAgICogIC0gYGJ1ZmZlcmAgICAgICDigJQgdGhlIHN0YWdlZCB3cml0ZXMgdGhlbXNlbHZlczsgdGhlIG5leHQgYXR0ZW1wdCBzdGFydHNcbiAgICogICAgICAgICAgICAgICAgICAgIHdpdGggbm90aGluZyBzdGFnZWQ7XG4gICAqICAtIGBzdGF0ZVZpZXdgICAg4oCUIHRoZSBmaXJzdC10b3VjaCBhbmNob3I7IHRoZSBuZXh0IGF0dGVtcHQgcmUtYW5jaG9ycyBvblxuICAgKiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkIHN0YXRlIGFzIGl0IHN0YW5kcyBOT1cgKGEgc2libGluZyBmb3JrIGJyYW5jaFxuICAgKiAgICAgICAgICAgICAgICAgICAgbWF5IGxlZ2l0aW1hdGVseSBoYXZlIGNvbW1pdHRlZCBpbiBiZXR3ZWVuKTtcbiAgICogIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3BlbmRpbmdXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCDigJQgdGhlIHNuYXBzaG90XG4gICAqICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOyB3aXRob3V0IHRoZSByZXNldCB0aGUgZXhlY3V0aW9uIHRyZWUgd291bGRcbiAgICogICAgICAgICAgICAgICAgICAgIHJlcG9ydCB3cml0ZXMgdGhhdCB3ZXJlIGRpc2NhcmRlZCwgd2hpY2ggaXMgdGhlIGV4YWN0XG4gICAqICAgICAgICAgICAgICAgICAgICBsaWUgdGhpcyBmZWF0dXJlIGV4aXN0cyB0byBwcmV2ZW50ICh0aGUgcGVuZGluZyBtYXBcbiAgICogICAgICAgICAgICAgICAgICAgIGhvbGRzIGJhcmUgcmVmZXJlbmNlcyDigJQgZHJvcHBpbmcgaXQgdW4tY2xvbmVzIG5vdGhpbmcpO1xuICAgKiAgLSBgX3Byb3ZlbmFuY2VSZWFkc2Ag4oCUIHRoZSBwZXItd3JpdGUgcmVhZCBwcmVmaXggKCNQMSk7IGEgZGlzY2FyZGVkXG4gICAqICAgICAgICAgICAgICAgICAgICBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciBhcHBlYXIgaW4gdGhlIG5leHQgYXR0ZW1wdCdzXG4gICAqICAgICAgICAgICAgICAgICAgICBgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIG9yIGEgYmFja3dhcmQgc2xpY2Ugd291bGQgZm9sbG93XG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBlZGdlIHRoYXQgbm8gY29tbWl0dGVkIHdyaXRlIGV2ZXIgaGFkO1xuICAgKiAgLSBgX3VudHJhY2tlZFNvdXJjZXNgIOKAlCB0aGUgRDIgaG9uZXN0eSBtYXJrZXJzLCByZWxlYXNlZCB3aXRoIHRoZSByZXN0LlxuICAgKlxuICAgKiBXaGF0IGlzIGRlbGliZXJhdGVseSBLRVBUOiBgZGVidWdgIChsb2dzLCBtZXRyaWNzLCBlcnJvcnMsIGZsb3cgbWVzc2FnZXMpLlxuICAgKiBEaWFnbm9zdGljcyBhcmUgdGhlIGFwcGVuZC1vbmx5IHJlY29yZCBvZiB3aGF0IGV2ZXJ5IGF0dGVtcHQgZGlkLCBhbmQgdGhlXG4gICAqIHJldHJ5IGZlYXR1cmUncyB3aG9sZSBwb2ludCBpcyB0aGF0IHRoZSBlYXJsaWVyIGF0dGVtcHRzIHN0YXkgdmlzaWJsZS5cbiAgICpcbiAgICogTm8gY29tbWl0IGlzIHJlY29yZGVkIGFuZCBubyBvYnNlcnZlciBmaXJlcyDigJQgYSBkaXNjYXJkZWQgYXR0ZW1wdCBpcyBub3QgYVxuICAgKiBjdXJzb3Igc3RvcCwgYmVjYXVzZSBmcm9tIHNoYXJlZCBzdGF0ZSdzIHBvaW50IG9mIHZpZXcgaXQgbmV2ZXIgaGFwcGVuZWQuXG4gICAqL1xuICBkaXNjYXJkU3RhZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcHJvdmVuYW5jZVJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB7fTtcbiAgICB0aGlzLl9zdGFnZVJlYWRzID0ge307XG4gICAgdGhpcy5fbmVzdGVkUmVhZHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmlld1JlYWRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCAnJywgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgdGhpcy5uZXh0LmluaGVyaXRSdW4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSAmJiAodGhpcy5uZXh0LnN0YWdlSWQgIT09IHN0YWdlSWQgfHwgdGhpcy5uZXh0LnN0YWdlTmFtZSAhPT0gc3RhZ2VOYW1lKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC5jcmVhdGVOZXh0OiBuZXh0IGNvbnRleHQgYWxyZWFkeSBleGlzdHMgYXMgXCIke3RoaXMubmV4dC5zdGFnZU5hbWV9XCIgYCArXG4gICAgICAgICAgYChpZDogXCIke3RoaXMubmV4dC5zdGFnZUlkfVwiKSDigJQgYXJndW1lbnRzIFwiJHtzdGFnZU5hbWV9XCIgKGlkOiBcIiR7c3RhZ2VJZH1cIikgYXJlIGlnbm9yZWQgYCArXG4gICAgICAgICAgJ2FuZCB0aGUgZXhpc3RpbmcgY29udGV4dCBpcyByZXR1cm5lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV4dDtcbiAgfVxuXG4gIGNyZWF0ZUNoaWxkKHJ1bklkOiBzdHJpbmcsIGJyYW5jaElkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBuZXcgU3RhZ2VDb250ZXh0KHJ1bklkLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCBicmFuY2hJZCwgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNoaWxkLmluaGVyaXRSdW4odGhpcyk7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEBpbnRlcm5hbCBSZXRhaW5lZCBpbmNvbWluZyB2YWx1ZSBmb3IgdGhlIGZhY2FkZSdzIGxlZ2FjeSBlbWl0IGNoYW5uZWwuICovXG4gIGFkZERpYWdub3N0aWMoY2hhbm5lbDogRGlhZ25vc3RpY0NoYW5uZWwsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuZGVidWcuYWRkKGNoYW5uZWwsIGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgY29uc3Qgc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
903
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlHLE9BQU8sRUFBMEIsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFZbkU7OzJCQUUyQjtBQUMzQixTQUFTLFNBQVMsQ0FBQyxJQUFjLEVBQUUsR0FBVztJQUM1QyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUU3QiwrRkFBK0Y7QUFDL0YsTUFBTSxZQUFZLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFMUQsMEdBQTBHO0FBQzFHLFNBQVMsVUFBVSxDQUFD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QUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VDb250ZXh0IOKAlCBFeGVjdXRpb24gY29udGV4dCBmb3IgYSBzaW5nbGUgc3RhZ2UgaW4gYSBmbG93Y2hhcnQgcnVuXG4gKlxuICogTGlrZSBhIHN0YWNrIGZyYW1lIGluIGEgY29tcGlsZXIvcnVudGltZTpcbiAqIC0gQSBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIChDMyk6IHRoZSBoZWFwLCB0aGUgYWRkcmVzcywgdGhlXG4gKiAgIGZpcnN0LXRvdWNoIGJhc2UsIHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlciwgdGhlIHJlYWRLZXlzIGxpc3RcbiAqIC0gTGlua3MgdG8gcGFyZW50L2NoaWxkL25leHQgY29udGV4dHMgKGNhbGwgc3RhY2sgZnJhbWVzKVxuICogLSBXaGF0IGJlbG9uZ3MgdG8gYSBzdGFnZSBpbnNpZGUgYSBydW46IHJldGVudGlvbiBvZiByZWFkcyBhbmQgd3JpdGVzLCB0aGVcbiAqICAgcmVkYWN0aW9uIHZlcmRpY3QgcGVyIHdyaXRlLCB0aGUgZGV2LW1vZGUgd2FybmluZ3MsIHRoZSBjb21taXQgb2JzZXJ2ZXJcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSwgY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlLCBmaXJzdERpZmZlcmluZ1BhdGggfSBmcm9tICcuL2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgdHlwZSBEaWFnbm9zdGljQ2hhbm5lbCwgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nIH0gZnJvbSAnLi9FdmVudExvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRTb3VyY2VQb3NpdGlvbiB9IGZyb20gJy4vZXZlbnRQb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4vcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB7IFJlY29yZEZyYW1lIH0gZnJvbSAnLi9SZWNvcmRGcmFtZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblZlcmRpY3QgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBDTEVBUiwgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuL1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1pdFBoYXNlLFxuICBGbG93Q29udHJvbFR5cGUsXG4gIEZsb3dNZXNzYWdlLFxuICBSZWFkVHJhY2tpbmdNb2RlLFxuICBTdGFnZVNuYXBzaG90LFxuICBVbnRyYWNrZWRTb3VyY2UsXG4gIFdyaXRlVHJhY2tpbmdNb2RlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSB1c2VyLWxldmVsIGtleSBvZiBhIHdyaXRlIG9yIHJlYWQg4oCUIGRvdHRlZCBvbmx5IGZvciBhIG5lc3RlZCBwYXRoIChhXG4gKiAgc3ViZmxvdyBzZWVkJ3MgYFsncHJvZmlsZSddICsgJ2F1dGgnYCk7IG5vIGFsbG9jYXRpb24gZm9yIHRoZSBjb21tb25cbiAqICBzaW5nbGUtc2VnbWVudCBjYXNlLiAqL1xuZnVuY3Rpb24gdXNlcktleU9mKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG59XG5cbi8qKlxuICogVGhlIGtleSBydW4gbmFtZXNwYWNlcyBzaXQgdW5kZXIg4oCUIGEgZnJhbWUgd2l0aCBydW4gaWQgYGMwYCAoYSBmb3JrIG9yXG4gKiBzZWxlY3RvciBjaGlsZCB0YWtlcyBpdHMgb3duIGlkIGF0IHRoZSB0b3AgbGV2ZWwpIHdyaXRlcyBhdCBgcnVucy9jMC/igKZgLiBUaGVcbiAqIGVuZ2luZSdzIG9uZSBzcGVsbGluZyBvZiBpdDogZXZlcnkgZnJhbWUncyBhZGRyZXNzIGlzIGJ1aWx0IGZyb20gaXRcbiAqICh7QGxpbmsgcnVuQWRkcmVzc30pLCBhbmQgdGhlIHJlY29yZCBsYXllciB0YWtlcyB0aGF0IGFkZHJlc3MgYXMgZGF0YSAoQzIpLlxuICovXG5jb25zdCBSVU5fTkFNRVNQQUNFID0gJ3J1bnMnO1xuXG4vKiogVGhlIHJvb3QncyBhZGRyZXNzLCBzaGFyZWQgYnkgZXZlcnkgZnJhbWUgd2l0aG91dCBhIHJ1biBpZCAobW9zdCBvZiB0aGVtKS4gTmV2ZXIgZWRpdGVkLiAqL1xuY29uc3QgUk9PVF9BRERSRVNTOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4vKiogV2hlcmUgYSBmcmFtZSB3aXRoIHJ1biBpZCBgcnVuSWRgIHJlYWRzIGFuZCB3cml0ZXM6IGBbJ3J1bnMnLCA8aWQ+XWAsIG9yIGBbXWAgKHRoZSByb290KSB3aXRoIG5vbmUuICovXG5mdW5jdGlvbiBydW5BZGRyZXNzKHJ1bklkOiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIHJldHVybiBydW5JZCA/IFtSVU5fTkFNRVNQQUNFLCBydW5JZF0gOiBST09UX0FERFJFU1M7XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFnZUNvbnRleHQge1xuICAvKipcbiAgICogVGhlIHJlY29yZCBoYWxmIG9mIHRoaXMgZnJhbWUgKGBSZWNvcmRGcmFtZS50c2AsIEwzLCBDMyk6IHRoZSBoZWFwIGFuZCxcbiAgICogd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0sIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIHRoZSBsb2c7IHRoZSBhZGRyZXNzO1xuICAgKiB0aGUgZmlyc3QtdG91Y2ggYmFzZTsgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyOyB0aGUgcmVhZEtleXMgbGlzdC5cbiAgICogRXZlcnkgc3RhdGUgcmVhZCBvZiB0aGlzIGZyYW1lIGdvZXMgdGhyb3VnaCBpdCwgYW5kIHNvIGRvZXMgZXZlcnlcbiAgICogY29tbWl0LiBUaGUgbWlycm9yIGlzIHByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGFcbiAgICogcmVkYWN0ZWQgdmlldyAoYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKSDigJQgcmVhZCB2aWFcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCwgdGhlIGZvdW5kYXRpb24gZm9yXG4gICAqIHNoYXJpbmcgYSB0cmFjZSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSSB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZDogUmVjb3JkRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgZnJhbWUgYmVsb25ncyB0byDigJQgaXRzIGlkZW50aXR5IG9uIGV2ZXJ5IGV2ZW50LCBhbmQgdGhlIHJ1blxuICAgKiBuYW1lc3BhY2UgaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiAoe0BsaW5rIHJ1bkFkZHJlc3N9KSwgcmVhZCBvbmNlLCB3aGVuIHRoZVxuICAgKiBmcmFtZSBpcyBidWlsdCAoQzMpLiBPbmx5IHtAbGluayB1c2VBZGRyZXNzT2Z9IG1vdmVzIHRoZSBhZGRyZXNzIGFmdGVyXG4gICAqIHRoYXQsIGFuZCBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gbmFtZXNwYWNlIHRoaXMgZnJhbWUgd3JpdGVzIGFuZCByZWFkcyBpbiB3aGVuIHRoYXQgaXMgbm90IGl0cyBvd25cbiAgICogYHJ1bklkYCDigJQgc2V0IG9uY2UsIGJlZm9yZSB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSwgYnlcbiAgICoge0BsaW5rIHVzZUFkZHJlc3NPZn0uIEl0cyBvbmUgdXNlciBpcyBhIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIChSMTMpOlxuICAgKiB0aGUgcmVjb3JkIG5hbWVzIHRoZSBtb3VudCwgdGhlIHZhbHVlcyBsYW5kIHdoZXJlIHRoZSBtb3VudCdzIHBhcmVudFxuICAgKiB3cml0ZXMuIEFic2VudCDihpIgYHJ1bklkYCwgc28gZXZlcnkgb3RoZXIgZnJhbWUgaXMgdW50b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRyZXNzUnVuSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBicmFuY2hJZD86IHN0cmluZztcbiAgcHVibGljIGlzRGVjaWRlcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRm9yazogYm9vbGVhbjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZyb20gYnVpbGRlciAoc2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgZXhlY3V0aW9uKS4gKi9cbiAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIChzZXQgYnkgdHJhdmVyc2VyIHdoZW4gdGhpcyBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQpLiAqL1xuICBwdWJsaWMgc3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBuZXh0PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgY2hpbGRyZW4/OiBTdGFnZUNvbnRleHRbXTtcblxuICBwdWJsaWMgZGVidWc6IERpYWdub3N0aWNDb2xsZWN0b3IgPSBuZXcgRGlhZ25vc3RpY0NvbGxlY3RvcigoKSA9PiB0aGlzLnBvbGljeS5yZWRhY3Rpb24pO1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCB3cml0ZXMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcgYW5kIG9uQ29tbWl0XG4gICAqICDigJQgaW4gdGhlaXIgUkVUQUlORUQgZm9ybSAoY2xvbmVkIC8gc3VtbWFyaXNlZCAvIHJlZGFjdGVkKS4gRmlsbGVkIGZyb21cbiAgICogIHtAbGluayBfcGVuZGluZ1dyaXRlc30gYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSBhdCBjb21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgd3JpdGVzIG9mIHRoZSBDVVJSRU5UIGV4ZWN1dGlvbiwgaGVsZCBieSByZWZlcmVuY2Ugd2l0aCB0aGUgdmVyZGljdFxuICAgKiB0aGV5IHdlcmUgc3RhZ2VkIHVuZGVyICg5LjIzLjApLiBBIGtleSB3cml0dGVuIGsgdGltZXMgaG9sZHMgaXRzIExBU1RcbiAgICogdmFsdWU7IHRoZSByZXRhaW5lZCBmb3JtICh0aGUgYHdyaXRlVHJhY2tpbmdgIGNsb25lIG9yIHN1bW1hcnksIHRoZVxuICAgKiByZWRhY3Rpb24gcGxhY2Vob2xkZXIgb3IgZmllbGQgc2NydWIpIGlzIHRha2VuIE9OQ0UgcGVyIGtleSBhdCBjb21taXQg4oCUXG4gICAqIHNlZSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LiBTYW1lIGxhdyBhcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogcGF0Y2ggdHJlZXM6IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgcGFpZCBhdCB0aGUgYm91bmRhcnksIG5vdCBhdFxuICAgKiBldmVyeSB3cml0ZS4gTGF6aWx5IGFsbG9jYXRlZDsgYSBzdGFnZSB0aGF0IG5ldmVyIHdyaXRlcyBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9wZW5kaW5nV3JpdGVzPzogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHZhbHVlOiB1bmtub3duOyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0OyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9XG4gID47XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgYF9zdGFnZVJlYWRzYCBrZXlzIHRoYXQgd2VyZSByZWFkIGF0IGEgTkVTVEVEIHBhdGggKGBnZXRWYWx1ZShwYXRoLFxuICAgKiBrZXkpYCB3aXRoIGEgbm9uLWVtcHR5IGBwYXRoYCkuIE9ubHkgdGhlIGVuZ2luZSByZWFkcyB0aGF0IHdheSDigJQgdGhlXG4gICAqIGZhY2FkZSByZWFkcyByb290cyDigJQgc28gdGhlc2UgYXJlIG5vdCB1c2VyIHJlYWRzIGFuZCB0aGUgYm9ycm93ZWQtcmVhZFxuICAgKiBndWFyZCBza2lwcyB0aGVtIGJ5IHRoaXMgbWFya2VyLCBuZXZlciBieSBndWVzc2luZyBmcm9tIGEgZG90IGluIHRoZSBrZXlcbiAgICogKGEgdXNlcidzIHRvcC1sZXZlbCBrZXkgbWF5IGl0c2VsZiBjb250YWluIG9uZSkuIExhemlseSBjcmVhdGVkOyB0aGVcbiAgICogZmFjYWRlIHBhdGggbmV2ZXIgYWxsb2NhdGVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVzdGVkUmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogRGV2IG1vZGUgb25seTogdGhlIHJvb3Qga2V5cyB3aG9zZSBMQVNUIHRyYWNrZWQgcmVhZCB3YXMgc2VydmVkIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlIOKAlCBiZWZvcmUgdGhpcyBzdGFnZSdzIGZpcnN0IHdyaXRlLCB3aGVuIG5vIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlciBleGlzdHMgeWV0LiBTdWNoIGEgcmVhZCBpcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIHNvIGFuXG4gICAqIGluLXBsYWNlIGVkaXQgb2YgaXQgbW92ZXMgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSB0b28gKGNvcHktb24td3JpdGUsXG4gICAqIDkuMjkuMCk7IHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufSBjaGVja3MgdGhlc2Uga2V5cyBldmVuIHdoZW4gdGhlXG4gICAqIHN0YWdlIHdyb3RlIHRoZW0uIE5ldmVyIGFsbG9jYXRlZCBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmlld1JlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhhcyB0aGlzIGZyYW1lIGNvbW1pdHRlZCBhdCBsZWFzdCBvbmNlPyBUaGUgYm9ycm93ZWQtcmVhZCBndWFyZCBydW5zIG9uXG4gICAqIHRoZSBGSVJTVCBjb21taXQgb25seSDigJQgc2VlIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufS4gVGhlIGZyYW1lXG4gICAqIGl0c2VsZiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0ICgjMTNiKTogdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgcmVseSBvbiBpdC4gVGhlXG4gICAqIHVzZXItbGV2ZWwgcmVmdXNhbCBvZiBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGxpdmVzIGF0IHRoZSBzY29wZVxuICAgKiB0aWVyIChgU2NvcGVGYWNhZGVgLCBvbmUgcGVyIHN0YWdlIGV4ZWN1dGlvbiksIG5vdCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqIFRyYWNrZWQgcmVhZHMgb2YgYSBzZWxlY3RlZCB2YWx1ZSAoe0BsaW5rIHNlbGVjdGVkUmVhZHN9KS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSZWFkcyA9IDA7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGlzIGZyYW1lIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIOKGkiB0aGF0IHJlYWQncyB2ZXJkaWN0IChgc3RhZ2VXcml0ZWAgaGFuZHMgaXQgb24pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZE9iamVjdHM/OiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXJzIOKAlCB1bnRyYWNrZWQgcmVhZCBwYXRocyB1c2VkIGR1cmluZyBUSElTXG4gICAqIHN0YWdlJ3MgZXhlY3V0aW9uIChgJ2FyZ3MnYCAvIGAnZW52J2AgLyBgJ3NpbGVudCdgKS4gTWFya2VkIGJ5XG4gICAqIGBTY29wZUZhY2FkZWAsIHN1cmZhY2VkIG9uIHRoZSBzdGFnZSdzIENvbW1pdEJ1bmRsZSBhc1xuICAgKiBgdW50cmFja2VkU291cmNlc2AsIHRoZW4gUkVMRUFTRUQgd2l0aCB0aGUgc3RhZ2luZyBzdGF0ZSBhdCBjb21taXQgZW5kXG4gICAqIChzbyB0aGUgcm91dGluZSBkb3VibGUtY29tbWl0IHBhdGhzIOKAlCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IG1vdW50cyDigJRcbiAgICogcmVjb3JkIHRoZSBmaWVsZCBleGFjdGx5IG9uY2UsIG9uIHRoZSBmaXJzdCBjb21taXQpLiBMYXppbHkgYWxsb2NhdGVkOlxuICAgKiBzdGFnZXMgdGhhdCBuZXZlciB0b3VjaCBhbiB1bnRyYWNrZWQgcGF0aCBwYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3VudHJhY2tlZFNvdXJjZXM/OiBTZXQ8VW50cmFja2VkU291cmNlPjtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgU2NvcGVSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnJlY29yZCA9IG5ldyBSZWNvcmRGcmFtZShzaGFyZWRNZW1vcnksIGV2ZW50TG9nLCBydW5BZGRyZXNzKHJ1bklkKSk7XG4gICAgdGhpcy5yZWNvcmQudXNlRW5jb2RpbmcodGhpcy5wb2xpY3kpO1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGU7XG4gIH1cblxuICAvKiogQGludGVybmFsIFN0YW1wZWQgYmVzaWRlIHJ1bnRpbWVTdGFnZUlkLCBiZWZvcmUgc2NvcGUgY29uc3RydWN0aW9uLiAqL1xuICBiaW5kRW1pdE9yaWdpbihydW5JZDogc3RyaW5nLCBkcmlsbFBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0UnVuSWQgPSBkcmlsbFBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJ1bklkO1xuICAgIGlmIChkcmlsbFBhdGggIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubG9nPy5iaW5kQWRkcmVzcyhydW5JZCwgZHJpbGxQYXRoKTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIGZyb20gdGhpcyBmcmFtZSdzIE9XTiBsb2cuIEEgbWFudWFsL3VuYWRkcmVzc2FibGUgZnJhbWUgc3RheXMgdW5rbm93bi4gKi9cbiAgY2FwdHVyZUVtaXRQb3NpdGlvbigpOiBFbWl0U291cmNlUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVtaXRSdW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZWNvcmQubG9nPy5jYXB0dXJlUG9zaXRpb24odGhpcy5lbWl0UnVuSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyBhcHBseVxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCB0aGUgb25lcyB0aGUgbG9nIHJlY29yZHMg4oCUIHRvXG4gICAqIHRoaXMgbWlycm9yLCBiZXNpZGUgdGhlIHJhdyBwYXRjaGVzIG9uIHRoZSBoZWFwIChgcmVjb3JkQ29tbWl0YCkuXG4gICAqIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0IHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbiBhIHJ1bnRpbWUncyByb290IGZyYW1lIGJ5IGBFeGVjdXRpb25SdW50aW1lYCB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihtaXJyb3IpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHJlZGFjdGVkIG1pcnJvciBpZiBpbnN0YWxsZWQsIGVsc2UgdW5kZWZpbmVkLiAqL1xuICBnZXRSZWRhY3RlZFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5taXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCkgb24gdGhpcyBmcmFtZSDigJQgY2FsbGVkIG9uIGFcbiAgICogcnVudGltZSdzIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIChhdCBjb25zdHJ1Y3Rpb24sIGFuZCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VQb2xpY3lgIG9uIGEgc2FtZS1leGVjdXRvciByZXN1bWUpLiBEZXNjZW5kYW50cyBnZXRcbiAgICogdGhlIHNhbWUgcmVmZXJlbmNlIHRocm91Z2gge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH07IGFcbiAgICogc3ViZmxvdydzIHJ1bnRpbWUgaXMgY29uc3RydWN0ZWQgd2l0aCBpdCwgc28gaXRzIHNlZWQgZnJhbWUgYW5kIGV2ZXJ5XG4gICAqIGZyYW1lIGFmdGVyIGNvbW1pdCB1bmRlciB0aGUgcnVuJ3MgZGlhbHMgdG9vLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgdGhpcyBmcmFtZSByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMgdW5kZXIuICovXG4gIGdldFBvbGljeSgpOiBSdW5Qb2xpY3kge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgXCJ3aGF0IGRvZXMgdGhlIHBvbGljeSBzYXlcbiAgICogYWJvdXQgdGhpcyBwYXRoXCIgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCkg4oCUIGFzIGEgTkVXIHBvbGljeSBmb3IgdGhpcyBmcmFtZVxuICAgKiAodGhlIHNoYXJlZCBvbmUgaXMgbmV2ZXIgZWRpdGVkKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgYXJyaXZlc1xuICAgKiB3aXRoIHRoZSBydW4ncyBwb2xpY3k7IHRoaXMgZG9vciBpcyBmb3IgYSBgU2NvcGVGYWNhZGVgIG9uIGEgYmFyZSBmcmFtZVxuICAgKiAodW5pdCB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpLCB3aGljaCBicmluZ3MgaXRzIG93biBydWxlLiBFdmVyeSBzdGFnZWRcbiAgICogd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhc2tzIGl0LCBzbyBhIHdyaXRlIHRoYXQgbmV2ZXIgcGFzc2VzIGFcbiAgICogZmFjYWRlIOKAlCBhIHN1YmZsb3cgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCDigJRcbiAgICogaXMgcmV0YWluZWQgdW5kZXIgdGhlIHNhbWUgdmVyZGljdCBhcyBhIGZhY2FkZSB3cml0ZS4gQWJzZW50OiBldmVyeVxuICAgKiB2ZXJkaWN0IGlzIGAnY2xlYXInYCB1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWQgYW4gZXhwbGljaXQgZmxhZy5cbiAgICovXG4gIHVzZVJlZGFjdGlvblJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGljeS5yZWRhY3Rpb24gIT09IHJ1bGUpIHRoaXMuYWRvcHRQb2xpY3kod2l0aFJlZGFjdGlvbih0aGlzLnBvbGljeSwgcnVsZSkpO1xuICB9XG5cbiAgLyoqIFRoZSBpbnN0YWxsZWQgcmVkYWN0aW9uIHJ1bGUsIGlmIGFueSAodGhlIGZhY2FkZSdzIGxvb2t1cCkuICovXG4gIGdldFJlZGFjdGlvblJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSBydW4gZnJvbSBgZnJvbWA6IHRoZSBwb2xpY3kgKGJ5IHJlZmVyZW5jZSkgYW5kIHRoZSBydW4ncyBtaXJyb3JcbiAgICogc3RvcmUuIFRoZSBPTkUgaW5oZXJpdGFuY2Ugc3RlcCDigJQge0BsaW5rIGNyZWF0ZU5leHR9IGFuZFxuICAgKiB7QGxpbmsgY3JlYXRlQ2hpbGR9IGJvdGggY2FsbCBpdCwgYW5kIGl0IG5hbWVzIG5vIGRpYWwuXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRSdW4oZnJvbTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShmcm9tLnBvbGljeSk7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKGZyb20ucmVjb3JkLm1pcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ORSBwbGFjZSB0aGlzIGZyYW1lJ3MgcG9saWN5IGNoYW5nZXM6IHRoZSBmcmFtZSBob2xkcyBpdCwgYW5kIGl0c1xuICAgKiByZWNvcmQgZnJhbWUgZW5jb2RlcyB1bmRlciB0aGUgc2FtZSByZWZlcmVuY2UgKGBjb21taXRWYWx1ZXNgLFxuICAgKiBgd3JpdGVQcm92ZW5hbmNlYCDigJQgYFJlY29yZEZyYW1lIMK3IHVzZUVuY29kaW5nYCksIHNvIHRoZSB0d28gbmV2ZXIgZGlmZmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG9wdFBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgdHJhY2tlZCB1c2VyLWxldmVsIHdyaXRlLCBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGVcbiAgICogYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kIHtAbGluayB1cGRhdGVPYmplY3R9LiBIb2xkc1xuICAgKiB0aGUgUkVGRVJFTkNFIGFuZCB0aGUgdmVyZGljdCAoOS4yMy4wKTsgdGhlIHJldGFpbmVkIGZvcm0gaXMgdGFrZW4gYXRcbiAgICogY29tbWl0IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30sIG9uY2UgcGVyIGtleS5cbiAgICpcbiAgICogUmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlhbCBpbiBFVkVSWSBtb2RlOiBhIHJlZGFjdGVkXG4gICAqIHdyaXRlIHN0b3JlcyB0aGUgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgdW5kZXIgYCdmdWxsJ2AgQU5EXG4gICAqIGAnc3VtbWFyeSdgIChhIHN1bW1hcnkgbWFya2VyIHdvdWxkIGxlYWsgdGhlIHZhbHVlJ3MgcHJldmlldy9zaXplKSxcbiAgICogYW5kIHN0b3JlcyBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AgKGVudHJ5IHNraXBwZWQgZW50aXJlbHkg4oCUIG5vdGhpbmcgdG9cbiAgICogbGVhaykuIEEgZmllbGQtbGV2ZWwgdmVyZGljdCBzY3J1YnMgYSBjbG9uZSBCRUZPUkUgdGhlIGRpYWwgc2VlcyBpdCwgc29cbiAgICogYSBzdW1tYXJ5IHByZXZpZXcgY2FuIG5ldmVyIHNob3cgdGhlIHNlY3JldCBlaXRoZXIuIFRoZSB2ZXJkaWN0IGlzIHRoZVxuICAgKiBvbmUgYHN0YWdlV3JpdGVgIGFza2VkIHRoZSBydWxlIGZvciBCRUZPUkUgc3RhZ2luZywgY2FycmllZCB0byBjb21taXRcbiAgICogd2l0aCB0aGUgdmFsdWUuIFRoZSBzdGFnZWQgd3JpdGUgaXRzZWxmIGlzIHVuYWZmZWN0ZWQg4oCUIHJlZGFjdGlvbiBvZlxuICAgKiB0aGUgY29tbWl0dGVkIHBheWxvYWQgaXMgaGFuZGxlZCBieSB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogYHJlZGFjdGVkUGF0aHNgLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1dyaXRlKFxuICAgIHVzZXJLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnLFxuICApIHtcbiAgICBpZiAodGhpcy5wb2xpY3kud3JpdGVUcmFja2luZyA9PT0gJ29mZicpIHJldHVybjtcbiAgICAodGhpcy5fcGVuZGluZ1dyaXRlcyA/Pz0gbmV3IE1hcCgpKS5zZXQodXNlcktleSwgeyB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBfc3RhZ2VXcml0ZXNgIHdpdGggZXZlcnkgcGVuZGluZyB3cml0ZSBmb2xkZWQgaW4gYXMgaXRzIHJldGFpbmVkIGZvcm1cbiAgICog4oCUIHRoZSByZWNvcmQgYSByZWFkZXIgc2Vlcy4gQ29uc3VtZXMgbm90aGluZzogYSBtaWQtcnVuIHNuYXBzaG90IHJlYWRzXG4gICAqIHRoZSB3cml0ZXMgc28gZmFyLCBhbmQgY29tbWl0IHN0aWxsIG1hdGVyaWFsaXNlcyB0aGUgZmluYWwgdmFsdWVzLlxuICAgKiBSZXR1cm5zIGBfc3RhZ2VXcml0ZXNgIGl0c2VsZiB3aGVuIG5vdGhpbmcgaXMgcGVuZGluZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRXcml0ZXMoKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4ge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuIHRoaXMuX3N0YWdlV3JpdGVzO1xuICAgIGNvbnN0IG91dCA9IHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHddIG9mIHRoaXMuX3BlbmRpbmdXcml0ZXMpIHtcbiAgICAgIG91dFtrZXldID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5yZXRhaW5lZEZvcm0ody52ZXJkaWN0LCB3LnZhbHVlLCB0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nLCBzdW1tYXJpemVXcml0ZVZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiB3Lm9wZXJhdGlvbixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcmV0YWluZWQgZm9ybSBvZiBldmVyeSBwZW5kaW5nIHdyaXRlIOKAlCBPTkNFIHBlciBrZXksIGZyb20gdGhlXG4gICAqIHZhbHVlIGFzIGl0IHN0YW5kcyBhdCBjb21taXQgKDkuMjMuMCkg4oCUIGFuZCByZWxlYXNlIHRoZSByZWZlcmVuY2VzLiBUaGVcbiAgICogZmlyc3QgdGhpbmcgYGNvbW1pdCgpYCBkb2VzLCBzbyB0aGUgYm9ycm93ZWQtbXV0YXRpb24gZ3VhcmQgYW5kIHRoZVxuICAgKiBjb21taXQgb2JzZXJ2ZXIgc2VlIHRoZSBmaW5pc2hlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIG1hdGVyaWFsaXNlV3JpdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVsZWFzZWQgZXZlbiB3aGVuIGEgcmV0YWluZWQgZm9ybSBjYW5ub3QgYmUgdGFrZW4g4oCUIGFuIHVuY2xvbmVhYmxlXG4gICAgICAvLyB2YWx1ZSAoYSBmdW5jdGlvbiwgYSBQcm94eSkgaXMgYSBjb250cmFjdCB2aW9sYXRpb24gKFwic3RhdGUgdmFsdWVzXG4gICAgICAvLyBtdXN0IHN1cnZpdmUgc3RydWN0dXJlZENsb25lXCIpIHRoYXQgbm93IHN1cmZhY2VzIEhFUkUsIGF0IGNvbW1pdCxcbiAgICAgIC8vIGFuZCBmYWlscyB0aGUgcnVuIGxvdWRseTsgYSBsYXRlciBzbmFwc2hvdCBvZiB0aGUgZmFpbGVkIHJ1biBtdXN0XG4gICAgICAvLyBub3QgdGhyb3cgdGhlIHNhbWUgZXJyb3IgYWdhaW4uXG4gICAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBvZiBhIHZhbHVlIHRoZSBlbmdpbmUgUkVUQUlOUyAocmVhZHMgYW5kIHdyaXRlcyByZXRlbnRpb24pOlxuICAgKiB0aGUgcGxhY2Vob2xkZXIgYmVhdHMgZXZlcnkgZGlhbDsgYSBmaWVsZC1sZXZlbCBzY3J1YiBoYXBwZW5zIGJlZm9yZSB0aGVcbiAgICogZGlhbCBzZWVzIHRoZSB2YWx1ZTsgYSBjbGVhciB2YWx1ZSBpcyBzdW1tYXJpemVkIG9yIGNsb25lZCBhcyB0aGUgZGlhbFxuICAgKiBzYXlzLiBDYWxsZXJzIGhhbmRsZSBgdW5kZWZpbmVkYCBiZWZvcmUgYXNraW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZEZvcm0oXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBSZWFkVHJhY2tpbmdNb2RlIHwgV3JpdGVUcmFja2luZ01vZGUsXG4gICAgc3VtbWFyaXplOiAodmFsdWU6IHVua25vd24pID0+IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBzY3J1YmJlZCA9IHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobW9kZSA9PT0gJ3N1bW1hcnknKSByZXR1cm4gc3VtbWFyaXplKHNjcnViYmVkID8/IHZhbHVlKTtcbiAgICByZXR1cm4gc2NydWJiZWQgPz8gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVsZSB3aXRoIHNvbWV0aGluZyB0byBzYXkg4oCUIGB1bmRlZmluZWRgIG9uIHRoZSBuby1wb2xpY3kgcGF0aCAobm9cbiAgICogcnVsZSBpbnN0YWxsZWQsIG9yIGEgcnVsZSB3aXRoIG5vIHBvbGljeSBlbnRyaWVzIGFuZCBubyBtYXJrZWQga2V5cyksIHNvXG4gICAqIGEgdHJhY2tlZCByZWFkIG9yIGEgc3RhZ2VkIHdyaXRlIHRoZXJlIHBheXMgbm8gdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoXG4gICAqIGFsbG9jYXRpb24uIFRoZSBkZWZhdWx0IHJ1biBpcyBieXRlLWlkZW50aWNhbCBBTkQgY29zdC1pZGVudGljYWwuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IHJ1bGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIE9ORSBGVU5ORUwgZXZlcnkgc3RhZ2VkIHdyaXRlIHBhc3NlcyB0aHJvdWdoIOKAlCBmYWNhZGUgd3JpdGVzIEFORFxuICAgKiB0aGUgcGF0aHMgdGhhdCBieXBhc3MgdGhlIGZhY2FkZSAoc3ViZmxvdyBzZWVkLCBgb3V0cHV0TWFwcGVyYFxuICAgKiBtZXJnZS1iYWNrLCByZXN1bWUgcmUtc2VlZCkuIFRoZSBPTkUgZGVjaXNpb24gaXMgbWFkZSBoZXJlOiBhbiBleHBsaWNpdFxuICAgKiBwZXItY2FsbCBmbGFnIG1ha2VzIHRoZSB2YWx1ZSBzZWNyZXQgb3V0cmlnaHQgKGFuZCBtYXJrcyB0aGUga2V5IGZvciB0aGVcbiAgICogcmVzdCBvZiB0aGUgcnVuLCB0aGUgZGVjbGFyZS1vbmNlIGNvbnRyYWN0KTsgb3RoZXJ3aXNlIHRoZSBpbnN0YWxsZWRcbiAgICogcnVsZSBkZWNpZGVzIGZyb20gdGhlIHVzZXItbGV2ZWwgcGF0aC4gSXQgc3RhZ2VzIHRoZSB3cml0ZSwgcmVnaXN0ZXJzXG4gICAqIHRoZSByZWRhY3RlZCBwYXRocyB0aGUgY29tbWl0IGxvZyBhbmQgbWlycm9yIHdpbGwgc2NydWIgKHdob2xlIGtleSwgb3JcbiAgICogdGhlIGZpZWxkcyBpbnNpZGUgdGhlIHZhbHVlKSwgYW5kIGtlZXBzIHRoZSBydW4ncyBtYXJrZWQta2V5cyBzZXQgaW5cbiAgICogc3RlcCAoYSB3aG9sZSB2ZXJkaWN0IG1hcmtzIGl0cyBrZXk7IGEgZGVsZXRlIGNsZWFycyB0aGUgbWFyaykuIFJldHVybnNcbiAgICogdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBsZXQgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9IGV4cGxpY2l0XG4gICAgICA/IHsga2luZDogJ3dob2xlJywga2V5OiB1c2VyS2V5T2YocGF0aCwga2V5KSB9XG4gICAgICA6IHJ1bGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkpXG4gICAgICA6IENMRUFSO1xuICAgIC8vIEEgY29weSBJTlNJREUgdGhlIHN0YWdlOiB0aGUgdmVyeSBvYmplY3QgaXQgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gdW5kZXJcbiAgICAvLyBhbm90aGVyIChgcy5wZXJzb24gPSBzLnByb2ZpbGVgKSwga2VlcHMgdGhhdCBydWxlIOKAlCBtYXRjaGVkIGJ5IElERU5USVRZLiBBIG5ldyBvYmplY3RcbiAgICAvLyBvciBhIHByaW1pdGl2ZSBjb3BpZWQgYWNyb3NzIG5hbWVzIGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gbmFtZSBvbmx5LlxuICAgIGNvbnN0IHJlYWQgPVxuICAgICAgcnVsZSAhPT0gdW5kZWZpbmVkICYmIHZlcmRpY3Qua2luZCAhPT0gJ3dob2xlJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgID8gdGhpcy5fc2VsZWN0ZWRPYmplY3RzPy5nZXQodmFsdWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChyZWFkICE9PSB1bmRlZmluZWQgJiYgcnVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocmVhZC5raW5kID09PSAnd2hvbGUnKSBydWxlLm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAocmVhZC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgICBjb25zdCBhdCA9IFsuLi5wYXRoLnNsaWNlKDEpLCAuLi4ocGF0aC5sZW5ndGggPiAwID8gW2tleV0gOiBbXSldO1xuICAgICAgICBydWxlLmluaGVyaXRGaWVsZHMoXG4gICAgICAgICAgcGF0aFswXSA/PyBrZXksXG4gICAgICAgICAgcmVhZC5wYXRocy5tYXAoKGZpZWxkKSA9PiBbLi4uYXQsIGZpZWxkXS5qb2luKCcuJykpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdmVyZGljdCA9IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSk7XG4gICAgfVxuICAgIGNvbnN0IHdob2xlID0gdmVyZGljdC5raW5kID09PSAnd2hvbGUnO1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMucmVjb3JkLmdldFRyYW5zYWN0aW9uQnVmZmVyKCk7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIGJ1ZmZlci5tZXJnZShuc1BhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUobnNQYXRoLCB3aG9sZSk7XG4gICAgZWxzZSBidWZmZXIuc2V0KG5zUGF0aCwgdmFsdWUsIHdob2xlKTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgYnVmZmVyLm1hcmtSZWRhY3RlZEZpZWxkcyhuc1BhdGgsIHZlcmRpY3QucGF0aHMpO1xuICAgIGlmICh2ZXJiID09PSAnZGVsZXRlJykge1xuICAgICAgcnVsZT8udW5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICB9IGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykge1xuICAgICAgLy8gVGhlIFJFQUwgcnVsZSwgbm90IHRoZSBhY3RpdmUgb25lOiBhbiBleHBsaWNpdCBtYXJrIG9uIGFuIGluZXJ0IHJ1bGVcbiAgICAgIC8vIGlzIGV4YWN0bHkgd2hhdCBtYWtlcyBpdCBhY3RpdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgICB0aGlzLnBvbGljeS5yZWRhY3Rpb24/Lm1hcmsodmVyZGljdC5rZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhbmQgcmVhZCBhdCBBTk9USEVSIGZyYW1lJ3MgYWRkcmVzcyAoaXRzIHJ1biBuYW1lc3BhY2UpIHdoaWxlIHRoaXNcbiAgICogZnJhbWUga2VlcHMgaXRzIG93biBpZGVudGl0eSBvbiB0aGUgcmVjb3JkIOKAlCBgc3RhZ2VgLCBgc3RhZ2VJZGAsXG4gICAqIGBydW50aW1lU3RhZ2VJZGAsIHRhZ3MuIEEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgaXMgdGhlIG9uZSBjYWxsZXJcbiAgICogKGBTdWJmbG93RXhlY3V0b3IgwrcgZXhlY3V0ZVN1YmZsb3dgLCBSMTMpOiB0aGUgbW91bnQgZnJhbWUgb2YgYSBicmFuY2ggb3JcbiAgICogZm9yayBjaGlsZCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0cyBwYXJlbnQgd3JpdGVzLCBhcyBiZWZvcmUsIGFuZCBpdHNcbiAgICogYnVuZGxlIG5vdyBuYW1lcyB0aGUgbW91bnQgaW5zdGVhZCBvZiB0aGUgc3RhZ2UgYmVmb3JlIGl0LiBSZWZ1c2VkIG9uY2VcbiAgICogdGhlIGZyYW1lIGhhcyBzdGFnZWQgYW55dGhpbmcg4oCUIGl0cyBidWZmZXIncyBhZGRyZXNzIGlzIGZpeGVkIHRoZW4uIFRoZVxuICAgKiBkZWNpc2lvbiBpcyB0aGUgZW5naW5lJ3MgKG5hbWVzcGFjZSBpZHMsIGFzIHNpbmNlIFIxMyk7IHRoZSByZWNvcmQgZnJhbWVcbiAgICogdGFrZXMgdGhlIGFkZHJlc3MgaXQgY29tZXMgdG8gKGBSZWNvcmRGcmFtZSDCtyB1c2VBZGRyZXNzYCkuXG4gICAqL1xuICB1c2VBZGRyZXNzT2YoZnJhbWU6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQgJiYgZnJhbWUubmFtZXNwYWNlSWQgIT09IHRoaXMubmFtZXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC51c2VBZGRyZXNzT2Y6ICcke3RoaXMuc3RhZ2VJZH0nIGhhcyBhbHJlYWR5IHN0YWdlZCB3cml0ZXMgYXQgaXRzIG93biBhZGRyZXNzLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFkZHJlc3NSdW5JZCA9IGZyYW1lLm5hbWVzcGFjZUlkO1xuICAgIHRoaXMucmVjb3JkLnVzZUFkZHJlc3MocnVuQWRkcmVzcyh0aGlzLm5hbWVzcGFjZUlkKSk7XG4gIH1cblxuICAvKiogVGhlIHJ1biBuYW1lc3BhY2Ugd3JpdGVzIGFuZCByZWFkcyBnbyB0bzoge0BsaW5rIGFkZHJlc3NSdW5JZH0sIGVsc2UgYHJ1bklkYC4gKi9cbiAgcHJpdmF0ZSBnZXQgbmFtZXNwYWNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUnVuSWQgPz8gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ21lcmdlJyk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIC8vIEV4cGxpY2l0IGRlbGV0aW9uIChTY29wZUZhY2FkZS5kZWxldGVWYWx1ZSkgc3RhZ2VzIGEgZGlzdGluY3Qgb3Agc29cbiAgICAvLyBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5LlxuICAgIC8vIFVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIHRoZSBidWZmZXIgY29tbWl0cyBpdCBhcyBhXG4gICAgLy8gc2V0LW9mLXVuZGVmaW5lZCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICBjb25zdCB2ZXJkaWN0ID1cbiAgICAgIG9wZXJhdGlvbk92ZXJyaWRlID09PSAnZGVsZXRlJ1xuICAgICAgICA/IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgLy8gVGhlIHJlY29yZCBmcmFtZSBzZXJ2ZXMgdGhlIHZhbHVlICh0d28gdGllcnMpIGFuZCBrZWVwcyB0aGUgcGVyLXdyaXRlXG4gICAgLy8gcHJvdmVuYW5jZSByZWdpc3RyeSAoI1AxKSDigJQga2V5IHN0cmluZ3Mgb25seSwgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAgLy8gcmVhZFRyYWNraW5nIHJldGVudGlvbiBkaWFsICh3aGljaCBnb3Zlcm5zIFZBTFVFIHJldGVudGlvbiBiZWxvdykuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgIC8vIFRoZSB2ZXJkaWN0LCBvbmNlIOKAlCBmb3IgdGhlIHJldGFpbmVkIHJlYWQgYmVsb3cgYW5kIHRoZSBzZWxlY3RlZC1yZWFkXG4gICAgLy8gY291bnQgKGBzZWxlY3RlZFJlYWRzYCkuIE5vIHBvbGljeSBhbmQgbm8gbWFya3Mg4oaSIG5vIHZlcmRpY3QgY2FsbCwgbm9cbiAgICAvLyBhbGxvY2F0aW9uIChhY3RpdmVSdWxlKS5cbiAgICBjb25zdCBydWxlID0ga2V5ICE9PSB1bmRlZmluZWQgPyB0aGlzLmFjdGl2ZVJ1bGUoKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcnVsZSAhPT0gdW5kZWZpbmVkID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5IGFzIHN0cmluZykgOiBDTEVBUjtcbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUmVhZHMgKz0gMTtcbiAgICAgIC8vIEFuIG9iamVjdCByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSwgd3JpdHRlbiBiYWNrIHVuZGVyIGFub3RoZXIsIGtlZXBzIGl0cyBydWxlIChzdGFnZVdyaXRlKS5cbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSAodGhpcy5fc2VsZWN0ZWRPYmplY3RzID8/PSBuZXcgV2Vha01hcCgpKS5zZXQodmFsdWUsIHZlcmRpY3QpO1xuICAgIH1cbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyDigJQgcmV0YWluZWQgdW5kZXJcbiAgICAvLyB0aGUgcnVsZSdzIHZlcmRpY3QgKDkuMTkuMCk6IGEgcmVkYWN0ZWQga2V5IGlzIHJldGFpbmVkIGFzIHRoZVxuICAgIC8vIHBsYWNlaG9sZGVyLCBhIGZpZWxkLWxldmVsIGtleSBhcyBhIHNjcnViYmVkIGNsb25lLCBuZXZlciB0aGUgc2VjcmV0LlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdvZmYnKSB7XG4gICAgICBpZiAocGF0aC5sZW5ndGggPiAwKSAodGhpcy5fbmVzdGVkUmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucG9saWN5LnJlYWRUcmFja2luZyA9PT0gJ2Z1bGwnICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQpIHRoaXMuX3ZpZXdSZWFkcz8uZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2UgKHRoaXMuX3ZpZXdSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleU9mKHBhdGgsIGtleSldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJldGFpbmVkRm9ybSh2ZXJkaWN0LCB2YWx1ZSwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nLCBzdW1tYXJpemVSZWFkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgYFtSRUFEXSAke2Rlc2NyaXB0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgdHJhY2tlZCByZWFkcyBvZiB0aGlzIGZyYW1lIHJlYWQgYSB2YWx1ZSB0aGUgcnVuJ3MgcnVsZSBzZWxlY3RzXG4gICAqIChhIGtleSBpdCBtYXNrcyB3aG9sZSwgb3Igb25lIHdpdGggc2VjcmV0IGZpZWxkcykuIEEgYm91bmRhcnkgdGhhdCBtYXBzXG4gICAqIHdoYXQgYSBzdGFnZSBmdW5jdGlvbiBSRUFEIGludG8gYSBuZXcgbmFtZSDigJQgdGhlIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zXG4gICAqIHNlbGVjdG9yIOKAlCBjb21wYXJlcyBpdCBiZWZvcmUgYW5kIGFmdGVyLCBhcyBhIHN1YmZsb3cgbWFwcGVyJ3MgdGFpbnQgZG9lc1xuICAgKiAoYG1lbW9yeS9yZWRhY3Rpb24udHMgwrcgTWFwcGVyVGFpbnRgKS4gQWx3YXlzIDAgd2l0aG91dCBhIHBvbGljeSBvciBhIG1hcmsuXG4gICAqL1xuICBnZXQgc2VsZWN0ZWRSZWFkcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJlYWRzO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZChwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkTGl2ZShrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWRHbG9iYWwoa2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiByZWNvcmQgdGhhdCB0aGlzIHN0YWdlIGNvbnN1bWVkIGFuIHVudHJhY2tlZCByZWFkIHBhdGguXG4gICAqIENhbGxlZCBieSBgU2NvcGVGYWNhZGVgIChgZ2V0QXJnc2AvYGdldEVudmAvdW5zaGFkb3dlZCBgZ2V0VmFsdWVTaWxlbnRgKTtcbiAgICogc3VyZmFjZWQgYXMgYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCBvbiB0aGlzIHN0YWdlJ3MgY29tbWl0LlxuICAgKi9cbiAgbWFya1VudHJhY2tlZFNvdXJjZShzb3VyY2U6IFVudHJhY2tlZFNvdXJjZSk6IHZvaWQge1xuICAgICh0aGlzLl91bnRyYWNrZWRTb3VyY2VzID8/PSBuZXcgU2V0KCkpLmFkZChzb3VyY2UpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgZmlyZXMgYWZ0ZXIgY29tbWl0KCkgYXBwbGllcyBwYXRjaGVzLlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZSB0byBkaXNwYXRjaCBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERldi1tb2RlIG9ubHk6IGRpZCB0aGlzIHN0YWdlIGNoYW5nZSwgSU4gUExBQ0UsIGEgdmFsdWUgaXQgbWVyZWx5IFJFQUQ/XG4gICAqXG4gICAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaCDigJQgYSBwcm9wZXJ0eSBhdCBhbnlcbiAgICogZGVwdGgsIGFuIGluZGV4ZWQgZWxlbWVudCwgYW4gYXJyYXkgbWV0aG9kLiBXaGF0IGl0IGNhbm5vdCByZWFjaCBpcyBhblxuICAgKiBlbGVtZW50IGhhbmRlZCBvdXQgYnkgYSByZWFkIG1ldGhvZCAoYGZpbmRgLCBgZmlsdGVyYCwgYGZvcuKApm9mYCxcbiAgICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nKTogd3JhcHBpbmcgdGhvc2Ugd291bGQgbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXRcbiAgICogb2YgZXZlcnkgcmVhZCwgd2hpY2ggaXMgYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LiBTbyB0aGF0IGZhbWlseVxuICAgKiBpcyBXQVJORUQgQUJPVVQgcmF0aGVyIHRoYW4gaW50ZXJjZXB0ZWQg4oCUIGxvdWRseSwgaGVyZSwgaW5zdGVhZCBvZiBlbmRpbmdcbiAgICogdGhlIHJ1biB3aXRoIGEgY29tbWl0IGxvZyB0aGF0IHNpbGVudGx5IGRpc2FncmVlcyB3aXRoIGZpbmFsIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgUkVQT1JUIGFmdGVyIHRoZSBmYWN0LCBub3QgYSByZWZ1c2FsIGF0IHRoZSB3cml0ZTogdGhlIHdyaXRlIGhhc1xuICAgKiBhbHJlYWR5IGhhcHBlbmVkIGluIHBsYWNlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVyY2VwdC4gSXQgcnVucyB1bmRlclxuICAgKiBUV08gcHJlY29uZGl0aW9ucywgYm90aCBuYW1lZCBpbiB0aGUgUkVBRE1FIOKAlCBgZW5hYmxlRGV2TW9kZSgpYCwgYW5kXG4gICAqIGByZWFkVHJhY2tpbmc6ICdmdWxsJ2AgKHRoZSBkZWZhdWx0KSwgYmVjYXVzZSB0aGUgY29tcGFyaXNvbiBuZWVkcyB0aGVcbiAgICogY2xvbmUgb2YgdGhlIHZhbHVlIHRoYXQgbW9kZSByZXRhaW5zIGF0IHJlYWQgdGltZS4gQSBrZXkgdGhlIHN0YWdlIG5ldmVyXG4gICAqIHN0YWdlZCBtdXN0IHN0aWxsIGhvbGQgdGhhdCBjbG9uZSDigJQgY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwXG4gICAqIGFuZCB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUgdG8gdGhpcyBzdGFnZS4gS2V5cyB0aGUgc3RhZ2UgRElEXG4gICAqIHN0YWdlIGFyZSBza2lwcGVkICh0aGV5IGFyZSBleHBlY3RlZCB0byBkaWZmZXIsIGFuZCB0aGV5IGFyZSBpbiB0aGUgcmVjb3JkKSxcbiAgICogc28gYXJlIGtleXMgdW5kZXIgYSByZWRhY3Rpb24gdmVyZGljdCwgd2hvc2UgcmV0YWluZWQgZm9ybSBpcyBkZWxpYmVyYXRlbHlcbiAgICogbm90IHRoZSB2YWx1ZSwgYW5kIHNvIGFyZSBrZXlzIHJlYWQgYXQgYSBuZXN0ZWQgcGF0aCAoYF9uZXN0ZWRSZWFkc2ApIOKAlFxuICAgKiB0aG9zZSBhcmUgZW5naW5lIHJlYWRzICh0aGUgc3ViZmxvdyBtZXJnZS1iYWNrKSwgbm90IHVzZXIgcmVhZHMuXG4gICAqXG4gICAqIEl0IGFsc28gb25seSBsb29rcyBhdCBrZXlzIHNlcnZlZCBmcm9tIHRoZSBQSU5ORUQgc291cmNlIOKAlCB0aGUgZmlyc3QtdG91Y2hcbiAgICogdmlldyBvciB0aGlzIHN0YWdlJ3Mgb3duIGJ1ZmZlci4gQSBrZXkgYWJzZW50IGZyb20gYm90aCB3YXMgc2VydmVkIGJ5IHRoZVxuICAgKiByZWFkJ3MgbGl2ZSBmYWxsYmFjayAoYFJlY29yZEZyYW1lIMK3IHJlYWRgLCB0aWVyIDIpLCB3aGljaCBhIHBhcmFsbGVsIHNpYmxpbmcncyByb290LWtleSBjb21taXQgY2FuXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlOyBhY2N1c2luZyB0aGUgc3RhZ2UgdGhlcmUgd291bGQgYmUgYSBmYWxzZSBhbGFybS4gRm9yXG4gICAqIHRoZSBzYW1lIHJlYXNvbiBpdCBydW5zIG9uIHRoZSBmcmFtZSdzIEZJUlNUIGNvbW1pdCBvbmx5OiB0aGUgcmVhZHMgYmVsb25nXG4gICAqIHRvIHRoYXQgcm91bmQsIGFuZCBieSB0aGUgZW5naW5lJ3Mgc2Vjb25kIHJvdW5kIChhIGZvcmsgZG91YmxlLWNvbW1pdCwgYVxuICAgKiBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZCBicmFuY2ggcGFyZW50KSBvdGhlciBzdGFnZXMgaGF2ZVxuICAgKiBsZWdpdGltYXRlbHkgbW92ZWQgdGhlIHN0YXRlIHRoZXkgd2VyZSBjb21wYXJlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBBIGtleSB0aGUgc3RhZ2UgRElEIHN0YWdlIGlzIHN0aWxsIGNoZWNrZWQgd2hlbiBpdHMgbGFzdCByZWFkIGNhbWUgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUgKHtAbGluayBfdmlld1JlYWRzfSDigJQgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlKTpcbiAgICogdGhhdCByZWFkIHdhcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIGFuZCB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIElTXG4gICAqIHRoYXQgb2JqZWN0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLCBzbyBhbiBpbi1wbGFjZSBlZGl0IGZvbGxvd2VkIGJ5IGFcbiAgICogd3JpdGUgb2YgdGhlIGtleSBjb21taXRzIE5PIGNoYW5nZSDigJQgbGl2ZSBzdGF0ZSBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZ1xuICAgKiBkb2VzIG5vdC4gQ29tcGFyZWQgYWdhaW5zdCBjb21taXR0ZWQgc3RhdGUsIG5vdCB0aGUgd3JpdHRlbiB2YWx1ZSwgc28gYVxuICAgKiBsZWdpdGltYXRlIHdyaXRlIG5ldmVyIHRyaXBzIGl0LlxuICAgKlxuICAgKiBDb3N0cyBub3RoaW5nIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdmdWxsJyB8fCB0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gdGhpcy5fc3RhZ2VSZWFkc1trZXldO1xuICAgICAgLy8gT25seSBhIGNvbnRhaW5lciBjYW4gYmUgbXV0YXRlZCBpbiBwbGFjZTsgYSBwcmltaXRpdmUgcmVhZCBjYW5ub3QuXG4gICAgICBpZiAocmV0YWluZWQgPT09IG51bGwgfHwgdHlwZW9mIHJldGFpbmVkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkUmVhZHM/LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQgJiYgcnVsZS52ZXJkaWN0QXQoW10sIGtleSkua2luZCAhPT0gJ2NsZWFyJykgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy5yZWNvcmQuYXQoW10sIGtleSk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3N0YWdlV3JpdGVzLCBrZXkpIHx8IHRoaXMucmVjb3JkLndhc1N0YWdlZChuYW1lc3BhY2VkKSkge1xuICAgICAgICB0aGlzLndhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleSwgbmFtZXNwYWNlZCwgcmV0YWluZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHBpbm5lZCBzb3VyY2Ugb25seSDigJQgc2VlIHRoZSBub3RlIG9uIHRoZSBsaXZlIGZhbGxiYWNrIGFib3ZlLlxuICAgICAgLy8gYHBlZWtgLCBub3QgYGdldGA6IGEgcmVwb3J0IGNvbXBhcmVzLCBhbmQgbXVzdCBub3QgdGFrZSB0aGUgcHJpdmF0ZVxuICAgICAgLy8gY29weSBhIHN0YWdlJ3MgcmVhZCB3b3VsZCAoY29weS1vbi13cml0ZSwgOS4yOS4wKS5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJlY29yZC5wZWVrKG5hbWVzcGFjZWQpO1xuICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGN1cnJlbnQpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHN0YWdlZC1rZXkgaGFsZiBvZiB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn06IGRpZCBjb21taXR0ZWQgc3RhdGUgaXRzZWxmIG1vdmUgdW5kZXIgYSByZWFkPyAqL1xuICBwcml2YXRlIHdhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleTogc3RyaW5nLCBuYW1lc3BhY2VkOiBzdHJpbmdbXSwgcmV0YWluZWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZpZXdSZWFkcz8uaGFzKGtleSkpIHJldHVybjtcbiAgICBjb25zdCBjb21taXR0ZWQgPSB0aGlzLnJlY29yZC5iYXNlQXQobmFtZXNwYWNlZCk7XG4gICAgaWYgKGNvbW1pdHRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY29tbWl0dGVkKTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBzdGFnZWQgd3JpdGVzIHRvIHNoYXJlZCBtZW1vcnkgYW5kIFJFTEVBU0UgdGhlIHBlci1zdGFnZSBzdGFnaW5nXG4gICAqIHN0YXRlICgjMTNiKS5cbiAgICpcbiAgICogYHBoYXNlYCAoOS4zOS4wKSBpcyB0aGUgY2FsbGVyJ3Mgc3RhdGVtZW50IG9mIHdoYXQgYSBDT05USU5VQVRJT04gY29tbWl0XG4gICAqIGlzIOKAlCBgJ2V4aXQnYCBmcm9tIGEgc3ViZmxvdyBtb3VudCdzIGV4aXQsIGAncmVwZWF0J2AgZnJvbSBhIGZvcmtcbiAgICogZmFuLW91dCdzIHNldHRsZS4gSXQgaXMgc3RhbXBlZCBvbiB0aGUgYnVuZGxlIChgQ29tbWl0QnVuZGxlLnBoYXNlYCkgb25seVxuICAgKiB3aGVuIHRoaXMgZnJhbWUgaGFzIEFMUkVBRFkgY29tbWl0dGVkOiB0aGUgRklSU1QgYnVuZGxlIG9mIGFuIGV4ZWN1dGlvblxuICAgKiBpcyB0aGUgc3RhZ2UncyBvd24gYW5kIG5ldmVyIGNhcnJpZXMgYSBgcGhhc2VgIOKAlCBzbyBhIG1vdW50IHdpdGhvdXQgYW5cbiAgICogYG91dHB1dE1hcHBlcmAgKGEgbGF6eSBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoKSwgd2hvc2UgZXhpdFxuICAgKiBpcyBpdHMgb25seSBidW5kbGUsIHJlY29yZHMgdGhhdCBidW5kbGUgYXMgaXRzIG93biwgdGFncyBhbmQgYWxsLlxuICAgKlxuICAgKiBDb21taXQgaXMgdGhlIHN0YWdlJ3MgbGlmZWN5Y2xlIGVuZDogdGhlIHJlY29yZCBmcmFtZSdzIGJ1ZmZlciBhbmRcbiAgICogZmlyc3QtdG91Y2ggYmFzZSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbiwgYXMgdGhlIHJlYWQgc25hcHNob3QgK1xuICAgKiBuZXQtY2hhbmdlIGRpZmYgYmFzZSwgc28gdGhlIHJlY29yZCBmcmFtZSByZWxlYXNlcyB0aGVtIG9uY2UgdGhlIGNvbW1pdFxuICAgKiBoYXMgbGFuZGVkIGFuZCB0aGUgb2JzZXJ2ZXIgaGFzIHNlZW4gaXQgKGBSZWNvcmRGcmFtZSDCtyByZWxlYXNlYCDigJQgd2h5IGFcbiAgICogZnJhbWUgdGhhdCBrZXB0IHRoZW0gd291bGQgcmV0YWluIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZFxuICAgKiBzdGFnZSwgYW5kIHdoeSBhIHJlLXVzZWQgZnJhbWUgcmUtYW5jaG9ycyBvbiBjdXJyZW50IHN0YXRlLCBpcyB0aGVyZSkuXG4gICAqXG4gICAqIFJFLVVTRSBBRlRFUiBDT01NSVQgc3RheXMgY29ycmVjdCBiZWNhdXNlIGJvdGggcmUtY3JlYXRlIGxhemlseTpcbiAgICogLSBhIGxhdGVyIFJFQUQgcmUtYW5jaG9ycyBvbiB0aGUgQ1VSUkVOVCBjb21taXR0ZWQgc3RhdGUgKHdoaWNoIGluY2x1ZGVzXG4gICAqICAgdGhpcyBzdGFnZSdzIG93biBmbHVzaGVkIHdyaXRlcyk7XG4gICAqIC0gYSBsYXRlciBXUklURSBjb25zdHJ1Y3RzIGEgZnJlc2ggYnVmZmVyIG9uIHRoYXQgcmUtYW5jaG9yZWQgdmlldywgc28gYVxuICAgKiAgIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCBwb3N0LWZpcnN0LWNvbW1pdCBzdGF0ZS4gVGhlIHByZS1yZWxlYXNlXG4gICAqICAgYnVmZmVyIGJlaGF2ZWQgdGhlIHNhbWUgZm9yIFZBTFVFUyAoaXRzIGB3b3JraW5nQ29weWAgd2FzIHJlc2V0IG9uXG4gICAqICAgY29tbWl0LCBmYWxsaW5nIHJlYWRzIHRocm91Z2ggdG8gbGl2ZSBzdGF0ZSkgYnV0IGtlcHQgdGhlIE9SSUdJTkFMXG4gICAqICAgYGJhc2VTbmFwc2hvdGAgYXMgZGlmZiBiYXNlIOKAlCB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZTogdGhlIGVuZ2luZSdzXG4gICAqICAgb25seSB3cml0ZXMgYWZ0ZXIgYSBjb21taXQgYXJlIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZFxuICAgKiAgIGJyYW5jaCBwYXJlbnQgKGEgZGVjaWRlciBvciBmb3JrIGZyYW1lIGNvbW1pdHMgYmVmb3JlIGl0cyBicmFuY2ggcnVucyk7XG4gICAqICAgdGhlIG90aGVyIFwid3JpdGUgYWZ0ZXIgY29tbWl0XCJcbiAgICogICBzaXRlcyAoU3ViZmxvd0V4ZWN1dG9yIHNlZWQg4oaSIHJlcGxhY2VzIHRoZSBjb250ZXh0OyByZXN1bWUg4oaSIGZyZXNoXG4gICAqICAgY29udGV4dCB2aWEgYGxlYWYuY3JlYXRlTmV4dGApIG5ldmVyIHJlLXVzZSBhIGNvbW1pdHRlZCBjb250ZXh0LlxuICAgKiAtIEEgVVNFUiBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBpcyBhIGRpZmZlcmVudCBtYXR0ZXI6IGl0cyB3cml0ZXNcbiAgICogICB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzLiBUaGF0IHJlZnVzYWwgbGl2ZXMgb24gdGhlXG4gICAqICAgc2NvcGUgdGllciAoYFNjb3BlRmFjYWRlYCwgc2VhbGVkIGJ5IHRoZSBjb21taXQgb2JzZXJ2ZXIg4oCUIDkuMjIuMCksXG4gICAqICAgYmVjYXVzZSB0aGUgZnJhbWUncyByZS11c2FiaWxpdHkgaXMgZXhhY3RseSB3aGF0IHRoZSBlbmdpbmUgcGF0aHNcbiAgICogICBhYm92ZSBuZWVkLlxuICAgKiAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCBhcmUgTk9UIHJlbGVhc2VkIOKAlCBgc25hcHNob3RTZWxmKClgXG4gICAqICAgcmVhZHMgdGhlbSBwb3N0LXJ1biBmb3IgdGhlIGV4ZWN1dGlvbi10cmVlIHNuYXBzaG90LlxuICAgKi9cbiAgY29tbWl0KHBoYXNlPzogQ29tbWl0UGhhc2UpOiB2b2lkIHtcbiAgICAvLyBBIGNvbnRpbnVhdGlvbiBvbmx5IEFGVEVSIHRoZSBleGVjdXRpb24ncyBvd24gYnVuZGxlIChzZWUgYWJvdmUpLlxuICAgIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHRoaXMuX2NvbW1pdHRlZCA/IHBoYXNlIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubWF0ZXJpYWxpc2VXcml0ZXMoKTtcbiAgICB0aGlzLndhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTtcbiAgICAvLyBUaGUgcmVjb3JkJ3MgaGFsZiAoYFJlY29yZEZyYW1lIMK3IGNvbW1pdGAg4oaSIGByZWNvcmRDb21taXQudHNgKS4gTm8gYnVmZmVyXG4gICAgLy8gPSBubyB3cml0ZSBldmVyIGJ1aWx0IG9uZSAoIzEzKTogdGhlIGNvbW1pdCBpcyBlbXB0eSBieSBjb25zdHJ1Y3Rpb24sXG4gICAgLy8gcmVjb3JkZWQgd2l0aCBaRVJPIGNsb25lcy4gVGhlIG5hbWVzIGFyZSByZWFkIG9uY2UgdGhlIHBheWxvYWQgaXMgYnVpbHQuXG4gICAgdGhpcy5yZWNvcmQuY29tbWl0KCgpID0+ICh7XG4gICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHVudHJhY2tlZFNvdXJjZXM6IHRoaXMuX3VudHJhY2tlZFNvdXJjZXMsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICBwaGFzZTogY29udGludWF0aW9uLFxuICAgIH0pKTtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSBzZWVzIHRoZSB0cmFja2VkIG11dGF0aW9ucywgVEhFTiB0aGUgc3RhZ2luZ1xuICAgIC8vIHN0YXRlIGlzIHJlbGVhc2VkICgjMTNiKSwgc28gaXQgc2VlcyB0aGUgd29ybGQgYXMgaXQgd2FzLiBEMidzIG1hcmtlcnNcbiAgICAvLyBhbmQgdGhlIGRlY2xhcmVkIHRhZ3MgcmVsZWFzZSB3aXRoIGl0IOKAlCBvbmUgc3RhbXAgcGVyIGV4ZWN1dGlvbiwgc28gdGhlXG4gICAgLy8gZW5naW5lJ3MgZG91YmxlLWNvbW1pdCBwYXRocyByZWNvcmQgdGhlbSBleGFjdGx5IG9uY2UuXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZC5yZWxlYXNlKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIHRoZSByZWNvcmQgZnJhbWUncyBzdGFnZWQgc3RhdGUgKGBSZWNvcmRGcmFtZSDCtyBkaXNjYXJkYCkg4oCUIHRoZSBidWZmZXJcbiAgICogICAgICAgICAgICAgICAgICAgICh0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0cyB3aXRoIG5vdGhpbmcgc3RhZ2VkKSwgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICBmaXJzdC10b3VjaCBiYXNlIChpdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhc1xuICAgKiAgICAgICAgICAgICAgICAgICAgaXQgc3RhbmRzIE5PVyDigJQgYSBzaWJsaW5nIGZvcmsgYnJhbmNoIG1heSBsZWdpdGltYXRlbHlcbiAgICogICAgICAgICAgICAgICAgICAgIGhhdmUgY29tbWl0dGVkIGluIGJldHdlZW4pIGFuZCB0aGUgcmVhZEtleXMgbGlzdCAoI1AxOlxuICAgKiAgICAgICAgICAgICAgICAgICAgYSBkaXNjYXJkZWQgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgcmVhY2ggdGhlIG5leHRcbiAgICogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2ApO1xuICAgKiAgLSBgX3N0YWdlV3JpdGVzYCAvIGBfcGVuZGluZ1dyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIOKAlCB0aGUgc25hcHNob3RcbiAgICogICAgICAgICAgICAgICAgICAgIHBheWxvYWQ7IHdpdGhvdXQgdGhlIHJlc2V0IHRoZSBleGVjdXRpb24gdHJlZSB3b3VsZFxuICAgKiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmUgZGlzY2FyZGVkLCB3aGljaCBpcyB0aGUgZXhhY3RcbiAgICogICAgICAgICAgICAgICAgICAgIGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIHByZXZlbnQgKHRoZSBwZW5kaW5nIG1hcFxuICAgKiAgICAgICAgICAgICAgICAgICAgaG9sZHMgYmFyZSByZWZlcmVuY2VzIOKAlCBkcm9wcGluZyBpdCB1bi1jbG9uZXMgbm90aGluZyk7XG4gICAqICAtIGBfdW50cmFja2VkU291cmNlc2Ag4oCUIHRoZSBEMiBob25lc3R5IG1hcmtlcnMsIHJlbGVhc2VkIHdpdGggdGhlIHJlc3QuXG4gICAqXG4gICAqIFdoYXQgaXMgZGVsaWJlcmF0ZWx5IEtFUFQ6IGBkZWJ1Z2AgKGxvZ3MsIG1ldHJpY3MsIGVycm9ycywgZmxvdyBtZXNzYWdlcykuXG4gICAqIERpYWdub3N0aWNzIGFyZSB0aGUgYXBwZW5kLW9ubHkgcmVjb3JkIG9mIHdoYXQgZXZlcnkgYXR0ZW1wdCBkaWQsIGFuZCB0aGVcbiAgICogcmV0cnkgZmVhdHVyZSdzIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIGVhcmxpZXIgYXR0ZW1wdHMgc3RheSB2aXNpYmxlLlxuICAgKlxuICAgKiBObyBjb21taXQgaXMgcmVjb3JkZWQgYW5kIG5vIG9ic2VydmVyIGZpcmVzIOKAlCBhIGRpc2NhcmRlZCBhdHRlbXB0IGlzIG5vdCBhXG4gICAqIGN1cnNvciBzdG9wLCBiZWNhdXNlIGZyb20gc2hhcmVkIHN0YXRlJ3MgcG9pbnQgb2YgdmlldyBpdCBuZXZlciBoYXBwZW5lZC5cbiAgICovXG4gIGRpc2NhcmRTdGFnZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQuZGlzY2FyZCgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHt9O1xuICAgIHRoaXMuX3N0YWdlUmVhZHMgPSB7fTtcbiAgICB0aGlzLl9uZXN0ZWRSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92aWV3UmVhZHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgVHJlZSBuYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgKG9yIHJldHVybikgdGhpcyBjb250ZXh0J3MgbGlua2VkIHN1Y2Nlc3Nvci5cbiAgICpcbiAgICogTUVNT0laRUQ6IHRoZSBmaXJzdCBjYWxsIGNyZWF0ZXMgYHRoaXMubmV4dGA7IGV2ZXJ5IGxhdGVyIGNhbGwgcmV0dXJuc1xuICAgKiB0aGF0IFNBTUUgY29udGV4dCBhbmQgSUdOT1JFUyBpdHMgYXJndW1lbnRzLiBJbiBub3JtYWwgdHJhdmVyc2FsIGVhY2hcbiAgICogY29udGV4dCBhZHZhbmNlcyBleGFjdGx5IG9uY2UsIHNvIHRoZSBtZW1vIG5ldmVyIGJpdGVzIOKAlCBidXQgYSBjYWxsZXJcbiAgICogZXhwZWN0aW5nIGEgZnJlc2ggY29udGV4dCBmb3IgZGlmZmVyZW50IGBzdGFnZU5hbWVgL2BzdGFnZUlkYCBhcmdzIGdldHNcbiAgICogdGhlIG9sZCBvbmUgc2lsZW50bHkuIERldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgd2FybnMgb24gdGhhdFxuICAgKiBtaXNtYXRjaCAoYmFja2xvZyBCNCkuXG4gICAqL1xuICBjcmVhdGVOZXh0KHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5uZXh0KSB7XG4gICAgICB0aGlzLm5leHQgPSBuZXcgU3RhZ2VDb250ZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsICcnLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgICB0aGlzLm5leHQucGFyZW50ID0gdGhpcztcbiAgICAgIHRoaXMubmV4dC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgJiYgKHRoaXMubmV4dC5zdGFnZUlkICE9PSBzdGFnZUlkIHx8IHRoaXMubmV4dC5zdGFnZU5hbWUgIT09IHN0YWdlTmFtZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQuY3JlYXRlTmV4dDogbmV4dCBjb250ZXh0IGFscmVhZHkgZXhpc3RzIGFzIFwiJHt0aGlzLm5leHQuc3RhZ2VOYW1lfVwiIGAgK1xuICAgICAgICAgIGAoaWQ6IFwiJHt0aGlzLm5leHQuc3RhZ2VJZH1cIikg4oCUIGFyZ3VtZW50cyBcIiR7c3RhZ2VOYW1lfVwiIChpZDogXCIke3N0YWdlSWR9XCIpIGFyZSBpZ25vcmVkIGAgK1xuICAgICAgICAgICdhbmQgdGhlIGV4aXN0aW5nIGNvbnRleHQgaXMgcmV0dXJuZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5leHQ7XG4gIH1cblxuICBjcmVhdGVDaGlsZChydW5JZDogc3RyaW5nLCBicmFuY2hJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFN0YWdlQ29udGV4dChydW5JZCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnJlY29yZC5zdGF0ZSwgYnJhbmNoSWQsIHRoaXMucmVjb3JkLmxvZywgaXNEZWNpZGVyKTtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNoaWxkLmluaGVyaXRSdW4odGhpcyk7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEBpbnRlcm5hbCBSZXRhaW5lZCBpbmNvbWluZyB2YWx1ZSBmb3IgdGhlIGZhY2FkZSdzIGxlZ2FjeSBlbWl0IGNoYW5uZWwuICovXG4gIGFkZERpYWdub3N0aWMoY2hhbm5lbDogRGlhZ25vc3RpY0NoYW5uZWwsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuZGVidWcuYWRkKGNoYW5uZWwsIGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgY29uc3Qgc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19