@workflow/core 5.0.0-beta.50 → 5.0.0-beta.52

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.
Files changed (50) hide show
  1. package/README.md +5 -0
  2. package/dist/events-consumer.d.ts +26 -0
  3. package/dist/events-consumer.d.ts.map +1 -1
  4. package/dist/events-consumer.js +28 -1
  5. package/dist/flushable-stream.d.ts +41 -0
  6. package/dist/flushable-stream.d.ts.map +1 -1
  7. package/dist/flushable-stream.js +169 -1
  8. package/dist/log-format.d.ts +3 -0
  9. package/dist/log-format.d.ts.map +1 -1
  10. package/dist/log-format.js +45 -10
  11. package/dist/replay-divergence.d.ts +25 -0
  12. package/dist/replay-divergence.d.ts.map +1 -0
  13. package/dist/replay-divergence.js +61 -0
  14. package/dist/runtime/helpers.d.ts +75 -1
  15. package/dist/runtime/helpers.d.ts.map +1 -1
  16. package/dist/runtime/helpers.js +134 -5
  17. package/dist/runtime/quickjs-entrypoint.d.ts +30 -8
  18. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-entrypoint.js +209 -32
  20. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  21. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  22. package/dist/runtime/quickjs-log-view.js +229 -0
  23. package/dist/runtime/step-executor.d.ts +2 -21
  24. package/dist/runtime/step-executor.d.ts.map +1 -1
  25. package/dist/runtime/step-executor.js +85 -80
  26. package/dist/runtime/suspension-handler.d.ts +0 -22
  27. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  28. package/dist/runtime/suspension-handler.js +126 -75
  29. package/dist/runtime.d.ts.map +1 -1
  30. package/dist/runtime.js +262 -91
  31. package/dist/serialization.d.ts +2 -2
  32. package/dist/serialization.d.ts.map +1 -1
  33. package/dist/serialization.js +16 -13
  34. package/dist/step/context-storage.d.ts +2 -0
  35. package/dist/step/context-storage.d.ts.map +1 -1
  36. package/dist/step/context-storage.js +1 -1
  37. package/dist/step/writable-stream.d.ts.map +1 -1
  38. package/dist/step/writable-stream.js +14 -10
  39. package/dist/telemetry/semantic-conventions.d.ts +36 -0
  40. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  41. package/dist/telemetry/semantic-conventions.js +23 -1
  42. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  43. package/dist/test-support/orchestrator-context.js +8 -2
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +2 -2
  46. package/dist/workflow.d.ts.map +1 -1
  47. package/dist/workflow.js +8 -3
  48. package/docs/foundations/streaming.mdx +1 -1
  49. package/docs/how-it-works/event-sourcing.mdx +27 -0
  50. package/package.json +6 -6
@@ -4,7 +4,7 @@ import { envNumber } from '@workflow/world/env-config';
4
4
  import { parse, stringify, unflatten } from 'devalue';
5
5
  import { monotonicFactory } from 'ulid';
6
6
  import { importKey } from './encryption.js';
7
- import { createFlushableState, flushablePipe, getMaxBufferedBytes, getMaxBytesPerBatch, getMaxChunksPerBatch, getMaxInflightChunks, pollReadableLock, pollWritableLock, } from './flushable-stream.js';
7
+ import { createFlushableState, flushablePipe, getMaxBufferedBytes, getMaxBytesPerBatch, getMaxChunksPerBatch, getMaxInflightChunks, pollReadableLock, pollWritableLock, trackFlushableWritable, } from './flushable-stream.js';
8
8
  import { getStepFunction } from './private.js';
9
9
  // V2: use getWorldLazy in step-side code paths so Turbopack can statically
10
10
  // resolve the world bridge from the step bundle without dragging the full
@@ -2566,7 +2566,7 @@ export function getWorkflowRevivers(global = globalThis) {
2566
2566
  * @param runId
2567
2567
  * @returns
2568
2568
  */
2569
- function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentId) {
2569
+ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentId, streamStates) {
2570
2570
  return {
2571
2571
  ...getCommonRevivers(global),
2572
2572
  // StepFunction reviver for step context - returns raw step function
@@ -2742,29 +2742,32 @@ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentI
2742
2742
  const serverWritable = new WorkflowServerWritableStream(targetRunId, value.name);
2743
2743
  // Create flushable state for this stream
2744
2744
  const state = createFlushableState();
2745
+ state.deferReleaseSettlement = streamStates !== undefined;
2746
+ streamStates?.push(state);
2745
2747
  ops.push(state.promise);
2746
2748
  // Start the flushable pipe in the background
2747
2749
  flushablePipe(serialize.readable, serverWritable, state).catch(() => {
2748
2750
  // Errors are handled via state.reject
2749
2751
  });
2750
- // Start polling to detect when user releases lock
2751
- pollWritableLock(serialize.writable, state);
2752
+ // Track completed user writes independently of lock release.
2753
+ const writable = trackFlushableWritable(serialize.writable, state, global.WritableStream);
2754
+ pollWritableLock(writable, state);
2752
2755
  // Record the underlying `(runId, name)` so downstream reducers can
2753
2756
  // recognize that this writable is already backed by a workflow
2754
2757
  // server stream. When forwarded across `start()` again (e.g.
2755
2758
  // the child passes this writable on to a grandchild), the
2756
2759
  // external reducer needs both to emit the original `runId` in
2757
2760
  // the descriptor.
2758
- Object.defineProperty(serialize.writable, STREAM_NAME_SYMBOL, {
2761
+ Object.defineProperty(writable, STREAM_NAME_SYMBOL, {
2759
2762
  value: value.name,
2760
2763
  writable: false,
2761
2764
  });
2762
- Object.defineProperty(serialize.writable, STREAM_SERVER_RUN_ID_SYMBOL, {
2765
+ Object.defineProperty(writable, STREAM_SERVER_RUN_ID_SYMBOL, {
2763
2766
  value: targetRunId,
2764
2767
  writable: false,
2765
2768
  });
2766
2769
  if (targetDeploymentId) {
2767
- Object.defineProperty(serialize.writable, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, {
2770
+ Object.defineProperty(writable, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, {
2768
2771
  value: targetDeploymentId,
2769
2772
  writable: false,
2770
2773
  });
@@ -2789,18 +2792,18 @@ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentI
2789
2792
  if (typeof value.encryptionPublicKey !== 'string' &&
2790
2793
  targetRunId === runId &&
2791
2794
  isRunPayloadKeys(cryptoKey)) {
2792
- Object.defineProperty(serialize.writable, STREAM_SERVER_PUBLIC_KEY_SYMBOL, {
2795
+ Object.defineProperty(writable, STREAM_SERVER_PUBLIC_KEY_SYMBOL, {
2793
2796
  value: bytesToBase64(cryptoKey.keyPair.publicKey),
2794
2797
  writable: false,
2795
2798
  });
2796
2799
  }
2797
2800
  if (typeof value.encryptionPublicKey === 'string') {
2798
- Object.defineProperty(serialize.writable, STREAM_SERVER_PUBLIC_KEY_SYMBOL, {
2801
+ Object.defineProperty(writable, STREAM_SERVER_PUBLIC_KEY_SYMBOL, {
2799
2802
  value: value.encryptionPublicKey,
2800
2803
  writable: false,
2801
2804
  });
2802
2805
  }
2803
- return serialize.writable;
2806
+ return writable;
2804
2807
  },
2805
2808
  AbortController: (value) => reviveAbortController(value, ops, runId),
2806
2809
  AbortSignal: (value) => reviveAbortSignal(value, ops, runId),
@@ -3019,12 +3022,12 @@ guestCodeStatsOut) {
3019
3022
  * Called from the step executor to hydrate the arguments of a step
3020
3023
  * from the database at the start of the step execution.
3021
3024
  */
3022
- export async function hydrateStepArguments(value, runId, key, ops = [], global = globalThis, extraRevivers = {}, deploymentId) {
3025
+ export async function hydrateStepArguments(value, runId, key, ops = [], global = globalThis, extraRevivers = {}, deploymentId, streamStates) {
3023
3026
  const compressionStats = {};
3024
3027
  const result = await stepModule.deserialize(value, key, {
3025
3028
  global,
3026
3029
  extraRevivers: {
3027
- ...getStreamAndRequestRevivers(getStepRevivers(global, ops, runId, key, deploymentId)),
3030
+ ...getStreamAndRequestRevivers(getStepRevivers(global, ops, runId, key, deploymentId, streamStates)),
3028
3031
  ...extraRevivers,
3029
3032
  },
3030
3033
  compressionStats,
@@ -3244,4 +3247,4 @@ function getStreamAndRequestRevivers(allRevivers) {
3244
3247
  }
3245
3248
  return extra;
3246
3249
  }
3247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsNERBQTREO0FBQzVELHNFQUFzRTtBQUN0RSxzREFBc0Q7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixrQkFBa0IsR0FDbkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEtBQUssWUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFFTCxRQUFRLEVBQ1IsVUFBVSxHQUNYLE1BQU0s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QUFJLHVCQUF1QixFQUFFLENBQUM7UUFDMUMsSUFBSSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQ2xDLFdBQWdDO0lBRWhDLE1BQU0sS0FBSyxHQUF3QyxFQUFFLENBQUM7SUFDdEQsS0FBSyxNQUFNLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzFDLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFN0cmVhbUVycm9yLFxuICBTdHJlYW1FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1Xcml0ZVNlc3Npb24gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2Vudi1jb25maWcnO1xuaW1wb3J0IHsgcGFyc2UsIHN0cmluZ2lmeSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmx1c2hhYmxlU3RhdGUsXG4gIGZsdXNoYWJsZVBpcGUsXG4gIGdldE1heEJ1ZmZlcmVkQnl0ZXMsXG4gIGdldE1heEJ5dGVzUGVyQmF0Y2gsXG4gIGdldE1heENodW5rc1BlckJhdGNoLFxuICBnZXRNYXhJbmZsaWdodENodW5rcyxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyB3b3JsZC50cyBtb2R1bGUgKGFuZCBpdHMgZHluYW1pYy1pbXBvcnQgYmVoYXZpb3VyKSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGNyZWF0ZU9wZW5TZXNzaW9uLFxuICBjcmVhdGVTZWFsU2Vzc2lvbixcbiAgZGVjb2RlUnVuUHVibGljS2V5LFxufSBmcm9tICcuL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0ICogYXMgY2xpZW50TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wcmVzc2lvblN0YXRzLFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGFlc0tleU9mLFxuICBkZWNyeXB0LFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGVuY3J5cHQsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICByZXNvbHZlRW5jcnlwdGlvbktleSxcbiAgcnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IsXG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZm9ybWF0LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgR3Vlc3RDb2RlU3RhdHMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgcmVhZFByb3BlcnR5LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0RSQUlOX1NZTUJPTCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuS2luZCwgcmVjb3JkRWxhcHNlZFNwYW4gfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRBYm9ydFN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IFdvcmtmbG93QWJvcnRTaWduYWwgfSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlc1xuLy8gc28gZXhpc3RpbmcgY29uc3VtZXJzIG9mIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uYCBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgLy8gU2VhbGVkLWJveCAoJ2VuY3AnKSBrZXkgdmFyaWFudHM6IHNlZSBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG4gIHJ1blBheWxvYWRLZXlzLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgaXNTZWFsVGFyZ2V0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBhZXNLZXlPZixcbn07XG5cbi8vIFJlLWV4cG9ydCB0aGUgbGVnYWN5IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIE5ldyBjb2RlIHNob3VsZCB1c2UgRm9ybWF0UHJlZml4IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcycuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKipcbiAqIERlZmF1bHQgVUxJRCBnZW5lcmF0b3IgZm9yIGNvbnRleHRzIHdoZXJlIFZNJ3Mgc2VlZGVkIGBzdGFibGVVbGlkYCBpc24ndCBhdmFpbGFibGUuXG4gKiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBzZXJpYWxpemluZyBzdHJlYW1zIG91dHNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHRcbiAqIChlLmcuLCB3aGVuIHN0YXJ0aW5nIGEgd29ya2Zsb3cgb3IgaGFuZGxpbmcgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdFVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgcmVhZGFibGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHN0cmVhbVxuICogQHJldHVybnMgYFwiYnl0ZXNcImAgaWYgdGhlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLCBgdW5kZWZpbmVkYCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmVhbVR5cGUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6ICdieXRlcycgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoeyBtb2RlOiAnYnlvYicgfSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgcmV0dXJuICdieXRlcyc7XG4gIH0gY2F0Y2gge31cbn1cblxuLyoqXG4gKiBGcmFtZSBmb3JtYXQgZm9yIHN0cmVhbSBjaHVua3M6XG4gKiAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW2Zvcm1hdC1wcmVmaXhlZCBwYXlsb2FkXVxuICpcbiAqIEVhY2ggY2h1bmsgaXMgaW5kZXBlbmRlbnRseSBmcmFtZWQgc28gdGhlIGRlc2VyaWFsaXplciBjYW4gZmluZFxuICogY2h1bmsgYm91bmRhcmllcyBldmVuIHdoZW4gbXVsdGlwbGUgY2h1bmtzIGFyZSBjb25jYXRlbmF0ZWQgb3JcbiAqIHNwbGl0IGFjcm9zcyB0cmFuc3BvcnQgcmVhZHMuXG4gKi9cbmNvbnN0IEZSQU1FX0hFQURFUl9TSVpFID0gNDtcblxuLyoqXG4gKiBUaGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAoYC4vc2VyaWFsaXphdGlvbi97Y2xpZW50LHN0ZXAsd29ya2Zsb3d9LnRzYClcbiAqIGFscmVhZHkgdGhyb3cgYSBgU2VyaWFsaXphdGlvbkVycm9yYCB3aG9zZSBgLmNhdXNlYCBpcyB0aGUgdW5kZXJseWluZ1xuICogZGV2YWx1ZSAvIHNlcmRlIGZhaWx1cmUuIFRoZSBvdXRlciBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB3YW50IHRvXG4gKiByZS1mcmFtZSB0aGF0IGVycm9yIHdpdGggYSBtb3JlIHNwZWNpZmljIGNvbnRleHQgbGFiZWwgKGUuZy4gXCJ3b3JrZmxvd1xuICogYXJndW1lbnRzXCIgaW5zdGVhZCBvZiBnZW5lcmljIFwid29ya2Zsb3cgdmFsdWVcIiksIHNvIHRoZXkgdW53cmFwIHRoZVxuICogaW5uZXIgU2VyaWFsaXphdGlvbkVycm9yIGFuZCByZWZvcm1hdCB3aXRoIHRoZSBvcmlnaW5hbCBjYXVzZS4gRXJyb3JzXG4gKiB0aGF0IGFyZW4ndCBhbHJlYWR5IFNlcmlhbGl6YXRpb25FcnJvciBmbG93IHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBpcyBhbiBleGNlcHRpb246IGl0IG11c3Qga2VlcCBpdHMgaWRlbnRpdHkgKGFuZFxuICogYGNvbnRleHRgKSBzbyB0aGUgcnVuLWZhaWx1cmUgY2xhc3NpZmllciByb3V0ZXMgaXQgdG8gYFJVTlRJTUVfRVJST1JgLFxuICogc28gdGhpcyByZXRocm93cyBpdCB1bmNoYW5nZWQgYmVmb3JlIGFueSB1bndyYXBwaW5nLiBOb3RlIHRoaXMgZ3VhcmRcbiAqIG11c3QgcnVuIGJlZm9yZSB0aGUgZ2VuZXJpYyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIHVud3JhcCBiZWxvdywgc2luY2VcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBleHRlbmRzIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIGNhcnJpZXMgYVxuICogYGNhdXNlYCAodGhlIHVuZGVybHlpbmcgRE9NRXhjZXB0aW9uKSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1bndyYXBwZWRcbiAqIGFuZCByZWZyYW1lZCBhcyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgLlxuICovXG5mdW5jdGlvbiB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VyaWFsaXphdGlvbkVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogRW1pdCBjb21wcmVzc2lvbiB0ZWxlbWV0cnkgb250byB0aGUgYWN0aXZlIHNwYW4gYWZ0ZXIgYSAoZGUpc2VyaWFsaXplLlxuICpcbiAqIFRoZSBjb21wcmVzc2lvbiBsYXllciBwb3B1bGF0ZXMgYHN0YXRzYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgcmFuIChiaW5hcnlcbiAqIGRhdGEgb24gYSBzcGVjID49IDUgcGF0aCk7IGxlZ2FjeSAvIHYxQ29tcGF0IHBhdGhzIGxlYXZlIGl0IHVucmVjb3JkZWQsIHNvXG4gKiB0aGlzIG5vLW9wcyBmb3IgdGhlbSBhbmQgYXZvaWRzIHRoZSBgZ2V0QWN0aXZlU3BhbmAgbG9va3VwLiBBdHRyaWJ1dGVzIGxhbmRcbiAqIG9uIHdoYXRldmVyIHNwYW4gaXMgYWN0aXZlLCB0eXBpY2FsbHkgdGhlIGRlZGljYXRlZCBgc3RlcC5kZWh5ZHJhdGVgIC9cbiAqIGBzdGVwLmh5ZHJhdGVgIHNwYW4sIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIHJ1bi9zdGFydCBzcGFuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRDb21wcmVzc2lvbihcbiAgc3RhdHM6IENvbXByZXNzaW9uU3RhdHMsXG4gIG9wZXJhdGlvbjogJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzdGF0cy5yZWNvcmRlZCkgcmV0dXJuO1xuICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgcGF0aDogYVxuICAvLyBtaXNzaW5nL2ZhaWxpbmcgdHJhY2VyIGlzIHB1cmVseSBhbiBvYnNlcnZhYmlsaXR5IGxvc3MuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRCeXRlcyA9IHN0YXRzLnVuY29tcHJlc3NlZEJ5dGVzID8/IDA7XG4gICAgY29uc3Qgc3RvcmVkQnl0ZXMgPSBzdGF0cy5zdG9yZWRCeXRlcyA/PyAwO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25PcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzZWQoc3RhdHMuY29tcHJlc3NlZCA/PyBmYWxzZSksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db2RlYyhzdGF0cy5jb2RlYyA/PyAnbm9uZScpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXModW5jb21wcmVzc2VkQnl0ZXMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMoc3RvcmVkQnl0ZXMpLFxuICAgICAgLi4uKHN0YXRzLmNvbXByZXNzZWQgJiYgdW5jb21wcmVzc2VkQnl0ZXMgPiAwXG4gICAgICAgID8gQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3Npb25SYXRpbyhcbiAgICAgICAgICAgIDEgLSBzdG9yZWRCeXRlcyAvIHVuY29tcHJlc3NlZEJ5dGVzXG4gICAgICAgICAgKVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgT1RlbCBzcGFuIGF0dHJpYnV0ZXMgZm9yIHdvcmtmbG93IChndWVzdCkgY29kZSBleGVjdXRpb25zIHRoYXQgdGhlXG4gKiBoYXJkZW5lZCBzZXJpYWxpemVyIGNvdWxkIG5vdCBhdm9pZCAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tXG4gKiBzZXJpYWxpemVycykuIE5vLW9wcyB3aGVuIHNlcmlhbGl6YXRpb24gd2FzIGZ1bGx5IHNpZGUtZWZmZWN0IGZyZWUsXG4gKiB0aGUgY29tbW9uIGNhc2UuIFNhbWUgbmV2ZXItYnJlYWstdGhlLWRhdGEtcGF0aCBjb250cmFjdCBhc1xuICogYHJlY29yZENvbXByZXNzaW9uYCBhYm92ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0czogR3Vlc3RDb2RlU3RhdHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdG90YWxFeGVjdXRpb25zID0gc3RhdHMudG90YWxFeGVjdXRpb25zID8/IHN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoO1xuICBpZiAodG90YWxFeGVjdXRpb25zID09PSAwKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgc3RhdHMuZXhlY3V0aW9ucy5tYXAoKGUpID0+XG4gICAgICAgICAgZS5kZXRhaWwgPyBgJHtlLmtpbmR9ICgke2UuZGV0YWlsfSlgIDogZS5raW5kXG4gICAgICAgIClcbiAgICAgICksXG4gICAgXTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRXhlY3V0aW9ucyh0b3RhbEV4ZWN1dGlvbnMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRGV0YWlscyhkZXRhaWxzKSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJpYWxpemVTdHJlYW0oXG4gIHJlZHVjZXJzOiBQYXJ0aWFsPFJlZHVjZXJzPixcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIC8vIE5vdGU6IGlmIHJlc29sdmluZyBjcnlwdG9LZXkgcmVqZWN0cyAoZS5nLiwgbmV0d29yayBlcnJvciBmZXRjaGluZ1xuICAvLyB0aGUgZGVyaXZlZCBrZXkpLCB0aGUgcmVqZWN0aW9uIHdvbid0IHN1cmZhY2UgdW50aWwgdGhlIGZpcnN0IGNodW5rXG4gIC8vIGlzIHByb2Nlc3NlZCwgbm90IGF0IHN0cmVhbSBjb25zdHJ1Y3Rpb24gdGltZS5cbiAgY29uc3Qga2V5U3RhdGUgPSB7XG4gICAgcmVzb2x2ZWQ6IGZhbHNlLFxuICAgIGtleTogdW5kZWZpbmVkIGFzIFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIH07XG4gIC8vIFNldCB3aGVuIHRoZSByZXNvbHZlZCBrZXkgaXMgYSBzZWFsIHRhcmdldDsgYW1vcnRpemVzIHRoZSBLRU0gYWNyb3NzIGFsbFxuICAvLyBmcmFtZXMgdGhpcyBzdHJlYW0gaW5zdGFuY2Ugd3JpdGVzLlxuICBsZXQgc2VhbFNlc3Npb246IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVNlYWxTZXNzaW9uPiB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICgha2V5U3RhdGUucmVzb2x2ZWQpIHtcbiAgICAgICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaXNTZWFsVGFyZ2V0KGtleVN0YXRlLmtleSkpIHtcbiAgICAgICAgICAgIHNlYWxTZXNzaW9uID0gY3JlYXRlU2VhbFNlc3Npb24oXG4gICAgICAgICAgICAgIGtleVN0YXRlLmtleS5yZWNpcGllbnRQdWJsaWNLZXksXG4gICAgICAgICAgICAgIGtleVN0YXRlLmtleS5hYWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnkoY2h1bmssIHJlZHVjZXJzKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHNlcmlhbGl6ZWQpO1xuICAgICAgICBsZXQgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICkgYXMgVWludDhBcnJheTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBmcmFtZSBwYXlsb2FkIGlmIGEga2V5IGlzIHByb3ZpZGVkLlxuICAgICAgICAvLyBUaGUgbGVuZ3RoIGhlYWRlciByZW1haW5zIGluIHRoZSBjbGVhciBzbyB0aGUgZGVzZXJpYWxpemVyIGNhblxuICAgICAgICAvLyBmaW5kIGZyYW1lIGJvdW5kYXJpZXMgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEV2ZXJ5IGZyYW1lIGdldHMgYSBmcmVzaCByYW5kb20gbm9uY2UuIE5ldmVyIHN3aXRjaCB0aGlzIHRvIGFcbiAgICAgICAgLy8gY291bnRlcjogYSBzdHJlYW0gcmVjb25uZWN0IG9yIGEgZHVyYWJsZSByZXBsYXkgcmVzdGFydHMgdGhlIHdyaXRlcixcbiAgICAgICAgLy8gd2hpY2ggd291bGQgcmVwZWF0IGAoa2V5LCBub25jZSlgIGFuZCBjYXRhc3Ryb3BoaWNhbGx5IGJyZWFrXG4gICAgICAgIC8vIEFFUy1HQ00uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9uIHRoZSBzZWFsZWQgcGF0aCB0aGUgS0VNIGlzIGFtb3J0aXplZCBhY3Jvc3MgdGhlIHN0cmVhbSB2aWEgYVxuICAgICAgICAvLyBzZXNzaW9uIChvbmUgRUNESCBwZXIgd3JpdGVyIGluc3RlYWQgb2Ygb25lIHBlciBmcmFtZSkuIFRoYXQgaXMgc2FmZVxuICAgICAgICAvLyBwcmVjaXNlbHkgYmVjYXVzZSB0aGUgbm9uY2VzIHN0YXkgcmFuZG9tLCBhbmQgYmVjYXVzZSB0aGUgc2Vzc2lvbiBpc1xuICAgICAgICAvLyBzY29wZWQgdG8gdGhpcyBzdHJlYW0gaW5zdGFuY2U6IGEgcmVwbGF5ZWQgb3IgcmVjb25uZWN0ZWQgd3JpdGVyXG4gICAgICAgIC8vIGJ1aWxkcyBhIG5ldyBvbmUgYW5kIG5ldmVyIGluaGVyaXRzIGEgcHJldmlvdXMgY29udGVudCBrZXkuXG4gICAgICAgIGlmIChzZWFsU2Vzc2lvbikge1xuICAgICAgICAgIHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVELFxuICAgICAgICAgICAgYXdhaXQgc2VhbFNlc3Npb24uc2VhbChwcmVmaXhlZClcbiAgICAgICAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5U3RhdGUua2V5KSB7XG4gICAgICAgICAgcHJlZml4ZWQgPSAoYXdhaXQgZW5jcnlwdChwcmVmaXhlZCwga2V5U3RhdGUua2V5KSkgYXMgVWludDhBcnJheTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZTogWzQtYnl0ZSBsZW5ndGhdW3ByZWZpeGVkIGRhdGFdXG4gICAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBwcmVmaXhlZC5sZW5ndGgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgcHJlZml4ZWQubGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgIGZyYW1lLnNldChwcmVmaXhlZCwgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRW5jcnlwdGlvbiBmYWlsdXJlcyBtdXN0IGtlZXAgdGhlaXIgUnVudGltZURlY3J5cHRpb25FcnJvclxuICAgICAgICAvLyBpZGVudGl0eSAoUlVOVElNRV9FUlJPUikgcmF0aGVyIHRoYW4gYmUgcmVmcmFtZWQgYXMgYVxuICAgICAgICAvLyBTZXJpYWxpemF0aW9uRXJyb3IgKFVTRVJfRVJST1IpLlxuICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ3N0cmVhbSBjaHVuaycsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2U6IGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgcmV2aXZlcnM6IFBhcnRpYWw8UmV2aXZlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4ge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICBjb25zdCBrZXlTdGF0ZSA9IHtcbiAgICByZXNvbHZlZDogZmFsc2UsXG4gICAga2V5OiB1bmRlZmluZWQgYXMgUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgfTtcbiAgLy8gTWlycm9yIG9mIHRoZSB3cml0ZXIncyBzZWFsIHNlc3Npb246IGV2ZXJ5IGZyYW1lIGZyb20gb25lIHdyaXRlciBjYXJyaWVzXG4gIC8vIHRoZSBzYW1lIGVwaGVtZXJhbCBwdWJsaWMga2V5LCBzbyB0aGlzIHR1cm5zIGFuIEVDREggcGVyIGZyYW1lIGludG8gYW5cbiAgLy8gRUNESCBwZXIgd3JpdGVyLlxuICBsZXQgb3BlblNlc3Npb246IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZU9wZW5TZXNzaW9uPiB8IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXdCdWZmZXIuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV3QnVmZmVyLnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXdCdWZmZXI7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzKFxuICAgIGNvbnRyb2xsZXI6IFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyPGFueT5cbiAgKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0XG4gICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAga2V5U3RhdGUua2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIGlmIChpc1J1blBheWxvYWRLZXlzKGtleVN0YXRlLmtleSkpIHtcbiAgICAgICAgb3BlblNlc3Npb24gPSBjcmVhdGVPcGVuU2Vzc2lvbihrZXlTdGF0ZS5rZXkua2V5UGFpciwga2V5U3RhdGUua2V5LmFhZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgY29tcGxldGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lc1xuICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCkge1xuICAgICAgICBicmVhazsgLy8gSW5jb21wbGV0ZSBmcmFtZSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyYW1lRGF0YSA9IGJ1ZmZlci5zbGljZShcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUsXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGhcbiAgICAgICk7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCk7XG5cbiAgICAgIGxldCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGZyYW1lRGF0YSk7XG5cbiAgICAgIC8vIElmIHRoZSBmcmFtZSBwYXlsb2FkIGlzIGVuY3J5cHRlZCBvciBzZWFsZWQsIHJlY292ZXIgaXQgZmlyc3QgdG9cbiAgICAgIC8vIHJldmVhbCB0aGUgaW5uZXIgZm9ybWF0LXByZWZpeGVkIGRhdGEgKGUuZy4sICdkZXZsJyArIHNlcmlhbGl6ZWRcbiAgICAgIC8vIHRleHQpLCB0aGVuIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGRlc2VyaWFsaXphdGlvbiBwYXRoLlxuICAgICAgaWYgKFxuICAgICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEIHx8XG4gICAgICAgIGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRURcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzZWFsZWQgPSBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVEO1xuICAgICAgICAvLyBBIHNlYWxlZCBmcmFtZSBuZWVkcyB0aGUgcnVuJ3Mga2V5cGFpcjsgYSBzeW1tZXRyaWMgZnJhbWUgbmVlZHMgYW5cbiAgICAgICAgLy8gQUVTIGtleS4gUmVwb3J0IHRoZSBzaG9ydGZhbGwgcHJlY2lzZWx5OiBcIm5vIGtleSBhdCBhbGxcIiBhbmQgXCJ0aGVcbiAgICAgICAgLy8gd3Jvbmcga2luZCBvZiBrZXlcIiBoYXZlIGRpc3RpbmN0IGNhdXNlcy5cbiAgICAgICAgY29uc3QgdXNhYmxlID0gc2VhbGVkXG4gICAgICAgICAgPyBpc1J1blBheWxvYWRLZXlzKGtleVN0YXRlLmtleSlcbiAgICAgICAgICA6IGFlc0tleU9mKGtleVN0YXRlLmtleSkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF1c2FibGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICAgICAgICAgIHNlYWxlZFxuICAgICAgICAgICAgICAgID8gJ1NlYWxlZCBzdHJlYW0gZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gcnVuIGtleXBhaXIgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgXCJPcGVuaW5nIGEgc2VhbGVkIGZyYW1lIHJlcXVpcmVzIHRoZSBydW4ncyBvd24gZW5jcnlwdGlvbiBrZXkgbWF0ZXJpYWwuXCJcbiAgICAgICAgICAgICAgICA6ICdFbmNyeXB0ZWQgc3RyZWFtIGRhdGEgZW5jb3VudGVyZWQgYnV0IG5vIGVuY3J5cHRpb24ga2V5IGlzIGF2YWlsYWJsZS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdFbmNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIG9yIG5vIGtleSB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgcnVuLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGg6IHBheWxvYWQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdFByZWZpeDogc2VhbGVkID8gJ2VuY3AnIDogJ2VuY3InLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVjcnlwdGVkOiBVaW50OEFycmF5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNlYWxlZCBmcmFtZXMgZ28gdGhyb3VnaCB0aGUgc2Vzc2lvbiBzbyByZXBlYXRlZCBmcmFtZXMgZnJvbSBvbmVcbiAgICAgICAgICAvLyB3cml0ZXIgcmV1c2UgYSBzaW5nbGUgZGVjYXBzdWxhdGlvbi4gRXZlcnl0aGluZyBlbHNlIGRlbGVnYXRlcyB0b1xuICAgICAgICAgIC8vIHRoZSBzaGFyZWQgZW52ZWxvcGUgbGF5ZXIsIGtlZXBpbmcgdGhlIHR3byBzY2hlbWVzIGluIGxvY2tzdGVwXG4gICAgICAgICAgLy8gd2l0aCB0aGUgb25lLXNob3QgcGF0aC5cbiAgICAgICAgICBkZWNyeXB0ZWQgPSBzZWFsZWRcbiAgICAgICAgICAgID8gYXdhaXQgb3BlblNlc3Npb24hLm9wZW4oZGVjb2RlRm9ybWF0UHJlZml4KGZyYW1lRGF0YSkucGF5bG9hZClcbiAgICAgICAgICAgIDogKChhd2FpdCBkZWNyeXB0KGZyYW1lRGF0YSwga2V5U3RhdGUua2V5KSkgYXMgVWludDhBcnJheSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGxvdy1sZXZlbCBjcnlwdG8gbGF5ZXIgb25seSBzZWVzIHRoZSBzdHJpcHBlZCBwYXlsb2FkLCBzbyBpdFxuICAgICAgICAgIC8vIGNhbm5vdCByZWNvcmQgdGhlIG91dGVyIGVudmVsb3BlIHByZWZpeC4gV2UgcGVla2VkIGl0IGhlcmUsIHNvXG4gICAgICAgICAgLy8gZW5yaWNoIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgd2l0aCB0aGUgcmVhbCBmb3JtYXQgcHJlZml4IGJlZm9yZVxuICAgICAgICAgIC8vIHByb3BhZ2F0aW5nLCBtaXJyb3Jpbmcgc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLnRzLlxuICAgICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSAmJiBlcnJvci5jb250ZXh0KSB7XG4gICAgICAgICAgICBlcnJvci5jb250ZXh0LmZvcm1hdFByZWZpeCA9IGZvcm1hdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgKHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUocGF5bG9hZCk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZSh0ZXh0LCByZXZpdmVycykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55Pih7XG4gICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAvLyBGaXJzdCwgdHJ5IHRvIGRldGVjdCBpZiB0aGlzIGlzIGxlbmd0aC1wcmVmaXhlZCBmcmFtZWQgZGF0YVxuICAgICAgLy8gYnkgY2hlY2tpbmcgaWYgdGhlIGZpcnN0IDQgYnl0ZXMgZm9ybSBhIHBsYXVzaWJsZSBsZW5ndGguXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiBjaHVuay5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgY2h1bmsuYnVmZmVyLFxuICAgICAgICAgIGNodW5rLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA8IDEwMF8wMDBfMDAwIC8vIHNhbml0eSBjaGVjazogPCAxMDBNQlxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBMb29rcyBsaWtlIGZyYW1lZCBkYXRhXG4gICAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEFscmVhZHkgaW4gZnJhbWVkIG1vZGUgKGhhdmUgYnVmZmVyZWQgZGF0YSlcbiAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBmb3JtYXQ6IG5ld2xpbmUtZGVsaW1pdGVkIGRldmFsdWUgdGV4dCAobm8gZnJhbWluZylcbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShjaHVuayk7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UobGluZSwgcmV2aXZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgLy8gUHJvY2VzcyBhbnkgcmVtYWluaW5nIGZyYW1lZCBkYXRhXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gQnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2AgUmVhZGFibGVTdHJlYW1zIHBhc3NlZCBhY3Jvc3MgYm91bmRhcmllcylcbi8vIGFyZSB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHdvcmxkJ3Mgc3RyZWFtIHRyYW5zcG9ydCBvbmUgdXNlciBjaHVuayBhdFxuLy8gYSB0aW1lLiBXaXRob3V0IGFuIGluLWJhbmQgZW52ZWxvcGUsIHRoZSByZWFkZXIgc2VlcyBhIGZsYXQgc3RyZWFtIG9mXG4vLyBieXRlczogdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgd2hlcmUgb25lIHVzZXIgY2h1bmsgZW5kcyBhbmQgdGhlIG5leHRcbi8vIGJlZ2lucywgd2hpY2ggbWFrZXMgbWlkLXN0cmVhbSByZWNvbm5lY3QgaW1wb3NzaWJsZSAod2UgZG9uJ3Qga25vdyBob3dcbi8vIG1hbnkgc2VydmVyLXNpZGUgY2h1bmtzIGhhdmUgYmVlbiBjb25zdW1lZCkuXG4vL1xuLy8gVG8gZW5hYmxlIHRyYW5zcGFyZW50IHJlY29ubmVjdCwgdGhpcyBQUiBpbnRyb2R1Y2VzIGFuIG9wdC1pbiB3aXJlXG4vLyBlbnZlbG9wZSB0aGF0IHdyYXBzIGVhY2ggdXNlciBjaHVuayBpbiBhIGxlbmd0aC1wcmVmaXg6XG4vL1xuLy8gICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVt1c2VyIHBheWxvYWQgYnl0ZXNdXG4vL1xuLy8gVGhlIGVudmVsb3BlIGlzIGlkZW50aWNhbCBpbiBzaGFwZSB0byBgZ2V0U2VyaWFsaXplU3RyZWFtYCdzIGZyYW1pbmcsXG4vLyBidXQgdGhlIHBheWxvYWQgaGVyZSBpcyAqcmF3IHVzZXIgYnl0ZXMqOiB0aGVyZSBpcyBubyBpbm5lclxuLy8gZm9ybWF0LXByZWZpeCwgbm8gZGV2YWx1ZSwgbm8gZW5jcnlwdGlvbi4gQSBmcmFtZWQgYnl0ZSBzdHJlYW0gc3RheXNcbi8vIHNlbWFudGljYWxseSBhIGJ5dGUgc3RyZWFtIGVuZC10by1lbmQ7IHRoZSBmcmFtaW5nIGlzIHB1cmVseSB0cmFuc3BvcnQuXG4vL1xuLy8gVGhlIGRlY2lzaW9uIHRvIHVzZSBmcmFtaW5nIGZvciBhIGdpdmVuIHN0cmVhbSBpcyByZWNvcmRlZCBpbiB0aGVcbi8vIHNlcmlhbGl6ZWQgc3RyZWFtIHJlZiAoYGZyYW1pbmc6ICdmcmFtZWQtdjEnYCksIHNvIGJvdGggc2lkZXMgYWdyZWUgb25cbi8vIHRoZSB3aXJlIGZvcm1hdCB3aXRob3V0IHJ1bnRpbWUgbmVnb3RpYXRpb24uIFByb2R1Y2VycyB0aGF0IHRhcmdldCBhXG4vLyBydW4gd2hvc2UgZGVwbG95bWVudCBkb2Vzbid0IHN1cHBvcnQgZnJhbWluZyAoc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgXG4vLyBpbiBjYXBhYmlsaXRpZXMudHMpIGVtaXQgcmF3IGJ5dGVzIGFuZCBhIHJlZiB3aXRob3V0IHRoZSBmaWVsZCwgd2hpY2hcbi8vIHRoZSByZWFkZXIgdHJlYXRzIGFzIGxlZ2FjeSByYXcgYnl0ZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXG4vKipcbiAqIE1heGltdW0gYWxsb3dlZCBieXRlLXN0cmVhbSBmcmFtZSBwYXlsb2FkIHNpemUgKDEwME1CKS4gU2hhcmVkIGJ5IHRoZVxuICogZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCB1c2VyIGNodW5rcyBhdCB3cml0ZSB0aW1lLCB3aGVyZSB0aGUgZXJyb3IgaXNcbiAqIGFjdGlvbmFibGUpIGFuZCB0aGUgdW5mcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIGxlbmd0aCBoZWFkZXJzIGF0IHJlYWRcbiAqIHRpbWUsIHdoaWNoIHVzdWFsbHkgaW5kaWNhdGUgYSBub24tZnJhbWVkIHdpcmUgYmVpbmcgcmVhZCBhcyBmcmFtZWQpLlxuICogS2VlcGluZyBib3RoIHNpZGVzIG9uIG9uZSBjb25zdGFudCBndWFyYW50ZWVzIGFueSBjaHVuayB0aGUgZnJhbWVyXG4gKiBhY2NlcHRzIGNhbiBhbHdheXMgYmUgZGVjb2RlZCBieSB0aGUgdW5mcmFtZXIuXG4gKi9cbmNvbnN0IE1BWF9GUkFNRV9TSVpFID0gMTAwXzAwMF8wMDA7XG5cbi8qKlxuICogV3JhcHMgZWFjaCBjaHVuayBvZiBhIGJ5dGUgc3RyZWFtIGluIGEgNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXG4gKiBwcmVmaXguIFVzZWQgYnkgdGhlIHByb2R1Y2VyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBFbXB0eSBjaHVua3MgKGxlbmd0aCAwKSBhcmUgZHJvcHBlZDogdGhlIHJlc3VsdGluZyBgWzB4MDAgMHgwMCAweDAwIDB4MDBdYFxuICogZnJhbWUgd291bGQgYmUgYW1iaWd1b3VzIHdpdGggdGhlIGxlZ2FjeSBcImxvb2tzIGZyYW1lZFwiIGRldGVjdGlvbiBpblxuICogYGdldERlc2VyaWFsaXplU3RyZWFtYCwgYW5kIGl0IGNhcnJpZXMgbm8gaW5mb3JtYXRpb24uXG4gKlxuICogTG9hZC1iZWFyaW5nIGludmFyaWFudDogZWFjaCB1c2VyIGNodW5rIGJlY29tZXMgZXhhY3RseSBvbmUgZnJhbWUsIGFuZFxuICogZWFjaCBmcmFtZSBpcyBlbnF1ZXVlZCBhcyBleGFjdGx5IG9uZSB0cmFuc3BvcnQgY2h1bmsgKHRoZSBkb3duc3RyZWFtXG4gKiB3cml0YWJsZSBwZXJmb3JtcyBvbmUgd2lyZSB3cml0ZSBwZXIgY2h1bmssIHByZXNlcnZpbmcgYm91bmRhcmllcykuIFRoZVxuICogc2VydmVyIHRoZXJlZm9yZSBzdG9yZXMgb25lIGZyYW1lIHBlciBjaHVuayBpbmRleCwgd2hpY2ggaXMgd2hhdCBhbGxvd3NcbiAqIGEgZnV0dXJlIHJlY29ubmVjdGluZyByZWFkZXIgdG8gcmVzdW1lIGEgZnJhbWVkIGJ5dGUgc3RyZWFtIGF0XG4gKiBgc3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzYCwgdGhlIHNhbWUgYXJpdGhtZXRpY1xuICogYGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbWAgcmVsaWVzIG9uIGZvciBvYmplY3Qgc3RyZWFtcy4gRG8gbm90XG4gKiBjb2FsZXNjZSBvciBzcGxpdCBmcmFtZXMgaGVyZSB3aXRob3V0IHJldmlzaXRpbmcgdGhhdCByZXN1bWUgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlRnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gY2h1bmsgb2YgJHtjaHVuay5sZW5ndGh9IGJ5dGVzIGV4Y2VlZHMgdGhlIG1heGltdW0gYCArXG4gICAgICAgICAgICAgIGBmcmFtZWQgY2h1bmsgc2l6ZSAoJHtNQVhfRlJBTUVfU0laRX0pLiBTcGxpdCB0aGUgZGF0YSBpbnRvIGAgK1xuICAgICAgICAgICAgICBgc21hbGxlciBjaHVua3MgYmVmb3JlIHdyaXRpbmcuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBVaW50OEFycmF5KEZSQU1FX0hFQURFUl9TSVpFICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTtcbiAgICAgIGZyYW1lLnNldChjaHVuaywgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGZyYW1lKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBVbndyYXBzIGxlbmd0aC1wcmVmaXhlZCBieXRlLXN0cmVhbSBmcmFtZXMgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCB1c2VyXG4gKiBjaHVua3MuIFVzZWQgYnkgdGhlIGNvbnN1bWVyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBCdWZmZXJzIGFjcm9zcyByZWFkIGJvdW5kYXJpZXMsIHNpbmNlIHRoZSB0cmFuc3BvcnQgbWF5IHNwbGl0IGEgc2luZ2xlXG4gKiBmcmFtZSBhY3Jvc3MgbXVsdGlwbGUgcmVhZHMgKGhlYWRlciBpbiBvbmUgY2h1bmssIHBheWxvYWQgaW4gYW5vdGhlcilcbiAqIG9yIGNvYWxlc2NlIG11bHRpcGxlIGZyYW1lcyBpbnRvIGEgc2luZ2xlIHJlYWQuIFRoZSB0cmFuc2Zvcm0gZW1pdHNcbiAqIHdob2xlIHVzZXIgY2h1bmtzIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwb3J0IGNodW5raW5nLlxuICpcbiAqIEVycm9ycyB0aGUgc3RyZWFtIGlmIHRoZSBsZW5ndGggaGVhZGVyIGFkdmVydGlzZXMgYSBmcmFtZSBsYXJnZXIgdGhhblxuICogYE1BWF9GUkFNRV9TSVpFYCBieXRlcywgc2luY2UgdGhhdCBhbG1vc3QgY2VydGFpbmx5IGluZGljYXRlcyBhXG4gKiBtaXNmcmFtZWQgd2lyZSAoZS5nLiBhIHJhdyBieXRlIHN0cmVhbSBiZWluZyBmZWQgdGhyb3VnaCB0aGlzIHRyYW5zZm9ybVxuICogYnkgbWlzdGFrZSkgYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW4gZW5vcm1vdXMgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9CdWZmZXIoZGF0YTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5leHQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV4dC5zZXQoZGF0YSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnVmZmVyID0gbmV4dDtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiAwKSBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG5cbiAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChmcmFtZUxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGZyYW1lIGxlbmd0aCAke2ZyYW1lTGVuZ3RofSBleGNlZWRzIG1heGltdW0gKCR7TUFYX0ZSQU1FX1NJWkV9KS4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgdXN1YWxseSBtZWFucyBhIG5vbi1mcmFtZWQgYnl0ZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCBhcyBmcmFtZWQuYCxcbiAgICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aDtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG5cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSwgdG90YWwpKTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBlbmRlZCB3aXRoICR7YnVmZmVyLmxlbmd0aH0gYnl0ZXMgb2YgaW5jb21wbGV0ZSBmcmFtZSBkYXRhLiBgICtcbiAgICAgICAgICAgICAgYFRoZSBzdHJlYW0gd2FzIHRydW5jYXRlZCBtaWQtZnJhbWUuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBlbmQtdG8tZW5kIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3BhbiBmb3IgYSBsaXZlIHJlYWQ6XG4gKiByZWFkIGRpc3BhdGNoIChgc3RhcnRFcG9jaE1zYCkg4oaSIHRoZSBmaXJzdCBub24tZW1wdHkgY2h1bmsgcmVhY2hpbmcgdGhlXG4gKiByZWFkZXIsIGluY2x1ZGluZyB0aGUgbmV0d29yayBob3AuIEZpcmUtYW5kLWZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleD86IG51bWJlcixcbiAgY29ubmVjdE1zPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWQnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudHRmY19tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgIC4uLih0eXBlb2YgY29ubmVjdE1zID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29ubmVjdF9tcyc6IGNvbm5lY3RNcyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5zdGFydF9pbmRleCc6IHN0YXJ0SW5kZXggfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgc3BlY3VsYXRpdmUgcnVuLWtleSByZXNvbHV0aW9uIGluZGVwZW5kZW50bHkgZnJvbSByYXcgc3RyZWFtIFRURkMuXG4gKiBUaGlzIHBoYXNlIG5ldmVyIGNhcnJpZXMga2V5IG1hdGVyaWFsIGFuZCBpcyBpbnRlbnRpb25hbGx5IHNlcGFyYXRlIGZyb21cbiAqIGB3b3JrZmxvdy5zdHJlYW0ucmVhZGAsIHdob3NlIGVuZHBvaW50IHJlbWFpbnMgdGhlIGZpcnN0IHJhdyBmcmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtUmVhZEtleVJlc29sdXRpb24oXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN1Y2NlZWRlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLnJlYWQucmVzb2x2ZV9rZXknLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQua2V5X3N1Y2NlZWRlZCc6IHN1Y2NlZWRlZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIHJlYWQtY29tcGxldGlvbiBzcGFuIHdoZW4gYSBzdHJlYW0gcmVhZCBkcmFpbnM6XG4gKiBiYWNrLWRhdGVkIHRvIHRoZSByZWFkIGRpc3BhdGNoLCBzbyBpdHMgZHVyYXRpb24gaXMgdGhlIHRvdGFsIHJlYWQsIHdpdGhcbiAqIGNodW5rL2J5dGUgY291bnRzIGZvciB0aHJvdWdocHV0LiBDYW5jZWxsZWQgcmVhZHMgZW1pdCBub3RoaW5nLiBGaXJlLWFuZC1cbiAqIGZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJlY29ubmVjdHM/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmNvbXBsZXRlJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZF9jb21wbGV0ZScsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50b3RhbF9tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jaHVua3MnOiBjaHVua0NvdW50LFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuYnl0ZXMnOiBieXRlQ291bnQsXG4gICAgICAgIC4uLih0eXBlb2YgcmVjb25uZWN0cyA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnJlY29ubmVjdHMnOiByZWNvbm5lY3RzIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtIGV4dGVuZHMgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICAjcmVhZGVyPzogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+O1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3RhcnRJbmRleD86IG51bWJlcikge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihgXCJuYW1lXCIgaXMgcmVxdWlyZWQsIGdvdCBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgdGltZS10by1maXJzdC1jaHVuayBzdGF0ZS4gYHJlYWRTdGFydGAgaXMgc3RhbXBlZCB3aGVuIHRoZVxuICAgIC8vIHJlYWRlciBzdGFydHMgY29uc3VtaW5nIChmaXJzdCBwdWxsIOKGkiB0aGUgcmVhZCBkaXNwYXRjaCk7IHRoZSBzcGFuIGlzXG4gICAgLy8gZW1pdHRlZCBvbmNlLCB3aGVuIHRoZSBmaXJzdCBub24tZW1wdHkgY2h1bmsgcmVhY2hlcyB0aGUgcmVhZGVyLiBTbyBpdHNcbiAgICAvLyBkdXJhdGlvbiBpcyB0aGUgZW5kLXRvLWVuZCBUVEZDIGluY2x1ZGluZyB0aGUgbmV0d29yayBob3AuIE5vLW9wIHdpdGhvdXRcbiAgICAvLyBhbiBPcGVuVGVsZW1ldHJ5IFNESyByZWdpc3RlcmVkLlxuICAgIGxldCByZWFkU3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmlyc3RDaHVua1JlcG9ydGVkID0gZmFsc2U7XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIGNvbm5lY3QgZHVyYXRpb246IHRoZSB3b3JsZC5zdHJlYW1zLmdldCBhd2FpdCAocmVhZFxuICAgIC8vIGRpc3BhdGNoIC0+IHN0cmVhbSBoYW5kbGUgLyByZXNwb25zZSBoZWFkZXJzKS4gU3RhbXBlZCBvbiB0aGVcbiAgICAvLyB3b3JrZmxvdy5zdHJlYW0ucmVhZCBzcGFuIG9uY2UgdGhlIGZpcnN0IGNodW5rIGFycml2ZXMuXG4gICAgbGV0IGNvbm5lY3RNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFJlYWQtY29tcGxldGlvbiBjb3VudGVycyBmb3IgdGhlIHdvcmtmbG93LnN0cmVhbS5yZWFkLmNvbXBsZXRlIHNwYW5cbiAgICAvLyBlbWl0dGVkIHdoZW4gdGhlIHN0cmVhbSBkcmFpbnMuXG4gICAgbGV0IGNodW5rc0RlbGl2ZXJlZCA9IDA7XG4gICAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcbiAgICBzdXBlcih7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5vdCBzdXJlIHdoeSBUeXBlU2NyaXB0IGlzIGNvbXBsYWluaW5nIGFib3V0IHRoaXNcbiAgICAgIHR5cGU6ICdieXRlcycsXG5cbiAgICAgIHB1bGw6IGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIGxldCByZWFkZXIgPSB0aGlzLiNyZWFkZXI7XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgaWYgKHJlYWRTdGFydCA9PT0gdW5kZWZpbmVkKSByZWFkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICAgICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgY29ubmVjdE1zID0gRGF0ZS5ub3coKSAtIGNvbm5lY3RTdGFydDtcbiAgICAgICAgICByZWFkZXIgPSB0aGlzLiNyZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCByZWFkZXInKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgdGhpcy4jcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjaHVua3NEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHNlcnZlciBmbHVzaGVzIGEgbGVhZGluZyB6ZXJvLWxlbmd0aCBjaHVuayAodjMrKSB0byBjb21taXRcbiAgICAgICAgICAvLyByZXNwb25zZSBoZWFkZXJzIGJlZm9yZSBhbnkgZGF0YTsgc2tpcCBlbXB0aWVzIHNvIFRURkMgbWVhc3VyZXMgdG9cbiAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVhbCBjaHVuay5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhZmlyc3RDaHVua1JlcG9ydGVkICYmXG4gICAgICAgICAgICByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGNvbm5lY3RNc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2h1bmtzRGVsaXZlcmVkICs9IDE7XG4gICAgICAgICAgYnl0ZXNEZWxpdmVyZWQgKz0gcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgLy8gRm9yd2FyZCByYXcgYnl0ZXM7IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBpcyBoYW5kbGVkIGF0IHRoZVxuICAgICAgICAgIC8vIGZyYW1pbmcgbGV2ZWwgYnkgZ2V0U2VyaWFsaXplU3RyZWFtL2dldERlc2VyaWFsaXplU3RyZWFtLlxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FuY2VsOiBhc3luYyAocmVhc29uKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZWFkZXIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLiNyZWFkZXIuY2FuY2VsKHJlYXNvbikuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE1heGltdW0gY29uc2VjdXRpdmUgcmVjb25uZWN0IGF0dGVtcHRzIGZvciBhIHNpbmdsZSBmcmFtZWQgc3RyZWFtIHNlc3Npb24uXG4gKiBUaGUgY291bnRlciByZXNldHMgdG8gemVybyB3aGVuZXZlciBhIHJlY29ubmVjdCBtYWtlcyBmb3J3YXJkIHByb2dyZXNzIChhXG4gKiBmcmFtZSBpcyBkZWxpdmVyZWQpLCBzbyB0aGlzIGJvdW5kcyAqY29uc2VjdXRpdmUqIGZhaWx1cmVzLCBub3QgdGhlIGxpZmV0aW1lXG4gKiB0b3RhbDogYSBsb25nLWxpdmVkIHNlcnZlcmxlc3Mgc3RyZWFtIG1heSBsZWdpdGltYXRlbHkgcmVjb25uZWN0IGZhciBtb3JlXG4gKiB0aGFuIHRoaXMgbWFueSB0aW1lcyBhcyBsb25nIGFzIGVhY2ggcmVjb25uZWN0IGtlZXBzIGRlbGl2ZXJpbmcgZGF0YS4gV2Ugb25seVxuICogZ2l2ZSB1cCBhZnRlciB0aGlzIG1hbnkgcmVjb25uZWN0cyBpbiBhIHJvdyBwcm9kdWNlIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTID0gNTA7XG5cbi8qKiBFZmZlY3RpdmUgY29uc2VjdXRpdmUtcmVjb25uZWN0IGNhcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFJlY29ubmVjdHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUycsXG4gICAgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyxcbiAgICB7XG4gICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgbWluOiAxLFxuICAgIH1cbiAgKTtcblxuLyoqXG4gKiBBYnNvbHV0ZSBiYWNrc3RvcCBvbiB0b3RhbCByZWNvbm5lY3RzIGZvciBhIHNpbmdsZSBzZXNzaW9uLCBpbmRlcGVuZGVudCBvZlxuICogcHJvZ3Jlc3MuIFRoZSBjb25zZWN1dGl2ZSBjYXAgYWJvdmUgcmVzZXRzIG9uIGZvcndhcmQgcHJvZ3Jlc3MsIHdoaWNoIGlzXG4gKiBjb3JyZWN0IGZvciBhIHdlbGwtYmVoYXZlZCBiYWNrZW5kIHRoYXQgaG9ub3JzIGBzdGFydEluZGV4YC4gQnV0IGlmIGEgV29ybGQnc1xuICogYHN0cmVhbXMuZ2V0YCBldmVyIGlnbm9yZWQgYHN0YXJ0SW5kZXhgIGFuZCByZS1kZWxpdmVyZWQgZWFybGllciBjaHVua3MsXG4gKiBcInByb2dyZXNzXCIgd291bGQgYmUgcmVwb3J0ZWQgZXZlcnkgcmVjb25uZWN0IGFuZCB0aGUgY29uc2VjdXRpdmUgY2FwIHdvdWxkXG4gKiBuZXZlciB0cmlwLCB0dXJuaW5nIGEgYm91bmRlZCBmYWlsdXJlIGludG8gYW4gdW5ib3VuZGVkIHJlY29ubmVjdCBsb29wLiBUaGlzXG4gKiBoYXJkIGNlaWxpbmcgZ3VhcmFudGVlcyB0aGUgbG9vcCBhbHdheXMgdGVybWluYXRlcy4gSXQgaXMgc2V0IGhpZ2ggZW5vdWdoXG4gKiAoaG91cnMgb2Ygc3RyZWFtaW5nIGF0IHJlYWxpc3RpYyBwZXItc2Vzc2lvbiB0aW1lb3V0cykgdG8gbmV2ZXIgaW50ZXJmZXJlXG4gKiB3aXRoIGxlZ2l0aW1hdGUgbG9uZy1saXZlZCBzdHJlYW1zLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUyA9IDEwMDA7XG5cbi8qKiBFZmZlY3RpdmUgdG90YWwtcmVjb25uZWN0IGJhY2tzdG9wLiBPdmVycmlkZTogYFdPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFNgLiAqL1xuY29uc3QgZ2V0RnJhbWVkU3RyZWFtTWF4VG90YWxSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xuXG4vKipcbiAqIFdyYXBzIHRoZSBsZW5ndGgtcHJlZml4LWZyYW1lZCBieXRlIHN0cmVhbSBmcm9tIGB3b3JsZC5zdHJlYW1zLmdldGAgd2l0aFxuICogdHJhbnNwYXJlbnQgYXV0by1yZWNvbm5lY3QuXG4gKlxuICogRXZlcnkgZnVsbHktZGVjb2RlZCBvdXRlciBmcmFtZSBjb3JyZXNwb25kcyB0byBleGFjdGx5IG9uZSBzZXJ2ZXItc2lkZVxuICogY2h1bmsgKHRoZSBzZXJpYWxpemUgdHJhbnNmb3JtIGVucXVldWVzIG9uZSBmcmFtZSBwZXIgd29ya2Zsb3cgd3JpdGUsIGFuZFxuICogdGhlIHdyaXRhYmxlIGJ1ZmZlcnMgb25lIGZyYW1lIHBlciBjaHVuayB3aGVuIG11bHRpLXdyaXRpbmcpLiBUaGUgd3JhcHBlclxuICogY291bnRzIGNvbXBsZXRlZCBmcmFtZXMgYW5kLCBvbiB1cHN0cmVhbSBlcnJvciwgcmVvcGVucyB0aGUgY29ubmVjdGlvblxuICogd2l0aCBgc3RhcnRJbmRleCA9IHJlc29sdmVkU3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzYC4gUGFydGlhbC1mcmFtZVxuICogYnl0ZXMgYnVmZmVyZWQgYmVmb3JlIHRoZSBjdXQgYXJlIGRpc2NhcmRlZDsgdGhlIHNlcnZlciB3aWxsIHJlc2VuZCB0aGVcbiAqIGluLWZsaWdodCBjaHVuayBpbiBmdWxsIGZyb20gdGhlIG5ldyBzdGFydEluZGV4LlxuICpcbiAqIEEgY2xlYW4gdXBzdHJlYW0gY2xvc2UgKEVPRiB3aXRoIG5vIGVycm9yKSBpcyBOT1QgdHJ1c3RlZCBhcyBjb21wbGV0aW9uXG4gKiBvbiBpdHMgb3duOiBzb21lIHRyYW5zcG9ydCBwYXRocyBub3JtYWxpemUgYSBtaWQtc3RyZWFtIGFib3J0IGludG8gYVxuICogZ3JhY2VmdWwgZW5kIChvYnNlcnZlZCBpbiBwcm9kdWN0aW9uIG9uIFZlcmNlbCByZXNwb25zZSBzdHJlYW1pbmcsIHdoZXJlXG4gKiB0aGUgc2VydmVyJ3MgbWF4LWR1cmF0aW9uIGFib3J0IGFycml2ZXMgYXQgdGhlIGNsaWVudCBhcyBhIGNsZWFuIEVPRikuXG4gKiBPbiBFT0YgdGhlIHdyYXBwZXIgdmVyaWZpZXMgYWdhaW5zdCB0aGUgc3RyZWFtJ3MgYXV0aG9yaXRhdGl2ZSBtZXRhZGF0YVxuICogKGBzdHJlYW1zLmdldEluZm9gKSB0aGF0IHRoZSBzdHJlYW0gaXMgY29tcGxldGUgQU5EIHRoYXQgZXZlcnkgY2h1bmsgdXAgdG9cbiAqIGBkb25lYCB3YXMgZGVsaXZlcmVkOyBvdGhlcndpc2UgaXQgcmVjb25uZWN0cyBmcm9tIHRoZSBuZXh0IGNodW5rIGV4YWN0bHlcbiAqIGxpa2UgYW4gZXJyb3JlZCBjb25uZWN0aW9uLiBJZiB0aGUgbWV0YWRhdGEgcmVhZCBpdHNlbGYgZmFpbHMsIHRoZSBFT0YgaXNcbiAqIHRydXN0ZWQgKGxlZ2FjeSBiZWhhdmlvcikgcmF0aGVyIHRoYW4gZmFpbGluZyBhIHJlYWQgdGhhdCBtYXkgd2VsbCBiZVxuICogY29tcGxldGUuXG4gKlxuICogTmVnYXRpdmUgYHN0YXJ0SW5kZXhgIHZhbHVlcyAobGFzdC1OIHNlbWFudGljcykgc2tpcCB0aGUgcmVjb25uZWN0XG4gKiBtYWNoaW5lcnkgYmVjYXVzZSB3ZSBjYW5ub3QgY29tcHV0ZSBhbiBhYnNvbHV0ZSByZXN1bWUgcG9zaXRpb24gd2l0aG91dFxuICogYSB0YWlsLWluZGV4IGxvb2t1cDsgdGhlIHJldHVybmVkIHN0cmVhbSBiZWhhdmVzIGFzIGEgc2luZ2xlLXNob3QgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyLFxuICBwcmVmZXRjaEVuY3J5cHRpb25LZXk6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gPSBhc3luYyAoKSA9PlxuICAgIHVuZGVmaW5lZFxuKTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICBjb25zdCByZWNvbm5lY3RTdXBwb3J0ZWQgPSBzdGFydEluZGV4ID09PSB1bmRlZmluZWQgfHwgc3RhcnRJbmRleCA+PSAwO1xuICBsZXQgY3VycmVudFN0YXJ0SW5kZXggPSBzdGFydEluZGV4ID8/IDA7XG4gIGxldCBjb25zdW1lZEZyYW1lcyA9IDA7XG4gIGxldCByZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCB0b3RhbFJlY29ubmVjdENvdW50ID0gMDtcbiAgbGV0IHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+IHwgdW5kZWZpbmVkO1xuICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgbGV0IGNhbmNlbFJlYXNvbjogdW5rbm93bjtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZWFkIHRlbGVtZXRyeSAoc2FtZSBzZW1hbnRpY3MgYXMgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSk6XG4gIC8vIGRpc3BhdGNoIHRpbWUsIGZpcnN0LWNvbm5lY3QgZHVyYXRpb24sIGZpcnN0LWZyYW1lIGxhdGNoLCBhbmQgdG90YWxzLlxuICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICBsZXQgY2h1bmtzRGVsaXZlcmVkID0gMDtcbiAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcbiAgbGV0IGtleVByZWZldGNoZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwcmVmZXRjaEtleSgpOiB2b2lkIHtcbiAgICBpZiAoa2V5UHJlZmV0Y2hlZCkgcmV0dXJuO1xuICAgIGtleVByZWZldGNoZWQgPSB0cnVlO1xuICAgIGNvbnN0IGtleVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAvLyBUaGUgcmF3IHN0cmVhbSBhbmQga2V5IGxvb2t1cCBkZWxpYmVyYXRlbHkgcmFjZS4gT2JzZXJ2ZSBhIHNwZWN1bGF0aXZlXG4gICAgLy8gZmFpbHVyZSBoZXJlOiBpZiB0aGUgc3RyZWFtIGlzIGNhbmNlbGxlZCBvciBmYWlscyBiZWZvcmUgYW4gZW5jcnlwdGVkXG4gICAgLy8gZnJhbWUgcmVhY2hlcyB0aGUgZGVzZXJpYWxpemUgdHJhbnNmb3JtLCB0aGlzIHByb21pc2Ugb3RoZXJ3aXNlIGhhcyBub1xuICAgIC8vIGNvbnN1bWVyIGFuZCB3b3VsZCBiZWNvbWUgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi4gVGhlIHRyYW5zZm9ybSBzdGlsbFxuICAgIC8vIGF3YWl0cyB0aGUgc2FtZSBwcm9taXNlIGFuZCBzdXJmYWNlcyB0aGUgb3JpZ2luYWwgZXJyb3Igb24gY29uc3VtcHRpb24uXG4gICAgdm9pZCBwcmVmZXRjaEVuY3J5cHRpb25LZXkoKS50aGVuKFxuICAgICAgKGtleSkgPT4ge1xuICAgICAgICAvLyBVbmVuY3J5cHRlZCBydW5zIGRvIG5vdCBuZWVkIGEga2V5LXJlc29sdXRpb24gc3Bhbi4gVGhlaXIgcmVzb2x2ZXJcbiAgICAgICAgLy8gc3RpbGwgcnVucyBzcGVjdWxhdGl2ZWx5IHNvIGFuIGVuY3J5cHRlZCBmcmFtZSBjYW4gam9pbiBpdC5cbiAgICAgICAgaWYgKGtleSkgcmVjb3JkU3RyZWFtUmVhZEtleVJlc29sdXRpb24oa2V5U3RhcnQsIHJ1bklkLCBuYW1lLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiByZWNvcmRTdHJlYW1SZWFkS2V5UmVzb2x1dGlvbihrZXlTdGFydCwgcnVuSWQsIG5hbWUsIGZhbHNlKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjb25uZWN0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgaWYgKGNhbmNlbGVkKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZWZmZWN0aXZlU3RhcnRJbmRleCA9IHJlY29ubmVjdFN1cHBvcnRlZFxuICAgICAgPyBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgZWZmZWN0aXZlU3RhcnRJbmRleCk7XG4gICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICBhd2FpdCBzdHJlYW0uY2FuY2VsKGNhbmNlbFJlYXNvbikuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29ubmVjdE1zID09PSB1bmRlZmluZWQpIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gdXBzdHJlYW0gRU9GIHJlcHJlc2VudHMgZ2VudWluZSBjb21wbGV0aW9uOiB0aGUgc3RyZWFtJ3NcbiAgICogYXV0aG9yaXRhdGl2ZSBtZXRhZGF0YSBzYXlzIGl0IGlzIGRvbmUgQU5EIHRoZSBmcmFtZXMgZGVsaXZlcmVkIHNvIGZhclxuICAgKiBjb3ZlciBldmVyeSBjaHVuayB1cCB0byB0aGUgdGFpbCAob25lIG91dGVyIGZyYW1lID09IG9uZSBzZXJ2ZXIgY2h1bmspLlxuICAgKiBBIG1ldGFkYXRhIGZhaWx1cmUgdHJ1c3RzIHRoZSBFT0YsIHNpbmNlIHR1cm5pbmcgYSBoZWFsdGh5IGNvbXBsZXRpb25cbiAgICogaW50byBhbiBlcnJvciAob3IgYSByZWNvbm5lY3QgbG9vcCkgb24gYSB0cmFuc2llbnQgbWV0YWRhdGEgYmxpcCB3b3VsZFxuICAgKiBiZSB3b3JzZSB0aGFuIHRoZSBsZWdhY3kgYmVoYXZpb3IgdGhpcyBjaGVjayBndWFyZHMgYWdhaW5zdC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGlzVmVyaWZpZWRDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldEluZm8ocnVuSWQsIG5hbWUpO1xuICAgICAgcmV0dXJuIGluZm8uZG9uZSAmJiBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzID4gaW5mby50YWlsSW5kZXg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWNvbm5lY3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGNhbmNlbGVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJlYWRlcikge1xuICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGNhbmNlbGVkKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gQWR2YW5jZSB0aGUgcmVzdW1lIHBvc2l0aW9uIHBhc3QgdGhlIGZyYW1lcyBhbHJlYWR5IGRlbGl2ZXJlZCwgdGhlblxuICAgIC8vIGRyb3AgYW55IHBhcnRpYWwtZnJhbWUgYnl0ZXM6IHRoZSByZW9wZW5lZCBjb25uZWN0aW9uIHJlLXNlbmRzIGZyb20gYVxuICAgIC8vIGZyYW1lIGJvdW5kYXJ5IGF0IHRoZSBuZXcgaW5kZXguXG4gICAgY3VycmVudFN0YXJ0SW5kZXggKz0gY29uc3VtZWRGcmFtZXM7XG4gICAgY29uc3VtZWRGcmFtZXMgPSAwO1xuICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gICAgLy8gUmV0cnkgdGhlIHJlb3BlbiBpdHNlbGYgYWdhaW5zdCB0aGUgcmVjb25uZWN0IGJ1ZGdldC4gQSB0cmFuc2llbnRcbiAgICAvLyBmYWlsdXJlIG9mIGNvbm5lY3QoKSAodGhlIHNlcnZlciBicmllZmx5IHVuYXZhaWxhYmxlIGR1cmluZyB0aGVcbiAgICAvLyByZWNvbm5lY3Qgd2luZG93KSBpcyB0aGUgZXhhY3QgYmxpcCB0aGlzIHdyYXBwZXIgZXhpc3RzIHRvIHN1cnZpdmUsIHNvXG4gICAgLy8gY291bnQgaXQgYWdhaW5zdCB0aGUgYnVkZ2V0IGFuZCB0cnkgYWdhaW4gcmF0aGVyIHRoYW4gdHJlYXRpbmcgaXQgYXNcbiAgICAvLyBmYXRhbC4gT25seSBidWRnZXQgZXhoYXVzdGlvbiAoYSBzZXJ2ZXIgdGhhdCBzdGF5cyBkb3duKSB0ZXJtaW5hdGVzIHRoZVxuICAgIC8vIHN0cmVhbS5cbiAgICBjb25zdCBtYXhSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cygpO1xuICAgIGNvbnN0IG1heFRvdGFsUmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cygpO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHJlY29ubmVjdENvdW50Kys7XG4gICAgICB0b3RhbFJlY29ubmVjdENvdW50Kys7XG4gICAgICBpZiAocmVjb25uZWN0Q291bnQgPiBtYXhSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbFJlY29ubmVjdENvdW50ID4gbWF4VG90YWxSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gdG90YWwgcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFRvdGFsUmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgY29ubmVjdCgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBSZXRlbnRpb24gZXhwaXJ5IGlzIHRlcm1pbmFsIGFuZCByZXRyeWluZyBjYW5ub3QgcmVzdG9yZSB0aGUgc3RyZWFtLlxuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgdHlwZWQgZXJyb3IgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB0dXJuaW5nIG9uZSA0MTAgaW50b1xuICAgICAgICAvLyA1MCByZWNvbm5lY3QgYXR0ZW1wdHMgYW5kIGEgZ2VuZXJpYyBidWRnZXQtZXhoYXVzdGlvbiBlcnJvci5cbiAgICAgICAgaWYgKFN0cmVhbUV4cGlyZWRFcnJvci5pcyhlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAvLyBSZW9wZW4gZmFpbGVkIHRyYW5zaWVudGx5OyBsb29wIHRvIHJldHJ5LCBjb3VudGluZyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBidWRnZXQgc28gYSBzZXJ2ZXIgdGhhdCBuZXZlciByZWNvdmVycyBzdGlsbCB0ZXJtaW5hdGVzIHRoZSBzdHJlYW0uXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgaWYgKHJlYWRTdGFydCA9PT0gdW5kZWZpbmVkKSByZWFkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgLy8gQmVnaW4gcmVzb2x2aW5nIHRoZSBrZXkgYmVmb3JlIGF3YWl0aW5nIHN0cmVhbXMuZ2V0KCkvdGhlIGZpcnN0IHJhd1xuICAgICAgLy8gZnJhbWUuIFRoaXMgaXMgaW50ZW50aW9uYWxseSBub3QgYXdhaXRlZDogYnVmZmVyZWQgcmF3IGZyYW1lcyByZW1haW5cbiAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIFdlYiBTdHJlYW1zIGJhY2twcmVzc3VyZSBjaGFpbiB3aGlsZSB0aGUgZGVzZXJpYWxpemVcbiAgICAgIC8vIHRyYW5zZm9ybSBqb2lucyB0aGlzIHByb21pc2Ugb25seSBpZiBhbiBlbmNyeXB0ZWQgZnJhbWUgbmVlZHMgaXQuXG4gICAgICBwcmVmZXRjaEtleSgpO1xuICAgICAgLy8gTG9vcCB1bnRpbCB3ZSBlbWl0IHNvbWV0aGluZywgaGl0IEVPRiwgb3IgZmF0YWxseSBlcnJvci4gUmVhZHMgdGhhdFxuICAgICAgLy8gb25seSBleHRlbmQgdGhlIGluLWZsaWdodC1mcmFtZSBidWZmZXIgZG9uJ3QgZW5xdWV1ZSBhbnl0aGluZzsgd2VcbiAgICAgIC8vIGtlZXAgcmVhZGluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgZW1wdHktaGFuZGVkLlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBjb25uZWN0KCkpKSByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0OiB7IGRvbmU6IGJvb2xlYW47IHZhbHVlPzogVWludDhBcnJheSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogY29ubmVjdCgpIGd1YXJhbnRlZXMgcmVhZGVyXG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZGVyIS5yZWFkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghcmVjb25uZWN0U3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCByZWNvbm5lY3QoKSkpIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChyZWNvbm5lY3RFcnIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IocmVjb25uZWN0RXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lIHx8ICFyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgLy8gQSBjbGVhbiBFT0YgaXMgb25seSB0cnVzdHdvcnRoeSBpZiB0aGUgc3RyZWFtIGlzIGFjdHVhbGx5XG4gICAgICAgICAgLy8gY29tcGxldGUgYW5kIHRoaXMgc2Vzc2lvbiBkZWxpdmVyZWQgZXZlcnkgY2h1bmsgdXAgdG8gYGRvbmVgLlxuICAgICAgICAgIC8vIEluZnJhc3RydWN0dXJlIGNhbiBub3JtYWxpemUgYSBtaWQtc3RyZWFtIGFib3J0IGludG8gYSBncmFjZWZ1bFxuICAgICAgICAgIC8vIGVuZCAodGhlIHNlcnZlcidzIG1heC1kdXJhdGlvbiBjdXQgaXMgZGVzaWduZWQgdG8gYXJyaXZlIGFzIGFuXG4gICAgICAgICAgLy8gZXJyb3JlZCBib2R5LCBidXQgb24gc29tZSBwYXRocyBpdCByZWFjaGVzIHRoZSBjbGllbnQgYXMgYSBjbGVhblxuICAgICAgICAgIC8vIEVPRiksIGFuZCBhIGNvbXBsZXRlZCBzdHJlYW0gY2FuIHN0aWxsIGJlIGN1dCBtaWQtYm9keTsgYm90aFxuICAgICAgICAgIC8vIHdvdWxkIG90aGVyd2lzZSBiZSBzaWxlbnRseSByZWFkIGFzIGEgc2hvcnRlciwgY29tcGxldGUgc3RyZWFtLlxuICAgICAgICAgIGNvbnN0IHZlcmlmaWVkQ29tcGxldGUgPVxuICAgICAgICAgICAgIXJlY29ubmVjdFN1cHBvcnRlZCB8fCAoYXdhaXQgaXNWZXJpZmllZENvbXBsZXRlKCkpO1xuICAgICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghdmVyaWZpZWRDb21wbGV0ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgcmVjb25uZWN0KCkpKSByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChyZWNvbm5lY3RFcnIpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihyZWNvbm5lY3RFcnIpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gR2VudWluZSBlbmQtb2Ytc3RyZWFtLiBEcm9wIGFueSBwYXJ0aWFsLWZyYW1lIGJ5dGVzICh0aGVyZVxuICAgICAgICAgIC8vIHNob3VsZG4ndCBiZSBhbnk7IGEgd2VsbC1mb3JtZWQgc3RyZWFtIGVuZHMgb24gYSBmcmFtZSBib3VuZGFyeSkuXG4gICAgICAgICAgaWYgKHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgYnl0ZXNEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIHRvdGFsUmVjb25uZWN0Q291bnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgdG8gYnVmZmVyIGFuZCBlbWl0IGFsbCBjb21wbGV0ZSBmcmFtZXMuXG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAoaW5jb21pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGluY29taW5nLmxlbmd0aCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGluY29taW5nLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICBidWZmZXIgPSBjb21iaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG4gICAgICAgICAgLy8gRm9yd2FyZCB0aGUgZW50aXJlIGZyYW1lZCBjaHVuayAoaGVhZGVyICsgcGF5bG9hZCkgdG8gdGhlXG4gICAgICAgICAgLy8gZG93bnN0cmVhbSBkZXNlcmlhbGl6ZXIsIHdoaWNoIGFscmVhZHkgZXhwZWN0cyB0aGlzIGxheW91dC5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKDAsIHRvdGFsKSk7XG4gICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgICAgICBjb25zdW1lZEZyYW1lcysrO1xuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCsrO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHRvdGFsO1xuICAgICAgICAgIGlmICghZmlyc3RDaHVua1JlcG9ydGVkICYmIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGNvbm5lY3RNc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdHRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1pdHRlZCkge1xuICAgICAgICAgIC8vIEZvcndhcmQgcHJvZ3Jlc3Mgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbjogY2xlYXIgdGhlXG4gICAgICAgICAgLy8gY29uc2VjdXRpdmUtZmFpbHVyZSBidWRnZXQgc28gYSBsb25nIHN0cmVhbSB0aGF0IHJlY29ubmVjdHNcbiAgICAgICAgICAvLyBtYW55IHRpbWVzIChidXQga2VlcHMgZGVsaXZlcmluZykgaXMgbmV2ZXIgZmFsc2VseSBjYXBwZWQuXG4gICAgICAgICAgcmVjb25uZWN0Q291bnQgPSAwO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IHBhcnRpYWwgYnl0ZXM6IHJlYWQgbW9yZS5cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgY2FuY2VsUmVhc29uID0gcmVhc29uO1xuICAgICAgY29uc3QgY3VycmVudFJlYWRlciA9IHJlYWRlcjtcbiAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjdXJyZW50UmVhZGVyKSB7XG4gICAgICAgIGF3YWl0IGN1cnJlbnRSZWFkZXIuY2FuY2VsKHJlYXNvbikuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgY2xvc2luZyBSZWFkYWJsZVN0cmVhbSByZWFkZXI6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBncm91cC1jb21taXQgd2luZG93IGZvciB0aGUgTEVBRElORyBjaHVuayBvZiBhbiBpZGxlIHN0cmVhbS5cbiAqXG4gKiAwID0gZGlzcGF0Y2ggdGhlIGZpcnN0IGNodW5rIGltbWVkaWF0ZWx5LiBNZWFzdXJlZCBwcm9kdWN0aW9uIHByb2R1Y2VyXG4gKiByYXRlcyAobW9zdCBhZ2VudHM6IH4xLjIgY2h1bmtzIHBlciBmbHVzaCwgPjcwJSBvZiBjaHVua3MgYXJyaXZpbmcgbW9yZVxuICogdGhhbiAxMG1zIGFmdGVyIHRoZSBwcmV2aW91cyByZXF1ZXN0IGFscmVhZHkgZmluaXNoZWQpIHNob3cgYSBmaXhlZFxuICogbGVhZGluZy1lZGdlIHdpbmRvdyB0YXhlcyBpc29sYXRlZC1jaHVuayBkZWxpdmVyeSAofisyMCUgb24gYSB+NTBtcyBSVFQpXG4gKiB3aGlsZSBiYXRjaGluZyBhbG1vc3Qgbm90aGluZyBmb3Igc2xvdyBwcm9kdWNlcnM7IGZhc3QgcHJvZHVjZXJzIGdldFxuICogdGhlaXIgYmF0Y2hpbmcgZnJvbSBpbi1mbGlnaHQgYWNjdW11bGF0aW9uIHJlZ2FyZGxlc3MuIFNldHRpbmcgYSBwb3NpdGl2ZVxuICogaW50ZXJ2YWwgKGVudiBvciBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYCkgb3B0cyBhIGRlcGxveW1lbnQgaW50b1xuICogd2luZG93ZWQgbGVhZGluZy1lZGdlIGJhdGNoaW5nLCB0cmFkaW5nIGZpcnN0LWNodW5rIGxhdGVuY3kgZm9yIGxhcmdlclxuICogZ3JvdXBzLlxuICovXG5jb25zdCBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMgPSAwO1xuXG4vKipcbiAqIGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLCB3aGVuIHNldCwgb3ZlcnJpZGVzXG4gKiBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYDsgd2hlbiB1bnNldCB0aGUgV29ybGQgb3B0aW9uIChvciB0aGVcbiAqIGRlZmF1bHQpIGdvdmVybnMuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIHVuc2V0L2ludmFsaWQgdmFsdWVzIHNvIHRoZVxuICogY2FsbGVyIGNhbiBmYWxsIHRocm91Z2ggdG8gdGhlIFdvcmxkIG9wdGlvbi5cbiAqL1xuY29uc3QgZ2V0RW52U3RyZWFtRmx1c2hJbnRlcnZhbE1zID0gKCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMnLCBOdW1iZXIuTmFOLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG59O1xuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBzcGFuIGZvciBvbmUgZmx1c2hlZCBiYXRjaCBvZiBzdHJlYW0gd3JpdGVzOiBmaXJzdFxuICogYHdyaXRlKClgIG9mIHRoZSBiYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgc2VydmVyIHdyaXRlIHNldHRsaW5nLiBUaGVcbiAqIHNwYW4ncyBkdXJhdGlvbiBpcyB0aGVyZWZvcmUgdGhlIGFwcC1wZXJjZWl2ZWQgbGF0ZW5jeSBvZiB0aGUgYmF0Y2hcbiAqIChidWZmZXIgZHdlbGwgKyBiYWNrcHJlc3N1cmUgKyBSUEMpOyBgYnVmZmVyX2R3ZWxsX21zYCBpc29sYXRlcyB0aGVcbiAqIHByZS1kaXNwYXRjaCBzaGFyZSBzbyBjbGllbnQtc2lkZSBiYXRjaGluZyBjb3N0IGNhbiBiZSB0b2xkIGFwYXJ0IGZyb21cbiAqIG5ldHdvcmsvc2VydmVyIHRpbWUuIE5hbWVkIGB3b3JrZmxvdy5zdHJlYW0uZmx1c2hgOyB0aGUgcGVyLXJlcXVlc3QgUlBDXG4gKiBiZW5lYXRoIGl0IGlzIHdvcmxkLXZlcmNlbCdzIGB3b3JrZmxvdy5zdHJlYW0ud3JpdGVgIHNwYW4gKGNodW5rX3J0dCksIGFuZFxuICogdGhlIHR3byBtdXN0IHN0YXkgZGlzdGluZ3Vpc2hhYmxlLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIGRpc3BhdGNoRXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJwY01zOiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5mbHVzaCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2ZsdXNoJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5idWZmZXJfZHdlbGxfbXMnOiBkaXNwYXRjaEVwb2NoTXMgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5ieXRlcyc6IGJ5dGVDb3VudCxcbiAgICAgICAgLy8gQ2xpZW50LW9ic2VydmVkIFdvcmxkIHdyaXRlIFJQQyBkdXJhdGlvbiAobmV0d29yayBob3AgaW5jbHVkZWQpLlxuICAgICAgICAvLyBTYW1lIGtleSBhcyB3b3JsZC12ZXJjZWwncyBwZXItcmVxdWVzdCBzcGFuIGF0dHJpYnV0ZSBzbyBxdWVyaWVzXG4gICAgICAgIC8vIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGljaCBsYXllciBlbWl0dGVkIGl0LlxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLndyaXRlLmNodW5rX3J0dCc6IHJwY01zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgc3BhbiBmb3IgdGhlIHN0cmVhbS1jbG9zZSBSUEM6IGl0cyBkdXJhdGlvbiBpcyB0aGVcbiAqIGB3b3JsZC5zdHJlYW1zLmNsb3NlYCByb3VuZCB0cmlwIChuZXR3b3JrIGhvcCBpbmNsdWRlZCkuIEZpcmUtYW5kLWZvcmdldDtcbiAqIG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtQ2xvc2UoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5jbG9zZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2Nsb3NlJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5jbG9zZS5ycGNfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gZXh0ZW5kcyBXcml0YWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcnVuUmVhZHlCYXJyaWVyIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGVcbiAgICogYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZC4gV2hlbiB0aGUgc3RlcCBib2R5IHJ1bnNcbiAgICogb3B0aW1pc3RpY2FsbHkgKGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzIGR1cmFibGUpLCB0aGUgZmlyc3QgY2h1bmsgd3JpdGUgdG9cbiAgICogYSBicmFuZC1uZXcgc3RyZWFtIHdvdWxkIG90aGVyd2lzZSByZWFjaCB0aGUgV29ybGQgYmVmb3JlIHRoZSBydW4gZXhpc3RzXG4gICAqIGFuZCBiZSByZWplY3RlZCBhcyBydW4tbm90LWZvdW5kLiBBd2FpdGluZyB0aGlzIG9uY2UgYmVmb3JlIHRoZSBmaXJzdFxuICAgKiBmbHVzaC9jbG9zZSBvcmRlcnMgdGhlIHdyaXRlIGFmdGVyIHRoZSBydW4ncyBjcmVhdGlvbi4gYHVuZGVmaW5lZGAgb3V0c2lkZVxuICAgKiB0dXJibyBhbmQgb24gdGhlIGF3YWl0IHBhdGgsIHdoZXJlIHRoZSBydW4gd2FzIGFscmVhZHkgZHVyYWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPikge1xuICAgIGlmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBcInJ1bklkXCIgbXVzdCBiZSBhIHN0cmluZywgZ290IFwiJHt0eXBlb2YgcnVuSWR9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAvLyBIb2xkIHRoZSBmaXJzdCBzZXJ2ZXIgd3JpdGUgdW50aWwgdGhlIHJ1biBleGlzdHMgKHR1cmJvIG9wdGltaXN0aWNcbiAgICAvLyBzdGFydCkuIEF3YWl0ZWQgb25jZSwgdGhlbiBjbGVhcmVkIHNvIGxhdGVyIGZsdXNoZXMgcGF5IG5vdGhpbmcuIFRoZVxuICAgIC8vIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHkgZmFpbGVkXG4gICAgLy8gdGhlIHJ1biBkb2VzIG5vdCBleGlzdCwgc28gdGhlIHdyaXRlIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yLlxuICAgIGxldCBwZW5kaW5nUnVuUmVhZHk6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQgPSBydW5SZWFkeUJhcnJpZXI7XG4gICAgY29uc3QgZW5zdXJlUnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAocGVuZGluZ1J1blJlYWR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcGVuZGluZ1J1blJlYWR5O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ1J1blJlYWR5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBPbmUgc3RhYmxlIGlkZW50aXR5IGFuZCBzZXF1ZW5jZSBzcGFjZSBwZXIgaW4tbWVtb3J5IHNpbmsuIFN0YXJ0IHNlc3Npb25cbiAgICAvLyBjb25zdHJ1Y3Rpb24gYXMgc29vbiBhcyB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgcGVybWl0cywgc28gdHJhbnNwb3J0cyBtYXlcbiAgICAvLyBuZWdvdGlhdGUgZWFnZXJseSB3aXRob3V0IGFsbG93aW5nIGEgd3JpdGUgdG8gb3ZlcnRha2UgcnVuIGNyZWF0aW9uLlxuICAgIC8vIFRoaXMgZWFnZXIgY2hhaW4gY2Fubm90IHN0cmFuZCBhIG5ldyByZWplY3Rpb246IGVuc3VyZVJ1blJlYWR5IGFic29yYnMgaXRzXG4gICAgLy8gb3JkZXJpbmctb25seSBmYWlsdXJlLCBhbmQgZXZlcnkgcGF0aCB0aGF0IGNhbiBvYnNlcnZlIHdvcmxkUHJvbWlzZSBhbHNvXG4gICAgLy8gYXdhaXRzIHRoaXMgc2Vzc2lvbiBwcm9taXNlIGJlZm9yZSBpdCB3cml0ZXMsIGNsb3Nlcywgb3IgZGlzcG9zZXMuXG4gICAgY29uc3Qgd3JpdGVySWQgPSBgd3J0cl8ke2RlZmF1bHRVbGlkKCl9YCBhcyBjb25zdDtcbiAgICBjb25zdCB3cml0ZVNlc3Npb25Qcm9taXNlOiBQcm9taXNlPFN0cmVhbVdyaXRlU2Vzc2lvbiB8IHVuZGVmaW5lZD4gPVxuICAgICAgZW5zdXJlUnVuUmVhZHkoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAgIHJldHVybiB3b3JsZC5zdHJlYW1zLmNyZWF0ZVdyaXRlU2Vzc2lvbj8uKHJ1bklkLCBuYW1lLCB7IHdyaXRlcklkIH0pO1xuICAgICAgfSk7XG4gICAgbGV0IG5leHRDaHVua1NlcSA9IDA7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBHcm91cC1jb21taXQgYnVmZmVyaW5nLlxuICAgIC8vXG4gICAgLy8gYHdyaXRlKClgIHJlc29sdmVzIGFzIHNvb24gYXMgdGhlIGNodW5rIGVudGVycyB0aGlzIGJvdW5kZWQgYnVmZmVyLFxuICAgIC8vIE5PVCB3aGVuIGl0IGlzIGR1cmFibGUuIFRoYXQgaXMgdGhlIHByb3BlcnR5IHRoYXQgbWFrZXMgYmF0Y2hpbmdcbiAgICAvLyBwYXRoLWluZGVwZW5kZW50OiBhIG5hdGl2ZSBgcmVhZGFibGUucGlwZVRvKHNlcnZlcldyaXRhYmxlKWAgcHVsbHMgdGhlXG4gICAgLy8gbmV4dCBjaHVuayB0aGUgbW9tZW50IGB3cml0ZSgpYCByZXNvbHZlcywgc28gY2h1bmtzIGFjY3VtdWxhdGUgaGVyZVxuICAgIC8vIGR1cmluZyB0aGUgZmx1c2gtdGltZXIgd2luZG93IGFuZCB3aGlsZSBhIHNlcnZlciByZXF1ZXN0IGlzIGluXG4gICAgLy8gZmxpZ2h0LCBhbmQgZWFjaCBhY2N1bXVsYXRlZCBncm91cCBnb2VzIG91dCBhcyBvbmUgYHdyaXRlTXVsdGlgLlxuICAgIC8vIChQcmV2aW91c2x5IGB3cml0ZSgpYCByZXNvbHZlZCBvbmx5IGFmdGVyIHRoZSB0aW1lciBBTkQgdGhlIHNlcnZlclxuICAgIC8vIHJvdW5kIHRyaXAsIHNvIG5hdGl2ZSBwaXBpbmcgc2VyaWFsaXplZCB0byBvbmUgcmVxdWVzdCBwZXIgY2h1bmsgYW5kXG4gICAgLy8gYmF0Y2hpbmcgb25seSB3b3JrZWQgdGhyb3VnaCBgZmx1c2hhYmxlUGlwZWAncyBiZXNwb2tlIGNvYWxlc2NpbmcuKVxuICAgIC8vXG4gICAgLy8gRHVyYWJpbGl0eSBoYXMgYSBkZWRpY2F0ZWQgYmFycmllciBpbnN0ZWFkOiBgZHJhaW4oKWAgKGV4cG9zZWQgdmlhXG4gICAgLy8ge0BsaW5rIFNUUkVBTV9EUkFJTl9TWU1CT0x9KSByZXNvbHZlcyBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eVxuICAgIC8vIGFuZCBubyByZXF1ZXN0IGlzIGluIGZsaWdodC4gYGNsb3NlKClgIGF3YWl0cyBpdCBiZWZvcmUgY2xvc2luZyB0aGVcbiAgICAvLyBzZXJ2ZXIgc3RyZWFtLCBhbmQgdGhlIGZsdXNoYWJsZS1zdHJlYW0gbG9jay1yZWxlYXNlIGNvbXBsZXRpb25cbiAgICAvLyBhd2FpdHMgaXQgYmVmb3JlIGxldHRpbmcgYSBzdGVwIGZpbmlzaCwgc28gXCJzdGVwIGNvbXBsZXRlZFwiIHN0aWxsXG4gICAgLy8gaW1wbGllcyBcInN0cmVhbSBkYXRhIGR1cmFibGVcIiwgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgLy9cbiAgICAvLyBFbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGUgZnJhbWluZyBsZXZlbCBieVxuICAgIC8vIGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbSwgbm90IGhlcmUuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheVtdID0gW107XG4gICAgbGV0IGJ1ZmZlckJ5dGVzID0gMDtcbiAgICAvLyBUaGUgZ3JvdXAgY3VycmVudGx5IGluc2lkZSBhIHNlcnZlciByZXF1ZXN0LiBDb3VudGVkIGFnYWluc3QgdGhlXG4gICAgLy8gYnVmZmVyIGJvdW5kIHNvIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2Aga2VlcHMgaXRzXG4gICAgLy8gZG9jdW1lbnRlZCBtZWFuaW5nIChhbiB1cHBlciBib3VuZCBhY3Jvc3MgQUxMIHJlYWQtYnV0LW5vdC1kdXJhYmxlXG4gICAgLy8gY2h1bmtzKSwgbm90IGp1c3QgdGhlIHF1ZXVlZCBmb2xsb3ctdXAgZ3JvdXAuXG4gICAgbGV0IGluRmxpZ2h0Q2h1bmtzID0gMDtcbiAgICBsZXQgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgbGV0IGZsdXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqIFRoZSBpbi1mbGlnaHQgZGlzcGF0Y2ggY2hhaW4uIEF0IG1vc3Qgb25lLCBwcmVzZXJ2aW5nIGNodW5rIG9yZGVyLiAqL1xuICAgIGxldCBpbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0aWNreSBmYWlsdXJlOiBvbmNlIGEgZGlzcGF0Y2ggZmFpbHMsIHRoZSBmYWlsZWQgZ3JvdXAgaXMgcmUtcXVldWVkXG4gICAgICogKHJldGFpbmVkLCBleGFjdGx5IGFzIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiByZXRhaW5lZCBpdHMgYnVmZmVyKVxuICAgICAqIGFuZCBldmVyeSBzdWJzZXF1ZW50IGB3cml0ZSgpYCwgYGNsb3NlKClgIGFuZCBgZHJhaW4oKWAgcmVqZWN0cyB3aXRoXG4gICAgICogdGhlIG9yaWdpbmFsIGVycm9yLiBDaHVua3Mgd2hvc2UgYHdyaXRlKClgIGFscmVhZHkgcmVzb2x2ZWQgc3VyZmFjZVxuICAgICAqIHRoZWlyIGZhaWx1cmUgYXQgdGhlIGR1cmFiaWxpdHkgYmFycmllcjogdGhhdCBpcyB0aGUgY29udHJhY3Qgb2YgYW5cbiAgICAgKiBlYXJseS1hY2sgc2luay5cbiAgICAgKi9cbiAgICBsZXQgc2lua0Vycm9yOiB1bmtub3duO1xuICAgIC8vIEdyb3VwLWNvbW1pdCB3aW5kb3cuIFRoZSBlbnYgdmFyLCB3aGVuIHNldCwgb3ZlcnJpZGVzIHRoZSBXb3JsZFxuICAgIC8vIG9wdGlvbjsgb3RoZXJ3aXNlIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgIGdvdmVybnMgKGRlZmF1bHQgMCksXG4gICAgLy8gaW5jbHVkaW5nIHRoZSBmaXJzdCBjaHVuay4gV2hlbiBpdCBtdXN0IGNvbWUgZnJvbSB0aGUgd29ybGQsXG4gICAgLy8gYHNjaGVkdWxlR3JvdXBDb21taXRgIHdhaXRzIGZvciBgd29ybGRQcm9taXNlYCBiZWZvcmUgZGVjaWRpbmcsIHdoaWNoXG4gICAgLy8gY29zdHMgbm90aGluZzogbm8gcmVxdWVzdCBjYW4gbGVhdmUgYmVmb3JlIGBzZW5kR3JvdXBgJ3Mgb3duIHdvcmxkXG4gICAgLy8gYXdhaXQgZWl0aGVyLlxuICAgIGxldCByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9IGdldEVudlN0cmVhbUZsdXNoSW50ZXJ2YWxNcygpO1xuICAgIGxldCBfZmx1c2hJbnRlcnZhbFJlc29sdXRpb246IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICAvLyBQZXItcmVxdWVzdCB3aXJlIGxpbWl0cyAoc2VydmVyIGNhcHMpIGFuZCB0aGUgYnVmZmVyIGJvdW5kLiBUaGUgYm91bmRcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGtub2JzIHRoZSBjb2FsZXNjaW5nIHBpcGUgdXNlZCwgc28gcHJvZHVjZXIgYmFja3ByZXNzdXJlXG4gICAgLy8gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkOiBvbmNlIGEgcmVxdWVzdC13b3J0aCBvZiBjaHVua3MgKG9yIHRoZSBieXRlXG4gICAgLy8gYm91bmQpIGlzIGJ1ZmZlcmVkLCBgd3JpdGUoKWAgYmxvY2tzIHVudGlsIGEgZ3JvdXAgbGFuZHMgZHVyYWJseS5cbiAgICBjb25zdCBtYXhDaHVua3NQZXJSZXF1ZXN0ID0gZ2V0TWF4Q2h1bmtzUGVyQmF0Y2goKTtcbiAgICBjb25zdCBtYXhCeXRlc1BlclJlcXVlc3QgPSBnZXRNYXhCeXRlc1BlckJhdGNoKCk7XG4gICAgY29uc3QgbWF4QnVmZmVyZWRDaHVua3MgPSBnZXRNYXhJbmZsaWdodENodW5rcygpO1xuICAgIGNvbnN0IG1heEJ1ZmZlcmVkQnl0ZXMgPSBnZXRNYXhCdWZmZXJlZEJ5dGVzKCk7XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHdyaXRlLWJhdGNoIHRpbWluZzogc3RhbXBlZCB3aGVuIHRoZSBidWZmZXIgZ29lc1xuICAgIC8vIGVtcHR54oaSbm9uLWVtcHR5LCBjb25zdW1lZCBieSB0aGUgZ3JvdXAgdGhhdCBjYXJyaWVzIHRoYXQgY2h1bmsgb3V0LlxuICAgIGxldCBidWZmZXJUMDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgdHlwZSBXYWl0ZXIgPSB7IHJlc29sdmU6ICgpID0+IHZvaWQ7IHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZCB9O1xuICAgIC8qKiB3cml0ZSgpIGNhbGxzIGJsb2NrZWQgb24gdGhlIGJ1ZmZlciBib3VuZC4gKi9cbiAgICBsZXQgY2FwYWNpdHlXYWl0ZXJzOiBXYWl0ZXJbXSA9IFtdO1xuICAgIC8qKiBkcmFpbigpIGNhbGxzIHdhaXRpbmcgZm9yIGZ1bGwgZHVyYWJpbGl0eS4gKi9cbiAgICBsZXQgZHJhaW5XYWl0ZXJzOiBXYWl0ZXJbXSA9IFtdO1xuXG4gICAgY29uc3QgcmVqZWN0V2FpdGVycyA9IChlcnI6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFsbCA9IFsuLi5jYXBhY2l0eVdhaXRlcnMsIC4uLmRyYWluV2FpdGVyc107XG4gICAgICBjYXBhY2l0eVdhaXRlcnMgPSBbXTtcbiAgICAgIGRyYWluV2FpdGVycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB3IG9mIGFsbCkgdy5yZWplY3QoZXJyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGFrZSB0aGUgbGFyZ2VzdCBsZWFkaW5nIGdyb3VwIHRoYXQgZml0cyBvbmUgcmVxdWVzdDogYXQgbW9zdFxuICAgICAqIGBtYXhDaHVua3NQZXJSZXF1ZXN0YCBjaHVua3MgYW5kIGBtYXhCeXRlc1BlclJlcXVlc3RgIGN1bXVsYXRpdmUgYnl0ZXNcbiAgICAgKiAoYSBzaW5nbGUgb3ZlcnNpemVkIGNodW5rIHN0aWxsIGdvZXMgb3V0IGFsb25lKS5cbiAgICAgKi9cbiAgICBjb25zdCB0YWtlR3JvdXAgPSAoKTogeyBncm91cDogVWludDhBcnJheVtdOyBieXRlczogbnVtYmVyIH0gPT4ge1xuICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgIGxldCBieXRlcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ1ZmZlcikge1xuICAgICAgICBpZiAoY291bnQgPj0gbWF4Q2h1bmtzUGVyUmVxdWVzdCkgYnJlYWs7XG4gICAgICAgIGlmIChjb3VudCA+IDAgJiYgYnl0ZXMgKyBjaHVuay5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXNQZXJSZXF1ZXN0KSBicmVhaztcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgYnl0ZXMgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdyb3VwID0gYnVmZmVyLnNsaWNlKDAsIGNvdW50KTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShjb3VudCk7XG4gICAgICBidWZmZXJCeXRlcyAtPSBieXRlcztcbiAgICAgIHJldHVybiB7IGdyb3VwLCBieXRlcyB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBsb29wOiB3aGlsZSBjaHVua3MgYXJlIGJ1ZmZlcmVkLCBzZW5kIHRoZW0gZ3JvdXAgYnkgZ3JvdXAuXG4gICAgICogRXhhY3RseSBvbmUgbG9vcCBydW5zIGF0IGEgdGltZSAoYGluRmxpZ2h0YCksIHNvIGdyb3VwcyByZWFjaCB0aGVcbiAgICAgKiBzZXJ2ZXIgaW4gd3JpdGUgb3JkZXIuIENodW5rcyB0aGF0IGFycml2ZSB3aGlsZSBhIGdyb3VwJ3MgcmVxdWVzdCBpc1xuICAgICAqIGluIGZsaWdodCBhY2N1bXVsYXRlIGFuZCBmb3JtIHRoZSBuZXh0IGdyb3VwOiB0aGUgZ3JvdXAtY29tbWl0XG4gICAgICogYmVoYXZpb3IsIG5vdyBpbmRlcGVuZGVudCBvZiBob3cgdGhlIHByb2R1Y2VyIHBpcGVzLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFNlbmQgb25lIGdyb3VwIHRvIHRoZSBzZXJ2ZXI6IGdhdGUgb24gcnVuIHJlYWRpbmVzcywgdGhlbiBvbmVcbiAgICAgKiBgd3JpdGVNdWx0aWAgKG9yIHNlcXVlbnRpYWwgYHdyaXRlYHMgd2hlbiB0aGUgd29ybGQgbGFja3MgaXQpLiBFbWl0c1xuICAgICAqIHRoZSB3cml0ZS1mbHVzaCBzcGFuOyBkd2VsbCBpcyBtZWFzdXJlZCB1cCB0byBqdXN0IGJlZm9yZSB0aGUgUlBDIHNvIGFcbiAgICAgKiB0dXJibyBydW4tcmVhZHkgYmFycmllciB3YWl0IGNvdW50cyBhcyBidWZmZXIgZHdlbGwsIG1hdGNoaW5nIHRoZVxuICAgICAqIHByZS1ncm91cC1jb21taXQgdGVsZW1ldHJ5LlxuICAgICAqL1xuICAgIGNvbnN0IHNlbmRHcm91cCA9IGFzeW5jIChcbiAgICAgIGdyb3VwOiBVaW50OEFycmF5W10sXG4gICAgICBieXRlczogbnVtYmVyLFxuICAgICAgZ3JvdXBUMDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgd3JpdGVTZXNzaW9uUHJvbWlzZTtcbiAgICAgIGNvbnN0IGRpc3BhdGNoQXQgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgYXdhaXQgc2Vzc2lvbi53cml0ZShuZXh0Q2h1bmtTZXEsIGdyb3VwKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiB3b3JsZC5zdHJlYW1zLndyaXRlTXVsdGkgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgZ3JvdXAubGVuZ3RoID4gMVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aShydW5JZCwgbmFtZSwgZ3JvdXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlcXVlbnRpYWwgd3JpdGVzXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZ3JvdXApIHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKHJ1bklkLCBuYW1lLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGBpbkZsaWdodGAgYWRtaXRzIG9ubHkgb25lIGRpc3BhdGNoIGxvb3AsIHNvIG5vIHNlY29uZCBncm91cCBjYW4gcmVhZFxuICAgICAgLy8gdGhpcyBzZXF1ZW5jZSBzcGFjZSB1bnRpbCB0aGUgY3VycmVudCBncm91cCBoYXMgYWR2YW5jZWQgaXQuXG4gICAgICBuZXh0Q2h1bmtTZXEgKz0gZ3JvdXAubGVuZ3RoO1xuICAgICAgaWYgKGdyb3VwVDAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWNvcmRTdHJlYW1Xcml0ZUZsdXNoKFxuICAgICAgICAgIGdyb3VwVDAsXG4gICAgICAgICAgZGlzcGF0Y2hBdCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGdyb3VwLmxlbmd0aCxcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBEYXRlLm5vdygpIC0gZGlzcGF0Y2hBdFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBkaXNwYXRjaExvb3AgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hUaW1lcik7XG4gICAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXBUMCA9IGJ1ZmZlclQwO1xuICAgICAgICBjb25zdCBncm91cFRha2VuQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7IGdyb3VwLCBieXRlcyB9ID0gdGFrZUdyb3VwKCk7XG4gICAgICAgIGluRmxpZ2h0Q2h1bmtzID0gZ3JvdXAubGVuZ3RoO1xuICAgICAgICBpbkZsaWdodEJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIGJ1ZmZlclQwID0gYnVmZmVyLmxlbmd0aCA+IDAgPyBncm91cFRha2VuQXQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBzZW5kR3JvdXAoZ3JvdXAsIGJ5dGVzLCBncm91cFQwKTtcbiAgICAgICAgICBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgICAgICAgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUmV0YWluIHRoZSBmYWlsZWQgZ3JvdXAgKGFuZCBpdHMgb3JpZ2luYWwgdDApIGF0IHRoZSBmcm9udCBvZlxuICAgICAgICAgIC8vIHRoZSBidWZmZXIsIHBvaXNvbiB0aGUgc2luaywgYW5kIHN1cmZhY2UgdGhlIGZhaWx1cmUgdG8gZXZlcnlcbiAgICAgICAgICAvLyBibG9ja2VkIHdyaXRlciBhbmQgZHJhaW4gd2FpdGVyLlxuICAgICAgICAgIGJ1ZmZlciA9IGdyb3VwLmNvbmNhdChidWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlckJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgIGluRmxpZ2h0Q2h1bmtzID0gMDtcbiAgICAgICAgICBpbkZsaWdodEJ5dGVzID0gMDtcbiAgICAgICAgICBidWZmZXJUMCA9XG4gICAgICAgICAgICBncm91cFQwICE9PSB1bmRlZmluZWQgJiYgYnVmZmVyVDAgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IE1hdGgubWluKGdyb3VwVDAsIGJ1ZmZlclQwKVxuICAgICAgICAgICAgICA6IChncm91cFQwID8/IGJ1ZmZlclQwKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgZ3JvdXAgaXMgZHVyYWJsZTogcmVsaWV2ZSB3cml0ZXJzIGJsb2NrZWQgb24gdGhlIGJvdW5kICh0aGV5XG4gICAgICAgIC8vIHJlLWNoZWNrIGl0IGFuZCBtYXkgYmxvY2sgYWdhaW4pLlxuICAgICAgICBjb25zdCByZWxpZXZlZCA9IGNhcGFjaXR5V2FpdGVycztcbiAgICAgICAgY2FwYWNpdHlXYWl0ZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdyBvZiByZWxpZXZlZCkgdy5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBTdGFydCAob3Igam9pbikgdGhlIGRpc3BhdGNoIGNoYWluLiBOZXZlciBsZWF2ZXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi4gKi9cbiAgICBjb25zdCBzdGFydERpc3BhdGNoID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGluRmxpZ2h0IHx8IHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkIHx8IGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGluRmxpZ2h0ID0gZGlzcGF0Y2hMb29wKCkudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGluRmxpZ2h0ID0gbnVsbDtcbiAgICAgICAgICAvLyBBIHdyaXRlIGNhbiBsYW5kIGluIHRoZSBtaWNyb3Rhc2sgZ2FwIGJldHdlZW4gdGhlIGxvb3Anc1xuICAgICAgICAgIC8vIGVtcHR5LWJ1ZmZlciBleGl0IGFuZCB0aGlzIHJlYWN0aW9uLiBzY2hlZHVsZUdyb3VwQ29tbWl0IHNhd1xuICAgICAgICAgIC8vIGluRmxpZ2h0IHN0aWxsIHNldCBhbmQgYXJtZWQgbm8gdGltZXIsIHNvIHdpdGhvdXQgdGhpcyBjaGVja1xuICAgICAgICAgIC8vIHRoZSBjaHVuayB3b3VsZCBzaXQgc3RyYW5kZWQgdW50aWwgYSBsYXRlciB3cml0ZS9jbG9zZS9kcmFpbi5cbiAgICAgICAgICAvLyBUcmVhdCBpdCBsaWtlIGFuIGluLXJlcXVlc3QgYXJyaXZhbDogZGlzcGF0Y2ggaW1tZWRpYXRlbHkgKHRoZVxuICAgICAgICAgIC8vIG5ldyBjaGFpbiBzZXR0bGVzIHRoZSBkcmFpbiB3YWl0ZXJzIHdoZW4gaXQgZmluaXNoZXMpLlxuICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGdWxseSBpZGxlICh0aGUgbG9vcCBvbmx5IGV4aXRzIHdpdGggYW4gZW1wdHkgYnVmZmVyKTogc2V0dGxlXG4gICAgICAgICAgLy8gdGhlIGR1cmFiaWxpdHkgYmFycmllci5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gZHJhaW5XYWl0ZXJzO1xuICAgICAgICAgIGRyYWluV2FpdGVycyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBzZXR0bGVkKSB3LnJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQgPSBudWxsO1xuICAgICAgICAgIHNpbmtFcnJvciA/Pz0gZXJyb3I7XG4gICAgICAgICAgcmVqZWN0V2FpdGVycyhzaW5rRXJyb3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMZWFkaW5nLWVkZ2UgZGlzcGF0Y2ggcG9saWN5IGZvciBhbiBpZGxlIHNpbms6XG4gICAgICogLSB3aW5kb3cgPD0gMCAodGhlIGRlZmF1bHQpOiBkaXNwYXRjaCB0aGUgbGVhZGluZyBjaHVuayBpbW1lZGlhdGVseS5cbiAgICAgKiAgIEZhc3QgcHJvZHVjZXJzIHN0aWxsIGJhdGNoIHZpYSBpbi1mbGlnaHQgYWNjdW11bGF0aW9uOiBjaHVua3NcbiAgICAgKiAgIGFycml2aW5nIGR1cmluZyB0aGUgcmVxdWVzdCBmb3JtIHRoZSBuZXh0IGdyb3VwLiBUaGUgdHJhZGUgZm9yIGFuXG4gICAgICogICBpZGxlIGJ1cnN0IGlzIG9uZSBleHRyYSByZXF1ZXN0IChhIDMwLWNodW5rIGJ1cnN0IHNoaXBzIGFzIDEgKyAyOVxuICAgICAqICAgaW5zdGVhZCBvZiBvbmUgMzAtY2h1bmsgZ3JvdXAgdW5kZXIgYSBwb3NpdGl2ZSB3aW5kb3cpIGluIGV4Y2hhbmdlXG4gICAgICogICBmb3IgemVybyBmaXhlZCBmaXJzdC1jaHVuayBkZWxheSwgd2hpY2ggbWF0Y2hlcyBtZWFzdXJlZCBwcm9kdWNlclxuICAgICAqICAgYmVoYXZpb3IsIHdoZXJlIGlzb2xhdGVkIGNodW5rcyBkb21pbmF0ZS5cbiAgICAgKiAtIHdpbmRvdyA+IDAgKGV4cGxpY2l0bHkgY29uZmlndXJlZCk6IGFybSB0aGUgZ3JvdXAtY29tbWl0IHRpbWVyIHNvXG4gICAgICogICB0aGUgbGVhZGluZyBjaHVuayB3YWl0cyB1cCB0byB0aGUgd2luZG93IGNvbGxlY3RpbmcgYSBncm91cCxcbiAgICAgKiAgIHRoZSBvcHQtaW4gdHJhZGUgZm9yIHNsb3ctYnV0LXN0ZWFkeSBwcm9kdWNlcnMuXG4gICAgICogV2luZG93IHJlc29sdXRpb246IGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLCB3aGVuIHNldCxcbiAgICAgKiBvdmVycmlkZXMgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2A7IG90aGVyd2lzZSB0aGUgV29ybGQgb3B0aW9uXG4gICAgICogKGRlZmF1bHQgMCkgZ292ZXJucywgaW5jbHVkaW5nIHRoZSBmaXJzdCBjaHVuay4gRGVjaWRpbmcgbWF5XG4gICAgICogaGF2ZSB0byB3YWl0IGZvciB0aGUgd29ybGQgdG8gcmVzb2x2ZTsgdGhhdCBhZGRzIG5vIGxhdGVuY3kgYmVjYXVzZVxuICAgICAqIGBzZW5kR3JvdXBgIGF3YWl0cyB0aGUgc2FtZSBwcm9taXNlIGJlZm9yZSBhbnkgcmVxdWVzdCBsZWF2ZXMuXG4gICAgICovXG4gICAgY29uc3Qgc2NoZWR1bGVHcm91cENvbW1pdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChmbHVzaFRpbWVyIHx8IGluRmxpZ2h0KSByZXR1cm47XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBQcm9taXNlLnJlc29sdmU6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgd29ybGQgaXMgb25seSBldmVyIGF3YWl0ZWQsXG4gICAgICAgIC8vIHdoaWNoIHRvbGVyYXRlcyBhIHN5bmNocm9ub3VzIHZhbHVlICh0ZXN0cyBzdHViIGdldFdvcmxkTGF6eSB0aGF0XG4gICAgICAgIC8vIHdheSk7IC50aGVuKCkgbXVzdCBiZSBnaXZlbiBhIHJlYWwgcHJvbWlzZS5cbiAgICAgICAgX2ZsdXNoSW50ZXJ2YWxSZXNvbHV0aW9uID8/PSBQcm9taXNlLnJlc29sdmUod29ybGRQcm9taXNlKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKHdvcmxkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID1cbiAgICAgICAgICAgICAgICB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXMgPz8gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gV29ybGQgcmVzb2x1dGlvbiBmYWlsdXJlIHN1cmZhY2VzIG9uIGRpc3BhdGNoOyBmYWxsIGJhY2sgdG9cbiAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc28gYnVmZmVyZWQgY2h1bmtzIHN0aWxsIHJlYWNoIHRoZSBkaXNwYXRjaCBwYXRoXG4gICAgICAgICAgICAgIC8vICh3aGVyZSB0aGUgZXJyb3IgcG9pc29ucyB0aGUgc2luaykuXG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID0gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZS1ldmFsdWF0ZTogdGhlIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgYnkgZHJhaW4oKVxuICAgICAgICAgICAgLy8gb3IgYSBmdWxsLXJlcXVlc3QgZmFzdCBwYXRoIHdoaWxlIHRoZSB3b3JsZCByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPD0gMCkge1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgIH0sIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHVyYWJpbGl0eSBiYXJyaWVyOiByZXNvbHZlcyB3aGVuIGV2ZXJ5IGFjY2VwdGVkIGNodW5rIGhhcyByZWFjaGVkIHRoZVxuICAgICAqIHNlcnZlciBhbmQgbm90aGluZyBpcyBidWZmZXJlZCBvciBpbiBmbGlnaHQ7IHJlamVjdHMgd2l0aCB0aGUgc2luaydzXG4gICAgICogc3RpY2t5IGVycm9yIGlmIGFueSBkaXNwYXRjaCBmYWlsZWQuIEZsdXNoZXMgYSBwZW5kaW5nIGdyb3VwLWNvbW1pdFxuICAgICAqIHdpbmRvdyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIG91dCB0aGUgdGltZXIuXG4gICAgICovXG4gICAgY29uc3QgZHJhaW4gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgIWluRmxpZ2h0KSByZXR1cm47XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGRyYWluV2FpdGVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXN5bmMgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICAgIGlmIChidWZmZXJUMCA9PT0gdW5kZWZpbmVkKSBidWZmZXJUMCA9IERhdGUubm93KCk7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgYnVmZmVyQnl0ZXMgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYnVmZmVyLmxlbmd0aCA+PSBtYXhDaHVua3NQZXJSZXF1ZXN0IHx8XG4gICAgICAgICAgYnVmZmVyQnl0ZXMgPj0gbWF4Qnl0ZXNQZXJSZXF1ZXN0XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRoZSBidWZmZXJlZCBncm91cCBhbHJlYWR5IGZpbGxzIGEgcmVxdWVzdDogbm8gcG9pbnQgZHdlbGxpbmcgaW5cbiAgICAgICAgICAvLyB0aGUgY29tbWl0IHdpbmRvdy5cbiAgICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm91bmRlZCBidWZmZXI6IGFjY2VwdCB0aGUgY2h1bmsgKG5ldmVyIGRyb3ApLCB0aGVuIGJsb2NrIHVudGlsXG4gICAgICAgIC8vIHRoZSByZWFkLWJ1dC1ub3QtZHVyYWJsZSBwb3B1bGF0aW9uIChidWZmZXJlZCBBTkQgaW4gdGhlIGFjdGl2ZVxuICAgICAgICAvLyByZXF1ZXN0KSBpcyBiYWNrIHVuZGVyIHRoZSBib3VuZC4gRWFjaCBkdXJhYmx5LXNlbnQgZ3JvdXBcbiAgICAgICAgLy8gcmVsaWV2ZXMgdGhpcy5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgIHNpbmtFcnJvciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgKGJ1ZmZlci5sZW5ndGggKyBpbkZsaWdodENodW5rcyA+PSBtYXhCdWZmZXJlZENodW5rcyB8fFxuICAgICAgICAgICAgYnVmZmVyQnl0ZXMgKyBpbkZsaWdodEJ5dGVzID49IG1heEJ1ZmZlcmVkQnl0ZXMpXG4gICAgICAgICkge1xuICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjYXBhY2l0eVdhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgLy8gRXZlcnl0aGluZyBhY2NlcHRlZCBtdXN0IGJlIGR1cmFibGUgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RyZWFtIGlzXG4gICAgICAgIC8vIGNsb3NlZDogdGhlIHNlcnZlciBmZW5jZXMgcG9zdC1jbG9zZSB3cml0ZXMuXG4gICAgICAgIGF3YWl0IGRyYWluKCk7XG5cbiAgICAgICAgLy8gQSBjbG9zZSB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBza2lwcyB0aGUgZGlzcGF0Y2ggcGF0aCAoYW5kIGl0c1xuICAgICAgICAvLyBiYXJyaWVyKSwgYnV0IGNhbiBpdHNlbGYgYmUgdGhlIGZpcnN0IHdyaXRlIHRvIGEgYnJhbmQtbmV3XG4gICAgICAgIC8vIHN0cmVhbSwgc28gZ2F0ZSBpdCB0b28uXG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG5cbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB3cml0ZVNlc3Npb25Qcm9taXNlO1xuICAgICAgICBjb25zdCBjbG9zZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgICBhd2FpdCBzZXNzaW9uLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkU3RyZWFtQ2xvc2UoY2xvc2VTdGFydCwgcnVuSWQsIG5hbWUpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGFib3J0KHJlYXNvbikge1xuICAgICAgICAvLyBCdWZmZXJlZCBjaHVua3Mgd2VyZSBhbHJlYWR5IEFDS0VEIHRvIHRoZWlyIHdyaXRlcnMgKGVhcmx5LWFja1xuICAgICAgICAvLyBjb250cmFjdCksIGFuZCBuYXRpdmUgcGlwZVRvIGFib3J0cyB0aGlzIHNpbmsgd2hlbmV2ZXIgaXRzIFNPVVJDRVxuICAgICAgICAvLyBlcnJvcnMsIGUuZy4gYW4gQUkgc3RyZWFtIHRoYXQgZW1pdHMgdGVuIGRlbHRhcyBhbmQgdGhlbiB0aHJvd3MuXG4gICAgICAgIC8vIERpc2NhcmRpbmcgaGVyZSB3b3VsZCBzaWxlbnRseSBsb3NlIHRoZSBhY2NlcHRlZCB0YWlsIG9mIHRoZVxuICAgICAgICAvLyBwcmVmaXgsIHNvIGRlbGl2ZXIgaXQgZmlyc3Q7IG9ubHkgdGhlIHNlcnZlciBzdHJlYW0gY2xvc2UgaXNcbiAgICAgICAgLy8gc2tpcHBlZC4gQSBkaXNwYXRjaCBmYWlsdXJlIGR1cmluZyB0aGlzIGRyYWluIGlzIGFscmVhZHkgc3RpY2t5XG4gICAgICAgIC8vIGFuZCBzdXJmYWNlcyB0aHJvdWdoIHRoZSBzaW5rJ3MgZXJyb3IgcGF0aHMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlbGliZXJhdGVseSB1bi10aW1lYm94ZWQgKHVubGlrZSB0aGUgc3RlcC1leGVjdXRvcidzIDUwMG1zXG4gICAgICAgIC8vIGlubGluZSBmbHVzaCk6IGdpdmluZyB1cCBlYXJseSB3b3VsZCBkcm9wIGFja2VkIGNodW5rcywgdGhlXG4gICAgICAgIC8vIGV4YWN0IGxvc3MgdGhpcyBwYXRoIGV4aXN0cyB0byBwcmV2ZW50LiBJdCBpcyBzdGlsbCBib3VuZGVkIGluXG4gICAgICAgIC8vIHByYWN0aWNlIGJ5IHRoZSBXb3JsZCB0cmFuc3BvcnQncyBvd24gdGltZW91dC9yZXRyeSBidWRnZXQ6IGFcbiAgICAgICAgLy8gc3RhbGxlZCB3cml0ZSBlbmRzIGluIGEgdGVybWluYWwgcmVqZWN0aW9uIGFmdGVyIGZpbml0ZSByZXRyaWVzLFxuICAgICAgICAvLyB3aGljaCByZWplY3RzIHRoZSBkaXNwYXRjaCBhbmQgbGFuZHMgaW4gdGhlIGNhdGNoIGJlbG93LiBUaGVcbiAgICAgICAgLy8gc2FtZSBjYXRjaCBhYnNvcmJzIHRoZSBleHBlY3RlZCBjb25mbGljdCB3aGVuIGEgdGVhcmRvd24tZHJpdmVuXG4gICAgICAgIC8vIGFib3J0IGRyYWlucyBpbnRvIGFuIGFscmVhZHktdGVybWluYWwgcnVuLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGRyYWluKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIHNpbmtFcnJvciBpcyBzZXQ7IGFjY2VwdGVkLWJ1dC11bmRlbGl2ZXJhYmxlIGNodW5rcyBzdXJmYWNlIGl0LlxuICAgICAgICB9XG4gICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICBidWZmZXJCeXRlcyA9IDA7XG4gICAgICAgIHNpbmtFcnJvciA/Pz0gcmVhc29uID8/IG5ldyBFcnJvcignU3RyZWFtIGFib3J0ZWQnKTtcbiAgICAgICAgLy8gUmVqZWN0IGJsb2NrZWQgd3JpdGVycyBhbmQgZHJhaW4gd2FpdGVycyBzbyBub3RoaW5nIGxlYWtzIG9yXG4gICAgICAgIC8vIGhhbmdzIG9uIGEgcHJvbWlzZSB3aG9zZSB0aW1lciB3YXMganVzdCBjbGVhcmVkLlxuICAgICAgICByZWplY3RXYWl0ZXJzKHNpbmtFcnJvcik7XG4gICAgICAgIC8vIEFib3J0IGlzIHRyYW5zcG9ydCBjbGVhbnVwLCBub3Qgc2VtYW50aWMgc3RyZWFtIGNvbXBsZXRpb24uIEFcbiAgICAgICAgLy8gc3RhdGVmdWwgV29ybGQgcmVsZWFzZXMgaXRzIHNvY2tldCB3aXRob3V0IHNlbmRpbmcgY2xvc2U7IHN0YXRlbGVzc1xuICAgICAgICAvLyBXb3JsZHMga2VlcCB0aGUgZXhpc3Rpbmcgbm8tb3AgYmVoYXZpb3IuXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB3cml0ZVNlc3Npb25Qcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIGF3YWl0IHNlc3Npb24/LmRpc3Bvc2U/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIER1cmFiaWxpdHkgYmFycmllciBmb3Igb3duZXJzIHRoYXQgY29tcGxldGUgd2l0aG91dCBjbG9zaW5nIHRoZVxuICAgIC8vIHN0cmVhbTogYGZsdXNoYWJsZVBpcGVgJ3MgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYXdhaXRzIHRoaXMgc28gYVxuICAgIC8vIHN0ZXAgY2Fubm90IGZpbmlzaCAoYW5kIHRoZSBmdW5jdGlvbiBzdXNwZW5kKSB3aGlsZSBhY2NlcHRlZCBjaHVua3NcbiAgICAvLyBhcmUgc3RpbGwgY2xpZW50LWJ1ZmZlcmVkIG9yIGluIGZsaWdodC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU1RSRUFNX0RSQUlOX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGRyYWluLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gdGhlIG1vZHVsYXIgc2VyaWFsaXphdGlvbiBtb2R1bGVzLlxuZXhwb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyBJbXBvcnQgdHlwZXMgbG9jYWxseSBmb3IgdXNlIHdpdGhpbiB0aGlzIGZpbGUuXG5pbXBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQ29tcG9zZWQgcmVkdWNlcnMgLS0tLVxuLy8gQ29tcG9zZXMgbW9kdWxhciByZWR1Y2VycyAoY29tbW9uLCBjbGFzcywgc3RlcC1mdW5jdGlvbikgd2l0aFxuLy8gbW9kZS1zcGVjaWZpYyBSZXF1ZXN0L1Jlc3BvbnNlL1N0cmVhbSByZWR1Y2VycyBiZWxvdy5cblxuLyoqXG4gKiBCYXNlIHJlZHVjZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIHN0ZXAtZnVuY3Rpb24gKyBjb21tb24gcmVkdWNlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxCYXNlUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgY29uc3QgcmVxdWVzdFByb3RvdHlwZSA9IG9uY2UoKCkgPT4gZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1JlcXVlc3QnKSk7XG4gIGNvbnN0IHJlc3BvbnNlUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdSZXNwb25zZScpXG4gICk7XG4gIC8vIENsYXNzL0luc3RhbmNlIE1VU1QgY29tZSBiZWZvcmUgRXJyb3Igc28gdGhhdCBjdXN0b20gRXJyb3Igc3ViY2xhc3Nlc1xuICAvLyB3aXRoIFdPUktGTE9XX1NFUklBTElaRSB0YWtlIHByZWNlZGVuY2UgKGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zKS5cbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgcmVkdWNlcnMgYXJlIG1vZGUtc3BlY2lmaWMgYW5kIGFkZGVkIGJ5XG4gICAgLy8gZ2V0RXh0ZXJuYWxSZWR1Y2VycyAvIGdldFdvcmtmbG93UmVkdWNlcnMgLyBnZXRTdGVwUmVkdWNlcnMgYmVsb3cuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBDaGFpbiB3YWxrIHJhdGhlciB0aGFuIGBpbnN0YW5jZW9mIGdsb2JhbC5SZXF1ZXN0YDogc2VlIHRoZVxuICAgICAgLy8gUmVhZGFibGVTdHJlYW0gcmVkdWNlciBpbiBnZXRXb3JrZmxvd1JlZHVjZXJzIGZvciB3aHkuIFJlYWRzIGdvXG4gICAgICAvLyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGEgZ2V0dGVyIGNhbm5vdCBydW4gdW5yZXBvcnRlZC5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXF1ZXN0UHJvdG90eXBlLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVxdWVzdCddID0ge1xuICAgICAgICBtZXRob2Q6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21ldGhvZCcpIGFzIHN0cmluZyxcbiAgICAgICAgdXJsOiByZWFkUHJvcGVydHkodmFsdWUsICd1cmwnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICBkdXBsZXg6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2R1cGxleCcpIGFzICdoYWxmJyxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gcmVhZFByb3BlcnR5KHZhbHVlLCBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFKSBhc1xuICAgICAgICB8IFdyaXRhYmxlU3RyZWFtPFJlc3BvbnNlPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIGRhdGEucmVzcG9uc2VXcml0YWJsZSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICAvLyBGb3J3YXJkIHRoZSBzaWduYWwgaW4gdHdvIGNhc2VzOlxuICAgICAgLy8gICAxLiBBbHJlYWR5IGFib3J0ZWQ6IHByZXNlcnZlIGFib3J0ZWQ9dHJ1ZS9yZWFzb24gc28gdGhlIGh5ZHJhdGVkXG4gICAgICAvLyAgICAgIHN0ZXAgc2VlcyB0aGUgY2FuY2VsbGF0aW9uIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHNlcmlhbGl6ZS5cbiAgICAgIC8vICAgMi4gQWxyZWFkeSB0YWdnZWQgd2l0aCB3b3JrZmxvdyBpbmZyYXN0cnVjdHVyZSwgaS5lLiBhIHNpZ25hbFxuICAgICAgLy8gICAgICBmcm9tIGEgd29ya2Zsb3ctbWFuYWdlZCBBYm9ydENvbnRyb2xsZXIsIHdoaWNoIGhhcyBzdHJlYW0vaG9va1xuICAgICAgLy8gICAgICBiYWNraW5nIGZvciBjcm9zcy1ib3VuZGFyeSBwcm9wYWdhdGlvbi5cbiAgICAgIC8vIFBsYWluIG5vbi1hYm9ydGVkIG5hdGl2ZSBzaWduYWxzIGFyZSBpbnRlbnRpb25hbGx5IGRyb3BwZWQgKHdvdWxkXG4gICAgICAvLyBtaW50IHN0cmVhbSBpbmZyYSBmb3IgZXZlcnkgUmVxdWVzdCwgaW5jbHVkaW5nIHRoZSBhdXRvLWdlbmVyYXRlZFxuICAgICAgLy8gc2lnbmFsIG9uIGBuZXcgUmVxdWVzdCh1cmwpYCkuXG4gICAgICBjb25zdCBzaWduYWwgPSByZWFkUHJvcGVydHkodmFsdWUsICdzaWduYWwnKTtcbiAgICAgIGlmIChcbiAgICAgICAgc2lnbmFsICYmXG4gICAgICAgIChyZWFkUHJvcGVydHkoc2lnbmFsLCAnYWJvcnRlZCcpIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KHNpZ25hbCwgQUJPUlRfU1RSRUFNX05BTUUpKVxuICAgICAgKSB7XG4gICAgICAgIGRhdGEuc2lnbmFsID0gc2lnbmFsIGFzIEFib3J0U2lnbmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTZWUgdGhlIFJlcXVlc3QgcmVkdWNlciBhYm92ZS5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXNwb25zZVByb3RvdHlwZS52YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3R5cGUnKSBhcyBSZXNwb25zZVsndHlwZSddLFxuICAgICAgICB1cmw6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3VybCcpIGFzIHN0cmluZyxcbiAgICAgICAgc3RhdHVzOiByZWFkUHJvcGVydHkodmFsdWUsICdzdGF0dXMnKSBhcyBudW1iZXIsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1c1RleHQnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICByZWRpcmVjdGVkOiByZWFkUHJvcGVydHkodmFsdWUsICdyZWRpcmVjdGVkJykgYXMgYm9vbGVhbixcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgYWJvcnQgcmVkdWNlciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBBYm9ydFNlcmlhbGl6ZWREYXRhID0ge1xuICBzdHJlYW1OYW1lOiBzdHJpbmc7XG4gIGhvb2tUb2tlbjogc3RyaW5nO1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb246IHVua25vd247XG59O1xuXG4vKipcbiAqIFN5bWJvbC1rZXllZCBpbnRlcm5hbCBmaWVsZHMgdGFnZ2VkIG9udG8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsXG4gKiBpbnN0YW5jZXMgKGFuZCBgaG9sZGVyYHMgaW4gcmVkdWNlciBoZWxwZXJzKS4gQWxsIG9wdGlvbmFsOiBhIHBsYWluXG4gKiBuYXRpdmUgaW5zdGFuY2UgaGFzIG5vbmUgb2YgdGhlbSBzZXQuXG4gKi9cbnR5cGUgQWJvcnRJbnRlcm5hbHMgPSB7XG4gIFtBQk9SVF9TVFJFQU1fTkFNRV0/OiBzdHJpbmc7XG4gIFtBQk9SVF9IT09LX1RPS0VOXT86IHN0cmluZztcbiAgW0FCT1JUX1JFQURFUl9DQU5DRUxdPzogQWJvcnRDb250cm9sbGVyO1xufTtcblxudHlwZSBBYm9ydFNpZ25hbExpa2UgPSBBYm9ydEludGVybmFscyAmIHtcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogdW5rbm93bjtcbiAgYWRkRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBBYm9ydEhvbGRlciA9IEFib3J0SW50ZXJuYWxzICYgeyBzaWduYWw/OiBBYm9ydEludGVybmFscyB9O1xuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIGV4dGVybmFsIGFuZCBzdGVwXG4gKiBjb250ZXh0cy4gQXNzaWducyBzdHJlYW0vaG9vayBuYW1lcyBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCBvcHRpb25hbGx5XG4gKiBhdHRhY2hlcyBhbiBhYm9ydCBsaXN0ZW5lciBmb3IgcmVhbC10aW1lIHByb3BhZ2F0aW9uLCBhbmQgcmV0dXJucyB0aGVcbiAqIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICBzaWduYWw6IEFib3J0U2lnbmFsTGlrZSxcbiAgaG9sZGVyOiBBYm9ydEhvbGRlcixcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IEFib3J0U2VyaWFsaXplZERhdGEge1xuICBsZXQgc3RyZWFtTmFtZSA9IGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGxldCBob29rVG9rZW4gPSBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl07XG4gIGlmICghc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IGlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgc3RyZWFtTmFtZSA9IGdldEFib3J0U3RyZWFtSWQoaWQpO1xuICAgIGhvb2tUb2tlbiA9IGBhYnJ0XyR7aWR9YDtcbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgaWYgKGhvbGRlci5zaWduYWwpIHtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgfVxuICB9XG5cbiAgLy8gRGVkdXBlZCB2aWEgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQgbWFya2VyOiBzZWUgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UuXG4gIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlKFxuICAgIHNpZ25hbCBhcyBBYm9ydFNpZ25hbCxcbiAgICBzdHJlYW1OYW1lLFxuICAgIHJ1bklkLFxuICAgIGNyeXB0b0tleSxcbiAgICBvcHNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN0cmVhbU5hbWUsXG4gICAgaG9va1Rva2VuOiBob29rVG9rZW4hLFxuICAgIGFib3J0ZWQ6IHNpZ25hbC5hYm9ydGVkLFxuICAgIHJlYXNvbjogc2lnbmFsLmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIHdvcmtmbG93IGNvbnRleHQuXG4gKiBSZWFkcyBleGlzdGluZyBzdHJlYW0vaG9vayBuYW1lcyBmcm9tIHN5bWJvbHMgKG11c3QgYWxyZWFkeSBiZSBzZXQpLlxuICovXG5mdW5jdGlvbiByZWR1Y2VBYm9ydEJ5U3ltYm9sKFxuICBzaWduYWw6IHsgYWJvcnRlZDogYm9vbGVhbjsgcmVhc29uPzogdW5rbm93biB9LFxuICBob2xkZXI6IEFib3J0SG9sZGVyXG4pOiBBYm9ydFNlcmlhbGl6ZWREYXRhIHwgZmFsc2Uge1xuICBjb25zdCBzdHJlYW1OYW1lID1cbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGNvbnN0IGhvb2tUb2tlbiA9XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGEgc2luZ2xlIGFib3J0IGxpc3RlbmVyIHRvIGEgc2lnbmFsLCBkZWR1cGVkIGFjcm9zcyBjYWxscy5cbiAqXG4gKiBFYWNoIHNlcmlhbGl6YXRpb24gcGFzcyBnb2VzIHRocm91Z2ggdGhlIHJlZHVjZXIsIGJ1dCBhIGNvbnRyb2xsZXIgcGFzc2VkXG4gKiB0byBOIHN0ZXBzIHdvdWxkIG90aGVyd2lzZSBhY2N1bXVsYXRlIE4gbGlzdGVuZXJzLCBlYWNoIHdyaXRpbmcgdGhlIHNhbWVcbiAqIHN0cmVhbSBwYWNrZXQgYW5kIGRvdWJsZS1jbG9zaW5nIHRoZSBzdHJlYW0gb24gYWJvcnQuIFRoZSBtYXJrZXIgc3ltYm9sXG4gKiBlbnN1cmVzIHRoZSBzdHJlYW0td3JpdGUgc2lkZS1lZmZlY3QgcnVucyBhdCBtb3N0IG9uY2UgcGVyIChzaWduYWwsIHJ1bklkKS5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHN0cmVhbU5hbWU6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiB2b2lkIHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gIGlmICgoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdKSByZXR1cm47XG4gIChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0gPSB0cnVlO1xuXG4gIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdhYm9ydCcsXG4gICAgKCkgPT4ge1xuICAgICAgb3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSByZWFkZXIgdXNlcyAoaHlkcmF0ZVN0ZXBBcmd1bWVudHMpXG4gICAgICAgICAgICAvLyBzbyB0aGUgcmVhc29uIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5IChET01FeGNlcHRpb24sXG4gICAgICAgICAgICAvLyBFcnJvcnMsIGN1c3RvbSBjbGFzc2VzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzIGVuY3J5cHRpb24ga2V5LlxuICAgICAgICAgICAgLy8gQSBiYXJlIEpTT04uc3RyaW5naWZ5IGhlcmUgd291bGQgd3JpdGUgYSBwYWNrZXQgdGhlIHJlYWRlciBjYW4ndFxuICAgICAgICAgICAgLy8gZGVjb2RlIGFuZCB0aGUgbGlzdGVuZXItc2lkZSBhYm9ydCB3b3VsZCBwcm9wYWdhdGUgd2l0aCBubyByZWFzb24uXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgIHsgYWJvcnRlZDogdHJ1ZSwgcmVhc29uOiBzaWduYWwucmVhc29uIH0sXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHBheWxvYWQgYXMgVWludDhBcnJheSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IHN0cmVhbSB3cml0ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9LFxuICAgIHsgb25jZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsIHBhc3NpbmcgYXJndW1lbnRzXG4gKiB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEBwYXJhbSBjcnlwdG9LZXlcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZW4gYHRydWVgLCBieXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYClcbiAqICAgYXJlIHdyYXBwZWQgaW4gbGVuZ3RoLXByZWZpeGVkIGZyYW1lcyBvbiB0aGUgd2lyZSBzbyB0aGUgY29uc3VtZXJcbiAqICAgY2FuIHJlY29ubmVjdCBvbiB0cmFuc2llbnQgZXJyb3JzLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBydW4nc1xuICogICBjYXBhYmlsaXR5OiBzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzXG4gKiAgIHRvIGBmYWxzZWAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgbmVzdGVkIGBSZWFkYWJsZVN0cmVhbWAgZm91bmQgd2hpbGUgc2VyaWFsaXppbmdcbiAgLy8gaXMgcGlwZWQgdG8gaXRzIG93biBzZXJ2ZXIgc3RyZWFtIGluZGVwZW5kZW50bHkgb2YgdGhlIG91dGVyIHNpbmssIHNvIGl0c1xuICAvLyBmaXJzdCBjaHVuayBjYW4gcmFjZSBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhhdFxuICAvLyBzaW5rIHNvIHRoZSB3cml0ZSBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC9cbiAgLy8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj4sXG4gIC8vIE9wZXJhdGlvbnMgdGhhdCByZWFkIGRhdGEgYmFjayBmcm9tIHRoZSB3b3JrZmxvdyBpbnRvIGNhbGxlci1vd25lZFxuICAvLyB3cml0YWJsZXMuIFRoZXNlIG11c3Qgc3RheSBzZXBhcmF0ZSBmcm9tIHByb2R1Y2VyIHVwbG9hZHM6IGEgcmVhZGJhY2sgY2FuXG4gIC8vIG9ubHkgZmluaXNoIGFmdGVyIHRoZSB3b3JrZmxvdyBydW5zLCBzbyBhd2FpdGluZyBpdCBiZWZvcmUgZGlzcGF0Y2ggd291bGRcbiAgLy8gZGVhZGxvY2suIERlZmF1bHRzIHRvIGBvcHNgIGZvciBleGlzdGluZyBjYWxsZXJzIHRoYXQgZmx1c2ggZXZlcnl0aGluZyBpblxuICAvLyB0aGUgYmFja2dyb3VuZC5cbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuXG4gICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgaWYgKGZyYW1lZEJ5dGVTdHJlYW1zKSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcykgcy5mcmFtaW5nID0gJ2ZyYW1lZC12MSc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogd2hlbiB0aGUgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbSAoZS5nLiBpdCBjYW1lIGZyb20gYSBzdGVwLWNvbnRleHQgYGdldFdyaXRhYmxlKClgXG4gICAgICAvLyBvciB3YXMgaHlkcmF0ZWQgZnJvbSBhIHdvcmtmbG93IGlucHV0IGJ5IGBnZXRTdGVwUmV2aXZlcnNgKSxcbiAgICAgIC8vIGZvcndhcmQgaXRzIHVuZGVybHlpbmcgYChydW5JZCwgbmFtZSlgIHRvIHRoZSByZWNlaXZpbmcgcnVuLlxuICAgICAgLy8gVGhlIHJlY2VpdmluZyBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyBhIHNlcnZlciB3cml0YWJsZVxuICAgICAgLy8gYWdhaW5zdCB0aGUgb3JpZ2luYWwgYChydW5JZCwgbmFtZSlgIGFuZCByZXNvbHZlcyB0aGF0IHJ1bidzXG4gICAgICAvLyBlbmNyeXB0aW9uIGtleSBkaXJlY3RseSwgc28gd3JpdGVzIGxhbmQgb24gdGhlIG9yaWdpbmFsIHN0cmVhbVxuICAgICAgLy8gZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSByZWNlaXZpbmcgcnVuLCB3aXRoIG5vIGluLXByb2Nlc3NcbiAgICAgIC8vIGJyaWRnZSB0aWVkIHRvIHRoZSBkZWh5ZHJhdGluZyBzdGVwJ3MgbGlmZXRpbWUuXG4gICAgICBjb25zdCBleGlzdGluZ05hbWUgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgY29uc3QgZXhpc3RpbmdSdW5JZCA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleGlzdGluZ05hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZiBleGlzdGluZ1J1bklkID09PSAnc3RyaW5nJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7XG4gICAgICAgICAgbmFtZTogZXhpc3RpbmdOYW1lLFxuICAgICAgICAgIHJ1bklkOiBleGlzdGluZ1J1bklkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBleGlzdGluZ1B1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1B1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZXNjcmlwdG9yLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBleGlzdGluZ1B1YmxpY0tleTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGlzdGluZ0RlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ0RlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZXNjcmlwdG9yLmRlcGxveW1lbnRJZCA9IGV4aXN0aW5nRGVwbG95bWVudElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgY29uc3QgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpO1xuICAgICAgcmVhZGJhY2tPcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG4vKipcbiAqIFByb3RvdHlwZXMgdXNlZCBmb3IgYnJhbmQtc3R5bGUgaWRlbnRpZmljYXRpb24gaW4gdGhlIHJlZHVjZXJzIGJlbG93LlxuICpcbiAqIFRoZSBzdHJlYW0gYW5kIGFib3J0IGNsYXNzZXMgYXJlIGhvc3QgY2xhc3NlcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzb1xuICogaW5zdGFuY2VzIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbiBhbmQgYSBjaGFpbiB3YWxrXG4gKiBpZGVudGlmaWVzIHRoZW0gd2l0aG91dCBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgIG9uIHRoZSBzYW5kYm94XG4gKiBjbGFzcy4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcnVudGltZSBsYWNrcyB0aGUgY2xhc3MsIGluIHdoaWNoIGNhc2VcbiAqIGlkZW50aWZpY2F0aW9uIGZhbGxzIGJhY2sgdG8gdGhlIGluZnJhc3RydWN0dXJlIHN5bWJvbHMgYWxvbmUuXG4gKi9cbi8qKlxuICogVGhlIHByb3RvdHlwZSBvZiBhIGhvc3QgY2xhc3MgdGhhdCBtYXkgYWxzbyBiZSBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LlxuICogUHJlZmVycyB0aGUgc2FuZGJveCBiaW5kaW5nICh0aGUgc2FtZSBob3N0IGNsYXNzIG9iamVjdCBpbiBwcmFjdGljZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBob3N0J3Mgb3duLCBzbyBhIGNoYWluIHdhbGsgaWRlbnRpZmllcyBpbnN0YW5jZXMgZnJvbVxuICogZWl0aGVyIHJlYWxtIHdpdGhvdXQgY29uc3VsdGluZyBgU3ltYm9sLmhhc0luc3RhbmNlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdENsYXNzUHJvdG90eXBlKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5hbWU6IHN0cmluZ1xuKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgLy8gRGVzY3JpcHRvciByZWFkcyAoYHJlYWRQcm9wZXJ0eWApLCBub3QgYmFyZSBnZXRzOiBhbiBhY2Nlc3NvciBvciBQcm94eVxuICAvLyBwbGFudGVkIG9uIHRoZSBzYW5kYm94IGdsb2JhbCAob3IgdGhlIGNvbnN0cnVjdG9yKSBtdXN0IGJlIHJlY29yZGVkIGluXG4gIC8vIHRoZSBndWVzdC1jb2RlIHNpbmsgKGl0IGdhdGVzIFZNIHJldGVudGlvbiksIG5vdCBzaWxlbnRseSBleGVjdXRlZC5cbiAgLy8gQ2FsbGVycyB3cmFwIHRoaXMgaW4gYG9uY2UoLi4uKWAgcGVyIHJlZHVjZXIgc2V0LCBzbyB0aGUgcmVhZCBoYXBwZW5zXG4gIC8vIGV4YWN0bHkgb25jZSBwZXIgc2VyaWFsaXplIHBhc3MsIG9uIHRoZSBmaXJzdCBndWFyZCBpbnZvY2F0aW9uLCBpbnNpZGVcbiAgLy8gdGhlIHBhc3MncyBzaW5rIHNjb3BlLCBuZXZlciBwZXIgdmFsdWUuXG4gIGNvbnN0IGN0b3IgPSByZWFkUHJvcGVydHkoZ2xvYmFsLCBuYW1lKSA/PyByZWFkUHJvcGVydHkoZ2xvYmFsVGhpcywgbmFtZSk7XG4gIGlmICh0eXBlb2YgY3RvciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJlYWRQcm9wZXJ0eShjdG9yLCAncHJvdG90eXBlJykgYXMgb2JqZWN0IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBjb25zdCByZWFkYWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVhZGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCB3cml0YWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnV3JpdGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXJQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ0Fib3J0Q29udHJvbGxlcicpXG4gICk7XG4gIGNvbnN0IGFib3J0U2lnbmFsUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdBYm9ydFNpZ25hbCcpXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICAvLyBSZWFkYWJsZS9Xcml0YWJsZSBzdHJlYW1zIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyBhcmUgXCJoYW5kbGVzXCIgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBzdGVwcy5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXYWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gaW5zdGVhZCBvZiBgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW1gOlxuICAgICAgLy8gdGhlIGNsYXNzIGlzIGhvc3QtcHJvdmlkZWQgKGluamVjdGVkIGludG8gdGhlIHNhbmRib3gpLCBzbyBpdHNcbiAgICAgIC8vIHByb3RvdHlwZSBpcyBpbiB0aGUgY2hhaW4gb2YgYm90aCByZWFsIHN0cmVhbXMgYW5kIHRoZVxuICAgICAgLy8gYE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKWAgaGFuZGxlcyB1c2VkIGZvciByZXF1ZXN0XG4gICAgICAvLyBib2RpZXMsIGJ1dCBhIGNoYWluIHdhbGsgbmV2ZXIgY29uc3VsdHMgYFN5bWJvbC5oYXNJbnN0YW5jZWAsIHdoaWNoXG4gICAgICAvLyB0aGUgc2FuZGJveCBjYW4gZGVmaW5lIGFuZCB3aGljaCByYW4gZm9yIGV2ZXJ5IHZhbHVlIHRoZSBlYXJsaWVyXG4gICAgICAvLyByZWR1Y2VycyBkaWQgbm90IGNsYWltLiBSZWFkcyBiZWxvdyBnbyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGFcbiAgICAgIC8vIGdldHRlciBvbiBhIHN0ZXAgYXJndW1lbnQgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlLnZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCBCT0RZX0lOSVRfU1lNQk9MKTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9OQU1FX1NZTUJPTCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IEV4dHJhY3Q8XG4gICAgICAgIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10sXG4gICAgICAgIHsgbmFtZTogc3RyaW5nIH1cbiAgICAgID4gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9UWVBFX1NZTUJPTCkgYXNcbiAgICAgICAgfCAnYnl0ZXMnXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fRlJBTUlOR19TWU1CT0wpIGFzXG4gICAgICAgIHwgQnl0ZVN0cmVhbUZyYW1pbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2VlIHRoZSBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGFib3ZlIGZvciB3aHkgdGhpcyB3YWxrcyB0aGUgY2hhaW4uXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGUudmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fTkFNRV9TWU1CT0wpIGFzIHN0cmluZztcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wpO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9IHJlYWRQcm9wZXJ0eShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSByZWFkUHJvcGVydHkoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0OiByZWFkIG9ubHkgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBgdmFsdWUuc2lnbmFsYCB3YXMgYSBiYXJlIHJlYWQsIHNvIGEgYHNpZ25hbGAgZ2V0dGVyIG9uIGFueSBvYmplY3RcbiAgICAgIC8vIHJlYWNoaW5nIHRoaXMgcmVkdWNlciBleGVjdXRlZCB1bnJlcG9ydGVkLiBSZWFkIHRocm91Z2ggZGVzY3JpcHRvcnNcbiAgICAgIC8vIGFuZCBnYXRlIG9uIHRoZSBpbmZyYXN0cnVjdHVyZSBzeW1ib2wgLyBwcm90b3R5cGUgZmlyc3QuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaG9sZGVyID0gdmFsdWUgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRIb2xkZXI7XG4gICAgICBjb25zdCBvd25TeW1ib2wgPSByZWFkUHJvcGVydHkodmFsdWUsIEFCT1JUX1NUUkVBTV9OQU1FKTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRDb250cm9sbGVyID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUHJvdG90eXBlLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKG93blN5bWJvbCA9PT0gdW5kZWZpbmVkICYmICFpc05hdGl2ZUFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAvLyBOb3Qgb3VycyBhbmQgbm90IGEgbmF0aXZlIGNvbnRyb2xsZXIsIGJ1dCBhIGZvcmVpZ24gY29udHJvbGxlclxuICAgICAgICAvLyBtYXkgc3RpbGwgY2FycnkgdGhlIHN5bWJvbCBvbiBpdHMgc2lnbmFsLlxuICAgICAgICBjb25zdCBtYXliZVNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmVTaWduYWwgPT09IG51bGwgfHxcbiAgICAgICAgICB0eXBlb2YgbWF5YmVTaWduYWwgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KG1heWJlU2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKCFzaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHNpZ25hbCBhcyBBYm9ydFNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9XG4gICAgICAgIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQUJPUlRfU1RSRUFNX05BTUUpICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0U2lnbmFsID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRTaWduYWxQcm90b3R5cGUudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWhhc0Fib3J0U3ltYm9sICYmICFpc05hdGl2ZUFib3J0U2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZSBhcyBBYm9ydFNpZ25hbCwgdmFsdWUgYXMgQWJvcnRIb2xkZXIpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBgUmVhZGFibGVTdHJlYW1gIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGUgc2FtZSBvcCBmbHVzaCwgc28gaXRzIGZpcnN0IGNodW5rIGNhbiByYWNlXG4gIC8vIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGUgc2luayBzbyB0aGF0IHdyaXRlXG4gIC8vIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPixcbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJlYW0gYWxyZWFkeSBoYXMgdGhlIG5hbWUgc3ltYm9sIHNldCwgaW4gd2hpY2ggY2FzZVxuICAgICAgLy8gaXQncyBhbHJlYWR5IGJlaW5nIHN1bmsgdG8gdGhlIHNlcnZlciBhbmQgd2UgY2FuIHJldHVybiB0aGVcbiAgICAgIC8vIG5hbWUgYW5kIHR5cGUuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBsZXQgdHlwZSA9IHZhbHVlW1NUUkVBTV9UWVBFX1NZTUJPTF07XG4gICAgICAvLyBUaGUgZnJhbWluZyBzeW1ib2wgaXMgc2V0IHdoZW4gYSB3b3JrZmxvdyBWTSByZXZpdmVzIGEgc3RyZWFtXG4gICAgICAvLyBoYW5kbGUgZnJvbSBhIHByZXZpb3VzIHN0ZXAgKHNlZSBgZ2V0V29ya2Zsb3dSZXZpdmVyc2ApLiBXaGVuXG4gICAgICAvLyBwcmVzZW50IHdlIG11c3QgcHJvcGFnYXRlIHRoZSBzYW1lIGZyYW1pbmcgY2hvaWNlIG9uIHRoZSB3YXlcbiAgICAgIC8vIGJhY2sgb3V0LCBzaW5jZSB0aGUgYnl0ZXMgYWxyZWFkeSBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGFyZSBpblxuICAgICAgLy8gdGhhdCBmb3JtYXQ7IHN3aXRjaGluZyBmb3JtYXQgbWlkLXN0cmVhbSB3b3VsZCBjb3JydXB0IHRoZW0uXG4gICAgICBsZXQgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPSB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuXG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuICAgICAgICBmcmFtaW5nID0gdHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcyA/ICdmcmFtZWQtdjEnIDogZnJhbWluZztcblxuICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgaWYgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSB7XG4gICAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgICAgdmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGlmIChmcmFtaW5nKSBzLmZyYW1pbmcgPSBmcmFtaW5nO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIHJlYWRiYWNrT3BzLnB1c2goXG4gICAgICAgICAgbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIHJlYWRiYWNrT3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnblB1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICBdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmRlcGxveW1lbnRJZCA9IGZvcmVpZ25EZXBsb3ltZW50SWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydENvbnRyb2xsZXIgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUuc2lnbmFsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydFNpZ25hbCB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRTaWduYWwpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIENhbmNlbCBkYW5nbGluZyBhYm9ydC1zdHJlYW0gcmVhZGVycyBvbiBhbnkgQWJvcnRDb250cm9sbGVyIGluc3RhbmNlcyBmb3VuZFxuICogaW4gdGhlIGh5ZHJhdGVkIHN0ZXAgYXJndW1lbnRzLiBDYWxsZWQgYWZ0ZXIgdGhlIHN0ZXAgZnVuY3Rpb24gcmV0dXJuc1xuICogKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgdG8gcHJldmVudCByZWFkZXIgcHJvbWlzZXMgZnJvbSBrZWVwaW5nIHRoZSBzZXJ2ZXJsZXNzXG4gKiBmdW5jdGlvbiBhbGl2ZSBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5jZWxBYm9ydFJlYWRlcnMoLi4udmFsdWVzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBXZWFrU2V0KCk7XG4gIGZ1bmN0aW9uIGNhbmNlbElmUHJlc2VudCh2YWw6IEFib3J0SW50ZXJuYWxzKTogdm9pZCB7XG4gICAgY29uc3QgY2FuY2VsID0gdmFsW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICAgIGlmIChjYW5jZWwgJiYgIWNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY2FuY2VsLmFib3J0KCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHdhbGsodmFsOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCBhcyBvYmplY3QpKSByZXR1cm47XG4gICAgdmlzaXRlZC5hZGQodmFsIGFzIG9iamVjdCk7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0Q29udHJvbGxlcikge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscyk7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsLnZhbHVlcygpKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0L1Jlc3BvbnNlIGV4cG9zZSBgc2lnbmFsYC9gYm9keWAgYXMgcHJvdG90eXBlIGdldHRlcnMsIHNvXG4gICAgLy8gT2JqZWN0LnZhbHVlcygpIHdvbid0IGZpbmQgdGhlbS4gRGVzY2VuZCBleHBsaWNpdGx5LlxuICAgIGlmICh0eXBlb2YgUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgd2Fsayh2YWwuc2lnbmFsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2IG9mIE9iamVjdC52YWx1ZXModmFsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgd2Fsayh2KTtcbiAgfVxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB3YWxrKHYpO1xufVxuXG4vKipcbiAqIFNldHMgdXAgYSBzdHJlYW0gcmVhZGVyIG9uIHRoZSBjb250cm9sbGVyIHRoYXQgbGlzdGVucyBmb3IgYW4gYWJvcnQgcGFja2V0LlxuICogUmV0dXJucyB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXIgc28gaXQgY2FuIGJlIHN0b3JlZCBvbiBib3RoIHRoZVxuICogY29udHJvbGxlciBhbmQgc2lnbmFsIGZvciBjbGVhbnVwIGJ5IGNhbmNlbEFib3J0UmVhZGVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICBydW5JZDogc3RyaW5nLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCByZWFkZXJDYW5jZWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgb3BzLnB1c2goXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIHN0cmVhbU5hbWUpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICAgIG5ldyBQcm9taXNlPHsgdmFsdWU6IHVuZGVmaW5lZDsgZG9uZTogdHJ1ZSB9PigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlYWRlckNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyQ2FuY2VsLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAnYWJvcnQnLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmICFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIC8vIEFuIGFib3J0IHBhY2tldCBhcnJpdmVkOiBwcm9wYWdhdGUgaXQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gUmVsZWFzZVxuICAgICAgICAgIC8vIHRoZSBsb2NrIChzeW5jaHJvbm91cykgcmF0aGVyIHRoYW4gY2FuY2VsbGluZyBoZXJlOiBvbiBhXG4gICAgICAgICAgLy8gc2VydmljZS1iYWNrZWQgV29ybGQgYHJlYWRlci5jYW5jZWwoKWAgY2FuIGRvIGEgbmV0d29yayByb3VuZC10cmlwLFxuICAgICAgICAgIC8vIGFuZCBhd2FpdGluZyBpdCBiZWZvcmUgYGNvbnRyb2xsZXIuYWJvcnQoKWAgd291bGQgZGVsYXkgKG9yLCBpZiBpdFxuICAgICAgICAgIC8vIGhhbmdzLCBkcm9wKSByZWFsLXRpbWUgYWJvcnQgZGVsaXZlcnkgdG8gdGhlIGluLWZsaWdodCBzdGVwLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFJlYWRlciBtYXkgYWxyZWFkeSBiZSByZWxlYXNlZDsgaWdub3JlLlxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gSHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSB3cml0ZXIgdXNlZCBzbyB0aGUgcmVhc29uXG4gICAgICAgICAgICAvLyByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eS4gRW5jcnlwdGlvbiBrZXkgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGNvbWVzIGZyb20gdGhlIHN0ZXAgY29udGV4dCwgc2V0IHVwIGJ5IHRoZSBzdGVwIGV4ZWN1dG9yIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhpcyByZWFkZXIgcnVucy4gRmFsbGJhY2sgdG8gdW5kZWZpbmVkIGZvciBleHRlcm5hbC1jb250ZXh0XG4gICAgICAgICAgICAvLyByZXZpdmVzICh0aGUgaHlkcmF0ZSBwYXRoIGlzIGVuY3J5cHRpb24ta2V5LXRvbGVyYW50KS5cbiAgICAgICAgICAgIGNvbnN0IGN0eEZvcktleSA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBjdHhGb3JLZXk/LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydChkYXRhPy5yZWFzb24pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCBmaW5pc2hlZCAob3IgdGhlIHJlYWRlciB3YXMgY2FuY2VsbGVkKSB3aXRob3V0IGFuIGFib3J0LlxuICAgICAgICAgIC8vIENhbmNlbCAobm90IGp1c3QgcmVsZWFzZSkgc28gdGhlIHVuZGVybHlpbmcgV29ybGQgc3RyZWFtIGlzIHRvcm5cbiAgICAgICAgICAvLyBkb3duOiBhIHBvbGxpbmcgV29ybGQgKGUuZy4gd29ybGQtbG9jYWwpIG90aGVyd2lzZSBsZWFrcyBhIHRhaWxcbiAgICAgICAgICAvLyByZWFkZXIgKGEgMTAwbXMgZmlsZXN5c3RlbSBwb2xsIHBsdXMgZW1pdHRlciBsaXN0ZW5lcnMpIHBlciBzdGVwXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIHNpbmNlIGEgc2lnbmFsLWJlYXJpbmcgc3RlcFxuICAgICAgICAgIC8vIG9wZW5zIG9uZSBvZiB0aGVzZSBvbiBldmVyeSByZXZpdmFsIGFuZCB1c3VhbGx5IG5ldmVyIGFib3J0cy4gRmlyZVxuICAgICAgICAgIC8vIGFuZCBmb3JnZXQ6IGEgc2VydmljZS1iYWNrZWQgV29ybGQncyBjYW5jZWwgbWF5IGhpdCB0aGUgbmV0d29yayxcbiAgICAgICAgICAvLyBhbmQgdGhpcyBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBzdGVwJ3Mgb3BzLXNldHRsZSB3aW5kb3cuXG4gICAgICAgICAgdm9pZCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RyZWFtIHJlYWQgZmFpbGVkOiBzaWduYWwgd29uJ3QgcHJvcGFnYXRlIGluIHJlYWwtdGltZSxcbiAgICAgICAgLy8gYnV0IGhvb2stYmFzZWQgcHJvcGFnYXRpb24gb24gbmV4dCByZXBsYXkgcHJvdmlkZXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9KSgpXG4gICk7XG5cbiAgcmV0dXJuIHJlYWRlckNhbmNlbDtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYWJvcnQgc2VyaWFsaXphdGlvbiBzeW1ib2xzIGFuZCB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXJcbiAqIG9uIGJvdGggdGhlIGNvbnRyb2xsZXIgYW5kIGl0cyBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHRhZ0Fib3J0UGFpcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICB2YWx1ZTogeyBzdHJlYW1OYW1lOiBzdHJpbmc7IGhvb2tUb2tlbjogc3RyaW5nIH0sXG4gIHJlYWRlckNhbmNlbD86IEFib3J0Q29udHJvbGxlclxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZ2dlZENvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCB0YWdnZWRTaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHZhbHVlLnN0cmVhbU5hbWU7XG4gIHRhZ2dlZENvbnRyb2xsZXJbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIHRhZ2dlZFNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIGlmIChyZWFkZXJDYW5jZWwpIHtcbiAgICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gcmVhZGVyQ2FuY2VsO1xuICAgIHRhZ2dlZFNpZ25hbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIGZyb20gb25lIHNpZ25hbCB0byBhbm90aGVyLiBVc2VkIGJ5IHRoZVxuICogUmVxdWVzdCByZXZpdmVyIGJlY2F1c2UgYG5ldyBSZXF1ZXN0KHVybCwgeyBzaWduYWwgfSlgIGNvcGllcyB0aGUgc2lnbmFsXG4gKiBpbnRlcm5hbGx5OiB0aGUgY29uc3RydWN0ZWQgYHJlcXVlc3Quc2lnbmFsYCBpcyBhIGZyZXNoIEFib3J0U2lnbmFsIHRoYXRcbiAqIGRvZXNuJ3QgY2Fycnkgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBYm9ydEludGVybmFscyhzcmM6IEFib3J0U2lnbmFsLCBkZXN0OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBzID0gc3JjIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGNvbnN0IGQgPSBkZXN0IGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGlmIChzW0FCT1JUX1NUUkVBTV9OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgfVxuICBpZiAoc1tBQk9SVF9IT09LX1RPS0VOXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9IT09LX1RPS0VOXSA9IHNbQUJPUlRfSE9PS19UT0tFTl07XG4gIH1cbiAgaWYgKHNbQUJPUlRfUkVBREVSX0NBTkNFTF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSBzW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBYm9ydENvbnRyb2xsZXIgd2l0aCBzdHJlYW0tYmFja2VkIGFib3J0IHByb3BhZ2F0aW9uLlxuICogVXNlZCBieSBzdGVwIGFuZCBleHRlcm5hbCByZXZpdmVycyB3aGVyZSByZWFsIGFib3J0IHNpZ25hbCBiZWhhdmlvciBpcyBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcmlhbGl6ZWQgYWJvcnQgY29udHJvbGxlci9zaWduYWwgZGF0YVxuICogQHBhcmFtIG9wcyAtIFRoZSBvcHMgYXJyYXkgZm9yIHRyYWNraW5nIGFzeW5jIHdvcmtcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKGZvciBzdHJlYW0gcmVhZHMpXG4gKiBAcmV0dXJucyBBIHJlYWwgQWJvcnRDb250cm9sbGVyIHdpdGggcGF0Y2hlZCBhYm9ydCgpIG1ldGhvZFxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydENvbnRyb2xsZXIoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydENvbnRyb2xsZXInXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgYWJvcnQoKSB0byBhbHNvIHdyaXRlIHN0cmVhbSArIHJlc3VtZSBob29rIChmb3Igc3RlcC1pbml0aWF0ZWQgYWJvcnQpXG4gIGNvbnN0IG9yaWdpbmFsQWJvcnQgPSBjb250cm9sbGVyLmFib3J0LmJpbmQoY29udHJvbGxlcik7XG4gIGNvbnRyb2xsZXIuYWJvcnQgPSAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgb3JpZ2luYWxBYm9ydChyZWFzb24pO1xuXG4gICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgub3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCB0aHJvdWdoIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgaG9va1xuICAgICAgICAgICAgLy8gZXZlbnQgdXNlcyBzbyB0aGUgYHJlYXNvbmAgcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHlcbiAgICAgICAgICAgIC8vIChET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3NcbiAgICAgICAgICAgIC8vIGVuY3J5cHRpb24ga2V5LCBzeW1tZXRyaWMgd2l0aCB3aGF0IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHdyaXRlcyBmb3Igd29ya2Zsb3ctaW5pdGlhdGVkIGFib3J0cy5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9LFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIGN0eC53b3JrZmxvd01ldGFkYXRhLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLnN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWx1ZS5ob29rVG9rZW4pIHtcbiAgICAgICAgLy8gVGhlIGR1cmFibGUgaG9vayByZXN1bWUgKHdoaWNoIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IHRoYXRcbiAgICAgICAgLy8gcmVjb3JkcyB0aGlzIGFib3J0IGluIHRoZSB3b3JrZmxvdydzIGV2ZW50IGxvZykgbXVzdCBiZSBjb21taXR0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGVwIGNvbXBsZXRlcy4gT3RoZXJ3aXNlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb25cbiAgICAgICAgLy8gZW5xdWV1ZWQgYnkgYHN0ZXBfY29tcGxldGVkYCBjYW4gYWR2YW5jZSBwYXN0IHRoZSBhYm9ydCAoZGlzcGF0Y2hpbmdcbiAgICAgICAgLy8gYSBsYXRlciBzdGVwIHdpdGggYSBzdGFsZSwgbm9uLWFib3J0ZWQgYHNpZ25hbGApIGJlZm9yZSB0aGUgZXZlbnRcbiAgICAgICAgLy8gZXhpc3RzLiBSb3V0ZSBpdCB0byBgcHJlQ29tcGxldGlvbk9wc2AgKGF3YWl0ZWQgaW5saW5lIGJlZm9yZVxuICAgICAgICAvLyBjb21wbGV0aW9uKSByYXRoZXIgdGhhbiBgb3BzYCAoYmVzdC1lZmZvcnQsIGJhY2tncm91bmQpLiBUaGUgc3RyZWFtXG4gICAgICAgIC8vIHdyaXRlIGFib3ZlIHN0YXlzIGluIGBvcHNgOiBpdCBtdXN0IGZpcmUgQVNBUCB0byByZWFjaCBhbiBpbi1mbGlnaHRcbiAgICAgICAgLy8gc2libGluZyBzdGVwIGFuZCBpcyBub3QgdGhlIGR1cmFibGUgcmVjb3JkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTd2FsbG93IGVycm9ycyBoZXJlIHNvIHRoZSBwcm9taXNlIGNhbiBvbmx5IGV2ZXIgZW5mb3JjZSBvcmRlcmluZ1xuICAgICAgICAvLyB3aGVuIGF3YWl0ZWQgKHNlZSB0aGUgbm8tcmVqZWN0IGNvbnRyYWN0IG9uXG4gICAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpOyBhIGZhaWxlZCByZXN1bWUgcmV0cmllcyBvbiBuZXh0IHJlcGxheS5cbiAgICAgICAgY29uc3QgaG9va1Jlc3VtZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzdW1lSG9vayB9ID0gYXdhaXQgaW1wb3J0KCcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2sodmFsdWUuaG9va1Rva2VuLCB7XG4gICAgICAgICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgaG9vayByZXN1bWU6IHJldHJ5IG9uIG5leHQgcmVwbGF5XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICBjdHgucHJlQ29tcGxldGlvbk9wcy5wdXNoKGhvb2tSZXN1bWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY29udHJvbGxlcjtcbn1cblxuLyoqXG4gKiBSZXZpdmVzIG9ubHkgYW4gQWJvcnRTaWduYWwgd2l0aG91dCB0aGUgcGF0Y2hlZCBhYm9ydCgpIG92ZXJoZWFkLlxuICogVXNlZCB3aGVuIG9ubHkgYSBzaWduYWwgKG5vdCBhIGNvbnRyb2xsZXIpIHdhcyBzZXJpYWxpemVkLlxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydFNpZ25hbChcbiAgdmFsdWU6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0Fib3J0U2lnbmFsJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydFNpZ25hbCB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xufVxuXG4vKipcbiAqIEJhc2UgcmV2aXZlcnMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBib3VuZGFyaWVzLlxuICogQ29tcG9zZXM6IGNsYXNzICsgY29tbW9uIHJldml2ZXJzIGZyb20gdGhlIG1vZHVsYXIgbW9kdWxlcy5cbiAqXG4gKiBUaGlzIGlzIGV4cG9ydGVkIGJlY2F1c2Ugc2VyaWFsaXphdGlvbi1mb3JtYXQudHMgYW5kIG90aGVyIGZpbGVzIHJlZmVyZW5jZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJldml2ZXJzKGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKGdsb2JhbCksXG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnNGcm9tTW9kdWxlKGdsb2JhbCksXG4gIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFBhcnRpYWw8UmV2aXZlcnM+O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBvd25lcidzIGVuY3J5cHRpb24ga2V5LCBwcmVmZXJyaW5nIGl0cyBwdWJsaWMga2V5LCB0aGVuIGl0c1xuICogZGVwbG95bWVudCwgYW5kIGZpbmFsbHkgaXRzIHJ1biByZWNvcmQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGVuY3J5cHRpb25QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG93bmVyUHVibGljS2V5ID0gZGVjb2RlUnVuUHVibGljS2V5KGVuY3J5cHRpb25QdWJsaWNLZXkpO1xuICBpZiAob3duZXJQdWJsaWNLZXkpIHJldHVybiBzZWFsVG8ob3duZXJQdWJsaWNLZXkpO1xuXG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCByYXdLZXkgPSBkZXBsb3ltZW50SWRcbiAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4ocnVuSWQsIHsgZGVwbG95bWVudElkIH0pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKSk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5LCBbJ2VuY3J5cHQnXSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUYWdzIGEgZm9yd2FyZGVkIHdyaXRhYmxlIHdpdGggaXRzIG93bmVyJ3MgbWV0YWRhdGEuIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ0ZvcndhcmRlZFdyaXRhYmxlVGFyZ2V0KFxuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW0sXG4gIHtcbiAgICBkZXBsb3ltZW50SWQsXG4gICAgZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgfTogeyBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7IGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmcgfVxuKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgZGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGRlcGxveW1lbnRJZCxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLCB7XG4gICAgICB2YWx1ZTogZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogQ3JlYXRlcyBhbmQgdGFncyBhIGZvcndhcmRlZCB3cml0YWJsZSB0YXJnZXRpbmcgdGhlIG93bmVyIHJ1bi4gQGludGVybmFsICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9yd2FyZGVkV3JpdGFibGU8VyA9IGFueT4oe1xuICBnbG9iYWwsXG4gIG9wcyxcbiAgcnVuSWQsXG4gIG5hbWUsXG4gIGtleSxcbiAgZGVwbG95bWVudElkLFxuICBlbmNyeXB0aW9uUHVibGljS2V5LFxuICBydW5SZWFkeUJhcnJpZXIsXG59OiB7XG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3BzOiBQcm9taXNlPGFueT5bXTtcbiAgcnVuSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBrZXk6IEVuY3J5cHRpb25LZXlQYXJhbTtcbiAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xufSk6IFdyaXRhYmxlU3RyZWFtPFc+IHtcbiAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpLFxuICAgIGtleVxuICApO1xuICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgIHJ1bklkLFxuICAgIG5hbWUsXG4gICAgcnVuUmVhZHlCYXJyaWVyXG4gICk7XG5cbiAgLy8gTG9jayByZWxlYXNlIG11c3Qgc2V0dGxlIHRoZSBmbHVzaCBwcm9taXNlOyBjb250cmlidXRvcnMgZG8gbm90IGNsb3NlLlxuICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICB9KTtcblxuICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgIHZhbHVlOiBuYW1lLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCwge1xuICAgIHZhbHVlOiBydW5JZCxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gIH0pO1xuICB0YWdGb3J3YXJkZWRXcml0YWJsZVRhcmdldChzZXJpYWxpemUud3JpdGFibGUsIHtcbiAgICBkZXBsb3ltZW50SWQsXG4gICAgZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgfSk7XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZSBhcyBXcml0YWJsZVN0cmVhbTxXPjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBydW4ncyBvYmplY3QgcmVhZGFibGUgd2l0aG91dCBkaXNwYXRjaGluZyBpdHMgc3RyZWFtIEdFVCBvclxuICogZW5jcnlwdGlvbi1rZXkgbG9va3VwIHVudGlsIHRoZSBjYWxsZXIgcmVhZHMgaXQuIFRoZSBleHRlcm5hbCByZXZpdmVyIHN0YXJ0c1xuICogaXRzIGJhY2tncm91bmQgcGlwZSBpbW1lZGlhdGVseSwgc28gdGhpcyBib3VuZGFyeSBiZWxvbmdzIGhlcmXigJRuZXh0IHRvIHRoZVxuICogc291cmNlL3RyYW5zZm9ybSBhc3NlbWJseeKAlHJhdGhlciB0aGFuIGluIGBSdW5gLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuUmVhZGFibGVTdHJlYW08VD4oXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogUmVhZGFibGVTdHJlYW08VD4ge1xuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VD4gfCB1bmRlZmluZWQ7XG4gIGxldCBsb2NrU3RhdGU6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZsdXNoYWJsZVN0YXRlPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxvY2tQb2xsaW5nU3RhcnRlZCA9IGZhbHNlO1xuICBsZXQgdXNlclJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxUPjtcblxuICB1c2VyUmVhZGFibGUgPSBuZXcgUmVhZGFibGVTdHJlYW08VD4oXG4gICAge1xuICAgICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBjcnlwdG9LZXksIHtcbiAgICAgICAgICAgICAgb25SZWFkYWJsZVN0YXRlOiAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NrU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLlJlYWRhYmxlU3RyZWFtISh7IG5hbWUsIHN0YXJ0SW5kZXggfSkgYXMgUmVhZGFibGVTdHJlYW08VD47XG4gICAgICAgICAgICByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICBpZiAobG9ja1N0YXRlICYmICFsb2NrUG9sbGluZ1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgbG9ja1BvbGxpbmdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gVGhlIGNhbGxlciBvd25zIHRoaXMgd3JhcHBlcidzIHJlYWRlciwgc28gcG9sbGluZyBpdCBwcmVzZXJ2ZXNcbiAgICAgICAgICAgICAgLy8gdGhlIGRvY3VtZW50ZWQgcmVsZWFzZUxvY2soKSBjb21wbGV0aW9uIHNpZ25hbC5cbiAgICAgICAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIGxvY2tTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgZWxzZSBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbChyZWFzb24pIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyPy5jYW5jZWwocmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gQSBwb3NpdGl2ZSBkZWZhdWx0IGhpZ2gtd2F0ZXIgbWFyayB3b3VsZCBydW4gcHVsbCBhdCBjb25zdHJ1Y3Rpb24gdG9cbiAgICAvLyBmaWxsIHRoZSBxdWV1ZSwgdHVybmluZyBhbiB1bnJlYWQgUnVuLmdldFJlYWRhYmxlKCkgaW50byBJL08uXG4gICAgeyBoaWdoV2F0ZXJNYXJrOiAwIH1cbiAgKTtcbiAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGV4dGVybmFsbHkgcmV2aXZlZCBvYmplY3Qgc3RyZWFtcy4gQGludGVybmFsICovXG50eXBlIEV4dGVybmFsUmV2aXZlck9wdGlvbnMgPSB7XG4gIC8qKiBSZWNlaXZlcyBjb21wbGV0aW9uIHN0YXRlIHdoZW4gYSB3cmFwcGVyIG93bnMgdGhlIHB1YmxpYyByZWFkYWJsZS4gKi9cbiAgb25SZWFkYWJsZVN0YXRlPzogKHN0YXRlOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVGbHVzaGFibGVTdGF0ZT4pID0+IHZvaWQ7XG59O1xuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsXG4gKiByZWNlaXZpbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBvcHRpb25zPzogRXh0ZXJuYWxSZXZpdmVyT3B0aW9uc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG5cbiAgICAvLyBTdGVwRnVuY3Rpb24gc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cyB0byBjbGllbnRzXG4gICAgU3RlcEZ1bmN0aW9uOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAnU3RlcCBmdW5jdGlvbnMgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBpbiBjbGllbnQgY29udGV4dC4gU3RlcCBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cy4nLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ0Egc3RlcCBmdW5jdGlvbiByZWZlcmVuY2UgcmVhY2hlZCB0aGUgY2xpZW50LiBSZXR1cm4gYSBzZXJpYWxpemFibGUgdmFsdWUgKGUuZy4gdGhlIHN0ZXAgcmVzdWx0KSBpbnN0ZWFkIG9mIHRoZSBzdGVwIGl0c2VsZi4nLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ICYgeyBkdXBsZXg/OiBzdHJpbmcgfSA9IHtcbiAgICAgICAgbWV0aG9kOiB2YWx1ZS5tZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICB9O1xuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgaW5pdC5zaWduYWwgPSB2YWx1ZS5zaWduYWw7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IGdsb2JhbC5SZXF1ZXN0KHZhbHVlLnVybCwgaW5pdCk7XG4gICAgICAvLyBUaGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGludGVybmFsIHNpZ25hbCBjb3B5LCBzbyB0aGVcbiAgICAgIC8vIGFib3J0LWludGVybmFsIHN5bWJvbHMgc2V0IGJ5IHJldml2ZUFib3J0U2lnbmFsIGRvbid0IHByb3BhZ2F0ZS5cbiAgICAgIC8vIFJlLXRhZyB0aGUgcmVxdWVzdCdzIG93biBzaWduYWwgc28gY2FuY2VsQWJvcnRSZWFkZXJzIGNhbiBmaW5kIGl0LlxuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgY29weUFib3J0SW50ZXJuYWxzKHZhbHVlLnNpZ25hbCwgcmVxdWVzdC5zaWduYWwpO1xuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIG91dHNpZGUgdGhlIHdvcmtmbG93XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAvLyBGb3IgYnl0ZSBzdHJlYW1zLCB1c2UgZmx1c2hhYmxlIHBpcGUgd2l0aCBsb2NrIHBvbGxpbmcuXG4gICAgICAgIC8vIElmIHRoZSBwcm9kdWNlciB3cm90ZSBmcmFtZWQgYnl0ZXMgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSxcbiAgICAgICAgLy8gdW53cmFwIHRoZSBsZW5ndGgtcHJlZml4IGVudmVsb3BlIGJlZm9yZSBoYW5kaW5nIGNodW5rcyB0b1xuICAgICAgICAvLyB0aGUgdXNlci4gQWJzZW50IC8gJ3JhdycgZnJhbWluZyBtZWFucyBsZWdhY3kgcmF3IGJ5dGVzOlxuICAgICAgICAvLyBwaXBlIHRocm91Z2ggdW5jaGFuZ2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm8gYXV0by1yZWNvbm5lY3QgaGVyZSB5ZXQ6IHJhdyBieXRlIHN0cmVhbXMgaGF2ZSBubyB3aXJlXG4gICAgICAgIC8vIGZyYW1pbmcgdG8gY291bnQgY29uc3VtZWQgY2h1bmtzIHdpdGguIEZyYW1lZC12MSBieXRlIHN0cmVhbXNcbiAgICAgICAgLy8gbWFrZSBmcmFtZSBjb3VudGluZyBwb3NzaWJsZSwgc28gZXh0ZW5kaW5nIHRoZSByZWNvbm5lY3RpbmdcbiAgICAgICAgLy8gcmVhZGVyIHRvIHRoZW0gaXMgYSBzZXBhcmF0ZSBmb2xsb3ctdXAuXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdmFsdWUubmFtZSxcbiAgICAgICAgICB2YWx1ZS5zdGFydEluZGV4XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGlyZWN0IHJldml2ZXIgY2FsbGVycyBob2xkIHRoaXMgcmVhZGFibGUuIEEgZnV0dXJlIHB1YmxpYyB3cmFwcGVyXG4gICAgICAgIC8vIGNhbiBwcm92aWRlIHRoZSBzdGF0ZSBhbmQgcG9sbCB0aGUgcmVhZGFibGUgaXQgaGFuZHMgdG8gdGhlIGNhbGxlci5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm9uUmVhZGFibGVTdGF0ZSkgb3B0aW9ucy5vblJlYWRhYmxlU3RhdGUoc3RhdGUpO1xuICAgICAgICBlbHNlIHBvbGxSZWFkYWJsZUxvY2sodXNlclJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vbi1ieXRlIHN0cmVhbXMgY2FycnkgbGVuZ3RoLXByZWZpeGVkIGZyYW1lcywgc28gd2UgY2FuIGNvdW50XG4gICAgICAgIC8vIGNvbXBsZXRlZCBmcmFtZXMgYW5kIHRyYW5zcGFyZW50bHkgcmVjb25uZWN0IHdoZW4gdGhlIHNlcnZlclxuICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGlvbiB0aW1lcyBvdXQgbWlkLXJ1bi5cbiAgICAgICAgLy8gTWVtb2l6ZSB0aGlzIHJlc29sdmVyIHBlciByZWFkYWJsZSBzZXNzaW9uLiBUaGUgZmlyc3QgcmF3IHB1bGxcbiAgICAgICAgLy8gc3RhcnRzIGl0IGNvbmN1cnJlbnRseSB3aXRoIHRoZSBzdHJlYW0gR0VUOyBnZXREZXNlcmlhbGl6ZVN0cmVhbVxuICAgICAgICAvLyBqb2lucyB0aGUgc2FtZSBwcm9taXNlIHdoZW4gYW4gZW5jcnlwdGVkIGZyYW1lIGFycml2ZXMuIFRoaXMgYWxzb1xuICAgICAgICAvLyBhdm9pZHMgaW52b2tpbmcgYXJiaXRyYXJ5IEVuY3J5cHRpb25LZXlQYXJhbSBjYWxsYmFja3MgdHdpY2UuXG4gICAgICAgIGxldCBrZXlQcm9taXNlOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCByZXNvbHZlS2V5ID0gKCk6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgIGtleVByb21pc2UgPz89IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAgcmV0dXJuIGtleVByb21pc2U7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleCxcbiAgICAgICAgICByZXNvbHZlS2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgIGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCByZXNvbHZlS2V5KSxcbiAgICAgICAgICByZXNvbHZlS2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGlyZWN0IHJldml2ZXIgY2FsbGVycyBob2xkIHRoaXMgcmVhZGFibGUuIFRoZSBwdWJsaWMgUnVuIGZhY3RvcnlcbiAgICAgICAgLy8gd3JhcHMgaXQgZm9yIGZpcnN0LXB1bGwgbGF6aW5lc3MgYW5kIHBvbGxzIHRoYXQgd3JhcHBlciBpbnN0ZWFkLlxuICAgICAgICBpZiAob3B0aW9ucz8ub25SZWFkYWJsZVN0YXRlKSBvcHRpb25zLm9uUmVhZGFibGVTdGF0ZShzdGF0ZSk7XG4gICAgICAgIGVsc2UgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZSBoYW5kbGluZyBhcyBgZ2V0U3RlcFJldml2ZXJzLldyaXRhYmxlU3RyZWFtYDogc2VlIGNvbW1lbnRzXG4gICAgICAvLyB0aGVyZSBmb3IgdGhlIGNyb3NzLXJ1biBjYXNlICh3cml0YWJsZSBjYXJyaWVzIGBydW5JZGAgZnJvbVxuICAgICAgLy8gcGFyZW50IOKGkiBjaGlsZCBmb3J3YXJkaW5nIHZpYSBgc3RhcnQoKWApLlxuICAgICAgY29uc3QgdGFyZ2V0UnVuSWQgPSB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnID8gdmFsdWUucnVuSWQgOiBydW5JZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICAgKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUZvcndhcmRlZFdyaXRhYmxlKHtcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAga2V5OiB0YXJnZXRLZXksXG4gICAgICAgIGRlcGxveW1lbnRJZDogdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5OiB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIGNsaWVudCBzaWRlLCBhbmQgcmV0dXJuIHZhbHVlc1xuICogZnJvbSB0aGUgc3RlcHMuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IC0gdXNlcyB0aGUgbW9kdWxhciByZXZpdmVyXG4gICAgLy8gd2hpY2ggY2FsbHMgV09SS0ZMT1dfVVNFX1NURVAgZnJvbSBnbG9iYWwgdG8gcmVjb25zdHJ1Y3Qgc3RlcCBwcm94aWVzXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVxdWVzdC5wcm90b3R5cGUpO1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICAodmFsdWUgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICAodmFsdWUgYXMgYW55KS5yZXNwb25kV2l0aCA9ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ2ByZXNwb25kV2l0aCgpYCBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHN0ZXAgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ01vdmUgdGhlIGByZXNwb25kV2l0aCguLi4pYCBjYWxsIGluc2lkZSBhIGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uIOKAlCBpdCBjYW5ub3QgYmUgaW52b2tlZCBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICAvLyBXb3JrZmxvdyBmdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0OiByZXR1cm5zIGEgZnVuY3Rpb24tbGlrZVxuICAgIC8vIG9iamVjdCB3aXRoIC53b3JrZmxvd0lkIHRoYXQgbWltaWNzIHdoYXQgdGhlIFNXQyBjb21waWxlciBwcm9kdWNlcyxcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBCb2R5SW5pdCB0aGF0IHNob3VsZCBiZSB3cmFwcGVkIGluIGEgZmFrZSBzdHJlYW1cbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIHRoZSBmYWtlIHN0cmVhbSB3aXRoIHRoZSBCb2R5SW5pdFxuICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuYm9keUluaXQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ3VsYXIgc3RyZWFtIGhhbmRsaW5nXG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBbU1RSRUFNX1RZUEVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FycnkgdGhlIHdpcmUtZnJhbWluZyBkZWNpc2lvbiB0aHJvdWdoIHRoZSB3b3JrZmxvdyBWTSBzb1xuICAgICAgICAvLyB0aGF0IHdoZW4gdGhlIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwICh3aGljaCByZWFkc1xuICAgICAgICAvLyB0aGUgYWN0dWFsIGJ5dGVzIGZyb20gdGhlIHNlcnZlcikgd2Uga25vdyB3aGV0aGVyIHRvIHVuZnJhbWUuXG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHVuZGVmaW5lZCBmb3Igc3RyZWFtcyB3aG9zZSBzZXJpYWxpemVkIHJlZiBkaWRuJ3RcbiAgICAgICAgLy8gY2FycnkgdGhlIGZpZWxkOyB0aG9zZSBhcmUgdHJlYXRlZCBhcyBsZWdhY3kgcmF3IGJ5dGVzLlxuICAgICAgICBbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5mcmFtaW5nLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yTWFwID0ge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZCwgaWYgcHJlc2VudCwgc28gdGhhdCB3aGVuIHRoZVxuICAgICAgLy8gaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgdGhlIHdvcmtmbG93IHJlZHVjZXIgY2FuXG4gICAgICAvLyBmb3J3YXJkIGl0IHRocm91Z2ggdG8gdGhlIHN0ZXAgcmV2aXZlci5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUucnVuSWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3duZXIncyBwdWJsaWMga2V5IGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHJ1bklkXG4gICAgICAvLyBhYm92ZS4gV2l0aG91dCBpdCwgZm9yd2FyZGluZyBhIHdyaXRhYmxlIHRocm91Z2ggYSB3b3JrZmxvdyB0byBhIHN0ZXBcbiAgICAgIC8vIHNpbGVudGx5IGRyb3BzIHRoZSBrZXksIGFuZCB0aGUgc3RlcCBmYWxscyBiYWNrIHRvIGZldGNoaW5nIHRoZVxuICAgICAgLy8gb3duZXIncyBzeW1tZXRyaWMga2V5LCB0aGUgcm91bmQgdHJpcCBzZWFsaW5nIGV4aXN0cyB0byByZW1vdmUuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXksXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgZGVzY3JpcHRvcik7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZXZpdmVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0uIFVzZSB0aGVcbiAgICAvLyByZWFsIFdvcmtmbG93QWJvcnRTaWduYWwgY2xhc3Mgc28gYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbikgYWN0dWFsbHlcbiAgICAvLyBmaXJlcyB3aGVuIHRoZSBzaWduYWwgYWJvcnRzICh0aGUgcHJldmlvdXMgbm8tb3Agc3R1YiBzaWxlbnRseSBkcm9wcGVkXG4gICAgLy8gbGlzdGVuZXIgcmVnaXN0cmF0aW9ucywgYSBzaWxlbnQgY29ycmVjdG5lc3MgYnVnIGZvciBuYXR1cmFsIHBhdHRlcm5zXG4gICAgLy8gbGlrZSBgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pYCBhZnRlciByZWNlaXZpbmcgYSBkZXNlcmlhbGl6ZWRcbiAgICAvLyBzaWduYWwpLiBUaGUgc2lnbmFsIGRvZXMgbm90IG93biBhIGhvb2sgc3Vic2NyaXB0aW9uIGhlcmU7IGFib3J0IHN0YXRlXG4gICAgLy8gaXMgZGVsaXZlcmVkIHZpYSB0aGUgZXhpc3RpbmcgcmVwbGF5IG1hY2hpbmVyeSBvbiB0aGUgc291cmNlIHNpZGUuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQUJPUlRfU1RSRUFNX05BTUVdOiB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICB9O1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHN0ZXAgY29udGV4dCAtIHJldHVybnMgcmF3IHN0ZXAgZnVuY3Rpb25cbiAgICAvLyB3aXRoIGNsb3N1cmUgdmFyaWFibGUgc3VwcG9ydCB2aWEgQXN5bmNMb2NhbFN0b3JhZ2UuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGZvdXIgaW5kZXBlbmRlbnQgZmxhZ3MgZnJvbSB0aGUgc2VyaWFsaXplZCBwYXlsb2FkOlxuICAgIC8vICAgLSBgY2xvc3VyZVZhcnNgOiBpbnZva2UgdGhlIGJvZHkgaW5zaWRlIGFuIEFzeW5jTG9jYWxTdG9yYWdlIGZyYW1lXG4gICAgLy8gICAgIHNvIHRoZSBTV0MtZW1pdHRlZCBgV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VgIElJRkUgaW4gdGhlXG4gICAgLy8gICAgIGhvaXN0ZWQgYm9keSBjYW4gcHVsbCB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgYmFjayBvdXQuXG4gICAgLy8gICAtIGBib3VuZFRoaXNgOiAgIGEgYHRoaXNgIHZhbHVlIGNhcHR1cmVkIGJ5XG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZSAobGV4aWNhbC1gdGhpc2BcbiAgICAvLyAgICAgYXJyb3cgc3RlcHMpLiBUaGUgd3JhcHBlciBpbnZva2VzIHRoZSBib2R5IHZpYVxuICAgIC8vICAgICBgc3RlcEZuLmFwcGx5KGJvdW5kVGhpcywgYXJncylgIHNvIHRoZSBib2R5IHNlZXMgdGhlIHNhbWVcbiAgICAvLyAgICAgYHRoaXNgIGl0IHdvdWxkIGhhdmUgaGFkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUuIFByb3BlcnR5XG4gICAgLy8gICAgIHByZXNlbmNlLCBub3QgdHJ1dGhpbmVzcywgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZVxuICAgIC8vICAgICBgYmluZChudWxsKWAgYW5kIGBiaW5kKHVuZGVmaW5lZClgIGFyZSBib3RoIGxlZ2FsIGFuZCBzaG91bGRcbiAgICAvLyAgICAgcm91bmQtdHJpcCBmYWl0aGZ1bGx5LlxuICAgIC8vICAgLSBgYm91bmRBcmdzYDogICBwcmVmaWxsZWQgYXJncyBmcm9tXG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzQXJnLCB4LCB5KWAuIFByZXBlbmRlZCB0byB0aGUgY2FsbCBhcmdzXG4gICAgLy8gICAgIHNvIHBhcnRpYWwgYXBwbGljYXRpb24gc3Vydml2ZXMgc2VyaWFsaXphdGlvbi5cbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc3RlcElkID0gdmFsdWUuc3RlcElkO1xuICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSB2YWx1ZS5jbG9zdXJlVmFycztcbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdib3VuZFRoaXMnIGluIHZhbHVlO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzID8gdmFsdWUuYm91bmRUaGlzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG5cbiAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwSWQpO1xuICAgICAgaWYgKCFzdGVwRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgU3RlcCBmdW5jdGlvbiBcIiR7c3RlcElkfVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBzdGVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnTWFrZSBzdXJlIHRoZSBzdGVwIGZpbGUgaXMgaW5jbHVkZWQgaW4geW91ciBidWlsZCAoaS5lLiBpdCBpcyBsaXN0ZWQgaW4gdGhlIHdvcmtmbG93IG1hbmlmZXN0KSwgYW5kIHRoYXQgdGhlIFNXQyBwbHVnaW4gaXMgY29uZmlndXJlZCBmb3IgdGhlIGZpbGUuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogbm90aGluZyB0byB3cmFwLlxuICAgICAgaWYgKCFjbG9zdXJlVmFycyAmJiAhaGFzQm91bmRUaGlzICYmIGJvdW5kQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlZFN0ZXBGbiA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBjYWxsVGhpcyA9IGhhc0JvdW5kVGhpcyA/IGJvdW5kVGhpcyA6IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxBcmdzID0gYm91bmRBcmdzLmxlbmd0aCA+IDAgPyBbLi4uYm91bmRBcmdzLCAuLi5hcmdzXSA6IGFyZ3M7XG4gICAgICAgIGlmIChjbG9zdXJlVmFycykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgY2FsbCBzdGVwIGZ1bmN0aW9uIHdpdGggY2xvc3VyZSB2YXJpYWJsZXMgb3V0c2lkZSBzdGVwIGNvbnRleHQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjbG9zdXJlVmFycyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjb250ZXh0U3RvcmFnZS5ydW4obmV3Q29udGV4dCwgKCkgPT5cbiAgICAgICAgICAgIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncyk7XG4gICAgICB9IGFzIGFueTtcblxuICAgICAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gb3JpZ2luYWwgc3RlcCBmdW5jdGlvblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICduYW1lJywge1xuICAgICAgICB2YWx1ZTogc3RlcEZuLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnc3RlcElkJywge1xuICAgICAgICB2YWx1ZTogc3RlcElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAoc3RlcEZuLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cmFwcGVkU3RlcEZuLm1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZWRTdGVwRm47XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGggPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JpdGVyID0gcmVzcG9uc2VXcml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVzcG9uc2UpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIGluIHRoZSBzdGVwIGVudmlyb25tZW50XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyIHN0ZXAuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlczpcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCBkZXBsb3ltZW50SWQpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZS1ydW4gY2FzZTogdGhlIHdyaXRhYmxlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcnVuLiBVc2UgdGhlXG4gICAgICAvLyBsb2NhbCBjcnlwdG9LZXkgYW5kIHdyaXRlIHRvIHRoZSBsb2NhbCBydW5JZCdzIHNlcnZlciBzdHJlYW0uXG4gICAgICAvL1xuICAgICAgLy8gQ3Jvc3MtcnVuIGNhc2UgKHBhcmVudCDihpIgY2hpbGQgdmlhIGBzdGFydCgpYCk6IHRoZSBkZXNjcmlwdG9yXG4gICAgICAvLyBjYXJyaWVzIHRoZSBvcmlnaW5hbCBgcnVuSWRgIGFuZCBgbmFtZWAuIE9wZW4gYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZSBUSEFUIHJ1bidzIGtleVxuICAgICAgLy8gZm9yIGVuY3J5cHRpb24uIFRoZSByZXNvbHV0aW9uIGlzIGFzeW5jIGJ1dCBkb2Vzbid0IG5lZWQgdG9cbiAgICAgIC8vIGJsb2NrIHJldml2ZXIgcmV0dXJuOiBgZ2V0U2VyaWFsaXplU3RyZWFtYCBhY2NlcHRzIHRoZVxuICAgICAgLy8gYFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPmAgZGlyZWN0bHkgYW5kIGF3YWl0cyBpdCBsYXppbHlcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBjaHVuayB3cml0dGVuLiBUaGUga2V5IGlzIGltcG9ydGVkIGVuY3J5cHQtb25seVxuICAgICAgLy8gc28gdGhlIHJlY2VpdmluZyBydW4gY2FuIG5ldmVyIGRlY3J5cHQgYW55dGhpbmcgZWxzZSBvbiB0aGVcbiAgICAgIC8vIG93bmluZyBydW4ncyBzdHJlYW07IGl0IGNhbiBvbmx5IGNvbnRyaWJ1dGUgbmV3IHdyaXRlcy5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXREZXBsb3ltZW50SWQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUuZGVwbG95bWVudElkXG4gICAgICAgICAgOiB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICAgID8gZGVwbG95bWVudElkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgICAgICAgIHRhcmdldERlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgLy8gUmVjb3JkIHRoZSB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCBzbyBkb3duc3RyZWFtIHJlZHVjZXJzIGNhblxuICAgICAgLy8gcmVjb2duaXplIHRoYXQgdGhpcyB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtLiBXaGVuIGZvcndhcmRlZCBhY3Jvc3MgYHN0YXJ0KClgIGFnYWluIChlLmcuXG4gICAgICAvLyB0aGUgY2hpbGQgcGFzc2VzIHRoaXMgd3JpdGFibGUgb24gdG8gYSBncmFuZGNoaWxkKSwgdGhlXG4gICAgICAvLyBleHRlcm5hbCByZWR1Y2VyIG5lZWRzIGJvdGggdG8gZW1pdCB0aGUgb3JpZ2luYWwgYHJ1bklkYCBpblxuICAgICAgLy8gdGhlIGRlc2NyaXB0b3IuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodGFyZ2V0RGVwbG95bWVudElkKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGFyZ2V0RGVwbG95bWVudElkLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgdGhlIG93bmVyJ3MgcHVibGljIGtleSBvbiB0aGUgaGFuZGxlIHNvIGEgZnVydGhlciBmb3J3YXJkIHN0YXlzIG9uXG4gICAgICAvLyB0aGUgemVyby1sb29rdXAgc2VhbGVkIHBhdGguXG4gICAgICAvL1xuICAgICAgLy8gV2hlbiB0aGUgZGVzY3JpcHRvciBjYXJyaWVzIG5vIGtleSBhbmQgdGhlIHN0cmVhbSBiZWxvbmdzIHRvIFRISVMgcnVuLFxuICAgICAgLy8gZGVyaXZlIGl0LiBBIHdyaXRhYmxlIHRha2VuIHdpdGggYGdldFdyaXRhYmxlKClgIGluIGEgd29ya2Zsb3cgYm9keSBoYXNcbiAgICAgIC8vIG9ubHkgYSBuYW1lIG9uIGl0ICh0aGUgd29ya2Zsb3cgVk0gaG9sZHMgbm8ga2V5IG1hdGVyaWFsIGJ5IGRlc2lnbiksXG4gICAgICAvLyBzbyBub3RoaW5nIGNvdWxkIHB1Ymxpc2ggdGhlIGtleSB3aGVuIHRoZSBoYW5kbGUgd2FzIGNyZWF0ZWQuIFJldml2aW5nXG4gICAgICAvLyBoYXBwZW5zIGluIGEgc3RlcCwgd2hpY2ggZG9lcyBob2xkIHRoaXMgcnVuJ3Mga2V5LCBhbmQgYW55IGxhdGVyXG4gICAgICAvLyBmb3J3YXJkIHRoZW4gY29waWVzIHRoZSBzeW1ib2wuXG4gICAgICAvL1xuICAgICAgLy8gSXQgaGFzIHRvIGhhcHBlbiBoZXJlIHJhdGhlciB0aGFuIGF0IHNlcmlhbGl6YXRpb24gdGltZTogYHN0YXJ0KClgXG4gICAgICAvLyBkZWh5ZHJhdGVzIGl0cyBhcmd1bWVudHMgd2l0aCB0aGUgQ0hJTEQncyBydW5JZCBhbmQgdGhlIENISUxEJ3Mga2V5LCBzb1xuICAgICAgLy8gdGhlIG93bmluZyBydW4ncyBrZXkgaXMgbm8gbG9uZ2VyIGluIHNjb3BlIGJ5IHRoZW4uXG4gICAgICAvL1xuICAgICAgLy8gYHRhcmdldFJ1bklkID09PSBydW5JZGAgaXMgdGhlIGd1YXJkIHRoYXQgbWF0dGVycy4gRm9yIGEgc3RyZWFtIGFub3RoZXJcbiAgICAgIC8vIHJ1biBvd25zIHdlIG11c3Qgbm90IGFkdmVydGlzZSBvdXIga2V5OiB0aGUgcmVjZWl2ZXIgd291bGQgc2VhbCB0byB1c1xuICAgICAgLy8gYW5kIHRoZSByZWFsIG93bmVyIGNvdWxkIG5ldmVyIG9wZW4gd2hhdCBpdCB3cm90ZS5cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgIT09ICdzdHJpbmcnICYmXG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICBpc1J1blBheWxvYWRLZXlzKGNyeXB0b0tleSlcbiAgICAgICkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgc2VyaWFsaXplLndyaXRhYmxlLFxuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IGJ5dGVzVG9CYXNlNjQoY3J5cHRvS2V5LmtleVBhaXIucHVibGljS2V5KSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5jcnlwdGlvbiBIZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBgZW5jcnlwdGAvYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYFxuLy8gYnV0IGFyZSBrZXB0IGFzIG5hbWVkIGV4cG9ydHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29uc3VtZXJzLlxuXG4vKipcbiAqIEVuY3J5cHQgZGF0YSBpZiB0aGUgd29ybGQgc3VwcG9ydHMgZW5jcnlwdGlvbi5cbiAqIFJldHVybnMgb3JpZ2luYWwgZGF0YSBpZiBlbmNyeXB0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBlbmNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2AgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1heWJlRW5jcnlwdChcbiAgZGF0YTogVWludDhBcnJheSxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBlbmNyeXB0KGRhdGEsIGtleSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIGlmIGl0IGhhcyB0aGUgJ2VuY3InIHByZWZpeC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVEZWNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHJldHVybiBkZWNyeXB0KGRhdGEsIGtleSk7XG59XG5cbi8qKlxuICogUmVwbGF5IGh5ZHJhdGlvbiBoYXMgdHdvIHN0YWdlczpcbiAqXG4gKiAxLiBIb3N0LXNpZGUgcHJlcGFyYXRpb24gZGVjcnlwdHMgYW5kIGRlY29tcHJlc3NlcyBwZXJzaXN0ZWQgZGF0YS4gVGhhdCB3b3JrXG4gKiAgICBpcyBpbmRlcGVuZGVudCBvZiBhIHdvcmtmbG93IFZNIGFuZCBjYW4gYmUgY2FjaGVkIGFjcm9zcyByZXBsYXkgVk1zLlxuICogMi4gRGVzZXJpYWxpemF0aW9uIHJldml2ZXMgdGhlIHByZXBhcmVkIHJlcHJlc2VudGF0aW9uIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAqICAgIFZNJ3MgZ2xvYmFscy4gSXQgbXVzdCBydW4gYWdhaW4gZm9yIGV2ZXJ5IFZNIHRvIHByb2R1Y2UgZnJlc2ggb2JqZWN0IGdyYXBoc1xuICogICAgYW5kIGNvcnJlY3RseSBzY29wZWQgV29ya2Zsb3cgb2JqZWN0cy5cbiAqXG4gKiBgZGF0YWAgaXMgdGhlIGJvdW5kYXJ5IGJldHdlZW4gdGhvc2Ugc3RhZ2VzLiBGb3IgY3VycmVudC1mb3JtYXQgcGF5bG9hZHMgaXRcbiAqIGlzIHN0aWxsIGZvcm1hdC1wcmVmaXhlZCBzZXJpYWxpemVkIGJ5dGVzLCBub3QgYSBsaXZlIEphdmFTY3JpcHQgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWRSZXBsYXlQYXlsb2FkIHtcbiAgcmVhZG9ubHkgZGF0YTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBTd2FwcGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbiBzdGFnZS4gU3VwcG9ydGluZ1xuICogYm90aCBkaXJlY3QgYW5kIHByb21pc2VkIHJlc3VsdHMgbGV0cyBhIGZ1dHVyZSBzeW5jaHJvbm91cyBOb2RlIGRlY3J5cHRvciB1c2VcbiAqIHRoZSBzYW1lIGNhY2hlIGNvbnRyYWN0IGFzIHRvZGF5J3MgYXN5bmNocm9ub3VzIFdlYiBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxheVBheWxvYWRQcmVwYXJlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZFxuKSA9PiBQcmVwYXJlZFJlcGxheVBheWxvYWQgfCBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD47XG5cbi8qKlxuICogRGVjcnlwdCBhbmQgZGVjb21wcmVzcyBwZXJzaXN0ZWQgZGF0YSB3aXRob3V0IHBhcnNpbmcgaXQgaW50byBKYXZhU2NyaXB0LlxuICogTGVnYWN5IG5vbi1iaW5hcnkgdmFsdWVzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIHRoZWlyIGNvbnN1bWVyIHRvIHJldml2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVSZXBsYXlQYXlsb2FkOiBSZXBsYXlQYXlsb2FkUHJlcGFyZXIgPSBhc3luYyAoXG4gIHZhbHVlLFxuICBrZXlcbikgPT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBkZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiB7IGRhdGE6IHByZXBhcmVkIH07XG59O1xuXG4vKipcbiAqIFBhcnNlIGEgcHJlcGFyZWQgd29ya2Zsb3cgYXJndW1lbnQgb3Igc3VjY2Vzc2Z1bCBzdGVwL2hvb2sgcGF5bG9hZCB1c2luZyB0aGVcbiAqIGN1cnJlbnQgd29ya2Zsb3cgVk0ncyBnbG9iYWxzIGFuZCByZXZpdmVycy4gRWFjaCBjYWxsIGludGVudGlvbmFsbHkgY3JlYXRlc1xuICogYSBmcmVzaCBvYmplY3QgZ3JhcGggc28gbXV0YXRpb25zIGNhbm5vdCBsZWFrIGFjcm9zcyByZXBsYXkgaXRlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBhbnkge1xuICByZXR1cm4gd29ya2Zsb3dNb2R1bGUuZGVzZXJpYWxpemUocHJlcGFyZWQuZGF0YSwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2UgYSBwcmVwYXJlZCBzdGVwIGVycm9yIHVzaW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IFZNJ3MgY2xhc3MgcmV2aXZlcnMuXG4gKiBUaGlzIHByZXNlcnZlcyB0aHJvd24tdmFsdWUgaWRlbnRpdHkgd2l0aG91dCBzaGFyaW5nIG9iamVjdHMgYmV0d2VlbiBWTXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVByZXBhcmVkU3RlcEVycm9yKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiB1bmtub3duIHtcbiAgY29uc3QgeyBkYXRhIH0gPSBwcmVwYXJlZDtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHVuZmxhdHRlbihkYXRhIGFzIGFueVtdLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkYXRhKTtcbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgIHJldHVybiBwYXJzZShzdHIsIHtcbiAgICAgIC4uLmdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVoeWRyYXRlIC8gSHlkcmF0ZSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIG1vZGUgbW9kdWxlcyAod29ya2Zsb3csIHN0ZXAsIGNsaWVudCkgcGFzc2luZ1xuLy8gbW9kZS1zcGVjaWZpYyBzdHJlYW0gYW5kIFJlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMvcmV2aXZlcnMgYXMgZXh0cmEgb3B0aW9ucy5cbi8vIFRoZSB2MUNvbXBhdCBwYXRoIGlzIGhhbmRsZWQgaW5saW5lIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIHRoZSBtb2R1bGVzLlxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBgc3RhcnQoKWAgZnVuY3Rpb24gdG8gc2VyaWFsaXplIHRoZSB3b3JrZmxvdyBhcmd1bWVudHNcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGFuZCB0aGVuIGh5ZHJhdGVkIGZyb21cbiAqIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKHJlcXVpcmVkIGZvciBlbmNyeXB0aW9uIGNvbnRleHQpXG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eTogc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZSxcbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAga2V5LFxuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByZWFkYmFja09wc1xuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICByZWFkYmFja09wc1xuICAgICAgICApXG4gICAgICApLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICd3b3JrZmxvdyBhcmd1bWVudHMnLFxuICAgICAgY2F1c2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB0byBoeWRyYXRlIHRoZSB3b3JrZmxvd1xuICogYXJndW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlIGF0IHRoZSBzdGFydCBvZiB3b3JrZmxvdyBleGVjdXRpb24uIEEgcHJlcGFyZWRcbiAqIHBheWxvYWQgc2tpcHMgaG9zdC1zaWRlIGRlY3J5cHQvZGVjb21wcmVzcyBidXQgYWx3YXlzIHBlcmZvcm1zIFZNIHJldml2YWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fSxcbiAgcHJlcGFyZWQ/OiBQcmVwYXJlZFJlcGxheVBheWxvYWRcbik6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZVByZXBhcmVkUmVwbGF5UGF5bG9hZChcbiAgICBwcmVwYXJlZCA/PyAoYXdhaXQgcHJlcGFyZVJlcGxheVBheWxvYWQodmFsdWUsIGtleSkpLFxuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzXG4gICk7XG59XG5cbi8qKlxuICogRGVoeWRyYXRlIHdvcmtmbG93IHJldHVybiB2YWx1ZSBmb3Igc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICAvKipcbiAgICogT3B0aW9uYWwgc2luayByZWNlaXZpbmcgdGhlIGZpcnN0IGZpdmUgc2FtcGxlcyBhbmQgZXhhY3QgdG90YWwgY291bnQgb2ZcbiAgICogd29ya2Zsb3ctY29kZSBleGVjdXRpb25zIHNlcmlhbGl6YXRpb24gY291bGQgbm90IGF2b2lkLiBUaGUgZGlhZ25vc3RpY3NcbiAgICogYXJlIGVtaXR0ZWQgYXMgc3BhbiBhdHRyaWJ1dGVzIGVpdGhlciB3YXksIHNvIG9taXR0aW5nIHRoaXMgbG9zZXMgbm90aGluZ1xuICAgKiBvYnNlcnZhYmlsaXR5LXdpc2UuIFRoZSByZXRhaW5lZC1WTSBnYXRlIGluIHJ1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLnRzXG4gICAqIHBhc3NlcyBvbmUgZm9yIHN0ZXAtaW5wdXQgZGVoeWRyYXRpb24uXG4gICAqL1xuICBndWVzdENvZGVTdGF0c091dD86IEd1ZXN0Q29kZVN0YXRzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgZ3Vlc3RDb2RlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0gZ3Vlc3RDb2RlU3RhdHNPdXQgPz8ge1xuICAgICAgZXhlY3V0aW9uczogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICAgIGd1ZXN0Q29kZVN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICBhd2FpdCByZWNvcmRHdWVzdENvZGVFeGVjdXRpb25zKGd1ZXN0Q29kZVN0YXRzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICd3b3JrZmxvdyByZXR1cm4gdmFsdWUnLFxuICAgICAgY2F1c2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBjbGllbnQgc2lkZSB0byBoeWRyYXRlIHRoZSB3b3JrZmxvdyByZXR1cm4gdmFsdWVcbiAqIG9mIGEgY29tcGxldGVkIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnRNb2R1bGUuZGVzZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoXG4gICAgICAgIGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIGEgc3RlcCBpcyBiZWluZyBjcmVhdGVkLlxuICogRGVoeWRyYXRlcyB2YWx1ZXMgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICAvKiogU2VlIGBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlYC4gKi9cbiAgZ3Vlc3RDb2RlU3RhdHNPdXQ/OiBHdWVzdENvZGVTdGF0c1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGd1ZXN0Q29kZVN0YXRzOiBHdWVzdENvZGVTdGF0cyA9IGd1ZXN0Q29kZVN0YXRzT3V0ID8/IHtcbiAgICAgIGV4ZWN1dGlvbnM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgICBndWVzdENvZGVTdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgYXdhaXQgcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhndWVzdENvZGVTdGF0cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3N0ZXAgYXJndW1lbnRzJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGV4ZWN1dG9yIHRvIGh5ZHJhdGUgdGhlIGFyZ3VtZW50cyBvZiBhIHN0ZXBcbiAqIGZyb20gdGhlIGRhdGFiYXNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RlcCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTxhbnk+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fSxcbiAgZGVwbG95bWVudElkPzogc3RyaW5nXG4pOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuZGVzZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoXG4gICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSwgZGVwbG95bWVudElkKVxuICAgICAgKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgICBjb21wcmVzc2lvblN0YXRzLFxuICB9KTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3Igd2hlbiBhIHN0ZXAgaGFzIGNvbXBsZXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlcmlhbGl6ZVxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBlbmNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIHYxQ29tcGF0IC0gRW5hYmxlIGxlZ2FjeSB2MSBjb21wYXRpYmlsaXR5IG1vZGVcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZXRoZXIgdGhlIHRhcmdldCBydW4gY2FuIGRlY29kZSB3aXJlLWZyYW1lZFxuICogICBieXRlIHN0cmVhbXMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IGRlcGxveW1lbnQncyBjYXBhYmlsaXR5OiBzZWVcbiAqICAgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzIHRvIGBmYWxzZWAgZm9yXG4gKiAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBvcmRlciB0aGUgZmlyc3QgY2h1bmsgb2YgYSByZXR1cm5lZCBzdHJlYW0gYWZ0ZXJcbiAgLy8gdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWRlZCBpbnRvIHRoZSBzdGVwIHJlZHVjZXJzJyBzdHJlYW1cbiAgLy8gc2luay4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPixcbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBrZXksXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoXG4gICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3N0ZXAgcmV0dXJuIHZhbHVlJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB3aGVuIGEgc3RlcCB0aHJvd3MuIERlaHlkcmF0ZXMgdGhlIHRocm93blxuICogdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50IGludG8gYSBmb3JtYXQgdGhhdCBjYW5cbiAqIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGBzdGVwX2ZhaWxlZGAgb3IgYHN0ZXBfcmV0cnlpbmdgIGV2ZW50LlxuICpcbiAqIEFueSBKYXZhU2NyaXB0IHZhbHVlIGNhbiBiZSB0aHJvd24gKHN0cmluZ3MsIG51bWJlcnMsIG9iamVjdHMsIEVycm9ycyxcbiAqIEVycm9yIHN1YmNsYXNzZXMpLCBzbyB0aGUgc2FtZSBzZXJpYWxpemF0aW9uIHBpcGVsaW5lIHVzZWQgZm9yIHN0ZXBcbiAqIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyBpcyBhcHBsaWVkIGhlcmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFN0ZXBSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmc6IGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYVxuICogYHN0ZXBfZmFpbGVkYCBvciBgc3RlcF9yZXRyeWluZ2AgZXZlbnQuIEh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbVxuICogdGhlIGRhdGFiYXNlIHNvIHRoZSB3b3JrZmxvdyBjYW4gc2VlIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHBhcmFtIHByZXBhcmVkIC0gT3B0aW9uYWwgY2FjaGVkIGRlY3J5cHQvZGVjb21wcmVzcyByZXN1bHRcbiAqIEByZXR1cm5zIFRoZSBoeWRyYXRlZCB0aHJvd24gdmFsdWUsIHJlYWR5IHRvIHJlamVjdCB0aGUgc3RlcCBwcm9taXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRTdGVwRXJyb3IoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gdGhlIHdvcmtmbG93IGl0c2VsZiB0aHJvd3MuXG4gKiBEZWh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgcnVuX2ZhaWxlZGAgZXZlbnQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGNvbXByZXNzaW9uID0gZmFsc2Vcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkXG4gICAgKSBhcyBVaW50OEFycmF5O1xuICAgIC8vIENvbXByZXNzIGJlZm9yZSBlbmNyeXB0aW5nOiBlbmNyeXB0ZWQgYnl0ZXMgZG9uJ3QgY29tcHJlc3MuXG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBjb21wcmVzcyhcbiAgICAgIHNlcmlhbGl6ZWQsXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICBjb21wcmVzc2VkIGFzIFVpbnQ4QXJyYXksXG4gICAgICBrZXlcbiAgICApKSBhcyBVaW50OEFycmF5O1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcigncnVuIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBjbGllbnQgc2lkZSAob3Igb2JzZXJ2YWJpbGl0eSB0b29scykgdG8gaHlkcmF0ZSB0aGUgcnVuXG4gKiBlcnJvciB2YWx1ZSBvZiBhIGZhaWxlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcmV0dXJucyBUaGUgaHlkcmF0ZWQgdGhyb3duIHZhbHVlLCByZWFkeSB0byBiZSBjb25zdW1lZCBieSB0aGUgY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUnVuRXJyb3IoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IGRlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcblxuICBpZiAoIShkZWNyeXB0ZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgbm90ZSBpbiBgaHlkcmF0ZVN0ZXBFcnJvcmA6IHRoaXMgYnJhbmNoIGlzIGZvclxuICAgIC8vIGRldmFsdWUgZmxhdHRlbmVkIGFycmF5cyBmcm9tIGxlZ2FjeSBjYWxsZXJzOyBjdXJyZW50IFNESyB2ZXJzaW9uc1xuICAgIC8vIGFsd2F5cyBlbWl0IGEgVWludDhBcnJheSwgYW5kIGEgbWlzc2hhcGVuIHZhbHVlIGhlcmUgaW50ZW50aW9uYWxseVxuICAgIC8vIHRocm93cyB2aWEgYHVuZmxhdHRlbmAgc28gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaCBpbiBvMTF5IGhlbHBlcnNcbiAgICAvLyBzdXJmYWNlcyB0aGUgaXNzdWUgcmF0aGVyIHRoYW4gbWFza2luZyBpdC5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqIEh5ZHJhdGVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdGVwIGZyb20gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEBwYXJhbSBwcmVwYXJlZCAtIE9wdGlvbmFsIGNhY2hlZCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0XG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nXG4gKiBvZiBhIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFJlcGxheVBheWxvYWQoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vLyAtLS0tIEhlbHBlcnMgdG8gZXh0cmFjdCBzdHJlYW0vUmVxdWVzdC9SZXNwb25zZSByZWR1Y2VycyBhbmQgcmV2aXZlcnMgLS0tLVxuLy8gVGhlIG1vZGUtc3BlY2lmaWMgZ2V0KlJlZHVjZXJzL2dldCpSZXZpdmVycyBmdW5jdGlvbnMgcmV0dXJuIG9iamVjdHMgdGhhdFxuLy8gaW5jbHVkZSBib3RoIFwiY29tbW9uXCIgZW50cmllcyAoRGF0ZSwgRXJyb3IsIE1hcCwgZXRjLikgYW5kIG1vZGUtc3BlY2lmaWNcbi8vIGVudHJpZXMgKFJlYWRhYmxlU3RyZWFtLCBXcml0YWJsZVN0cmVhbSwgUmVxdWVzdCwgUmVzcG9uc2UsIFN0ZXBGdW5jdGlvbikuXG4vLyBUaGUgY29tbW9uIGVudHJpZXMgYXJlIGFscmVhZHkgY29tcG9zZWQgYnkgdGhlIGNvZGVjLiBXZSBvbmx5IG5lZWQgdG9cbi8vIHBhc3MgdGhyb3VnaCB0aGUgbW9kZS1zcGVjaWZpYyBlbnRyaWVzIGFzIGV4dHJhUmVkdWNlcnMvZXh0cmFSZXZpdmVycy5cblxuY29uc3QgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMgPSBbXG4gICdSZWFkYWJsZVN0cmVhbScsXG4gICdXcml0YWJsZVN0cmVhbScsXG4gICdSZXF1ZXN0JyxcbiAgJ1Jlc3BvbnNlJyxcbiAgJ1N0ZXBGdW5jdGlvbicsXG4gIC8vIFdpcmUgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHRocm91Z2ggdGhlIGNsaWVudCBzZXJpYWxpemF0aW9uIHBhdGggc29cbiAgLy8gc2lnbmFscyByZWFjaGFibGUgdmlhIFJlcXVlc3Quc2lnbmFsIChvciBhcyBkaXJlY3QgYXJndW1lbnRzKSBnZXQgdGhlaXJcbiAgLy8gZGVkaWNhdGVkIHJlZHVjZXIuIFdpdGhvdXQgdGhpcywgZGV2YWx1ZSBmYWxscyBiYWNrIHRvIGl0cyBhcmJpdHJhcnktUE9KT1xuICAvLyBwYXRoIGFuZCBmYWlscyBmb3IgYW55IHNpZ25hbCB0aGUgUmVxdWVzdCByZWR1Y2VyIGZvcndhcmRzLlxuICAnQWJvcnRDb250cm9sbGVyJyxcbiAgJ0Fib3J0U2lnbmFsJyxcbl0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgYWxsUmVkdWNlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZWR1Y2Vycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICBhbGxSZXZpdmVyczogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMpIHtcbiAgICBpZiAoa2V5IGluIGFsbFJldml2ZXJzKSB7XG4gICAgICBleHRyYVtrZXldID0gYWxsUmV2aXZlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuIl19
3250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsb0JBQW9CLEVBRXBCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixzQkFBc0IsR0FDdkIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLDREQUE0RDtBQUM1RCxzRUFBc0U7QUFDdEUsc0RBQXNEO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEdBQ25CLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxLQUFLLFlBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBRUwsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsT0FBTyxFQUNQLG9CQUFvQixFQUVwQixPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFlBQVksRUFHWixvQkFBb0IsRUFDcEIsY0FBYyxFQUVkLE1BQU0sR0FDUCxNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIscUJBQXFCLEdBQ3RCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixzQkFBc0IsRUFDdEIsV0FBVyxFQUNYLGdCQUFnQixHQUNqQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFFTCxxQkFBcUIsRUFDckIsWUFBWSxHQUNiLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsR0FDakIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixJQUFJLDJCQUEyQixFQUNoRCxNQUFNLEdBQ1AsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQUN2QixNQUFNLDJDQUEyQyxDQUFDO0FBQ25ELE9BQU8sS0FBSyxVQUFVLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUVMLGNBQWMsRUFDZCxtQkFBbUIsR0FDcEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEtBQUssY0FBYyxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsa0NBQWtDLEVBQ2xDLCtCQUErQixFQUMvQiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLHlCQUF5QixHQUMxQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEtBQUssSUFBSSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXJFLHVFQUF1RTtBQUN2RSx3RUFBd0U7QUFDeEUsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLFVBQVUsRUFNVixNQUFNLEVBQ04sY0FBYyxFQUNkLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFFBQVEsR0FDVCxDQUFDO0FBT0Y7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxHQUFHLGdCQUFnQixFQUFFLENBQUM7QUFFdkM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQXNCO0lBQ2xELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7QUFDWixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRTVCOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxLQUFjO0lBQzlDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxZQUFZLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDckUsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssWUFBWSxvQkFBb0IsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQzlCLEtBQXVCLEVBQ3ZCLFNBQXNDO0lBRXRDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtRQUFFLE9BQU87SUFDNUIsb0VBQW9FO0lBQ3BFLDBEQUEwRDtJQUMxRCxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLGFBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNqQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7WUFDekMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7WUFDMUQsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUM7WUFDakQsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsaUJBQWlCLENBQUM7WUFDekQsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLGlCQUFpQixHQUFHLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQ2hDLENBQUMsR0FBRyxXQUFXLEdBQUcsaUJBQWlCLENBQ3BDO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsNEJBQTRCO0lBQzlCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLHlCQUF5QixDQUFDLEtBQXFCO0lBQzVELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDekUsSUFBSSxlQUFlLEtBQUssQ0FBQztRQUFFLE9BQU87SUFDbEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxhQUFhLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLElBQUksR0FBRyxDQUNSLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDekIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDOUMsQ0FDRjtTQUNGLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ2pCLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLGVBQWUsQ0FBQztZQUN6RCxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUM7U0FDL0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDRCQUE0QjtJQUM5QixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsUUFBMkIsRUFDM0IsU0FBNkI7SUFFN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNsQyxnRUFBZ0U7SUFDaEUscUVBQXFFO0lBQ3JFLHNFQUFzRTtJQUN0RSxpREFBaUQ7SUFDakQsTUFBTSxRQUFRLEdBQUc7UUFDZixRQUFRLEVBQUUsS0FBSztRQUNmLEdBQUcsRUFBRSxTQUFtQztLQUN6QyxDQUFDO0lBQ0YsMkVBQTJFO0lBQzNFLHNDQUFzQztJQUN0QyxJQUFJLFdBQTZELENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQWtCO1FBQ2xELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVU7WUFDL0IsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3ZCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDckQsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7b0JBQ3pCLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUMvQixXQUFXLEdBQUcsaUJBQWlCLENBQzdCLFFBQVEsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQy9CLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNqQixDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLFFBQVEsR0FBRyxzQkFBc0IsQ0FDbkMsbUJBQW1CLENBQUMsVUFBVSxFQUM5QixPQUFPLENBQ00sQ0FBQztnQkFFaEIsa0RBQWtEO2dCQUNsRCxpRUFBaUU7Z0JBQ2pFLDBEQUEwRDtnQkFDMUQsRUFBRTtnQkFDRixnRUFBZ0U7Z0JBQ2hFLHVFQUF1RTtnQkFDdkUsK0RBQStEO2dCQUMvRCxXQUFXO2dCQUNYLEVBQUU7Z0JBQ0Ysa0VBQWtFO2dCQUNsRSx1RUFBdUU7Z0JBQ3ZFLHVFQUF1RTtnQkFDdkUsbUVBQW1FO2dCQUNuRSw4REFBOEQ7Z0JBQzlELElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLFFBQVEsR0FBRyxzQkFBc0IsQ0FDL0IsbUJBQW1CLENBQUMsTUFBTSxFQUMxQixNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ25CLENBQUM7Z0JBQ2xCLENBQUM7cUJBQU0sSUFBSSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3hCLFFBQVEsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQWUsQ0FBQztnQkFDbkUsQ0FBQztnQkFFRCw4REFBOEQ7Z0JBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDdkMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZiw2REFBNkQ7Z0JBQzdELHdEQUF3RDtnQkFDeEQsbUNBQW1DO2dCQUNuQyxJQUFJLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNyQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4QixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FDaEQsY0FBYyxFQUNkLEtBQUssQ0FDTixDQUFDO2dCQUNGLFVBQVUsQ0FBQyxLQUFLLENBQ2QsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ3hELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFFBQTJCLEVBQzNCLFNBQTZCO0lBRTdCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsZ0VBQWdFO0lBQ2hFLE1BQU0sUUFBUSxHQUFHO1FBQ2YsUUFBUSxFQUFFLEtBQUs7UUFDZixHQUFHLEVBQUUsU0FBbUM7S0FDekMsQ0FBQztJQUNGLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsbUJBQW1CO0lBQ25CLElBQUksV0FBNkQsQ0FBQztJQUVsRSxTQUFTLGNBQWMsQ0FBQyxJQUFnQjtRQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6QixTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsVUFBaUQ7UUFFakQsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsUUFBUSxDQUFDLEdBQUcsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFFLENBQUM7UUFDSCxDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE9BQU8sTUFBTSxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksUUFBUSxDQUM5QixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV0QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLEdBQUcsV0FBVyxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sQ0FBQyx1Q0FBdUM7WUFDaEQsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQzVCLGlCQUFpQixFQUNqQixpQkFBaUIsR0FBRyxXQUFXLENBQ2hDLENBQUM7WUFDRixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxXQUFXLENBQUMsQ0FBQztZQUV2RCxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXhELG1FQUFtRTtZQUNuRSxtRUFBbUU7WUFDbkUsK0RBQStEO1lBQy9ELElBQ0UsTUFBTSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7Z0JBQ3hDLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQ3JDLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztnQkFDckQscUVBQXFFO2dCQUNyRSxvRUFBb0U7Z0JBQ3BFLDJDQUEyQztnQkFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTTtvQkFDbkIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNaLFVBQVUsQ0FBQyxLQUFLLENBQ2QsSUFBSSxzQkFBc0IsQ0FDeEIsTUFBTTt3QkFDSixDQUFDLENBQUMsa0VBQWtFOzRCQUNoRSx3RUFBd0U7d0JBQzVFLENBQUMsQ0FBQyx3RUFBd0U7NEJBQ3RFLG1FQUFtRSxFQUN6RTt3QkFDRSxPQUFPLEVBQUU7NEJBQ1AsU0FBUyxFQUFFLFNBQVM7NEJBQ3BCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTs0QkFDOUIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNO3lCQUN2QztxQkFDRixDQUNGLENBQ0YsQ0FBQztvQkFDRixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxTQUFxQixDQUFDO2dCQUMxQixJQUFJLENBQUM7b0JBQ0gsbUVBQW1FO29CQUNuRSxvRUFBb0U7b0JBQ3BFLGlFQUFpRTtvQkFDakUsMEJBQTBCO29CQUMxQixTQUFTLEdBQUcsTUFBTTt3QkFDaEIsQ0FBQyxDQUFDLE1BQU0sV0FBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUM7d0JBQ2hFLENBQUMsQ0FBRSxDQUFDLE1BQU0sT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQWdCLENBQUM7Z0JBQy9ELENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixtRUFBbUU7b0JBQ25FLGlFQUFpRTtvQkFDakUsbUVBQW1FO29CQUNuRSxzREFBc0Q7b0JBQ3RELElBQUksc0JBQXNCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO29CQUN0QyxDQUFDO29CQUNELE1BQU0sS0FBSyxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFFRCxJQUFJLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQWtCO1FBQ2xELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVU7WUFDL0IsOERBQThEO1lBQzlELDREQUE0RDtZQUM1RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxRQUFRLENBQ2pDLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxDQUFDLFVBQVUsRUFDaEIsS0FBSyxDQUFDLFVBQVUsQ0FDakIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0QixJQUNFLGNBQWMsR0FBRyxDQUFDO29CQUNsQixjQUFjLEdBQUcsV0FBVyxDQUFDLHdCQUF3QjtrQkFDckQsQ0FBQztvQkFDRCx5QkFBeUI7b0JBQ3pCLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEIsTUFBTSxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ2hDLE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM3Qiw4Q0FBOEM7Z0JBQzlDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2hDLE9BQU87WUFDVCxDQUFDO1lBRUQsNkRBQTZEO1lBQzdELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFDcEIsb0NBQW9DO1lBQ3BDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLDJCQUEyQjtBQUMzQiwrRUFBK0U7QUFDL0UsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usd0VBQXdFO0FBQ3hFLHdFQUF3RTtBQUN4RSx5RUFBeUU7QUFDekUsK0NBQStDO0FBQy9DLEVBQUU7QUFDRixxRUFBcUU7QUFDckUsMERBQTBEO0FBQzFELEVBQUU7QUFDRixtREFBbUQ7QUFDbkQsRUFBRTtBQUNGLHdFQUF3RTtBQUN4RSw4REFBOEQ7QUFDOUQsdUVBQXVFO0FBQ3ZFLDBFQUEwRTtBQUMxRSxFQUFFO0FBQ0Ysb0VBQW9FO0FBQ3BFLHlFQUF5RTtBQUN6RSx1RUFBdUU7QUFDdkUseUVBQXlFO0FBQ3pFLHdFQUF3RTtBQUN4RSxxRUFBcUU7QUFFckU7Ozs7Ozs7R0FPRztBQUNILE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQztBQUVuQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxvQkFBb0I7SUFJbEMsT0FBTyxJQUFJLGVBQWUsQ0FBeUI7UUFDakQsU0FBUyxDQUFDLEtBQUssRUFBRSxVQUFVO1lBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDL0IsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUNsQyxVQUFVLENBQUMsS0FBSyxDQUNkLElBQUksb0JBQW9CLENBQ3RCLHdCQUF3QixLQUFLLENBQUMsTUFBTSw2QkFBNkI7b0JBQy9ELHNCQUFzQixjQUFjLHlCQUF5QjtvQkFDN0QsZ0NBQWdDLEVBQ2xDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQ2pDLENBQ0YsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDcEMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCO0lBSXBDLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9CLFNBQVMsY0FBYyxDQUFDLElBQWdCO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLElBQUksZUFBZSxDQUF5QjtRQUNqRCxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVU7WUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTVDLE9BQU8sTUFBTSxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLFFBQVEsQ0FDOUIsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRXRCLElBQUksV0FBVyxHQUFHLGNBQWMsRUFBRSxDQUFDO29CQUNqQyxVQUFVLENBQUMsS0FBSyxDQUNkLElBQUksb0JBQW9CLENBQ3RCLDRCQUE0QixXQUFXLHFCQUFxQixjQUFjLEtBQUs7d0JBQzdFLHNFQUFzRSxFQUN4RSxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxDQUNqQyxDQUNGLENBQUM7b0JBQ0YsT0FBTztnQkFDVCxDQUFDO2dCQUVELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztnQkFDOUMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUs7b0JBQUUsTUFBTTtnQkFFakMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzNELE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFVBQVU7WUFDZCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLFVBQVUsQ0FBQyxLQUFLLENBQ2QsSUFBSSxvQkFBb0IsQ0FDdEIsMEJBQTBCLE1BQU0sQ0FBQyxNQUFNLG1DQUFtQztvQkFDeEUscUNBQXFDLEVBQ3ZDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQ2pDLENBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDBCQUEwQixDQUNqQyxZQUFvQixFQUNwQixLQUFhLEVBQ2IsSUFBWSxFQUNaLFVBQW1CLEVBQ25CLFNBQWtCO0lBRWxCLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNmLE1BQU0saUJBQWlCLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxFQUFFO1lBQzVELElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDakMsVUFBVSxFQUFFO2dCQUNWLGlCQUFpQixFQUFFLEtBQUs7Z0JBQ3hCLHNCQUFzQixFQUFFLElBQUk7Z0JBQzVCLDJCQUEyQixFQUFFLE1BQU07Z0JBQ25DLDhCQUE4QixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZO2dCQUN6RCxHQUFHLENBQUMsT0FBTyxTQUFTLEtBQUssUUFBUTtvQkFDL0IsQ0FBQyxDQUFDLEVBQUUsaUNBQWlDLEVBQUUsU0FBUyxFQUFFO29CQUNsRCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLEdBQUcsQ0FBQyxPQUFPLFVBQVUsS0FBSyxRQUFRO29CQUNoQyxDQUFDLENBQUMsRUFBRSw2QkFBNkIsRUFBRSxVQUFVLEVBQUU7b0JBQy9DLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsNkJBQTZCLENBQ3BDLFlBQW9CLEVBQ3BCLEtBQWEsRUFDYixJQUFZLEVBQ1osU0FBa0I7SUFFbEIsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2YsTUFBTSxpQkFBaUIsQ0FBQyxrQ0FBa0MsRUFBRSxZQUFZLEVBQUU7WUFDeEUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUNqQyxVQUFVLEVBQUU7Z0JBQ1YsaUJBQWlCLEVBQUUsS0FBSztnQkFDeEIsc0JBQXNCLEVBQUUsSUFBSTtnQkFDNUIsb0NBQW9DLEVBQUUsU0FBUzthQUNoRDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixZQUFvQixFQUNwQixLQUFhLEVBQ2IsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLFVBQW1CO0lBRW5CLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNmLE1BQU0saUJBQWlCLENBQUMsK0JBQStCLEVBQUUsWUFBWSxFQUFFO1lBQ3JFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDakMsVUFBVSxFQUFFO2dCQUNWLGlCQUFpQixFQUFFLEtBQUs7Z0JBQ3hCLHNCQUFzQixFQUFFLElBQUk7Z0JBQzVCLDJCQUEyQixFQUFFLGVBQWU7Z0JBQzVDLCtCQUErQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZO2dCQUMxRCw2QkFBNkIsRUFBRSxVQUFVO2dCQUN6Qyw0QkFBNEIsRUFBRSxTQUFTO2dCQUN2QyxHQUFHLENBQUMsT0FBTyxVQUFVLEtBQUssUUFBUTtvQkFDaEMsQ0FBQyxDQUFDLEVBQUUsaUNBQWlDLEVBQUUsVUFBVSxFQUFFO29CQUNuRCxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1I7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1AsQ0FBQztBQUVELE1BQU0sT0FBTyw0QkFBNkIsU0FBUSxjQUEwQjtJQUMxRSxPQUFPLENBQTJDO0lBRWxELFlBQVksS0FBYSxFQUFFLElBQVksRUFBRSxVQUFtQjtRQUMxRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyw0QkFBNEIsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLG1DQUFtQztRQUNuQyxJQUFJLFNBQTZCLENBQUM7UUFDbEMsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDL0Isc0VBQXNFO1FBQ3RFLGdFQUFnRTtRQUNoRSwwREFBMEQ7UUFDMUQsSUFBSSxTQUE2QixDQUFDO1FBQ2xDLHNFQUFzRTtRQUN0RSxrQ0FBa0M7UUFDbEMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN2QixLQUFLLENBQUM7WUFDSixxRUFBcUU7WUFDckUsSUFBSSxFQUFFLE9BQU87WUFFYixJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUN6QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUMxQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osSUFBSSxTQUFTLEtBQUssU0FBUzt3QkFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO29CQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDaEUsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7b0JBQ3RDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDN0MsQ0FBQztnQkFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7b0JBQ3BELE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO29CQUN6QixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDNUIsd0JBQXdCLENBQ3RCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsSUFBSSxFQUNKLGVBQWUsRUFDZixjQUFjLENBQ2YsQ0FBQztvQkFDSixDQUFDO29CQUNELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGlFQUFpRTtvQkFDakUscUVBQXFFO29CQUNyRSx3QkFBd0I7b0JBQ3hCLElBQ0UsQ0FBQyxrQkFBa0I7d0JBQ25CLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUM7d0JBQzNCLFNBQVMsS0FBSyxTQUFTLEVBQ3ZCLENBQUM7d0JBQ0Qsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3dCQUMxQiwwQkFBMEIsQ0FDeEIsU0FBUyxFQUNULEtBQUssRUFDTCxJQUFJLEVBQ0osVUFBVSxFQUNWLFNBQVMsQ0FDVixDQUFDO29CQUNKLENBQUM7b0JBQ0QsZUFBZSxJQUFJLENBQUMsQ0FBQztvQkFDckIsY0FBYyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO29CQUMxQyw2REFBNkQ7b0JBQzdELDREQUE0RDtvQkFDNUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0FBRS9DLDhGQUE4RjtBQUM5RixNQUFNLDRCQUE0QixHQUFHLEdBQVcsRUFBRSxDQUNoRCxTQUFTLENBQ1AsdUNBQXVDLEVBQ3ZDLDRCQUE0QixFQUM1QjtJQUNFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUNGLENBQUM7QUFFSjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsSUFBSSxDQUFDO0FBRXZELG1HQUFtRztBQUNuRyxNQUFNLGlDQUFpQyxHQUFHLEdBQVcsRUFBRSxDQUNyRCxTQUFTLENBQ1AsNkNBQTZDLEVBQzdDLGtDQUFrQyxFQUNsQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUMxQixDQUFDO0FBRUo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUM1QyxLQUFhLEVBQ2IsSUFBWSxFQUNaLFVBQW1CLEVBQ25CLHdCQUErRCxLQUFLLElBQUksRUFBRSxDQUN4RSxTQUFTO0lBRVgsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUM7SUFDdkUsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLElBQUksQ0FBQyxDQUFDO0lBQ3hDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdkIsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFDNUIsSUFBSSxNQUEyRCxDQUFDO0lBQ2hFLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLFlBQXFCLENBQUM7SUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsbUVBQW1FO0lBQ25FLHdFQUF3RTtJQUN4RSxJQUFJLFNBQTZCLENBQUM7SUFDbEMsSUFBSSxTQUE2QixDQUFDO0lBQ2xDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQy9CLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztJQUN4QixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdkIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRTFCLFNBQVMsV0FBVztRQUNsQixJQUFJLGFBQWE7WUFBRSxPQUFPO1FBQzFCLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSwwRUFBMEU7UUFDMUUsS0FBSyxxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FDL0IsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLHFFQUFxRTtZQUNyRSw4REFBOEQ7WUFDOUQsSUFBSSxHQUFHO2dCQUFFLDZCQUE2QixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RFLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FDbEUsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLFVBQVUsT0FBTztRQUNwQixJQUFJLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO1FBQ25DLElBQUksUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCO1lBQzVDLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxjQUFjO1lBQ3BDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDZixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDekUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxTQUFTLEtBQUssU0FBUztZQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO1FBQ25FLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssVUFBVSxrQkFBa0I7UUFDL0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksaUJBQWlCLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLFVBQVUsU0FBUztRQUN0QixJQUFJLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNCLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsbUNBQW1DO1FBQ25DLGlCQUFpQixJQUFJLGNBQWMsQ0FBQztRQUNwQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzQixvRUFBb0U7UUFDcEUsa0VBQWtFO1FBQ2xFLHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUsMEVBQTBFO1FBQzFFLFVBQVU7UUFDVixNQUFNLGFBQWEsR0FBRyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3JELE1BQU0sa0JBQWtCLEdBQUcsaUNBQWlDLEVBQUUsQ0FBQztRQUMvRCxTQUFTLENBQUM7WUFDUixjQUFjLEVBQUUsQ0FBQztZQUNqQixtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLElBQUksY0FBYyxHQUFHLGFBQWEsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLElBQUksV0FBVyxDQUNuQixXQUFXLElBQUksNkNBQTZDLGFBQWEsR0FBRyxDQUM3RSxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksbUJBQW1CLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxJQUFJLFdBQVcsQ0FDbkIsV0FBVyxJQUFJLG1EQUFtRCxrQkFBa0IsR0FBRyxDQUN4RixDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUFDO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksUUFBUTtvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFDM0IsdUVBQXVFO2dCQUN2RSx1RUFBdUU7Z0JBQ3ZFLCtEQUErRDtnQkFDL0QsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUFFLE1BQU0sS0FBSyxDQUFDO2dCQUM5QyxpRUFBaUU7Z0JBQ2pFLHNFQUFzRTtZQUN4RSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksY0FBYyxDQUFhO1FBQ3BDLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7WUFDekIsSUFBSSxRQUFRO2dCQUFFLE9BQU87WUFDckIsSUFBSSxTQUFTLEtBQUssU0FBUztnQkFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BELHNFQUFzRTtZQUN0RSx1RUFBdUU7WUFDdkUsc0VBQXNFO1lBQ3RFLG9FQUFvRTtZQUNwRSxXQUFXLEVBQUUsQ0FBQztZQUNkLHNFQUFzRTtZQUN0RSxvRUFBb0U7WUFDcEUsbURBQW1EO1lBQ25ELFNBQVMsQ0FBQztnQkFDUixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osSUFBSSxDQUFDO3dCQUNILElBQUksQ0FBQyxDQUFDLE1BQU0sT0FBTyxFQUFFLENBQUM7NEJBQUUsT0FBTztvQkFDakMsQ0FBQztvQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO3dCQUNiLElBQUksUUFBUTs0QkFBRSxPQUFPO3dCQUNyQixVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixPQUFPO29CQUNULENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLE1BQTZDLENBQUM7Z0JBQ2xELElBQUksQ0FBQztvQkFDSCwwRUFBMEU7b0JBQzFFLE1BQU0sR0FBRyxNQUFNLE1BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsQ0FBQztnQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29CQUNiLElBQUksUUFBUTt3QkFBRSxPQUFPO29CQUNyQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDeEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDdEIsT0FBTztvQkFDVCxDQUFDO29CQUNELElBQUksQ0FBQzt3QkFDSCxJQUFJLENBQUMsQ0FBQyxNQUFNLFNBQVMsRUFBRSxDQUFDOzRCQUFFLE9BQU87b0JBQ25DLENBQUM7b0JBQUMsT0FBTyxZQUFZLEVBQUUsQ0FBQzt3QkFDdEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDL0IsT0FBTztvQkFDVCxDQUFDO29CQUNELFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLFFBQVE7b0JBQUUsT0FBTztnQkFDckIsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNqQyxNQUFNLEdBQUcsU0FBUyxDQUFDO29CQUNuQiw0REFBNEQ7b0JBQzVELGdFQUFnRTtvQkFDaEUsa0VBQWtFO29CQUNsRSxpRUFBaUU7b0JBQ2pFLG1FQUFtRTtvQkFDbkUsK0RBQStEO29CQUMvRCxrRUFBa0U7b0JBQ2xFLE1BQU0sZ0JBQWdCLEdBQ3BCLENBQUMsa0JBQWtCLElBQUksQ0FBQyxNQUFNLGtCQUFrQixFQUFFLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxRQUFRO3dCQUFFLE9BQU87b0JBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUM7NEJBQ0gsSUFBSSxDQUFDLENBQUMsTUFBTSxTQUFTLEVBQUUsQ0FBQztnQ0FBRSxPQUFPO3dCQUNuQyxDQUFDO3dCQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7NEJBQ3RCLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7NEJBQy9CLE9BQU87d0JBQ1QsQ0FBQzt3QkFDRCxTQUFTO29CQUNYLENBQUM7b0JBQ0QsNkRBQTZEO29CQUM3RCxvRUFBb0U7b0JBQ3BFLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUM1Qix3QkFBd0IsQ0FDdEIsU0FBUyxFQUNULEtBQUssRUFDTCxJQUFJLEVBQ0osZUFBZSxFQUNmLGNBQWMsRUFDZCxtQkFBbUIsQ0FDcEIsQ0FBQztvQkFDSixDQUFDO29CQUNELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDbkIsT0FBTztnQkFDVCxDQUFDO2dCQUVELGlEQUFpRDtnQkFDakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDakUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hCLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDdEMsTUFBTSxHQUFHLFFBQVEsQ0FBQztnQkFDcEIsQ0FBQztnQkFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLE9BQU8sTUFBTSxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO29CQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLFFBQVEsQ0FDOUIsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3RCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztvQkFDOUMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUs7d0JBQUUsTUFBTTtvQkFDakMsNERBQTREO29CQUM1RCw4REFBOEQ7b0JBQzlELFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdCLGNBQWMsRUFBRSxDQUFDO29CQUNqQixlQUFlLEVBQUUsQ0FBQztvQkFDbEIsY0FBYyxJQUFJLEtBQUssQ0FBQztvQkFDeEIsSUFBSSxDQUFDLGtCQUFrQixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3dCQUMxQiwwQkFBMEIsQ0FDeEIsU0FBUyxFQUNULEtBQUssRUFDTCxJQUFJLEVBQ0osVUFBVSxFQUNWLFNBQVMsQ0FDVixDQUFDO29CQUNKLENBQUM7b0JBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDakIsQ0FBQztnQkFFRCxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLHdEQUF3RDtvQkFDeEQsOERBQThEO29CQUM5RCw2REFBNkQ7b0JBQzdELGNBQWMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxpQ0FBaUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3ZCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsWUFBWSxHQUFHLE1BQU0sQ0FBQztZQUN0QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDN0IsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUNuQixJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzVELENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEdBQXVCLEVBQUU7SUFDM0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDdkUsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsc0JBQXNCLENBQzdCLFlBQW9CLEVBQ3BCLGVBQXVCLEVBQ3ZCLEtBQWEsRUFDYixJQUFZLEVBQ1osVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsS0FBYTtJQUViLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNmLE1BQU0saUJBQWlCLENBQUMsdUJBQXVCLEVBQUUsWUFBWSxFQUFFO1lBQzdELElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDakMsVUFBVSxFQUFFO2dCQUNWLGlCQUFpQixFQUFFLEtBQUs7Z0JBQ3hCLHNCQUFzQixFQUFFLElBQUk7Z0JBQzVCLDJCQUEyQixFQUFFLE9BQU87Z0JBQ3BDLHVDQUF1QyxFQUFFLGVBQWUsR0FBRyxZQUFZO2dCQUN2RSw4QkFBOEIsRUFBRSxVQUFVO2dCQUMxQyw2QkFBNkIsRUFBRSxTQUFTO2dCQUN4QyxtRUFBbUU7Z0JBQ25FLG1FQUFtRTtnQkFDbkUsNkNBQTZDO2dCQUM3QyxpQ0FBaUMsRUFBRSxLQUFLO2FBQ3pDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsWUFBb0IsRUFDcEIsS0FBYSxFQUNiLElBQVk7SUFFWixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDZixNQUFNLGlCQUFpQixDQUFDLHVCQUF1QixFQUFFLFlBQVksRUFBRTtZQUM3RCxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQ2pDLFVBQVUsRUFBRTtnQkFDVixpQkFBaUIsRUFBRSxLQUFLO2dCQUN4QixzQkFBc0IsRUFBRSxJQUFJO2dCQUM1QiwyQkFBMkIsRUFBRSxPQUFPO2dCQUNwQyw4QkFBOEIsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsWUFBWTthQUMxRDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDUCxDQUFDO0FBRUQsTUFBTSxPQUFPLDRCQUE2QixTQUFRLGNBQTBCO0lBQzFFOzs7Ozs7OztPQVFHO0lBQ0gsWUFBWSxLQUFhLEVBQUUsSUFBWSxFQUFFLGVBQWtDO1FBQ3pFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixrQ0FBa0MsT0FBTyxLQUFLLEdBQUcsQ0FDbEQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyw0QkFBNEIsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFFcEMscUVBQXFFO1FBQ3JFLHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLElBQUksZUFBZSxHQUFpQyxlQUFlLENBQUM7UUFDcEUsTUFBTSxjQUFjLEdBQUcsS0FBSyxJQUFtQixFQUFFO1lBQy9DLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQztvQkFDSCxNQUFNLGVBQWUsQ0FBQztnQkFDeEIsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsaURBQWlEO2dCQUNuRCxDQUFDO2dCQUNELGVBQWUsR0FBRyxTQUFTLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLDJFQUEyRTtRQUMzRSwyRUFBMkU7UUFDM0UsdUVBQXVFO1FBQ3ZFLDZFQUE2RTtRQUM3RSwyRUFBMkU7UUFDM0UscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLFFBQVEsV0FBVyxFQUFFLEVBQVcsQ0FBQztRQUNsRCxNQUFNLG1CQUFtQixHQUN2QixjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDL0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUM7WUFDakMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFFckIscUVBQXFFO1FBQ3JFLDBCQUEwQjtRQUMxQixFQUFFO1FBQ0Ysc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSx5RUFBeUU7UUFDekUsc0VBQXNFO1FBQ3RFLGlFQUFpRTtRQUNqRSxtRUFBbUU7UUFDbkUscUVBQXFFO1FBQ3JFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsRUFBRTtRQUNGLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLGtFQUFrRTtRQUNsRSxvRUFBb0U7UUFDcEUsb0RBQW9EO1FBQ3BELEVBQUU7UUFDRiwyREFBMkQ7UUFDM0QscURBQXFEO1FBQ3JELHFFQUFxRTtRQUNyRSxJQUFJLE1BQU0sR0FBaUIsRUFBRSxDQUFDO1FBQzlCLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixtRUFBbUU7UUFDbkUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSxnREFBZ0Q7UUFDaEQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLFVBQVUsR0FBeUMsSUFBSSxDQUFDO1FBQzVELHlFQUF5RTtRQUN6RSxJQUFJLFFBQVEsR0FBeUIsSUFBSSxDQUFDO1FBQzFDOzs7Ozs7O1dBT0c7UUFDSCxJQUFJLFNBQWtCLENBQUM7UUFDdkIsa0VBQWtFO1FBQ2xFLHVFQUF1RTtRQUN2RSwrREFBK0Q7UUFDL0Qsd0VBQXdFO1FBQ3hFLHFFQUFxRTtRQUNyRSxnQkFBZ0I7UUFDaEIsSUFBSSx1QkFBdUIsR0FBRywyQkFBMkIsRUFBRSxDQUFDO1FBQzVELElBQUksd0JBQXdCLEdBQXlCLElBQUksQ0FBQztRQUMxRCx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsTUFBTSxtQkFBbUIsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztRQUNqRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixFQUFFLENBQUM7UUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1FBQy9DLG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsSUFBSSxRQUE0QixDQUFDO1FBR2pDLGlEQUFpRDtRQUNqRCxJQUFJLGVBQWUsR0FBYSxFQUFFLENBQUM7UUFDbkMsaURBQWlEO1FBQ2pELElBQUksWUFBWSxHQUFhLEVBQUUsQ0FBQztRQUVoQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVksRUFBUSxFQUFFO1lBQzNDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxlQUFlLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUNsRCxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHO2dCQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDO1FBRUY7Ozs7V0FJRztRQUNILE1BQU0sU0FBUyxHQUFHLEdBQTJDLEVBQUU7WUFDN0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxLQUFLLElBQUksbUJBQW1CO29CQUFFLE1BQU07Z0JBQ3hDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxrQkFBa0I7b0JBQUUsTUFBTTtnQkFDdEUsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDNUIsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLFdBQVcsSUFBSSxLQUFLLENBQUM7WUFDckIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUM7UUFFRjs7Ozs7O1dBTUc7UUFDSDs7Ozs7O1dBTUc7UUFDSCxNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQ3JCLEtBQW1CLEVBQ25CLEtBQWEsRUFDYixPQUEyQixFQUNaLEVBQUU7WUFDakIsTUFBTSxjQUFjLEVBQUUsQ0FBQztZQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQztZQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLG1CQUFtQixDQUFDO1lBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM5QixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0MsQ0FBQztpQkFBTSxJQUNMLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVTtnQkFDOUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2hCLENBQUM7Z0JBQ0QsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7aUJBQU0sQ0FBQztnQkFDTixpQ0FBaUM7Z0JBQ2pDLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztZQUNILENBQUM7WUFDRCx3RUFBd0U7WUFDeEUsK0RBQStEO1lBQy9ELFlBQVksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzdCLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQixzQkFBc0IsQ0FDcEIsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsSUFBSSxFQUNKLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxFQUNMLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxVQUFVLENBQ3hCLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsS0FBSyxJQUFtQixFQUFFO1lBQzdDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3pCLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO2dCQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUM5QixhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUV4RCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDdkMsY0FBYyxHQUFHLENBQUMsQ0FBQztvQkFDbkIsYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLGdFQUFnRTtvQkFDaEUsZ0VBQWdFO29CQUNoRSxtQ0FBbUM7b0JBQ25DLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM5QixXQUFXLElBQUksS0FBSyxDQUFDO29CQUNyQixjQUFjLEdBQUcsQ0FBQyxDQUFDO29CQUNuQixhQUFhLEdBQUcsQ0FBQyxDQUFDO29CQUNsQixRQUFRO3dCQUNOLE9BQU8sS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVM7NEJBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7NEJBQzdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQztvQkFDNUIsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxvRUFBb0U7Z0JBQ3BFLG9DQUFvQztnQkFDcEMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDO2dCQUNqQyxlQUFlLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVE7b0JBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRiwrRUFBK0U7UUFDL0UsTUFBTSxhQUFhLEdBQUcsR0FBUyxFQUFFO1lBQy9CLElBQUksUUFBUSxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDdkUsUUFBUSxHQUFHLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDNUIsR0FBRyxFQUFFO2dCQUNILFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLDJEQUEyRDtnQkFDM0QsK0RBQStEO2dCQUMvRCwrREFBK0Q7Z0JBQy9ELGdFQUFnRTtnQkFDaEUsaUVBQWlFO2dCQUNqRSx5REFBeUQ7Z0JBQ3pELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsYUFBYSxFQUFFLENBQUM7b0JBQ2hCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxnRUFBZ0U7Z0JBQ2hFLDBCQUEwQjtnQkFDMUIsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO2dCQUM3QixZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU87b0JBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNSLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLFNBQVMsS0FBSyxLQUFLLENBQUM7Z0JBQ3BCLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGOzs7Ozs7Ozs7Ozs7Ozs7OztXQWlCRztRQUNILE1BQU0sbUJBQW1CLEdBQUcsR0FBUyxFQUFFO1lBQ3JDLElBQUksVUFBVSxJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUNuQyxJQUFJLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxtRUFBbUU7Z0JBQ25FLG9FQUFvRTtnQkFDcEUsOENBQThDO2dCQUM5Qyx3QkFBd0IsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztxQkFDdkQsSUFBSSxDQUNILENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ1IsdUJBQXVCO3dCQUNyQixLQUFLLENBQUMscUJBQXFCLElBQUksd0JBQXdCLENBQUM7Z0JBQzVELENBQUMsRUFDRCxHQUFHLEVBQUU7b0JBQ0gsOERBQThEO29CQUM5RCwrREFBK0Q7b0JBQy9ELHNDQUFzQztvQkFDdEMsdUJBQXVCLEdBQUcsd0JBQXdCLENBQUM7Z0JBQ3JELENBQUMsQ0FDRjtxQkFDQSxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNULDhEQUE4RDtvQkFDOUQsd0RBQXdEO29CQUN4RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFBRSxtQkFBbUIsRUFBRSxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQztnQkFDTCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksdUJBQXVCLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1QsQ0FBQztZQUNELFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixhQUFhLEVBQUUsQ0FBQztZQUNsQixDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFFRjs7Ozs7V0FLRztRQUNILE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtZQUN0QyxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUNaLElBQUksU0FBUyxLQUFLLFNBQVM7b0JBQUUsTUFBTSxTQUFTLENBQUM7Z0JBQzdDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU87Z0JBQzdDLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUMxQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLEtBQUssQ0FBQztZQUNKLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSztnQkFDZixJQUFJLFNBQVMsS0FBSyxTQUFTO29CQUFFLE1BQU0sU0FBUyxDQUFDO2dCQUM3QyxJQUFJLFFBQVEsS0FBSyxTQUFTO29CQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUVoQyxJQUNFLE1BQU0sQ0FBQyxNQUFNLElBQUksbUJBQW1CO29CQUNwQyxXQUFXLElBQUksa0JBQWtCLEVBQ2pDLENBQUM7b0JBQ0QsbUVBQW1FO29CQUNuRSxxQkFBcUI7b0JBQ3JCLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sbUJBQW1CLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQztnQkFFRCxrRUFBa0U7Z0JBQ2xFLGtFQUFrRTtnQkFDbEUsNERBQTREO2dCQUM1RCxpQkFBaUI7Z0JBQ2pCLE9BQ0UsU0FBUyxLQUFLLFNBQVM7b0JBQ3ZCLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxjQUFjLElBQUksaUJBQWlCO3dCQUNsRCxXQUFXLEdBQUcsYUFBYSxJQUFJLGdCQUFnQixDQUFDLEVBQ2xELENBQUM7b0JBQ0QsYUFBYSxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7d0JBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTO29CQUFFLE1BQU0sU0FBUyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLENBQUMsS0FBSztnQkFDVCxrRUFBa0U7Z0JBQ2xFLCtDQUErQztnQkFDL0MsTUFBTSxLQUFLLEVBQUUsQ0FBQztnQkFFZCxnRUFBZ0U7Z0JBQ2hFLDZEQUE2RDtnQkFDN0QsMEJBQTBCO2dCQUMxQixNQUFNLGNBQWMsRUFBRSxDQUFDO2dCQUV2QixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQztnQkFDakMsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztnQkFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM5QixJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0QsaUJBQWlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUNoQixpRUFBaUU7Z0JBQ2pFLG9FQUFvRTtnQkFDcEUsbUVBQW1FO2dCQUNuRSwrREFBK0Q7Z0JBQy9ELCtEQUErRDtnQkFDL0Qsa0VBQWtFO2dCQUNsRSwrQ0FBK0M7Z0JBQy9DLEVBQUU7Z0JBQ0YsOERBQThEO2dCQUM5RCw4REFBOEQ7Z0JBQzlELGlFQUFpRTtnQkFDakUsZ0VBQWdFO2dCQUNoRSxtRUFBbUU7Z0JBQ25FLCtEQUErRDtnQkFDL0Qsa0VBQWtFO2dCQUNsRSw2Q0FBNkM7Z0JBQzdDLElBQUksQ0FBQztvQkFDSCxNQUFNLEtBQUssRUFBRSxDQUFDO2dCQUNoQixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxrRUFBa0U7Z0JBQ3BFLENBQUM7Z0JBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3pCLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDWixXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixTQUFTLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3BELCtEQUErRDtnQkFDL0QsbURBQW1EO2dCQUNuRCxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3pCLGdFQUFnRTtnQkFDaEUsc0VBQXNFO2dCQUN0RSwyQ0FBMkM7Z0JBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzdCLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCxrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLHNFQUFzRTtRQUN0RSwwQ0FBMEM7UUFDMUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDL0MsS0FBSyxFQUFFLEtBQUs7WUFDWixVQUFVLEVBQUUsS0FBSztZQUNqQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFrQkQsOEJBQThCO0FBQzlCLGdFQUFnRTtBQUNoRSx3REFBd0Q7QUFFeEQ7OztHQUdHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsU0FBOEIsVUFBVTtJQUV4QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM5RSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDbEMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUMxQyxDQUFDO0lBQ0Ysd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSxPQUFPO1FBQ0wsR0FBRyxnQkFBZ0IsRUFBRTtRQUNyQixHQUFHLHNCQUFzQixFQUFFO1FBQzNCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBQzVCLCtEQUErRDtRQUMvRCxxRUFBcUU7UUFDckUsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakIsOERBQThEO1lBQzlELGtFQUFrRTtZQUNsRSx5REFBeUQ7WUFDekQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDeEUsTUFBTSxJQUFJLEdBQW1DO2dCQUMzQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQVc7Z0JBQy9DLEdBQUcsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBVztnQkFDekMsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFZO2dCQUNsRCxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQTBCO2dCQUMxRCxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQVc7YUFDaEQsQ0FBQztZQUNGLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSx5QkFBeUIsQ0FFekQsQ0FBQztZQUNkLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1lBQzNDLENBQUM7WUFDRCxtQ0FBbUM7WUFDbkMscUVBQXFFO1lBQ3JFLGtFQUFrRTtZQUNsRSxrRUFBa0U7WUFDbEUsc0VBQXNFO1lBQ3RFLCtDQUErQztZQUMvQyxvRUFBb0U7WUFDcEUsb0VBQW9FO1lBQ3BFLGlDQUFpQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQ0UsTUFBTTtnQkFDTixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO29CQUM5QixZQUFZLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFDMUMsQ0FBQztnQkFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQXFCLENBQUM7WUFDdEMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2xCLGlDQUFpQztZQUNqQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN6RSxPQUFPO2dCQUNMLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBcUI7Z0JBQ3JELEdBQUcsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBVztnQkFDekMsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFXO2dCQUMvQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQVc7Z0JBQ3ZELE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBWTtnQkFDbEQsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUEwQjtnQkFDMUQsVUFBVSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFZO2FBQ3pELENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFnQ0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUM5QixNQUF1QixFQUN2QixNQUFtQixFQUNuQixNQUEyQixFQUMzQixHQUFvQixFQUNwQixLQUFhLEVBQ2IsU0FBNkI7SUFFN0IsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDM0MsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUUsTUFBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDM0QsVUFBVSxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLFNBQVMsR0FBRyxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUN2QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLHVCQUF1QixDQUNyQixNQUFxQixFQUNyQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFNBQVMsRUFDVCxHQUFHLENBQ0osQ0FBQztJQUVGLE9BQU87UUFDTCxVQUFVO1FBQ1YsU0FBUyxFQUFFLFNBQVU7UUFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ25ELENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsTUFBOEMsRUFDOUMsTUFBbUI7SUFFbkIsTUFBTSxVQUFVLEdBQ2QsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbEUsTUFBTSxTQUFTLEdBQ2IsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsT0FBTztRQUNMLFVBQVU7UUFDVixTQUFTLEVBQUUsU0FBVTtRQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDbkQsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDOUIsTUFBbUIsRUFDbkIsVUFBa0IsRUFDbEIsS0FBYSxFQUNiLFNBQTZCLEVBQzdCLEdBQW9CO0lBRXBCLElBQUksTUFBTSxDQUFDLE9BQU87UUFBRSxPQUFPO0lBQzNCLElBQUssTUFBYyxDQUFDLHVCQUF1QixDQUFDO1FBQUUsT0FBTztJQUNwRCxNQUFjLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUM7SUFFaEQsTUFBTSxDQUFDLGdCQUFnQixDQUNyQixPQUFPLEVBQ1AsR0FBRyxFQUFFO1FBQ0gsR0FBRyxDQUFDLElBQUksQ0FDTixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ1YsSUFBSSxDQUFDO2dCQUNILDBFQUEwRTtnQkFDMUUsbUVBQW1FO2dCQUNuRSx1RUFBdUU7Z0JBQ3ZFLG1FQUFtRTtnQkFDbkUscUVBQXFFO2dCQUNyRSxNQUFNLEdBQUcsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLHNCQUFzQixDQUMxQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFDeEMsS0FBSyxFQUNMLEdBQUcsQ0FDSixDQUFDO2dCQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQTRCLENBQy9DLEtBQUssRUFDTCxVQUFVLENBQ1gsQ0FBQztnQkFDRixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFxQixDQUFDLENBQUM7Z0JBQzFDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsMkJBQTJCO1lBQzdCLENBQUM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUNMLENBQUM7SUFDSixDQUFDLEVBQ0QsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsU0FBOEIsVUFBVSxFQUN4QyxHQUFvQixFQUNwQixLQUFhLEVBQ2IsU0FBNkIsRUFDN0IsaUJBQWlCLEdBQUcsS0FBSztBQUN6Qiw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0UscUJBQXFCO0FBQ3JCLGVBQWtDO0FBQ2xDLHFFQUFxRTtBQUNyRSw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSxrQkFBa0I7QUFDbEIsY0FBK0IsR0FBRztJQUVsQyxPQUFPO1FBQ0wsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFFN0IsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFNUQsbUVBQW1FO1lBQ25FLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksa0JBQWtCLENBQzFCLDJFQUEyRSxFQUMzRTtvQkFDRSxJQUFJLEVBQUUsK0hBQStIO2lCQUN0SSxDQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsQ0FBRSxNQUFjLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxNQUFNLElBQUksR0FBRyxRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUMvQyxLQUFLLEVBQ0wsSUFBSSxFQUNKLGVBQWUsQ0FDaEIsQ0FBQztZQUNGLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixJQUFJLGlCQUFpQixFQUFFLENBQUM7b0JBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHLENBQUMsSUFBSSxDQUNOLEtBQUs7cUJBQ0YsV0FBVyxDQUNWLGtCQUFrQixDQUNoQixtQkFBbUIsQ0FDakIsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsV0FBVyxDQUNaLEVBQ0QsU0FBUyxDQUNWLENBQ0Y7cUJBQ0EsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUNwQixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sQ0FBQyxHQUEwQyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzFELElBQUksSUFBSTtnQkFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLElBQUksS0FBSyxPQUFPLElBQUksaUJBQWlCO2dCQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRTVELCtEQUErRDtZQUMvRCxrRUFBa0U7WUFDbEUsK0RBQStEO1lBQy9ELCtEQUErRDtZQUMvRCxnRUFBZ0U7WUFDaEUsK0RBQStEO1lBQy9ELGlFQUFpRTtZQUNqRSxpRUFBaUU7WUFDakUsa0RBQWtEO1lBQ2xELE1BQU0sWUFBWSxHQUFJLEtBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sYUFBYSxHQUFJLEtBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ2xFLElBQ0UsT0FBTyxZQUFZLEtBQUssUUFBUTtnQkFDaEMsT0FBTyxhQUFhLEtBQUssUUFBUSxFQUNqQyxDQUFDO2dCQUNELE1BQU0sVUFBVSxHQUEwQztvQkFDeEQsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLEtBQUssRUFBRSxhQUFhO2lCQUNyQixDQUFDO2dCQUNGLE1BQU0saUJBQWlCLEdBQUksS0FBYSxDQUN0QywrQkFBK0IsQ0FDaEMsQ0FBQztnQkFDRixJQUFJLE9BQU8saUJBQWlCLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzFDLFVBQVUsQ0FBQyxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FBQztnQkFDckQsQ0FBQztnQkFDRCxNQUFNLG9CQUFvQixHQUFJLEtBQWEsQ0FDekMsa0NBQWtDLENBQ25DLENBQUM7Z0JBQ0YsSUFBSSxPQUFPLG9CQUFvQixLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM3QyxVQUFVLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDO2dCQUNqRCxDQUFDO2dCQUNELE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFFLE1BQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sSUFBSSxHQUFHLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0QsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFekMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6QixJQUNFLENBQUMsTUFBTSxDQUFDLGVBQWU7Z0JBQ3ZCLE9BQU8sTUFBTSxDQUFDLGVBQWUsS0FBSyxVQUFVO2dCQUM1QyxDQUFDLENBQUMsS0FBSyxZQUFZLE1BQU0sQ0FBQyxlQUFlLENBQUM7Z0JBRTFDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsT0FBTyx1QkFBdUIsQ0FDNUIsS0FBSyxDQUFDLE1BQU0sRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUM7UUFDSixDQUFDO1FBRUQsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckIsSUFDRSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2dCQUNuQixPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssVUFBVTtnQkFDeEMsQ0FBQyxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUV0QyxPQUFPLEtBQUssQ0FBQztZQUNmLE9BQU8sdUJBQXVCLENBQzVCLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSDs7Ozs7Ozs7R0FRRztBQUNIOzs7OztHQUtHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsTUFBMkIsRUFDM0IsSUFBWTtJQUVaLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsc0VBQXNFO0lBQ3RFLHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsMENBQTBDO0lBQzFDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNqRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUF1QixDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLFNBQThCLFVBQVU7SUFFeEMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3hDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUNoRCxDQUFDO0lBQ0YsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3hDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUNoRCxDQUFDO0lBQ0YsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3pDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUNqRCxDQUFDO0lBQ0YsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3JDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FDN0MsQ0FBQztJQUNGLE9BQU87UUFDTCxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztRQUU3QiwyRUFBMkU7UUFDM0UsMERBQTBEO1FBQzFELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLDBFQUEwRTtZQUMxRSxpRUFBaUU7WUFDakUseURBQXlEO1lBQ3pELHFFQUFxRTtZQUNyRSxzRUFBc0U7WUFDdEUsbUVBQW1FO1lBQ25FLGtFQUFrRTtZQUNsRSxtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7Z0JBQzlELE9BQU8sS0FBSyxDQUFDO1lBRWYsb0ZBQW9GO1lBQ3BGLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN2RCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsMERBQTBEO2dCQUMxRCw0REFBNEQ7Z0JBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBVyxDQUFDO1lBQy9ELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixNQUFNLElBQUksb0JBQW9CLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLEdBR0gsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBRXRDLENBQUM7WUFDZCxJQUFJLElBQUk7Z0JBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDeEIsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FFNUMsQ0FBQztZQUNkLElBQUksT0FBTztnQkFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUNqQyxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixxRUFBcUU7WUFDckUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7Z0JBQzlELE9BQU8sS0FBSyxDQUFDO1lBQ2YsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBVyxDQUFDO1lBQy9ELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixNQUFNLElBQUksb0JBQW9CLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLEdBQTBDLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDMUQsaUVBQWlFO1lBQ2pFLDhEQUE4RDtZQUM5RCwwREFBMEQ7WUFDMUQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1lBQ3RFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUTtnQkFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztZQUM3RCxNQUFNLG1CQUFtQixHQUFHLFlBQVksQ0FDdEMsS0FBSyxFQUNMLGtDQUFrQyxDQUNuQyxDQUFDO1lBQ0YsSUFBSSxPQUFPLG1CQUFtQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QyxDQUFDLENBQUMsWUFBWSxHQUFHLG1CQUFtQixDQUFDO1lBQ3ZDLENBQUM7WUFDRCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FDbkMsS0FBSyxFQUNMLCtCQUErQixDQUNoQyxDQUFDO1lBQ0YsSUFBSSxPQUFPLGdCQUFnQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6QyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUM7WUFDM0MsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELGdGQUFnRjtRQUNoRiwrRUFBK0U7UUFDL0UsZ0ZBQWdGO1FBQ2hGLDRFQUE0RTtRQUM1RSxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6QixxRUFBcUU7WUFDckUsc0VBQXNFO1lBQ3RFLDJEQUEyRDtZQUMzRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM5RCxNQUFNLE1BQU0sR0FBRyxLQUFzQyxDQUFDO1lBQ3RELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN6RCxNQUFNLHVCQUF1QixHQUFHLHFCQUFxQixDQUNuRCxLQUFLLEVBQ0wsd0JBQXdCLENBQUMsS0FBSyxDQUMvQixDQUFDO1lBQ0YsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDeEQsaUVBQWlFO2dCQUNqRSw0Q0FBNEM7Z0JBQzVDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2xELElBQ0UsV0FBVyxLQUFLLElBQUk7b0JBQ3BCLE9BQU8sV0FBVyxLQUFLLFFBQVE7b0JBQy9CLFlBQVksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxTQUFTLEVBQzFELENBQUM7b0JBQ0QsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFCLE9BQU8sbUJBQW1CLENBQUMsTUFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDOUQsTUFBTSxjQUFjLEdBQ2xCLFlBQVksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxTQUFTLENBQUM7WUFDdkQsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FDL0MsS0FBSyxFQUNMLG9CQUFvQixDQUFDLEtBQUssQ0FDM0IsQ0FBQztZQUNGLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxtQkFBbUI7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDMUQsT0FBTyxtQkFBbUIsQ0FBQyxLQUFvQixFQUFFLEtBQW9CLENBQUMsQ0FBQztRQUN6RSxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUN0QixTQUE4QixVQUFVLEVBQ3hDLEdBQW9CLEVBQ3BCLEtBQWEsRUFDYixTQUE2QixFQUM3QixpQkFBaUIsR0FBRyxLQUFLO0FBQ3pCLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSxlQUFrQyxFQUNsQyxjQUErQixHQUFHO0lBRWxDLE9BQU87UUFDTCxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztRQUU3QixjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUU1RCxtRUFBbUU7WUFDbkUsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkVBQTJFLEVBQzNFO29CQUNFLElBQUksRUFBRSwrSEFBK0g7aUJBQ3RJLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxxRUFBcUU7WUFDckUsOERBQThEO1lBQzlELGlCQUFpQjtZQUNqQixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNyQyxnRUFBZ0U7WUFDaEUsZ0VBQWdFO1lBQ2hFLCtEQUErRDtZQUMvRCxrRUFBa0U7WUFDbEUsK0RBQStEO1lBQy9ELElBQUksT0FBTyxHQUFrQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUUxRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxRQUFRLEdBQUcsQ0FBRSxNQUFjLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxHQUFHLFFBQVEsUUFBUSxFQUFFLENBQUM7Z0JBQzFCLElBQUksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sR0FBRyxJQUFJLEtBQUssT0FBTyxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFFeEUsTUFBTSxRQUFRLEdBQUcsSUFBSSw0QkFBNEIsQ0FDL0MsS0FBSyxFQUNMLElBQUksRUFDSixlQUFlLENBQ2hCLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQ3JCLElBQUksT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO3dCQUM1QixHQUFHLENBQUMsSUFBSSxDQUNOLEtBQUssQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDM0QsQ0FBQztvQkFDSixDQUFDO3lCQUFNLENBQUM7d0JBQ04sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEdBQUcsQ0FBQyxJQUFJLENBQ04sS0FBSzt5QkFDRixXQUFXLENBQ1Ysa0JBQWtCLENBQ2hCLGVBQWUsQ0FDYixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixXQUFXLENBQ1osRUFDRCxTQUFTLENBQ1YsQ0FDRjt5QkFDQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQ3BCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLENBQUMsR0FBMEMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMxRCxJQUFJLElBQUk7Z0JBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxPQUFPO2dCQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRTVELElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sWUFBWSxHQUFJLEtBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixNQUFNLFFBQVEsR0FBRyxDQUFFLE1BQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLEdBQUcsUUFBUSxRQUFRLEVBQUUsQ0FBQztnQkFDMUIsV0FBVyxDQUFDLElBQUksQ0FDZCxJQUFJLDRCQUE0QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7cUJBQzFDLFdBQVcsQ0FDVixvQkFBb0IsQ0FDbEIsZUFBZSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUN0RCxTQUFTLENBQ1YsQ0FDRjtxQkFDQSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQ2pCLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxDQUFDLEdBQTBDLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDMUQsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRO2dCQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQzdELE1BQU0sZ0JBQWdCLEdBQUksS0FBYSxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDekUsSUFBSSxPQUFPLGdCQUFnQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6QyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUM7WUFDM0MsQ0FBQztZQUNELE1BQU0sbUJBQW1CLEdBQUksS0FBYSxDQUN4QyxrQ0FBa0MsQ0FDbkMsQ0FBQztZQUNGLElBQUksT0FBTyxtQkFBbUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBRUQsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekIsSUFDRSxDQUFDLE1BQU0sQ0FBQyxlQUFlO2dCQUN2QixPQUFPLE1BQU0sQ0FBQyxlQUFlLEtBQUssVUFBVTtnQkFDNUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxNQUFNLENBQUMsZUFBZSxDQUFDO2dCQUUxQyxPQUFPLEtBQUssQ0FBQztZQUNmLE9BQU8sdUJBQXVCLENBQzVCLEtBQUssQ0FBQyxNQUFNLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsQ0FDVixDQUFDO1FBQ0osQ0FBQztRQUVELFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3JCLElBQ0UsQ0FBQyxNQUFNLENBQUMsV0FBVztnQkFDbkIsT0FBTyxNQUFNLENBQUMsV0FBVyxLQUFLLFVBQVU7Z0JBQ3hDLENBQUMsQ0FBQyxLQUFLLFlBQVksTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFFdEMsT0FBTyxLQUFLLENBQUM7WUFDZixPQUFPLHVCQUF1QixDQUM1QixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsQ0FDVixDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsR0FBRyxNQUFpQjtJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLFNBQVMsZUFBZSxDQUFDLEdBQW1CO1FBQzFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3hDLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFDRCxTQUFTLElBQUksQ0FBQyxHQUFZO1FBQ3hCLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsT0FBTztRQUNuRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBYSxDQUFDO1lBQUUsT0FBTztRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQWEsQ0FBQyxDQUFDO1FBQzNCLElBQUksR0FBRyxZQUFZLGVBQWUsRUFBRSxDQUFDO1lBQ25DLGVBQWUsQ0FBQyxHQUF1QyxDQUFDLENBQUM7WUFDekQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFzQyxDQUFDLENBQUM7WUFDNUQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUUsQ0FBQztZQUMvQixlQUFlLENBQUMsR0FBbUMsQ0FBQyxDQUFDO1lBQ3JELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHO2dCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEdBQUcsWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUc7Z0JBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsbUVBQW1FO1FBQ25FLHVEQUF1RDtRQUN2RCxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxHQUFHLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUE4QixDQUFDO1lBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU07UUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQixDQUM3QixVQUEyQixFQUMzQixLQUFhLEVBQ2IsVUFBa0IsRUFDbEIsR0FBb0I7SUFFcEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUUzQyxHQUFHLENBQUMsSUFBSSxDQUNOLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDVixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsSUFBSSxFQUFFO2dCQUNiLElBQUksT0FBTyxDQUFtQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN4RCxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2hDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQzFDLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxZQUFZLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUNsQyxPQUFPLEVBQ1AsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFDL0MsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQ2YsQ0FBQztnQkFDSixDQUFDLENBQUM7YUFDSCxDQUFDLENBQUM7WUFDSCxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLHFFQUFxRTtnQkFDckUsMkRBQTJEO2dCQUMzRCxzRUFBc0U7Z0JBQ3RFLHFFQUFxRTtnQkFDckUsK0RBQStEO2dCQUMvRCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2QixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCwwQ0FBMEM7Z0JBQzVDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDO29CQUNILCtEQUErRDtvQkFDL0QsK0RBQStEO29CQUMvRCxrRUFBa0U7b0JBQ2xFLCtEQUErRDtvQkFDL0QseURBQXlEO29CQUN6RCxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzVDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxvQkFBb0IsQ0FDdEMsTUFBTSxDQUFDLEtBQUssRUFDWixLQUFLLEVBQ0wsU0FBUyxFQUFFLGFBQWEsQ0FDekIsQ0FBcUMsQ0FBQztvQkFDdkMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckIsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixvRUFBb0U7Z0JBQ3BFLG1FQUFtRTtnQkFDbkUsa0VBQWtFO2dCQUNsRSxtRUFBbUU7Z0JBQ25FLHNFQUFzRTtnQkFDdEUscUVBQXFFO2dCQUNyRSxtRUFBbUU7Z0JBQ25FLDZEQUE2RDtnQkFDN0QsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMkRBQTJEO1lBQzNELDhEQUE4RDtRQUNoRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO0lBRUYsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUNuQixVQUEyQixFQUMzQixLQUFnRCxFQUNoRCxZQUE4QjtJQUU5QixNQUFNLGdCQUFnQixHQUFHLFVBQThDLENBQUM7SUFDeEUsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQXNDLENBQUM7SUFDdkUsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3ZELGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNyRCxZQUFZLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ25ELFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDakQsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUNyRCxZQUFZLENBQUMsbUJBQW1CLENBQUMsR0FBRyxZQUFZLENBQUM7SUFDbkQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsa0JBQWtCLENBQUMsR0FBZ0IsRUFBRSxJQUFpQjtJQUM3RCxNQUFNLENBQUMsR0FBRyxHQUFtQyxDQUFDO0lBQzlDLE1BQU0sQ0FBQyxHQUFHLElBQW9DLENBQUM7SUFDL0MsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxDQUFDLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsS0FBNkMsRUFDN0MsR0FBb0IsRUFDcEIsS0FBYTtJQUViLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFFekMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsWUFBWSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQ3pDLFVBQVUsRUFDVixLQUFLLEVBQ0wsS0FBSyxDQUFDLFVBQVUsRUFDaEIsR0FBRyxDQUNKLENBQUM7UUFDRixZQUFZLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNoRCxDQUFDO1NBQU0sQ0FBQztRQUNOLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGlGQUFpRjtJQUNqRixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4RCxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBZ0IsRUFBRSxFQUFFO1FBQ3RDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUN0QyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEIsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDVixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNWLElBQUksQ0FBQztvQkFDSCxrRUFBa0U7b0JBQ2xFLGlFQUFpRTtvQkFDakUsNkRBQTZEO29CQUM3RCw2REFBNkQ7b0JBQzdELHdDQUF3QztvQkFDeEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxzQkFBc0IsQ0FDMUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUN6QixHQUFHLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUNsQyxHQUFHLENBQUMsYUFBYSxDQUNsQixDQUFDO29CQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQTRCLENBQy9DLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQ2xDLEtBQUssQ0FBQyxVQUFVLENBQ2pCLENBQUM7b0JBQ0YsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBcUIsQ0FBQyxDQUFDO29CQUMxQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsMkJBQTJCO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO1lBRUYsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLHVFQUF1RTtnQkFDdkUsb0VBQW9FO2dCQUNwRSxpRUFBaUU7Z0JBQ2pFLHVFQUF1RTtnQkFDdkUsb0VBQW9FO2dCQUNwRSxnRUFBZ0U7Z0JBQ2hFLHNFQUFzRTtnQkFDdEUsc0VBQXNFO2dCQUN0RSw4Q0FBOEM7Z0JBQzlDLEVBQUU7Z0JBQ0Ysb0VBQW9FO2dCQUNwRSw4Q0FBOEM7Z0JBQzlDLHlFQUF5RTtnQkFDekUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDN0IsSUFBSSxDQUFDO3dCQUNILE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO3dCQUNoRSxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFOzRCQUNoQyxPQUFPLEVBQUUsSUFBSTs0QkFDYixNQUFNO3lCQUNQLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUFDLE1BQU0sQ0FBQzt3QkFDUCxnREFBZ0Q7b0JBQ2xELENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDTCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCLENBQ3hCLEtBQXlDLEVBQ3pDLEdBQW9CLEVBQ3BCLEtBQWE7SUFFYixNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBRXpDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sWUFBWSxHQUFHLHNCQUFzQixDQUN6QyxVQUFVLEVBQ1YsS0FBSyxFQUNMLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLEdBQUcsQ0FDSixDQUFDO1FBQ0YsWUFBWSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztTQUFNLENBQUM7UUFDTixZQUFZLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFNBQThCLFVBQVU7SUFDeEUsT0FBTztRQUNMLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQzNCLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDO0tBQ0YsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUNBQWlDLENBQ3JELEtBQWEsRUFDYixZQUFnQyxFQUNoQyxtQkFBdUM7SUFFdkMsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvRCxJQUFJLGNBQWM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVsRCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO0lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFcEQsTUFBTSxNQUFNLEdBQUcsWUFBWTtRQUN6QixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDN0QsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ25FLENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLDBCQUEwQixDQUN4QyxRQUF3QixFQUN4QixFQUNFLFlBQVksRUFDWixtQkFBbUIsR0FDcUM7SUFFMUQsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxrQ0FBa0MsRUFBRTtZQUNsRSxLQUFLLEVBQUUsWUFBWTtZQUNuQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxPQUFPLG1CQUFtQixLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLCtCQUErQixFQUFFO1lBQy9ELEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLHVCQUF1QixDQUFVLEVBQy9DLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLElBQUksRUFDSixHQUFHLEVBQ0gsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixlQUFlLEdBVWhCO0lBQ0MsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQ2xDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUM1QyxHQUFHLENBQ0osQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksNEJBQTRCLENBQ3JELEtBQUssRUFDTCxJQUFJLEVBQ0osZUFBZSxDQUNoQixDQUFDO0lBRUYseUVBQXlFO0lBQ3pFLE1BQU0sS0FBSyxHQUFHLG9CQUFvQixFQUFFLENBQUM7SUFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFeEIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDbEUsc0NBQXNDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU1QyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7UUFDNUQsS0FBSyxFQUFFLElBQUk7UUFDWCxRQUFRLEVBQUUsS0FBSztLQUNoQixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsMkJBQTJCLEVBQUU7UUFDckUsS0FBSyxFQUFFLEtBQUs7UUFDWixRQUFRLEVBQUUsS0FBSztLQUNoQixDQUFDLENBQUM7SUFDSCwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQzdDLFlBQVk7UUFDWixtQkFBbUI7S0FDcEIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxTQUFTLENBQUMsUUFBNkIsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsTUFBMkIsRUFDM0IsR0FBb0IsRUFDcEIsS0FBYSxFQUNiLElBQVksRUFDWixVQUE4QixFQUM5QixTQUE2QjtJQUU3QixJQUFJLE1BQWtELENBQUM7SUFDdkQsSUFBSSxTQUE4RCxDQUFDO0lBQ25FLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQy9CLElBQUksWUFBK0IsQ0FBQztJQUVwQyxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQy9CO1FBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ25CLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO3dCQUNoRSxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTs0QkFDekIsU0FBUyxHQUFHLEtBQUssQ0FBQzt3QkFDcEIsQ0FBQztxQkFDRixDQUFDLENBQUMsY0FBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFzQixDQUFDO29CQUM5RCxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUM1QixJQUFJLFNBQVMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7d0JBQ3JDLGtCQUFrQixHQUFHLElBQUksQ0FBQzt3QkFDMUIsaUVBQWlFO3dCQUNqRSxrREFBa0Q7d0JBQ2xELGdCQUFnQixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDNUMsQ0FBQztnQkFDSCxDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLE1BQU0sQ0FBQyxJQUFJO29CQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7b0JBQy9CLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDakIsTUFBTSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO0tBQ0Y7SUFDRCx1RUFBdUU7SUFDdkUsZ0VBQWdFO0lBQ2hFLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUNyQixDQUFDO0lBQ0YsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQVFEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLFNBQThCLFVBQVUsRUFDeEMsR0FBb0IsRUFDcEIsS0FBYSxFQUNiLFNBQTZCLEVBQzdCLE9BQWdDO0lBRWhDLE9BQU87UUFDTCxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUU1QixnRUFBZ0U7UUFDaEUsWUFBWSxFQUFFLEdBQUcsRUFBRTtZQUNqQixNQUFNLElBQUksa0JBQWtCLENBQzFCLGdIQUFnSCxFQUNoSDtnQkFDRSxJQUFJLEVBQUUsOEhBQThIO2FBQ3JJLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO1lBQ0gsTUFBTSxJQUFJLGtCQUFrQixDQUMxQiwyRUFBMkUsRUFDM0U7Z0JBQ0UsSUFBSSxFQUFFLG1JQUFtSTthQUMxSSxDQUNGLENBQUM7UUFDSixDQUFDLEVBQ0QsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUNqQztRQUVILE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxHQUFzQztnQkFDOUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQzFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2FBQ3JCLENBQUM7WUFDRixJQUFJLEtBQUssQ0FBQyxNQUFNO2dCQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxrRUFBa0U7WUFDbEUsbUVBQW1FO1lBQ25FLHFFQUFxRTtZQUNyRSxJQUFJLEtBQUssQ0FBQyxNQUFNO2dCQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25FLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsQiwwRUFBMEU7WUFDMUUsb0ZBQW9GO1lBQ3BGLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3JDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDcEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDM0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLDREQUE0RDtZQUM1RCxrRUFBa0U7WUFDbEUsSUFBSSxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBQ2hDLHFGQUFxRjtnQkFDckYsTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkIsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsMERBQTBEO2dCQUMxRCxnRUFBZ0U7Z0JBQ2hFLDZEQUE2RDtnQkFDN0QsMkRBQTJEO2dCQUMzRCxzREFBc0Q7Z0JBQ3RELEVBQUU7Z0JBQ0YsNERBQTREO2dCQUM1RCxnRUFBZ0U7Z0JBQ2hFLDhEQUE4RDtnQkFDOUQsMENBQTBDO2dCQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUMvQyxLQUFLLEVBQ0wsS0FBSyxDQUFDLElBQUksRUFDVixLQUFLLENBQUMsVUFBVSxDQUNqQixDQUFDO2dCQUNGLE1BQU0sS0FBSyxHQUFHLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUV4QiwwRUFBMEU7Z0JBQzFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxHQUN4QyxLQUFLLENBQUMsT0FBTyxLQUFLLFdBQVc7b0JBQzNCLENBQUMsQ0FBQyxzQkFBc0IsRUFBRTtvQkFDMUIsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUVuQyw2Q0FBNkM7Z0JBQzdDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7b0JBQ2xELHNDQUFzQztnQkFDeEMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgscUVBQXFFO2dCQUNyRSxzRUFBc0U7Z0JBQ3RFLElBQUksT0FBTyxFQUFFLGVBQWU7b0JBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ3hELGdCQUFnQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFM0MsT0FBTyxZQUFZLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGlFQUFpRTtnQkFDakUsK0RBQStEO2dCQUMvRCx1Q0FBdUM7Z0JBQ3ZDLGlFQUFpRTtnQkFDakUsbUVBQW1FO2dCQUNuRSxvRUFBb0U7Z0JBQ3BFLGdFQUFnRTtnQkFDaEUsSUFBSSxVQUF1RCxDQUFDO2dCQUM1RCxNQUFNLFVBQVUsR0FBRyxHQUFvQyxFQUFFO29CQUN2RCxVQUFVLEtBQUssb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQy9DLE9BQU8sVUFBVSxDQUFDO2dCQUNwQixDQUFDLENBQUM7Z0JBQ0YsTUFBTSxRQUFRLEdBQUcsOEJBQThCLENBQzdDLEtBQUssRUFDTCxLQUFLLENBQUMsSUFBSSxFQUNWLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLFVBQVUsQ0FDWCxDQUFDO2dCQUNGLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUNwQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsRUFDbkQsVUFBVSxDQUNYLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztnQkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhCLDhDQUE4QztnQkFDOUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7b0JBQzVELHNDQUFzQztnQkFDeEMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsb0VBQW9FO2dCQUNwRSxtRUFBbUU7Z0JBQ25FLElBQUksT0FBTyxFQUFFLGVBQWU7b0JBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ3hELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRWpELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLGtFQUFrRTtZQUNsRSw4REFBOEQ7WUFDOUQsNENBQTRDO1lBQzVDLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMxRSxNQUFNLFNBQVMsR0FDYixXQUFXLEtBQUssS0FBSztnQkFDbkIsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLGlDQUFpQyxDQUMvQixXQUFXLEVBQ1gsS0FBSyxDQUFDLFlBQVksRUFDbEIsS0FBSyxDQUFDLG1CQUFtQixDQUMxQixDQUFDO1lBRVIsT0FBTyx1QkFBdUIsQ0FBQztnQkFDN0IsTUFBTTtnQkFDTixHQUFHO2dCQUNILEtBQUssRUFBRSxXQUFXO2dCQUNsQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLEdBQUcsRUFBRSxTQUFTO2dCQUNkLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjthQUMvQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQztRQUNwRSxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO0tBQzdELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsU0FBOEIsVUFBVTtJQUV4QyxPQUFPO1FBQ0wsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDNUIsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztRQUNqQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1lBQ2hELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDcEIsS0FBYSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQzdELE9BQU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDO2dCQUM3QixLQUFhLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRTtvQkFDaEMsTUFBTSxJQUFJLGtCQUFrQixDQUMxQiw2REFBNkQsRUFDN0Q7d0JBQ0UsSUFBSSxFQUFFLGlIQUFpSDtxQkFDeEgsQ0FDRixDQUFDO2dCQUNKLENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDMUIsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7WUFDSCxNQUFNLElBQUksa0JBQWtCLENBQzFCLDJFQUEyRSxFQUMzRTtnQkFDRSxJQUFJLEVBQUUsbUlBQW1JO2FBQzFJLENBQ0YsQ0FBQztRQUNKLENBQUMsRUFDRCxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQ2pDO1FBQ0gsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixzRUFBc0U7WUFDdEUsSUFBSSxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3hCLDZDQUE2QztnQkFDN0MsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO29CQUNwRCxDQUFDLGdCQUFnQixDQUFDLEVBQUU7d0JBQ2xCLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUTt3QkFDckIsUUFBUSxFQUFFLEtBQUs7cUJBQ2hCO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCwwQkFBMEI7WUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO2dCQUNwRCxDQUFDLGtCQUFrQixDQUFDLEVBQUU7b0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2dCQUNELENBQUMsa0JBQWtCLENBQUMsRUFBRTtvQkFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNqQixRQUFRLEVBQUUsS0FBSztpQkFDaEI7Z0JBQ0QsNkRBQTZEO2dCQUM3RCw4REFBOEQ7Z0JBQzlELGdFQUFnRTtnQkFDaEUsZ0VBQWdFO2dCQUNoRSwwREFBMEQ7Z0JBQzFELENBQUMscUJBQXFCLENBQUMsRUFBRTtvQkFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUNwQixRQUFRLEVBQUUsS0FBSztpQkFDaEI7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQTBCO2dCQUN4QyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7b0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDakIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2FBQ0YsQ0FBQztZQUNGLDJEQUEyRDtZQUMzRCw0REFBNEQ7WUFDNUQsMENBQTBDO1lBQzFDLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNwQyxVQUFVLENBQUMsMkJBQTJCLENBQUMsR0FBRztvQkFDeEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO29CQUNsQixRQUFRLEVBQUUsS0FBSztpQkFDaEIsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDM0MsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLEdBQUc7b0JBQy9DLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWTtvQkFDekIsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1lBQ0QsbUVBQW1FO1lBQ25FLHdFQUF3RTtZQUN4RSxrRUFBa0U7WUFDbEUsa0VBQWtFO1lBQ2xFLElBQUksT0FBTyxLQUFLLENBQUMsbUJBQW1CLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xELFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyxHQUFHO29CQUM1QyxLQUFLLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtvQkFDaEMsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsNkVBQTZFO1FBQzdFLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRSxJQUFJLEtBQUssQ0FBQyxPQUFPO2dCQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELE9BQU87Z0JBQ0wsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUNyQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQ25DLE1BQU07Z0JBQ04sS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7YUFDaEIsQ0FBQztRQUNKLENBQUM7UUFDRCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLElBQUksS0FBSyxDQUFDLE9BQU87Z0JBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGVBQWUsQ0FDdEIsU0FBOEIsVUFBVSxFQUN4QyxHQUFvQixFQUNwQixLQUFhLEVBQ2IsU0FBNkIsRUFDN0IsWUFBcUIsRUFDckIsWUFBcUM7SUFFckMsT0FBTztRQUNMLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBRTVCLG9FQUFvRTtRQUNwRSx1REFBdUQ7UUFDdkQsRUFBRTtRQUNGLDhEQUE4RDtRQUM5RCx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLDREQUE0RDtRQUM1RCxnREFBZ0Q7UUFDaEQsdUVBQXVFO1FBQ3ZFLHFEQUFxRDtRQUNyRCxnRUFBZ0U7UUFDaEUsZ0VBQWdFO1FBQ2hFLHVEQUF1RDtRQUN2RCxtRUFBbUU7UUFDbkUsNkJBQTZCO1FBQzdCLHlDQUF5QztRQUN6QyxxRUFBcUU7UUFDckUscURBQXFEO1FBQ3JELFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUN0QyxNQUFNLFlBQVksR0FBRyxXQUFXLElBQUksS0FBSyxDQUFDO1lBQzFDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzdELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFeEUsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUksa0JBQWtCLENBQzFCLGtCQUFrQixNQUFNLHlEQUF5RCxFQUNqRjtvQkFDRSxJQUFJLEVBQUUscUpBQXFKO2lCQUM1SixDQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUQsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELE1BQU0sYUFBYSxHQUFHLFVBQXlCLEdBQUcsSUFBVztnQkFDM0QsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDakQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN2RSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDcEIsTUFBTSxJQUFJLG9CQUFvQixDQUM1Qix1RUFBdUUsQ0FDeEUsQ0FBQztvQkFDSixDQUFDO29CQUNELE1BQU0sVUFBVSxHQUFHO3dCQUNqQixHQUFHLGNBQWM7d0JBQ2pCLFdBQVc7cUJBQ1osQ0FBQztvQkFDRixPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FDakMsQ0FBQztnQkFDSixDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUMsQ0FBUSxDQUFDO1lBRVQsOENBQThDO1lBQzlDLE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRTtnQkFDM0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ25CLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRTtnQkFDN0MsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFlBQVksRUFBRSxLQUFLO2FBQ3BCLENBQUMsQ0FBQztZQUNILElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEMsYUFBYSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9DLENBQUM7WUFFRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBRUQsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUMxQixNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRTtZQUNILE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkVBQTJFLEVBQzNFO2dCQUNFLElBQUksRUFBRSxtSUFBbUk7YUFDMUksQ0FDRixDQUFDO1FBQ0osQ0FBQyxFQUNELEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FDakM7UUFFSCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBc0M7Z0JBQzlDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDcEIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUMxQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTthQUNyQixDQUFDO1lBQ0YsSUFBSSxLQUFLLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsa0VBQWtFO1lBQ2xFLG1FQUFtRTtZQUNuRSxxRUFBcUU7WUFDckUsSUFBSSxLQUFLLENBQUMsTUFBTTtnQkFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsS0FBSyxFQUFFLFFBQWtCLEVBQUUsRUFBRTtvQkFDakQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzVDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDN0IsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsMEVBQTBFO1lBQzFFLG9GQUFvRjtZQUNwRixPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2FBQzNDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4Qiw0REFBNEQ7WUFDNUQscUVBQXFFO1lBQ3JFLElBQUksVUFBVSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNoQyxxRkFBcUY7Z0JBQ3JGLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckUsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUMzQiwwREFBMEQ7Z0JBQzFELGdFQUFnRTtnQkFDaEUsNkRBQTZEO2dCQUM3RCxnRUFBZ0U7Z0JBQ2hFLHNEQUFzRDtnQkFDdEQsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztnQkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhCLDBFQUEwRTtnQkFDMUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQ3hDLEtBQUssQ0FBQyxPQUFPLEtBQUssV0FBVztvQkFDM0IsQ0FBQyxDQUFDLHNCQUFzQixFQUFFO29CQUMxQixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBRW5DLDZDQUE2QztnQkFDN0MsYUFBYSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDbEQsc0NBQXNDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFFSCxrREFBa0Q7Z0JBQ2xELGdCQUFnQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFdEMsT0FBTyxZQUFZLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUNwQyxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUM1RCxTQUFTLENBQ1YsQ0FBQztnQkFDRixNQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFeEIsNkNBQTZDO2dCQUM3QyxhQUFhLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDNUQsc0NBQXNDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFFSCxrREFBa0Q7Z0JBQ2xELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRTVDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLGtFQUFrRTtZQUNsRSxnRUFBZ0U7WUFDaEUsRUFBRTtZQUNGLGdFQUFnRTtZQUNoRSxrRUFBa0U7WUFDbEUsa0VBQWtFO1lBQ2xFLDhEQUE4RDtZQUM5RCx5REFBeUQ7WUFDekQsaUVBQWlFO1lBQ2pFLCtEQUErRDtZQUMvRCw4REFBOEQ7WUFDOUQsMERBQTBEO1lBQzFELE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMxRSxNQUFNLGtCQUFrQixHQUN0QixPQUFPLEtBQUssQ0FBQyxZQUFZLEtBQUssUUFBUTtnQkFDcEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZO2dCQUNwQixDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUs7b0JBQ3JCLENBQUMsQ0FBQyxZQUFZO29CQUNkLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbEIsTUFBTSxTQUFTLEdBQ2IsV0FBVyxLQUFLLEtBQUs7Z0JBQ25CLENBQUMsQ0FBQyxTQUFTO2dCQUNYLENBQUMsQ0FBQyxpQ0FBaUMsQ0FDL0IsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixLQUFLLENBQUMsbUJBQW1CLENBQzFCLENBQUM7WUFFUixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FDbEMsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUNwRCxTQUFTLENBQ1YsQ0FBQztZQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksNEJBQTRCLENBQ3JELFdBQVcsRUFDWCxLQUFLLENBQUMsSUFBSSxDQUNYLENBQUM7WUFFRix5Q0FBeUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztZQUNyQyxLQUFLLENBQUMsc0JBQXNCLEdBQUcsWUFBWSxLQUFLLFNBQVMsQ0FBQztZQUMxRCxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXhCLDZDQUE2QztZQUM3QyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDbEUsc0NBQXNDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBRUgsNkRBQTZEO1lBQzdELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUNyQyxTQUFTLENBQUMsUUFBUSxFQUNsQixLQUFLLEVBQ0wsTUFBTSxDQUFDLGNBQWMsQ0FDdEIsQ0FBQztZQUNGLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVsQyxtRUFBbUU7WUFDbkUsK0RBQStEO1lBQy9ELDZEQUE2RDtZQUM3RCwwREFBMEQ7WUFDMUQsOERBQThEO1lBQzlELGtCQUFrQjtZQUNsQixNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtnQkFDbEQsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNqQixRQUFRLEVBQUUsS0FBSzthQUNoQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSwyQkFBMkIsRUFBRTtnQkFDM0QsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQztZQUNILElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsa0NBQWtDLEVBQUU7b0JBQ2xFLEtBQUssRUFBRSxrQkFBa0I7b0JBQ3pCLFFBQVEsRUFBRSxLQUFLO2lCQUNoQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsMEVBQTBFO1lBQzFFLCtCQUErQjtZQUMvQixFQUFFO1lBQ0YseUVBQXlFO1lBQ3pFLDBFQUEwRTtZQUMxRSx1RUFBdUU7WUFDdkUseUVBQXlFO1lBQ3pFLG1FQUFtRTtZQUNuRSxrQ0FBa0M7WUFDbEMsRUFBRTtZQUNGLHFFQUFxRTtZQUNyRSwwRUFBMEU7WUFDMUUsc0RBQXNEO1lBQ3RELEVBQUU7WUFDRiwwRUFBMEU7WUFDMUUsd0VBQXdFO1lBQ3hFLHFEQUFxRDtZQUNyRCxJQUNFLE9BQU8sS0FBSyxDQUFDLG1CQUFtQixLQUFLLFFBQVE7Z0JBQzdDLFdBQVcsS0FBSyxLQUFLO2dCQUNyQixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFDM0IsQ0FBQztnQkFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSwrQkFBK0IsRUFBRTtvQkFDL0QsS0FBSyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztvQkFDakQsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLG1CQUFtQixLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSwrQkFBK0IsRUFBRTtvQkFDL0QsS0FBSyxFQUFFLEtBQUssQ0FBQyxtQkFBbUI7b0JBQ2hDLFFBQVEsRUFBRSxLQUFLO2lCQUNoQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7UUFDcEUsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQztLQUM3RCxDQUFDO0FBQ0osQ0FBQztBQUVELCtFQUErRTtBQUMvRSxxQkFBcUI7QUFDckIsK0VBQStFO0FBQy9FLHlGQUF5RjtBQUN6RixxRkFBcUY7QUFFckY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FDaEMsSUFBZ0IsRUFDaEIsR0FBMkI7SUFFM0IsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBZSxDQUFDO0FBQ2xELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQ2hDLElBQTBCLEVBQzFCLEdBQTJCO0lBRTNCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBNEJEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUEwQixLQUFLLEVBQzlELEtBQUssRUFDTCxHQUFHLEVBQ0gsRUFBRTtJQUNGLE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FDL0IsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUN6QixnQkFBZ0IsQ0FDakIsQ0FBQztJQUNGLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDekQsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdDQUFnQyxDQUM5QyxRQUErQixFQUMvQixTQUE4QixVQUFVLEVBQ3hDLGdCQUFxRCxFQUFFO0lBRXZELE9BQU8sY0FBYyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1FBQy9DLE1BQU07UUFDTixhQUFhLEVBQUU7WUFDYixHQUFHLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELEdBQUcsYUFBYTtTQUNqQjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLFFBQStCLEVBQy9CLFNBQThCLFVBQVUsRUFDeEMsZ0JBQXFELEVBQUU7SUFFdkQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQztJQUMxQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLFNBQVMsQ0FBQyxJQUFhLEVBQUU7WUFDOUIsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7WUFDOUIsR0FBRyxhQUFhO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNoQixHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztZQUM5QixHQUFHLGFBQWE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxnQ0FBZ0M7QUFDaEMsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSxnRkFBZ0Y7QUFDaEYsd0VBQXdFO0FBRXhFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsS0FBYyxFQUNkLEtBQWEsRUFDYixHQUEyQixFQUMzQixNQUF1QixFQUFFLEVBQ3pCLFNBQThCLFVBQVUsRUFDeEMsUUFBUSxHQUFHLEtBQUssRUFDaEIsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixXQUFXLEdBQUcsS0FBSyxFQUNuQixjQUErQixHQUFHO0lBRWxDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQ25CLEtBQUssRUFDTCxtQkFBbUIsQ0FDakIsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsR0FBRyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsV0FBVyxDQUNaLENBQ0YsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDdEQsTUFBTTtZQUNOLGFBQWEsRUFBRSwyQkFBMkIsQ0FDeEMsbUJBQW1CLENBQ2pCLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLEdBQUcsRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFdBQVcsQ0FDWixDQUNGO1lBQ0QsV0FBVztZQUNYLGdCQUFnQjtTQUNqQixDQUFDLENBQUM7UUFDSCxNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxLQUFLLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FDaEQsb0JBQW9CLEVBQ3BCLEtBQUssQ0FDTixDQUFDO1FBQ0YsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCLENBQzVDLEtBQTJCLEVBQzNCLE1BQWMsRUFDZCxHQUEyQixFQUMzQixTQUE4QixVQUFVLEVBQ3hDLGdCQUFxRCxFQUFFLEVBQ3ZELFFBQWdDO0lBRWhDLE9BQU8sZ0NBQWdDLENBQ3JDLFFBQVEsSUFBSSxDQUFDLE1BQU0sb0JBQW9CLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQ3BELE1BQU0sRUFDTixhQUFhLENBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsNEJBQTRCLENBQ2hELEtBQWMsRUFDZCxNQUFjLEVBQ2QsR0FBMkIsRUFDM0IsU0FBOEIsVUFBVSxFQUN4QyxRQUFRLEdBQUcsS0FBSyxFQUNoQixXQUFXLEdBQUcsS0FBSztBQUNuQjs7Ozs7O0dBTUc7QUFDSCxpQkFBa0M7SUFFbEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sY0FBYyxHQUFtQixpQkFBaUIsSUFBSTtZQUMxRCxVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNwRCxNQUFNO1lBQ04sYUFBYSxFQUFFLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZFLFdBQVc7WUFDWCxnQkFBZ0I7WUFDaEIsY0FBYztTQUNmLENBQUMsQ0FBQztRQUNILE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkQsTUFBTSx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLENBQ2hELHVCQUF1QixFQUN2QixLQUFLLENBQ04sQ0FBQztRQUNGLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLEtBQTJCLEVBQzNCLEtBQWEsRUFDYixHQUEyQixFQUMzQixNQUF1QixFQUFFLEVBQ3pCLFNBQThCLFVBQVUsRUFDeEMsZ0JBQXFELEVBQUU7SUFFdkQsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO0lBQzlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ3hELE1BQU07UUFDTixhQUFhLEVBQUU7WUFDYixHQUFHLDJCQUEyQixDQUM1QixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FDN0M7WUFDRCxHQUFHLGFBQWE7U0FDakI7UUFDRCxnQkFBZ0I7S0FDakIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsS0FBYyxFQUNkLE1BQWMsRUFDZCxHQUEyQixFQUMzQixTQUE4QixVQUFVLEVBQ3hDLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLFdBQVcsR0FBRyxLQUFLO0FBQ25CLDBDQUEwQztBQUMxQyxpQkFBa0M7SUFFbEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sY0FBYyxHQUFtQixpQkFBaUIsSUFBSTtZQUMxRCxVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNwRCxNQUFNO1lBQ04sYUFBYSxFQUFFLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZFLFdBQVc7WUFDWCxnQkFBZ0I7WUFDaEIsY0FBYztTQUNmLENBQUMsQ0FBQztRQUNILE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkQsTUFBTSx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUUsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsS0FBMkIsRUFDM0IsS0FBYSxFQUNiLEdBQTJCLEVBQzNCLE1BQXNCLEVBQUUsRUFDeEIsU0FBOEIsVUFBVSxFQUN4QyxnQkFBcUQsRUFBRSxFQUN2RCxZQUFxQixFQUNyQixZQUFxQztJQUVyQyxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDdEQsTUFBTTtRQUNOLGFBQWEsRUFBRTtZQUNiLEdBQUcsMkJBQTJCLENBQzVCLGVBQWUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUNyRTtZQUNELEdBQUcsYUFBYTtTQUNqQjtRQUNELGdCQUFnQjtLQUNqQixDQUFDLENBQUM7SUFDSCxNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCLENBQzVDLEtBQWMsRUFDZCxLQUFhLEVBQ2IsR0FBMkIsRUFDM0IsTUFBc0IsRUFBRSxFQUN4QixTQUE4QixVQUFVLEVBQ3hDLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLGlCQUFpQixHQUFHLEtBQUssRUFDekIsV0FBVyxHQUFHLEtBQUs7QUFDbkIsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSxxREFBcUQ7QUFDckQsZUFBa0MsRUFDbEMsY0FBK0IsR0FBRztJQUVsQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUNuQixLQUFLLEVBQ0wsZUFBZSxDQUNiLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLEdBQUcsRUFDSCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFdBQVcsQ0FDWixDQUNGLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ3BELE1BQU07WUFDTixhQUFhLEVBQUUsMkJBQTJCLENBQ3hDLGVBQWUsQ0FDYixNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxHQUFHLEVBQ0gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixXQUFXLENBQ1osQ0FDRjtZQUNELFdBQVc7WUFDWCxnQkFBZ0I7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLENBQ2hELG1CQUFtQixFQUNuQixLQUFLLENBQ04sQ0FBQztRQUNGLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLEtBQWMsRUFDZCxLQUFhLEVBQ2IsR0FBMkIsRUFDM0IsTUFBc0IsRUFBRSxFQUN4QixTQUE4QixVQUFVLEVBQ3hDLFdBQVcsR0FBRyxLQUFLO0lBRW5CLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQ3ZDLG1CQUFtQixDQUFDLFVBQVUsRUFDOUIsT0FBTyxDQUNNLENBQUM7UUFDaEIsOERBQThEO1FBQzlELE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FDL0IsVUFBVSxFQUNWLFdBQVcsRUFDWCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxZQUFZLENBQ25DLFVBQXdCLEVBQ3hCLEdBQUcsQ0FDSixDQUFlLENBQUM7UUFDakIsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2RCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLEtBQTJCLEVBQzNCLE1BQWMsRUFDZCxHQUEyQixFQUMzQixTQUE4QixVQUFVLEVBQ3hDLGdCQUFxRCxFQUFFLEVBQ3ZELFFBQWdDO0lBRWhDLE9BQU8sNEJBQTRCLENBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sb0JBQW9CLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQ3BELE1BQU0sRUFDTixhQUFhLENBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsS0FBYyxFQUNkLE1BQWMsRUFDZCxHQUEyQixFQUMzQixTQUE4QixVQUFVLEVBQ3hDLFdBQVcsR0FBRyxLQUFLO0lBRW5CLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FDdkMsbUJBQW1CLENBQUMsVUFBVSxFQUM5QixPQUFPLENBQ00sQ0FBQztRQUNoQiw4REFBOEQ7UUFDOUQsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUFHLE1BQU0sUUFBUSxDQUMvQixVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixDQUNqQixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLFlBQVksQ0FDbkMsVUFBd0IsRUFDeEIsR0FBRyxDQUNKLENBQWUsQ0FBQztRQUNqQixNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxLQUFLLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkUsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsS0FBMkIsRUFDM0IsS0FBYSxFQUNiLEdBQTJCLEVBQzNCLE1BQXVCLEVBQUUsRUFDekIsU0FBOEIsVUFBVSxFQUN4QyxnQkFBcUQsRUFBRTtJQUV2RCxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQ2hDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFDekIsZ0JBQWdCLENBQ2pCLENBQUM7SUFDRixNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXpELElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLHNFQUFzRTtRQUN0RSw2Q0FBNkM7UUFDN0MsT0FBTyxTQUFTLENBQUMsU0FBa0IsRUFBRTtZQUNuQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztZQUMvQyxHQUFHLGFBQWE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFMUQsSUFBSSxNQUFNLEtBQUssbUJBQW1CLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2hCLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQy9DLEdBQUcsYUFBYTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsS0FBMkIsRUFDM0IsTUFBYyxFQUNkLEdBQTJCLEVBQzNCLFNBQThCLFVBQVUsRUFDeEMsZ0JBQXFELEVBQUUsRUFDdkQsUUFBZ0M7SUFFaEMsT0FBTyxnQ0FBZ0MsQ0FDckMsUUFBUSxJQUFJLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFDcEQsTUFBTSxFQUNOLGFBQWEsQ0FDZCxDQUFDO0FBQ0osQ0FBQztBQUVELDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSx3RUFBd0U7QUFDeEUseUVBQXlFO0FBRXpFLE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixTQUFTO0lBQ1QsVUFBVTtJQUNWLGNBQWM7SUFDZCw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSw4REFBOEQ7SUFDOUQsaUJBQWlCO0lBQ2pCLGFBQWE7Q0FDTCxDQUFDO0FBRVgsU0FBUywyQkFBMkIsQ0FDbEMsV0FBZ0M7SUFFaEMsTUFBTSxLQUFLLEdBQXdDLEVBQUUsQ0FBQztJQUN0RCxLQUFLLE1BQU0sR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFDMUMsSUFBSSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQ2xDLFdBQWdDO0lBRWhDLE1BQU0sS0FBSyxHQUF3QyxFQUFFLENBQUM7SUFDdEQsS0FBSyxNQUFNLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzFDLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFN0cmVhbUVycm9yLFxuICBTdHJlYW1FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1Xcml0ZVNlc3Npb24gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2Vudi1jb25maWcnO1xuaW1wb3J0IHsgcGFyc2UsIHN0cmluZ2lmeSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmx1c2hhYmxlU3RhdGUsXG4gIHR5cGUgRmx1c2hhYmxlU3RyZWFtU3RhdGUsXG4gIGZsdXNoYWJsZVBpcGUsXG4gIGdldE1heEJ1ZmZlcmVkQnl0ZXMsXG4gIGdldE1heEJ5dGVzUGVyQmF0Y2gsXG4gIGdldE1heENodW5rc1BlckJhdGNoLFxuICBnZXRNYXhJbmZsaWdodENodW5rcyxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbiAgdHJhY2tGbHVzaGFibGVXcml0YWJsZSxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyB3b3JsZC50cyBtb2R1bGUgKGFuZCBpdHMgZHluYW1pYy1pbXBvcnQgYmVoYXZpb3VyKSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGNyZWF0ZU9wZW5TZXNzaW9uLFxuICBjcmVhdGVTZWFsU2Vzc2lvbixcbiAgZGVjb2RlUnVuUHVibGljS2V5LFxufSBmcm9tICcuL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0ICogYXMgY2xpZW50TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wcmVzc2lvblN0YXRzLFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGFlc0tleU9mLFxuICBkZWNyeXB0LFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGVuY3J5cHQsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICByZXNvbHZlRW5jcnlwdGlvbktleSxcbiAgcnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IsXG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZm9ybWF0LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgR3Vlc3RDb2RlU3RhdHMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgcmVhZFByb3BlcnR5LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0RSQUlOX1NZTUJPTCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuS2luZCwgcmVjb3JkRWxhcHNlZFNwYW4gfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRBYm9ydFN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IFdvcmtmbG93QWJvcnRTaWduYWwgfSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlc1xuLy8gc28gZXhpc3RpbmcgY29uc3VtZXJzIG9mIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uYCBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgLy8gU2VhbGVkLWJveCAoJ2VuY3AnKSBrZXkgdmFyaWFudHM6IHNlZSBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG4gIHJ1blBheWxvYWRLZXlzLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgaXNTZWFsVGFyZ2V0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBhZXNLZXlPZixcbn07XG5cbi8vIFJlLWV4cG9ydCB0aGUgbGVnYWN5IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIE5ldyBjb2RlIHNob3VsZCB1c2UgRm9ybWF0UHJlZml4IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcycuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKipcbiAqIERlZmF1bHQgVUxJRCBnZW5lcmF0b3IgZm9yIGNvbnRleHRzIHdoZXJlIFZNJ3Mgc2VlZGVkIGBzdGFibGVVbGlkYCBpc24ndCBhdmFpbGFibGUuXG4gKiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBzZXJpYWxpemluZyBzdHJlYW1zIG91dHNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHRcbiAqIChlLmcuLCB3aGVuIHN0YXJ0aW5nIGEgd29ya2Zsb3cgb3IgaGFuZGxpbmcgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdFVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgcmVhZGFibGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHN0cmVhbVxuICogQHJldHVybnMgYFwiYnl0ZXNcImAgaWYgdGhlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLCBgdW5kZWZpbmVkYCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmVhbVR5cGUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6ICdieXRlcycgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoeyBtb2RlOiAnYnlvYicgfSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgcmV0dXJuICdieXRlcyc7XG4gIH0gY2F0Y2gge31cbn1cblxuLyoqXG4gKiBGcmFtZSBmb3JtYXQgZm9yIHN0cmVhbSBjaHVua3M6XG4gKiAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW2Zvcm1hdC1wcmVmaXhlZCBwYXlsb2FkXVxuICpcbiAqIEVhY2ggY2h1bmsgaXMgaW5kZXBlbmRlbnRseSBmcmFtZWQgc28gdGhlIGRlc2VyaWFsaXplciBjYW4gZmluZFxuICogY2h1bmsgYm91bmRhcmllcyBldmVuIHdoZW4gbXVsdGlwbGUgY2h1bmtzIGFyZSBjb25jYXRlbmF0ZWQgb3JcbiAqIHNwbGl0IGFjcm9zcyB0cmFuc3BvcnQgcmVhZHMuXG4gKi9cbmNvbnN0IEZSQU1FX0hFQURFUl9TSVpFID0gNDtcblxuLyoqXG4gKiBUaGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAoYC4vc2VyaWFsaXphdGlvbi97Y2xpZW50LHN0ZXAsd29ya2Zsb3d9LnRzYClcbiAqIGFscmVhZHkgdGhyb3cgYSBgU2VyaWFsaXphdGlvbkVycm9yYCB3aG9zZSBgLmNhdXNlYCBpcyB0aGUgdW5kZXJseWluZ1xuICogZGV2YWx1ZSAvIHNlcmRlIGZhaWx1cmUuIFRoZSBvdXRlciBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB3YW50IHRvXG4gKiByZS1mcmFtZSB0aGF0IGVycm9yIHdpdGggYSBtb3JlIHNwZWNpZmljIGNvbnRleHQgbGFiZWwgKGUuZy4gXCJ3b3JrZmxvd1xuICogYXJndW1lbnRzXCIgaW5zdGVhZCBvZiBnZW5lcmljIFwid29ya2Zsb3cgdmFsdWVcIiksIHNvIHRoZXkgdW53cmFwIHRoZVxuICogaW5uZXIgU2VyaWFsaXphdGlvbkVycm9yIGFuZCByZWZvcm1hdCB3aXRoIHRoZSBvcmlnaW5hbCBjYXVzZS4gRXJyb3JzXG4gKiB0aGF0IGFyZW4ndCBhbHJlYWR5IFNlcmlhbGl6YXRpb25FcnJvciBmbG93IHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBpcyBhbiBleGNlcHRpb246IGl0IG11c3Qga2VlcCBpdHMgaWRlbnRpdHkgKGFuZFxuICogYGNvbnRleHRgKSBzbyB0aGUgcnVuLWZhaWx1cmUgY2xhc3NpZmllciByb3V0ZXMgaXQgdG8gYFJVTlRJTUVfRVJST1JgLFxuICogc28gdGhpcyByZXRocm93cyBpdCB1bmNoYW5nZWQgYmVmb3JlIGFueSB1bndyYXBwaW5nLiBOb3RlIHRoaXMgZ3VhcmRcbiAqIG11c3QgcnVuIGJlZm9yZSB0aGUgZ2VuZXJpYyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIHVud3JhcCBiZWxvdywgc2luY2VcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBleHRlbmRzIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIGNhcnJpZXMgYVxuICogYGNhdXNlYCAodGhlIHVuZGVybHlpbmcgRE9NRXhjZXB0aW9uKSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1bndyYXBwZWRcbiAqIGFuZCByZWZyYW1lZCBhcyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgLlxuICovXG5mdW5jdGlvbiB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VyaWFsaXphdGlvbkVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogRW1pdCBjb21wcmVzc2lvbiB0ZWxlbWV0cnkgb250byB0aGUgYWN0aXZlIHNwYW4gYWZ0ZXIgYSAoZGUpc2VyaWFsaXplLlxuICpcbiAqIFRoZSBjb21wcmVzc2lvbiBsYXllciBwb3B1bGF0ZXMgYHN0YXRzYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgcmFuIChiaW5hcnlcbiAqIGRhdGEgb24gYSBzcGVjID49IDUgcGF0aCk7IGxlZ2FjeSAvIHYxQ29tcGF0IHBhdGhzIGxlYXZlIGl0IHVucmVjb3JkZWQsIHNvXG4gKiB0aGlzIG5vLW9wcyBmb3IgdGhlbSBhbmQgYXZvaWRzIHRoZSBgZ2V0QWN0aXZlU3BhbmAgbG9va3VwLiBBdHRyaWJ1dGVzIGxhbmRcbiAqIG9uIHdoYXRldmVyIHNwYW4gaXMgYWN0aXZlLCB0eXBpY2FsbHkgdGhlIGRlZGljYXRlZCBgc3RlcC5kZWh5ZHJhdGVgIC9cbiAqIGBzdGVwLmh5ZHJhdGVgIHNwYW4sIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIHJ1bi9zdGFydCBzcGFuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRDb21wcmVzc2lvbihcbiAgc3RhdHM6IENvbXByZXNzaW9uU3RhdHMsXG4gIG9wZXJhdGlvbjogJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzdGF0cy5yZWNvcmRlZCkgcmV0dXJuO1xuICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgcGF0aDogYVxuICAvLyBtaXNzaW5nL2ZhaWxpbmcgdHJhY2VyIGlzIHB1cmVseSBhbiBvYnNlcnZhYmlsaXR5IGxvc3MuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRCeXRlcyA9IHN0YXRzLnVuY29tcHJlc3NlZEJ5dGVzID8/IDA7XG4gICAgY29uc3Qgc3RvcmVkQnl0ZXMgPSBzdGF0cy5zdG9yZWRCeXRlcyA/PyAwO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25PcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzZWQoc3RhdHMuY29tcHJlc3NlZCA/PyBmYWxzZSksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db2RlYyhzdGF0cy5jb2RlYyA/PyAnbm9uZScpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXModW5jb21wcmVzc2VkQnl0ZXMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMoc3RvcmVkQnl0ZXMpLFxuICAgICAgLi4uKHN0YXRzLmNvbXByZXNzZWQgJiYgdW5jb21wcmVzc2VkQnl0ZXMgPiAwXG4gICAgICAgID8gQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3Npb25SYXRpbyhcbiAgICAgICAgICAgIDEgLSBzdG9yZWRCeXRlcyAvIHVuY29tcHJlc3NlZEJ5dGVzXG4gICAgICAgICAgKVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgT1RlbCBzcGFuIGF0dHJpYnV0ZXMgZm9yIHdvcmtmbG93IChndWVzdCkgY29kZSBleGVjdXRpb25zIHRoYXQgdGhlXG4gKiBoYXJkZW5lZCBzZXJpYWxpemVyIGNvdWxkIG5vdCBhdm9pZCAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tXG4gKiBzZXJpYWxpemVycykuIE5vLW9wcyB3aGVuIHNlcmlhbGl6YXRpb24gd2FzIGZ1bGx5IHNpZGUtZWZmZWN0IGZyZWUsXG4gKiB0aGUgY29tbW9uIGNhc2UuIFNhbWUgbmV2ZXItYnJlYWstdGhlLWRhdGEtcGF0aCBjb250cmFjdCBhc1xuICogYHJlY29yZENvbXByZXNzaW9uYCBhYm92ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0czogR3Vlc3RDb2RlU3RhdHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdG90YWxFeGVjdXRpb25zID0gc3RhdHMudG90YWxFeGVjdXRpb25zID8/IHN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoO1xuICBpZiAodG90YWxFeGVjdXRpb25zID09PSAwKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgc3RhdHMuZXhlY3V0aW9ucy5tYXAoKGUpID0+XG4gICAgICAgICAgZS5kZXRhaWwgPyBgJHtlLmtpbmR9ICgke2UuZGV0YWlsfSlgIDogZS5raW5kXG4gICAgICAgIClcbiAgICAgICksXG4gICAgXTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRXhlY3V0aW9ucyh0b3RhbEV4ZWN1dGlvbnMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRGV0YWlscyhkZXRhaWxzKSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJpYWxpemVTdHJlYW0oXG4gIHJlZHVjZXJzOiBQYXJ0aWFsPFJlZHVjZXJzPixcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIC8vIE5vdGU6IGlmIHJlc29sdmluZyBjcnlwdG9LZXkgcmVqZWN0cyAoZS5nLiwgbmV0d29yayBlcnJvciBmZXRjaGluZ1xuICAvLyB0aGUgZGVyaXZlZCBrZXkpLCB0aGUgcmVqZWN0aW9uIHdvbid0IHN1cmZhY2UgdW50aWwgdGhlIGZpcnN0IGNodW5rXG4gIC8vIGlzIHByb2Nlc3NlZCwgbm90IGF0IHN0cmVhbSBjb25zdHJ1Y3Rpb24gdGltZS5cbiAgY29uc3Qga2V5U3RhdGUgPSB7XG4gICAgcmVzb2x2ZWQ6IGZhbHNlLFxuICAgIGtleTogdW5kZWZpbmVkIGFzIFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIH07XG4gIC8vIFNldCB3aGVuIHRoZSByZXNvbHZlZCBrZXkgaXMgYSBzZWFsIHRhcmdldDsgYW1vcnRpemVzIHRoZSBLRU0gYWNyb3NzIGFsbFxuICAvLyBmcmFtZXMgdGhpcyBzdHJlYW0gaW5zdGFuY2Ugd3JpdGVzLlxuICBsZXQgc2VhbFNlc3Npb246IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVNlYWxTZXNzaW9uPiB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxhbnksIFVpbnQ4QXJyYXk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICgha2V5U3RhdGUucmVzb2x2ZWQpIHtcbiAgICAgICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaXNTZWFsVGFyZ2V0KGtleVN0YXRlLmtleSkpIHtcbiAgICAgICAgICAgIHNlYWxTZXNzaW9uID0gY3JlYXRlU2VhbFNlc3Npb24oXG4gICAgICAgICAgICAgIGtleVN0YXRlLmtleS5yZWNpcGllbnRQdWJsaWNLZXksXG4gICAgICAgICAgICAgIGtleVN0YXRlLmtleS5hYWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnkoY2h1bmssIHJlZHVjZXJzKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHNlcmlhbGl6ZWQpO1xuICAgICAgICBsZXQgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICkgYXMgVWludDhBcnJheTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBmcmFtZSBwYXlsb2FkIGlmIGEga2V5IGlzIHByb3ZpZGVkLlxuICAgICAgICAvLyBUaGUgbGVuZ3RoIGhlYWRlciByZW1haW5zIGluIHRoZSBjbGVhciBzbyB0aGUgZGVzZXJpYWxpemVyIGNhblxuICAgICAgICAvLyBmaW5kIGZyYW1lIGJvdW5kYXJpZXMgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEV2ZXJ5IGZyYW1lIGdldHMgYSBmcmVzaCByYW5kb20gbm9uY2UuIE5ldmVyIHN3aXRjaCB0aGlzIHRvIGFcbiAgICAgICAgLy8gY291bnRlcjogYSBzdHJlYW0gcmVjb25uZWN0IG9yIGEgZHVyYWJsZSByZXBsYXkgcmVzdGFydHMgdGhlIHdyaXRlcixcbiAgICAgICAgLy8gd2hpY2ggd291bGQgcmVwZWF0IGAoa2V5LCBub25jZSlgIGFuZCBjYXRhc3Ryb3BoaWNhbGx5IGJyZWFrXG4gICAgICAgIC8vIEFFUy1HQ00uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9uIHRoZSBzZWFsZWQgcGF0aCB0aGUgS0VNIGlzIGFtb3J0aXplZCBhY3Jvc3MgdGhlIHN0cmVhbSB2aWEgYVxuICAgICAgICAvLyBzZXNzaW9uIChvbmUgRUNESCBwZXIgd3JpdGVyIGluc3RlYWQgb2Ygb25lIHBlciBmcmFtZSkuIFRoYXQgaXMgc2FmZVxuICAgICAgICAvLyBwcmVjaXNlbHkgYmVjYXVzZSB0aGUgbm9uY2VzIHN0YXkgcmFuZG9tLCBhbmQgYmVjYXVzZSB0aGUgc2Vzc2lvbiBpc1xuICAgICAgICAvLyBzY29wZWQgdG8gdGhpcyBzdHJlYW0gaW5zdGFuY2U6IGEgcmVwbGF5ZWQgb3IgcmVjb25uZWN0ZWQgd3JpdGVyXG4gICAgICAgIC8vIGJ1aWxkcyBhIG5ldyBvbmUgYW5kIG5ldmVyIGluaGVyaXRzIGEgcHJldmlvdXMgY29udGVudCBrZXkuXG4gICAgICAgIGlmIChzZWFsU2Vzc2lvbikge1xuICAgICAgICAgIHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVELFxuICAgICAgICAgICAgYXdhaXQgc2VhbFNlc3Npb24uc2VhbChwcmVmaXhlZClcbiAgICAgICAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5U3RhdGUua2V5KSB7XG4gICAgICAgICAgcHJlZml4ZWQgPSAoYXdhaXQgZW5jcnlwdChwcmVmaXhlZCwga2V5U3RhdGUua2V5KSkgYXMgVWludDhBcnJheTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZTogWzQtYnl0ZSBsZW5ndGhdW3ByZWZpeGVkIGRhdGFdXG4gICAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBwcmVmaXhlZC5sZW5ndGgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgcHJlZml4ZWQubGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgIGZyYW1lLnNldChwcmVmaXhlZCwgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRW5jcnlwdGlvbiBmYWlsdXJlcyBtdXN0IGtlZXAgdGhlaXIgUnVudGltZURlY3J5cHRpb25FcnJvclxuICAgICAgICAvLyBpZGVudGl0eSAoUlVOVElNRV9FUlJPUikgcmF0aGVyIHRoYW4gYmUgcmVmcmFtZWQgYXMgYVxuICAgICAgICAvLyBTZXJpYWxpemF0aW9uRXJyb3IgKFVTRVJfRVJST1IpLlxuICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ3N0cmVhbSBjaHVuaycsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2U6IGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgcmV2aXZlcnM6IFBhcnRpYWw8UmV2aXZlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4ge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICBjb25zdCBrZXlTdGF0ZSA9IHtcbiAgICByZXNvbHZlZDogZmFsc2UsXG4gICAga2V5OiB1bmRlZmluZWQgYXMgUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgfTtcbiAgLy8gTWlycm9yIG9mIHRoZSB3cml0ZXIncyBzZWFsIHNlc3Npb246IGV2ZXJ5IGZyYW1lIGZyb20gb25lIHdyaXRlciBjYXJyaWVzXG4gIC8vIHRoZSBzYW1lIGVwaGVtZXJhbCBwdWJsaWMga2V5LCBzbyB0aGlzIHR1cm5zIGFuIEVDREggcGVyIGZyYW1lIGludG8gYW5cbiAgLy8gRUNESCBwZXIgd3JpdGVyLlxuICBsZXQgb3BlblNlc3Npb246IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZU9wZW5TZXNzaW9uPiB8IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXdCdWZmZXIuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV3QnVmZmVyLnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXdCdWZmZXI7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzKFxuICAgIGNvbnRyb2xsZXI6IFRyYW5zZm9ybVN0cmVhbURlZmF1bHRDb250cm9sbGVyPGFueT5cbiAgKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0XG4gICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAga2V5U3RhdGUua2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgIGtleVN0YXRlLnJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIGlmIChpc1J1blBheWxvYWRLZXlzKGtleVN0YXRlLmtleSkpIHtcbiAgICAgICAgb3BlblNlc3Npb24gPSBjcmVhdGVPcGVuU2Vzc2lvbihrZXlTdGF0ZS5rZXkua2V5UGFpciwga2V5U3RhdGUua2V5LmFhZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgY29tcGxldGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lc1xuICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCkge1xuICAgICAgICBicmVhazsgLy8gSW5jb21wbGV0ZSBmcmFtZSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyYW1lRGF0YSA9IGJ1ZmZlci5zbGljZShcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUsXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGhcbiAgICAgICk7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aCk7XG5cbiAgICAgIGxldCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGZyYW1lRGF0YSk7XG5cbiAgICAgIC8vIElmIHRoZSBmcmFtZSBwYXlsb2FkIGlzIGVuY3J5cHRlZCBvciBzZWFsZWQsIHJlY292ZXIgaXQgZmlyc3QgdG9cbiAgICAgIC8vIHJldmVhbCB0aGUgaW5uZXIgZm9ybWF0LXByZWZpeGVkIGRhdGEgKGUuZy4sICdkZXZsJyArIHNlcmlhbGl6ZWRcbiAgICAgIC8vIHRleHQpLCB0aGVuIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGRlc2VyaWFsaXphdGlvbiBwYXRoLlxuICAgICAgaWYgKFxuICAgICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEIHx8XG4gICAgICAgIGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRURcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzZWFsZWQgPSBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVEO1xuICAgICAgICAvLyBBIHNlYWxlZCBmcmFtZSBuZWVkcyB0aGUgcnVuJ3Mga2V5cGFpcjsgYSBzeW1tZXRyaWMgZnJhbWUgbmVlZHMgYW5cbiAgICAgICAgLy8gQUVTIGtleS4gUmVwb3J0IHRoZSBzaG9ydGZhbGwgcHJlY2lzZWx5OiBcIm5vIGtleSBhdCBhbGxcIiBhbmQgXCJ0aGVcbiAgICAgICAgLy8gd3Jvbmcga2luZCBvZiBrZXlcIiBoYXZlIGRpc3RpbmN0IGNhdXNlcy5cbiAgICAgICAgY29uc3QgdXNhYmxlID0gc2VhbGVkXG4gICAgICAgICAgPyBpc1J1blBheWxvYWRLZXlzKGtleVN0YXRlLmtleSlcbiAgICAgICAgICA6IGFlc0tleU9mKGtleVN0YXRlLmtleSkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF1c2FibGUpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICAgICAgICAgIHNlYWxlZFxuICAgICAgICAgICAgICAgID8gJ1NlYWxlZCBzdHJlYW0gZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gcnVuIGtleXBhaXIgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgXCJPcGVuaW5nIGEgc2VhbGVkIGZyYW1lIHJlcXVpcmVzIHRoZSBydW4ncyBvd24gZW5jcnlwdGlvbiBrZXkgbWF0ZXJpYWwuXCJcbiAgICAgICAgICAgICAgICA6ICdFbmNyeXB0ZWQgc3RyZWFtIGRhdGEgZW5jb3VudGVyZWQgYnV0IG5vIGVuY3J5cHRpb24ga2V5IGlzIGF2YWlsYWJsZS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdFbmNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIG9yIG5vIGtleSB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgcnVuLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGg6IHBheWxvYWQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdFByZWZpeDogc2VhbGVkID8gJ2VuY3AnIDogJ2VuY3InLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVjcnlwdGVkOiBVaW50OEFycmF5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNlYWxlZCBmcmFtZXMgZ28gdGhyb3VnaCB0aGUgc2Vzc2lvbiBzbyByZXBlYXRlZCBmcmFtZXMgZnJvbSBvbmVcbiAgICAgICAgICAvLyB3cml0ZXIgcmV1c2UgYSBzaW5nbGUgZGVjYXBzdWxhdGlvbi4gRXZlcnl0aGluZyBlbHNlIGRlbGVnYXRlcyB0b1xuICAgICAgICAgIC8vIHRoZSBzaGFyZWQgZW52ZWxvcGUgbGF5ZXIsIGtlZXBpbmcgdGhlIHR3byBzY2hlbWVzIGluIGxvY2tzdGVwXG4gICAgICAgICAgLy8gd2l0aCB0aGUgb25lLXNob3QgcGF0aC5cbiAgICAgICAgICBkZWNyeXB0ZWQgPSBzZWFsZWRcbiAgICAgICAgICAgID8gYXdhaXQgb3BlblNlc3Npb24hLm9wZW4oZGVjb2RlRm9ybWF0UHJlZml4KGZyYW1lRGF0YSkucGF5bG9hZClcbiAgICAgICAgICAgIDogKChhd2FpdCBkZWNyeXB0KGZyYW1lRGF0YSwga2V5U3RhdGUua2V5KSkgYXMgVWludDhBcnJheSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGxvdy1sZXZlbCBjcnlwdG8gbGF5ZXIgb25seSBzZWVzIHRoZSBzdHJpcHBlZCBwYXlsb2FkLCBzbyBpdFxuICAgICAgICAgIC8vIGNhbm5vdCByZWNvcmQgdGhlIG91dGVyIGVudmVsb3BlIHByZWZpeC4gV2UgcGVla2VkIGl0IGhlcmUsIHNvXG4gICAgICAgICAgLy8gZW5yaWNoIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgd2l0aCB0aGUgcmVhbCBmb3JtYXQgcHJlZml4IGJlZm9yZVxuICAgICAgICAgIC8vIHByb3BhZ2F0aW5nLCBtaXJyb3Jpbmcgc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLnRzLlxuICAgICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSAmJiBlcnJvci5jb250ZXh0KSB7XG4gICAgICAgICAgICBlcnJvci5jb250ZXh0LmZvcm1hdFByZWZpeCA9IGZvcm1hdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgKHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUocGF5bG9hZCk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZSh0ZXh0LCByZXZpdmVycykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55Pih7XG4gICAgYXN5bmMgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAvLyBGaXJzdCwgdHJ5IHRvIGRldGVjdCBpZiB0aGlzIGlzIGxlbmd0aC1wcmVmaXhlZCBmcmFtZWQgZGF0YVxuICAgICAgLy8gYnkgY2hlY2tpbmcgaWYgdGhlIGZpcnN0IDQgYnl0ZXMgZm9ybSBhIHBsYXVzaWJsZSBsZW5ndGguXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiBjaHVuay5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgY2h1bmsuYnVmZmVyLFxuICAgICAgICAgIGNodW5rLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBwb3NzaWJsZUxlbmd0aCA8IDEwMF8wMDBfMDAwIC8vIHNhbml0eSBjaGVjazogPCAxMDBNQlxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBMb29rcyBsaWtlIGZyYW1lZCBkYXRhXG4gICAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEFscmVhZHkgaW4gZnJhbWVkIG1vZGUgKGhhdmUgYnVmZmVyZWQgZGF0YSlcbiAgICAgICAgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBmb3JtYXQ6IG5ld2xpbmUtZGVsaW1pdGVkIGRldmFsdWUgdGV4dCAobm8gZnJhbWluZylcbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShjaHVuayk7XG4gICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UobGluZSwgcmV2aXZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgLy8gUHJvY2VzcyBhbnkgcmVtYWluaW5nIGZyYW1lZCBkYXRhXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vL1xuLy8gQnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2AgUmVhZGFibGVTdHJlYW1zIHBhc3NlZCBhY3Jvc3MgYm91bmRhcmllcylcbi8vIGFyZSB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHdvcmxkJ3Mgc3RyZWFtIHRyYW5zcG9ydCBvbmUgdXNlciBjaHVuayBhdFxuLy8gYSB0aW1lLiBXaXRob3V0IGFuIGluLWJhbmQgZW52ZWxvcGUsIHRoZSByZWFkZXIgc2VlcyBhIGZsYXQgc3RyZWFtIG9mXG4vLyBieXRlczogdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgd2hlcmUgb25lIHVzZXIgY2h1bmsgZW5kcyBhbmQgdGhlIG5leHRcbi8vIGJlZ2lucywgd2hpY2ggbWFrZXMgbWlkLXN0cmVhbSByZWNvbm5lY3QgaW1wb3NzaWJsZSAod2UgZG9uJ3Qga25vdyBob3dcbi8vIG1hbnkgc2VydmVyLXNpZGUgY2h1bmtzIGhhdmUgYmVlbiBjb25zdW1lZCkuXG4vL1xuLy8gVG8gZW5hYmxlIHRyYW5zcGFyZW50IHJlY29ubmVjdCwgdGhpcyBQUiBpbnRyb2R1Y2VzIGFuIG9wdC1pbiB3aXJlXG4vLyBlbnZlbG9wZSB0aGF0IHdyYXBzIGVhY2ggdXNlciBjaHVuayBpbiBhIGxlbmd0aC1wcmVmaXg6XG4vL1xuLy8gICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVt1c2VyIHBheWxvYWQgYnl0ZXNdXG4vL1xuLy8gVGhlIGVudmVsb3BlIGlzIGlkZW50aWNhbCBpbiBzaGFwZSB0byBgZ2V0U2VyaWFsaXplU3RyZWFtYCdzIGZyYW1pbmcsXG4vLyBidXQgdGhlIHBheWxvYWQgaGVyZSBpcyAqcmF3IHVzZXIgYnl0ZXMqOiB0aGVyZSBpcyBubyBpbm5lclxuLy8gZm9ybWF0LXByZWZpeCwgbm8gZGV2YWx1ZSwgbm8gZW5jcnlwdGlvbi4gQSBmcmFtZWQgYnl0ZSBzdHJlYW0gc3RheXNcbi8vIHNlbWFudGljYWxseSBhIGJ5dGUgc3RyZWFtIGVuZC10by1lbmQ7IHRoZSBmcmFtaW5nIGlzIHB1cmVseSB0cmFuc3BvcnQuXG4vL1xuLy8gVGhlIGRlY2lzaW9uIHRvIHVzZSBmcmFtaW5nIGZvciBhIGdpdmVuIHN0cmVhbSBpcyByZWNvcmRlZCBpbiB0aGVcbi8vIHNlcmlhbGl6ZWQgc3RyZWFtIHJlZiAoYGZyYW1pbmc6ICdmcmFtZWQtdjEnYCksIHNvIGJvdGggc2lkZXMgYWdyZWUgb25cbi8vIHRoZSB3aXJlIGZvcm1hdCB3aXRob3V0IHJ1bnRpbWUgbmVnb3RpYXRpb24uIFByb2R1Y2VycyB0aGF0IHRhcmdldCBhXG4vLyBydW4gd2hvc2UgZGVwbG95bWVudCBkb2Vzbid0IHN1cHBvcnQgZnJhbWluZyAoc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgXG4vLyBpbiBjYXBhYmlsaXRpZXMudHMpIGVtaXQgcmF3IGJ5dGVzIGFuZCBhIHJlZiB3aXRob3V0IHRoZSBmaWVsZCwgd2hpY2hcbi8vIHRoZSByZWFkZXIgdHJlYXRzIGFzIGxlZ2FjeSByYXcgYnl0ZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXG4vKipcbiAqIE1heGltdW0gYWxsb3dlZCBieXRlLXN0cmVhbSBmcmFtZSBwYXlsb2FkIHNpemUgKDEwME1CKS4gU2hhcmVkIGJ5IHRoZVxuICogZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCB1c2VyIGNodW5rcyBhdCB3cml0ZSB0aW1lLCB3aGVyZSB0aGUgZXJyb3IgaXNcbiAqIGFjdGlvbmFibGUpIGFuZCB0aGUgdW5mcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIGxlbmd0aCBoZWFkZXJzIGF0IHJlYWRcbiAqIHRpbWUsIHdoaWNoIHVzdWFsbHkgaW5kaWNhdGUgYSBub24tZnJhbWVkIHdpcmUgYmVpbmcgcmVhZCBhcyBmcmFtZWQpLlxuICogS2VlcGluZyBib3RoIHNpZGVzIG9uIG9uZSBjb25zdGFudCBndWFyYW50ZWVzIGFueSBjaHVuayB0aGUgZnJhbWVyXG4gKiBhY2NlcHRzIGNhbiBhbHdheXMgYmUgZGVjb2RlZCBieSB0aGUgdW5mcmFtZXIuXG4gKi9cbmNvbnN0IE1BWF9GUkFNRV9TSVpFID0gMTAwXzAwMF8wMDA7XG5cbi8qKlxuICogV3JhcHMgZWFjaCBjaHVuayBvZiBhIGJ5dGUgc3RyZWFtIGluIGEgNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXG4gKiBwcmVmaXguIFVzZWQgYnkgdGhlIHByb2R1Y2VyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBFbXB0eSBjaHVua3MgKGxlbmd0aCAwKSBhcmUgZHJvcHBlZDogdGhlIHJlc3VsdGluZyBgWzB4MDAgMHgwMCAweDAwIDB4MDBdYFxuICogZnJhbWUgd291bGQgYmUgYW1iaWd1b3VzIHdpdGggdGhlIGxlZ2FjeSBcImxvb2tzIGZyYW1lZFwiIGRldGVjdGlvbiBpblxuICogYGdldERlc2VyaWFsaXplU3RyZWFtYCwgYW5kIGl0IGNhcnJpZXMgbm8gaW5mb3JtYXRpb24uXG4gKlxuICogTG9hZC1iZWFyaW5nIGludmFyaWFudDogZWFjaCB1c2VyIGNodW5rIGJlY29tZXMgZXhhY3RseSBvbmUgZnJhbWUsIGFuZFxuICogZWFjaCBmcmFtZSBpcyBlbnF1ZXVlZCBhcyBleGFjdGx5IG9uZSB0cmFuc3BvcnQgY2h1bmsgKHRoZSBkb3duc3RyZWFtXG4gKiB3cml0YWJsZSBwZXJmb3JtcyBvbmUgd2lyZSB3cml0ZSBwZXIgY2h1bmssIHByZXNlcnZpbmcgYm91bmRhcmllcykuIFRoZVxuICogc2VydmVyIHRoZXJlZm9yZSBzdG9yZXMgb25lIGZyYW1lIHBlciBjaHVuayBpbmRleCwgd2hpY2ggaXMgd2hhdCBhbGxvd3NcbiAqIGEgZnV0dXJlIHJlY29ubmVjdGluZyByZWFkZXIgdG8gcmVzdW1lIGEgZnJhbWVkIGJ5dGUgc3RyZWFtIGF0XG4gKiBgc3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzYCwgdGhlIHNhbWUgYXJpdGhtZXRpY1xuICogYGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbWAgcmVsaWVzIG9uIGZvciBvYmplY3Qgc3RyZWFtcy4gRG8gbm90XG4gKiBjb2FsZXNjZSBvciBzcGxpdCBmcmFtZXMgaGVyZSB3aXRob3V0IHJldmlzaXRpbmcgdGhhdCByZXN1bWUgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlRnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gY2h1bmsgb2YgJHtjaHVuay5sZW5ndGh9IGJ5dGVzIGV4Y2VlZHMgdGhlIG1heGltdW0gYCArXG4gICAgICAgICAgICAgIGBmcmFtZWQgY2h1bmsgc2l6ZSAoJHtNQVhfRlJBTUVfU0laRX0pLiBTcGxpdCB0aGUgZGF0YSBpbnRvIGAgK1xuICAgICAgICAgICAgICBgc21hbGxlciBjaHVua3MgYmVmb3JlIHdyaXRpbmcuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBVaW50OEFycmF5KEZSQU1FX0hFQURFUl9TSVpFICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBjaHVuay5sZW5ndGgsIGZhbHNlKTtcbiAgICAgIGZyYW1lLnNldChjaHVuaywgRlJBTUVfSEVBREVSX1NJWkUpO1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGZyYW1lKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBVbndyYXBzIGxlbmd0aC1wcmVmaXhlZCBieXRlLXN0cmVhbSBmcmFtZXMgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCB1c2VyXG4gKiBjaHVua3MuIFVzZWQgYnkgdGhlIGNvbnN1bWVyIHNpZGUgb2YgYSBmcmFtZWQgYnl0ZS1zdHJlYW0gcGlwZS5cbiAqXG4gKiBCdWZmZXJzIGFjcm9zcyByZWFkIGJvdW5kYXJpZXMsIHNpbmNlIHRoZSB0cmFuc3BvcnQgbWF5IHNwbGl0IGEgc2luZ2xlXG4gKiBmcmFtZSBhY3Jvc3MgbXVsdGlwbGUgcmVhZHMgKGhlYWRlciBpbiBvbmUgY2h1bmssIHBheWxvYWQgaW4gYW5vdGhlcilcbiAqIG9yIGNvYWxlc2NlIG11bHRpcGxlIGZyYW1lcyBpbnRvIGEgc2luZ2xlIHJlYWQuIFRoZSB0cmFuc2Zvcm0gZW1pdHNcbiAqIHdob2xlIHVzZXIgY2h1bmtzIHJlZ2FyZGxlc3Mgb2YgdHJhbnNwb3J0IGNodW5raW5nLlxuICpcbiAqIEVycm9ycyB0aGUgc3RyZWFtIGlmIHRoZSBsZW5ndGggaGVhZGVyIGFkdmVydGlzZXMgYSBmcmFtZSBsYXJnZXIgdGhhblxuICogYE1BWF9GUkFNRV9TSVpFYCBieXRlcywgc2luY2UgdGhhdCBhbG1vc3QgY2VydGFpbmx5IGluZGljYXRlcyBhXG4gKiBtaXNmcmFtZWQgd2lyZSAoZS5nLiBhIHJhdyBieXRlIHN0cmVhbSBiZWluZyBmZWQgdGhyb3VnaCB0aGlzIHRyYW5zZm9ybVxuICogYnkgbWlzdGFrZSkgYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW4gZW5vcm1vdXMgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpOiBUcmFuc2Zvcm1TdHJlYW08XG4gIFVpbnQ4QXJyYXksXG4gIFVpbnQ4QXJyYXlcbj4ge1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgZnVuY3Rpb24gYXBwZW5kVG9CdWZmZXIoZGF0YTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5leHQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgbmV4dC5zZXQoZGF0YSwgYnVmZmVyLmxlbmd0aCk7XG4gICAgYnVmZmVyID0gbmV4dDtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiAwKSBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG5cbiAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChmcmFtZUxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGZyYW1lIGxlbmd0aCAke2ZyYW1lTGVuZ3RofSBleGNlZWRzIG1heGltdW0gKCR7TUFYX0ZSQU1FX1NJWkV9KS4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgdXN1YWxseSBtZWFucyBhIG5vbi1mcmFtZWQgYnl0ZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCBhcyBmcmFtZWQuYCxcbiAgICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aDtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG5cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSwgdG90YWwpKTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBlbmRlZCB3aXRoICR7YnVmZmVyLmxlbmd0aH0gYnl0ZXMgb2YgaW5jb21wbGV0ZSBmcmFtZSBkYXRhLiBgICtcbiAgICAgICAgICAgICAgYFRoZSBzdHJlYW0gd2FzIHRydW5jYXRlZCBtaWQtZnJhbWUuYCxcbiAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBlbmQtdG8tZW5kIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3BhbiBmb3IgYSBsaXZlIHJlYWQ6XG4gKiByZWFkIGRpc3BhdGNoIChgc3RhcnRFcG9jaE1zYCkg4oaSIHRoZSBmaXJzdCBub24tZW1wdHkgY2h1bmsgcmVhY2hpbmcgdGhlXG4gKiByZWFkZXIsIGluY2x1ZGluZyB0aGUgbmV0d29yayBob3AuIEZpcmUtYW5kLWZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleD86IG51bWJlcixcbiAgY29ubmVjdE1zPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWQnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudHRmY19tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgIC4uLih0eXBlb2YgY29ubmVjdE1zID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY29ubmVjdF9tcyc6IGNvbm5lY3RNcyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5zdGFydF9pbmRleCc6IHN0YXJ0SW5kZXggfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgc3BlY3VsYXRpdmUgcnVuLWtleSByZXNvbHV0aW9uIGluZGVwZW5kZW50bHkgZnJvbSByYXcgc3RyZWFtIFRURkMuXG4gKiBUaGlzIHBoYXNlIG5ldmVyIGNhcnJpZXMga2V5IG1hdGVyaWFsIGFuZCBpcyBpbnRlbnRpb25hbGx5IHNlcGFyYXRlIGZyb21cbiAqIGB3b3JrZmxvdy5zdHJlYW0ucmVhZGAsIHdob3NlIGVuZHBvaW50IHJlbWFpbnMgdGhlIGZpcnN0IHJhdyBmcmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtUmVhZEtleVJlc29sdXRpb24oXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN1Y2NlZWRlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZWNvcmRFbGFwc2VkU3Bhbignd29ya2Zsb3cuc3RyZWFtLnJlYWQucmVzb2x2ZV9rZXknLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQua2V5X3N1Y2NlZWRlZCc6IHN1Y2NlZWRlZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIHJlYWQtY29tcGxldGlvbiBzcGFuIHdoZW4gYSBzdHJlYW0gcmVhZCBkcmFpbnM6XG4gKiBiYWNrLWRhdGVkIHRvIHRoZSByZWFkIGRpc3BhdGNoLCBzbyBpdHMgZHVyYXRpb24gaXMgdGhlIHRvdGFsIHJlYWQsIHdpdGhcbiAqIGNodW5rL2J5dGUgY291bnRzIGZvciB0aHJvdWdocHV0LiBDYW5jZWxsZWQgcmVhZHMgZW1pdCBub3RoaW5nLiBGaXJlLWFuZC1cbiAqIGZvcmdldDsgbm8tb3Agd2l0aG91dCBPVEVMLlxuICovXG5mdW5jdGlvbiByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJlY29ubmVjdHM/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmNvbXBsZXRlJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZF9jb21wbGV0ZScsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50b3RhbF9tcyc6IERhdGUubm93KCkgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jaHVua3MnOiBjaHVua0NvdW50LFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuYnl0ZXMnOiBieXRlQ291bnQsXG4gICAgICAgIC4uLih0eXBlb2YgcmVjb25uZWN0cyA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IHsgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLnJlY29ubmVjdHMnOiByZWNvbm5lY3RzIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtIGV4dGVuZHMgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICAjcmVhZGVyPzogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+O1xuXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3RhcnRJbmRleD86IG51bWJlcikge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihgXCJuYW1lXCIgaXMgcmVxdWlyZWQsIGdvdCBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICAvLyBDbGllbnQtb2JzZXJ2ZWQgdGltZS10by1maXJzdC1jaHVuayBzdGF0ZS4gYHJlYWRTdGFydGAgaXMgc3RhbXBlZCB3aGVuIHRoZVxuICAgIC8vIHJlYWRlciBzdGFydHMgY29uc3VtaW5nIChmaXJzdCBwdWxsIOKGkiB0aGUgcmVhZCBkaXNwYXRjaCk7IHRoZSBzcGFuIGlzXG4gICAgLy8gZW1pdHRlZCBvbmNlLCB3aGVuIHRoZSBmaXJzdCBub24tZW1wdHkgY2h1bmsgcmVhY2hlcyB0aGUgcmVhZGVyLiBTbyBpdHNcbiAgICAvLyBkdXJhdGlvbiBpcyB0aGUgZW5kLXRvLWVuZCBUVEZDIGluY2x1ZGluZyB0aGUgbmV0d29yayBob3AuIE5vLW9wIHdpdGhvdXRcbiAgICAvLyBhbiBPcGVuVGVsZW1ldHJ5IFNESyByZWdpc3RlcmVkLlxuICAgIGxldCByZWFkU3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmlyc3RDaHVua1JlcG9ydGVkID0gZmFsc2U7XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIGNvbm5lY3QgZHVyYXRpb246IHRoZSB3b3JsZC5zdHJlYW1zLmdldCBhd2FpdCAocmVhZFxuICAgIC8vIGRpc3BhdGNoIC0+IHN0cmVhbSBoYW5kbGUgLyByZXNwb25zZSBoZWFkZXJzKS4gU3RhbXBlZCBvbiB0aGVcbiAgICAvLyB3b3JrZmxvdy5zdHJlYW0ucmVhZCBzcGFuIG9uY2UgdGhlIGZpcnN0IGNodW5rIGFycml2ZXMuXG4gICAgbGV0IGNvbm5lY3RNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFJlYWQtY29tcGxldGlvbiBjb3VudGVycyBmb3IgdGhlIHdvcmtmbG93LnN0cmVhbS5yZWFkLmNvbXBsZXRlIHNwYW5cbiAgICAvLyBlbWl0dGVkIHdoZW4gdGhlIHN0cmVhbSBkcmFpbnMuXG4gICAgbGV0IGNodW5rc0RlbGl2ZXJlZCA9IDA7XG4gICAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcbiAgICBzdXBlcih7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5vdCBzdXJlIHdoeSBUeXBlU2NyaXB0IGlzIGNvbXBsYWluaW5nIGFib3V0IHRoaXNcbiAgICAgIHR5cGU6ICdieXRlcycsXG5cbiAgICAgIHB1bGw6IGFzeW5jIChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIGxldCByZWFkZXIgPSB0aGlzLiNyZWFkZXI7XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgaWYgKHJlYWRTdGFydCA9PT0gdW5kZWZpbmVkKSByZWFkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgICAgICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgY29ubmVjdE1zID0gRGF0ZS5ub3coKSAtIGNvbm5lY3RTdGFydDtcbiAgICAgICAgICByZWFkZXIgPSB0aGlzLiNyZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCByZWFkZXInKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgdGhpcy4jcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjaHVua3NEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHNlcnZlciBmbHVzaGVzIGEgbGVhZGluZyB6ZXJvLWxlbmd0aCBjaHVuayAodjMrKSB0byBjb21taXRcbiAgICAgICAgICAvLyByZXNwb25zZSBoZWFkZXJzIGJlZm9yZSBhbnkgZGF0YTsgc2tpcCBlbXB0aWVzIHNvIFRURkMgbWVhc3VyZXMgdG9cbiAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVhbCBjaHVuay5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhZmlyc3RDaHVua1JlcG9ydGVkICYmXG4gICAgICAgICAgICByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGNvbm5lY3RNc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2h1bmtzRGVsaXZlcmVkICs9IDE7XG4gICAgICAgICAgYnl0ZXNEZWxpdmVyZWQgKz0gcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgLy8gRm9yd2FyZCByYXcgYnl0ZXM7IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBpcyBoYW5kbGVkIGF0IHRoZVxuICAgICAgICAgIC8vIGZyYW1pbmcgbGV2ZWwgYnkgZ2V0U2VyaWFsaXplU3RyZWFtL2dldERlc2VyaWFsaXplU3RyZWFtLlxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FuY2VsOiBhc3luYyAocmVhc29uKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZWFkZXIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLiNyZWFkZXIuY2FuY2VsKHJlYXNvbikuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE1heGltdW0gY29uc2VjdXRpdmUgcmVjb25uZWN0IGF0dGVtcHRzIGZvciBhIHNpbmdsZSBmcmFtZWQgc3RyZWFtIHNlc3Npb24uXG4gKiBUaGUgY291bnRlciByZXNldHMgdG8gemVybyB3aGVuZXZlciBhIHJlY29ubmVjdCBtYWtlcyBmb3J3YXJkIHByb2dyZXNzIChhXG4gKiBmcmFtZSBpcyBkZWxpdmVyZWQpLCBzbyB0aGlzIGJvdW5kcyAqY29uc2VjdXRpdmUqIGZhaWx1cmVzLCBub3QgdGhlIGxpZmV0aW1lXG4gKiB0b3RhbDogYSBsb25nLWxpdmVkIHNlcnZlcmxlc3Mgc3RyZWFtIG1heSBsZWdpdGltYXRlbHkgcmVjb25uZWN0IGZhciBtb3JlXG4gKiB0aGFuIHRoaXMgbWFueSB0aW1lcyBhcyBsb25nIGFzIGVhY2ggcmVjb25uZWN0IGtlZXBzIGRlbGl2ZXJpbmcgZGF0YS4gV2Ugb25seVxuICogZ2l2ZSB1cCBhZnRlciB0aGlzIG1hbnkgcmVjb25uZWN0cyBpbiBhIHJvdyBwcm9kdWNlIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTID0gNTA7XG5cbi8qKiBFZmZlY3RpdmUgY29uc2VjdXRpdmUtcmVjb25uZWN0IGNhcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFJlY29ubmVjdHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUycsXG4gICAgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyxcbiAgICB7XG4gICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgbWluOiAxLFxuICAgIH1cbiAgKTtcblxuLyoqXG4gKiBBYnNvbHV0ZSBiYWNrc3RvcCBvbiB0b3RhbCByZWNvbm5lY3RzIGZvciBhIHNpbmdsZSBzZXNzaW9uLCBpbmRlcGVuZGVudCBvZlxuICogcHJvZ3Jlc3MuIFRoZSBjb25zZWN1dGl2ZSBjYXAgYWJvdmUgcmVzZXRzIG9uIGZvcndhcmQgcHJvZ3Jlc3MsIHdoaWNoIGlzXG4gKiBjb3JyZWN0IGZvciBhIHdlbGwtYmVoYXZlZCBiYWNrZW5kIHRoYXQgaG9ub3JzIGBzdGFydEluZGV4YC4gQnV0IGlmIGEgV29ybGQnc1xuICogYHN0cmVhbXMuZ2V0YCBldmVyIGlnbm9yZWQgYHN0YXJ0SW5kZXhgIGFuZCByZS1kZWxpdmVyZWQgZWFybGllciBjaHVua3MsXG4gKiBcInByb2dyZXNzXCIgd291bGQgYmUgcmVwb3J0ZWQgZXZlcnkgcmVjb25uZWN0IGFuZCB0aGUgY29uc2VjdXRpdmUgY2FwIHdvdWxkXG4gKiBuZXZlciB0cmlwLCB0dXJuaW5nIGEgYm91bmRlZCBmYWlsdXJlIGludG8gYW4gdW5ib3VuZGVkIHJlY29ubmVjdCBsb29wLiBUaGlzXG4gKiBoYXJkIGNlaWxpbmcgZ3VhcmFudGVlcyB0aGUgbG9vcCBhbHdheXMgdGVybWluYXRlcy4gSXQgaXMgc2V0IGhpZ2ggZW5vdWdoXG4gKiAoaG91cnMgb2Ygc3RyZWFtaW5nIGF0IHJlYWxpc3RpYyBwZXItc2Vzc2lvbiB0aW1lb3V0cykgdG8gbmV2ZXIgaW50ZXJmZXJlXG4gKiB3aXRoIGxlZ2l0aW1hdGUgbG9uZy1saXZlZCBzdHJlYW1zLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUyA9IDEwMDA7XG5cbi8qKiBFZmZlY3RpdmUgdG90YWwtcmVjb25uZWN0IGJhY2tzdG9wLiBPdmVycmlkZTogYFdPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFNgLiAqL1xuY29uc3QgZ2V0RnJhbWVkU3RyZWFtTWF4VG90YWxSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xuXG4vKipcbiAqIFdyYXBzIHRoZSBsZW5ndGgtcHJlZml4LWZyYW1lZCBieXRlIHN0cmVhbSBmcm9tIGB3b3JsZC5zdHJlYW1zLmdldGAgd2l0aFxuICogdHJhbnNwYXJlbnQgYXV0by1yZWNvbm5lY3QuXG4gKlxuICogRXZlcnkgZnVsbHktZGVjb2RlZCBvdXRlciBmcmFtZSBjb3JyZXNwb25kcyB0byBleGFjdGx5IG9uZSBzZXJ2ZXItc2lkZVxuICogY2h1bmsgKHRoZSBzZXJpYWxpemUgdHJhbnNmb3JtIGVucXVldWVzIG9uZSBmcmFtZSBwZXIgd29ya2Zsb3cgd3JpdGUsIGFuZFxuICogdGhlIHdyaXRhYmxlIGJ1ZmZlcnMgb25lIGZyYW1lIHBlciBjaHVuayB3aGVuIG11bHRpLXdyaXRpbmcpLiBUaGUgd3JhcHBlclxuICogY291bnRzIGNvbXBsZXRlZCBmcmFtZXMgYW5kLCBvbiB1cHN0cmVhbSBlcnJvciwgcmVvcGVucyB0aGUgY29ubmVjdGlvblxuICogd2l0aCBgc3RhcnRJbmRleCA9IHJlc29sdmVkU3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzYC4gUGFydGlhbC1mcmFtZVxuICogYnl0ZXMgYnVmZmVyZWQgYmVmb3JlIHRoZSBjdXQgYXJlIGRpc2NhcmRlZDsgdGhlIHNlcnZlciB3aWxsIHJlc2VuZCB0aGVcbiAqIGluLWZsaWdodCBjaHVuayBpbiBmdWxsIGZyb20gdGhlIG5ldyBzdGFydEluZGV4LlxuICpcbiAqIEEgY2xlYW4gdXBzdHJlYW0gY2xvc2UgKEVPRiB3aXRoIG5vIGVycm9yKSBpcyBOT1QgdHJ1c3RlZCBhcyBjb21wbGV0aW9uXG4gKiBvbiBpdHMgb3duOiBzb21lIHRyYW5zcG9ydCBwYXRocyBub3JtYWxpemUgYSBtaWQtc3RyZWFtIGFib3J0IGludG8gYVxuICogZ3JhY2VmdWwgZW5kIChvYnNlcnZlZCBpbiBwcm9kdWN0aW9uIG9uIFZlcmNlbCByZXNwb25zZSBzdHJlYW1pbmcsIHdoZXJlXG4gKiB0aGUgc2VydmVyJ3MgbWF4LWR1cmF0aW9uIGFib3J0IGFycml2ZXMgYXQgdGhlIGNsaWVudCBhcyBhIGNsZWFuIEVPRikuXG4gKiBPbiBFT0YgdGhlIHdyYXBwZXIgdmVyaWZpZXMgYWdhaW5zdCB0aGUgc3RyZWFtJ3MgYXV0aG9yaXRhdGl2ZSBtZXRhZGF0YVxuICogKGBzdHJlYW1zLmdldEluZm9gKSB0aGF0IHRoZSBzdHJlYW0gaXMgY29tcGxldGUgQU5EIHRoYXQgZXZlcnkgY2h1bmsgdXAgdG9cbiAqIGBkb25lYCB3YXMgZGVsaXZlcmVkOyBvdGhlcndpc2UgaXQgcmVjb25uZWN0cyBmcm9tIHRoZSBuZXh0IGNodW5rIGV4YWN0bHlcbiAqIGxpa2UgYW4gZXJyb3JlZCBjb25uZWN0aW9uLiBJZiB0aGUgbWV0YWRhdGEgcmVhZCBpdHNlbGYgZmFpbHMsIHRoZSBFT0YgaXNcbiAqIHRydXN0ZWQgKGxlZ2FjeSBiZWhhdmlvcikgcmF0aGVyIHRoYW4gZmFpbGluZyBhIHJlYWQgdGhhdCBtYXkgd2VsbCBiZVxuICogY29tcGxldGUuXG4gKlxuICogTmVnYXRpdmUgYHN0YXJ0SW5kZXhgIHZhbHVlcyAobGFzdC1OIHNlbWFudGljcykgc2tpcCB0aGUgcmVjb25uZWN0XG4gKiBtYWNoaW5lcnkgYmVjYXVzZSB3ZSBjYW5ub3QgY29tcHV0ZSBhbiBhYnNvbHV0ZSByZXN1bWUgcG9zaXRpb24gd2l0aG91dFxuICogYSB0YWlsLWluZGV4IGxvb2t1cDsgdGhlIHJldHVybmVkIHN0cmVhbSBiZWhhdmVzIGFzIGEgc2luZ2xlLXNob3QgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyLFxuICBwcmVmZXRjaEVuY3J5cHRpb25LZXk6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gPSBhc3luYyAoKSA9PlxuICAgIHVuZGVmaW5lZFxuKTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICBjb25zdCByZWNvbm5lY3RTdXBwb3J0ZWQgPSBzdGFydEluZGV4ID09PSB1bmRlZmluZWQgfHwgc3RhcnRJbmRleCA+PSAwO1xuICBsZXQgY3VycmVudFN0YXJ0SW5kZXggPSBzdGFydEluZGV4ID8/IDA7XG4gIGxldCBjb25zdW1lZEZyYW1lcyA9IDA7XG4gIGxldCByZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCB0b3RhbFJlY29ubmVjdENvdW50ID0gMDtcbiAgbGV0IHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+IHwgdW5kZWZpbmVkO1xuICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgbGV0IGNhbmNlbFJlYXNvbjogdW5rbm93bjtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZWFkIHRlbGVtZXRyeSAoc2FtZSBzZW1hbnRpY3MgYXMgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSk6XG4gIC8vIGRpc3BhdGNoIHRpbWUsIGZpcnN0LWNvbm5lY3QgZHVyYXRpb24sIGZpcnN0LWZyYW1lIGxhdGNoLCBhbmQgdG90YWxzLlxuICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICBsZXQgY2h1bmtzRGVsaXZlcmVkID0gMDtcbiAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcbiAgbGV0IGtleVByZWZldGNoZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwcmVmZXRjaEtleSgpOiB2b2lkIHtcbiAgICBpZiAoa2V5UHJlZmV0Y2hlZCkgcmV0dXJuO1xuICAgIGtleVByZWZldGNoZWQgPSB0cnVlO1xuICAgIGNvbnN0IGtleVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAvLyBUaGUgcmF3IHN0cmVhbSBhbmQga2V5IGxvb2t1cCBkZWxpYmVyYXRlbHkgcmFjZS4gT2JzZXJ2ZSBhIHNwZWN1bGF0aXZlXG4gICAgLy8gZmFpbHVyZSBoZXJlOiBpZiB0aGUgc3RyZWFtIGlzIGNhbmNlbGxlZCBvciBmYWlscyBiZWZvcmUgYW4gZW5jcnlwdGVkXG4gICAgLy8gZnJhbWUgcmVhY2hlcyB0aGUgZGVzZXJpYWxpemUgdHJhbnNmb3JtLCB0aGlzIHByb21pc2Ugb3RoZXJ3aXNlIGhhcyBub1xuICAgIC8vIGNvbnN1bWVyIGFuZCB3b3VsZCBiZWNvbWUgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi4gVGhlIHRyYW5zZm9ybSBzdGlsbFxuICAgIC8vIGF3YWl0cyB0aGUgc2FtZSBwcm9taXNlIGFuZCBzdXJmYWNlcyB0aGUgb3JpZ2luYWwgZXJyb3Igb24gY29uc3VtcHRpb24uXG4gICAgdm9pZCBwcmVmZXRjaEVuY3J5cHRpb25LZXkoKS50aGVuKFxuICAgICAgKGtleSkgPT4ge1xuICAgICAgICAvLyBVbmVuY3J5cHRlZCBydW5zIGRvIG5vdCBuZWVkIGEga2V5LXJlc29sdXRpb24gc3Bhbi4gVGhlaXIgcmVzb2x2ZXJcbiAgICAgICAgLy8gc3RpbGwgcnVucyBzcGVjdWxhdGl2ZWx5IHNvIGFuIGVuY3J5cHRlZCBmcmFtZSBjYW4gam9pbiBpdC5cbiAgICAgICAgaWYgKGtleSkgcmVjb3JkU3RyZWFtUmVhZEtleVJlc29sdXRpb24oa2V5U3RhcnQsIHJ1bklkLCBuYW1lLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiByZWNvcmRTdHJlYW1SZWFkS2V5UmVzb2x1dGlvbihrZXlTdGFydCwgcnVuSWQsIG5hbWUsIGZhbHNlKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjb25uZWN0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgaWYgKGNhbmNlbGVkKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZWZmZWN0aXZlU3RhcnRJbmRleCA9IHJlY29ubmVjdFN1cHBvcnRlZFxuICAgICAgPyBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgZWZmZWN0aXZlU3RhcnRJbmRleCk7XG4gICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICBhd2FpdCBzdHJlYW0uY2FuY2VsKGNhbmNlbFJlYXNvbikuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29ubmVjdE1zID09PSB1bmRlZmluZWQpIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gdXBzdHJlYW0gRU9GIHJlcHJlc2VudHMgZ2VudWluZSBjb21wbGV0aW9uOiB0aGUgc3RyZWFtJ3NcbiAgICogYXV0aG9yaXRhdGl2ZSBtZXRhZGF0YSBzYXlzIGl0IGlzIGRvbmUgQU5EIHRoZSBmcmFtZXMgZGVsaXZlcmVkIHNvIGZhclxuICAgKiBjb3ZlciBldmVyeSBjaHVuayB1cCB0byB0aGUgdGFpbCAob25lIG91dGVyIGZyYW1lID09IG9uZSBzZXJ2ZXIgY2h1bmspLlxuICAgKiBBIG1ldGFkYXRhIGZhaWx1cmUgdHJ1c3RzIHRoZSBFT0YsIHNpbmNlIHR1cm5pbmcgYSBoZWFsdGh5IGNvbXBsZXRpb25cbiAgICogaW50byBhbiBlcnJvciAob3IgYSByZWNvbm5lY3QgbG9vcCkgb24gYSB0cmFuc2llbnQgbWV0YWRhdGEgYmxpcCB3b3VsZFxuICAgKiBiZSB3b3JzZSB0aGFuIHRoZSBsZWdhY3kgYmVoYXZpb3IgdGhpcyBjaGVjayBndWFyZHMgYWdhaW5zdC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGlzVmVyaWZpZWRDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldEluZm8ocnVuSWQsIG5hbWUpO1xuICAgICAgcmV0dXJuIGluZm8uZG9uZSAmJiBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzID4gaW5mby50YWlsSW5kZXg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWNvbm5lY3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGNhbmNlbGVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJlYWRlcikge1xuICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGNhbmNlbGVkKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gQWR2YW5jZSB0aGUgcmVzdW1lIHBvc2l0aW9uIHBhc3QgdGhlIGZyYW1lcyBhbHJlYWR5IGRlbGl2ZXJlZCwgdGhlblxuICAgIC8vIGRyb3AgYW55IHBhcnRpYWwtZnJhbWUgYnl0ZXM6IHRoZSByZW9wZW5lZCBjb25uZWN0aW9uIHJlLXNlbmRzIGZyb20gYVxuICAgIC8vIGZyYW1lIGJvdW5kYXJ5IGF0IHRoZSBuZXcgaW5kZXguXG4gICAgY3VycmVudFN0YXJ0SW5kZXggKz0gY29uc3VtZWRGcmFtZXM7XG4gICAgY29uc3VtZWRGcmFtZXMgPSAwO1xuICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gICAgLy8gUmV0cnkgdGhlIHJlb3BlbiBpdHNlbGYgYWdhaW5zdCB0aGUgcmVjb25uZWN0IGJ1ZGdldC4gQSB0cmFuc2llbnRcbiAgICAvLyBmYWlsdXJlIG9mIGNvbm5lY3QoKSAodGhlIHNlcnZlciBicmllZmx5IHVuYXZhaWxhYmxlIGR1cmluZyB0aGVcbiAgICAvLyByZWNvbm5lY3Qgd2luZG93KSBpcyB0aGUgZXhhY3QgYmxpcCB0aGlzIHdyYXBwZXIgZXhpc3RzIHRvIHN1cnZpdmUsIHNvXG4gICAgLy8gY291bnQgaXQgYWdhaW5zdCB0aGUgYnVkZ2V0IGFuZCB0cnkgYWdhaW4gcmF0aGVyIHRoYW4gdHJlYXRpbmcgaXQgYXNcbiAgICAvLyBmYXRhbC4gT25seSBidWRnZXQgZXhoYXVzdGlvbiAoYSBzZXJ2ZXIgdGhhdCBzdGF5cyBkb3duKSB0ZXJtaW5hdGVzIHRoZVxuICAgIC8vIHN0cmVhbS5cbiAgICBjb25zdCBtYXhSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cygpO1xuICAgIGNvbnN0IG1heFRvdGFsUmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cygpO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHJlY29ubmVjdENvdW50Kys7XG4gICAgICB0b3RhbFJlY29ubmVjdENvdW50Kys7XG4gICAgICBpZiAocmVjb25uZWN0Q291bnQgPiBtYXhSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbFJlY29ubmVjdENvdW50ID4gbWF4VG90YWxSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJlYW1FcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gdG90YWwgcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFRvdGFsUmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgY29ubmVjdCgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBSZXRlbnRpb24gZXhwaXJ5IGlzIHRlcm1pbmFsIGFuZCByZXRyeWluZyBjYW5ub3QgcmVzdG9yZSB0aGUgc3RyZWFtLlxuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgdHlwZWQgZXJyb3IgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB0dXJuaW5nIG9uZSA0MTAgaW50b1xuICAgICAgICAvLyA1MCByZWNvbm5lY3QgYXR0ZW1wdHMgYW5kIGEgZ2VuZXJpYyBidWRnZXQtZXhoYXVzdGlvbiBlcnJvci5cbiAgICAgICAgaWYgKFN0cmVhbUV4cGlyZWRFcnJvci5pcyhlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAvLyBSZW9wZW4gZmFpbGVkIHRyYW5zaWVudGx5OyBsb29wIHRvIHJldHJ5LCBjb3VudGluZyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBidWRnZXQgc28gYSBzZXJ2ZXIgdGhhdCBuZXZlciByZWNvdmVycyBzdGlsbCB0ZXJtaW5hdGVzIHRoZSBzdHJlYW0uXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgaWYgKHJlYWRTdGFydCA9PT0gdW5kZWZpbmVkKSByZWFkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgLy8gQmVnaW4gcmVzb2x2aW5nIHRoZSBrZXkgYmVmb3JlIGF3YWl0aW5nIHN0cmVhbXMuZ2V0KCkvdGhlIGZpcnN0IHJhd1xuICAgICAgLy8gZnJhbWUuIFRoaXMgaXMgaW50ZW50aW9uYWxseSBub3QgYXdhaXRlZDogYnVmZmVyZWQgcmF3IGZyYW1lcyByZW1haW5cbiAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIFdlYiBTdHJlYW1zIGJhY2twcmVzc3VyZSBjaGFpbiB3aGlsZSB0aGUgZGVzZXJpYWxpemVcbiAgICAgIC8vIHRyYW5zZm9ybSBqb2lucyB0aGlzIHByb21pc2Ugb25seSBpZiBhbiBlbmNyeXB0ZWQgZnJhbWUgbmVlZHMgaXQuXG4gICAgICBwcmVmZXRjaEtleSgpO1xuICAgICAgLy8gTG9vcCB1bnRpbCB3ZSBlbWl0IHNvbWV0aGluZywgaGl0IEVPRiwgb3IgZmF0YWxseSBlcnJvci4gUmVhZHMgdGhhdFxuICAgICAgLy8gb25seSBleHRlbmQgdGhlIGluLWZsaWdodC1mcmFtZSBidWZmZXIgZG9uJ3QgZW5xdWV1ZSBhbnl0aGluZzsgd2VcbiAgICAgIC8vIGtlZXAgcmVhZGluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgZW1wdHktaGFuZGVkLlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBjb25uZWN0KCkpKSByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0OiB7IGRvbmU6IGJvb2xlYW47IHZhbHVlPzogVWludDhBcnJheSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogY29ubmVjdCgpIGd1YXJhbnRlZXMgcmVhZGVyXG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZGVyIS5yZWFkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghcmVjb25uZWN0U3VwcG9ydGVkKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCByZWNvbm5lY3QoKSkpIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChyZWNvbm5lY3RFcnIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IocmVjb25uZWN0RXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lIHx8ICFyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgLy8gQSBjbGVhbiBFT0YgaXMgb25seSB0cnVzdHdvcnRoeSBpZiB0aGUgc3RyZWFtIGlzIGFjdHVhbGx5XG4gICAgICAgICAgLy8gY29tcGxldGUgYW5kIHRoaXMgc2Vzc2lvbiBkZWxpdmVyZWQgZXZlcnkgY2h1bmsgdXAgdG8gYGRvbmVgLlxuICAgICAgICAgIC8vIEluZnJhc3RydWN0dXJlIGNhbiBub3JtYWxpemUgYSBtaWQtc3RyZWFtIGFib3J0IGludG8gYSBncmFjZWZ1bFxuICAgICAgICAgIC8vIGVuZCAodGhlIHNlcnZlcidzIG1heC1kdXJhdGlvbiBjdXQgaXMgZGVzaWduZWQgdG8gYXJyaXZlIGFzIGFuXG4gICAgICAgICAgLy8gZXJyb3JlZCBib2R5LCBidXQgb24gc29tZSBwYXRocyBpdCByZWFjaGVzIHRoZSBjbGllbnQgYXMgYSBjbGVhblxuICAgICAgICAgIC8vIEVPRiksIGFuZCBhIGNvbXBsZXRlZCBzdHJlYW0gY2FuIHN0aWxsIGJlIGN1dCBtaWQtYm9keTsgYm90aFxuICAgICAgICAgIC8vIHdvdWxkIG90aGVyd2lzZSBiZSBzaWxlbnRseSByZWFkIGFzIGEgc2hvcnRlciwgY29tcGxldGUgc3RyZWFtLlxuICAgICAgICAgIGNvbnN0IHZlcmlmaWVkQ29tcGxldGUgPVxuICAgICAgICAgICAgIXJlY29ubmVjdFN1cHBvcnRlZCB8fCAoYXdhaXQgaXNWZXJpZmllZENvbXBsZXRlKCkpO1xuICAgICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghdmVyaWZpZWRDb21wbGV0ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgcmVjb25uZWN0KCkpKSByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChyZWNvbm5lY3RFcnIpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihyZWNvbm5lY3RFcnIpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gR2VudWluZSBlbmQtb2Ytc3RyZWFtLiBEcm9wIGFueSBwYXJ0aWFsLWZyYW1lIGJ5dGVzICh0aGVyZVxuICAgICAgICAgIC8vIHNob3VsZG4ndCBiZSBhbnk7IGEgd2VsbC1mb3JtZWQgc3RyZWFtIGVuZHMgb24gYSBmcmFtZSBib3VuZGFyeSkuXG4gICAgICAgICAgaWYgKHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWNvcmRTdHJlYW1SZWFkQ29tcGxldGUoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgYnl0ZXNEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIHRvdGFsUmVjb25uZWN0Q291bnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgdG8gYnVmZmVyIGFuZCBlbWl0IGFsbCBjb21wbGV0ZSBmcmFtZXMuXG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAoaW5jb21pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGluY29taW5nLmxlbmd0aCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGluY29taW5nLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICBidWZmZXIgPSBjb21iaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG4gICAgICAgICAgLy8gRm9yd2FyZCB0aGUgZW50aXJlIGZyYW1lZCBjaHVuayAoaGVhZGVyICsgcGF5bG9hZCkgdG8gdGhlXG4gICAgICAgICAgLy8gZG93bnN0cmVhbSBkZXNlcmlhbGl6ZXIsIHdoaWNoIGFscmVhZHkgZXhwZWN0cyB0aGlzIGxheW91dC5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKDAsIHRvdGFsKSk7XG4gICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgICAgICBjb25zdW1lZEZyYW1lcysrO1xuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCsrO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHRvdGFsO1xuICAgICAgICAgIGlmICghZmlyc3RDaHVua1JlcG9ydGVkICYmIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gICAgICAgICAgICAgIHJlYWRTdGFydCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgIGNvbm5lY3RNc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdHRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1pdHRlZCkge1xuICAgICAgICAgIC8vIEZvcndhcmQgcHJvZ3Jlc3Mgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbjogY2xlYXIgdGhlXG4gICAgICAgICAgLy8gY29uc2VjdXRpdmUtZmFpbHVyZSBidWRnZXQgc28gYSBsb25nIHN0cmVhbSB0aGF0IHJlY29ubmVjdHNcbiAgICAgICAgICAvLyBtYW55IHRpbWVzIChidXQga2VlcHMgZGVsaXZlcmluZykgaXMgbmV2ZXIgZmFsc2VseSBjYXBwZWQuXG4gICAgICAgICAgcmVjb25uZWN0Q291bnQgPSAwO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IHBhcnRpYWwgYnl0ZXM6IHJlYWQgbW9yZS5cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgY2FuY2VsUmVhc29uID0gcmVhc29uO1xuICAgICAgY29uc3QgY3VycmVudFJlYWRlciA9IHJlYWRlcjtcbiAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjdXJyZW50UmVhZGVyKSB7XG4gICAgICAgIGF3YWl0IGN1cnJlbnRSZWFkZXIuY2FuY2VsKHJlYXNvbikuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgY2xvc2luZyBSZWFkYWJsZVN0cmVhbSByZWFkZXI6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBncm91cC1jb21taXQgd2luZG93IGZvciB0aGUgTEVBRElORyBjaHVuayBvZiBhbiBpZGxlIHN0cmVhbS5cbiAqXG4gKiAwID0gZGlzcGF0Y2ggdGhlIGZpcnN0IGNodW5rIGltbWVkaWF0ZWx5LiBNZWFzdXJlZCBwcm9kdWN0aW9uIHByb2R1Y2VyXG4gKiByYXRlcyAobW9zdCBhZ2VudHM6IH4xLjIgY2h1bmtzIHBlciBmbHVzaCwgPjcwJSBvZiBjaHVua3MgYXJyaXZpbmcgbW9yZVxuICogdGhhbiAxMG1zIGFmdGVyIHRoZSBwcmV2aW91cyByZXF1ZXN0IGFscmVhZHkgZmluaXNoZWQpIHNob3cgYSBmaXhlZFxuICogbGVhZGluZy1lZGdlIHdpbmRvdyB0YXhlcyBpc29sYXRlZC1jaHVuayBkZWxpdmVyeSAofisyMCUgb24gYSB+NTBtcyBSVFQpXG4gKiB3aGlsZSBiYXRjaGluZyBhbG1vc3Qgbm90aGluZyBmb3Igc2xvdyBwcm9kdWNlcnM7IGZhc3QgcHJvZHVjZXJzIGdldFxuICogdGhlaXIgYmF0Y2hpbmcgZnJvbSBpbi1mbGlnaHQgYWNjdW11bGF0aW9uIHJlZ2FyZGxlc3MuIFNldHRpbmcgYSBwb3NpdGl2ZVxuICogaW50ZXJ2YWwgKGVudiBvciBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYCkgb3B0cyBhIGRlcGxveW1lbnQgaW50b1xuICogd2luZG93ZWQgbGVhZGluZy1lZGdlIGJhdGNoaW5nLCB0cmFkaW5nIGZpcnN0LWNodW5rIGxhdGVuY3kgZm9yIGxhcmdlclxuICogZ3JvdXBzLlxuICovXG5jb25zdCBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMgPSAwO1xuXG4vKipcbiAqIGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLCB3aGVuIHNldCwgb3ZlcnJpZGVzXG4gKiBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYDsgd2hlbiB1bnNldCB0aGUgV29ybGQgb3B0aW9uIChvciB0aGVcbiAqIGRlZmF1bHQpIGdvdmVybnMuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIHVuc2V0L2ludmFsaWQgdmFsdWVzIHNvIHRoZVxuICogY2FsbGVyIGNhbiBmYWxsIHRocm91Z2ggdG8gdGhlIFdvcmxkIG9wdGlvbi5cbiAqL1xuY29uc3QgZ2V0RW52U3RyZWFtRmx1c2hJbnRlcnZhbE1zID0gKCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMnLCBOdW1iZXIuTmFOLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG59O1xuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBzcGFuIGZvciBvbmUgZmx1c2hlZCBiYXRjaCBvZiBzdHJlYW0gd3JpdGVzOiBmaXJzdFxuICogYHdyaXRlKClgIG9mIHRoZSBiYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgc2VydmVyIHdyaXRlIHNldHRsaW5nLiBUaGVcbiAqIHNwYW4ncyBkdXJhdGlvbiBpcyB0aGVyZWZvcmUgdGhlIGFwcC1wZXJjZWl2ZWQgbGF0ZW5jeSBvZiB0aGUgYmF0Y2hcbiAqIChidWZmZXIgZHdlbGwgKyBiYWNrcHJlc3N1cmUgKyBSUEMpOyBgYnVmZmVyX2R3ZWxsX21zYCBpc29sYXRlcyB0aGVcbiAqIHByZS1kaXNwYXRjaCBzaGFyZSBzbyBjbGllbnQtc2lkZSBiYXRjaGluZyBjb3N0IGNhbiBiZSB0b2xkIGFwYXJ0IGZyb21cbiAqIG5ldHdvcmsvc2VydmVyIHRpbWUuIE5hbWVkIGB3b3JrZmxvdy5zdHJlYW0uZmx1c2hgOyB0aGUgcGVyLXJlcXVlc3QgUlBDXG4gKiBiZW5lYXRoIGl0IGlzIHdvcmxkLXZlcmNlbCdzIGB3b3JrZmxvdy5zdHJlYW0ud3JpdGVgIHNwYW4gKGNodW5rX3J0dCksIGFuZFxuICogdGhlIHR3byBtdXN0IHN0YXkgZGlzdGluZ3Vpc2hhYmxlLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIGRpc3BhdGNoRXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJwY01zOiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5mbHVzaCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2ZsdXNoJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5idWZmZXJfZHdlbGxfbXMnOiBkaXNwYXRjaEVwb2NoTXMgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5ieXRlcyc6IGJ5dGVDb3VudCxcbiAgICAgICAgLy8gQ2xpZW50LW9ic2VydmVkIFdvcmxkIHdyaXRlIFJQQyBkdXJhdGlvbiAobmV0d29yayBob3AgaW5jbHVkZWQpLlxuICAgICAgICAvLyBTYW1lIGtleSBhcyB3b3JsZC12ZXJjZWwncyBwZXItcmVxdWVzdCBzcGFuIGF0dHJpYnV0ZSBzbyBxdWVyaWVzXG4gICAgICAgIC8vIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGljaCBsYXllciBlbWl0dGVkIGl0LlxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLndyaXRlLmNodW5rX3J0dCc6IHJwY01zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgc3BhbiBmb3IgdGhlIHN0cmVhbS1jbG9zZSBSUEM6IGl0cyBkdXJhdGlvbiBpcyB0aGVcbiAqIGB3b3JsZC5zdHJlYW1zLmNsb3NlYCByb3VuZCB0cmlwIChuZXR3b3JrIGhvcCBpbmNsdWRlZCkuIEZpcmUtYW5kLWZvcmdldDtcbiAqIG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtQ2xvc2UoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5jbG9zZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2Nsb3NlJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5jbG9zZS5ycGNfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gZXh0ZW5kcyBXcml0YWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcnVuUmVhZHlCYXJyaWVyIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGVcbiAgICogYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZC4gV2hlbiB0aGUgc3RlcCBib2R5IHJ1bnNcbiAgICogb3B0aW1pc3RpY2FsbHkgKGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzIGR1cmFibGUpLCB0aGUgZmlyc3QgY2h1bmsgd3JpdGUgdG9cbiAgICogYSBicmFuZC1uZXcgc3RyZWFtIHdvdWxkIG90aGVyd2lzZSByZWFjaCB0aGUgV29ybGQgYmVmb3JlIHRoZSBydW4gZXhpc3RzXG4gICAqIGFuZCBiZSByZWplY3RlZCBhcyBydW4tbm90LWZvdW5kLiBBd2FpdGluZyB0aGlzIG9uY2UgYmVmb3JlIHRoZSBmaXJzdFxuICAgKiBmbHVzaC9jbG9zZSBvcmRlcnMgdGhlIHdyaXRlIGFmdGVyIHRoZSBydW4ncyBjcmVhdGlvbi4gYHVuZGVmaW5lZGAgb3V0c2lkZVxuICAgKiB0dXJibyBhbmQgb24gdGhlIGF3YWl0IHBhdGgsIHdoZXJlIHRoZSBydW4gd2FzIGFscmVhZHkgZHVyYWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPikge1xuICAgIGlmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBcInJ1bklkXCIgbXVzdCBiZSBhIHN0cmluZywgZ290IFwiJHt0eXBlb2YgcnVuSWR9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAvLyBIb2xkIHRoZSBmaXJzdCBzZXJ2ZXIgd3JpdGUgdW50aWwgdGhlIHJ1biBleGlzdHMgKHR1cmJvIG9wdGltaXN0aWNcbiAgICAvLyBzdGFydCkuIEF3YWl0ZWQgb25jZSwgdGhlbiBjbGVhcmVkIHNvIGxhdGVyIGZsdXNoZXMgcGF5IG5vdGhpbmcuIFRoZVxuICAgIC8vIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHkgZmFpbGVkXG4gICAgLy8gdGhlIHJ1biBkb2VzIG5vdCBleGlzdCwgc28gdGhlIHdyaXRlIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yLlxuICAgIGxldCBwZW5kaW5nUnVuUmVhZHk6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQgPSBydW5SZWFkeUJhcnJpZXI7XG4gICAgY29uc3QgZW5zdXJlUnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAocGVuZGluZ1J1blJlYWR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcGVuZGluZ1J1blJlYWR5O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5LCBzZWUgYWJvdmUuXG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ1J1blJlYWR5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBPbmUgc3RhYmxlIGlkZW50aXR5IGFuZCBzZXF1ZW5jZSBzcGFjZSBwZXIgaW4tbWVtb3J5IHNpbmsuIFN0YXJ0IHNlc3Npb25cbiAgICAvLyBjb25zdHJ1Y3Rpb24gYXMgc29vbiBhcyB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgcGVybWl0cywgc28gdHJhbnNwb3J0cyBtYXlcbiAgICAvLyBuZWdvdGlhdGUgZWFnZXJseSB3aXRob3V0IGFsbG93aW5nIGEgd3JpdGUgdG8gb3ZlcnRha2UgcnVuIGNyZWF0aW9uLlxuICAgIC8vIFRoaXMgZWFnZXIgY2hhaW4gY2Fubm90IHN0cmFuZCBhIG5ldyByZWplY3Rpb246IGVuc3VyZVJ1blJlYWR5IGFic29yYnMgaXRzXG4gICAgLy8gb3JkZXJpbmctb25seSBmYWlsdXJlLCBhbmQgZXZlcnkgcGF0aCB0aGF0IGNhbiBvYnNlcnZlIHdvcmxkUHJvbWlzZSBhbHNvXG4gICAgLy8gYXdhaXRzIHRoaXMgc2Vzc2lvbiBwcm9taXNlIGJlZm9yZSBpdCB3cml0ZXMsIGNsb3Nlcywgb3IgZGlzcG9zZXMuXG4gICAgY29uc3Qgd3JpdGVySWQgPSBgd3J0cl8ke2RlZmF1bHRVbGlkKCl9YCBhcyBjb25zdDtcbiAgICBjb25zdCB3cml0ZVNlc3Npb25Qcm9taXNlOiBQcm9taXNlPFN0cmVhbVdyaXRlU2Vzc2lvbiB8IHVuZGVmaW5lZD4gPVxuICAgICAgZW5zdXJlUnVuUmVhZHkoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAgIHJldHVybiB3b3JsZC5zdHJlYW1zLmNyZWF0ZVdyaXRlU2Vzc2lvbj8uKHJ1bklkLCBuYW1lLCB7IHdyaXRlcklkIH0pO1xuICAgICAgfSk7XG4gICAgbGV0IG5leHRDaHVua1NlcSA9IDA7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBHcm91cC1jb21taXQgYnVmZmVyaW5nLlxuICAgIC8vXG4gICAgLy8gYHdyaXRlKClgIHJlc29sdmVzIGFzIHNvb24gYXMgdGhlIGNodW5rIGVudGVycyB0aGlzIGJvdW5kZWQgYnVmZmVyLFxuICAgIC8vIE5PVCB3aGVuIGl0IGlzIGR1cmFibGUuIFRoYXQgaXMgdGhlIHByb3BlcnR5IHRoYXQgbWFrZXMgYmF0Y2hpbmdcbiAgICAvLyBwYXRoLWluZGVwZW5kZW50OiBhIG5hdGl2ZSBgcmVhZGFibGUucGlwZVRvKHNlcnZlcldyaXRhYmxlKWAgcHVsbHMgdGhlXG4gICAgLy8gbmV4dCBjaHVuayB0aGUgbW9tZW50IGB3cml0ZSgpYCByZXNvbHZlcywgc28gY2h1bmtzIGFjY3VtdWxhdGUgaGVyZVxuICAgIC8vIGR1cmluZyB0aGUgZmx1c2gtdGltZXIgd2luZG93IGFuZCB3aGlsZSBhIHNlcnZlciByZXF1ZXN0IGlzIGluXG4gICAgLy8gZmxpZ2h0LCBhbmQgZWFjaCBhY2N1bXVsYXRlZCBncm91cCBnb2VzIG91dCBhcyBvbmUgYHdyaXRlTXVsdGlgLlxuICAgIC8vIChQcmV2aW91c2x5IGB3cml0ZSgpYCByZXNvbHZlZCBvbmx5IGFmdGVyIHRoZSB0aW1lciBBTkQgdGhlIHNlcnZlclxuICAgIC8vIHJvdW5kIHRyaXAsIHNvIG5hdGl2ZSBwaXBpbmcgc2VyaWFsaXplZCB0byBvbmUgcmVxdWVzdCBwZXIgY2h1bmsgYW5kXG4gICAgLy8gYmF0Y2hpbmcgb25seSB3b3JrZWQgdGhyb3VnaCBgZmx1c2hhYmxlUGlwZWAncyBiZXNwb2tlIGNvYWxlc2NpbmcuKVxuICAgIC8vXG4gICAgLy8gRHVyYWJpbGl0eSBoYXMgYSBkZWRpY2F0ZWQgYmFycmllciBpbnN0ZWFkOiBgZHJhaW4oKWAgKGV4cG9zZWQgdmlhXG4gICAgLy8ge0BsaW5rIFNUUkVBTV9EUkFJTl9TWU1CT0x9KSByZXNvbHZlcyBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eVxuICAgIC8vIGFuZCBubyByZXF1ZXN0IGlzIGluIGZsaWdodC4gYGNsb3NlKClgIGF3YWl0cyBpdCBiZWZvcmUgY2xvc2luZyB0aGVcbiAgICAvLyBzZXJ2ZXIgc3RyZWFtLCBhbmQgdGhlIGZsdXNoYWJsZS1zdHJlYW0gbG9jay1yZWxlYXNlIGNvbXBsZXRpb25cbiAgICAvLyBhd2FpdHMgaXQgYmVmb3JlIGxldHRpbmcgYSBzdGVwIGZpbmlzaCwgc28gXCJzdGVwIGNvbXBsZXRlZFwiIHN0aWxsXG4gICAgLy8gaW1wbGllcyBcInN0cmVhbSBkYXRhIGR1cmFibGVcIiwgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgLy9cbiAgICAvLyBFbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGUgZnJhbWluZyBsZXZlbCBieVxuICAgIC8vIGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbSwgbm90IGhlcmUuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheVtdID0gW107XG4gICAgbGV0IGJ1ZmZlckJ5dGVzID0gMDtcbiAgICAvLyBUaGUgZ3JvdXAgY3VycmVudGx5IGluc2lkZSBhIHNlcnZlciByZXF1ZXN0LiBDb3VudGVkIGFnYWluc3QgdGhlXG4gICAgLy8gYnVmZmVyIGJvdW5kIHNvIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2Aga2VlcHMgaXRzXG4gICAgLy8gZG9jdW1lbnRlZCBtZWFuaW5nIChhbiB1cHBlciBib3VuZCBhY3Jvc3MgQUxMIHJlYWQtYnV0LW5vdC1kdXJhYmxlXG4gICAgLy8gY2h1bmtzKSwgbm90IGp1c3QgdGhlIHF1ZXVlZCBmb2xsb3ctdXAgZ3JvdXAuXG4gICAgbGV0IGluRmxpZ2h0Q2h1bmtzID0gMDtcbiAgICBsZXQgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgbGV0IGZsdXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqIFRoZSBpbi1mbGlnaHQgZGlzcGF0Y2ggY2hhaW4uIEF0IG1vc3Qgb25lLCBwcmVzZXJ2aW5nIGNodW5rIG9yZGVyLiAqL1xuICAgIGxldCBpbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0aWNreSBmYWlsdXJlOiBvbmNlIGEgZGlzcGF0Y2ggZmFpbHMsIHRoZSBmYWlsZWQgZ3JvdXAgaXMgcmUtcXVldWVkXG4gICAgICogKHJldGFpbmVkLCBleGFjdGx5IGFzIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiByZXRhaW5lZCBpdHMgYnVmZmVyKVxuICAgICAqIGFuZCBldmVyeSBzdWJzZXF1ZW50IGB3cml0ZSgpYCwgYGNsb3NlKClgIGFuZCBgZHJhaW4oKWAgcmVqZWN0cyB3aXRoXG4gICAgICogdGhlIG9yaWdpbmFsIGVycm9yLiBDaHVua3Mgd2hvc2UgYHdyaXRlKClgIGFscmVhZHkgcmVzb2x2ZWQgc3VyZmFjZVxuICAgICAqIHRoZWlyIGZhaWx1cmUgYXQgdGhlIGR1cmFiaWxpdHkgYmFycmllcjogdGhhdCBpcyB0aGUgY29udHJhY3Qgb2YgYW5cbiAgICAgKiBlYXJseS1hY2sgc2luay5cbiAgICAgKi9cbiAgICBsZXQgc2lua0Vycm9yOiB1bmtub3duO1xuICAgIC8vIEdyb3VwLWNvbW1pdCB3aW5kb3cuIFRoZSBlbnYgdmFyLCB3aGVuIHNldCwgb3ZlcnJpZGVzIHRoZSBXb3JsZFxuICAgIC8vIG9wdGlvbjsgb3RoZXJ3aXNlIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgIGdvdmVybnMgKGRlZmF1bHQgMCksXG4gICAgLy8gaW5jbHVkaW5nIHRoZSBmaXJzdCBjaHVuay4gV2hlbiBpdCBtdXN0IGNvbWUgZnJvbSB0aGUgd29ybGQsXG4gICAgLy8gYHNjaGVkdWxlR3JvdXBDb21taXRgIHdhaXRzIGZvciBgd29ybGRQcm9taXNlYCBiZWZvcmUgZGVjaWRpbmcsIHdoaWNoXG4gICAgLy8gY29zdHMgbm90aGluZzogbm8gcmVxdWVzdCBjYW4gbGVhdmUgYmVmb3JlIGBzZW5kR3JvdXBgJ3Mgb3duIHdvcmxkXG4gICAgLy8gYXdhaXQgZWl0aGVyLlxuICAgIGxldCByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9IGdldEVudlN0cmVhbUZsdXNoSW50ZXJ2YWxNcygpO1xuICAgIGxldCBfZmx1c2hJbnRlcnZhbFJlc29sdXRpb246IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICAvLyBQZXItcmVxdWVzdCB3aXJlIGxpbWl0cyAoc2VydmVyIGNhcHMpIGFuZCB0aGUgYnVmZmVyIGJvdW5kLiBUaGUgYm91bmRcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGtub2JzIHRoZSBjb2FsZXNjaW5nIHBpcGUgdXNlZCwgc28gcHJvZHVjZXIgYmFja3ByZXNzdXJlXG4gICAgLy8gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkOiBvbmNlIGEgcmVxdWVzdC13b3J0aCBvZiBjaHVua3MgKG9yIHRoZSBieXRlXG4gICAgLy8gYm91bmQpIGlzIGJ1ZmZlcmVkLCBgd3JpdGUoKWAgYmxvY2tzIHVudGlsIGEgZ3JvdXAgbGFuZHMgZHVyYWJseS5cbiAgICBjb25zdCBtYXhDaHVua3NQZXJSZXF1ZXN0ID0gZ2V0TWF4Q2h1bmtzUGVyQmF0Y2goKTtcbiAgICBjb25zdCBtYXhCeXRlc1BlclJlcXVlc3QgPSBnZXRNYXhCeXRlc1BlckJhdGNoKCk7XG4gICAgY29uc3QgbWF4QnVmZmVyZWRDaHVua3MgPSBnZXRNYXhJbmZsaWdodENodW5rcygpO1xuICAgIGNvbnN0IG1heEJ1ZmZlcmVkQnl0ZXMgPSBnZXRNYXhCdWZmZXJlZEJ5dGVzKCk7XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHdyaXRlLWJhdGNoIHRpbWluZzogc3RhbXBlZCB3aGVuIHRoZSBidWZmZXIgZ29lc1xuICAgIC8vIGVtcHR54oaSbm9uLWVtcHR5LCBjb25zdW1lZCBieSB0aGUgZ3JvdXAgdGhhdCBjYXJyaWVzIHRoYXQgY2h1bmsgb3V0LlxuICAgIGxldCBidWZmZXJUMDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgdHlwZSBXYWl0ZXIgPSB7IHJlc29sdmU6ICgpID0+IHZvaWQ7IHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZCB9O1xuICAgIC8qKiB3cml0ZSgpIGNhbGxzIGJsb2NrZWQgb24gdGhlIGJ1ZmZlciBib3VuZC4gKi9cbiAgICBsZXQgY2FwYWNpdHlXYWl0ZXJzOiBXYWl0ZXJbXSA9IFtdO1xuICAgIC8qKiBkcmFpbigpIGNhbGxzIHdhaXRpbmcgZm9yIGZ1bGwgZHVyYWJpbGl0eS4gKi9cbiAgICBsZXQgZHJhaW5XYWl0ZXJzOiBXYWl0ZXJbXSA9IFtdO1xuXG4gICAgY29uc3QgcmVqZWN0V2FpdGVycyA9IChlcnI6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFsbCA9IFsuLi5jYXBhY2l0eVdhaXRlcnMsIC4uLmRyYWluV2FpdGVyc107XG4gICAgICBjYXBhY2l0eVdhaXRlcnMgPSBbXTtcbiAgICAgIGRyYWluV2FpdGVycyA9IFtdO1xuICAgICAgZm9yIChjb25zdCB3IG9mIGFsbCkgdy5yZWplY3QoZXJyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGFrZSB0aGUgbGFyZ2VzdCBsZWFkaW5nIGdyb3VwIHRoYXQgZml0cyBvbmUgcmVxdWVzdDogYXQgbW9zdFxuICAgICAqIGBtYXhDaHVua3NQZXJSZXF1ZXN0YCBjaHVua3MgYW5kIGBtYXhCeXRlc1BlclJlcXVlc3RgIGN1bXVsYXRpdmUgYnl0ZXNcbiAgICAgKiAoYSBzaW5nbGUgb3ZlcnNpemVkIGNodW5rIHN0aWxsIGdvZXMgb3V0IGFsb25lKS5cbiAgICAgKi9cbiAgICBjb25zdCB0YWtlR3JvdXAgPSAoKTogeyBncm91cDogVWludDhBcnJheVtdOyBieXRlczogbnVtYmVyIH0gPT4ge1xuICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgIGxldCBieXRlcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ1ZmZlcikge1xuICAgICAgICBpZiAoY291bnQgPj0gbWF4Q2h1bmtzUGVyUmVxdWVzdCkgYnJlYWs7XG4gICAgICAgIGlmIChjb3VudCA+IDAgJiYgYnl0ZXMgKyBjaHVuay5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXNQZXJSZXF1ZXN0KSBicmVhaztcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgYnl0ZXMgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdyb3VwID0gYnVmZmVyLnNsaWNlKDAsIGNvdW50KTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShjb3VudCk7XG4gICAgICBidWZmZXJCeXRlcyAtPSBieXRlcztcbiAgICAgIHJldHVybiB7IGdyb3VwLCBieXRlcyB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBsb29wOiB3aGlsZSBjaHVua3MgYXJlIGJ1ZmZlcmVkLCBzZW5kIHRoZW0gZ3JvdXAgYnkgZ3JvdXAuXG4gICAgICogRXhhY3RseSBvbmUgbG9vcCBydW5zIGF0IGEgdGltZSAoYGluRmxpZ2h0YCksIHNvIGdyb3VwcyByZWFjaCB0aGVcbiAgICAgKiBzZXJ2ZXIgaW4gd3JpdGUgb3JkZXIuIENodW5rcyB0aGF0IGFycml2ZSB3aGlsZSBhIGdyb3VwJ3MgcmVxdWVzdCBpc1xuICAgICAqIGluIGZsaWdodCBhY2N1bXVsYXRlIGFuZCBmb3JtIHRoZSBuZXh0IGdyb3VwOiB0aGUgZ3JvdXAtY29tbWl0XG4gICAgICogYmVoYXZpb3IsIG5vdyBpbmRlcGVuZGVudCBvZiBob3cgdGhlIHByb2R1Y2VyIHBpcGVzLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFNlbmQgb25lIGdyb3VwIHRvIHRoZSBzZXJ2ZXI6IGdhdGUgb24gcnVuIHJlYWRpbmVzcywgdGhlbiBvbmVcbiAgICAgKiBgd3JpdGVNdWx0aWAgKG9yIHNlcXVlbnRpYWwgYHdyaXRlYHMgd2hlbiB0aGUgd29ybGQgbGFja3MgaXQpLiBFbWl0c1xuICAgICAqIHRoZSB3cml0ZS1mbHVzaCBzcGFuOyBkd2VsbCBpcyBtZWFzdXJlZCB1cCB0byBqdXN0IGJlZm9yZSB0aGUgUlBDIHNvIGFcbiAgICAgKiB0dXJibyBydW4tcmVhZHkgYmFycmllciB3YWl0IGNvdW50cyBhcyBidWZmZXIgZHdlbGwsIG1hdGNoaW5nIHRoZVxuICAgICAqIHByZS1ncm91cC1jb21taXQgdGVsZW1ldHJ5LlxuICAgICAqL1xuICAgIGNvbnN0IHNlbmRHcm91cCA9IGFzeW5jIChcbiAgICAgIGdyb3VwOiBVaW50OEFycmF5W10sXG4gICAgICBieXRlczogbnVtYmVyLFxuICAgICAgZ3JvdXBUMDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgd3JpdGVTZXNzaW9uUHJvbWlzZTtcbiAgICAgIGNvbnN0IGRpc3BhdGNoQXQgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgYXdhaXQgc2Vzc2lvbi53cml0ZShuZXh0Q2h1bmtTZXEsIGdyb3VwKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiB3b3JsZC5zdHJlYW1zLndyaXRlTXVsdGkgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgZ3JvdXAubGVuZ3RoID4gMVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aShydW5JZCwgbmFtZSwgZ3JvdXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlcXVlbnRpYWwgd3JpdGVzXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZ3JvdXApIHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKHJ1bklkLCBuYW1lLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGBpbkZsaWdodGAgYWRtaXRzIG9ubHkgb25lIGRpc3BhdGNoIGxvb3AsIHNvIG5vIHNlY29uZCBncm91cCBjYW4gcmVhZFxuICAgICAgLy8gdGhpcyBzZXF1ZW5jZSBzcGFjZSB1bnRpbCB0aGUgY3VycmVudCBncm91cCBoYXMgYWR2YW5jZWQgaXQuXG4gICAgICBuZXh0Q2h1bmtTZXEgKz0gZ3JvdXAubGVuZ3RoO1xuICAgICAgaWYgKGdyb3VwVDAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWNvcmRTdHJlYW1Xcml0ZUZsdXNoKFxuICAgICAgICAgIGdyb3VwVDAsXG4gICAgICAgICAgZGlzcGF0Y2hBdCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGdyb3VwLmxlbmd0aCxcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBEYXRlLm5vdygpIC0gZGlzcGF0Y2hBdFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBkaXNwYXRjaExvb3AgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hUaW1lcik7XG4gICAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXBUMCA9IGJ1ZmZlclQwO1xuICAgICAgICBjb25zdCBncm91cFRha2VuQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7IGdyb3VwLCBieXRlcyB9ID0gdGFrZUdyb3VwKCk7XG4gICAgICAgIGluRmxpZ2h0Q2h1bmtzID0gZ3JvdXAubGVuZ3RoO1xuICAgICAgICBpbkZsaWdodEJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIGJ1ZmZlclQwID0gYnVmZmVyLmxlbmd0aCA+IDAgPyBncm91cFRha2VuQXQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBzZW5kR3JvdXAoZ3JvdXAsIGJ5dGVzLCBncm91cFQwKTtcbiAgICAgICAgICBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgICAgICAgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUmV0YWluIHRoZSBmYWlsZWQgZ3JvdXAgKGFuZCBpdHMgb3JpZ2luYWwgdDApIGF0IHRoZSBmcm9udCBvZlxuICAgICAgICAgIC8vIHRoZSBidWZmZXIsIHBvaXNvbiB0aGUgc2luaywgYW5kIHN1cmZhY2UgdGhlIGZhaWx1cmUgdG8gZXZlcnlcbiAgICAgICAgICAvLyBibG9ja2VkIHdyaXRlciBhbmQgZHJhaW4gd2FpdGVyLlxuICAgICAgICAgIGJ1ZmZlciA9IGdyb3VwLmNvbmNhdChidWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlckJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgIGluRmxpZ2h0Q2h1bmtzID0gMDtcbiAgICAgICAgICBpbkZsaWdodEJ5dGVzID0gMDtcbiAgICAgICAgICBidWZmZXJUMCA9XG4gICAgICAgICAgICBncm91cFQwICE9PSB1bmRlZmluZWQgJiYgYnVmZmVyVDAgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IE1hdGgubWluKGdyb3VwVDAsIGJ1ZmZlclQwKVxuICAgICAgICAgICAgICA6IChncm91cFQwID8/IGJ1ZmZlclQwKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgZ3JvdXAgaXMgZHVyYWJsZTogcmVsaWV2ZSB3cml0ZXJzIGJsb2NrZWQgb24gdGhlIGJvdW5kICh0aGV5XG4gICAgICAgIC8vIHJlLWNoZWNrIGl0IGFuZCBtYXkgYmxvY2sgYWdhaW4pLlxuICAgICAgICBjb25zdCByZWxpZXZlZCA9IGNhcGFjaXR5V2FpdGVycztcbiAgICAgICAgY2FwYWNpdHlXYWl0ZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdyBvZiByZWxpZXZlZCkgdy5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBTdGFydCAob3Igam9pbikgdGhlIGRpc3BhdGNoIGNoYWluLiBOZXZlciBsZWF2ZXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi4gKi9cbiAgICBjb25zdCBzdGFydERpc3BhdGNoID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGluRmxpZ2h0IHx8IHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkIHx8IGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGluRmxpZ2h0ID0gZGlzcGF0Y2hMb29wKCkudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGluRmxpZ2h0ID0gbnVsbDtcbiAgICAgICAgICAvLyBBIHdyaXRlIGNhbiBsYW5kIGluIHRoZSBtaWNyb3Rhc2sgZ2FwIGJldHdlZW4gdGhlIGxvb3Anc1xuICAgICAgICAgIC8vIGVtcHR5LWJ1ZmZlciBleGl0IGFuZCB0aGlzIHJlYWN0aW9uLiBzY2hlZHVsZUdyb3VwQ29tbWl0IHNhd1xuICAgICAgICAgIC8vIGluRmxpZ2h0IHN0aWxsIHNldCBhbmQgYXJtZWQgbm8gdGltZXIsIHNvIHdpdGhvdXQgdGhpcyBjaGVja1xuICAgICAgICAgIC8vIHRoZSBjaHVuayB3b3VsZCBzaXQgc3RyYW5kZWQgdW50aWwgYSBsYXRlciB3cml0ZS9jbG9zZS9kcmFpbi5cbiAgICAgICAgICAvLyBUcmVhdCBpdCBsaWtlIGFuIGluLXJlcXVlc3QgYXJyaXZhbDogZGlzcGF0Y2ggaW1tZWRpYXRlbHkgKHRoZVxuICAgICAgICAgIC8vIG5ldyBjaGFpbiBzZXR0bGVzIHRoZSBkcmFpbiB3YWl0ZXJzIHdoZW4gaXQgZmluaXNoZXMpLlxuICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGdWxseSBpZGxlICh0aGUgbG9vcCBvbmx5IGV4aXRzIHdpdGggYW4gZW1wdHkgYnVmZmVyKTogc2V0dGxlXG4gICAgICAgICAgLy8gdGhlIGR1cmFiaWxpdHkgYmFycmllci5cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID0gZHJhaW5XYWl0ZXJzO1xuICAgICAgICAgIGRyYWluV2FpdGVycyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBzZXR0bGVkKSB3LnJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQgPSBudWxsO1xuICAgICAgICAgIHNpbmtFcnJvciA/Pz0gZXJyb3I7XG4gICAgICAgICAgcmVqZWN0V2FpdGVycyhzaW5rRXJyb3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMZWFkaW5nLWVkZ2UgZGlzcGF0Y2ggcG9saWN5IGZvciBhbiBpZGxlIHNpbms6XG4gICAgICogLSB3aW5kb3cgPD0gMCAodGhlIGRlZmF1bHQpOiBkaXNwYXRjaCB0aGUgbGVhZGluZyBjaHVuayBpbW1lZGlhdGVseS5cbiAgICAgKiAgIEZhc3QgcHJvZHVjZXJzIHN0aWxsIGJhdGNoIHZpYSBpbi1mbGlnaHQgYWNjdW11bGF0aW9uOiBjaHVua3NcbiAgICAgKiAgIGFycml2aW5nIGR1cmluZyB0aGUgcmVxdWVzdCBmb3JtIHRoZSBuZXh0IGdyb3VwLiBUaGUgdHJhZGUgZm9yIGFuXG4gICAgICogICBpZGxlIGJ1cnN0IGlzIG9uZSBleHRyYSByZXF1ZXN0IChhIDMwLWNodW5rIGJ1cnN0IHNoaXBzIGFzIDEgKyAyOVxuICAgICAqICAgaW5zdGVhZCBvZiBvbmUgMzAtY2h1bmsgZ3JvdXAgdW5kZXIgYSBwb3NpdGl2ZSB3aW5kb3cpIGluIGV4Y2hhbmdlXG4gICAgICogICBmb3IgemVybyBmaXhlZCBmaXJzdC1jaHVuayBkZWxheSwgd2hpY2ggbWF0Y2hlcyBtZWFzdXJlZCBwcm9kdWNlclxuICAgICAqICAgYmVoYXZpb3IsIHdoZXJlIGlzb2xhdGVkIGNodW5rcyBkb21pbmF0ZS5cbiAgICAgKiAtIHdpbmRvdyA+IDAgKGV4cGxpY2l0bHkgY29uZmlndXJlZCk6IGFybSB0aGUgZ3JvdXAtY29tbWl0IHRpbWVyIHNvXG4gICAgICogICB0aGUgbGVhZGluZyBjaHVuayB3YWl0cyB1cCB0byB0aGUgd2luZG93IGNvbGxlY3RpbmcgYSBncm91cCxcbiAgICAgKiAgIHRoZSBvcHQtaW4gdHJhZGUgZm9yIHNsb3ctYnV0LXN0ZWFkeSBwcm9kdWNlcnMuXG4gICAgICogV2luZG93IHJlc29sdXRpb246IGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLCB3aGVuIHNldCxcbiAgICAgKiBvdmVycmlkZXMgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2A7IG90aGVyd2lzZSB0aGUgV29ybGQgb3B0aW9uXG4gICAgICogKGRlZmF1bHQgMCkgZ292ZXJucywgaW5jbHVkaW5nIHRoZSBmaXJzdCBjaHVuay4gRGVjaWRpbmcgbWF5XG4gICAgICogaGF2ZSB0byB3YWl0IGZvciB0aGUgd29ybGQgdG8gcmVzb2x2ZTsgdGhhdCBhZGRzIG5vIGxhdGVuY3kgYmVjYXVzZVxuICAgICAqIGBzZW5kR3JvdXBgIGF3YWl0cyB0aGUgc2FtZSBwcm9taXNlIGJlZm9yZSBhbnkgcmVxdWVzdCBsZWF2ZXMuXG4gICAgICovXG4gICAgY29uc3Qgc2NoZWR1bGVHcm91cENvbW1pdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChmbHVzaFRpbWVyIHx8IGluRmxpZ2h0KSByZXR1cm47XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBQcm9taXNlLnJlc29sdmU6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgd29ybGQgaXMgb25seSBldmVyIGF3YWl0ZWQsXG4gICAgICAgIC8vIHdoaWNoIHRvbGVyYXRlcyBhIHN5bmNocm9ub3VzIHZhbHVlICh0ZXN0cyBzdHViIGdldFdvcmxkTGF6eSB0aGF0XG4gICAgICAgIC8vIHdheSk7IC50aGVuKCkgbXVzdCBiZSBnaXZlbiBhIHJlYWwgcHJvbWlzZS5cbiAgICAgICAgX2ZsdXNoSW50ZXJ2YWxSZXNvbHV0aW9uID8/PSBQcm9taXNlLnJlc29sdmUod29ybGRQcm9taXNlKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKHdvcmxkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID1cbiAgICAgICAgICAgICAgICB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXMgPz8gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gV29ybGQgcmVzb2x1dGlvbiBmYWlsdXJlIHN1cmZhY2VzIG9uIGRpc3BhdGNoOyBmYWxsIGJhY2sgdG9cbiAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc28gYnVmZmVyZWQgY2h1bmtzIHN0aWxsIHJlYWNoIHRoZSBkaXNwYXRjaCBwYXRoXG4gICAgICAgICAgICAgIC8vICh3aGVyZSB0aGUgZXJyb3IgcG9pc29ucyB0aGUgc2luaykuXG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID0gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZS1ldmFsdWF0ZTogdGhlIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgYnkgZHJhaW4oKVxuICAgICAgICAgICAgLy8gb3IgYSBmdWxsLXJlcXVlc3QgZmFzdCBwYXRoIHdoaWxlIHRoZSB3b3JsZCByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPD0gMCkge1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgIH0sIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHVyYWJpbGl0eSBiYXJyaWVyOiByZXNvbHZlcyB3aGVuIGV2ZXJ5IGFjY2VwdGVkIGNodW5rIGhhcyByZWFjaGVkIHRoZVxuICAgICAqIHNlcnZlciBhbmQgbm90aGluZyBpcyBidWZmZXJlZCBvciBpbiBmbGlnaHQ7IHJlamVjdHMgd2l0aCB0aGUgc2luaydzXG4gICAgICogc3RpY2t5IGVycm9yIGlmIGFueSBkaXNwYXRjaCBmYWlsZWQuIEZsdXNoZXMgYSBwZW5kaW5nIGdyb3VwLWNvbW1pdFxuICAgICAqIHdpbmRvdyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIG91dCB0aGUgdGltZXIuXG4gICAgICovXG4gICAgY29uc3QgZHJhaW4gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgIWluRmxpZ2h0KSByZXR1cm47XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGRyYWluV2FpdGVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXN5bmMgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICAgIGlmIChidWZmZXJUMCA9PT0gdW5kZWZpbmVkKSBidWZmZXJUMCA9IERhdGUubm93KCk7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgYnVmZmVyQnl0ZXMgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYnVmZmVyLmxlbmd0aCA+PSBtYXhDaHVua3NQZXJSZXF1ZXN0IHx8XG4gICAgICAgICAgYnVmZmVyQnl0ZXMgPj0gbWF4Qnl0ZXNQZXJSZXF1ZXN0XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRoZSBidWZmZXJlZCBncm91cCBhbHJlYWR5IGZpbGxzIGEgcmVxdWVzdDogbm8gcG9pbnQgZHdlbGxpbmcgaW5cbiAgICAgICAgICAvLyB0aGUgY29tbWl0IHdpbmRvdy5cbiAgICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm91bmRlZCBidWZmZXI6IGFjY2VwdCB0aGUgY2h1bmsgKG5ldmVyIGRyb3ApLCB0aGVuIGJsb2NrIHVudGlsXG4gICAgICAgIC8vIHRoZSByZWFkLWJ1dC1ub3QtZHVyYWJsZSBwb3B1bGF0aW9uIChidWZmZXJlZCBBTkQgaW4gdGhlIGFjdGl2ZVxuICAgICAgICAvLyByZXF1ZXN0KSBpcyBiYWNrIHVuZGVyIHRoZSBib3VuZC4gRWFjaCBkdXJhYmx5LXNlbnQgZ3JvdXBcbiAgICAgICAgLy8gcmVsaWV2ZXMgdGhpcy5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgIHNpbmtFcnJvciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgKGJ1ZmZlci5sZW5ndGggKyBpbkZsaWdodENodW5rcyA+PSBtYXhCdWZmZXJlZENodW5rcyB8fFxuICAgICAgICAgICAgYnVmZmVyQnl0ZXMgKyBpbkZsaWdodEJ5dGVzID49IG1heEJ1ZmZlcmVkQnl0ZXMpXG4gICAgICAgICkge1xuICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjYXBhY2l0eVdhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgLy8gRXZlcnl0aGluZyBhY2NlcHRlZCBtdXN0IGJlIGR1cmFibGUgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RyZWFtIGlzXG4gICAgICAgIC8vIGNsb3NlZDogdGhlIHNlcnZlciBmZW5jZXMgcG9zdC1jbG9zZSB3cml0ZXMuXG4gICAgICAgIGF3YWl0IGRyYWluKCk7XG5cbiAgICAgICAgLy8gQSBjbG9zZSB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBza2lwcyB0aGUgZGlzcGF0Y2ggcGF0aCAoYW5kIGl0c1xuICAgICAgICAvLyBiYXJyaWVyKSwgYnV0IGNhbiBpdHNlbGYgYmUgdGhlIGZpcnN0IHdyaXRlIHRvIGEgYnJhbmQtbmV3XG4gICAgICAgIC8vIHN0cmVhbSwgc28gZ2F0ZSBpdCB0b28uXG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG5cbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB3cml0ZVNlc3Npb25Qcm9taXNlO1xuICAgICAgICBjb25zdCBjbG9zZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgICBhd2FpdCBzZXNzaW9uLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkU3RyZWFtQ2xvc2UoY2xvc2VTdGFydCwgcnVuSWQsIG5hbWUpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGFib3J0KHJlYXNvbikge1xuICAgICAgICAvLyBCdWZmZXJlZCBjaHVua3Mgd2VyZSBhbHJlYWR5IEFDS0VEIHRvIHRoZWlyIHdyaXRlcnMgKGVhcmx5LWFja1xuICAgICAgICAvLyBjb250cmFjdCksIGFuZCBuYXRpdmUgcGlwZVRvIGFib3J0cyB0aGlzIHNpbmsgd2hlbmV2ZXIgaXRzIFNPVVJDRVxuICAgICAgICAvLyBlcnJvcnMsIGUuZy4gYW4gQUkgc3RyZWFtIHRoYXQgZW1pdHMgdGVuIGRlbHRhcyBhbmQgdGhlbiB0aHJvd3MuXG4gICAgICAgIC8vIERpc2NhcmRpbmcgaGVyZSB3b3VsZCBzaWxlbnRseSBsb3NlIHRoZSBhY2NlcHRlZCB0YWlsIG9mIHRoZVxuICAgICAgICAvLyBwcmVmaXgsIHNvIGRlbGl2ZXIgaXQgZmlyc3Q7IG9ubHkgdGhlIHNlcnZlciBzdHJlYW0gY2xvc2UgaXNcbiAgICAgICAgLy8gc2tpcHBlZC4gQSBkaXNwYXRjaCBmYWlsdXJlIGR1cmluZyB0aGlzIGRyYWluIGlzIGFscmVhZHkgc3RpY2t5XG4gICAgICAgIC8vIGFuZCBzdXJmYWNlcyB0aHJvdWdoIHRoZSBzaW5rJ3MgZXJyb3IgcGF0aHMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlbGliZXJhdGVseSB1bi10aW1lYm94ZWQgKHVubGlrZSB0aGUgc3RlcC1leGVjdXRvcidzIDUwMG1zXG4gICAgICAgIC8vIGlubGluZSBmbHVzaCk6IGdpdmluZyB1cCBlYXJseSB3b3VsZCBkcm9wIGFja2VkIGNodW5rcywgdGhlXG4gICAgICAgIC8vIGV4YWN0IGxvc3MgdGhpcyBwYXRoIGV4aXN0cyB0byBwcmV2ZW50LiBJdCBpcyBzdGlsbCBib3VuZGVkIGluXG4gICAgICAgIC8vIHByYWN0aWNlIGJ5IHRoZSBXb3JsZCB0cmFuc3BvcnQncyBvd24gdGltZW91dC9yZXRyeSBidWRnZXQ6IGFcbiAgICAgICAgLy8gc3RhbGxlZCB3cml0ZSBlbmRzIGluIGEgdGVybWluYWwgcmVqZWN0aW9uIGFmdGVyIGZpbml0ZSByZXRyaWVzLFxuICAgICAgICAvLyB3aGljaCByZWplY3RzIHRoZSBkaXNwYXRjaCBhbmQgbGFuZHMgaW4gdGhlIGNhdGNoIGJlbG93LiBUaGVcbiAgICAgICAgLy8gc2FtZSBjYXRjaCBhYnNvcmJzIHRoZSBleHBlY3RlZCBjb25mbGljdCB3aGVuIGEgdGVhcmRvd24tZHJpdmVuXG4gICAgICAgIC8vIGFib3J0IGRyYWlucyBpbnRvIGFuIGFscmVhZHktdGVybWluYWwgcnVuLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGRyYWluKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIHNpbmtFcnJvciBpcyBzZXQ7IGFjY2VwdGVkLWJ1dC11bmRlbGl2ZXJhYmxlIGNodW5rcyBzdXJmYWNlIGl0LlxuICAgICAgICB9XG4gICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICBidWZmZXJCeXRlcyA9IDA7XG4gICAgICAgIHNpbmtFcnJvciA/Pz0gcmVhc29uID8/IG5ldyBFcnJvcignU3RyZWFtIGFib3J0ZWQnKTtcbiAgICAgICAgLy8gUmVqZWN0IGJsb2NrZWQgd3JpdGVycyBhbmQgZHJhaW4gd2FpdGVycyBzbyBub3RoaW5nIGxlYWtzIG9yXG4gICAgICAgIC8vIGhhbmdzIG9uIGEgcHJvbWlzZSB3aG9zZSB0aW1lciB3YXMganVzdCBjbGVhcmVkLlxuICAgICAgICByZWplY3RXYWl0ZXJzKHNpbmtFcnJvcik7XG4gICAgICAgIC8vIEFib3J0IGlzIHRyYW5zcG9ydCBjbGVhbnVwLCBub3Qgc2VtYW50aWMgc3RyZWFtIGNvbXBsZXRpb24uIEFcbiAgICAgICAgLy8gc3RhdGVmdWwgV29ybGQgcmVsZWFzZXMgaXRzIHNvY2tldCB3aXRob3V0IHNlbmRpbmcgY2xvc2U7IHN0YXRlbGVzc1xuICAgICAgICAvLyBXb3JsZHMga2VlcCB0aGUgZXhpc3Rpbmcgbm8tb3AgYmVoYXZpb3IuXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB3cml0ZVNlc3Npb25Qcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIGF3YWl0IHNlc3Npb24/LmRpc3Bvc2U/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIER1cmFiaWxpdHkgYmFycmllciBmb3Igb3duZXJzIHRoYXQgY29tcGxldGUgd2l0aG91dCBjbG9zaW5nIHRoZVxuICAgIC8vIHN0cmVhbTogYGZsdXNoYWJsZVBpcGVgJ3MgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYXdhaXRzIHRoaXMgc28gYVxuICAgIC8vIHN0ZXAgY2Fubm90IGZpbmlzaCAoYW5kIHRoZSBmdW5jdGlvbiBzdXNwZW5kKSB3aGlsZSBhY2NlcHRlZCBjaHVua3NcbiAgICAvLyBhcmUgc3RpbGwgY2xpZW50LWJ1ZmZlcmVkIG9yIGluIGZsaWdodC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU1RSRUFNX0RSQUlOX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGRyYWluLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gdGhlIG1vZHVsYXIgc2VyaWFsaXphdGlvbiBtb2R1bGVzLlxuZXhwb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyBJbXBvcnQgdHlwZXMgbG9jYWxseSBmb3IgdXNlIHdpdGhpbiB0aGlzIGZpbGUuXG5pbXBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQ29tcG9zZWQgcmVkdWNlcnMgLS0tLVxuLy8gQ29tcG9zZXMgbW9kdWxhciByZWR1Y2VycyAoY29tbW9uLCBjbGFzcywgc3RlcC1mdW5jdGlvbikgd2l0aFxuLy8gbW9kZS1zcGVjaWZpYyBSZXF1ZXN0L1Jlc3BvbnNlL1N0cmVhbSByZWR1Y2VycyBiZWxvdy5cblxuLyoqXG4gKiBCYXNlIHJlZHVjZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIHN0ZXAtZnVuY3Rpb24gKyBjb21tb24gcmVkdWNlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxCYXNlUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgY29uc3QgcmVxdWVzdFByb3RvdHlwZSA9IG9uY2UoKCkgPT4gZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1JlcXVlc3QnKSk7XG4gIGNvbnN0IHJlc3BvbnNlUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdSZXNwb25zZScpXG4gICk7XG4gIC8vIENsYXNzL0luc3RhbmNlIE1VU1QgY29tZSBiZWZvcmUgRXJyb3Igc28gdGhhdCBjdXN0b20gRXJyb3Igc3ViY2xhc3Nlc1xuICAvLyB3aXRoIFdPUktGTE9XX1NFUklBTElaRSB0YWtlIHByZWNlZGVuY2UgKGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zKS5cbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgcmVkdWNlcnMgYXJlIG1vZGUtc3BlY2lmaWMgYW5kIGFkZGVkIGJ5XG4gICAgLy8gZ2V0RXh0ZXJuYWxSZWR1Y2VycyAvIGdldFdvcmtmbG93UmVkdWNlcnMgLyBnZXRTdGVwUmVkdWNlcnMgYmVsb3cuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBDaGFpbiB3YWxrIHJhdGhlciB0aGFuIGBpbnN0YW5jZW9mIGdsb2JhbC5SZXF1ZXN0YDogc2VlIHRoZVxuICAgICAgLy8gUmVhZGFibGVTdHJlYW0gcmVkdWNlciBpbiBnZXRXb3JrZmxvd1JlZHVjZXJzIGZvciB3aHkuIFJlYWRzIGdvXG4gICAgICAvLyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGEgZ2V0dGVyIGNhbm5vdCBydW4gdW5yZXBvcnRlZC5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXF1ZXN0UHJvdG90eXBlLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVxdWVzdCddID0ge1xuICAgICAgICBtZXRob2Q6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21ldGhvZCcpIGFzIHN0cmluZyxcbiAgICAgICAgdXJsOiByZWFkUHJvcGVydHkodmFsdWUsICd1cmwnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICBkdXBsZXg6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2R1cGxleCcpIGFzICdoYWxmJyxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gcmVhZFByb3BlcnR5KHZhbHVlLCBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFKSBhc1xuICAgICAgICB8IFdyaXRhYmxlU3RyZWFtPFJlc3BvbnNlPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIGRhdGEucmVzcG9uc2VXcml0YWJsZSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICAvLyBGb3J3YXJkIHRoZSBzaWduYWwgaW4gdHdvIGNhc2VzOlxuICAgICAgLy8gICAxLiBBbHJlYWR5IGFib3J0ZWQ6IHByZXNlcnZlIGFib3J0ZWQ9dHJ1ZS9yZWFzb24gc28gdGhlIGh5ZHJhdGVkXG4gICAgICAvLyAgICAgIHN0ZXAgc2VlcyB0aGUgY2FuY2VsbGF0aW9uIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHNlcmlhbGl6ZS5cbiAgICAgIC8vICAgMi4gQWxyZWFkeSB0YWdnZWQgd2l0aCB3b3JrZmxvdyBpbmZyYXN0cnVjdHVyZSwgaS5lLiBhIHNpZ25hbFxuICAgICAgLy8gICAgICBmcm9tIGEgd29ya2Zsb3ctbWFuYWdlZCBBYm9ydENvbnRyb2xsZXIsIHdoaWNoIGhhcyBzdHJlYW0vaG9va1xuICAgICAgLy8gICAgICBiYWNraW5nIGZvciBjcm9zcy1ib3VuZGFyeSBwcm9wYWdhdGlvbi5cbiAgICAgIC8vIFBsYWluIG5vbi1hYm9ydGVkIG5hdGl2ZSBzaWduYWxzIGFyZSBpbnRlbnRpb25hbGx5IGRyb3BwZWQgKHdvdWxkXG4gICAgICAvLyBtaW50IHN0cmVhbSBpbmZyYSBmb3IgZXZlcnkgUmVxdWVzdCwgaW5jbHVkaW5nIHRoZSBhdXRvLWdlbmVyYXRlZFxuICAgICAgLy8gc2lnbmFsIG9uIGBuZXcgUmVxdWVzdCh1cmwpYCkuXG4gICAgICBjb25zdCBzaWduYWwgPSByZWFkUHJvcGVydHkodmFsdWUsICdzaWduYWwnKTtcbiAgICAgIGlmIChcbiAgICAgICAgc2lnbmFsICYmXG4gICAgICAgIChyZWFkUHJvcGVydHkoc2lnbmFsLCAnYWJvcnRlZCcpIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KHNpZ25hbCwgQUJPUlRfU1RSRUFNX05BTUUpKVxuICAgICAgKSB7XG4gICAgICAgIGRhdGEuc2lnbmFsID0gc2lnbmFsIGFzIEFib3J0U2lnbmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTZWUgdGhlIFJlcXVlc3QgcmVkdWNlciBhYm92ZS5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXNwb25zZVByb3RvdHlwZS52YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3R5cGUnKSBhcyBSZXNwb25zZVsndHlwZSddLFxuICAgICAgICB1cmw6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3VybCcpIGFzIHN0cmluZyxcbiAgICAgICAgc3RhdHVzOiByZWFkUHJvcGVydHkodmFsdWUsICdzdGF0dXMnKSBhcyBudW1iZXIsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1c1RleHQnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICByZWRpcmVjdGVkOiByZWFkUHJvcGVydHkodmFsdWUsICdyZWRpcmVjdGVkJykgYXMgYm9vbGVhbixcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgYWJvcnQgcmVkdWNlciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBBYm9ydFNlcmlhbGl6ZWREYXRhID0ge1xuICBzdHJlYW1OYW1lOiBzdHJpbmc7XG4gIGhvb2tUb2tlbjogc3RyaW5nO1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb246IHVua25vd247XG59O1xuXG4vKipcbiAqIFN5bWJvbC1rZXllZCBpbnRlcm5hbCBmaWVsZHMgdGFnZ2VkIG9udG8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsXG4gKiBpbnN0YW5jZXMgKGFuZCBgaG9sZGVyYHMgaW4gcmVkdWNlciBoZWxwZXJzKS4gQWxsIG9wdGlvbmFsOiBhIHBsYWluXG4gKiBuYXRpdmUgaW5zdGFuY2UgaGFzIG5vbmUgb2YgdGhlbSBzZXQuXG4gKi9cbnR5cGUgQWJvcnRJbnRlcm5hbHMgPSB7XG4gIFtBQk9SVF9TVFJFQU1fTkFNRV0/OiBzdHJpbmc7XG4gIFtBQk9SVF9IT09LX1RPS0VOXT86IHN0cmluZztcbiAgW0FCT1JUX1JFQURFUl9DQU5DRUxdPzogQWJvcnRDb250cm9sbGVyO1xufTtcblxudHlwZSBBYm9ydFNpZ25hbExpa2UgPSBBYm9ydEludGVybmFscyAmIHtcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogdW5rbm93bjtcbiAgYWRkRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBBYm9ydEhvbGRlciA9IEFib3J0SW50ZXJuYWxzICYgeyBzaWduYWw/OiBBYm9ydEludGVybmFscyB9O1xuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIGV4dGVybmFsIGFuZCBzdGVwXG4gKiBjb250ZXh0cy4gQXNzaWducyBzdHJlYW0vaG9vayBuYW1lcyBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCBvcHRpb25hbGx5XG4gKiBhdHRhY2hlcyBhbiBhYm9ydCBsaXN0ZW5lciBmb3IgcmVhbC10aW1lIHByb3BhZ2F0aW9uLCBhbmQgcmV0dXJucyB0aGVcbiAqIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICBzaWduYWw6IEFib3J0U2lnbmFsTGlrZSxcbiAgaG9sZGVyOiBBYm9ydEhvbGRlcixcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IEFib3J0U2VyaWFsaXplZERhdGEge1xuICBsZXQgc3RyZWFtTmFtZSA9IGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGxldCBob29rVG9rZW4gPSBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl07XG4gIGlmICghc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IGlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgc3RyZWFtTmFtZSA9IGdldEFib3J0U3RyZWFtSWQoaWQpO1xuICAgIGhvb2tUb2tlbiA9IGBhYnJ0XyR7aWR9YDtcbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgaWYgKGhvbGRlci5zaWduYWwpIHtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgfVxuICB9XG5cbiAgLy8gRGVkdXBlZCB2aWEgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQgbWFya2VyOiBzZWUgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UuXG4gIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlKFxuICAgIHNpZ25hbCBhcyBBYm9ydFNpZ25hbCxcbiAgICBzdHJlYW1OYW1lLFxuICAgIHJ1bklkLFxuICAgIGNyeXB0b0tleSxcbiAgICBvcHNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN0cmVhbU5hbWUsXG4gICAgaG9va1Rva2VuOiBob29rVG9rZW4hLFxuICAgIGFib3J0ZWQ6IHNpZ25hbC5hYm9ydGVkLFxuICAgIHJlYXNvbjogc2lnbmFsLmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIHdvcmtmbG93IGNvbnRleHQuXG4gKiBSZWFkcyBleGlzdGluZyBzdHJlYW0vaG9vayBuYW1lcyBmcm9tIHN5bWJvbHMgKG11c3QgYWxyZWFkeSBiZSBzZXQpLlxuICovXG5mdW5jdGlvbiByZWR1Y2VBYm9ydEJ5U3ltYm9sKFxuICBzaWduYWw6IHsgYWJvcnRlZDogYm9vbGVhbjsgcmVhc29uPzogdW5rbm93biB9LFxuICBob2xkZXI6IEFib3J0SG9sZGVyXG4pOiBBYm9ydFNlcmlhbGl6ZWREYXRhIHwgZmFsc2Uge1xuICBjb25zdCBzdHJlYW1OYW1lID1cbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGNvbnN0IGhvb2tUb2tlbiA9XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGEgc2luZ2xlIGFib3J0IGxpc3RlbmVyIHRvIGEgc2lnbmFsLCBkZWR1cGVkIGFjcm9zcyBjYWxscy5cbiAqXG4gKiBFYWNoIHNlcmlhbGl6YXRpb24gcGFzcyBnb2VzIHRocm91Z2ggdGhlIHJlZHVjZXIsIGJ1dCBhIGNvbnRyb2xsZXIgcGFzc2VkXG4gKiB0byBOIHN0ZXBzIHdvdWxkIG90aGVyd2lzZSBhY2N1bXVsYXRlIE4gbGlzdGVuZXJzLCBlYWNoIHdyaXRpbmcgdGhlIHNhbWVcbiAqIHN0cmVhbSBwYWNrZXQgYW5kIGRvdWJsZS1jbG9zaW5nIHRoZSBzdHJlYW0gb24gYWJvcnQuIFRoZSBtYXJrZXIgc3ltYm9sXG4gKiBlbnN1cmVzIHRoZSBzdHJlYW0td3JpdGUgc2lkZS1lZmZlY3QgcnVucyBhdCBtb3N0IG9uY2UgcGVyIChzaWduYWwsIHJ1bklkKS5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHN0cmVhbU5hbWU6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiB2b2lkIHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gIGlmICgoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdKSByZXR1cm47XG4gIChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0gPSB0cnVlO1xuXG4gIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdhYm9ydCcsXG4gICAgKCkgPT4ge1xuICAgICAgb3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSByZWFkZXIgdXNlcyAoaHlkcmF0ZVN0ZXBBcmd1bWVudHMpXG4gICAgICAgICAgICAvLyBzbyB0aGUgcmVhc29uIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5IChET01FeGNlcHRpb24sXG4gICAgICAgICAgICAvLyBFcnJvcnMsIGN1c3RvbSBjbGFzc2VzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzIGVuY3J5cHRpb24ga2V5LlxuICAgICAgICAgICAgLy8gQSBiYXJlIEpTT04uc3RyaW5naWZ5IGhlcmUgd291bGQgd3JpdGUgYSBwYWNrZXQgdGhlIHJlYWRlciBjYW4ndFxuICAgICAgICAgICAgLy8gZGVjb2RlIGFuZCB0aGUgbGlzdGVuZXItc2lkZSBhYm9ydCB3b3VsZCBwcm9wYWdhdGUgd2l0aCBubyByZWFzb24uXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgIHsgYWJvcnRlZDogdHJ1ZSwgcmVhc29uOiBzaWduYWwucmVhc29uIH0sXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHBheWxvYWQgYXMgVWludDhBcnJheSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IHN0cmVhbSB3cml0ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9LFxuICAgIHsgb25jZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsIHBhc3NpbmcgYXJndW1lbnRzXG4gKiB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEBwYXJhbSBjcnlwdG9LZXlcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZW4gYHRydWVgLCBieXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYClcbiAqICAgYXJlIHdyYXBwZWQgaW4gbGVuZ3RoLXByZWZpeGVkIGZyYW1lcyBvbiB0aGUgd2lyZSBzbyB0aGUgY29uc3VtZXJcbiAqICAgY2FuIHJlY29ubmVjdCBvbiB0cmFuc2llbnQgZXJyb3JzLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBydW4nc1xuICogICBjYXBhYmlsaXR5OiBzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzXG4gKiAgIHRvIGBmYWxzZWAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgbmVzdGVkIGBSZWFkYWJsZVN0cmVhbWAgZm91bmQgd2hpbGUgc2VyaWFsaXppbmdcbiAgLy8gaXMgcGlwZWQgdG8gaXRzIG93biBzZXJ2ZXIgc3RyZWFtIGluZGVwZW5kZW50bHkgb2YgdGhlIG91dGVyIHNpbmssIHNvIGl0c1xuICAvLyBmaXJzdCBjaHVuayBjYW4gcmFjZSBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhhdFxuICAvLyBzaW5rIHNvIHRoZSB3cml0ZSBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC9cbiAgLy8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj4sXG4gIC8vIE9wZXJhdGlvbnMgdGhhdCByZWFkIGRhdGEgYmFjayBmcm9tIHRoZSB3b3JrZmxvdyBpbnRvIGNhbGxlci1vd25lZFxuICAvLyB3cml0YWJsZXMuIFRoZXNlIG11c3Qgc3RheSBzZXBhcmF0ZSBmcm9tIHByb2R1Y2VyIHVwbG9hZHM6IGEgcmVhZGJhY2sgY2FuXG4gIC8vIG9ubHkgZmluaXNoIGFmdGVyIHRoZSB3b3JrZmxvdyBydW5zLCBzbyBhd2FpdGluZyBpdCBiZWZvcmUgZGlzcGF0Y2ggd291bGRcbiAgLy8gZGVhZGxvY2suIERlZmF1bHRzIHRvIGBvcHNgIGZvciBleGlzdGluZyBjYWxsZXJzIHRoYXQgZmx1c2ggZXZlcnl0aGluZyBpblxuICAvLyB0aGUgYmFja2dyb3VuZC5cbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuXG4gICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgaWYgKGZyYW1lZEJ5dGVTdHJlYW1zKSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcykgcy5mcmFtaW5nID0gJ2ZyYW1lZC12MSc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogd2hlbiB0aGUgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbSAoZS5nLiBpdCBjYW1lIGZyb20gYSBzdGVwLWNvbnRleHQgYGdldFdyaXRhYmxlKClgXG4gICAgICAvLyBvciB3YXMgaHlkcmF0ZWQgZnJvbSBhIHdvcmtmbG93IGlucHV0IGJ5IGBnZXRTdGVwUmV2aXZlcnNgKSxcbiAgICAgIC8vIGZvcndhcmQgaXRzIHVuZGVybHlpbmcgYChydW5JZCwgbmFtZSlgIHRvIHRoZSByZWNlaXZpbmcgcnVuLlxuICAgICAgLy8gVGhlIHJlY2VpdmluZyBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyBhIHNlcnZlciB3cml0YWJsZVxuICAgICAgLy8gYWdhaW5zdCB0aGUgb3JpZ2luYWwgYChydW5JZCwgbmFtZSlgIGFuZCByZXNvbHZlcyB0aGF0IHJ1bidzXG4gICAgICAvLyBlbmNyeXB0aW9uIGtleSBkaXJlY3RseSwgc28gd3JpdGVzIGxhbmQgb24gdGhlIG9yaWdpbmFsIHN0cmVhbVxuICAgICAgLy8gZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSByZWNlaXZpbmcgcnVuLCB3aXRoIG5vIGluLXByb2Nlc3NcbiAgICAgIC8vIGJyaWRnZSB0aWVkIHRvIHRoZSBkZWh5ZHJhdGluZyBzdGVwJ3MgbGlmZXRpbWUuXG4gICAgICBjb25zdCBleGlzdGluZ05hbWUgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgY29uc3QgZXhpc3RpbmdSdW5JZCA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBleGlzdGluZ05hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZiBleGlzdGluZ1J1bklkID09PSAnc3RyaW5nJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7XG4gICAgICAgICAgbmFtZTogZXhpc3RpbmdOYW1lLFxuICAgICAgICAgIHJ1bklkOiBleGlzdGluZ1J1bklkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBleGlzdGluZ1B1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1B1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZXNjcmlwdG9yLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBleGlzdGluZ1B1YmxpY0tleTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGlzdGluZ0RlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ0RlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkZXNjcmlwdG9yLmRlcGxveW1lbnRJZCA9IGV4aXN0aW5nRGVwbG95bWVudElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgY29uc3QgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpO1xuICAgICAgcmVhZGJhY2tPcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG4vKipcbiAqIFByb3RvdHlwZXMgdXNlZCBmb3IgYnJhbmQtc3R5bGUgaWRlbnRpZmljYXRpb24gaW4gdGhlIHJlZHVjZXJzIGJlbG93LlxuICpcbiAqIFRoZSBzdHJlYW0gYW5kIGFib3J0IGNsYXNzZXMgYXJlIGhvc3QgY2xhc3NlcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzb1xuICogaW5zdGFuY2VzIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbiBhbmQgYSBjaGFpbiB3YWxrXG4gKiBpZGVudGlmaWVzIHRoZW0gd2l0aG91dCBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgIG9uIHRoZSBzYW5kYm94XG4gKiBjbGFzcy4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcnVudGltZSBsYWNrcyB0aGUgY2xhc3MsIGluIHdoaWNoIGNhc2VcbiAqIGlkZW50aWZpY2F0aW9uIGZhbGxzIGJhY2sgdG8gdGhlIGluZnJhc3RydWN0dXJlIHN5bWJvbHMgYWxvbmUuXG4gKi9cbi8qKlxuICogVGhlIHByb3RvdHlwZSBvZiBhIGhvc3QgY2xhc3MgdGhhdCBtYXkgYWxzbyBiZSBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LlxuICogUHJlZmVycyB0aGUgc2FuZGJveCBiaW5kaW5nICh0aGUgc2FtZSBob3N0IGNsYXNzIG9iamVjdCBpbiBwcmFjdGljZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBob3N0J3Mgb3duLCBzbyBhIGNoYWluIHdhbGsgaWRlbnRpZmllcyBpbnN0YW5jZXMgZnJvbVxuICogZWl0aGVyIHJlYWxtIHdpdGhvdXQgY29uc3VsdGluZyBgU3ltYm9sLmhhc0luc3RhbmNlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdENsYXNzUHJvdG90eXBlKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5hbWU6IHN0cmluZ1xuKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgLy8gRGVzY3JpcHRvciByZWFkcyAoYHJlYWRQcm9wZXJ0eWApLCBub3QgYmFyZSBnZXRzOiBhbiBhY2Nlc3NvciBvciBQcm94eVxuICAvLyBwbGFudGVkIG9uIHRoZSBzYW5kYm94IGdsb2JhbCAob3IgdGhlIGNvbnN0cnVjdG9yKSBtdXN0IGJlIHJlY29yZGVkIGluXG4gIC8vIHRoZSBndWVzdC1jb2RlIHNpbmsgKGl0IGdhdGVzIFZNIHJldGVudGlvbiksIG5vdCBzaWxlbnRseSBleGVjdXRlZC5cbiAgLy8gQ2FsbGVycyB3cmFwIHRoaXMgaW4gYG9uY2UoLi4uKWAgcGVyIHJlZHVjZXIgc2V0LCBzbyB0aGUgcmVhZCBoYXBwZW5zXG4gIC8vIGV4YWN0bHkgb25jZSBwZXIgc2VyaWFsaXplIHBhc3MsIG9uIHRoZSBmaXJzdCBndWFyZCBpbnZvY2F0aW9uLCBpbnNpZGVcbiAgLy8gdGhlIHBhc3MncyBzaW5rIHNjb3BlLCBuZXZlciBwZXIgdmFsdWUuXG4gIGNvbnN0IGN0b3IgPSByZWFkUHJvcGVydHkoZ2xvYmFsLCBuYW1lKSA/PyByZWFkUHJvcGVydHkoZ2xvYmFsVGhpcywgbmFtZSk7XG4gIGlmICh0eXBlb2YgY3RvciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJlYWRQcm9wZXJ0eShjdG9yLCAncHJvdG90eXBlJykgYXMgb2JqZWN0IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBjb25zdCByZWFkYWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVhZGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCB3cml0YWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnV3JpdGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXJQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ0Fib3J0Q29udHJvbGxlcicpXG4gICk7XG4gIGNvbnN0IGFib3J0U2lnbmFsUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdBYm9ydFNpZ25hbCcpXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICAvLyBSZWFkYWJsZS9Xcml0YWJsZSBzdHJlYW1zIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyBhcmUgXCJoYW5kbGVzXCIgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBzdGVwcy5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXYWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gaW5zdGVhZCBvZiBgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW1gOlxuICAgICAgLy8gdGhlIGNsYXNzIGlzIGhvc3QtcHJvdmlkZWQgKGluamVjdGVkIGludG8gdGhlIHNhbmRib3gpLCBzbyBpdHNcbiAgICAgIC8vIHByb3RvdHlwZSBpcyBpbiB0aGUgY2hhaW4gb2YgYm90aCByZWFsIHN0cmVhbXMgYW5kIHRoZVxuICAgICAgLy8gYE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKWAgaGFuZGxlcyB1c2VkIGZvciByZXF1ZXN0XG4gICAgICAvLyBib2RpZXMsIGJ1dCBhIGNoYWluIHdhbGsgbmV2ZXIgY29uc3VsdHMgYFN5bWJvbC5oYXNJbnN0YW5jZWAsIHdoaWNoXG4gICAgICAvLyB0aGUgc2FuZGJveCBjYW4gZGVmaW5lIGFuZCB3aGljaCByYW4gZm9yIGV2ZXJ5IHZhbHVlIHRoZSBlYXJsaWVyXG4gICAgICAvLyByZWR1Y2VycyBkaWQgbm90IGNsYWltLiBSZWFkcyBiZWxvdyBnbyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGFcbiAgICAgIC8vIGdldHRlciBvbiBhIHN0ZXAgYXJndW1lbnQgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlLnZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCBCT0RZX0lOSVRfU1lNQk9MKTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9OQU1FX1NZTUJPTCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IEV4dHJhY3Q8XG4gICAgICAgIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10sXG4gICAgICAgIHsgbmFtZTogc3RyaW5nIH1cbiAgICAgID4gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9UWVBFX1NZTUJPTCkgYXNcbiAgICAgICAgfCAnYnl0ZXMnXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fRlJBTUlOR19TWU1CT0wpIGFzXG4gICAgICAgIHwgQnl0ZVN0cmVhbUZyYW1pbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2VlIHRoZSBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGFib3ZlIGZvciB3aHkgdGhpcyB3YWxrcyB0aGUgY2hhaW4uXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGUudmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fTkFNRV9TWU1CT0wpIGFzIHN0cmluZztcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wpO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9IHJlYWRQcm9wZXJ0eShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSByZWFkUHJvcGVydHkoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0OiByZWFkIG9ubHkgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBgdmFsdWUuc2lnbmFsYCB3YXMgYSBiYXJlIHJlYWQsIHNvIGEgYHNpZ25hbGAgZ2V0dGVyIG9uIGFueSBvYmplY3RcbiAgICAgIC8vIHJlYWNoaW5nIHRoaXMgcmVkdWNlciBleGVjdXRlZCB1bnJlcG9ydGVkLiBSZWFkIHRocm91Z2ggZGVzY3JpcHRvcnNcbiAgICAgIC8vIGFuZCBnYXRlIG9uIHRoZSBpbmZyYXN0cnVjdHVyZSBzeW1ib2wgLyBwcm90b3R5cGUgZmlyc3QuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaG9sZGVyID0gdmFsdWUgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRIb2xkZXI7XG4gICAgICBjb25zdCBvd25TeW1ib2wgPSByZWFkUHJvcGVydHkodmFsdWUsIEFCT1JUX1NUUkVBTV9OQU1FKTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRDb250cm9sbGVyID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUHJvdG90eXBlLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKG93blN5bWJvbCA9PT0gdW5kZWZpbmVkICYmICFpc05hdGl2ZUFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAvLyBOb3Qgb3VycyBhbmQgbm90IGEgbmF0aXZlIGNvbnRyb2xsZXIsIGJ1dCBhIGZvcmVpZ24gY29udHJvbGxlclxuICAgICAgICAvLyBtYXkgc3RpbGwgY2FycnkgdGhlIHN5bWJvbCBvbiBpdHMgc2lnbmFsLlxuICAgICAgICBjb25zdCBtYXliZVNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmVTaWduYWwgPT09IG51bGwgfHxcbiAgICAgICAgICB0eXBlb2YgbWF5YmVTaWduYWwgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KG1heWJlU2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKCFzaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHNpZ25hbCBhcyBBYm9ydFNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9XG4gICAgICAgIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQUJPUlRfU1RSRUFNX05BTUUpICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0U2lnbmFsID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRTaWduYWxQcm90b3R5cGUudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWhhc0Fib3J0U3ltYm9sICYmICFpc05hdGl2ZUFib3J0U2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZSBhcyBBYm9ydFNpZ25hbCwgdmFsdWUgYXMgQWJvcnRIb2xkZXIpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBgUmVhZGFibGVTdHJlYW1gIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGUgc2FtZSBvcCBmbHVzaCwgc28gaXRzIGZpcnN0IGNodW5rIGNhbiByYWNlXG4gIC8vIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGUgc2luayBzbyB0aGF0IHdyaXRlXG4gIC8vIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPixcbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJlYW0gYWxyZWFkeSBoYXMgdGhlIG5hbWUgc3ltYm9sIHNldCwgaW4gd2hpY2ggY2FzZVxuICAgICAgLy8gaXQncyBhbHJlYWR5IGJlaW5nIHN1bmsgdG8gdGhlIHNlcnZlciBhbmQgd2UgY2FuIHJldHVybiB0aGVcbiAgICAgIC8vIG5hbWUgYW5kIHR5cGUuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBsZXQgdHlwZSA9IHZhbHVlW1NUUkVBTV9UWVBFX1NZTUJPTF07XG4gICAgICAvLyBUaGUgZnJhbWluZyBzeW1ib2wgaXMgc2V0IHdoZW4gYSB3b3JrZmxvdyBWTSByZXZpdmVzIGEgc3RyZWFtXG4gICAgICAvLyBoYW5kbGUgZnJvbSBhIHByZXZpb3VzIHN0ZXAgKHNlZSBgZ2V0V29ya2Zsb3dSZXZpdmVyc2ApLiBXaGVuXG4gICAgICAvLyBwcmVzZW50IHdlIG11c3QgcHJvcGFnYXRlIHRoZSBzYW1lIGZyYW1pbmcgY2hvaWNlIG9uIHRoZSB3YXlcbiAgICAgIC8vIGJhY2sgb3V0LCBzaW5jZSB0aGUgYnl0ZXMgYWxyZWFkeSBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGFyZSBpblxuICAgICAgLy8gdGhhdCBmb3JtYXQ7IHN3aXRjaGluZyBmb3JtYXQgbWlkLXN0cmVhbSB3b3VsZCBjb3JydXB0IHRoZW0uXG4gICAgICBsZXQgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPSB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuXG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuICAgICAgICBmcmFtaW5nID0gdHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcyA/ICdmcmFtZWQtdjEnIDogZnJhbWluZztcblxuICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgaWYgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSB7XG4gICAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgICAgdmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGlmIChmcmFtaW5nKSBzLmZyYW1pbmcgPSBmcmFtaW5nO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIHJlYWRiYWNrT3BzLnB1c2goXG4gICAgICAgICAgbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIHJlYWRiYWNrT3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnblB1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICBdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmRlcGxveW1lbnRJZCA9IGZvcmVpZ25EZXBsb3ltZW50SWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydENvbnRyb2xsZXIgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUuc2lnbmFsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydFNpZ25hbCB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRTaWduYWwpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIENhbmNlbCBkYW5nbGluZyBhYm9ydC1zdHJlYW0gcmVhZGVycyBvbiBhbnkgQWJvcnRDb250cm9sbGVyIGluc3RhbmNlcyBmb3VuZFxuICogaW4gdGhlIGh5ZHJhdGVkIHN0ZXAgYXJndW1lbnRzLiBDYWxsZWQgYWZ0ZXIgdGhlIHN0ZXAgZnVuY3Rpb24gcmV0dXJuc1xuICogKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgdG8gcHJldmVudCByZWFkZXIgcHJvbWlzZXMgZnJvbSBrZWVwaW5nIHRoZSBzZXJ2ZXJsZXNzXG4gKiBmdW5jdGlvbiBhbGl2ZSBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5jZWxBYm9ydFJlYWRlcnMoLi4udmFsdWVzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBXZWFrU2V0KCk7XG4gIGZ1bmN0aW9uIGNhbmNlbElmUHJlc2VudCh2YWw6IEFib3J0SW50ZXJuYWxzKTogdm9pZCB7XG4gICAgY29uc3QgY2FuY2VsID0gdmFsW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICAgIGlmIChjYW5jZWwgJiYgIWNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY2FuY2VsLmFib3J0KCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHdhbGsodmFsOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCBhcyBvYmplY3QpKSByZXR1cm47XG4gICAgdmlzaXRlZC5hZGQodmFsIGFzIG9iamVjdCk7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0Q29udHJvbGxlcikge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscyk7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsLnZhbHVlcygpKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0L1Jlc3BvbnNlIGV4cG9zZSBgc2lnbmFsYC9gYm9keWAgYXMgcHJvdG90eXBlIGdldHRlcnMsIHNvXG4gICAgLy8gT2JqZWN0LnZhbHVlcygpIHdvbid0IGZpbmQgdGhlbS4gRGVzY2VuZCBleHBsaWNpdGx5LlxuICAgIGlmICh0eXBlb2YgUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgd2Fsayh2YWwuc2lnbmFsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2IG9mIE9iamVjdC52YWx1ZXModmFsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgd2Fsayh2KTtcbiAgfVxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB3YWxrKHYpO1xufVxuXG4vKipcbiAqIFNldHMgdXAgYSBzdHJlYW0gcmVhZGVyIG9uIHRoZSBjb250cm9sbGVyIHRoYXQgbGlzdGVucyBmb3IgYW4gYWJvcnQgcGFja2V0LlxuICogUmV0dXJucyB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXIgc28gaXQgY2FuIGJlIHN0b3JlZCBvbiBib3RoIHRoZVxuICogY29udHJvbGxlciBhbmQgc2lnbmFsIGZvciBjbGVhbnVwIGJ5IGNhbmNlbEFib3J0UmVhZGVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICBydW5JZDogc3RyaW5nLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCByZWFkZXJDYW5jZWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgb3BzLnB1c2goXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIHN0cmVhbU5hbWUpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICAgIG5ldyBQcm9taXNlPHsgdmFsdWU6IHVuZGVmaW5lZDsgZG9uZTogdHJ1ZSB9PigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlYWRlckNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyQ2FuY2VsLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAnYWJvcnQnLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmICFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIC8vIEFuIGFib3J0IHBhY2tldCBhcnJpdmVkOiBwcm9wYWdhdGUgaXQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gUmVsZWFzZVxuICAgICAgICAgIC8vIHRoZSBsb2NrIChzeW5jaHJvbm91cykgcmF0aGVyIHRoYW4gY2FuY2VsbGluZyBoZXJlOiBvbiBhXG4gICAgICAgICAgLy8gc2VydmljZS1iYWNrZWQgV29ybGQgYHJlYWRlci5jYW5jZWwoKWAgY2FuIGRvIGEgbmV0d29yayByb3VuZC10cmlwLFxuICAgICAgICAgIC8vIGFuZCBhd2FpdGluZyBpdCBiZWZvcmUgYGNvbnRyb2xsZXIuYWJvcnQoKWAgd291bGQgZGVsYXkgKG9yLCBpZiBpdFxuICAgICAgICAgIC8vIGhhbmdzLCBkcm9wKSByZWFsLXRpbWUgYWJvcnQgZGVsaXZlcnkgdG8gdGhlIGluLWZsaWdodCBzdGVwLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFJlYWRlciBtYXkgYWxyZWFkeSBiZSByZWxlYXNlZDsgaWdub3JlLlxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gSHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSB3cml0ZXIgdXNlZCBzbyB0aGUgcmVhc29uXG4gICAgICAgICAgICAvLyByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eS4gRW5jcnlwdGlvbiBrZXkgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGNvbWVzIGZyb20gdGhlIHN0ZXAgY29udGV4dCwgc2V0IHVwIGJ5IHRoZSBzdGVwIGV4ZWN1dG9yIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhpcyByZWFkZXIgcnVucy4gRmFsbGJhY2sgdG8gdW5kZWZpbmVkIGZvciBleHRlcm5hbC1jb250ZXh0XG4gICAgICAgICAgICAvLyByZXZpdmVzICh0aGUgaHlkcmF0ZSBwYXRoIGlzIGVuY3J5cHRpb24ta2V5LXRvbGVyYW50KS5cbiAgICAgICAgICAgIGNvbnN0IGN0eEZvcktleSA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBjdHhGb3JLZXk/LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydChkYXRhPy5yZWFzb24pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCBmaW5pc2hlZCAob3IgdGhlIHJlYWRlciB3YXMgY2FuY2VsbGVkKSB3aXRob3V0IGFuIGFib3J0LlxuICAgICAgICAgIC8vIENhbmNlbCAobm90IGp1c3QgcmVsZWFzZSkgc28gdGhlIHVuZGVybHlpbmcgV29ybGQgc3RyZWFtIGlzIHRvcm5cbiAgICAgICAgICAvLyBkb3duOiBhIHBvbGxpbmcgV29ybGQgKGUuZy4gd29ybGQtbG9jYWwpIG90aGVyd2lzZSBsZWFrcyBhIHRhaWxcbiAgICAgICAgICAvLyByZWFkZXIgKGEgMTAwbXMgZmlsZXN5c3RlbSBwb2xsIHBsdXMgZW1pdHRlciBsaXN0ZW5lcnMpIHBlciBzdGVwXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIHNpbmNlIGEgc2lnbmFsLWJlYXJpbmcgc3RlcFxuICAgICAgICAgIC8vIG9wZW5zIG9uZSBvZiB0aGVzZSBvbiBldmVyeSByZXZpdmFsIGFuZCB1c3VhbGx5IG5ldmVyIGFib3J0cy4gRmlyZVxuICAgICAgICAgIC8vIGFuZCBmb3JnZXQ6IGEgc2VydmljZS1iYWNrZWQgV29ybGQncyBjYW5jZWwgbWF5IGhpdCB0aGUgbmV0d29yayxcbiAgICAgICAgICAvLyBhbmQgdGhpcyBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBzdGVwJ3Mgb3BzLXNldHRsZSB3aW5kb3cuXG4gICAgICAgICAgdm9pZCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RyZWFtIHJlYWQgZmFpbGVkOiBzaWduYWwgd29uJ3QgcHJvcGFnYXRlIGluIHJlYWwtdGltZSxcbiAgICAgICAgLy8gYnV0IGhvb2stYmFzZWQgcHJvcGFnYXRpb24gb24gbmV4dCByZXBsYXkgcHJvdmlkZXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9KSgpXG4gICk7XG5cbiAgcmV0dXJuIHJlYWRlckNhbmNlbDtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYWJvcnQgc2VyaWFsaXphdGlvbiBzeW1ib2xzIGFuZCB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXJcbiAqIG9uIGJvdGggdGhlIGNvbnRyb2xsZXIgYW5kIGl0cyBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHRhZ0Fib3J0UGFpcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICB2YWx1ZTogeyBzdHJlYW1OYW1lOiBzdHJpbmc7IGhvb2tUb2tlbjogc3RyaW5nIH0sXG4gIHJlYWRlckNhbmNlbD86IEFib3J0Q29udHJvbGxlclxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZ2dlZENvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCB0YWdnZWRTaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHZhbHVlLnN0cmVhbU5hbWU7XG4gIHRhZ2dlZENvbnRyb2xsZXJbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIHRhZ2dlZFNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIGlmIChyZWFkZXJDYW5jZWwpIHtcbiAgICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gcmVhZGVyQ2FuY2VsO1xuICAgIHRhZ2dlZFNpZ25hbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIGZyb20gb25lIHNpZ25hbCB0byBhbm90aGVyLiBVc2VkIGJ5IHRoZVxuICogUmVxdWVzdCByZXZpdmVyIGJlY2F1c2UgYG5ldyBSZXF1ZXN0KHVybCwgeyBzaWduYWwgfSlgIGNvcGllcyB0aGUgc2lnbmFsXG4gKiBpbnRlcm5hbGx5OiB0aGUgY29uc3RydWN0ZWQgYHJlcXVlc3Quc2lnbmFsYCBpcyBhIGZyZXNoIEFib3J0U2lnbmFsIHRoYXRcbiAqIGRvZXNuJ3QgY2Fycnkgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBYm9ydEludGVybmFscyhzcmM6IEFib3J0U2lnbmFsLCBkZXN0OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBzID0gc3JjIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGNvbnN0IGQgPSBkZXN0IGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGlmIChzW0FCT1JUX1NUUkVBTV9OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgfVxuICBpZiAoc1tBQk9SVF9IT09LX1RPS0VOXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9IT09LX1RPS0VOXSA9IHNbQUJPUlRfSE9PS19UT0tFTl07XG4gIH1cbiAgaWYgKHNbQUJPUlRfUkVBREVSX0NBTkNFTF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSBzW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBYm9ydENvbnRyb2xsZXIgd2l0aCBzdHJlYW0tYmFja2VkIGFib3J0IHByb3BhZ2F0aW9uLlxuICogVXNlZCBieSBzdGVwIGFuZCBleHRlcm5hbCByZXZpdmVycyB3aGVyZSByZWFsIGFib3J0IHNpZ25hbCBiZWhhdmlvciBpcyBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcmlhbGl6ZWQgYWJvcnQgY29udHJvbGxlci9zaWduYWwgZGF0YVxuICogQHBhcmFtIG9wcyAtIFRoZSBvcHMgYXJyYXkgZm9yIHRyYWNraW5nIGFzeW5jIHdvcmtcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKGZvciBzdHJlYW0gcmVhZHMpXG4gKiBAcmV0dXJucyBBIHJlYWwgQWJvcnRDb250cm9sbGVyIHdpdGggcGF0Y2hlZCBhYm9ydCgpIG1ldGhvZFxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydENvbnRyb2xsZXIoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydENvbnRyb2xsZXInXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgYWJvcnQoKSB0byBhbHNvIHdyaXRlIHN0cmVhbSArIHJlc3VtZSBob29rIChmb3Igc3RlcC1pbml0aWF0ZWQgYWJvcnQpXG4gIGNvbnN0IG9yaWdpbmFsQWJvcnQgPSBjb250cm9sbGVyLmFib3J0LmJpbmQoY29udHJvbGxlcik7XG4gIGNvbnRyb2xsZXIuYWJvcnQgPSAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgb3JpZ2luYWxBYm9ydChyZWFzb24pO1xuXG4gICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgub3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCB0aHJvdWdoIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgaG9va1xuICAgICAgICAgICAgLy8gZXZlbnQgdXNlcyBzbyB0aGUgYHJlYXNvbmAgcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHlcbiAgICAgICAgICAgIC8vIChET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3NcbiAgICAgICAgICAgIC8vIGVuY3J5cHRpb24ga2V5LCBzeW1tZXRyaWMgd2l0aCB3aGF0IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHdyaXRlcyBmb3Igd29ya2Zsb3ctaW5pdGlhdGVkIGFib3J0cy5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9LFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIGN0eC53b3JrZmxvd01ldGFkYXRhLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLnN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWx1ZS5ob29rVG9rZW4pIHtcbiAgICAgICAgLy8gVGhlIGR1cmFibGUgaG9vayByZXN1bWUgKHdoaWNoIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IHRoYXRcbiAgICAgICAgLy8gcmVjb3JkcyB0aGlzIGFib3J0IGluIHRoZSB3b3JrZmxvdydzIGV2ZW50IGxvZykgbXVzdCBiZSBjb21taXR0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGVwIGNvbXBsZXRlcy4gT3RoZXJ3aXNlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb25cbiAgICAgICAgLy8gZW5xdWV1ZWQgYnkgYHN0ZXBfY29tcGxldGVkYCBjYW4gYWR2YW5jZSBwYXN0IHRoZSBhYm9ydCAoZGlzcGF0Y2hpbmdcbiAgICAgICAgLy8gYSBsYXRlciBzdGVwIHdpdGggYSBzdGFsZSwgbm9uLWFib3J0ZWQgYHNpZ25hbGApIGJlZm9yZSB0aGUgZXZlbnRcbiAgICAgICAgLy8gZXhpc3RzLiBSb3V0ZSBpdCB0byBgcHJlQ29tcGxldGlvbk9wc2AgKGF3YWl0ZWQgaW5saW5lIGJlZm9yZVxuICAgICAgICAvLyBjb21wbGV0aW9uKSByYXRoZXIgdGhhbiBgb3BzYCAoYmVzdC1lZmZvcnQsIGJhY2tncm91bmQpLiBUaGUgc3RyZWFtXG4gICAgICAgIC8vIHdyaXRlIGFib3ZlIHN0YXlzIGluIGBvcHNgOiBpdCBtdXN0IGZpcmUgQVNBUCB0byByZWFjaCBhbiBpbi1mbGlnaHRcbiAgICAgICAgLy8gc2libGluZyBzdGVwIGFuZCBpcyBub3QgdGhlIGR1cmFibGUgcmVjb3JkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTd2FsbG93IGVycm9ycyBoZXJlIHNvIHRoZSBwcm9taXNlIGNhbiBvbmx5IGV2ZXIgZW5mb3JjZSBvcmRlcmluZ1xuICAgICAgICAvLyB3aGVuIGF3YWl0ZWQgKHNlZSB0aGUgbm8tcmVqZWN0IGNvbnRyYWN0IG9uXG4gICAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpOyBhIGZhaWxlZCByZXN1bWUgcmV0cmllcyBvbiBuZXh0IHJlcGxheS5cbiAgICAgICAgY29uc3QgaG9va1Jlc3VtZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzdW1lSG9vayB9ID0gYXdhaXQgaW1wb3J0KCcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2sodmFsdWUuaG9va1Rva2VuLCB7XG4gICAgICAgICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgaG9vayByZXN1bWU6IHJldHJ5IG9uIG5leHQgcmVwbGF5XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICBjdHgucHJlQ29tcGxldGlvbk9wcy5wdXNoKGhvb2tSZXN1bWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY29udHJvbGxlcjtcbn1cblxuLyoqXG4gKiBSZXZpdmVzIG9ubHkgYW4gQWJvcnRTaWduYWwgd2l0aG91dCB0aGUgcGF0Y2hlZCBhYm9ydCgpIG92ZXJoZWFkLlxuICogVXNlZCB3aGVuIG9ubHkgYSBzaWduYWwgKG5vdCBhIGNvbnRyb2xsZXIpIHdhcyBzZXJpYWxpemVkLlxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydFNpZ25hbChcbiAgdmFsdWU6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0Fib3J0U2lnbmFsJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydFNpZ25hbCB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xufVxuXG4vKipcbiAqIEJhc2UgcmV2aXZlcnMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBib3VuZGFyaWVzLlxuICogQ29tcG9zZXM6IGNsYXNzICsgY29tbW9uIHJldml2ZXJzIGZyb20gdGhlIG1vZHVsYXIgbW9kdWxlcy5cbiAqXG4gKiBUaGlzIGlzIGV4cG9ydGVkIGJlY2F1c2Ugc2VyaWFsaXphdGlvbi1mb3JtYXQudHMgYW5kIG90aGVyIGZpbGVzIHJlZmVyZW5jZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJldml2ZXJzKGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKGdsb2JhbCksXG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnNGcm9tTW9kdWxlKGdsb2JhbCksXG4gIH0gYXMgY29uc3Qgc2F0aXNmaWVzIFBhcnRpYWw8UmV2aXZlcnM+O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBvd25lcidzIGVuY3J5cHRpb24ga2V5LCBwcmVmZXJyaW5nIGl0cyBwdWJsaWMga2V5LCB0aGVuIGl0c1xuICogZGVwbG95bWVudCwgYW5kIGZpbmFsbHkgaXRzIHJ1biByZWNvcmQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGVuY3J5cHRpb25QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG93bmVyUHVibGljS2V5ID0gZGVjb2RlUnVuUHVibGljS2V5KGVuY3J5cHRpb25QdWJsaWNLZXkpO1xuICBpZiAob3duZXJQdWJsaWNLZXkpIHJldHVybiBzZWFsVG8ob3duZXJQdWJsaWNLZXkpO1xuXG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCByYXdLZXkgPSBkZXBsb3ltZW50SWRcbiAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4ocnVuSWQsIHsgZGVwbG95bWVudElkIH0pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKSk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5LCBbJ2VuY3J5cHQnXSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUYWdzIGEgZm9yd2FyZGVkIHdyaXRhYmxlIHdpdGggaXRzIG93bmVyJ3MgbWV0YWRhdGEuIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ0ZvcndhcmRlZFdyaXRhYmxlVGFyZ2V0KFxuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW0sXG4gIHtcbiAgICBkZXBsb3ltZW50SWQsXG4gICAgZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgfTogeyBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7IGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmcgfVxuKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgZGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGRlcGxveW1lbnRJZCxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLCB7XG4gICAgICB2YWx1ZTogZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogQ3JlYXRlcyBhbmQgdGFncyBhIGZvcndhcmRlZCB3cml0YWJsZSB0YXJnZXRpbmcgdGhlIG93bmVyIHJ1bi4gQGludGVybmFsICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9yd2FyZGVkV3JpdGFibGU8VyA9IGFueT4oe1xuICBnbG9iYWwsXG4gIG9wcyxcbiAgcnVuSWQsXG4gIG5hbWUsXG4gIGtleSxcbiAgZGVwbG95bWVudElkLFxuICBlbmNyeXB0aW9uUHVibGljS2V5LFxuICBydW5SZWFkeUJhcnJpZXIsXG59OiB7XG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3BzOiBQcm9taXNlPGFueT5bXTtcbiAgcnVuSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBrZXk6IEVuY3J5cHRpb25LZXlQYXJhbTtcbiAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xufSk6IFdyaXRhYmxlU3RyZWFtPFc+IHtcbiAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpLFxuICAgIGtleVxuICApO1xuICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgIHJ1bklkLFxuICAgIG5hbWUsXG4gICAgcnVuUmVhZHlCYXJyaWVyXG4gICk7XG5cbiAgLy8gTG9jayByZWxlYXNlIG11c3Qgc2V0dGxlIHRoZSBmbHVzaCBwcm9taXNlOyBjb250cmlidXRvcnMgZG8gbm90IGNsb3NlLlxuICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICB9KTtcblxuICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgIHZhbHVlOiBuYW1lLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCwge1xuICAgIHZhbHVlOiBydW5JZCxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gIH0pO1xuICB0YWdGb3J3YXJkZWRXcml0YWJsZVRhcmdldChzZXJpYWxpemUud3JpdGFibGUsIHtcbiAgICBkZXBsb3ltZW50SWQsXG4gICAgZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgfSk7XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZSBhcyBXcml0YWJsZVN0cmVhbTxXPjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBydW4ncyBvYmplY3QgcmVhZGFibGUgd2l0aG91dCBkaXNwYXRjaGluZyBpdHMgc3RyZWFtIEdFVCBvclxuICogZW5jcnlwdGlvbi1rZXkgbG9va3VwIHVudGlsIHRoZSBjYWxsZXIgcmVhZHMgaXQuIFRoZSBleHRlcm5hbCByZXZpdmVyIHN0YXJ0c1xuICogaXRzIGJhY2tncm91bmQgcGlwZSBpbW1lZGlhdGVseSwgc28gdGhpcyBib3VuZGFyeSBiZWxvbmdzIGhlcmXigJRuZXh0IHRvIHRoZVxuICogc291cmNlL3RyYW5zZm9ybSBhc3NlbWJseeKAlHJhdGhlciB0aGFuIGluIGBSdW5gLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuUmVhZGFibGVTdHJlYW08VD4oXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogUmVhZGFibGVTdHJlYW08VD4ge1xuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VD4gfCB1bmRlZmluZWQ7XG4gIGxldCBsb2NrU3RhdGU6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZsdXNoYWJsZVN0YXRlPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxvY2tQb2xsaW5nU3RhcnRlZCA9IGZhbHNlO1xuICBsZXQgdXNlclJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxUPjtcblxuICB1c2VyUmVhZGFibGUgPSBuZXcgUmVhZGFibGVTdHJlYW08VD4oXG4gICAge1xuICAgICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBjcnlwdG9LZXksIHtcbiAgICAgICAgICAgICAgb25SZWFkYWJsZVN0YXRlOiAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NrU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLlJlYWRhYmxlU3RyZWFtISh7IG5hbWUsIHN0YXJ0SW5kZXggfSkgYXMgUmVhZGFibGVTdHJlYW08VD47XG4gICAgICAgICAgICByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICBpZiAobG9ja1N0YXRlICYmICFsb2NrUG9sbGluZ1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgbG9ja1BvbGxpbmdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gVGhlIGNhbGxlciBvd25zIHRoaXMgd3JhcHBlcidzIHJlYWRlciwgc28gcG9sbGluZyBpdCBwcmVzZXJ2ZXNcbiAgICAgICAgICAgICAgLy8gdGhlIGRvY3VtZW50ZWQgcmVsZWFzZUxvY2soKSBjb21wbGV0aW9uIHNpZ25hbC5cbiAgICAgICAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIGxvY2tTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgZWxzZSBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbChyZWFzb24pIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyPy5jYW5jZWwocmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gQSBwb3NpdGl2ZSBkZWZhdWx0IGhpZ2gtd2F0ZXIgbWFyayB3b3VsZCBydW4gcHVsbCBhdCBjb25zdHJ1Y3Rpb24gdG9cbiAgICAvLyBmaWxsIHRoZSBxdWV1ZSwgdHVybmluZyBhbiB1bnJlYWQgUnVuLmdldFJlYWRhYmxlKCkgaW50byBJL08uXG4gICAgeyBoaWdoV2F0ZXJNYXJrOiAwIH1cbiAgKTtcbiAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGV4dGVybmFsbHkgcmV2aXZlZCBvYmplY3Qgc3RyZWFtcy4gQGludGVybmFsICovXG50eXBlIEV4dGVybmFsUmV2aXZlck9wdGlvbnMgPSB7XG4gIC8qKiBSZWNlaXZlcyBjb21wbGV0aW9uIHN0YXRlIHdoZW4gYSB3cmFwcGVyIG93bnMgdGhlIHB1YmxpYyByZWFkYWJsZS4gKi9cbiAgb25SZWFkYWJsZVN0YXRlPzogKHN0YXRlOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVGbHVzaGFibGVTdGF0ZT4pID0+IHZvaWQ7XG59O1xuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsXG4gKiByZWNlaXZpbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBvcHRpb25zPzogRXh0ZXJuYWxSZXZpdmVyT3B0aW9uc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG5cbiAgICAvLyBTdGVwRnVuY3Rpb24gc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cyB0byBjbGllbnRzXG4gICAgU3RlcEZ1bmN0aW9uOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAnU3RlcCBmdW5jdGlvbnMgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBpbiBjbGllbnQgY29udGV4dC4gU3RlcCBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cy4nLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ0Egc3RlcCBmdW5jdGlvbiByZWZlcmVuY2UgcmVhY2hlZCB0aGUgY2xpZW50LiBSZXR1cm4gYSBzZXJpYWxpemFibGUgdmFsdWUgKGUuZy4gdGhlIHN0ZXAgcmVzdWx0KSBpbnN0ZWFkIG9mIHRoZSBzdGVwIGl0c2VsZi4nLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ICYgeyBkdXBsZXg/OiBzdHJpbmcgfSA9IHtcbiAgICAgICAgbWV0aG9kOiB2YWx1ZS5tZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICB9O1xuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgaW5pdC5zaWduYWwgPSB2YWx1ZS5zaWduYWw7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IGdsb2JhbC5SZXF1ZXN0KHZhbHVlLnVybCwgaW5pdCk7XG4gICAgICAvLyBUaGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGludGVybmFsIHNpZ25hbCBjb3B5LCBzbyB0aGVcbiAgICAgIC8vIGFib3J0LWludGVybmFsIHN5bWJvbHMgc2V0IGJ5IHJldml2ZUFib3J0U2lnbmFsIGRvbid0IHByb3BhZ2F0ZS5cbiAgICAgIC8vIFJlLXRhZyB0aGUgcmVxdWVzdCdzIG93biBzaWduYWwgc28gY2FuY2VsQWJvcnRSZWFkZXJzIGNhbiBmaW5kIGl0LlxuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgY29weUFib3J0SW50ZXJuYWxzKHZhbHVlLnNpZ25hbCwgcmVxdWVzdC5zaWduYWwpO1xuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIG91dHNpZGUgdGhlIHdvcmtmbG93XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAvLyBGb3IgYnl0ZSBzdHJlYW1zLCB1c2UgZmx1c2hhYmxlIHBpcGUgd2l0aCBsb2NrIHBvbGxpbmcuXG4gICAgICAgIC8vIElmIHRoZSBwcm9kdWNlciB3cm90ZSBmcmFtZWQgYnl0ZXMgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSxcbiAgICAgICAgLy8gdW53cmFwIHRoZSBsZW5ndGgtcHJlZml4IGVudmVsb3BlIGJlZm9yZSBoYW5kaW5nIGNodW5rcyB0b1xuICAgICAgICAvLyB0aGUgdXNlci4gQWJzZW50IC8gJ3JhdycgZnJhbWluZyBtZWFucyBsZWdhY3kgcmF3IGJ5dGVzOlxuICAgICAgICAvLyBwaXBlIHRocm91Z2ggdW5jaGFuZ2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm8gYXV0by1yZWNvbm5lY3QgaGVyZSB5ZXQ6IHJhdyBieXRlIHN0cmVhbXMgaGF2ZSBubyB3aXJlXG4gICAgICAgIC8vIGZyYW1pbmcgdG8gY291bnQgY29uc3VtZWQgY2h1bmtzIHdpdGguIEZyYW1lZC12MSBieXRlIHN0cmVhbXNcbiAgICAgICAgLy8gbWFrZSBmcmFtZSBjb3VudGluZyBwb3NzaWJsZSwgc28gZXh0ZW5kaW5nIHRoZSByZWNvbm5lY3RpbmdcbiAgICAgICAgLy8gcmVhZGVyIHRvIHRoZW0gaXMgYSBzZXBhcmF0ZSBmb2xsb3ctdXAuXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdmFsdWUubmFtZSxcbiAgICAgICAgICB2YWx1ZS5zdGFydEluZGV4XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGlyZWN0IHJldml2ZXIgY2FsbGVycyBob2xkIHRoaXMgcmVhZGFibGUuIEEgZnV0dXJlIHB1YmxpYyB3cmFwcGVyXG4gICAgICAgIC8vIGNhbiBwcm92aWRlIHRoZSBzdGF0ZSBhbmQgcG9sbCB0aGUgcmVhZGFibGUgaXQgaGFuZHMgdG8gdGhlIGNhbGxlci5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm9uUmVhZGFibGVTdGF0ZSkgb3B0aW9ucy5vblJlYWRhYmxlU3RhdGUoc3RhdGUpO1xuICAgICAgICBlbHNlIHBvbGxSZWFkYWJsZUxvY2sodXNlclJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vbi1ieXRlIHN0cmVhbXMgY2FycnkgbGVuZ3RoLXByZWZpeGVkIGZyYW1lcywgc28gd2UgY2FuIGNvdW50XG4gICAgICAgIC8vIGNvbXBsZXRlZCBmcmFtZXMgYW5kIHRyYW5zcGFyZW50bHkgcmVjb25uZWN0IHdoZW4gdGhlIHNlcnZlclxuICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGlvbiB0aW1lcyBvdXQgbWlkLXJ1bi5cbiAgICAgICAgLy8gTWVtb2l6ZSB0aGlzIHJlc29sdmVyIHBlciByZWFkYWJsZSBzZXNzaW9uLiBUaGUgZmlyc3QgcmF3IHB1bGxcbiAgICAgICAgLy8gc3RhcnRzIGl0IGNvbmN1cnJlbnRseSB3aXRoIHRoZSBzdHJlYW0gR0VUOyBnZXREZXNlcmlhbGl6ZVN0cmVhbVxuICAgICAgICAvLyBqb2lucyB0aGUgc2FtZSBwcm9taXNlIHdoZW4gYW4gZW5jcnlwdGVkIGZyYW1lIGFycml2ZXMuIFRoaXMgYWxzb1xuICAgICAgICAvLyBhdm9pZHMgaW52b2tpbmcgYXJiaXRyYXJ5IEVuY3J5cHRpb25LZXlQYXJhbSBjYWxsYmFja3MgdHdpY2UuXG4gICAgICAgIGxldCBrZXlQcm9taXNlOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCByZXNvbHZlS2V5ID0gKCk6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgIGtleVByb21pc2UgPz89IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAgcmV0dXJuIGtleVByb21pc2U7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleCxcbiAgICAgICAgICByZXNvbHZlS2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgIGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCByZXNvbHZlS2V5KSxcbiAgICAgICAgICByZXNvbHZlS2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGlyZWN0IHJldml2ZXIgY2FsbGVycyBob2xkIHRoaXMgcmVhZGFibGUuIFRoZSBwdWJsaWMgUnVuIGZhY3RvcnlcbiAgICAgICAgLy8gd3JhcHMgaXQgZm9yIGZpcnN0LXB1bGwgbGF6aW5lc3MgYW5kIHBvbGxzIHRoYXQgd3JhcHBlciBpbnN0ZWFkLlxuICAgICAgICBpZiAob3B0aW9ucz8ub25SZWFkYWJsZVN0YXRlKSBvcHRpb25zLm9uUmVhZGFibGVTdGF0ZShzdGF0ZSk7XG4gICAgICAgIGVsc2UgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZSBoYW5kbGluZyBhcyBgZ2V0U3RlcFJldml2ZXJzLldyaXRhYmxlU3RyZWFtYDogc2VlIGNvbW1lbnRzXG4gICAgICAvLyB0aGVyZSBmb3IgdGhlIGNyb3NzLXJ1biBjYXNlICh3cml0YWJsZSBjYXJyaWVzIGBydW5JZGAgZnJvbVxuICAgICAgLy8gcGFyZW50IOKGkiBjaGlsZCBmb3J3YXJkaW5nIHZpYSBgc3RhcnQoKWApLlxuICAgICAgY29uc3QgdGFyZ2V0UnVuSWQgPSB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnID8gdmFsdWUucnVuSWQgOiBydW5JZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICAgKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUZvcndhcmRlZFdyaXRhYmxlKHtcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAga2V5OiB0YXJnZXRLZXksXG4gICAgICAgIGRlcGxveW1lbnRJZDogdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5OiB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIGNsaWVudCBzaWRlLCBhbmQgcmV0dXJuIHZhbHVlc1xuICogZnJvbSB0aGUgc3RlcHMuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IC0gdXNlcyB0aGUgbW9kdWxhciByZXZpdmVyXG4gICAgLy8gd2hpY2ggY2FsbHMgV09SS0ZMT1dfVVNFX1NURVAgZnJvbSBnbG9iYWwgdG8gcmVjb25zdHJ1Y3Qgc3RlcCBwcm94aWVzXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVxdWVzdC5wcm90b3R5cGUpO1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICAodmFsdWUgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICAodmFsdWUgYXMgYW55KS5yZXNwb25kV2l0aCA9ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ2ByZXNwb25kV2l0aCgpYCBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHN0ZXAgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ01vdmUgdGhlIGByZXNwb25kV2l0aCguLi4pYCBjYWxsIGluc2lkZSBhIGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uIOKAlCBpdCBjYW5ub3QgYmUgaW52b2tlZCBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICAvLyBXb3JrZmxvdyBmdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0OiByZXR1cm5zIGEgZnVuY3Rpb24tbGlrZVxuICAgIC8vIG9iamVjdCB3aXRoIC53b3JrZmxvd0lkIHRoYXQgbWltaWNzIHdoYXQgdGhlIFNXQyBjb21waWxlciBwcm9kdWNlcyxcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBCb2R5SW5pdCB0aGF0IHNob3VsZCBiZSB3cmFwcGVkIGluIGEgZmFrZSBzdHJlYW1cbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIHRoZSBmYWtlIHN0cmVhbSB3aXRoIHRoZSBCb2R5SW5pdFxuICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuYm9keUluaXQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ3VsYXIgc3RyZWFtIGhhbmRsaW5nXG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBbU1RSRUFNX1RZUEVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FycnkgdGhlIHdpcmUtZnJhbWluZyBkZWNpc2lvbiB0aHJvdWdoIHRoZSB3b3JrZmxvdyBWTSBzb1xuICAgICAgICAvLyB0aGF0IHdoZW4gdGhlIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwICh3aGljaCByZWFkc1xuICAgICAgICAvLyB0aGUgYWN0dWFsIGJ5dGVzIGZyb20gdGhlIHNlcnZlcikgd2Uga25vdyB3aGV0aGVyIHRvIHVuZnJhbWUuXG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHVuZGVmaW5lZCBmb3Igc3RyZWFtcyB3aG9zZSBzZXJpYWxpemVkIHJlZiBkaWRuJ3RcbiAgICAgICAgLy8gY2FycnkgdGhlIGZpZWxkOyB0aG9zZSBhcmUgdHJlYXRlZCBhcyBsZWdhY3kgcmF3IGJ5dGVzLlxuICAgICAgICBbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5mcmFtaW5nLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yTWFwID0ge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZCwgaWYgcHJlc2VudCwgc28gdGhhdCB3aGVuIHRoZVxuICAgICAgLy8gaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgdGhlIHdvcmtmbG93IHJlZHVjZXIgY2FuXG4gICAgICAvLyBmb3J3YXJkIGl0IHRocm91Z2ggdG8gdGhlIHN0ZXAgcmV2aXZlci5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUucnVuSWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3duZXIncyBwdWJsaWMga2V5IGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHJ1bklkXG4gICAgICAvLyBhYm92ZS4gV2l0aG91dCBpdCwgZm9yd2FyZGluZyBhIHdyaXRhYmxlIHRocm91Z2ggYSB3b3JrZmxvdyB0byBhIHN0ZXBcbiAgICAgIC8vIHNpbGVudGx5IGRyb3BzIHRoZSBrZXksIGFuZCB0aGUgc3RlcCBmYWxscyBiYWNrIHRvIGZldGNoaW5nIHRoZVxuICAgICAgLy8gb3duZXIncyBzeW1tZXRyaWMga2V5LCB0aGUgcm91bmQgdHJpcCBzZWFsaW5nIGV4aXN0cyB0byByZW1vdmUuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXksXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgZGVzY3JpcHRvcik7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZXZpdmVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0uIFVzZSB0aGVcbiAgICAvLyByZWFsIFdvcmtmbG93QWJvcnRTaWduYWwgY2xhc3Mgc28gYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbikgYWN0dWFsbHlcbiAgICAvLyBmaXJlcyB3aGVuIHRoZSBzaWduYWwgYWJvcnRzICh0aGUgcHJldmlvdXMgbm8tb3Agc3R1YiBzaWxlbnRseSBkcm9wcGVkXG4gICAgLy8gbGlzdGVuZXIgcmVnaXN0cmF0aW9ucywgYSBzaWxlbnQgY29ycmVjdG5lc3MgYnVnIGZvciBuYXR1cmFsIHBhdHRlcm5zXG4gICAgLy8gbGlrZSBgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pYCBhZnRlciByZWNlaXZpbmcgYSBkZXNlcmlhbGl6ZWRcbiAgICAvLyBzaWduYWwpLiBUaGUgc2lnbmFsIGRvZXMgbm90IG93biBhIGhvb2sgc3Vic2NyaXB0aW9uIGhlcmU7IGFib3J0IHN0YXRlXG4gICAgLy8gaXMgZGVsaXZlcmVkIHZpYSB0aGUgZXhpc3RpbmcgcmVwbGF5IG1hY2hpbmVyeSBvbiB0aGUgc291cmNlIHNpZGUuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQUJPUlRfU1RSRUFNX05BTUVdOiB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICB9O1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmcsXG4gIHN0cmVhbVN0YXRlcz86IEZsdXNoYWJsZVN0cmVhbVN0YXRlW11cbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHN0ZXAgY29udGV4dCAtIHJldHVybnMgcmF3IHN0ZXAgZnVuY3Rpb25cbiAgICAvLyB3aXRoIGNsb3N1cmUgdmFyaWFibGUgc3VwcG9ydCB2aWEgQXN5bmNMb2NhbFN0b3JhZ2UuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGZvdXIgaW5kZXBlbmRlbnQgZmxhZ3MgZnJvbSB0aGUgc2VyaWFsaXplZCBwYXlsb2FkOlxuICAgIC8vICAgLSBgY2xvc3VyZVZhcnNgOiBpbnZva2UgdGhlIGJvZHkgaW5zaWRlIGFuIEFzeW5jTG9jYWxTdG9yYWdlIGZyYW1lXG4gICAgLy8gICAgIHNvIHRoZSBTV0MtZW1pdHRlZCBgV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VgIElJRkUgaW4gdGhlXG4gICAgLy8gICAgIGhvaXN0ZWQgYm9keSBjYW4gcHVsbCB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgYmFjayBvdXQuXG4gICAgLy8gICAtIGBib3VuZFRoaXNgOiAgIGEgYHRoaXNgIHZhbHVlIGNhcHR1cmVkIGJ5XG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZSAobGV4aWNhbC1gdGhpc2BcbiAgICAvLyAgICAgYXJyb3cgc3RlcHMpLiBUaGUgd3JhcHBlciBpbnZva2VzIHRoZSBib2R5IHZpYVxuICAgIC8vICAgICBgc3RlcEZuLmFwcGx5KGJvdW5kVGhpcywgYXJncylgIHNvIHRoZSBib2R5IHNlZXMgdGhlIHNhbWVcbiAgICAvLyAgICAgYHRoaXNgIGl0IHdvdWxkIGhhdmUgaGFkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUuIFByb3BlcnR5XG4gICAgLy8gICAgIHByZXNlbmNlLCBub3QgdHJ1dGhpbmVzcywgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZVxuICAgIC8vICAgICBgYmluZChudWxsKWAgYW5kIGBiaW5kKHVuZGVmaW5lZClgIGFyZSBib3RoIGxlZ2FsIGFuZCBzaG91bGRcbiAgICAvLyAgICAgcm91bmQtdHJpcCBmYWl0aGZ1bGx5LlxuICAgIC8vICAgLSBgYm91bmRBcmdzYDogICBwcmVmaWxsZWQgYXJncyBmcm9tXG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzQXJnLCB4LCB5KWAuIFByZXBlbmRlZCB0byB0aGUgY2FsbCBhcmdzXG4gICAgLy8gICAgIHNvIHBhcnRpYWwgYXBwbGljYXRpb24gc3Vydml2ZXMgc2VyaWFsaXphdGlvbi5cbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc3RlcElkID0gdmFsdWUuc3RlcElkO1xuICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSB2YWx1ZS5jbG9zdXJlVmFycztcbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdib3VuZFRoaXMnIGluIHZhbHVlO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzID8gdmFsdWUuYm91bmRUaGlzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG5cbiAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwSWQpO1xuICAgICAgaWYgKCFzdGVwRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgU3RlcCBmdW5jdGlvbiBcIiR7c3RlcElkfVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBzdGVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnTWFrZSBzdXJlIHRoZSBzdGVwIGZpbGUgaXMgaW5jbHVkZWQgaW4geW91ciBidWlsZCAoaS5lLiBpdCBpcyBsaXN0ZWQgaW4gdGhlIHdvcmtmbG93IG1hbmlmZXN0KSwgYW5kIHRoYXQgdGhlIFNXQyBwbHVnaW4gaXMgY29uZmlndXJlZCBmb3IgdGhlIGZpbGUuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogbm90aGluZyB0byB3cmFwLlxuICAgICAgaWYgKCFjbG9zdXJlVmFycyAmJiAhaGFzQm91bmRUaGlzICYmIGJvdW5kQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlZFN0ZXBGbiA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBjYWxsVGhpcyA9IGhhc0JvdW5kVGhpcyA/IGJvdW5kVGhpcyA6IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxBcmdzID0gYm91bmRBcmdzLmxlbmd0aCA+IDAgPyBbLi4uYm91bmRBcmdzLCAuLi5hcmdzXSA6IGFyZ3M7XG4gICAgICAgIGlmIChjbG9zdXJlVmFycykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgY2FsbCBzdGVwIGZ1bmN0aW9uIHdpdGggY2xvc3VyZSB2YXJpYWJsZXMgb3V0c2lkZSBzdGVwIGNvbnRleHQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjbG9zdXJlVmFycyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjb250ZXh0U3RvcmFnZS5ydW4obmV3Q29udGV4dCwgKCkgPT5cbiAgICAgICAgICAgIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncyk7XG4gICAgICB9IGFzIGFueTtcblxuICAgICAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gb3JpZ2luYWwgc3RlcCBmdW5jdGlvblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICduYW1lJywge1xuICAgICAgICB2YWx1ZTogc3RlcEZuLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnc3RlcElkJywge1xuICAgICAgICB2YWx1ZTogc3RlcElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAoc3RlcEZuLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cmFwcGVkU3RlcEZuLm1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZWRTdGVwRm47XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGggPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JpdGVyID0gcmVzcG9uc2VXcml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVzcG9uc2UpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIGluIHRoZSBzdGVwIGVudmlyb25tZW50XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyIHN0ZXAuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlczpcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCBkZXBsb3ltZW50SWQpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZS1ydW4gY2FzZTogdGhlIHdyaXRhYmxlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcnVuLiBVc2UgdGhlXG4gICAgICAvLyBsb2NhbCBjcnlwdG9LZXkgYW5kIHdyaXRlIHRvIHRoZSBsb2NhbCBydW5JZCdzIHNlcnZlciBzdHJlYW0uXG4gICAgICAvL1xuICAgICAgLy8gQ3Jvc3MtcnVuIGNhc2UgKHBhcmVudCDihpIgY2hpbGQgdmlhIGBzdGFydCgpYCk6IHRoZSBkZXNjcmlwdG9yXG4gICAgICAvLyBjYXJyaWVzIHRoZSBvcmlnaW5hbCBgcnVuSWRgIGFuZCBgbmFtZWAuIE9wZW4gYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZSBUSEFUIHJ1bidzIGtleVxuICAgICAgLy8gZm9yIGVuY3J5cHRpb24uIFRoZSByZXNvbHV0aW9uIGlzIGFzeW5jIGJ1dCBkb2Vzbid0IG5lZWQgdG9cbiAgICAgIC8vIGJsb2NrIHJldml2ZXIgcmV0dXJuOiBgZ2V0U2VyaWFsaXplU3RyZWFtYCBhY2NlcHRzIHRoZVxuICAgICAgLy8gYFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPmAgZGlyZWN0bHkgYW5kIGF3YWl0cyBpdCBsYXppbHlcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBjaHVuayB3cml0dGVuLiBUaGUga2V5IGlzIGltcG9ydGVkIGVuY3J5cHQtb25seVxuICAgICAgLy8gc28gdGhlIHJlY2VpdmluZyBydW4gY2FuIG5ldmVyIGRlY3J5cHQgYW55dGhpbmcgZWxzZSBvbiB0aGVcbiAgICAgIC8vIG93bmluZyBydW4ncyBzdHJlYW07IGl0IGNhbiBvbmx5IGNvbnRyaWJ1dGUgbmV3IHdyaXRlcy5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXREZXBsb3ltZW50SWQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUuZGVwbG95bWVudElkXG4gICAgICAgICAgOiB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICAgID8gZGVwbG95bWVudElkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgICAgICAgIHRhcmdldERlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIHN0YXRlLmRlZmVyUmVsZWFzZVNldHRsZW1lbnQgPSBzdHJlYW1TdGF0ZXMgIT09IHVuZGVmaW5lZDtcbiAgICAgIHN0cmVhbVN0YXRlcz8ucHVzaChzdGF0ZSk7XG4gICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICBmbHVzaGFibGVQaXBlKHNlcmlhbGl6ZS5yZWFkYWJsZSwgc2VydmVyV3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gVHJhY2sgY29tcGxldGVkIHVzZXIgd3JpdGVzIGluZGVwZW5kZW50bHkgb2YgbG9jayByZWxlYXNlLlxuICAgICAgY29uc3Qgd3JpdGFibGUgPSB0cmFja0ZsdXNoYWJsZVdyaXRhYmxlKFxuICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBnbG9iYWwuV3JpdGFibGVTdHJlYW1cbiAgICAgICk7XG4gICAgICBwb2xsV3JpdGFibGVMb2NrKHdyaXRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgIC8vIFJlY29yZCB0aGUgdW5kZXJseWluZyBgKHJ1bklkLCBuYW1lKWAgc28gZG93bnN0cmVhbSByZWR1Y2VycyBjYW5cbiAgICAgIC8vIHJlY29nbml6ZSB0aGF0IHRoaXMgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbS4gV2hlbiBmb3J3YXJkZWQgYWNyb3NzIGBzdGFydCgpYCBhZ2FpbiAoZS5nLlxuICAgICAgLy8gdGhlIGNoaWxkIHBhc3NlcyB0aGlzIHdyaXRhYmxlIG9uIHRvIGEgZ3JhbmRjaGlsZCksIHRoZVxuICAgICAgLy8gZXh0ZXJuYWwgcmVkdWNlciBuZWVkcyBib3RoIHRvIGVtaXQgdGhlIG9yaWdpbmFsIGBydW5JZGAgaW5cbiAgICAgIC8vIHRoZSBkZXNjcmlwdG9yLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHRhcmdldFJ1bklkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmICh0YXJnZXREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLCB7XG4gICAgICAgICAgdmFsdWU6IHRhcmdldERlcGxveW1lbnRJZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gS2VlcCB0aGUgb3duZXIncyBwdWJsaWMga2V5IG9uIHRoZSBoYW5kbGUgc28gYSBmdXJ0aGVyIGZvcndhcmQgc3RheXMgb25cbiAgICAgIC8vIHRoZSB6ZXJvLWxvb2t1cCBzZWFsZWQgcGF0aC5cbiAgICAgIC8vXG4gICAgICAvLyBXaGVuIHRoZSBkZXNjcmlwdG9yIGNhcnJpZXMgbm8ga2V5IGFuZCB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8gVEhJUyBydW4sXG4gICAgICAvLyBkZXJpdmUgaXQuIEEgd3JpdGFibGUgdGFrZW4gd2l0aCBgZ2V0V3JpdGFibGUoKWAgaW4gYSB3b3JrZmxvdyBib2R5IGhhc1xuICAgICAgLy8gb25seSBhIG5hbWUgb24gaXQgKHRoZSB3b3JrZmxvdyBWTSBob2xkcyBubyBrZXkgbWF0ZXJpYWwgYnkgZGVzaWduKSxcbiAgICAgIC8vIHNvIG5vdGhpbmcgY291bGQgcHVibGlzaCB0aGUga2V5IHdoZW4gdGhlIGhhbmRsZSB3YXMgY3JlYXRlZC4gUmV2aXZpbmdcbiAgICAgIC8vIGhhcHBlbnMgaW4gYSBzdGVwLCB3aGljaCBkb2VzIGhvbGQgdGhpcyBydW4ncyBrZXksIGFuZCBhbnkgbGF0ZXJcbiAgICAgIC8vIGZvcndhcmQgdGhlbiBjb3BpZXMgdGhlIHN5bWJvbC5cbiAgICAgIC8vXG4gICAgICAvLyBJdCBoYXMgdG8gaGFwcGVuIGhlcmUgcmF0aGVyIHRoYW4gYXQgc2VyaWFsaXphdGlvbiB0aW1lOiBgc3RhcnQoKWBcbiAgICAgIC8vIGRlaHlkcmF0ZXMgaXRzIGFyZ3VtZW50cyB3aXRoIHRoZSBDSElMRCdzIHJ1bklkIGFuZCB0aGUgQ0hJTEQncyBrZXksIHNvXG4gICAgICAvLyB0aGUgb3duaW5nIHJ1bidzIGtleSBpcyBubyBsb25nZXIgaW4gc2NvcGUgYnkgdGhlbi5cbiAgICAgIC8vXG4gICAgICAvLyBgdGFyZ2V0UnVuSWQgPT09IHJ1bklkYCBpcyB0aGUgZ3VhcmQgdGhhdCBtYXR0ZXJzLiBGb3IgYSBzdHJlYW0gYW5vdGhlclxuICAgICAgLy8gcnVuIG93bnMgd2UgbXVzdCBub3QgYWR2ZXJ0aXNlIG91ciBrZXk6IHRoZSByZWNlaXZlciB3b3VsZCBzZWFsIHRvIHVzXG4gICAgICAvLyBhbmQgdGhlIHJlYWwgb3duZXIgY291bGQgbmV2ZXIgb3BlbiB3aGF0IGl0IHdyb3RlLlxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAgIGlzUnVuUGF5bG9hZEtleXMoY3J5cHRvS2V5KVxuICAgICAgKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCwge1xuICAgICAgICAgIHZhbHVlOiBieXRlc1RvQmFzZTY0KGNyeXB0b0tleS5rZXlQYWlyLnB1YmxpY0tleSksXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLCB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXksXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyaXRhYmxlO1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRDb250cm9sbGVyKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiByZXZpdmVBYm9ydFNpZ25hbCh2YWx1ZSwgb3BzLCBydW5JZCksXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuY3J5cHRpb24gSGVscGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlc2UgZGVsZWdhdGUgdG8gdGhlIG1vZHVsYXIgYGVuY3J5cHRgL2BkZWNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2Bcbi8vIGJ1dCBhcmUga2VwdCBhcyBuYW1lZCBleHBvcnRzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvbnN1bWVycy5cblxuLyoqXG4gKiBFbmNyeXB0IGRhdGEgaWYgdGhlIHdvcmxkIHN1cHBvcnRzIGVuY3J5cHRpb24uXG4gKiBSZXR1cm5zIG9yaWdpbmFsIGRhdGEgaWYgZW5jcnlwdGlvbiBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgZW5jcnlwdGAgZnJvbSBgLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanNgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXliZUVuY3J5cHQoXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHJldHVybiAoYXdhaXQgZW5jcnlwdChkYXRhLCBrZXkpKSBhcyBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSBpZiBpdCBoYXMgdGhlICdlbmNyJyBwcmVmaXguXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBkZWNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2AgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1heWJlRGVjcnlwdChcbiAgZGF0YTogVWludDhBcnJheSB8IHVua25vd24sXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICByZXR1cm4gZGVjcnlwdChkYXRhLCBrZXkpO1xufVxuXG4vKipcbiAqIFJlcGxheSBoeWRyYXRpb24gaGFzIHR3byBzdGFnZXM6XG4gKlxuICogMS4gSG9zdC1zaWRlIHByZXBhcmF0aW9uIGRlY3J5cHRzIGFuZCBkZWNvbXByZXNzZXMgcGVyc2lzdGVkIGRhdGEuIFRoYXQgd29ya1xuICogICAgaXMgaW5kZXBlbmRlbnQgb2YgYSB3b3JrZmxvdyBWTSBhbmQgY2FuIGJlIGNhY2hlZCBhY3Jvc3MgcmVwbGF5IFZNcy5cbiAqIDIuIERlc2VyaWFsaXphdGlvbiByZXZpdmVzIHRoZSBwcmVwYXJlZCByZXByZXNlbnRhdGlvbiBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gKiAgICBWTSdzIGdsb2JhbHMuIEl0IG11c3QgcnVuIGFnYWluIGZvciBldmVyeSBWTSB0byBwcm9kdWNlIGZyZXNoIG9iamVjdCBncmFwaHNcbiAqICAgIGFuZCBjb3JyZWN0bHkgc2NvcGVkIFdvcmtmbG93IG9iamVjdHMuXG4gKlxuICogYGRhdGFgIGlzIHRoZSBib3VuZGFyeSBiZXR3ZWVuIHRob3NlIHN0YWdlcy4gRm9yIGN1cnJlbnQtZm9ybWF0IHBheWxvYWRzIGl0XG4gKiBpcyBzdGlsbCBmb3JtYXQtcHJlZml4ZWQgc2VyaWFsaXplZCBieXRlcywgbm90IGEgbGl2ZSBKYXZhU2NyaXB0IHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVkUmVwbGF5UGF5bG9hZCB7XG4gIHJlYWRvbmx5IGRhdGE6IHVua25vd247XG59XG5cbi8qKlxuICogU3dhcHBhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBob3N0LXNpZGUgcHJlcGFyYXRpb24gc3RhZ2UuIFN1cHBvcnRpbmdcbiAqIGJvdGggZGlyZWN0IGFuZCBwcm9taXNlZCByZXN1bHRzIGxldHMgYSBmdXR1cmUgc3luY2hyb25vdXMgTm9kZSBkZWNyeXB0b3IgdXNlXG4gKiB0aGUgc2FtZSBjYWNoZSBjb250cmFjdCBhcyB0b2RheSdzIGFzeW5jaHJvbm91cyBXZWIgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBSZXBsYXlQYXlsb2FkUHJlcGFyZXIgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWRcbikgPT4gUHJlcGFyZWRSZXBsYXlQYXlsb2FkIHwgUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+O1xuXG4vKipcbiAqIERlY3J5cHQgYW5kIGRlY29tcHJlc3MgcGVyc2lzdGVkIGRhdGEgd2l0aG91dCBwYXJzaW5nIGl0IGludG8gSmF2YVNjcmlwdC5cbiAqIExlZ2FjeSBub24tYmluYXJ5IHZhbHVlcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkIGZvciB0aGVpciBjb25zdW1lciB0byByZXZpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBwcmVwYXJlUmVwbGF5UGF5bG9hZDogUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gYXN5bmMgKFxuICB2YWx1ZSxcbiAga2V5XG4pID0+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBwcmVwYXJlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgZGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4geyBkYXRhOiBwcmVwYXJlZCB9O1xufTtcblxuLyoqXG4gKiBQYXJzZSBhIHByZXBhcmVkIHdvcmtmbG93IGFyZ3VtZW50IG9yIHN1Y2Nlc3NmdWwgc3RlcC9ob29rIHBheWxvYWQgdXNpbmcgdGhlXG4gKiBjdXJyZW50IHdvcmtmbG93IFZNJ3MgZ2xvYmFscyBhbmQgcmV2aXZlcnMuIEVhY2ggY2FsbCBpbnRlbnRpb25hbGx5IGNyZWF0ZXNcbiAqIGEgZnJlc2ggb2JqZWN0IGdyYXBoIHNvIG11dGF0aW9ucyBjYW5ub3QgbGVhayBhY3Jvc3MgcmVwbGF5IGl0ZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVByZXBhcmVkUmVwbGF5UGF5bG9hZChcbiAgcHJlcGFyZWQ6IFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogYW55IHtcbiAgcmV0dXJuIHdvcmtmbG93TW9kdWxlLmRlc2VyaWFsaXplKHByZXBhcmVkLmRhdGEsIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKGdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgcHJlcGFyZWQgc3RlcCBlcnJvciB1c2luZyB0aGUgY3VycmVudCB3b3JrZmxvdyBWTSdzIGNsYXNzIHJldml2ZXJzLlxuICogVGhpcyBwcmVzZXJ2ZXMgdGhyb3duLXZhbHVlIGlkZW50aXR5IHdpdGhvdXQgc2hhcmluZyBvYmplY3RzIGJldHdlZW4gVk1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVQcmVwYXJlZFN0ZXBFcnJvcihcbiAgcHJlcGFyZWQ6IFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogdW5rbm93biB7XG4gIGNvbnN0IHsgZGF0YSB9ID0gcHJlcGFyZWQ7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiB1bmZsYXR0ZW4oZGF0YSBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlaHlkcmF0ZSAvIEh5ZHJhdGUgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBtb2RlIG1vZHVsZXMgKHdvcmtmbG93LCBzdGVwLCBjbGllbnQpIHBhc3Npbmdcbi8vIG1vZGUtc3BlY2lmaWMgc3RyZWFtIGFuZCBSZXF1ZXN0L1Jlc3BvbnNlIHJlZHVjZXJzL3Jldml2ZXJzIGFzIGV4dHJhIG9wdGlvbnMuXG4vLyBUaGUgdjFDb21wYXQgcGF0aCBpcyBoYW5kbGVkIGlubGluZSBiZWZvcmUgZGVsZWdhdGluZyB0byB0aGUgbW9kdWxlcy5cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgYHN0YXJ0KClgIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSB0aGUgd29ya2Zsb3cgYXJndW1lbnRzXG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBhbmQgdGhlbiBoeWRyYXRlZCBmcm9tXG4gKiB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChyZXF1aXJlZCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0KVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHk6IHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIHJlYWRiYWNrT3BzOiBQcm9taXNlPHZvaWQ+W10gPSBvcHNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KFxuICAgICAgdmFsdWUsXG4gICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGtleSxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgcmVhZGJhY2tPcHNcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnRNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcmVhZGJhY2tPcHNcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnd29ya2Zsb3cgYXJndW1lbnRzJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQgdG8gaHlkcmF0ZSB0aGUgd29ya2Zsb3dcbiAqIGFyZ3VtZW50cyBmcm9tIHRoZSBkYXRhYmFzZSBhdCB0aGUgc3RhcnQgb2Ygd29ya2Zsb3cgZXhlY3V0aW9uLiBBIHByZXBhcmVkXG4gKiBwYXlsb2FkIHNraXBzIGhvc3Qtc2lkZSBkZWNyeXB0L2RlY29tcHJlc3MgYnV0IGFsd2F5cyBwZXJmb3JtcyBWTSByZXZpdmFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFJlcGxheVBheWxvYWQoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vKipcbiAqIERlaHlkcmF0ZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgZm9yIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZSxcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHNpbmsgcmVjZWl2aW5nIHRoZSBmaXJzdCBmaXZlIHNhbXBsZXMgYW5kIGV4YWN0IHRvdGFsIGNvdW50IG9mXG4gICAqIHdvcmtmbG93LWNvZGUgZXhlY3V0aW9ucyBzZXJpYWxpemF0aW9uIGNvdWxkIG5vdCBhdm9pZC4gVGhlIGRpYWdub3N0aWNzXG4gICAqIGFyZSBlbWl0dGVkIGFzIHNwYW4gYXR0cmlidXRlcyBlaXRoZXIgd2F5LCBzbyBvbWl0dGluZyB0aGlzIGxvc2VzIG5vdGhpbmdcbiAgICogb2JzZXJ2YWJpbGl0eS13aXNlLiBUaGUgcmV0YWluZWQtVk0gZ2F0ZSBpbiBydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci50c1xuICAgKiBwYXNzZXMgb25lIGZvciBzdGVwLWlucHV0IGRlaHlkcmF0aW9uLlxuICAgKi9cbiAgZ3Vlc3RDb2RlU3RhdHNPdXQ/OiBHdWVzdENvZGVTdGF0c1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGd1ZXN0Q29kZVN0YXRzOiBHdWVzdENvZGVTdGF0cyA9IGd1ZXN0Q29kZVN0YXRzT3V0ID8/IHtcbiAgICAgIGV4ZWN1dGlvbnM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgICBndWVzdENvZGVTdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgYXdhaXQgcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhndWVzdENvZGVTdGF0cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnd29ya2Zsb3cgcmV0dXJuIHZhbHVlJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgdG8gaHlkcmF0ZSB0aGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlXG4gKiBvZiBhIGNvbXBsZXRlZCB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KVxuICAgICAgKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgICBjb21wcmVzc2lvblN0YXRzLFxuICB9KTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiBhIHN0ZXAgaXMgYmVpbmcgY3JlYXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZSxcbiAgLyoqIFNlZSBgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZWAuICovXG4gIGd1ZXN0Q29kZVN0YXRzT3V0PzogR3Vlc3RDb2RlU3RhdHNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBndWVzdENvZGVTdGF0czogR3Vlc3RDb2RlU3RhdHMgPSBndWVzdENvZGVTdGF0c091dCA/PyB7XG4gICAgICBleGVjdXRpb25zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgICAgZ3Vlc3RDb2RlU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIGF3YWl0IHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoZ3Vlc3RDb2RlU3RhdHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGFyZ3VtZW50cycsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB0byBoeWRyYXRlIHRoZSBhcmd1bWVudHMgb2YgYSBzdGVwXG4gKiBmcm9tIHRoZSBkYXRhYmFzZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0ZXAgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZyxcbiAgc3RyZWFtU3RhdGVzPzogRmx1c2hhYmxlU3RyZWFtU3RhdGVbXVxuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRTdGVwUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGRlcGxveW1lbnRJZCwgc3RyZWFtU3RhdGVzKVxuICAgICAgKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgICBjb21wcmVzc2lvblN0YXRzLFxuICB9KTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3Igd2hlbiBhIHN0ZXAgaGFzIGNvbXBsZXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlcmlhbGl6ZVxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBlbmNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIHYxQ29tcGF0IC0gRW5hYmxlIGxlZ2FjeSB2MSBjb21wYXRpYmlsaXR5IG1vZGVcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZXRoZXIgdGhlIHRhcmdldCBydW4gY2FuIGRlY29kZSB3aXJlLWZyYW1lZFxuICogICBieXRlIHN0cmVhbXMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IGRlcGxveW1lbnQncyBjYXBhYmlsaXR5OiBzZWVcbiAqICAgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzIHRvIGBmYWxzZWAgZm9yXG4gKiAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBvcmRlciB0aGUgZmlyc3QgY2h1bmsgb2YgYSByZXR1cm5lZCBzdHJlYW0gYWZ0ZXJcbiAgLy8gdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWRlZCBpbnRvIHRoZSBzdGVwIHJlZHVjZXJzJyBzdHJlYW1cbiAgLy8gc2luay4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPixcbiAgcmVhZGJhY2tPcHM6IFByb21pc2U8dm9pZD5bXSA9IG9wc1xuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBrZXksXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoXG4gICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgIHJlYWRiYWNrT3BzXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3N0ZXAgcmV0dXJuIHZhbHVlJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB3aGVuIGEgc3RlcCB0aHJvd3MuIERlaHlkcmF0ZXMgdGhlIHRocm93blxuICogdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50IGludG8gYSBmb3JtYXQgdGhhdCBjYW5cbiAqIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGBzdGVwX2ZhaWxlZGAgb3IgYHN0ZXBfcmV0cnlpbmdgIGV2ZW50LlxuICpcbiAqIEFueSBKYXZhU2NyaXB0IHZhbHVlIGNhbiBiZSB0aHJvd24gKHN0cmluZ3MsIG51bWJlcnMsIG9iamVjdHMsIEVycm9ycyxcbiAqIEVycm9yIHN1YmNsYXNzZXMpLCBzbyB0aGUgc2FtZSBzZXJpYWxpemF0aW9uIHBpcGVsaW5lIHVzZWQgZm9yIHN0ZXBcbiAqIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyBpcyBhcHBsaWVkIGhlcmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFN0ZXBSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmc6IGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYVxuICogYHN0ZXBfZmFpbGVkYCBvciBgc3RlcF9yZXRyeWluZ2AgZXZlbnQuIEh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbVxuICogdGhlIGRhdGFiYXNlIHNvIHRoZSB3b3JrZmxvdyBjYW4gc2VlIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHBhcmFtIHByZXBhcmVkIC0gT3B0aW9uYWwgY2FjaGVkIGRlY3J5cHQvZGVjb21wcmVzcyByZXN1bHRcbiAqIEByZXR1cm5zIFRoZSBoeWRyYXRlZCB0aHJvd24gdmFsdWUsIHJlYWR5IHRvIHJlamVjdCB0aGUgc3RlcCBwcm9taXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRTdGVwRXJyb3IoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gdGhlIHdvcmtmbG93IGl0c2VsZiB0aHJvd3MuXG4gKiBEZWh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgcnVuX2ZhaWxlZGAgZXZlbnQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGNvbXByZXNzaW9uID0gZmFsc2Vcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkXG4gICAgKSBhcyBVaW50OEFycmF5O1xuICAgIC8vIENvbXByZXNzIGJlZm9yZSBlbmNyeXB0aW5nOiBlbmNyeXB0ZWQgYnl0ZXMgZG9uJ3QgY29tcHJlc3MuXG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBjb21wcmVzcyhcbiAgICAgIHNlcmlhbGl6ZWQsXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICBjb21wcmVzc2VkIGFzIFVpbnQ4QXJyYXksXG4gICAgICBrZXlcbiAgICApKSBhcyBVaW50OEFycmF5O1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcigncnVuIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBjbGllbnQgc2lkZSAob3Igb2JzZXJ2YWJpbGl0eSB0b29scykgdG8gaHlkcmF0ZSB0aGUgcnVuXG4gKiBlcnJvciB2YWx1ZSBvZiBhIGZhaWxlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcmV0dXJucyBUaGUgaHlkcmF0ZWQgdGhyb3duIHZhbHVlLCByZWFkeSB0byBiZSBjb25zdW1lZCBieSB0aGUgY2xpZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUnVuRXJyb3IoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IGRlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcblxuICBpZiAoIShkZWNyeXB0ZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgbm90ZSBpbiBgaHlkcmF0ZVN0ZXBFcnJvcmA6IHRoaXMgYnJhbmNoIGlzIGZvclxuICAgIC8vIGRldmFsdWUgZmxhdHRlbmVkIGFycmF5cyBmcm9tIGxlZ2FjeSBjYWxsZXJzOyBjdXJyZW50IFNESyB2ZXJzaW9uc1xuICAgIC8vIGFsd2F5cyBlbWl0IGEgVWludDhBcnJheSwgYW5kIGEgbWlzc2hhcGVuIHZhbHVlIGhlcmUgaW50ZW50aW9uYWxseVxuICAgIC8vIHRocm93cyB2aWEgYHVuZmxhdHRlbmAgc28gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaCBpbiBvMTF5IGhlbHBlcnNcbiAgICAvLyBzdXJmYWNlcyB0aGUgaXNzdWUgcmF0aGVyIHRoYW4gbWFza2luZyBpdC5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqIEh5ZHJhdGVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdGVwIGZyb20gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEBwYXJhbSBwcmVwYXJlZCAtIE9wdGlvbmFsIGNhY2hlZCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0XG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nXG4gKiBvZiBhIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIHByZXBhcmVkPzogUHJlcGFyZWRSZXBsYXlQYXlsb2FkXG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gZGVzZXJpYWxpemVQcmVwYXJlZFJlcGxheVBheWxvYWQoXG4gICAgcHJlcGFyZWQgPz8gKGF3YWl0IHByZXBhcmVSZXBsYXlQYXlsb2FkKHZhbHVlLCBrZXkpKSxcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyc1xuICApO1xufVxuXG4vLyAtLS0tIEhlbHBlcnMgdG8gZXh0cmFjdCBzdHJlYW0vUmVxdWVzdC9SZXNwb25zZSByZWR1Y2VycyBhbmQgcmV2aXZlcnMgLS0tLVxuLy8gVGhlIG1vZGUtc3BlY2lmaWMgZ2V0KlJlZHVjZXJzL2dldCpSZXZpdmVycyBmdW5jdGlvbnMgcmV0dXJuIG9iamVjdHMgdGhhdFxuLy8gaW5jbHVkZSBib3RoIFwiY29tbW9uXCIgZW50cmllcyAoRGF0ZSwgRXJyb3IsIE1hcCwgZXRjLikgYW5kIG1vZGUtc3BlY2lmaWNcbi8vIGVudHJpZXMgKFJlYWRhYmxlU3RyZWFtLCBXcml0YWJsZVN0cmVhbSwgUmVxdWVzdCwgUmVzcG9uc2UsIFN0ZXBGdW5jdGlvbikuXG4vLyBUaGUgY29tbW9uIGVudHJpZXMgYXJlIGFscmVhZHkgY29tcG9zZWQgYnkgdGhlIGNvZGVjLiBXZSBvbmx5IG5lZWQgdG9cbi8vIHBhc3MgdGhyb3VnaCB0aGUgbW9kZS1zcGVjaWZpYyBlbnRyaWVzIGFzIGV4dHJhUmVkdWNlcnMvZXh0cmFSZXZpdmVycy5cblxuY29uc3QgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMgPSBbXG4gICdSZWFkYWJsZVN0cmVhbScsXG4gICdXcml0YWJsZVN0cmVhbScsXG4gICdSZXF1ZXN0JyxcbiAgJ1Jlc3BvbnNlJyxcbiAgJ1N0ZXBGdW5jdGlvbicsXG4gIC8vIFdpcmUgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHRocm91Z2ggdGhlIGNsaWVudCBzZXJpYWxpemF0aW9uIHBhdGggc29cbiAgLy8gc2lnbmFscyByZWFjaGFibGUgdmlhIFJlcXVlc3Quc2lnbmFsIChvciBhcyBkaXJlY3QgYXJndW1lbnRzKSBnZXQgdGhlaXJcbiAgLy8gZGVkaWNhdGVkIHJlZHVjZXIuIFdpdGhvdXQgdGhpcywgZGV2YWx1ZSBmYWxscyBiYWNrIHRvIGl0cyBhcmJpdHJhcnktUE9KT1xuICAvLyBwYXRoIGFuZCBmYWlscyBmb3IgYW55IHNpZ25hbCB0aGUgUmVxdWVzdCByZWR1Y2VyIGZvcndhcmRzLlxuICAnQWJvcnRDb250cm9sbGVyJyxcbiAgJ0Fib3J0U2lnbmFsJyxcbl0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgYWxsUmVkdWNlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZWR1Y2Vycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICBhbGxSZXZpdmVyczogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMpIHtcbiAgICBpZiAoa2V5IGluIGFsbFJldml2ZXJzKSB7XG4gICAgICBleHRyYVtrZXldID0gYWxsUmV2aXZlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuIl19