@workflow/core 5.0.0-beta.22 → 5.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/runtime.js CHANGED
@@ -272,7 +272,7 @@ export function workflowEntrypoint(workflowCode, options) {
272
272
  const spanKind = await getSpanKind('CONSUMER');
273
273
  return await withTraceContext(parentTraceCarrier, async () => {
274
274
  return await withWorkflowBaggage({ workflowRunId: runId, workflowName }, async () => {
275
- const world = await getWorld();
275
+ const world = await trace('workflow.route.get_world', async () => getWorld());
276
276
  return trace(`workflow.execute ${workflowDisplayName(workflowName)}`, { kind: spanKind, links: spanLinks }, async (span) => {
277
277
  span?.setAttributes({
278
278
  ...Attribute.WorkflowName(workflowName),
@@ -333,6 +333,7 @@ export function workflowEntrypoint(workflowCode, options) {
333
333
  metadata.attempt === 1 &&
334
334
  incomingStepId === undefined &&
335
335
  !replayDivergence;
336
+ span?.setAttributes(Attribute.WorkflowTurbo(turbo));
336
337
  // Turbo mode only: resolves once the backgrounded
337
338
  // `run_started` has landed (or rejects if it failed). Threaded
338
339
  // into handleSuspension and executeStep so no step/hook/wait
@@ -530,6 +531,11 @@ export function workflowEntrypoint(workflowCode, options) {
530
531
  }
531
532
  : {}),
532
533
  };
534
+ const recordRunStartedCreateStart = (skipPreload) => {
535
+ span?.addEvent('workflow.run_started.create.start', {
536
+ 'workflow.run_started.skip_preload': skipPreload,
537
+ });
538
+ };
533
539
  if (turbo && runInput) {
534
540
  // Turbo: background `run_started` and synthesize the run
535
541
  // entity locally so replay can begin without waiting for
@@ -539,6 +545,7 @@ export function workflowEntrypoint(workflowCode, options) {
539
545
  // barrier is consumed by every downstream write (suspension
540
546
  // handler, optimistic step_started, terminal run writes) so
541
547
  // nothing is written before the run exists.
548
+ recordRunStartedCreateStart(true);
542
549
  const startedPromise = world.events.create(runId, runStartedEvent,
543
550
  // We background this purely as a write barrier and
544
551
  // never read its preloaded events (preloadedEvents is
@@ -596,6 +603,7 @@ export function workflowEntrypoint(workflowCode, options) {
596
603
  }
597
604
  else {
598
605
  try {
606
+ recordRunStartedCreateStart(false);
599
607
  const result = await world.events.create(runId, runStartedEvent, { requestId });
600
608
  if (!result.run) {
601
609
  throw new WorkflowRuntimeError(`Event creation for 'run_started' did not return the run entity for run "${runId}"`);
@@ -1527,11 +1535,41 @@ export function workflowEntrypoint(workflowCode, options) {
1527
1535
  }); // End withTraceContext
1528
1536
  });
1529
1537
  let cachedHandler;
1538
+ let invocationCount = 0;
1539
+ const entrypointCreatedAt = Date.now();
1540
+ const routeModuleBodyInitMs = typeof options?.routeModuleBodyStartedAt === 'number'
1541
+ ? entrypointCreatedAt - options.routeModuleBodyStartedAt
1542
+ : undefined;
1530
1543
  return withHealthCheck(async (req) => {
1531
- if (!cachedHandler) {
1532
- cachedHandler = handler(await getWorldHandlers());
1533
- }
1534
- return cachedHandler(req);
1544
+ invocationCount += 1;
1545
+ const handlerCached = cachedHandler !== undefined;
1546
+ const spanKind = await getSpanKind('SERVER');
1547
+ return trace('workflow.route.flow', {
1548
+ kind: spanKind,
1549
+ attributes: {
1550
+ ...Attribute.WorkflowRouteType('flow'),
1551
+ ...Attribute.WorkflowRouteHandlerCached(handlerCached),
1552
+ ...Attribute.WorkflowRouteInvocationCount(invocationCount),
1553
+ ...Attribute.WorkflowRouteEntrypointAgeMs(Date.now() - entrypointCreatedAt),
1554
+ ...(routeModuleBodyInitMs === undefined
1555
+ ? {}
1556
+ : Attribute.WorkflowRouteModuleBodyInitMs(routeModuleBodyInitMs)),
1557
+ ...Attribute.HttpRequestMethod(req.method),
1558
+ ...Attribute.HttpRoute('/.well-known/workflow/v1/flow'),
1559
+ },
1560
+ }, async (span) => {
1561
+ if (!cachedHandler) {
1562
+ cachedHandler = await trace('workflow.route.init', async () => {
1563
+ const worldHandlers = await trace('workflow.route.get_world_handlers', async () => getWorldHandlers());
1564
+ return handler(worldHandlers);
1565
+ });
1566
+ }
1567
+ const response = await cachedHandler(req);
1568
+ if (response instanceof Response) {
1569
+ span?.setAttributes(Attribute.HttpResponseStatusCode(response.status));
1570
+ }
1571
+ return response;
1572
+ });
1535
1573
  });
1536
1574
  }
1537
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUNqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsNkJBQTZCLEdBQzlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixZQUFZLEdBQ2IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7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N0IsQ0FBQyxDQUNGLENBQUM7SUFFSixJQUFJLGFBQWdFLENBQUM7SUFDckUsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ25DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBDb3JydXB0ZWRFdmVudExvZ0Vycm9yLFxuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgcGFyc2VXb3JrZmxvd05hbWUsXG4gIHdvcmtmbG93RGlzcGxheU5hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciwgaXNXb3JsZENvbnRyYWN0RXJyb3IgfSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBpc1R1cmJvRW5hYmxlZCxcbiAgTUFYX1FVRVVFX0RFTElWRVJJRVMsXG4gIFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIGdldFF1ZXVlT3ZlcmhlYWQsXG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UsXG4gIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IGV4ZWN1dGVTdGVwIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi9ydW50aW1lL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICB0eXBlIFdvcmxkSGFuZGxlcnMsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyByZW1hcEVycm9yU3RhY2sgfSBmcm9tICcuL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlU3RlcEh5ZHJhdGlvbkNhY2hlLFxuICB0eXBlIFN0ZXBIeWRyYXRpb25DYWNoZSxcbn0gZnJvbSAnLi9zdGVwLWh5ZHJhdGlvbi1jYWNoZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBydW5Xb3JrZmxvdyB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9O1xuZXhwb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBIZWFsdGhDaGVja0VuZHBvaW50LFxuICB0eXBlIEhlYWx0aENoZWNrT3B0aW9ucyxcbiAgdHlwZSBIZWFsdGhDaGVja1Jlc3VsdCxcbiAgaGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmV4cG9ydCB7XG4gIGdldEhvb2tCeVRva2VuLFxuICByZXN1bWVIb29rLFxuICByZXN1bWVXZWJob29rLFxufSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnO1xuZXhwb3J0IHtcbiAgZ2V0UnVuLFxuICBSdW4sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbSxcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyxcbn0gZnJvbSAnLi9ydW50aW1lL3J1bi5qcyc7XG5leHBvcnQge1xuICBjYW5jZWxSdW4sXG4gIGxpc3RTdHJlYW1zLFxuICB0eXBlIFJlYWRTdHJlYW1PcHRpb25zLFxuICB0eXBlIFJlY3JlYXRlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG4vLyBWMjogc3RlcEVudHJ5cG9pbnQgaXMgbm8gbG9uZ2VyIHJlLWV4cG9ydGVkIOKAlCB0aGUgY29tYmluZWQgaGFuZGxlclxuLy8gKHdvcmtmbG93RW50cnlwb2ludCkgZXhlY3V0ZXMgc3RlcHMgaW5saW5lLiBSZW1vdmluZyB0aGUgcmUtZXhwb3J0XG4vLyBwcmV2ZW50cyBUdXJib3BhY2sgZnJvbSB0cmFjaW5nIHN0ZXAtaGFuZGxlci5qcyDihpIgZ2V0LXBvcnQuanNcbi8vIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBpbnRvIHRoZSBmbG93IHJvdXRlIGJ1bmRsZS5cbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmxkLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHwgbnVsbCB7XG4gIGlmIChXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG5cbiAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICB3b3JsZCxcbiAgd29ya2Zsb3dSdW4sXG4gIHJ1bklkLFxuICByZXF1ZXN0SWQsXG4gIGVycixcbiAgZXJyb3JDb2RlLFxuICBsb2dNZXNzYWdlLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGVycjogdW5rbm93bjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIGxvZ01lc3NhZ2U6IHN0cmluZztcbn0pIHtcbiAgcnVudGltZUxvZ2dlci5lcnJvcihsb2dNZXNzYWdlLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXJyb3JDb2RlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1biA/PyBydW5JZCk7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgIHJ1bklkLFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICksXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgcmVxdWVzdElkIH1cbiAgICApO1xuICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihmYWlsRXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgIGVycm9yOiBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsRXJyLm1lc3NhZ2UgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGZhaWxFcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50czogRXZlbnRbXSwgcnVuSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBUZXJtaW5hbCBydW4gZXZlbnRzIGFyZSBhbHdheXMgbGFzdCBieSBjb25zdHJ1Y3Rpb24gKG5vIGV2ZW50IGNyZWF0aW9uXG4gIC8vIHN1Y2NlZWRzIGFnYWluc3QgYSB0ZXJtaW5hbCBydW4pLCBidXQgc2NhbiB0aGUgZnVsbCBhcnJheSBmb3JcbiAgLy8gZGVmZW5zZS1pbi1kZXB0aDogYSBXb3JsZC9iYWNrZW5kIG9yZGVyaW5nIGJ1ZyBzaG91bGRuJ3QgbWFrZSB1cyBtaXNzIGFuXG4gIC8vIGFjdHVhbCB0ZXJtaW5hdGlvbiBzaWduYWwuXG4gIGNvbnN0IHRlcm1pbmFsUnVuRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZSkgPT5cbiAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAoZS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICk7XG5cbiAgaWYgKCF0ZXJtaW5hbFJ1bkV2ZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUnVuIHJlYWNoZWQgdGVybWluYWwgZXZlbnQsIGV4aXRpbmcnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXZlbnRUeXBlOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50VHlwZSxcbiAgICBldmVudElkOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBydW4gaGFzIGFueSBob29rIG9yIHdhaXQgdGhhdCBhbiBvdXQtb2YtYmFuZCB3cml0ZXIgY291bGRcbiAqIGFwcGVuZCBhbiBldmVudCBmb3IgYmV0d2VlbiBhbiBpbmxpbmUgc3RlcCdzIGBzdGVwX2NvbXBsZXRlZGAgd3JpdGUgYW5kXG4gKiB0aGUgbmV4dCByZXBsYXkg4oCUIG5hbWVseSBhbiBvcGVuIGhvb2sgKGEgYGhvb2tfY3JlYXRlZGAgbm90IHlldFxuICogYGhvb2tfZGlzcG9zZWRgLCB3aGljaCBhIHdlYmhvb2sgcmVjZWl2ZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYGhvb2tfcmVjZWl2ZWRgKSBvciBhbiBvcGVuIHdhaXQgKGEgYHdhaXRfY3JlYXRlZGAgbm90IHlldFxuICogYHdhaXRfY29tcGxldGVkYCwgd2hpY2ggdGhlIHdhaXQgdGltZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYHdhaXRfY29tcGxldGVkYCkuXG4gKlxuICogVGhpcyBnYXRlcyB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aC4gVGhlIGRlbHRhIHJldHVybmVkIGJ5IHRoZVxuICogc3RlcC10ZXJtaW5hbCB3cml0ZSBpcyB0aGUgZXZlbnQgbG9nIGFzIG9mIHRoYXQgd3JpdGU7IGl0IGlzIGNvbnN1bWVkXG4gKiBvbiB0aGUgTkVYVCBsb29wIGl0ZXJhdGlvbiwgc28gYW55IGV2ZW50IGEgY29uY3VycmVudCB3cml0ZXIgYXBwZW5kcyBpblxuICogdGhhdCB3aW5kb3cgd291bGQgYmUgcHJlc2VudCBpbiBhIHJlYWwgYGV2ZW50cy5saXN0YCBmZXRjaCBidXQgYWJzZW50XG4gKiBmcm9tIHRoZSBzdGFsZSBkZWx0YS4gTWlzc2luZyBzdWNoIGFuIGV2ZW50IGZvciBvbmUgcmVwbGF5IGNhbiBkdXJhYmx5XG4gKiBjb21taXQgYSBzY2hlZHVsaW5nIGRlY2lzaW9uIChlLmcuIGlubGluZS1leGVjdXRpbmcgdGhlIGxvc2VyIG9mIGFcbiAqIGBQcm9taXNlLnJhY2UoW2hvb2ssIHN0ZXBdKWApIHRoYXQgdGhlIGV2ZW50dWFsIGZ1bGwgcmVwbGF5IGNhbm5vdFxuICogY29uc3VtZSDigJQgYSBgUmVwbGF5RGl2ZXJnZW5jZUVycm9yYC4gV2hlbiBubyBob29rIG9yIHdhaXQgaXMgb3BlbiwgdGhlXG4gKiBvbmx5IG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIGJlbmlnbiB0byBvYnNlcnZlIG9uZVxuICogaXRlcmF0aW9uIGxhdGUgKHRoZSBuZXh0IGVudGl0eSB3cml0ZSBpcyByZWplY3RlZCBhZ2FpbnN0IHRoZSB0ZXJtaW5hbFxuICogcnVuIGFuZCB0aGUgcnVuIGlzIGFscmVhZHkgdGVybWluYWwpLCBzbyB0aGUgZmFzdCBwYXRoIGlzIHNhZmUuXG4gKlxuICogU3RlcC1ib2R5IGBhdHRyX3NldGAgd3JpdGVzIGFyZSBOT1QgYSBjb25jZXJuOiB0aGV5IGxhbmQgYmVmb3JlIHRoZVxuICogc3RlcCdzIHRlcm1pbmFsIHdyaXRlIGFuZCBhcmUgdGhlcmVmb3JlIGFscmVhZHkgaW5zaWRlIHRoZSByZXR1cm5lZFxuICogZGVsdGEuXG4gKi9cbmZ1bmN0aW9uIGhhc09wZW5Ib29rT3JXYWl0KGV2ZW50czogRXZlbnRbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBkaXNwb3NlZEhvb2tJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGUuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIGRpc3Bvc2VkSG9va0lkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICBlbHNlIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgY29tcGxldGVkV2FpdElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgIWRpc3Bvc2VkSG9va0lkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSByb3V0ZSB3aGljaCBoYW5kbGVzIHdvcmtmbG93IGV4ZWN1dGlvbiByZXF1ZXN0cyxcbiAqIGV4ZWN1dGluZyBzdGVwcyBpbmxpbmUgd2hlbiBwb3NzaWJsZSB0byByZWR1Y2UgZnVuY3Rpb24gaW52b2NhdGlvbnNcbiAqIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAqXG4gKiBUaGUgaGFuZGxlciBsb29wczogcmVwbGF5IHdvcmtmbG93IOKGkiBleGVjdXRlIHN0ZXAgaW5saW5lIOKGkiByZXBsYXkg4oaSIC4uLlxuICogdW50aWwgdGhlIHdvcmtmbG93IGNvbXBsZXRlcywgdGltZXMgb3V0LCBvciBlbmNvdW50ZXJzIG5vbi1zdGVwIHN1c3BlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvd0NvZGUgLSBUaGUgd29ya2Zsb3cgYnVuZGxlIGNvZGUgY29udGFpbmluZyBhbGwgd29ya2Zsb3cgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBWZXJjZWwgQVBJIHJvdXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0VudHJ5cG9pbnQoXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICBvcHRpb25zPzogeyBuYW1lc3BhY2U/OiBzdHJpbmcgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TID1cbiAgICBOdW1iZXIocHJvY2Vzcy5lbnYuV09SS0ZMT1dfVjJfVElNRU9VVF9NUykgfHwgMTIwXzAwMDtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZVxuICAgICAgICAvLyBOT1RFOiBIZWFsdGggY2hlY2sgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgdW5hdXRoZW50aWNhdGVkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLlxuICAgICAgICAvLyBUaGV5IG9ubHkgd3JpdGUgYSBzaW1wbGUgc3RhdHVzIHJlc3BvbnNlIHRvIGEgc3RyZWFtIGFuZCBkbyBub3QgZXhwb3NlIHNlbnNpdGl2ZSBkYXRhLlxuICAgICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChtZXNzYWdlXyk7XG4gICAgICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgICAgICAgJ3dvcmtmbG93JyxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgfSA9IFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYS5wYXJzZShtZXNzYWdlXyk7XG4gICAgICAgIC8vIGBzdGFydCgpYCBhbHdheXMgYXR0YWNoZXMgYSB0cmFjZSBjYXJyaWVyLCBidXRcbiAgICAgICAgLy8gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkgcmV0dXJucyBge31gIHdoZW4gbm8gT1RFTCBTREsgaXMgcmVnaXN0ZXJlZFxuICAgICAgICAvLyBvciBubyBzcGFuIGlzIGFjdGl2ZSDigJQgdHJlYXQgYW4gZW1wdHkgY2FycmllciB0aGUgc2FtZSBhcyBhblxuICAgICAgICAvLyBhYnNlbnQgb25lIHNvIGxpbmtlZCBtb2RlIGZhbGxzIGJhY2sgdG8gYSBmcmVzaCBvcmlnaW4gaW5zdGVhZCBvZlxuICAgICAgICAvLyBmb3J3YXJkaW5nIGEgdXNlbGVzcyBge31gIGZvcmV2ZXIuXG4gICAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nVHJhY2VDYXJyaWVyKVxuICAgICAgICAgID8gaW5jb21pbmdUcmFjZUNhcnJpZXJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhO1xuICAgICAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uod29ya2Zsb3dQcmVmaXgubGVuZ3RoKTtcblxuICAgICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgICAvLyBFbmZvcmNlIG1heCBkZWxpdmVyeSBsaW1pdCBiZWZvcmUgYW55IGluZnJhc3RydWN0dXJlIGNhbGxzLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJ1bmF3YXkgd29ya2Zsb3dzIGZyb20gY29uc3VtaW5nIGluZmluaXRlIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gICAgICAgIC8vIFNjb3BlZCBsb2dnZXIgZm9yIHRoaXMgcnVuIOKAlCBhdHRhY2hlcyBydW5JZC93b3JrZmxvd05hbWUgdG8gZXZlcnlcbiAgICAgICAgLy8gbG9nIGxpbmUgYW5kIGNoaWxkIGxvZ2dlcnMgYmVsb3csIHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgICBjb25zdCBydW5Mb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihydW5JZCwgd29ya2Zsb3dOYW1lKTtcblxuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IE1BWF9RVUVVRV9ERUxJVkVSSUVTKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHtNQVhfUVVFVUVfREVMSVZFUklFU30pYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgZXJyb3JDb2RlOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uZXJyb3JDb2RlLFxuICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCBydW5JZCk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IGV4Y2VlZGVkIG1heGltdW0gcXVldWUgZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uIOKAlFxuICAgICAgICAvLyByb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzIOKAlCBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJRcbiAgICAgICAgLy8gc2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC0tLSBSZXBsYXkgYnVkZ2V0IGJvb2trZWVwaW5nIC0tLVxuICAgICAgICAvLyBUaGUgcmVwbGF5IGJ1ZGdldCBib3VuZHMgdGhlICpub24tc3RlcCogcG9ydGlvbiBvZiBhIHNpbmdsZVxuICAgICAgICAvLyBoYW5kbGVyIGludm9jYXRpb246IGRldGVybWluaXN0aWMgZXZlbnQtbG9nIHJlcGxheSwgd29ya2Zsb3ctVk1cbiAgICAgICAgLy8gZXhlY3V0aW9uIGJldHdlZW4gc3RlcCBib3VuZGFyaWVzLCBzdXNwZW5zaW9uIGhhbmRsaW5nLCBxdWV1ZVxuICAgICAgICAvLyByb3VuZC10cmlwcywgZXRjLiBJbmxpbmUgc3RlcCBib2RpZXMgKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uc1xuICAgICAgICAvLyBpbnZva2VkIHZpYSBgZXhlY3V0ZVN0ZXBgKSBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZCDigJQgdGhleSBhcmVcbiAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBgbWF4RHVyYXRpb25gIGFuZCB0aGVcbiAgICAgICAgLy8gYE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNgIGVhcmx5LXJldHVybiBndWFyZCBiZWxvdy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGJ1ZGdldCBpcyBjaGVja2VkIGF0IGxvb3AgYm91bmRhcmllcyAodG9wIG9mIGVhY2ggYHdoaWxlYFxuICAgICAgICAvLyBpdGVyYXRpb24pLiBOb3RlIHRoaXMgaXMgKmxlc3MgcmVzcG9uc2l2ZSogdGhhbiB0aGUgb2xkXG4gICAgICAgIC8vIGBzZXRUaW1lb3V0YC1iYXNlZCBhcHByb2FjaDogYSBzaW5nbGUgcGF0aG9sb2dpY2FsIGBydW5Xb3JrZmxvd2BcbiAgICAgICAgLy8gY2FsbCBwcm9jZXNzaW5nIGEgaHVnZSBldmVudCBsb2cgY2FuIG92ZXJzaG9vdCB0aGUgYnVkZ2V0IGJ5IHVwXG4gICAgICAgIC8vIHRvIG9uZSBpdGVyYXRpb24gYmVmb3JlIGJhaWxpbmcuIEluIHByYWN0aWNlIHRoZSBoZWFkcm9vbSBidWlsdFxuICAgICAgICAvLyBpbnRvIGBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgIChhbmQgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAgICAgICAgLy8gU0lHVEVSTSBhcyB1bHRpbWF0ZSBiYWNrc3RvcCkgZ2l2ZXMgdXMgc2xhY2sg4oCUIHRoZSBwcmV2aW91c1xuICAgICAgICAvLyBgc2V0VGltZW91dGAgYXBwcm9hY2ggYWxzbyByZWxpZWQgb24gdGhlIHBsYXRmb3JtIGtpbGwgYXMgdGhlXG4gICAgICAgIC8vIGhhcmQgYmFja3N0b3AuIERvICpub3QqIFwiZml4XCIgdGhpcyBieSBhZGRpbmcgYSBgc2V0SW50ZXJ2YWxgO1xuICAgICAgICAvLyBpdCB3b3VsZCByaXNrIHRoZSBzYW1lIGJ1ZyB3ZSBqdXN0IHJlbW92ZWQgKGJvdW5kaW5nIHN0ZXBcbiAgICAgICAgLy8gYm9kaWVzKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRWFybGllciB2ZXJzaW9ucyAocHJlLSMyMDA5IGZpeCkgdXNlZCBhIHNpbmdsZSBgc2V0VGltZW91dGBcbiAgICAgICAgLy8gdGhhdCBhbHNvIGJvdW5kZWQgc3RlcCBib2RpZXMsIHdoaWNoIGJyb2tlIGFueSB3b3JrZmxvdyB3aXRoIGFcbiAgICAgICAgLy8gc2luZ2xlIHN0ZXAgbG9uZ2VyIHRoYW4gdGhlIGJ1ZGdldC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dCDigJQgcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlKFxuICAgICAgICAgICAgICAgIGB3b3JrZmxvdy5leGVjdXRlICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWAsXG4gICAgICAgICAgICAgICAgeyBraW5kOiBzcGFuS2luZCwgbGlua3M6IHNwYW5MaW5rcyB9LFxuICAgICAgICAgICAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ2V4ZWN1dGVfdjInKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VQcm9wYWdhdGVkKCEhdHJhY2VDb250ZXh0KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VNb2RlKHRyYWNlTW9kZSksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgaW52b2NhdGlvblN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICBsZXQgbG9vcEl0ZXJhdGlvbiA9IDA7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGNhY2hlOiBrZWVwIGxvYWRlZCBldmVudHMgaW4gbWVtb3J5IGFjcm9zcyBsb29wIGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAvLyBPbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHdlIGRvIGEgZnVsbCBsb2FkOyBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGZldGNoIG9ubHkgZXZlbnRzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gY3Vyc29yLlxuICAgICAgICAgICAgICAgICAgbGV0IGNhY2hlZEV2ZW50czogRXZlbnRbXSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50c0N1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gY2FjaGUgb2YgaHlkcmF0ZWQgc3RlcCByZXR1cm4gdmFsdWVzLCBzaGFyZWQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAvLyBldmVyeSByZXBsYXkgaXRlcmF0aW9uIG9mIFRISVMgaW52b2NhdGlvbi4gRWFjaCBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkcyBhIGZyZXNoIHdvcmtmbG93IGNvbnRleHQsIHNvIHRoZSBjYWNoZSBpcyBvd25lZCBoZXJlXG4gICAgICAgICAgICAgICAgICAvLyAob3V0c2lkZSB0aGF0IGNvbnRleHQpIGFuZCB0aHJlYWRlZCBpbnRvIHJ1bldvcmtmbG93LiBJdFxuICAgICAgICAgICAgICAgICAgLy8gdHVybnMgdGhlIG90aGVyd2lzZSBPKE7CsikgcmUtZGVjcnlwdCArIHJlLXBhcnNlIG9mIGNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCByZXN1bHRzIGFjcm9zcyBOIHJlcGxheXMgaW50byBPKE4pLiBTY29wZWQgdG8gdGhpcyBydW5cbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkg4oCUIG5ldmVyIHJldXNlZCBhY3Jvc3MgcnVucy4gU2VlIHN0ZXAtaHlkcmF0aW9uLWNhY2hlLnRzLlxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcEh5ZHJhdGlvbkNhY2hlOiBTdGVwSHlkcmF0aW9uQ2FjaGUgPVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdGVwSHlkcmF0aW9uQ2FjaGUoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbjogd2hlbiBhbiBpbmxpbmUgc3RlcCdzIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByZXR1cm5zIHRoZSBldmVudC1sb2cgZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIChhIHN1cHBvcnRpbmcgV29ybGQgb25seSksIHdlIHN0YXNoIGl0IGhlcmUgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGNvbnN1bWVzIGl0IGluIHBsYWNlIG9mIHRoZSBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQtdHJpcC4gRWFjaCB2YWx1ZSBpcyBjb25zdW1lZCBleGFjdGx5IG9uY2VcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNsZWFyZWQuIE51bGwgbWVhbnMgXCJubyBkZWx0YSBwZW5kaW5nIOKAlCBmZXRjaFxuICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsbHlcIi4gU2VlIHRoZSBjb25zdW1lIHNpdGUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9kdWNlIHNpdGUgYWZ0ZXIgaW5saW5lIGV4ZWN1dGVTdGVwLlxuICAgICAgICAgICAgICAgICAgbGV0IHBlbmRpbmdJbmxpbmVEZWx0YToge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgIH0gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIHN0YXRlOiBzZXQgYnkgZWl0aGVyIHRoZSBiYWNrZ3JvdW5kIHN0ZXAgcGF0aFxuICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHJ1bl9zdGFydGVkIHNldHVwIGJlbG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IC0xO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50czogRXZlbnRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHNDdXJzb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgZmFzdC1wYXRocyB0aGUgdmVyeSBmaXJzdCBkZWxpdmVyeSBvZiB0aGUgdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgaXQgaXMgcHJvdmFibHkgc2FmZSB0bzogYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCwgc2tpcCB0aGUgaW5pdGlhbCBldmVudC1sb2cgbG9hZCAobm90aGluZyBoYXNcbiAgICAgICAgICAgICAgICAgIC8vIGJlZW4gd3JpdHRlbiB5ZXQpLCBhbmQgZm9yY2Ugb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgKG5vXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHBlZXIgaGFuZGxlciBleGlzdHMgdG8gcmFjZSB0aGUgY3JlYXRlLWNsYWltKS5cbiAgICAgICAgICAgICAgICAgIC8vIGBydW5JbnB1dGAgaXMgb25seSBwcmVzZW50IG9uIHRoZSBzdGFydCgpLWVucXVldWVkIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgYGF0dGVtcHQgPT09IDFgICgxLWJhc2VkKSBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnk7IGBpbmNvbWluZ1N0ZXBJZGAgd291bGQgbWFyayBhIGJhY2tncm91bmQtc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIGEgcmVjb3ZlcnkgcmVwbGF5IOKAlCBib3RoXG4gICAgICAgICAgICAgICAgICAvLyBpbmVsaWdpYmxlLiBUaGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXMgZm9yY2VkXG4gICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgZW5kcyBvbmNlIGEgaG9vay93YWl0L2F0dHIgaXMgY3JlYXRlZCxcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHR1cmJvIGV4aXRzIGF0IHRoYXQgcG9pbnQgKHNlZSBgZm9yY2VPcHRpbWlzdGljU3RhcnRgKS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cmJvID1cbiAgICAgICAgICAgICAgICAgICAgaXNUdXJib0VuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmF0dGVtcHQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAhcmVwbGF5RGl2ZXJnZW5jZTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBvbmx5OiByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAob3IgcmVqZWN0cyBpZiBpdCBmYWlsZWQpLiBUaHJlYWRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW50byBoYW5kbGVTdXNwZW5zaW9uIGFuZCBleGVjdXRlU3RlcCBzbyBubyBzdGVwL2hvb2svd2FpdFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmFjZXMgYWhlYWQgb2YgdGhlIHJ1bidzIGNyZWF0aW9uLiBVbmRlZmluZWQgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgLy8gdHVyYm8sIHdoZXJlIGBydW5fc3RhcnRlZGAgaXMgYXdhaXRlZCB1cCBmcm9udC5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5SZWFkeUJhcnJpZXI6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE9yZGVyIGEgdGVybWluYWwgcnVuIHdyaXRlIChydW5fY29tcGxldGVkIC8gcnVuX2ZhaWxlZCkgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgaW4gdHVyYm8gbW9kZSDigJQgYSBuby1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBjYW4gb3RoZXJ3aXNlIHJlYWNoIHJ1bl9jb21wbGV0ZWQgYmVmb3JlIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cy4gQmVzdC1lZmZvcnQ6IGEgYmFycmllciByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvclxuICAgICAgICAgICAgICAgICAgLy8gb3JkZXJpbmcgb25seTsgaWYgcnVuX3N0YXJ0ZWQgdHJ1bHkgZmFpbGVkIHRoZSB0ZXJtaW5hbCB3cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IgKHJ1biBub3QgZm91bmQgLyBnb25lKSBhbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnMuIE5vLW9wIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICBjb25zdCBhd2FpdFJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHkg4oCUIHNlZSBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgb3JjaGVzdHJhdG9yLiBPdXRzaWRlIHR1cmJvIHRoaXMgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAsIHdoaWNoIG1ha2VzIHRoZSBxdWV1ZSByZXNjaGVkdWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBkZWxpdmVyeSdzIG1lc3NhZ2UuIEluIHR1cmJvIHRoYXQgaXMgYSB0cmFwOiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAsIGFuZCBvbiBhc3luYyBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGdyYXBoaWxlLXdvcmtlcikgYSByZXNjaGVkdWxlIGNvbWVzIGJhY2sgYXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgMSDigJQgc28gdHVyYm8gcmUtZW5nYWdlcywgc2tpcHMgdGhlIGV2ZW50LWxvZyBsb2FkXG4gICAgICAgICAgICAgICAgICAvLyBhZ2FpbiwgcmVwbGF5cyBhZ2FpbnN0IGFuIGVtcHR5IGxvZywgbmV2ZXIgb2JzZXJ2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBob29rL2F0dHIgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZSA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIHN0ZXBJZCwgdGhpcyBpcyBhIGJhY2tncm91bmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBFeGVjdXRlIHRoZSBzdGVwLCB0aGVuIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmF0Y2ggYXJlIGRvbmUuIElmIHNvLCByZXBsYXkgaW5saW5lIChzYXZpbmcgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwKS4gSWYgbm90LCByZXR1cm4g4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGljayB1cCB0aGUgcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgaWYgKGluY29taW5nU3RlcElkICYmIGluY29taW5nU3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1J1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgc3RhdHVzOiBiZ1J1bi5zdGF0dXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdTdGFydGVkQXQgPSBiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gK2JnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVucyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBiZ1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiBiZ1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHN0ZXAgaGFkIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzKSwgYnJlYWsgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRVbnRpbCBmbHVzaCB0aGVtIOKAlCBjYW4ndCBjb250aW51ZSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdza2lwcGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMgdG8gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnNvci1iYXNlZCBsb2FkaW5nIHNvIHRoZSBtYWluIGxvb3AgY2FuIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbGx5IGZyb20gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgc3RlcHM6IGFueSBzdGVwX2NyZWF0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBtYXRjaGluZyBzdGVwX2NvbXBsZXRlZCBvciBzdGVwX2ZhaWxlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwVGVybWluYWxJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBDcmVhdGVkSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFRlcm1pbmFsSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUGVuZGluZ1N0ZXBzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZW5kaW5nU3RlcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQZW5kaW5nU3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgc3RlcHMgc3RpbGwgaW4gcHJvZ3Jlc3MuIFJldHVybiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVpbmcg4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGUgd2lsbCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGRvbmUgYW5kIHJlcGxheSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nLCByZXR1cm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBzdGVwcyBkb25lIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gcmVwbGF5IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgc2hhcmVkIHN0YXRlIHNvIHRoZSBsb29wIGNhbiBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSwgcmVwbGF5aW5nIGlubGluZSBhZnRlciBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IGJnUnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSBiZ1N0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyBhbmQgZXZlbnRzQ3Vyc29yIGFscmVhZHkgc2V0IGZyb20gbG9hZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGJhY2tncm91bmQgd29ya2Zsb3cgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogcHJlcGFyZSB0aGUgcnVuIHN0YXRlIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiB3b3JrZmxvd1J1biB3YXMgYWxyZWFkeSBzZXQgYnkgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCAoaW5saW5lIHJlcGxheSBhZnRlciBhbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSkuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5IOKAlCB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dXJibyAmJiBydW5JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBiYWNrZ3JvdW5kIGBydW5fc3RhcnRlZGAgYW5kIHN5bnRoZXNpemUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGl0eSBsb2NhbGx5IHNvIHJlcGxheSBjYW4gYmVnaW4gd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZC10cmlwLiBTYWZlIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uIOKAlCBzdGFydCgpIGNyZWF0ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIG1vbWVudHMgYWdvIGFuZCBubyBldmVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJyaWVyIGlzIGNvbnN1bWVkIGJ5IGV2ZXJ5IGRvd25zdHJlYW0gd3JpdGUgKHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyLCBvcHRpbWlzdGljIHN0ZXBfc3RhcnRlZCwgdGVybWluYWwgcnVuIHdyaXRlcykgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRQcm9taXNlID0gd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYmFja2dyb3VuZCB0aGlzIHB1cmVseSBhcyBhIHdyaXRlIGJhcnJpZXIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZWFkIGl0cyBwcmVsb2FkZWQgZXZlbnRzIChwcmVsb2FkZWRFdmVudHMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCB0byBbXSBiZWxvdyksIHNvIHRlbGwgdGhlIFdvcmxkIHRvIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBldmVudC1sb2cgcHJlbG9hZC4gVGhhdCB0cmltcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIHJlcXVlc3QgdGhlIGNoYWluZWQgZmlyc3Qgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0cyBvbiDigJQgc2hvcnRlbmluZyB0aW1lLXRvLXNlY29uZC1zdGVwIOKAlCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXN0ZWQgbGlzdCtyZXNvbHZlIGl0IHdvdWxkIG90aGVyd2lzZSBjb21wdXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQsIHNraXBQcmVsb2FkOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllciA9IHN0YXJ0ZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBhIG5vLW9wIHJlamVjdGlvbiBoYW5kbGVyIHNvIGFuIGVhcmx5IGZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gYmVmb3JlIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYXdhaXQvdGhlbikgaXMgYXR0YWNoZWQ7IGNvbnN1bWVycyBzdGlsbCBvYnNlcnZlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0OiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIHlldCBvbiBhIGZpcnN0IGRlbGl2ZXJ5IChydW5fc3RhcnRlZCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCkuIEFuIGVtcHR5IHByZWxvYWRlZCBzZXQgcm91dGVzIGl0ZXJhdGlvbiAxIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm8tbG9hZCBwcmVsb2FkZWQgYnJhbmNoOyBpdGVyYXRpb24gMiB0aGVuIHRha2VzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBvc3QtcHJlbG9hZGVkIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyAobm8gc3B1cmlvdXMgXCJjdXJzb3IgbWlzc2luZ1wiIHdhcm5pbmcpLiBgW11gIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSB0cnV0aHkgaGVyZSDigJQgZG8gbm90IGNoYW5nZSB0aGUgbG9hZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJyYW5jaGVzJyBgaWYgKHByZWxvYWRlZEV2ZW50cylgIGNoZWNrcyB0byB0ZXN0IGxlbmd0aC5cbiAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSW5wdXQuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCBhdHRyaWJ1dGVzIGZyb20gc3RhcnQoKSByaWRlIGFsb25nIGluIGBydW5JbnB1dGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGxpdmUgaW4gYHJ1bl9jcmVhdGVkYCdzIGV2ZW50RGF0YSwgbm90IHNlcGFyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXR0cl9zZXRgIGV2ZW50cyksIHNvIHRoZSBzeW50aGVzaXplZCBzbmFwc2hvdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGV2ZW4gdGhvdWdoIHdlIHNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QgT05MWSB3aGlsZSBhdHRyaWJ1dGVzIGFyZSB3cml0ZS1vbmx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW4td29ya2Zsb3cgcmVhZCBBUEkgdG9kYXkgKHNlZSB3b3JrZmxvdy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZFwiKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcmVsb2FkZWQgbG9nIGNhbid0IGRpdmVyZ2Ugb24gYSByZWFkLiBJZiBhIHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBldmVyIGFkZGVkIGl0IE1VU1QgcmVhZCBmcm9tIHRoaXMgc25hcHNob3QsIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGF5aW5nIHJ1bl9jcmVhdGVkL2F0dHJfc2V0IGV2ZW50cyDigJQgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibydzIGVtcHR5IGluaXRpYWwgbG9nIHdvdWxkIHN1cmZhY2Ugc2VlZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBge31gIG9uIHRoZSBmaXJzdCBkZWxpdmVyeSBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGNyZWF0aW9uIGZvciAncnVuX3N0YXJ0ZWQnIGRpZCBub3QgcmV0dXJuIHRoZSBydW4gZW50aXR5IGZvciBydW4gXCIke3J1bklkfVwiYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgZXZlbnRzLCB1c2UgdGhlbSB0byBza2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5pdGlhbCBldmVudHMubGlzdCBjYWxsIGFuZCByZWR1Y2UgVFRGQi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc01vcmUgIT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHMgPSByZXN1bHQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPSByZXN1bHQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHdhcyBjb25jdXJyZW50bHkgY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvcjogcnVuIHdhcyBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWQgZHVyaW5nIHNldHVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW5FeHBpcmVkRXJyb3I6IHJ1biBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHdvcmtmbG93IHNldHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICt3b3JrZmxvd1J1bi5zdGFydGVkQXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgaGFzIGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB3b3JrZmxvd1J1bi5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZvciBgY2FuY2VsYCwgd2UgYWN0dWFsbHkgd2FudCB0byBwcm9wYWdhdGUgYSBXb3JrZmxvd0NhbmNlbGxlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSB3b3JrZmxvdyBjb250ZXh0IHNvIHRoZSB1c2VyIGNhbiBncmFjZWZ1bGx5IGV4aXQuIHRoaXMgaXMgU0lHVEVSTVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZnVydGhlcm1vcmUsIHRoZXJlIHNob3VsZCBiZSBhIHRpbWVvdXQgb3IgYSB3YXkgdG8gZm9yY2UgY2FuY2VsIFNJR0tJTExcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgYWN0dWFsbHkgZXhpdCBoZXJlIHdpdGhvdXQgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBhdCBhbGwsIGluIHRoZSBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBpcyBpdHNlbGYgZmFpbGluZy5cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSAobm9uLXR1cmJvIHJ1bl9zdGFydGVkKVxuICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWYgKCF3b3JrZmxvd1J1bilcblxuICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuJ3MgZGVwbG95bWVudC5cbiAgICAgICAgICAgICAgICAgIC8vIFVzZWQgZWFnZXJseSBoZXJlIHNpbmNlIGJvdGggcnVuV29ya2Zsb3cgKGlucHV0XG4gICAgICAgICAgICAgICAgICAvLyBoeWRyYXRpb24gLyBob29rIHBheWxvYWQgZGVjcnlwdGlvbikgYW5kIHRoZSBydW5fZmFpbGVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWh5ZHJhdGUgcGF0aCBiZWxvdyBuZWVkIGl0LiBNZW1vaXplZCBhY2Nlc3NvcjogZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBNYWluIHJlcGxheSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy9ub0NvbnN0YW50Q29uZGl0aW9uOiBpbnRlbnRpb25hbCBsb29wXG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5LWJ1ZGdldCBjaGVjazogYmFpbCBvdXQgKHJldHJ5IG9yIGZhaWwpIGlmXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGVwIHRpbWUgd2l0aGluIHRoaXMgaW52b2NhdGlvbiBoYXMgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgYnVkZ2V0LiBTdGVwIGJvZGllcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSByZXBsYXlCdWRnZXQucGF1c2UoKS9yZXN1bWUoKSBicmFja2V0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBleGVjdXRlU3RlcGAgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxheUJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TXM6IHJlcGxheUJ1ZGdldC5jb25maWd1cmVkTGltaXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBWZXJjZWwsIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCBhbHdheXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0cyB0aGUgcHJvY2Vzcy4gT24gbG9jYWwgZGV2IGl0IHJldHVybnM7IHdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGFuZCB0aGUgcmVxdWVzdCBlbmRzIG5vcm1hbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHJ1bl9mYWlsZWQgaGFzIGJlZW4gd3JpdHRlbiBiZXN0LWVmZm9ydCkuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGltZW91dCBiZWZvcmUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSA+PVxuICAgICAgICAgICAgICAgICAgICAgIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJzb3Igb2YgdGhpcyBpdGVyYXRpb24ncyBldmVudCBsb2cgYmVmb3JlIGFueSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGFkdmFuY2UgaXQg4oCUIGRlY2xhcmVkIGF0IHRyeSBzY29wZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBjYXRjaCAod2hpY2ggcnVucyB0aGUgaW5saW5lIHN0ZXApIGNhbiByZWFkIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBgc2luY2VDdXJzb3JgIGZvciB0aGUgaW5saW5lLWRlbHRhIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZUlubGluZVdyaXRlQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyDigJQgdXNlIGNhY2hlZCBldmVudHMgd2l0aCBpbmNyZW1lbnRhbCBmZXRjaCBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBhIGN1cnNvciB3aGVuIHRoZXJlIGFyZSBldmVudHMgKGV2ZW4gb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWwgcGFnZSksIHNvIHdlIGNhbiByZWxpYWJseSB1c2UgaXQgZm9yIGluY3JlbWVudGFsIGxvYWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ0lubGluZURlbHRhICYmIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uJ3MgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIHJldHVybmVkIHRoZSBhdXRob3JpdGF0aXZlIGV2ZW50LWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZSBjdXJzb3IsIHNvIHdlIGNvbnN1bWUgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlbHRhIGlzIGJ5dGUtZm9yLWJ5dGUgd2hhdCBldmVudHMubGlzdChjdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBoYXZlIHJldHVybmVkIGF0IHdyaXRlIHRpbWUg4oCUIGl0IGluY2x1ZGVzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIncyBvd24gc3RlcCBldmVudHMsIGFueSBhdHRyX3NldCB0aGUgc3RlcCBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSwgYW5kIGFueSBpbi1iYW5kIGV2ZW50cyAoZS5nLiBob29rX3JlY2VpdmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIOKAlCBzbyBza2lwcGluZyB0aGUgZmV0Y2ggY2Fubm90IGRyb3AgZXZlbnRzIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2V3IHRoZSBwcmVmaXggZnJvbSB0aGUgc2VydmVyJ3MgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBwZW5kaW5nSW5saW5lRGVsdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhLmV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMubWFwKChlKSA9PiBlLmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkZWx0YS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gZGVsdGEuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhY2hlZEV2ZW50cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgaXRlcmF0aW9uOiB1c2UgcHJlbG9hZGVkIGV2ZW50cyBpZiBhdmFpbGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZG8gYSBmdWxsIGxvYWQgd2l0aCBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IHByZWxvYWRlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gcHJlbG9hZGVkRXZlbnRzQ3Vyc29yID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzZXF1ZW50IGl0ZXJhdGlvbjogZmV0Y2ggb25seSBuZXcgZXZlbnRzIHNpbmNlIGxhc3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWR1cGUgYnkgZXZlbnRJZDogYSBwcmV2aW91cyBpdGVyYXRpb24gbWF5IGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZGVkIGEgcmVmcmVzaGVkIHdhaXQtY29tcGxldGlvbiBkZWx0YSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxvb3Agb2JzZXJ2ZXMgdGhlIGFkdmFuY2VkIGN1cnNvciwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsIGZldGNoIGNhbiByZXR1cm4gZXZlbnRzIHdlIGFscmVhZHkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWQuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5tYXAoKGUpID0+IGUuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGxvYWRlZC5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGlvbiAyIGFmdGVyIGl0ZXJhdGlvbiAxIHVzZWQgcHJlbG9hZGVkIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdoaWNoIGRvbid0IGNhcnJ5IGEgY3Vyc29yKS4gRG8gYSBmdWxsIGxvYWQgbm93IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIHVwIGFueSBldmVudHMgd3JpdHRlbiBzaW5jZSB0aGUgcHJlbG9hZGVkIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9idGFpbiBhIGN1cnNvciBmb3Igc3Vic2VxdWVudCBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZHMuIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHBhdGgsIG5vdCBhIGJ1Zy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdObyBjdXJzb3IgYWZ0ZXIgcHJlbG9hZGVkLWV2ZW50cyBmaXJzdCBpdGVyYXRpb247IGRvaW5nIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgY3Vyc29yLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY3Vyc29yIGF2YWlsYWJsZSBkZXNwaXRlIGhhdmluZyBjYWNoZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gcHJlbG9hZGVkLWV2ZW50cyBleHBsYW5hdGlvbi4gQWxsIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHJldHVybiBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgZXZlbnRzLCBzbyB0aGlzIHNpZ25hbHMgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXb3JsZC4gRmFsbCBiYWNrIHRvIGEgZnVsbCByZWxvYWQgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjdXJzb3IgbWlzc2luZyBhZnRlciBpbml0aWFsIGxvYWQg4oCUIGZhbGxpbmcgYmFjayB0byBmdWxsIHJlbG9hZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvbi4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbmN1cnJlbnQgY29tcGxldGlvbiB2aWEgdGhlIGV2ZW50IGxvZzogaWZcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgaGFuZGxlciB3cm90ZSBhIHRlcm1pbmFsIHJ1biBldmVudCwgZXhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkb2luZyByZXBsYXkgd29yay4gVGhlIHJ1biBlbnRpdHkncyBzdGF0dXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gdGhlc2UgZXZlbnRzLCBzbyBjaGVja2luZyB0aGUgbG9nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlcyB1cyB0aGUgc2FtZSBzaWduYWwgYXMgYSBydW5zLmdldCgpIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBleHRyYSByZXF1ZXN0IHBlciBsb29wIGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgZWxhcHNlZCB3YWl0c1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRzVG9Db21wbGV0ZSA9IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTogZSBpcyBFeHRyYWN0PFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID4gJiB7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+PSAoZS5ldmVudERhdGEucmVzdW1lQXQgYXMgRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVBdDogZS5ldmVudERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdhaXRFdmVudCBvZiB3YWl0c1RvQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHdhaXRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYWl0IGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdHNUb0NvbXBsZXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IGlzIGNvbW1pdHRlZC4gTG9hZCBvbmx5IGV2ZW50cyBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHNuYXBzaG90IGN1cnNvciBzbyBjb25jdXJyZW50IGR1cmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cywgc3VjaCBhcyBob29rX3JlY2VpdmVkLCBrZWVwIHRoZWlyIG9yZGVyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSB0byB3YWl0X2NvbXBsZXRlZC4gRmFsbCBiYWNrIHRvIGEgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIGZvciBvbGRlciB3b3JsZHMgdGhhdCBjYW5ub3QgZ2l2ZSB1cyBhIHN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBvciBpZiB0aGUgY3Vyc29yIGRlbHRhIGRvZXMgbm90IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGNvbXBsZXRpb24gdGhpcyBoYW5kbGVyIGp1c3QgYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50c0N1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvciA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhd0FsbFdhaXRDb21wbGV0aW9ucyA9IHdhaXRzVG9Db21wbGV0ZS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FpdEV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QWxsV2FpdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLm1hcCgoZSkgPT4gZS5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBsb2FkZWQuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhldmVudC5ldmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZXZlbnQuZXZlbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGluZyBlbGFwc2VkIHdhaXRzIHJlZnJlc2hlcyB0aGUgZXZlbnQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgbWF5IGhhdmUgd3JpdHRlbiB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYWZ0ZXIgdGhlIGluaXRpYWwgc25hcHNob3QgYnV0IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBPbmNlIHRoZSBldmVudCBsb2cgcmVjb3JkcyB0aGF0IG91dGNvbWUsIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBpcyBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY2FjaGUgcmVmZXJlbmNlIChtYXkgaGF2ZSBiZWVuIHNldCBmb3IgZmlyc3QgdGltZSlcbiAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBldmVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCB0aGUgY3Vyc29yIGFzIGl0IHN0YW5kcyBmb3IgdGhpcyBpdGVyYXRpb24nc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZywgYmVmb3JlIGFueSBpbmxpbmUgd3JpdGVzIChzdGVwX2NyZWF0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlU3VzcGVuc2lvbiwgc3RlcF9zdGFydGVkL3N0ZXBfY29tcGxldGVkIHZpYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwKSBhZHZhbmNlIGl0LiBUaGlzIGlzIHRoZSBgc2luY2VDdXJzb3JgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIGEgc3VwcG9ydGluZyBXb3JsZCBvbiB0aGUgaW5saW5lIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIHNvIGl0IGNhbiByZXR1cm4gdGhlIGV2ZW50LWxvZyBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsZXR0aW5nIHRoZSBuZXh0IGl0ZXJhdGlvbiBza2lwIHRoZSBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0LiBDYXB0dXJlZCBoZXJlIGJlY2F1c2Ugbm90aGluZyBiZXR3ZWVuIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCBhbmQgdGhlIGlubGluZSBleGVjdXRlU3RlcCBtdXRhdGVzIGV2ZW50c0N1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICBwcmVJbmxpbmVXcml0ZUN1cnNvciA9IGV2ZW50c0N1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHdvcmtmbG93IHJlcGxheScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bldvcmtmbG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEh5ZHJhdGlvbkNhY2hlXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyByZXBsYXkgY29tcGxldGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYSB3b3JrZmxvdyB0aGF0IGZpbmlzaGVzIHdpdGggbm8gc3RlcHMgcmVhY2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBiZWZvcmUgdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZDsgb3JkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBhZnRlciBpdCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBvdXRwdXQ6IHJlc3VsdCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va3M6IGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzOiBlcnIud2FpdENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoc3VzcGVuc2lvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBWMjogaGFuZGxlIHN1c3BlbnNpb24gd2l0aG91dCBxdWV1aW5nIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1c3BlbnNpb25SZXN1bHQ6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGhhbmRsZVN1c3BlbnNpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA+O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdCA9IGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb246IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvckNvZGUoZXJyb3JDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoc3VzcGVuc2lvbkVycm9yLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiBoYW5kbGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbk1zOiBEYXRlLm5vdygpIC0gc3VzcGVuc2lvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHM6IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHM6IHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQ/LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0hvb2tDb25mbGljdDogc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGVFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9vayBjb25mbGljdDogYnJlYWsgbG9vcCwgcmUtaW52b2tlIHZpYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gUmUtaW52b2tlIGJlZm9yZSBwcm9jZXNzaW5nIHBlbmRpbmcgc3RlcHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBQcm9taXNlLnJhY2UoW3NldEF0dHJpYnV0ZXMoKSwgc3RlcCgpXSksIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBhdHRyaWJ1dGUgZXZlbnQgY2FuIHdpbiB3aXRob3V0IGV4ZWN1dGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvc2luZyBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBzID0gc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBleGVjdXRpb24gaXMgZ2F0ZWQgb24gb3duZXJzaGlwLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgdG8gYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIChgbGF6eUlubGluZVN0ZXBzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBydW4gdGhlbSBpbmxpbmUg4oCUIGluIHBhcmFsbGVsIOKAlCB2aWEgbGF6eVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfc3RhcnRlZGAgZXZlbnRzIHRoYXQgY3JlYXRlIGVhY2ggc3RlcCBvbiB0aGUgZmx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2aW5nIG9uZSB3b3JsZCByb3VuZC10cmlwIHBlciBpbmxpbmUgc3RlcC4gT3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBhdG9taWMgYW5kIGV4YWN0bHktb25lIHBlciBzdGVwOiB0aGUgd29ybGQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIHN0ZXBfc3RhcnRlZCByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKOKGkiBleGVjdXRlU3RlcCBgc2tpcHBlZGApIHRvIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBsb3Nlciwgc28gb25seSBvbmUgaGFuZGxlciBldmVyIHJ1bnMgYSBnaXZlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9keS4gRXZlcnkgb3RoZXIgcGVuZGluZyBzdGVwIGtlZXBzIGl0cyBlYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIChpbiBgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkc2ApIGFuZCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgb25seSBkZXNpZ25hdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbGF6eUlubGluZVN0ZXBzYCB3aGVuIG5vIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByZXNlbnQuIFRoYXQgYXdhaXRlciBjYXNlIG11c3QgZXhlY3V0ZSBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmU6IGFuIGlubGluZSBgYXdhaXQgZXhlY3V0ZVN0ZXAoLi4uKWAgYmxvY2tzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sIHNvIHRoZSBhd2FpdGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiAod2hpY2ggb25seSBhZHZhbmNlcyBvbiB0aGUgbmV4dCByZXBsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBzZXJpYWxpemVkIGJlaGluZCB0aGUgc3RlcCDigJQgZGVmZWF0aW5nIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JrZmxvdyBleHByZXNzZWQgYXMgcGFyYWxsZWwgKGUuZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBob29rLmdldENvbmZsaWN0KCkudGhlbigoKSA9PiBzdGVwQigpKWAgcmFjaW5nIGBhd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcEEoKWApLiBJbiB0aGF0IGNhc2UgYGxhenlJbmxpbmVTdGVwc2AgaXMgZW1wdHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBzdGVwIGlzIHF1ZXVlZCBmb3IgcmUtaW52b2NhdGlvbiwgd2hpY2ggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIgd2hpbGUgcXVldWVkIHN0ZXBzIHJ1biBpbiBwYXJhbGxlbCBpbnZvY2F0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhenlJbmxpbmVTdGVwcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQubGF6eUlubGluZVN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiBzLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmaWVkIHF1ZXVlIGRpc3BhdGNoIGZvciBldmVyeXRoaW5nIHdlIGFyZSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZS1leGVjdXRpbmcuIFN0ZXBzIGFyZSBxdWV1ZWQgd2l0aCBzdGVwSWQgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlciBydW5zIHRoZW07IHRoZSB3YWl0IHRpbWVyIGlzIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBnZW5lcmljIGNvbnRpbnVhdGlvbiB0aGF0IGZpcmVzIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBlbGFwc2VzIGFuZCBsZXRzIHRoZSBuZXh0IHJlcGxheSBvYnNlcnZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IHZpYSB0aGUgXCJjb21wbGV0ZSBlbGFwc2VkIHdhaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBxdWV1ZWluZyBpcyB1bmNvbmRpdGlvbmFsIChjb3ZlcnMgY3Jhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZiBhIHByaW9yIGhhbmRsZXIgd3JvdGUgc3RlcF9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgY3Jhc2hlZCBiZWZvcmUgcXVldWVpbmcsIGEgbGF0ZXIgaGFuZGxlciB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGVtOyBpZGVtcG90ZW5jeUtleSBvbiBjb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWR1cGVzIHJlZHVuZGFudCBxdWV1ZXMgYWNyb3NzIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXJzKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2FpdCBjb250aW51YXRpb24gaXMgd2hhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYFByb21pc2UucmFjZShzdGVwLCBzbGVlcClgIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgZXhlY3V0aW9uOiBldmVuIGlmIHRoZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzIHRoaXMgaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IHRpbWVyIGZpcmVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24uIElmIHRoZSBzbGVlcCB3aW5zLCB0aGF0IHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGNvbXBsZXRlcyB0aGUgcnVuOyBpZiB0aGUgc3RlcCB3aW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgY29udGludWF0aW9uIGZpcmVzIGxhdGVyIGFuZCBuby1vcHMgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hbCBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRpbnVhdGlvbidzIGRlbGF5IGlzIGNsYW1wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIHF1ZXVlIGRlbGF5IChsb25nIHdhaXRzIGNoYWluIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgaG9wcykgYW5kIGl0cyBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gcGFzc2VzIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMgZm9yIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheS9rZXkgc2VsZWN0aW9uIHJhdGlvbmFsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGRpc3BhdGNoZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGV4ZWN1dGUgaW5saW5lIOKAlCBldmVyeXRoaW5nIGhhcyBiZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgKG9yIG5vIHdvcmsgbmVlZHMgc2NoZWR1bGluZykuIEV4aXQgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGRyaXZlIHN1YnNlcXVlbnQgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlciBuZWVkcyBhbiBpbW1lZGlhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdGhlIHJlcGxheSBjb25zdW1lcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlci4gV2l0aG91dCBpdCAobm8gaW5saW5lIHN0ZXAsIGFsbCB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBvciBub25lIHBlbmRpbmcpIHRoZSBydW4gd291bGQgc2l0IGlkbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW50aWwgc29tZSB1bnJlbGF0ZWQgbWVzc2FnZSB3b2tlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBpbmxpbmUgc3RlcC4gUGF1c2UgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHN0ZXAgYm9keSDigJQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RHVyYXRpb24sIG5vdCBieSB0aGUgcmVwbGF5IHRpbWVvdXQuIFdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGhlIHJlcGxheS1idWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gd291bGQgKGluY29ycmVjdGx5KSBjaGFyZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIGJvZHkgYWdhaW5zdCB0aGUgYnVkZ2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IOKAlCBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBwcmVJbmxpbmVXcml0ZUN1cnNvcmA7IGEgV29ybGQgbWF5IHJldHVybiBub25lIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgaW5pdGlhbCBsb2FkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoaXMgaXMgdGhlIGNsZWFuIHNpbmdsZS1zdGVwIHNlcXVlbnRpYWwgY2FzZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgc3VzcGVuc2lvbiBwcm9kdWNlZCBleGFjdGx5IG9uZSBzdGVwIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaG9va3Mgb3Igd2FpdHMgKGBlcnIue3N0ZXAsaG9vayx3YWl0fUNvdW50YCksIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9uZSBzdGVwIGlzIHRoZSBsb25lIHBlbmRpbmcgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxYCkgYW5kIHRoZSBsb25lIGlubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RlcCAoYGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDFgIOKAlCBubyBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2libGluZ3MgcXVldWVkIHRvIGJhY2tncm91bmQgaGFuZGxlcnMsIGFuZCBubyBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaW5saW5lIHN0ZXAgd3JpdGluZyBpdHMgb3duIGV2ZW50cyBvdXQgb2YgYmFuZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBObyBwZW5kaW5nIHdhaXQgdGltZXIgZnJvbSBUSElTIHN1c3BlbnNpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBUaGUgcnVuIGhhcyBOTyBwcmUtZXhpc3Rpbmcgb3BlbiBob29rIG9yIHdhaXQuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHBsdXMgdGhlIHBlci1zdXNwZW5zaW9uIGNvdW50cyBhYm92ZSBpcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGxvYWQtYmVhcmluZyBzYWZldHkgY2hlY2s6IHRoZSBkZWx0YSBzbmFwc2hvdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBsb2cgYXQgdGhlIHN0ZXBfY29tcGxldGVkIHdyaXRlIGJ1dCBpcyBjb25zdW1lZCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIG5leHQgcmVwbGF5LCBzbyBhbiBvdXQtb2YtYmFuZCBob29rX3JlY2VpdmVkIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdhaXRfY29tcGxldGVkIGxhbmRpbmcgaW4gdGhhdCB3aW5kb3cgd291bGQgYmUgaW4gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVhbCBmZXRjaCB5ZXQgYWJzZW50IGZyb20gdGhlIHN0YWxlIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmlza2luZyBhIGRpdmVyZ2VudCByZXBsYXkuIFdpdGggbm8gaG9vay93YWl0IG9wZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChuZWl0aGVyIGNhcnJpZWQgb3ZlciBub3IgY3JlYXRlZCB0aGlzIHN1c3BlbnNpb24pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIG9ubHkgb3V0LW9mLWJhbmQgd3JpdGVyIGlzIGNhbmNlbGxhdGlvbiwgd2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIHNhZmUgdG8gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaGFzT3Blbkhvb2tPcldhaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHN0ZXAgcnVucyBpbmxpbmUsIGVhY2ggd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duIGV2ZW50cyBhbmQgdGhlIHBlci13cml0ZSBkZWx0YSB3b3VsZCBiZSBwYXJ0aWFsLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhIGlzIG5vdCByZXF1ZXN0ZWQgKHRoZSBnYXRlIGJlbG93IGlzIGZhbHNlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGktc3RlcCkgYW5kIHRoZSBuZXh0IGl0ZXJhdGlvbiBkb2VzIGEgbm9ybWFsIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdElubGluZURlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHByZUlubGluZVdyaXRlQ3Vyc29yID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc09wZW5Ib29rT3JXYWl0KGNhY2hlZEV2ZW50cyA/PyBbXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgZm9yY2VzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCDigJQgYnV0IG9ubHkgd2hpbGUgdGhlIHJ1biBpcyBzdGlsbCBcImNsZWFuXCIgKGEgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9uKS4gVGhlIG1vbWVudCBhIGhvb2sgb3Igd2FpdCAob3IgYXR0cikgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIGxhdGVyIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBiZWNvbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlLCBzbyB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgbm8gbG9uZ2VyIGhvbGRzIOKAlCB0dXJib1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgYW5kIHRoZSBzdGVwcyB0YWtlIHRoZSBub3JtYWwgKGVudi1nYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0LXRoZW4tcnVuIHBhdGguIFRoZSBob29rLWNvbmZsaWN0IC8gYXR0ciBjYXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSByZXR1cm5lZCBlYXJseSBhYm92ZSBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmUgZGVmZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgc3VzcGVuc2lvblJlc3VsdC4qYCBmbGFncyBvbmx5IHJlZmxlY3Qgd2hhdCBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBjcmVhdGVkLCBzbyB0aGV5IGRvIG5vdCBjYXRjaCBhIGhvb2svd2FpdCBvcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFuIGVhcmxpZXIgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIGRlbGl2ZXJ5IChlLmcuIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vayguLi4pYCB0aGF0IGRvZXNuJ3QgYmxvY2sgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdywgbGV0dGluZyB0aGUgcmVwbGF5IGxvb3AgY29udGludWUgdG8gbGF0ZXIgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9ucykuIE9uY2UgYW55IGhvb2sgb3Igd2FpdCBpcyBvcGVuIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VtdWxhdGl2ZSBsb2csIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBhcmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLCBzbyB0dXJibyBtdXN0IGxhdGNoIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWFuZW50bHkg4oCUIGNoZWNrZWQgaGVyZSB2aWEgYGhhc09wZW5Ib29rT3JXYWl0YCBvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VtdWxhdGl2ZSBgY2FjaGVkRXZlbnRzYC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzT3Blbkhvb2tPcldhaXQoY2FjaGVkRXZlbnRzID8/IFtdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIHN0ZXBzIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWRnZXQgaXMgcGF1c2VkIGZvciB0aGUgd2hvbGUgYmF0Y2gg4oCUIHN0ZXAgZHVyYXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb24gbWF4RHVyYXRpb24sIG5vdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aW1lb3V0IOKAlCBzbyB0aGUgYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGRvZXNuJ3QgY2hhcmdlIHRoZSBzdGVwIGJvZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHRzOiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD5cbiAgICAgICAgICAgICAgICAgICAgICAgID5bXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IHNlbmQgdGhlIGRlZmVycmVkIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBvbiBzdGVwX3N0YXJ0ZWQgc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgb24gdGhlIGZseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogcy5kZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBmb3JjZSBvcHRpbWlzdGljIHN0YXJ0IGFuZCBob2xkIHRoZSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCB1bnRpbCB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbmRzICh0aGUgYm9keSBzdGlsbCBydW5zIGltbWVkaWF0ZWx5KS4gQm90aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdW5kZWZpbmVkL2ZhbHNlIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXF1ZXN0SW5saW5lRGVsdGEgJiYgcHJlSW5saW5lV3JpdGVDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVJbmxpbmVXcml0ZUN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgdGhlIGJhdGNoIHJlc3VsdHMuIGByZXRyeWAgc3RlcHMgKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGV4aXN0IOKAlCB0aGVpciBgc3RlcF9zdGFydGVkYCBzdWNjZWVkZWQpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcXVldWVkIHBlci1zdGVwIGFzIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5OyBgdGhyb3R0bGVkYCBzdGVwcyAocmVqZWN0ZWQgb24gdGhlIGNyZWF0ZS1jbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG5ldmVyIGNyZWF0ZWQpIGluc3RlYWQgZGVmZXIgcmVkZWxpdmVyeSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSBzbyB0aGV5IHJlLXJ1biBpbmxpbmUgd2l0aCBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVwbGF5OyBjb21wbGV0ZWQvZmFpbGVkIHN0ZXBzIGFscmVhZHkgd3JvdGUgdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50cy4gV2Ugb25seSBsb29wIGJhY2sgdG8gcmVwbGF5IHdoZW4gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSDigJQgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtcGVuZGluZyBzdGVwcyB3aWxsIGJlIHJlLXJ1biBieSB0aGVpciBxdWV1ZWQgcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFuZCB0aGUgYmFja2dyb3VuZC1zdGVwIGhhbmRsZXIgcmVwbGF5cyBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1JldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6ICh0eXBlb2YgbGF6eUlubGluZVN0ZXBzKVtudW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFueVBlbmRpbmdPcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGhyb3R0bGVkIGlubGluZSBzdGVwIGRlbGF5cyByZWRlbGl2ZXJ5IG9mIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHJlLXF1ZXVlZCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAuIENydWNpYWxseSwgYSBgdGhyb3R0bGVkYCByZXN1bHQgbWVhbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHdhcyByZWplY3RlZCBvbiB0aGUgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0g4oCUIHNvIHRoZSBzdGVwIHdhcyBORVZFUiBjcmVhdGVkIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIG5vIHN0ZXAgZW50aXR5KS4gUmUtcXVldWluZyBpdCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAgd291bGQgc2VuZCBhIGJhcmUgYHN0ZXBfc3RhcnRlZGAgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCksIHdoaWNoIHRoZSB3b3JsZCByZWplY3RzIHdpdGggYFN0ZXAgXCI8aWQ+XCIgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZGAgYmVjYXVzZSBpdCBjYW5ub3QgbGF6aWx5IGNyZWF0ZSB0aGUgc3RlcCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5wdXQ7IHRoYXQgZXJyb3IgaXNuJ3QgdHJhbnNsYXRhYmxlLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyB1bnRpbCBNQVhfUVVFVUVfREVMSVZFUklFUyBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChhbmQgcnVuKSBmYWlsLiBEZWZlcnJpbmcgcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBpbnN0ZWFkIHJlLWF0dGVtcHRzIHRoZSB0aHJvdHRsZWQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIFdJVEggaXRzIGlucHV0IG9uIHJlcGxheS4gV2UgdHJhY2sgdGhlIGxvbmdlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tvZmYgc28gYSBiYXRjaCB3aXRoIG11bHRpcGxlIHRocm90dGxlcyB3YWl0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heC4gTm90ZTogYHJldHJ5YCByZXN1bHRzIGFyZSBzYWZlIHRvIHJlLXF1ZXVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIGJlY2F1c2UgYSByZXRyeSBpbXBsaWVzIGBzdGVwX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCBhbmQgdGhlIHN0ZXAgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXp5SW5saW5lU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHN0ZXBSZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbGF6eUlubGluZVN0ZXBzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IHIudGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRpbWVvdXRTZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVBlbmRpbmdPcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZlciByZWRlbGl2ZXJ5IG9mIHRoZSBvcmNoZXN0cmF0b3IgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm90dGxlIGJhY2tvZmYuIE9uIHJlcGxheSBldmVyeSBub24tdGVybWluYWwgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZS1kaXNwYXRjaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXI6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC10aHJvdHRsZWQgc3RlcHMgcnVuIGlubGluZSBhZ2FpbiBXSVRIIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0ICh0aGVpciBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCBhbmV3KSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBgcmV0cnlgIHN0ZXBzIGluIHRoaXMgYmF0Y2ggYXJlIHF1ZXVlZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duIHJldHJ5QWZ0ZXIgaG9ub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgc3RlcHMgKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZWQgZnJvbSB0aGVpciBldmVudHMgYW5kIG5vdCByZS1ydW4uIEJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBkcml2ZXMgYWxsIHJlbWFpbmluZyB3b3JrLCB3ZSBtdXN0IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHJlLXF1ZXVlIGB0b1JldHJ5YCBoZXJlIOKAlCB0aGF0IHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1kaXNwYXRjaCB0aG9zZSBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEJFRk9SRSB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdywgc28gYSBiYXRjaCB0aGF0IG1peGVzIGEgdGhyb3R0bGUgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzdGVwIHRoYXQgbGVmdCB1bmZsdXNoZWQgb3BzIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZSBleHBsaWNpdCBmbHVzaCBjb250aW51YXRpb24uIFRoYXQgaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0aHJvdHRsZSBiYWNrb2ZmICg+PSAxcykgYWx3YXlzIGV4Y2VlZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluLWludm9jYXRpb24gZmx1c2ggd2luZG93ICg8PSA1MDBtcyArIHdhaXRVbnRpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG9wcyBzZXR0bGUgYmVmb3JlIHRoZSBwb3N0LWJhY2tvZmYgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzIGFuZCByZWFkcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UodGhyb3R0bGVUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5tYXAoKHsgc3RlcCwgZGVsYXlTZWNvbmRzIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJldHJ5VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSB0aGUgZGVsYXllZCByZXRyeSBvbiB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVsYXRpb25JZCBzbyBpdCBkZWR1cGVzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZWQgcmUtZGlzcGF0Y2ggdGhlIHN1c3BlbnNpb24gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1zIG9uIHJlcGxheSAoaXQgYWxzbyB1c2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWRgKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYSBtaXhlZCBiYXRjaCB3aGVyZSBvbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjb21wbGV0ZWRgIHdpdGggdW5mbHVzaGVkIGJhY2tncm91bmQgb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBhbnlQZW5kaW5nT3BzYCkgYW5kIGFub3RoZXIgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHdvdWxkIGRvdWJsZS1kaXNwYXRjaCB0aGUgcmV0cnk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2ggYmVsb3cgcXVldWVzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHBsYWluIGNvbnRpbnVhdGlvbiwgd2hvc2UgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlcyB0aGUgc3RpbGwtYHJldHJ5aW5nYCBzdGVwIGFzIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcyBpdCAqaW1tZWRpYXRlbHkqIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICp3aXRoKiBhIGtleS4gU2luY2UgdGhpcyBkZWxheWVkIHJldHJ5IGhhZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGtleSwgdGhlIHR3byBtZXNzYWdlcyB3b3VsZG4ndCBkZWR1cGUg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgd291bGQgcnVuIHR3aWNlLCB0aGUgY29uZmlndXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJhY2tvZmYgd291bGQgYmUgaWdub3JlZCAocGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgRXJyb3JgIHJldHJpZXMgcGVyc2lzdCBubyBgcmV0cnlBZnRlcmAsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGhhcyBubyBgVG9vRWFybHlgIGd1YXJkKSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJvZHkgY291bGQgcnVuIGVhcmx5L2NvbmN1cnJlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFyaW5nIHRoZSBrZXkgbGV0cyB0aGUgZWFybGllciBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB3aW4sIGhvbm9yaW5nIHRoZSBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFueSBpbmxpbmUgc3RlcCBoYWQgcGVuZGluZyBiYWNrZ3JvdW5kIG9wcyAoZS5nLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB3cml0ZXMgdG8gUzMpLCBicmVhayB0aGUgbG9vcCBhbmQgcXVldWUgYSBwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIHNvIHdhaXRVbnRpbCBjYW4gZmx1c2ggdGhlbSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHJlcGxheSByZWFkcyB0aGVtLiBUaGlzIG1hdGNoZXMgVjEgYmVoYXZpb3Igd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggc3RlcCByYW4gaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFueVBlbmRpbmdPcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnJlYWtpbmcgbG9vcDogaW5saW5lIHN0ZXAgaGFzIHBlbmRpbmcgb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBsb29wSXRlcmF0aW9uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBpbmxpbmUgc3RlcHMgd2lsbCBiZSByZS1ydW4gdmlhIHRoZWlyIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBtZXNzYWdlczsgdGhlIGJhY2tncm91bmQtc3RlcCBoYW5kbGVyIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbGwgc3RlcHMgYXJlIHRlcm1pbmFsLiBEb24ndCBsb29wIGhlcmUg4oCUIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyBzdGVwcyBoYXZlIG5vIHRlcm1pbmFsIGV2ZW50IHRvIG9ic2VydmUgeWV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBpbmxpbmUgc3RlcHMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIOKAlCBsb29wIGJhY2sgdG8gcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHdvcmtmbG93IG9ic2VydmVzIHRoZSB0ZXJtaW5hbCBldmVudHMgb24gcmVwbGF5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlIGlubGluZSBzdGVwJ3MgdGVybWluYWwgd3JpdGUgcmV0dXJuZWQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBkZWx0YSAoc3VwcG9ydGluZyBXb3JsZCArIHRoZSBzaW5nbGUtc3RlcCBnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSksIHN0YXNoIGl0IHNvIHRoZSBuZXh0IGl0ZXJhdGlvbidzIGxvYWQgY29uc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC4gT25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBsZXRlZCBwYXRoIGNhcnJpZXMgYSBkZWx0YTsgbXVsdGktc3RlcCBiYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZXF1ZXN0IG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ubHkgPSBzdGVwUmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LmlubGluZURlbHRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9ubHkuaW5saW5lRGVsdGEuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IG9ubHkuaW5saW5lRGVsdGEuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBvbmx5LmlubGluZURlbHRhLmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50IDw9IFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJlcGxheSBkaXZlcmdlZDsgcXVldWVpbmcgYSByZWNvdmVyeSByZXBsYXkgYmVmb3JlIGRlY2xhcmluZyB0aGUgZXZlbnQgbG9nIGNvcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlRXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yRGl2ZXJnZW5jZUV2ZW50SWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZT8uZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlY292ZXJ5UmVwbGF5czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBuZXcgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkICR7ZGl2ZXJnZW5jZUNvdW50fSB0aW1lcyBhZnRlciAke1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtIOKAlCBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSAvLyBFbmQgd2hpbGUgbG9vcFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTsgLy8gRW5kIHRyYWNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTsgLy8gRW5kIHdpdGhXb3JrZmxvd0JhZ2dhZ2VcbiAgICAgICAgfSk7IC8vIEVuZCB3aXRoVHJhY2VDb250ZXh0XG4gICAgICB9XG4gICAgKTtcblxuICBsZXQgY2FjaGVkSGFuZGxlcjogKChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+KSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaWYgKCFjYWNoZWRIYW5kbGVyKSB7XG4gICAgICBjYWNoZWRIYW5kbGVyID0gaGFuZGxlcihhd2FpdCBnZXRXb3JsZEhhbmRsZXJzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkSGFuZGxlcihyZXEpO1xuICB9KTtcbn1cbiJdfQ==
1575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUNqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsNkJBQTZCLEdBQzlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixZQUFZLEdBQ2IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7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OnV0aWwnO1xuaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICByZXNvbHZlUXVldWVOYW1lc3BhY2UsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG4gIFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYSxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbiAgdHlwZSBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGNsYXNzaWZ5UnVuRXJyb3IsIGlzV29ybGRDb250cmFjdEVycm9yIH0gZnJvbSAnLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBkZXNjcmliZUVycm9yIH0gZnJvbSAnLi9kZXNjcmliZS1lcnJvci5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgaXNUdXJib0VuYWJsZWQsXG4gIE1BWF9RVUVVRV9ERUxJVkVSSUVTLFxuICBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyxcbn0gZnJvbSAnLi9ydW50aW1lL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBsb2FkV29ya2Zsb3dSdW5FdmVudHMsXG4gIG1lbW9pemVFbmNyeXB0aW9uS2V5LFxuICBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZCxcbiAgcXVldWVNZXNzYWdlLFxuICB3aXRoSGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCxcbiAgUmVwbGF5QnVkZ2V0LFxufSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LWJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBleGVjdXRlU3RlcCB9IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGhhbmRsZVN1c3BlbnNpb24gfSBmcm9tICcuL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLmpzJztcbmltcG9ydCB7IGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaCB9IGZyb20gJy4vcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQge1xuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgdHlwZSBXb3JsZEhhbmRsZXJzLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlUnVuRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrIH0gZnJvbSAnLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVN0ZXBIeWRyYXRpb25DYWNoZSxcbiAgdHlwZSBTdGVwSHlkcmF0aW9uQ2FjaGUsXG59IGZyb20gJy4vc3RlcC1oeWRyYXRpb24tY2FjaGUuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyxcbiAgZ2V0TmV4dFRyYWNlQ2FycmllcixcbiAgZ2V0U3BhbktpbmQsXG4gIGdldFdvcmtmbG93VHJhY2VNb2RlLFxuICBpc1VzYWJsZVRyYWNlQ2FycmllcixcbiAgdHJhY2UsXG4gIHdpdGhUcmFjZUNvbnRleHQsXG4gIHdpdGhXb3JrZmxvd0JhZ2dhZ2UsXG59IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldEVycm9yTmFtZSwgZ2V0RXJyb3JTdGFjaywgbm9ybWFsaXplVW5rbm93bkVycm9yIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UgfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHsgcnVuV29ya2Zsb3cgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfTtcbmV4cG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgSGVhbHRoQ2hlY2tFbmRwb2ludCxcbiAgdHlwZSBIZWFsdGhDaGVja09wdGlvbnMsXG4gIHR5cGUgSGVhbHRoQ2hlY2tSZXN1bHQsXG4gIGhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBnZXRIb29rQnlUb2tlbixcbiAgcmVzdW1lSG9vayxcbiAgcmVzdW1lV2ViaG9vayxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJztcbmV4cG9ydCB7XG4gIGdldFJ1bixcbiAgUnVuLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW0sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMsXG59IGZyb20gJy4vcnVudGltZS9ydW4uanMnO1xuZXhwb3J0IHtcbiAgY2FuY2VsUnVuLFxuICBsaXN0U3RyZWFtcyxcbiAgdHlwZSBSZWFkU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBSZWNyZWF0ZVJ1bk9wdGlvbnMsXG4gIHJlYWRTdHJlYW0sXG4gIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nLFxuICByZWVucXVldWVSdW4sXG4gIHR5cGUgU3RvcFNsZWVwT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBSZXN1bHQsXG4gIHdha2VVcFJ1bixcbn0gZnJvbSAnLi9ydW50aW1lL3J1bnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBTdGFydE9wdGlvbnMsXG4gIHR5cGUgU3RhcnRPcHRpb25zQmFzZSxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQsXG4gIHN0YXJ0LFxufSBmcm9tICcuL3J1bnRpbWUvc3RhcnQuanMnO1xuLy8gVjI6IHN0ZXBFbnRyeXBvaW50IGlzIG5vIGxvbmdlciByZS1leHBvcnRlZCDigJQgdGhlIGNvbWJpbmVkIGhhbmRsZXJcbi8vICh3b3JrZmxvd0VudHJ5cG9pbnQpIGV4ZWN1dGVzIHN0ZXBzIGlubGluZS4gUmVtb3ZpbmcgdGhlIHJlLWV4cG9ydFxuLy8gcHJldmVudHMgVHVyYm9wYWNrIGZyb20gdHJhY2luZyBzdGVwLWhhbmRsZXIuanMg4oaSIGdldC1wb3J0LmpzXG4vLyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgaW50byB0aGUgZmxvdyByb3V0ZSBidW5kbGUuXG5leHBvcnQge1xuICBjcmVhdGVXb3JsZCxcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHNldFdvcmxkLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycjogdW5rbm93bik6IFJ1bkVycm9yQ29kZSB8IG51bGwge1xuICBpZiAoV29ya2Zsb3dSdW50aW1lRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUjtcbiAgfVxuXG4gIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gVGVybWluYWwgcnVuIGV2ZW50cyBhcmUgYWx3YXlzIGxhc3QgYnkgY29uc3RydWN0aW9uIChubyBldmVudCBjcmVhdGlvblxuICAvLyBzdWNjZWVkcyBhZ2FpbnN0IGEgdGVybWluYWwgcnVuKSwgYnV0IHNjYW4gdGhlIGZ1bGwgYXJyYXkgZm9yXG4gIC8vIGRlZmVuc2UtaW4tZGVwdGg6IGEgV29ybGQvYmFja2VuZCBvcmRlcmluZyBidWcgc2hvdWxkbid0IG1ha2UgdXMgbWlzcyBhblxuICAvLyBhY3R1YWwgdGVybWluYXRpb24gc2lnbmFsLlxuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGUpID0+XG4gICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICApO1xuXG4gIGlmICghdGVybWluYWxSdW5FdmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1J1biByZWFjaGVkIHRlcm1pbmFsIGV2ZW50LCBleGl0aW5nJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGV2ZW50VHlwZTogdGVybWluYWxSdW5FdmVudC5ldmVudFR5cGUsXG4gICAgZXZlbnRJZDogdGVybWluYWxSdW5FdmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcnVuIGhhcyBhbnkgaG9vayBvciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5IOKAlCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFRoaXMgZ2F0ZXMgdGhlIGlubGluZS1kZWx0YSBmYXN0IHBhdGguIFRoZSBkZWx0YSByZXR1cm5lZCBieSB0aGVcbiAqIHN0ZXAtdGVybWluYWwgd3JpdGUgaXMgdGhlIGV2ZW50IGxvZyBhcyBvZiB0aGF0IHdyaXRlOyBpdCBpcyBjb25zdW1lZFxuICogb24gdGhlIE5FWFQgbG9vcCBpdGVyYXRpb24sIHNvIGFueSBldmVudCBhIGNvbmN1cnJlbnQgd3JpdGVyIGFwcGVuZHMgaW5cbiAqIHRoYXQgd2luZG93IHdvdWxkIGJlIHByZXNlbnQgaW4gYSByZWFsIGBldmVudHMubGlzdGAgZmV0Y2ggYnV0IGFic2VudFxuICogZnJvbSB0aGUgc3RhbGUgZGVsdGEuIE1pc3Npbmcgc3VjaCBhbiBldmVudCBmb3Igb25lIHJlcGxheSBjYW4gZHVyYWJseVxuICogY29tbWl0IGEgc2NoZWR1bGluZyBkZWNpc2lvbiAoZS5nLiBpbmxpbmUtZXhlY3V0aW5nIHRoZSBsb3NlciBvZiBhXG4gKiBgUHJvbWlzZS5yYWNlKFtob29rLCBzdGVwXSlgKSB0aGF0IHRoZSBldmVudHVhbCBmdWxsIHJlcGxheSBjYW5ub3RcbiAqIGNvbnN1bWUg4oCUIGEgYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuIFdoZW4gbm8gaG9vayBvciB3YWl0IGlzIG9wZW4sIHRoZVxuICogb25seSBvdXQtb2YtYmFuZCB3cml0ZXIgaXMgY2FuY2VsbGF0aW9uLCB3aGljaCBpcyBiZW5pZ24gdG8gb2JzZXJ2ZSBvbmVcbiAqIGl0ZXJhdGlvbiBsYXRlICh0aGUgbmV4dCBlbnRpdHkgd3JpdGUgaXMgcmVqZWN0ZWQgYWdhaW5zdCB0aGUgdGVybWluYWxcbiAqIHJ1biBhbmQgdGhlIHJ1biBpcyBhbHJlYWR5IHRlcm1pbmFsKSwgc28gdGhlIGZhc3QgcGF0aCBpcyBzYWZlLlxuICpcbiAqIFN0ZXAtYm9keSBgYXR0cl9zZXRgIHdyaXRlcyBhcmUgTk9UIGEgY29uY2VybjogdGhleSBsYW5kIGJlZm9yZSB0aGVcbiAqIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSBhbmQgYXJlIHRoZXJlZm9yZSBhbHJlYWR5IGluc2lkZSB0aGUgcmV0dXJuZWRcbiAqIGRlbHRhLlxuICovXG5mdW5jdGlvbiBoYXNPcGVuSG9va09yV2FpdChldmVudHM6IEV2ZW50W10pOiBib29sZWFuIHtcbiAgY29uc3QgZGlzcG9zZWRIb29rSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSBkaXNwb3NlZEhvb2tJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgIGNvbXBsZXRlZFdhaXRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICFkaXNwb3NlZEhvb2tJZHMuaGFzKGUuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgcm91dGUgd2hpY2ggaGFuZGxlcyB3b3JrZmxvdyBleGVjdXRpb24gcmVxdWVzdHMsXG4gKiBleGVjdXRpbmcgc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUgdG8gcmVkdWNlIGZ1bmN0aW9uIGludm9jYXRpb25zXG4gKiBhbmQgcXVldWUgb3ZlcmhlYWQuXG4gKlxuICogVGhlIGhhbmRsZXIgbG9vcHM6IHJlcGxheSB3b3JrZmxvdyDihpIgZXhlY3V0ZSBzdGVwIGlubGluZSDihpIgcmVwbGF5IOKGkiAuLi5cbiAqIHVudGlsIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMsIHRpbWVzIG91dCwgb3IgZW5jb3VudGVycyBub24tc3RlcCBzdXNwZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3dDb2RlIC0gVGhlIHdvcmtmbG93IGJ1bmRsZSBjb2RlIGNvbnRhaW5pbmcgYWxsIHdvcmtmbG93IGZ1bmN0aW9uc1xuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgVmVyY2VsIEFQSSByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dFbnRyeXBvaW50KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgbmFtZXNwYWNlPzogc3RyaW5nOyByb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQ/OiBudW1iZXIgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TID1cbiAgICBOdW1iZXIocHJvY2Vzcy5lbnYuV09SS0ZMT1dfVjJfVElNRU9VVF9NUykgfHwgMTIwXzAwMDtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZVxuICAgICAgICAvLyBOT1RFOiBIZWFsdGggY2hlY2sgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgdW5hdXRoZW50aWNhdGVkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLlxuICAgICAgICAvLyBUaGV5IG9ubHkgd3JpdGUgYSBzaW1wbGUgc3RhdHVzIHJlc3BvbnNlIHRvIGEgc3RyZWFtIGFuZCBkbyBub3QgZXhwb3NlIHNlbnNpdGl2ZSBkYXRhLlxuICAgICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChtZXNzYWdlXyk7XG4gICAgICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgICAgICAgJ3dvcmtmbG93JyxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgfSA9IFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYS5wYXJzZShtZXNzYWdlXyk7XG4gICAgICAgIC8vIGBzdGFydCgpYCBhbHdheXMgYXR0YWNoZXMgYSB0cmFjZSBjYXJyaWVyLCBidXRcbiAgICAgICAgLy8gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkgcmV0dXJucyBge31gIHdoZW4gbm8gT1RFTCBTREsgaXMgcmVnaXN0ZXJlZFxuICAgICAgICAvLyBvciBubyBzcGFuIGlzIGFjdGl2ZSDigJQgdHJlYXQgYW4gZW1wdHkgY2FycmllciB0aGUgc2FtZSBhcyBhblxuICAgICAgICAvLyBhYnNlbnQgb25lIHNvIGxpbmtlZCBtb2RlIGZhbGxzIGJhY2sgdG8gYSBmcmVzaCBvcmlnaW4gaW5zdGVhZCBvZlxuICAgICAgICAvLyBmb3J3YXJkaW5nIGEgdXNlbGVzcyBge31gIGZvcmV2ZXIuXG4gICAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nVHJhY2VDYXJyaWVyKVxuICAgICAgICAgID8gaW5jb21pbmdUcmFjZUNhcnJpZXJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhO1xuICAgICAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uod29ya2Zsb3dQcmVmaXgubGVuZ3RoKTtcblxuICAgICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgICAvLyBFbmZvcmNlIG1heCBkZWxpdmVyeSBsaW1pdCBiZWZvcmUgYW55IGluZnJhc3RydWN0dXJlIGNhbGxzLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJ1bmF3YXkgd29ya2Zsb3dzIGZyb20gY29uc3VtaW5nIGluZmluaXRlIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gICAgICAgIC8vIFNjb3BlZCBsb2dnZXIgZm9yIHRoaXMgcnVuIOKAlCBhdHRhY2hlcyBydW5JZC93b3JrZmxvd05hbWUgdG8gZXZlcnlcbiAgICAgICAgLy8gbG9nIGxpbmUgYW5kIGNoaWxkIGxvZ2dlcnMgYmVsb3csIHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgICBjb25zdCBydW5Mb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihydW5JZCwgd29ya2Zsb3dOYW1lKTtcblxuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IE1BWF9RVUVVRV9ERUxJVkVSSUVTKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHtNQVhfUVVFVUVfREVMSVZFUklFU30pYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgZXJyb3JDb2RlOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uZXJyb3JDb2RlLFxuICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCBydW5JZCk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IGV4Y2VlZGVkIG1heGltdW0gcXVldWUgZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uIOKAlFxuICAgICAgICAvLyByb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzIOKAlCBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJRcbiAgICAgICAgLy8gc2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC0tLSBSZXBsYXkgYnVkZ2V0IGJvb2trZWVwaW5nIC0tLVxuICAgICAgICAvLyBUaGUgcmVwbGF5IGJ1ZGdldCBib3VuZHMgdGhlICpub24tc3RlcCogcG9ydGlvbiBvZiBhIHNpbmdsZVxuICAgICAgICAvLyBoYW5kbGVyIGludm9jYXRpb246IGRldGVybWluaXN0aWMgZXZlbnQtbG9nIHJlcGxheSwgd29ya2Zsb3ctVk1cbiAgICAgICAgLy8gZXhlY3V0aW9uIGJldHdlZW4gc3RlcCBib3VuZGFyaWVzLCBzdXNwZW5zaW9uIGhhbmRsaW5nLCBxdWV1ZVxuICAgICAgICAvLyByb3VuZC10cmlwcywgZXRjLiBJbmxpbmUgc3RlcCBib2RpZXMgKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uc1xuICAgICAgICAvLyBpbnZva2VkIHZpYSBgZXhlY3V0ZVN0ZXBgKSBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZCDigJQgdGhleSBhcmVcbiAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBgbWF4RHVyYXRpb25gIGFuZCB0aGVcbiAgICAgICAgLy8gYE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNgIGVhcmx5LXJldHVybiBndWFyZCBiZWxvdy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGJ1ZGdldCBpcyBjaGVja2VkIGF0IGxvb3AgYm91bmRhcmllcyAodG9wIG9mIGVhY2ggYHdoaWxlYFxuICAgICAgICAvLyBpdGVyYXRpb24pLiBOb3RlIHRoaXMgaXMgKmxlc3MgcmVzcG9uc2l2ZSogdGhhbiB0aGUgb2xkXG4gICAgICAgIC8vIGBzZXRUaW1lb3V0YC1iYXNlZCBhcHByb2FjaDogYSBzaW5nbGUgcGF0aG9sb2dpY2FsIGBydW5Xb3JrZmxvd2BcbiAgICAgICAgLy8gY2FsbCBwcm9jZXNzaW5nIGEgaHVnZSBldmVudCBsb2cgY2FuIG92ZXJzaG9vdCB0aGUgYnVkZ2V0IGJ5IHVwXG4gICAgICAgIC8vIHRvIG9uZSBpdGVyYXRpb24gYmVmb3JlIGJhaWxpbmcuIEluIHByYWN0aWNlIHRoZSBoZWFkcm9vbSBidWlsdFxuICAgICAgICAvLyBpbnRvIGBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgIChhbmQgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAgICAgICAgLy8gU0lHVEVSTSBhcyB1bHRpbWF0ZSBiYWNrc3RvcCkgZ2l2ZXMgdXMgc2xhY2sg4oCUIHRoZSBwcmV2aW91c1xuICAgICAgICAvLyBgc2V0VGltZW91dGAgYXBwcm9hY2ggYWxzbyByZWxpZWQgb24gdGhlIHBsYXRmb3JtIGtpbGwgYXMgdGhlXG4gICAgICAgIC8vIGhhcmQgYmFja3N0b3AuIERvICpub3QqIFwiZml4XCIgdGhpcyBieSBhZGRpbmcgYSBgc2V0SW50ZXJ2YWxgO1xuICAgICAgICAvLyBpdCB3b3VsZCByaXNrIHRoZSBzYW1lIGJ1ZyB3ZSBqdXN0IHJlbW92ZWQgKGJvdW5kaW5nIHN0ZXBcbiAgICAgICAgLy8gYm9kaWVzKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRWFybGllciB2ZXJzaW9ucyAocHJlLSMyMDA5IGZpeCkgdXNlZCBhIHNpbmdsZSBgc2V0VGltZW91dGBcbiAgICAgICAgLy8gdGhhdCBhbHNvIGJvdW5kZWQgc3RlcCBib2RpZXMsIHdoaWNoIGJyb2tlIGFueSB3b3JrZmxvdyB3aXRoIGFcbiAgICAgICAgLy8gc2luZ2xlIHN0ZXAgbG9uZ2VyIHRoYW4gdGhlIGJ1ZGdldC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dCDigJQgcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZCcsIGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZ2V0V29ybGQoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGxldCBsb29wSXRlcmF0aW9uID0gMDtcblxuICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgY2FjaGU6IGtlZXAgbG9hZGVkIGV2ZW50cyBpbiBtZW1vcnkgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucy5cbiAgICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24gd2UgZG8gYSBmdWxsIGxvYWQ7IG9uIHN1YnNlcXVlbnQgaXRlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gd2UgZmV0Y2ggb25seSBldmVudHMgY3JlYXRlZCBhZnRlciB0aGUgbGFzdCBrbm93biBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICBsZXQgY2FjaGVkRXZlbnRzOiBFdmVudFtdIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICBsZXQgZXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBjYWNoZSBvZiBoeWRyYXRlZCBzdGVwIHJldHVybiB2YWx1ZXMsIHNoYXJlZCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHJlcGxheSBpdGVyYXRpb24gb2YgVEhJUyBpbnZvY2F0aW9uLiBFYWNoIGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gYnVpbGRzIGEgZnJlc2ggd29ya2Zsb3cgY29udGV4dCwgc28gdGhlIGNhY2hlIGlzIG93bmVkIGhlcmVcbiAgICAgICAgICAgICAgICAgIC8vIChvdXRzaWRlIHRoYXQgY29udGV4dCkgYW5kIHRocmVhZGVkIGludG8gcnVuV29ya2Zsb3cuIEl0XG4gICAgICAgICAgICAgICAgICAvLyB0dXJucyB0aGUgb3RoZXJ3aXNlIE8oTsKyKSByZS1kZWNyeXB0ICsgcmUtcGFyc2Ugb2YgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwIHJlc3VsdHMgYWNyb3NzIE4gcmVwbGF5cyBpbnRvIE8oTikuIFNjb3BlZCB0byB0aGlzIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gb25seSDigJQgbmV2ZXIgcmV1c2VkIGFjcm9zcyBydW5zLiBTZWUgc3RlcC1oeWRyYXRpb24tY2FjaGUudHMuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzdGVwSHlkcmF0aW9uQ2FjaGU6IFN0ZXBIeWRyYXRpb25DYWNoZSA9XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0ZXBIeWRyYXRpb25DYWNoZSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtZGVsdGEgb3B0aW1pemF0aW9uOiB3aGVuIGFuIGlubGluZSBzdGVwJ3MgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHJldHVybnMgdGhlIGV2ZW50LWxvZyBkZWx0YSBzaW5jZSB0aGUgcHJlLXdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBjdXJzb3IgKGEgc3VwcG9ydGluZyBXb3JsZCBvbmx5KSwgd2Ugc3Rhc2ggaXQgaGVyZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gY29uc3VtZXMgaXQgaW4gcGxhY2Ugb2YgdGhlIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZC10cmlwLiBFYWNoIHZhbHVlIGlzIGNvbnN1bWVkIGV4YWN0bHkgb25jZVxuICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY2xlYXJlZC4gTnVsbCBtZWFucyBcIm5vIGRlbHRhIHBlbmRpbmcg4oCUIGZldGNoXG4gICAgICAgICAgICAgICAgICAvLyBub3JtYWxseVwiLiBTZWUgdGhlIGNvbnN1bWUgc2l0ZSBhdCB0aGUgdG9wIG9mIHRoZSBsb29wIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb2R1Y2Ugc2l0ZSBhZnRlciBpbmxpbmUgZXhlY3V0ZVN0ZXAuXG4gICAgICAgICAgICAgICAgICBsZXQgcGVuZGluZ0lubGluZURlbHRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50czogRXZlbnRbXTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgICAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgc3RhdGU6IHNldCBieSBlaXRoZXIgdGhlIGJhY2tncm91bmQgc3RlcCBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBvciB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93U3RhcnRlZEF0ID0gLTE7XG4gICAgICAgICAgICAgICAgICBsZXQgcHJlbG9hZGVkRXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50c0N1cnNvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmYXN0LXBhdGhzIHRoZSB2ZXJ5IGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSB2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBmaXJzdCBpbnZvY2F0aW9uLCB3aGVyZSBpdCBpcyBwcm92YWJseSBzYWZlIHRvOiBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgLCBza2lwIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhc1xuICAgICAgICAgICAgICAgICAgLy8gYmVlbiB3cml0dGVuIHlldCksIGFuZCBmb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCAobm9cbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcGVlciBoYW5kbGVyIGV4aXN0cyB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0pLlxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bklucHV0YCBpcyBvbmx5IHByZXNlbnQgb24gdGhlIHN0YXJ0KCktZW5xdWV1ZWQgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBgYXR0ZW1wdCA9PT0gMWAgKDEtYmFzZWQpIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeTsgYGluY29taW5nU3RlcElkYCB3b3VsZCBtYXJrIGEgYmFja2dyb3VuZC1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGFuZCBgcmVwbGF5RGl2ZXJnZW5jZWAgYSByZWNvdmVyeSByZXBsYXkg4oCUIGJvdGhcbiAgICAgICAgICAgICAgICAgIC8vIGluZWxpZ2libGUuIFRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlcyBmb3JjZWRcbiAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBlbmRzIG9uY2UgYSBob29rL3dhaXQvYXR0ciBpcyBjcmVhdGVkLFxuICAgICAgICAgICAgICAgICAgLy8gc28gdHVyYm8gZXhpdHMgYXQgdGhhdCBwb2ludCAoc2VlIGBmb3JjZU9wdGltaXN0aWNTdGFydGApLlxuICAgICAgICAgICAgICAgICAgY29uc3QgdHVyYm8gPVxuICAgICAgICAgICAgICAgICAgICBpc1R1cmJvRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXBsYXlEaXZlcmdlbmNlO1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuV29ya2Zsb3dUdXJibyh0dXJibykpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkIChvciByZWplY3RzIGlmIGl0IGZhaWxlZCkuIFRocmVhZGVkXG4gICAgICAgICAgICAgICAgICAvLyBpbnRvIGhhbmRsZVN1c3BlbnNpb24gYW5kIGV4ZWN1dGVTdGVwIHNvIG5vIHN0ZXAvaG9vay93YWl0XG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByYWNlcyBhaGVhZCBvZiB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAvLyB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blJlYWR5QmFycmllcjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gT3JkZXIgYSB0ZXJtaW5hbCBydW4gd3JpdGUgKHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkKSBhZnRlclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBpbiB0dXJibyBtb2RlIOKAlCBhIG5vLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBvdGhlcndpc2UgcmVhY2ggcnVuX2NvbXBsZXRlZCBiZWZvcmUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLiBCZXN0LWVmZm9ydDogYSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBvcmRlcmluZyBvbmx5OyBpZiBydW5fc3RhcnRlZCB0cnVseSBmYWlsZWQgdGhlIHRlcm1pbmFsIHdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycy4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0UnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSDigJQgc2VlIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSBvcmNoZXN0cmF0b3IuIE91dHNpZGUgdHVyYm8gdGhpcyByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCwgd2hpY2ggbWFrZXMgdGhlIHF1ZXVlIHJlc2NoZWR1bGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIGRlbGl2ZXJ5J3MgbWVzc2FnZS4gSW4gdHVyYm8gdGhhdCBpcyBhIHRyYXA6IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCwgYW5kIG9uIGFzeW5jIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gZ3JhcGhpbGUtd29ya2VyKSBhIHJlc2NoZWR1bGUgY29tZXMgYmFjayBhcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCAxIOKAlCBzbyB0dXJibyByZS1lbmdhZ2VzLCBza2lwcyB0aGUgZXZlbnQtbG9nIGxvYWRcbiAgICAgICAgICAgICAgICAgIC8vIGFnYWluLCByZXBsYXlzIGFnYWluc3QgYW4gZW1wdHkgbG9nLCBuZXZlciBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2svYXR0ciBldmVudCB0aGlzIGludm9jYXRpb24ganVzdCB3cm90ZSwgYW5kIHJlLXN1c3BlbmRzXG4gICAgICAgICAgICAgICAgICAvLyBmb3JldmVyICh0aGUgcnVuIHdlZGdlcykuIFVuZGVyIHR1cmJvIHdlIGluc3RlYWQgZW5xdWV1ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgY29udGludWF0aW9uIHRoYXQgY2FycmllcyBOTyBgcnVuSW5wdXRgLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIG5leHQgZGVsaXZlcnkgaXMgYSBub3JtYWwgKG5vbi10dXJibykgbG9hZC1hbmQtcmVwbGF5IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVzIHRoZSBjb21taXR0ZWQgZXZlbnRzIGFuZCBtYWtlcyBwcm9ncmVzczsgd2UgdGhlblxuICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBxdWV1ZSB0cmVhdHMgdGhpcyBkZWxpdmVyeSBhcyBkb25lXG4gICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBhbHNvIHJlc2NoZWR1bGluZyBpdC5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlclxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXR1cmJvKSByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogZGVsYXlTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzID4gMCA/IHsgZGVsYXlTZWNvbmRzIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybiDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBzdGF0dXM6IGJnUnVuLnN0YXR1cyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1N0YXJ0ZWRBdCA9IGJnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyArYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2UgdGhlIHJlcGxheSBidWRnZXQgd2hpbGUgdGhlIHN0ZXAgYm9keSBydW5zIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heER1cmF0aW9uLCBub3QgYnkgdGhlIHJlcGxheSB0aW1lb3V0LiBTZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5QnVkZ2V0IGRvY3MgZm9yIHRoZSBjb250cmFjdC5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD4+O1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBiZ1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IGJnU3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IGJnUnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3RlcCBoYWQgcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMpLCBicmVhayBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdFVudGlsIGZsdXNoIHRoZW0g4oCUIGNhbid0IGNvbnRpbnVlIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0Lmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3NraXBwZWQnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyB0byBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3Vyc29yLWJhc2VkIGxvYWRpbmcgc28gdGhlIG1haW4gbG9vcCBjYW4gY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsbHkgZnJvbSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBzdGVwczogYW55IHN0ZXBfY3JlYXRlZCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hdGNoaW5nIHN0ZXBfY29tcGxldGVkIG9yIHN0ZXBfZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBUZXJtaW5hbElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVGVybWluYWxJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNQZW5kaW5nU3RlcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc3RlcENyZWF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwVGVybWluYWxJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BlbmRpbmdTdGVwcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1BlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBzdGVwcyBzdGlsbCBpbiBwcm9ncmVzcy4gUmV0dXJuIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWluZyDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZSB3aWxsIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgZG9uZSBhbmQgcmVwbGF5IGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmUgYnV0IG90aGVyIHN0ZXBzIHBlbmRpbmcsIHJldHVybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHN0ZXBzIGRvbmUg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiByZXBsYXkgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBzaGFyZWQgc3RhdGUgc28gdGhlIGxvb3AgY2FuIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lIGFmdGVyIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gYmdSdW47XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9IGJnU3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGVkRXZlbnRzIGFuZCBldmVudHNDdXJzb3IgYWxyZWFkeSBzZXQgZnJvbSBsb2FkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBlcnJvciB3aGlsZSBwcmVwYXJpbmcgYmFja2dyb3VuZCB3b3JrZmxvdyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKS5cbiAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgcnVuX3N0YXJ0ZWQgZGlyZWN0bHkg4oCUIHRoaXMgYm90aCB0cmFuc2l0aW9uc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHRvICdydW5uaW5nJyBBTkQgcmV0dXJucyB0aGUgcnVuIGVudGl0eSwgc2F2aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgc2VwYXJhdGUgcnVucy5nZXQgcm91bmQtdHJpcC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJhY3Q6IGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJykgbXVzdCBiZSBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBydW5zIGFscmVhZHkgaW4gJ3J1bm5pbmcnIHN0YXR1cyAocmV0dXJuIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBlcnJvciksIG5vdCBqdXN0IGZvciBwZW5kaW5nIOKGkiBydW5uaW5nIHRyYW5zaXRpb25zLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBydW5TdGFydGVkRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX3N0YXJ0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc3BlYyB2ZXJzaW9uIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0KCkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gYXZhaWxhYmxlLCBzbyB0aGUgcmVzaWxpZW50IHN0YXJ0IHBhdGggY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gd2l0aCB0aGUgY29ycmVjdCB2ZXJzaW9uIChub3QgYWx3YXlzIGN1cnJlbnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ/LnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgcnVuIGlucHV0IGZyb20gcXVldWUgc28gdGhlIHNlcnZlciBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJ1biBpZiBydW5fY3JlYXRlZCB3YXMgbWlzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVpbnQ4QXJyYXkgdmFsdWVzIHN1cnZpdmUgdGhlIHF1ZXVlIG5hdGl2ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gKENCT1Igb24gd29ybGQtdmVyY2VsLCBKU09OIHJldml2ZXIgb24gd29ybGQtbG9jYWwpLlxuICAgICAgICAgICAgICAgICAgICAgIC4uLihydW5JbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXQud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXQuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZFJ1blN0YXJ0ZWRDcmVhdGVTdGFydCA9IChcbiAgICAgICAgICAgICAgICAgICAgICBza2lwUHJlbG9hZDogYm9vbGVhblxuICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IHNraXBQcmVsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dXJibyAmJiBydW5JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBiYWNrZ3JvdW5kIGBydW5fc3RhcnRlZGAgYW5kIHN5bnRoZXNpemUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGl0eSBsb2NhbGx5IHNvIHJlcGxheSBjYW4gYmVnaW4gd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZC10cmlwLiBTYWZlIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uIOKAlCBzdGFydCgpIGNyZWF0ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIG1vbWVudHMgYWdvIGFuZCBubyBldmVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJyaWVyIGlzIGNvbnN1bWVkIGJ5IGV2ZXJ5IGRvd25zdHJlYW0gd3JpdGUgKHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyLCBvcHRpbWlzdGljIHN0ZXBfc3RhcnRlZCwgdGVybWluYWwgcnVuIHdyaXRlcykgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFJ1blN0YXJ0ZWRDcmVhdGVTdGFydCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydGVkUHJvbWlzZSA9IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGJhY2tncm91bmQgdGhpcyBwdXJlbHkgYXMgYSB3cml0ZSBiYXJyaWVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVhZCBpdHMgcHJlbG9hZGVkIGV2ZW50cyAocHJlbG9hZGVkRXZlbnRzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgdG8gW10gYmVsb3cpLCBzbyB0ZWxsIHRoZSBXb3JsZCB0byBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgZXZlbnQtbG9nIHByZWxvYWQuIFRoYXQgdHJpbXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCByZXF1ZXN0IHRoZSBjaGFpbmVkIGZpcnN0IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdHMgb24g4oCUIHNob3J0ZW5pbmcgdGltZS10by1zZWNvbmQtc3RlcCDigJQgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzdGVkIGxpc3QrcmVzb2x2ZSBpdCB3b3VsZCBvdGhlcndpc2UgY29tcHV0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkLCBza2lwUHJlbG9hZDogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIgPSBzdGFydGVkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggYSBuby1vcCByZWplY3Rpb24gaGFuZGxlciBzbyBhbiBlYXJseSBmYWlsdXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgc3VyZmFjZXMgYXMgYW4gdW5oYW5kbGVkUmVqZWN0aW9uIGJlZm9yZSBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGF3YWl0L3RoZW4pIGlzIGF0dGFjaGVkOyBjb25zdW1lcnMgc3RpbGwgb2JzZXJ2ZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdDogbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvZyB5ZXQgb24gYSBmaXJzdCBkZWxpdmVyeSAocnVuX3N0YXJ0ZWQgaXMgc3RpbGwgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQpLiBBbiBlbXB0eSBwcmVsb2FkZWQgc2V0IHJvdXRlcyBpdGVyYXRpb24gMSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vLWxvYWQgcHJlbG9hZGVkIGJyYW5jaDsgaXRlcmF0aW9uIDIgdGhlbiB0YWtlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwb3N0LXByZWxvYWRlZCBmdWxsIHJlbG9hZCB0byBwaWNrIHVwIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKG5vIHNwdXJpb3VzIFwiY3Vyc29yIG1pc3NpbmdcIiB3YXJuaW5nKS4gYFtdYCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgdHJ1dGh5IGhlcmUg4oCUIGRvIG5vdCBjaGFuZ2UgdGhlIGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBicmFuY2hlcycgYGlmIChwcmVsb2FkZWRFdmVudHMpYCBjaGVja3MgdG8gdGVzdCBsZW5ndGguXG4gICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXQud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IHJ1bklucHV0LnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXQuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZWQgYXR0cmlidXRlcyBmcm9tIHN0YXJ0KCkgcmlkZSBhbG9uZyBpbiBgcnVuSW5wdXRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhleSBsaXZlIGluIGBydW5fY3JlYXRlZGAncyBldmVudERhdGEsIG5vdCBzZXBhcmF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGF0dHJfc2V0YCBldmVudHMpLCBzbyB0aGUgc3ludGhlc2l6ZWQgc25hcHNob3QgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBldmVuIHRob3VnaCB3ZSBza2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0LiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBjb3JyZWN0IE9OTFkgd2hpbGUgYXR0cmlidXRlcyBhcmUgd3JpdGUtb25seTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIGluLXdvcmtmbG93IHJlYWQgQVBJIHRvZGF5IChzZWUgd29ya2Zsb3cudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwic3RydWN0dXJhbCB1bnRpbCBhIHJlYWQgQVBJIGlzIGludHJvZHVjZWRcIiksIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgcHJlbG9hZGVkIGxvZyBjYW4ndCBkaXZlcmdlIG9uIGEgcmVhZC4gSWYgYSByZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBUEkgaXMgZXZlciBhZGRlZCBpdCBNVVNUIHJlYWQgZnJvbSB0aGlzIHNuYXBzaG90LCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHJlcGxheWluZyBydW5fY3JlYXRlZC9hdHRyX3NldCBldmVudHMg4oCUIG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8ncyBlbXB0eSBpbml0aWFsIGxvZyB3b3VsZCBzdXJmYWNlIHNlZWQgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYHt9YCBvbiB0aGUgZmlyc3QgZGVsaXZlcnkgb25seS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0LmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtub3c7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ3J1bm5pbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFJ1blN0YXJ0ZWRDcmVhdGVTdGFydChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQucnVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXZlbnQgY3JlYXRpb24gZm9yICdydW5fc3RhcnRlZCcgZGlkIG5vdCByZXR1cm4gdGhlIHJ1biBlbnRpdHkgZm9yIHJ1biBcIiR7cnVuSWR9XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBpbmNsdWRlcyBldmVudHMsIHVzZSB0aGVtIHRvIHNraXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgYW5kIHJlZHVjZSBUVEZCLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSAhPT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHJlc3VsdC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHJlc3VsdC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dSdW4uc3RhcnRlZEF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gd2FzIGNvbmN1cnJlbnRseSBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yOiBydW4gd2FzIGNvbmN1cnJlbnRseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGxlZCBkdXJpbmcgc2V0dXAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvcjogcnVuIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGJvdGggY2FzZXMsIHNraXAgcHJvY2Vzc2luZyB0aGlzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgcnVudGltZSBlcnJvciBkdXJpbmcgd29ya2Zsb3cgc2V0dXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHdvcmtmbG93UnVuLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZmxvdyBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHdvcmtmbG93UnVuLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIGBjYW5jZWxgLCB3ZSBhY3R1YWxseSB3YW50IHRvIHByb3BhZ2F0ZSBhIFdvcmtmbG93Q2FuY2VsbGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHdvcmtmbG93IGNvbnRleHQgc28gdGhlIHVzZXIgY2FuIGdyYWNlZnVsbHkgZXhpdC4gdGhpcyBpcyBTSUdURVJNXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmdXJ0aGVybW9yZSwgdGhlcmUgc2hvdWxkIGJlIGEgdGltZW91dCBvciBhIHdheSB0byBmb3JjZSBjYW5jZWwgU0lHS0lMTFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBhY3R1YWxseSBleGl0IGhlcmUgd2l0aG91dCByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGF0IGFsbCwgaW4gdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGlzIGl0c2VsZiBmYWlsaW5nLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChub24tdHVyYm8gcnVuX3N0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAoIXdvcmtmbG93UnVuKVxuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBydW4ncyBkZXBsb3ltZW50LlxuICAgICAgICAgICAgICAgICAgLy8gVXNlZCBlYWdlcmx5IGhlcmUgc2luY2UgYm90aCBydW5Xb3JrZmxvdyAoaW5wdXRcbiAgICAgICAgICAgICAgICAgIC8vIGh5ZHJhdGlvbiAvIGhvb2sgcGF5bG9hZCBkZWNyeXB0aW9uKSBhbmQgdGhlIHJ1bl9mYWlsZWRcbiAgICAgICAgICAgICAgICAgIC8vIGRlaHlkcmF0ZSBwYXRoIGJlbG93IG5lZWQgaXQuIE1lbW9pemVkIGFjY2Vzc29yOiBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gY2FsbCB0cmlnZ2VycyB0aGUgYWN0dWFsIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uLFxuICAgICAgICAgICAgICAgICAgLy8gc3Vic2VxdWVudCBjYWxscyBhd2FpdCB0aGUgY2FjaGVkIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1blxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE1haW4gcmVwbGF5IGxvb3BcbiAgICAgICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL25vQ29uc3RhbnRDb25kaXRpb246IGludGVudGlvbmFsIGxvb3BcbiAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24rKztcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXktYnVkZ2V0IGNoZWNrOiBiYWlsIG91dCAocmV0cnkgb3IgZmFpbCkgaWZcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN0ZXAgdGltZSB3aXRoaW4gdGhpcyBpbnZvY2F0aW9uIGhhcyBleGNlZWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZmlndXJlZCBidWRnZXQuIFN0ZXAgYm9kaWVzIGFyZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHJlcGxheUJ1ZGdldC5wYXVzZSgpL3Jlc3VtZSgpIGJyYWNrZXQgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gYGV4ZWN1dGVTdGVwYCBjYWxsLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGF5QnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRNczogcmVwbGF5QnVkZ2V0LmNvbmZpZ3VyZWRMaW1pdE1zLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIFZlcmNlbCwgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkIGFsd2F5c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIHRoZSBwcm9jZXNzLiBPbiBsb2NhbCBkZXYgaXQgcmV0dXJuczsgd2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggYW5kIHRoZSByZXF1ZXN0IGVuZHMgbm9ybWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyAocnVuX2ZhaWxlZCBoYXMgYmVlbiB3cml0dGVuIGJlc3QtZWZmb3J0KS5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aW1lb3V0IGJlZm9yZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lID49XG4gICAgICAgICAgICAgICAgICAgICAgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnVjIgdGltZW91dCByZWFjaGVkLCByZS1zY2hlZHVsaW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlTdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIEN1cnNvciBvZiB0aGlzIGl0ZXJhdGlvbidzIGV2ZW50IGxvZyBiZWZvcmUgYW55IGlubGluZVxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgYWR2YW5jZSBpdCDigJQgZGVjbGFyZWQgYXQgdHJ5IHNjb3BlIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGNhdGNoICh3aGljaCBydW5zIHRoZSBpbmxpbmUgc3RlcCkgY2FuIHJlYWQgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIGBzaW5jZUN1cnNvcmAgZm9yIHRoZSBpbmxpbmUtZGVsdGEgb3B0aW1pemF0aW9uLlxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlSW5saW5lV3JpdGVDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgZXZlbnRzIOKAlCB1c2UgY2FjaGVkIGV2ZW50cyB3aXRoIGluY3JlbWVudGFsIGZldGNoIG9uIHN1YnNlcXVlbnQgaXRlcmF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2VydmVyIGFsd2F5cyByZXR1cm5zIGEgY3Vyc29yIHdoZW4gdGhlcmUgYXJlIGV2ZW50cyAoZXZlbiBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBwYWdlKSwgc28gd2UgY2FuIHJlbGlhYmx5IHVzZSBpdCBmb3IgaW5jcmVtZW50YWwgbG9hZGluZy5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nSW5saW5lRGVsdGEgJiYgY2FjaGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXN0IHBhdGg6IHRoZSBwcmV2aW91cyBpdGVyYXRpb24ncyBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgcmV0dXJuZWQgdGhlIGF1dGhvcml0YXRpdmUgZXZlbnQtbG9nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YSBzaW5jZSB0aGUgcHJlLXdyaXRlIGN1cnNvciwgc28gd2UgY29uc3VtZSBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBpbnN0ZWFkIG9mIGlzc3VpbmcgYW4gaW5jcmVtZW50YWwgZXZlbnRzLmxpc3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVsdGEgaXMgYnl0ZS1mb3ItYnl0ZSB3aGF0IGV2ZW50cy5saXN0KGN1cnNvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGhhdmUgcmV0dXJuZWQgYXQgd3JpdGUgdGltZSDigJQgaXQgaW5jbHVkZXMgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlcidzIG93biBzdGVwIGV2ZW50cywgYW55IGF0dHJfc2V0IHRoZSBzdGVwIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb3RlLCBhbmQgYW55IGluLWJhbmQgZXZlbnRzIChlLmcuIGhvb2tfcmVjZWl2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCkgYW5vdGhlciB3cml0ZXIgYXBwZW5kZWQgc2luY2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3Ig4oCUIHNvIHNraXBwaW5nIHRoZSBmZXRjaCBjYW5ub3QgZHJvcCBldmVudHMgb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNrZXcgdGhlIHByZWZpeCBmcm9tIHRoZSBzZXJ2ZXIncyBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IHBlbmRpbmdJbmxpbmVEZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbmxpbmVEZWx0YSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5tYXAoKGUpID0+IGUuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGRlbHRhLmV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdJZHMuaGFzKGUuZXZlbnRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nSWRzLmFkZChlLmV2ZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBkZWx0YS5jdXJzb3IgPz8gZXZlbnRzQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FjaGVkRXZlbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBpdGVyYXRpb246IHVzZSBwcmVsb2FkZWQgZXZlbnRzIGlmIGF2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBkbyBhIGZ1bGwgbG9hZCB3aXRoIGN1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudHNDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNlcXVlbnQgaXRlcmF0aW9uOiBmZXRjaCBvbmx5IG5ldyBldmVudHMgc2luY2UgbGFzdCBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZHVwZSBieSBldmVudElkOiBhIHByZXZpb3VzIGl0ZXJhdGlvbiBtYXkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kZWQgYSByZWZyZXNoZWQgd2FpdC1jb21wbGV0aW9uIGRlbHRhIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbG9vcCBvYnNlcnZlcyB0aGUgYWR2YW5jZWQgY3Vyc29yLCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgZmV0Y2ggY2FuIHJldHVybiBldmVudHMgd2UgYWxyZWFkeSBoYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZC5ldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzLm1hcCgoZSkgPT4gZS5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbG9hZGVkLmV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdJZHMuaGFzKGUuZXZlbnRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nSWRzLmFkZChlLmV2ZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWxvYWRlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9uIDIgYWZ0ZXIgaXRlcmF0aW9uIDEgdXNlZCBwcmVsb2FkZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hpY2ggZG9uJ3QgY2FycnkgYSBjdXJzb3IpLiBEbyBhIGZ1bGwgbG9hZCBub3cgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgYW55IGV2ZW50cyB3cml0dGVuIHNpbmNlIHRoZSBwcmVsb2FkZWQgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb2J0YWluIGEgY3Vyc29yIGZvciBzdWJzZXF1ZW50IGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2Fkcy4gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgcGF0aCwgbm90IGEgYnVnLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGN1cnNvciBhZnRlciBwcmVsb2FkZWQtZXZlbnRzIGZpcnN0IGl0ZXJhdGlvbjsgZG9pbmcgZnVsbCByZWxvYWQgdG8gcGljayB1cCBjdXJzb3IuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBjdXJzb3IgYXZhaWxhYmxlIGRlc3BpdGUgaGF2aW5nIGNhY2hlZCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBwcmVsb2FkZWQtZXZlbnRzIGV4cGxhbmF0aW9uLiBBbGwgV29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gcmV0dXJuIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSBldmVudHMsIHNvIHRoaXMgc2lnbmFscyBhIGJ1ZyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkLiBGYWxsIGJhY2sgdG8gYSBmdWxsIHJlbG9hZCB0byBhdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGN1cnNvciBtaXNzaW5nIGFmdGVyIGluaXRpYWwgbG9hZCDigJQgZmFsbGluZyBiYWNrIHRvIGZ1bGwgcmVsb2FkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIFdvcmxkIGltcGxlbWVudGF0aW9uLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3QgY29uY3VycmVudCBjb21wbGV0aW9uIHZpYSB0aGUgZXZlbnQgbG9nOiBpZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBvdGhlciBoYW5kbGVyIHdyb3RlIGEgdGVybWluYWwgcnVuIGV2ZW50LCBleGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGRvaW5nIHJlcGxheSB3b3JrLiBUaGUgcnVuIGVudGl0eSdzIHN0YXR1cyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSB0aGVzZSBldmVudHMsIHNvIGNoZWNraW5nIHRoZSBsb2cgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVzIHVzIHRoZSBzYW1lIHNpZ25hbCBhcyBhIHJ1bnMuZ2V0KCkgcm91bmQtdHJpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIGV4dHJhIHJlcXVlc3QgcGVyIGxvb3AgaXRlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0ZSBlbGFwc2VkIHdhaXRzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdHNUb0NvbXBsZXRlID0gZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApOiBlIGlzIEV4dHJhY3Q8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBldmVudFR5cGU6ICd3YWl0X2NyZWF0ZWQnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPiAmIHsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvcnJlbGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93ID49IChlLmV2ZW50RGF0YS5yZXN1bWVBdCBhcyBEYXRlKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBlLmV2ZW50RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd2FpdEV2ZW50IG9mIHdhaXRzVG9Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwgd2FpdEV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhaXQgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0c1RvQ29tcGxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGxpc3QgYWJvdmUgbWF5IGJlIHN0YWxlIGJ5IHRoZSB0aW1lIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgaXMgY29tbWl0dGVkLiBMb2FkIG9ubHkgZXZlbnRzIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yIHNvIGNvbmN1cnJlbnQgZHVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsIGtlZXAgdGhlaXIgb3JkZXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsIGJhY2sgdG8gYSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdCBnaXZlIHVzIGEgc3RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lcyBub3QgaW5jbHVkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdCBhdHRlbXB0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdBbGxXYWl0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMubWFwKChlKSA9PiBlLmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGxvYWRlZC5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdJZHMuaGFzKGV2ZW50LmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nSWRzLmFkZChldmVudC5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0aW5nIGVsYXBzZWQgd2FpdHMgcmVmcmVzaGVzIHRoZSBldmVudCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBtYXkgaGF2ZSB3cml0dGVuIHRoZSB0ZXJtaW5hbCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBhZnRlciB0aGUgaW5pdGlhbCBzbmFwc2hvdCBidXQgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIE9uY2UgdGhlIGV2ZW50IGxvZyByZWNvcmRzIHRoYXQgb3V0Y29tZSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IGlzIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjYWNoZSByZWZlcmVuY2UgKG1heSBoYXZlIGJlZW4gc2V0IGZvciBmaXJzdCB0aW1lKVxuICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGV2ZW50cztcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBjdXJzb3IgYXMgaXQgc3RhbmRzIGZvciB0aGlzIGl0ZXJhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nLCBiZWZvcmUgYW55IGlubGluZSB3cml0ZXMgKHN0ZXBfY3JlYXRlZCB2aWFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVTdXNwZW5zaW9uLCBzdGVwX3N0YXJ0ZWQvc3RlcF9jb21wbGV0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXApIGFkdmFuY2UgaXQuIFRoaXMgaXMgdGhlIGBzaW5jZUN1cnNvcmBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kZWQgdG8gYSBzdXBwb3J0aW5nIFdvcmxkIG9uIHRoZSBpbmxpbmUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgc28gaXQgY2FuIHJldHVybiB0aGUgZXZlbnQtbG9nIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG5leHQgaXRlcmF0aW9uIHNraXAgdGhlIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3QuIENhcHR1cmVkIGhlcmUgYmVjYXVzZSBub3RoaW5nIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IGFuZCB0aGUgaW5saW5lIGV4ZWN1dGVTdGVwIG11dGF0ZXMgZXZlbnRzQ3Vyc29yLlxuICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yID0gZXZlbnRzQ3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5IHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgcmVwbGF5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuV29ya2Zsb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwSHlkcmF0aW9uQ2FjaGVcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IHJlcGxheSBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBhIHdvcmtmbG93IHRoYXQgZmluaXNoZXMgd2l0aCBubyBzdGVwcyByZWFjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGJlZm9yZSB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkOyBvcmRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIGFmdGVyIGl0IHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7IG91dHB1dDogcmVzdWx0IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IHN1c3BlbmRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBlcnIuc3RlcENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rczogZXJyLmhvb2tDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHM6IGVyci53YWl0Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25NZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRXb3JrZmxvd1N1c3BlbnNpb25NZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhzdXNwZW5zaW9uTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFYyOiBoYW5kbGUgc3VzcGVuc2lvbiB3aXRob3V0IHF1ZXVpbmcgc3RlcHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VzcGVuc2lvblJlc3VsdDogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgaGFuZGxlU3VzcGVuc2lvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgID47XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0ID0gYXdhaXQgaGFuZGxlU3VzcGVuc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbjogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN1c3BlbnNpb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZhdGFsRXJyb3IuaXMoc3VzcGVuc2lvbkVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudCBmYWlsdXJlcyBwcm9wYWdhdGUgdG8gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBzbyB0aGUgbWVzc2FnZSBpcyByZWRlbGl2ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdXNwZW5zaW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uLXJldHJ5YWJsZSBmYWlsdXJlIHdoaWxlIGNvbW1pdHRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24ncyBldmVudHMg4oCUIGUuZy4gYW4gYXR0cmlidXRlIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXb3JsZCByZWplY3RlZCBhcyBpbnZhbGlkICh0aGUgY3VtdWxhdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGNhcCBjYW4gb25seSBiZSBjaGVja2VkIFdvcmxkLXNpZGUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWRlbGl2ZXJ5IHdvdWxkIHJlcGxheSB0aGUgd29ya2Zsb3cgaW50byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSB3cml0ZSBhbmQgdGhlIHNhbWUgcmVqZWN0aW9uLCBzbyBmYWlsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gd2l0aCB0aGUgZXJyb3IgaW5zdGVhZCBvZiB3ZWRnaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGluIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGNsYXNzaWZ5UnVuRXJyb3Ioc3VzcGVuc2lvbkVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm9uLXJldHJ5YWJsZSBlcnJvciB3aGlsZSBjb21taXR0aW5nIHdvcmtmbG93IHN1c3BlbnNpb247IGZhaWxpbmcgcnVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogc3VzcGVuc2lvbkVycm9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN1c3BlbnNpb25FcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogb3JkZXIgdGhlIHRlcm1pbmFsIHdyaXRlIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdXNwZW5zaW9uIGhhbmRsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uTXM6IERhdGUubm93KCkgLSBzdXNwZW5zaW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwczogc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kczogc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dD8uc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F0dHJpYnV0ZUV2ZW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rIGNvbmZsaWN0OiBicmVhayBsb29wLCByZS1pbnZva2UgdmlhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyBhcmUgcmVzb2x2ZWQgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBSZS1pbnZva2UgYmVmb3JlIHByb2Nlc3NpbmcgcGVuZGluZyBzdGVwczpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIFByb21pc2UucmFjZShbc2V0QXR0cmlidXRlcygpLCBzdGVwKCldKSwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIGF0dHJpYnV0ZSBldmVudCBjYW4gd2luIHdpdGhvdXQgZXhlY3V0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9zaW5nIHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcHMgPSBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV4ZWN1dGlvbiBpcyBnYXRlZCBvbiBvd25lcnNoaXAuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB0byBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgKGBsYXp5SW5saW5lU3RlcHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJ1biB0aGVtIGlubGluZSDigJQgaW4gcGFyYWxsZWwg4oCUIHZpYSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCBldmVudHMgdGhhdCBjcmVhdGUgZWFjaCBzdGVwIG9uIHRoZSBmbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBPd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGF0b21pYyBhbmQgZXhhY3RseS1vbmUgcGVyIHN0ZXA6IHRoZSB3b3JsZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggc3RlcF9zdGFydGVkIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAo4oaSIGV4ZWN1dGVTdGVwIGBza2lwcGVkYCkgdG8gYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IGxvc2VyLCBzbyBvbmx5IG9uZSBoYW5kbGVyIGV2ZXIgcnVucyBhIGdpdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LiBFdmVyeSBvdGhlciBwZW5kaW5nIHN0ZXAga2VlcHMgaXRzIGVhZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgKGluIGBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzYCkgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1c3BlbnNpb24gaGFuZGxlciBvbmx5IGRlc2lnbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBsYXp5SW5saW5lU3RlcHNgIHdoZW4gbm8gYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHJlc2VudC4gVGhhdCBhd2FpdGVyIGNhc2UgbXVzdCBleGVjdXRlIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZTogYW4gaW5saW5lIGBhd2FpdCBleGVjdXRlU3RlcCguLi4pYCBibG9ja3MgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiwgc28gdGhlIGF3YWl0ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uICh3aGljaCBvbmx5IGFkdmFuY2VzIG9uIHRoZSBuZXh0IHJlcGxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHNlcmlhbGl6ZWQgYmVoaW5kIHRoZSBzdGVwIOKAlCBkZWZlYXRpbmcgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtmbG93IGV4cHJlc3NlZCBhcyBwYXJhbGxlbCAoZS5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGhvb2suZ2V0Q29uZmxpY3QoKS50aGVuKCgpID0+IHN0ZXBCKCkpYCByYWNpbmcgYGF3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwQSgpYCkuIEluIHRoYXQgY2FzZSBgbGF6eUlubGluZVN0ZXBzYCBpcyBlbXB0eSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHN0ZXAgaXMgcXVldWVkIGZvciByZS1pbnZvY2F0aW9uLCB3aGljaCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlciB3aGlsZSBxdWV1ZWQgc3RlcHMgcnVuIGluIHBhcmFsbGVsIGludm9jYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUlubGluZVN0ZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5sYXp5SW5saW5lU3RlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZpZWQgcXVldWUgZGlzcGF0Y2ggZm9yIGV2ZXJ5dGhpbmcgd2UgYXJlIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLWV4ZWN1dGluZy4gU3RlcHMgYXJlIHF1ZXVlZCB3aXRoIHN0ZXBJZCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyIHJ1bnMgdGhlbTsgdGhlIHdhaXQgdGltZXIgaXMgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGdlbmVyaWMgY29udGludWF0aW9uIHRoYXQgZmlyZXMgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGVsYXBzZXMgYW5kIGxldHMgdGhlIG5leHQgcmVwbGF5IG9ic2VydmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgdmlhIHRoZSBcImNvbXBsZXRlIGVsYXBzZWQgd2FpdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIHF1ZXVlaW5nIGlzIHVuY29uZGl0aW9uYWwgKGNvdmVycyBjcmFzaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlmIGEgcHJpb3IgaGFuZGxlciB3cm90ZSBzdGVwX2NyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBjcmFzaGVkIGJlZm9yZSBxdWV1ZWluZywgYSBsYXRlciBoYW5kbGVyIHdpbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZW07IGlkZW1wb3RlbmN5S2V5IG9uIGNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZHVwZXMgcmVkdW5kYW50IHF1ZXVlcyBhY3Jvc3MgY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlcnMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3YWl0IGNvbnRpbnVhdGlvbiBpcyB3aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgYmVoYXZlIGNvcnJlY3RseSB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBleGVjdXRpb246IGV2ZW4gaWYgdGhlIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBibG9ja3MgdGhpcyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgdGltZXIgZmlyZXMgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbi4gSWYgdGhlIHNsZWVwIHdpbnMsIHRoYXQgcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gY29tcGxldGVzIHRoZSBydW47IGlmIHRoZSBzdGVwIHdpbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCBjb250aW51YXRpb24gZmlyZXMgbGF0ZXIgYW5kIG5vLW9wcyBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlcm1pbmFsIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29udGludWF0aW9uJ3MgZGVsYXkgaXMgY2xhbXBlZCB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heGltdW0gcXVldWUgZGVsYXkgKGxvbmcgd2FpdHMgY2hhaW4gYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBob3BzKSBhbmQgaXRzIGlkZW1wb3RlbmN5IGtleSBkZWR1cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1vYnNlcnZhdGlvbnMgb2YgdGhlIHNhbWUgcGVuZGluZyB3YWl0IGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBwYXNzZXMg4oCUIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5L2tleSBzZWxlY3Rpb24gcmF0aW9uYWxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hlczogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZGlzcGF0Y2hlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZXhlY3V0ZSBpbmxpbmUg4oCUIGV2ZXJ5dGhpbmcgaGFzIGJlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCAob3Igbm8gd29yayBuZWVkcyBzY2hlZHVsaW5nKS4gRXhpdCBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgZHJpdmUgc3Vic2VxdWVudCByZXBsYXlzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIGFuIGltbWVkaWF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB0aGUgcmVwbGF5IGNvbnN1bWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyLiBXaXRob3V0IGl0IChubyBpbmxpbmUgc3RlcCwgYWxsIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIG9yIG5vbmUgcGVuZGluZykgdGhlIHJ1biB3b3VsZCBzaXQgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBzb21lIHVucmVsYXRlZCBtZXNzYWdlIHdva2UgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIGlubGluZSBzdGVwLiBQYXVzZSB0aGUgcmVwbGF5IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3RlcCBib2R5IOKAlCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gV2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0aGUgcmVwbGF5LWJ1ZGdldCBjaGVjayBhdCB0aGUgdG9wIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiB3b3VsZCAoaW5jb3JyZWN0bHkpIGNoYXJnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgYm9keSBhZ2FpbnN0IHRoZSBidWRnZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtZGVsdGEgZmFzdCBwYXRoIGdhdGUuIFdlIHJlcXVlc3QgdGhlIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBjb25zdW1lIGl0IGluIHBsYWNlIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qg4oCUIG9ubHkgd2hlbiBBTEwgaG9sZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXZSBoYXZlIGEgcmVhbCBwcmlvciBjdXJzb3IgdG8gZGlmZiBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYHByZUlubGluZVdyaXRlQ3Vyc29yYDsgYSBXb3JsZCBtYXkgcmV0dXJuIG5vbmUgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBpbml0aWFsIGxvYWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhpcyBpcyB0aGUgY2xlYW4gc2luZ2xlLXN0ZXAgc2VxdWVudGlhbCBjYXNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcyBzdXNwZW5zaW9uIHByb2R1Y2VkIGV4YWN0bHkgb25lIHN0ZXAgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBob29rcyBvciB3YWl0cyAoYGVyci57c3RlcCxob29rLHdhaXR9Q291bnRgKSwgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb25lIHN0ZXAgaXMgdGhlIGxvbmUgcGVuZGluZyBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDFgKSBhbmQgdGhlIGxvbmUgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGVwIChgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMWAg4oCUIG5vIHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzaWJsaW5ncyBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycywgYW5kIG5vIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpbmxpbmUgc3RlcCB3cml0aW5nIGl0cyBvd24gZXZlbnRzIG91dCBvZiBiYW5kKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIE5vIHBlbmRpbmcgd2FpdCB0aW1lciBmcm9tIFRISVMgc3VzcGVuc2lvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoZSBydW4gaGFzIE5PIHByZS1leGlzdGluZyBvcGVuIGhvb2sgb3Igd2FpdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcGx1cyB0aGUgcGVyLXN1c3BlbnNpb24gY291bnRzIGFib3ZlIGlzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgbG9hZC1iZWFyaW5nIHNhZmV0eSBjaGVjazogdGhlIGRlbHRhIHNuYXBzaG90cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGxvZyBhdCB0aGUgc3RlcF9jb21wbGV0ZWQgd3JpdGUgYnV0IGlzIGNvbnN1bWVkIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgbmV4dCByZXBsYXksIHNvIGFuIG91dC1vZi1iYW5kIGhvb2tfcmVjZWl2ZWQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2FpdF9jb21wbGV0ZWQgbGFuZGluZyBpbiB0aGF0IHdpbmRvdyB3b3VsZCBiZSBpbiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWFsIGZldGNoIHlldCBhYnNlbnQgZnJvbSB0aGUgc3RhbGUgZGVsdGEg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByaXNraW5nIGEgZGl2ZXJnZW50IHJlcGxheS4gV2l0aCBubyBob29rL3dhaXQgb3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKG5laXRoZXIgY2FycmllZCBvdmVyIG5vciBjcmVhdGVkIHRoaXMgc3VzcGVuc2lvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgb25seSBvdXQtb2YtYmFuZCB3cml0ZXIgaXMgY2FuY2VsbGF0aW9uLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgc2FmZSB0byBvYnNlcnZlIG9uZSBpdGVyYXRpb24gbGF0ZS4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBoYXNPcGVuSG9va09yV2FpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vcmUgdGhhbiBvbmUgc3RlcCBydW5zIGlubGluZSwgZWFjaCB3cml0ZXMgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd24gZXZlbnRzIGFuZCB0aGUgcGVyLXdyaXRlIGRlbHRhIHdvdWxkIGJlIHBhcnRpYWwsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsdGEgaXMgbm90IHJlcXVlc3RlZCAodGhlIGdhdGUgYmVsb3cgaXMgZmFsc2UgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aS1zdGVwKSBhbmQgdGhlIG5leHQgaXRlcmF0aW9uIGRvZXMgYSBub3JtYWwgZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0SW5saW5lRGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJlSW5saW5lV3JpdGVDdXJzb3IgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5zdGVwQ291bnQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzT3Blbkhvb2tPcldhaXQoY2FjaGVkRXZlbnRzID8/IFtdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIOKAlCBidXQgb25seSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIFwiY2xlYW5cIiAoYSBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb24pLiBUaGUgbW9tZW50IGEgaG9vayBvciB3YWl0IChvciBhdHRyKSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCwgbGF0ZXIgcmVzdW1lL3BhcmFsbGVsIGludm9jYXRpb25zIGJlY29tZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUsIHNvIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2VkIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBubyBsb25nZXIgaG9sZHMg4oCUIHR1cmJvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0cyBhbmQgdGhlIHN0ZXBzIHRha2UgdGhlIG5vcm1hbCAoZW52LWdhdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQtdGhlbi1ydW4gcGF0aC4gVGhlIGhvb2stY29uZmxpY3QgLyBhdHRyIGNhc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHJldHVybmVkIGVhcmx5IGFib3ZlIGFuZCB0aGUgYXdhaXRlZC1ob29rIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHRpZWQgbGF6eUlubGluZVN0ZXBzOyB0aGUgY2hlY2tzIGJlbG93IGFyZSBkZWZlbnNpdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGBzdXNwZW5zaW9uUmVzdWx0LipgIGZsYWdzIG9ubHkgcmVmbGVjdCB3aGF0IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIGNyZWF0ZWQsIHNvIHRoZXkgZG8gbm90IGNhdGNoIGEgaG9vay93YWl0IG9wZW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYW4gZWFybGllciBpdGVyYXRpb24gb2YgdGhlIHNhbWUgZGVsaXZlcnkgKGUuZy4gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyZS1hbmQtZm9yZ2V0IGBjcmVhdGVIb29rKC4uLilgIHRoYXQgZG9lc24ndCBibG9jayB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93LCBsZXR0aW5nIHRoZSByZXBsYXkgbG9vcCBjb250aW51ZSB0byBsYXRlciBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb25zKS4gT25jZSBhbnkgaG9vayBvciB3YWl0IGlzIG9wZW4gaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdW11bGF0aXZlIGxvZywgcmVzdW1lL3BhcmFsbGVsIGludm9jYXRpb25zIGFyZSBwb3NzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSByZXN0IG9mIHRoZSBydW4sIHNvIHR1cmJvIG11c3QgbGF0Y2ggb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJtYW5lbnRseSDigJQgY2hlY2tlZCBoZXJlIHZpYSBgaGFzT3Blbkhvb2tPcldhaXRgIG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjdW11bGF0aXZlIGBjYWNoZWRFdmVudHNgLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yY2VPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJibyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNPcGVuSG9va09yV2FpdChjYWNoZWRFdmVudHMgPz8gW10pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBpbmxpbmUgc3RlcHMgaW4gcGFyYWxsZWwuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZGdldCBpcyBwYXVzZWQgZm9yIHRoZSB3aG9sZSBiYXRjaCDigJQgc3RlcCBkdXJhdGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBtYXhEdXJhdGlvbiwgbm90IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRpbWVvdXQg4oCUIHNvIHRoZSBidWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gZG9lc24ndCBjaGFyZ2UgdGhlIHN0ZXAgYm9kaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdHM6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPltdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGlubGluZSBzdGFydDogc2VuZCB0aGUgZGVmZXJyZWQgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IG9uIHN0ZXBfc3RhcnRlZCBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBvbiB0aGUgZmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGZvcmNlIG9wdGltaXN0aWMgc3RhcnQgYW5kIGhvbGQgdGhlIGxhenlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIHVudGlsIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFuZHMgKHRoZSBib2R5IHN0aWxsIHJ1bnMgaW1tZWRpYXRlbHkpLiBCb3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB1bmRlZmluZWQvZmFsc2Ugb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBwcmVJbmxpbmVXcml0ZUN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgYmF0Y2ggcmVzdWx0cy4gYHJldHJ5YCBzdGVwcyAod2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZXhpc3Qg4oCUIHRoZWlyIGBzdGVwX3N0YXJ0ZWRgIHN1Y2NlZWRlZCkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1xdWV1ZWQgcGVyLXN0ZXAgYXMgYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXk7IGB0aHJvdHRsZWRgIHN0ZXBzIChyZWplY3RlZCBvbiB0aGUgY3JlYXRlLWNsYWltLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbmV2ZXIgY3JlYXRlZCkgaW5zdGVhZCBkZWZlciByZWRlbGl2ZXJ5IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHNvIHRoZXkgcmUtcnVuIGlubGluZSB3aXRoIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZXBsYXk7IGNvbXBsZXRlZC9mYWlsZWQgc3RlcHMgYWxyZWFkeSB3cm90ZSB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnRzLiBXZSBvbmx5IGxvb3AgYmFjayB0byByZXBsYXkgd2hlbiBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIOKAlCBvdGhlcndpc2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC1wZW5kaW5nIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIGJ5IHRoZWlyIHF1ZXVlZCByZXRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMgYW5kIHRoZSBiYWNrZ3JvdW5kLXN0ZXAgaGFuZGxlciByZXBsYXlzIG9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogKHR5cGVvZiBsYXp5SW5saW5lU3RlcHMpW251bWJlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW55UGVuZGluZ09wcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB0aHJvdHRsZWQgaW5saW5lIHN0ZXAgZGVsYXlzIHJlZGVsaXZlcnkgb2YgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYmVpbmcgcmUtcXVldWVkIGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcC4gQ3J1Y2lhbGx5LCBhIGB0aHJvdHRsZWRgIHJlc3VsdCBtZWFuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgd2FzIHJlamVjdGVkIG9uIHRoZSBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSDigJQgc28gdGhlIHN0ZXAgd2FzIE5FVkVSIGNyZWF0ZWQgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgbm8gc3RlcCBlbnRpdHkpLiBSZS1xdWV1aW5nIGl0IGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcCB3b3VsZCBzZW5kIGEgYmFyZSBgc3RlcF9zdGFydGVkYCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0KSwgd2hpY2ggdGhlIHdvcmxkIHJlamVjdHMgd2l0aCBgU3RlcCBcIjxpZD5cIiBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kYCBiZWNhdXNlIGl0IGNhbm5vdCBsYXppbHkgY3JlYXRlIHRoZSBzdGVwIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbnB1dDsgdGhhdCBlcnJvciBpc24ndCB0cmFuc2xhdGFibGUsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZWRlbGl2ZXJzIHVudGlsIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGFuZCBydW4pIGZhaWwuIERlZmVycmluZyByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIGluc3RlYWQgcmUtYXR0ZW1wdHMgdGhlIHRocm90dGxlZCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgV0lUSCBpdHMgaW5wdXQgb24gcmVwbGF5LiBXZSB0cmFjayB0aGUgbG9uZ2VzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja29mZiBzbyBhIGJhdGNoIHdpdGggbXVsdGlwbGUgdGhyb3R0bGVzIHdhaXRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4LiBOb3RlOiBgcmV0cnlgIHJlc3VsdHMgYXJlIHNhZmUgdG8gcmUtcXVldWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgYmVjYXVzZSBhIHJldHJ5IGltcGxpZXMgYHN0ZXBfc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgc3VjY2VlZGVkIGFuZCB0aGUgc3RlcCBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGVUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhenlJbmxpbmVTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gc3RlcFJlc3VsdHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBsYXp5SW5saW5lU3RlcHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogci50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudGltZW91dFNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55UGVuZGluZ09wcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVyIHJlZGVsaXZlcnkgb2YgdGhlIG9yY2hlc3RyYXRvciBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3R0bGUgYmFja29mZi4gT24gcmVwbGF5IGV2ZXJ5IG5vbi10ZXJtaW5hbCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlLWRpc3BhdGNoZWQgYnkgdGhlIHN1c3BlbnNpb24gaGFuZGxlcjogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXRocm90dGxlZCBzdGVwcyBydW4gaW5saW5lIGFnYWluIFdJVEggdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgKHRoZWlyIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkIGFuZXcpLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGByZXRyeWAgc3RlcHMgaW4gdGhpcyBiYXRjaCBhcmUgcXVldWVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd24gcmV0cnlBZnRlciBob25vcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBzdGVwcyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlZCBmcm9tIHRoZWlyIGV2ZW50cyBhbmQgbm90IHJlLXJ1bi4gQmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGRyaXZlcyBhbGwgcmVtYWluaW5nIHdvcmssIHdlIG11c3QgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gcmUtcXVldWUgYHRvUmV0cnlgIGhlcmUg4oCUIHRoYXQgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlLWRpc3BhdGNoIHRob3NlIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJldHVybnMgQkVGT1JFIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LCBzbyBhIGJhdGNoIHRoYXQgbWl4ZXMgYSB0aHJvdHRsZSB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkIHN0ZXAgdGhhdCBsZWZ0IHVuZmx1c2hlZCBvcHMgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlIGV4cGxpY2l0IGZsdXNoIGNvbnRpbnVhdGlvbi4gVGhhdCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRocm90dGxlIGJhY2tvZmYgKD49IDFzKSBhbHdheXMgZXhjZWVkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4taW52b2NhdGlvbiBmbHVzaCB3aW5kb3cgKDw9IDUwMG1zICsgd2FpdFVudGlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb3BzIHNldHRsZSBiZWZvcmUgdGhlIHBvc3QtYmFja29mZiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMgYW5kIHJlYWRzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSh0aHJvdHRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5VHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5Lm1hcCgoeyBzdGVwLCBkZWxheVNlY29uZHMgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmV0cnlUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IHRoZSBkZWxheWVkIHJldHJ5IG9uIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWxhdGlvbklkIHNvIGl0IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCByZS1kaXNwYXRjaCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyZm9ybXMgb24gcmVwbGF5IChpdCBhbHNvIHVzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZGApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIG1peGVkIGJhdGNoIHdoZXJlIG9uZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbXBsZXRlZGAgd2l0aCB1bmZsdXNoZWQgYmFja2dyb3VuZCBvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYGFueVBlbmRpbmdPcHNgKSBhbmQgYW5vdGhlciBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgd291bGQgZG91YmxlLWRpc3BhdGNoIHRoZSByZXRyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaCBiZWxvdyBxdWV1ZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcGxhaW4gY29udGludWF0aW9uLCB3aG9zZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVzIHRoZSBzdGlsbC1gcmV0cnlpbmdgIHN0ZXAgYXMgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1kaXNwYXRjaGVzIGl0ICppbW1lZGlhdGVseSogYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndpdGgqIGEga2V5LiBTaW5jZSB0aGlzIGRlbGF5ZWQgcmV0cnkgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8ga2V5LCB0aGUgdHdvIG1lc3NhZ2VzIHdvdWxkbid0IGRlZHVwZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCB3b3VsZCBydW4gdHdpY2UsIHRoZSBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYmFja29mZiB3b3VsZCBiZSBpZ25vcmVkIChwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFcnJvcmAgcmV0cmllcyBwZXJzaXN0IG5vIGByZXRyeUFmdGVyYCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ybGQgaGFzIG5vIGBUb29FYXJseWAgZ3VhcmQpLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYm9keSBjb3VsZCBydW4gZWFybHkvY29uY3VycmVudGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJpbmcgdGhlIGtleSBsZXRzIHRoZSBlYXJsaWVyIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHdpbiwgaG9ub3JpbmcgdGhlIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW55IGlubGluZSBzdGVwIGhhZCBwZW5kaW5nIGJhY2tncm91bmQgb3BzIChlLmcuLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIHdyaXRlcyB0byBTMyksIGJyZWFrIHRoZSBsb29wIGFuZCBxdWV1ZSBhIHBsYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gc28gd2FpdFVudGlsIGNhbiBmbHVzaCB0aGVtIGJlZm9yZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgcmVwbGF5IHJlYWRzIHRoZW0uIFRoaXMgbWF0Y2hlcyBWMSBiZWhhdmlvciB3aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCBzdGVwIHJhbiBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55UGVuZGluZ09wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCcmVha2luZyBsb29wOiBpbmxpbmUgc3RlcCBoYXMgcGVuZGluZyBvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGxvb3BJdGVyYXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGlubGluZSBzdGVwcyB3aWxsIGJlIHJlLXJ1biB2aWEgdGhlaXIgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IG1lc3NhZ2VzOyB0aGUgYmFja2dyb3VuZC1zdGVwIGhhbmRsZXIgcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFsbCBzdGVwcyBhcmUgdGVybWluYWwuIERvbid0IGxvb3AgaGVyZSDigJQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHN0ZXBzIGhhdmUgbm8gdGVybWluYWwgZXZlbnQgdG8gb2JzZXJ2ZSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGlubGluZSBzdGVwcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkg4oCUIGxvb3AgYmFjayB0byByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgd29ya2Zsb3cgb2JzZXJ2ZXMgdGhlIHRlcm1pbmFsIGV2ZW50cyBvbiByZXBsYXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaW5nbGUgaW5saW5lIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIGRlbHRhIChzdXBwb3J0aW5nIFdvcmxkICsgdGhlIHNpbmdsZS1zdGVwIGdhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlKSwgc3Rhc2ggaXQgc28gdGhlIG5leHQgaXRlcmF0aW9uJ3MgbG9hZCBjb25zdW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LiBPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGxldGVkIHBhdGggY2FycmllcyBhIGRlbHRhOyBtdWx0aS1zdGVwIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlcXVlc3Qgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25seSA9IHN0ZXBSZXN1bHRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuaW5saW5lRGVsdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb25seS5pbmxpbmVEZWx0YS5oYXNNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbmxpbmVEZWx0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogb25seS5pbmxpbmVEZWx0YS5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG9ubHkuaW5saW5lRGVsdGEuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm1pbmFsRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVwbGF5RGl2ZXJnZW5jZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2ZXJnZW5jZUNvdW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGF5RGl2ZXJnZW5jZT8uY291bnQgPz8gMCkgKyAxO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQgPD0gUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkOyBxdWV1ZWluZyBhIHJlY292ZXJ5IHJlcGxheSBiZWZvcmUgZGVjbGFyaW5nIHRoZSBldmVudCBsb2cgY29ycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX0RJVkVSR0VOQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JEaXZlcmdlbmNlRXZlbnRJZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjb3ZlcnlSZXBsYXlzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQgJHtkaXZlcmdlbmNlQ291bnR9IHRpbWVzIGFmdGVyICR7UkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVN9IHJlY292ZXJ5IHJlcGxheXM7IGxhdGVzdCBkaXZlcmdlbnQgZXZlbnQgd2FzICR7ZXJyLmV2ZW50SWR9LiBMYXN0IGRpdmVyZ2VuY2U6ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiBlcnIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIGNvZGUgZXJyb3JzIGFuZCB0ZXJtaW5hbCBydW50aW1lIGVycm9ycyBmYWlsIHRoZSBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWxFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnJlY29yZEV4Y2VwdGlvbj8uKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IodGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3IubmFtZSB8fCBnZXRFcnJvck5hbWUodGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBub3JtYWxpemVkRXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLnN0YWNrIHx8IGdldEVycm9yU3RhY2sodGVybWluYWxFcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzc2lmeSB0aGUgZXJyb3I6IFdvcmtmbG93UnVudGltZUVycm9yIGluZGljYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gU0RLL3J1bnRpbWUgaXNzdWUsIGFuZCBzZWxlY3RlZCBzdWJjbGFzc2VzIHVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBzcGVjaWZpYyBjb2RlcyBmb3IgYmFja2VuZCB0cmFja2luZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGNsYXNzaWZ5UnVuRXJyb3IodGVybWluYWxFcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxlIHJ1bm5pbmcgd29ya2Zsb3cnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSB0aGUgc291cmNlLW1hcC1yZW1hcHBlZCBzdGFjayB0byB0aGUgdGhyb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzbyB0aGF0IHRoZSBzZXJpYWxpemVkIGVycm9yIHByZXNlcnZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGNvbnN1bWVycy4gYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgaXMgdXNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBgZXJyIGluc3RhbmNlb2YgRXJyb3JgIGJlY2F1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBydW5zIGluIGEgc2VwYXJhdGUgVk0gcmVhbG0g4oCUIGl0cyBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3MgaXMgZGlzdGluY3QgZnJvbSB0aGUgaG9zdCdzLCBzbyBgaW5zdGFuY2VvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3JgIGlzIGBmYWxzZWAgZm9yIFZNLXRocm93biBlcnJvcnMuIFRoZSBWOFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSB0YWcgd29ya3MgYWNyb3NzIHJlYWxtcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pc05hdGl2ZUVycm9yKHRlcm1pbmFsRXJyb3IpICYmIGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlcm1pbmFsRXJyb3IgYXMgRXJyb3IpLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgd29ya2Zsb3cgcnVuIHZpYSBldmVudCAoZXZlbnQtc291cmNlZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBzbyBpdHMgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBpZGVudGl0eSBhbmQgY3VzdG9tIHByb3BlcnRpZXMgcm91bmQtdHJpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFpbEVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IC8vIEVuZCB3aGlsZSBsb29wXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApOyAvLyBFbmQgdHJhY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApOyAvLyBFbmQgd2l0aFdvcmtmbG93QmFnZ2FnZVxuICAgICAgICB9KTsgLy8gRW5kIHdpdGhUcmFjZUNvbnRleHRcbiAgICAgIH1cbiAgICApO1xuXG4gIGxldCBjYWNoZWRIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuICBsZXQgaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgY29uc3QgZW50cnlwb2ludENyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvdXRlTW9kdWxlQm9keUluaXRNcyA9XG4gICAgdHlwZW9mIG9wdGlvbnM/LnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9PT0gJ251bWJlcidcbiAgICAgID8gZW50cnlwb2ludENyZWF0ZWRBdCAtIG9wdGlvbnMucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpbnZvY2F0aW9uQ291bnQgKz0gMTtcbiAgICBjb25zdCBoYW5kbGVyQ2FjaGVkID0gY2FjaGVkSGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ1NFUlZFUicpO1xuXG4gICAgcmV0dXJuIHRyYWNlKFxuICAgICAgJ3dvcmtmbG93LnJvdXRlLmZsb3cnLFxuICAgICAge1xuICAgICAgICBraW5kOiBzcGFuS2luZCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlVHlwZSgnZmxvdycpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSGFuZGxlckNhY2hlZChoYW5kbGVyQ2FjaGVkKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUludm9jYXRpb25Db3VudChpbnZvY2F0aW9uQ291bnQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlRW50cnlwb2ludEFnZU1zKFxuICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGVudHJ5cG9pbnRDcmVhdGVkQXRcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLihyb3V0ZU1vZHVsZUJvZHlJbml0TXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBBdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlJbml0TXMocm91dGVNb2R1bGVCb2R5SW5pdE1zKSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSZXF1ZXN0TWV0aG9kKHJlcS5tZXRob2QpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUm91dGUoJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9mbG93JyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgaWYgKCFjYWNoZWRIYW5kbGVyKSB7XG4gICAgICAgICAgY2FjaGVkSGFuZGxlciA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5pbml0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ybGRIYW5kbGVycyA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAgICAgICAnd29ya2Zsb3cucm91dGUuZ2V0X3dvcmxkX2hhbmRsZXJzJyxcbiAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gZ2V0V29ybGRIYW5kbGVycygpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIod29ybGRIYW5kbGVycyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlZEhhbmRsZXIocmVxKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgQXR0cmlidXRlLkh0dHBSZXNwb25zZVN0YXR1c0NvZGUocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl19