@cqa-lib/cqa-ui 1.1.383 → 1.1.384

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.
@@ -1,4 +1,4 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ViewChild, HostListener } from '@angular/core';
2
2
  import { getEmptyStatePreset } from '../empty-state/empty-state-presets.constants';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/platform-browser";
@@ -8,8 +8,9 @@ import * as i4 from "@angular/material/progress-spinner";
8
8
  import * as i5 from "@angular/common";
9
9
  import * as i6 from "@angular/material/tooltip";
10
10
  export class SimulatorComponent {
11
- constructor(sanitizer) {
11
+ constructor(sanitizer, cdr) {
12
12
  this.sanitizer = sanitizer;
13
+ this.cdr = cdr;
13
14
  this.videoUrl = '';
14
15
  this.videoUrls = [];
15
16
  this.videoCurrentDuration = 0;
@@ -286,8 +287,25 @@ export class SimulatorComponent {
286
287
  get isPlayerSwitching() {
287
288
  return this.playerState === 'switching';
288
289
  }
289
- get shouldApplySmallHeightClasses() {
290
- return typeof window !== 'undefined' && window.innerHeight < 600 && this.platformType === 'browser' && this.isLive;
290
+ get isAspectRatioMatched() {
291
+ if (typeof window === 'undefined' || !this.effectiveBrowserViewPort)
292
+ return true;
293
+ const windowAr = window.innerWidth / window.innerHeight;
294
+ const viewportAr = this.effectiveBrowserViewPort.width / this.effectiveBrowserViewPort.height;
295
+ const tolerance = 0.15;
296
+ return Math.abs(windowAr - viewportAr) / viewportAr < tolerance;
297
+ }
298
+ get liveContentContainerStyle() {
299
+ if (typeof window === 'undefined' || !this.isLive || this.platformType !== 'browser') {
300
+ return {};
301
+ }
302
+ if (!this.isAspectRatioMatched) {
303
+ return {
304
+ maxHeight: `${Math.max(200, window.innerHeight - 200)}px`,
305
+ height: '100%'
306
+ };
307
+ }
308
+ return {};
291
309
  }
292
310
  get effectiveBrowserViewPort() {
293
311
  const defaultViewport = { width: 1280, height: 720 };
@@ -301,6 +319,9 @@ export class SimulatorComponent {
301
319
  }
302
320
  return { width, height };
303
321
  }
322
+ onWindowResize() {
323
+ this.cdr.markForCheck();
324
+ }
304
325
  get deviceFrameConfig() {
305
326
  if (this.platformType === 'browser') {
306
327
  return this.deviceFrameConfigs['browser'] || null;
@@ -1645,12 +1666,12 @@ export class SimulatorComponent {
1645
1666
  }
1646
1667
  }
1647
1668
  }
1648
- SimulatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
1649
- SimulatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SimulatorComponent, selector: "cqa-simulator", inputs: { videoUrl: "videoUrl", videoUrls: "videoUrls", videoCurrentDuration: "videoCurrentDuration", stepMarkers: "stepMarkers", screenShotUrl: "screenShotUrl", traceViewUrl: "traceViewUrl", platformName: "platformName", platformType: "platformType", platform: "platform", deviceName: "deviceName", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", isVNCSessionIntruppted: "isVNCSessionIntruppted", vncSessionIntupptedMessage: "vncSessionIntupptedMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab", browserViewPort: "browserViewPort" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange" }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (platformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && platformType === 'device',\n '!cqa-h-full !cqa-max-h-[500px]': shouldApplySmallHeightClasses\n }\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && platformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && platformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-max-h-[calc(100%-60px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <video\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
1669
+ SimulatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1670
+ SimulatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SimulatorComponent, selector: "cqa-simulator", inputs: { videoUrl: "videoUrl", videoUrls: "videoUrls", videoCurrentDuration: "videoCurrentDuration", stepMarkers: "stepMarkers", screenShotUrl: "screenShotUrl", traceViewUrl: "traceViewUrl", platformName: "platformName", platformType: "platformType", platform: "platform", deviceName: "deviceName", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", isVNCSessionIntruppted: "isVNCSessionIntruppted", vncSessionIntupptedMessage: "vncSessionIntupptedMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab", browserViewPort: "browserViewPort" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (platformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && platformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && platformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && platformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-max-h-[calc(100%-60px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <video\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
1650
1671
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, decorators: [{
1651
1672
  type: Component,
1652
- args: [{ selector: 'cqa-simulator', template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (platformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && platformType === 'device',\n '!cqa-h-full !cqa-max-h-[500px]': shouldApplySmallHeightClasses\n }\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && platformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && platformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-max-h-[calc(100%-60px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <video\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", styles: [] }]
1653
- }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { videoUrl: [{
1673
+ args: [{ selector: 'cqa-simulator', template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (platformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && platformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && platformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && platformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-max-h-[calc(100%-60px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <video\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-min-w-max': platformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", styles: [] }]
1674
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { videoUrl: [{
1654
1675
  type: Input
1655
1676
  }], videoUrls: [{
1656
1677
  type: Input
@@ -1709,5 +1730,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1709
1730
  }], speedControlContainerRef: [{
1710
1731
  type: ViewChild,
1711
1732
  args: ['speedControlContainer', { static: false }]
1733
+ }], onWindowResize: [{
1734
+ type: HostListener,
1735
+ args: ['window:resize']
1712
1736
  }] } });
1713
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWtFLE1BQU0sZUFBZSxDQUFDO0FBRWxKLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7OztBQW1DbkYsTUFBTSxPQUFPLGtCQUFrQjtJQWlVN0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQS9UbEMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBVyxjQUFjLENBQUM7UUFDdEMsaUJBQVksR0FBeUIsU0FBUyxDQUFDO1FBQy9DLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDakMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQTZFLGFBQWEsQ0FBQztRQUNyRyxxQkFBZ0IsR0FBVyxZQUFZLENBQUM7UUFDeEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLHdCQUFtQixHQUFXLEVBQUUsQ0FBQztRQUNqQywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsK0JBQTBCLEdBQVcsRUFBRSxDQUFDO1FBQ3hDLGlCQUFZLEdBQWdCLE9B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S0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFLSCxVQUFVO3NCQURiLFNBQVM7dUJBQUMsU0FBUztnQkFlaEIsY0FBYztzQkFEakIsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWF2Qyx3QkFBd0I7c0JBRDNCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRFbXB0eVN0YXRlUHJlc2V0IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtcHJlc2V0cy5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnU0tJUFBFRCc7XG4gIHRlc3RTdGVwSWQ/OiBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBjaGlsZFN0ZXBzPzogU3RlcE1hcmtlcltdO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFR5cGUgPSAnc2NyZWVuc2hvdHMnIHwgJ3ZpZGVvJyB8ICd0cmFjZSc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn07XG5pbnRlcmZhY2UgRGV2aWNlRnJhbWVDb25maWcge1xuICBtb2NrdXBJbWFnZTogc3RyaW5nO1xuICBzY3JlZW5JbnNldDoge1xuICAgIHRvcDogc3RyaW5nO1xuICAgIHJpZ2h0OiBzdHJpbmc7XG4gICAgYm90dG9tOiBzdHJpbmc7XG4gICAgbGVmdDogc3RyaW5nO1xuICB9O1xuICBib3JkZXJSYWRpdXM6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHZpZGVvVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdmlkZW9VcmxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSB2aWRlb0N1cnJlbnREdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc3RlcE1hcmtlcnM6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzY3JlZW5TaG90VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhY2VWaWV3VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhdGZvcm1OYW1lOiBzdHJpbmcgPSAnV2ViIC0gQ2hyb21lJztcbiAgQElucHV0KCkgcGxhdGZvcm1UeXBlOiAnYnJvd3NlcicgfCAnZGV2aWNlJyA9ICdicm93c2VyJztcbiAgQElucHV0KCkgcGxhdGZvcm06IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBTZWdtZW50VHlwZSA9ICd2aWRlbyc7XG4gIEBJbnB1dCgpIGhpZGVWaWRlb1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBicm93c2VyVmlld1BvcnQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIEBPdXRwdXQoKSB2aWRlb1RpbWVVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGxheSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGF1c2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtYXJrZXJIaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNYXJrZXI+KCk7XG4gIEBPdXRwdXQoKSBpc1ZpZGVvUGxheWluZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwcml2YXRlIF92cGxheWVyPzogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd2cGxheWVyJylcbiAgc2V0IHZwbGF5ZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RpbWVsaW5lQmFyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHRpbWVsaW5lQmFyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3RpbWVsaW5lQmFyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHRpbWVsaW5lQmFyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVCYXI7XG4gIH1cblxuICBwcml2YXRlIF9zcGVlZENvbnRyb2xDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzcGVlZENvbnRyb2xDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNwZWVkQ29udHJvbENvbnRhaW5lclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXIgPSByZWY7XG4gIH1cblxuICBnZXQgc3BlZWRDb250cm9sQ29udGFpbmVyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyO1xuICB9XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNGdWxsU2NyZWVuOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRWaWV3OiBzdHJpbmcgPSAndmlkZW8nO1xuICBjdXJyZW50VmlkZW9JbmRleDogbnVtYmVyID0gMDtcbiAgY3VycmVudFNwZWVkOiBzdHJpbmcgPSAnMXgnO1xuICBpc1NwZWVkQ29udHJvbE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXRlY3RlZFZpZGVvRHVyYXRpb25zOiBudW1iZXJbXSA9IFtdOyAvLyBBY3R1YWwgZHVyYXRpb25zIGRldGVjdGVkIGZyb20gdmlkZW8gbWV0YWRhdGFcbiAgcHJpdmF0ZSB3YXNQbGF5aW5nQmVmb3JlRHJhZzogYm9vbGVhbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB2aWRlbyB3YXMgcGxheWluZyBiZWZvcmUgZHJhZyBzdGFydGVkXG4gIHByaXZhdGUgcGxheVByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgcGxheSBwcm9taXNlXG4gIHByaXZhdGUgaGl0TWFya2VyczogU2V0PG51bWJlcj4gPSBuZXcgU2V0KCk7IC8vIFRyYWNrIHdoaWNoIG1hcmtlcnMgaGF2ZSBiZWVuIGhpdCAoYnkgdGVzdFN0ZXBJZClcblxuICAvLyBTdGF0ZSBtYWNoaW5lIGZvciByb2J1c3QgbWVkaWEgb3BlcmF0aW9uc1xuICBwcml2YXRlIHBsYXllclN0YXRlOiAnaWRsZScgfCAnbG9hZGluZycgfCAncmVhZHknIHwgJ3BsYXlpbmcnIHwgJ3BhdXNlZCcgfCAnc2Vla2luZycgfCAnc3dpdGNoaW5nJyB8ICdlcnJvcicgPSAnaWRsZSc7XG4gIHByaXZhdGUgb3BlcmF0aW9uUXVldWU6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTsgLy8gU2VyaWFsaXplIGFsbCBtZWRpYSBvcGVyYXRpb25zXG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cbiAgZ2V0IHNob3VsZEFwcGx5U21hbGxIZWlnaHRDbGFzc2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5uZXJIZWlnaHQgPCA2MDAgJiYgdGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJyAmJiB0aGlzLmlzTGl2ZTtcbiAgfVxuXG4gIHNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSxcbiAgXTtcblxuICBzcGVlZFNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJzF4JywgdmFsdWU6ICcxeCcgfSxcbiAgICB7IGxhYmVsOiAnMngnLCB2YWx1ZTogJzJ4JyB9LFxuICAgIHsgbGFiZWw6ICc1eCcsIHZhbHVlOiAnNXgnIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSB2aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2V0RHVyYXRpb246IG51bWJlciA9IC0xO1xuICBwcml2YXRlIGRyYWdNb3VzZU1vdmVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZHJhZ01vdXNlVXBIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcjogKChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmVsb2FkQWxsVmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIFxuICBzYWZlVHJhY2VVcmw6IFNhZmVSZXNvdXJjZVVybDtcbiAgdHJhY2VWaWV3ZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHRyYWNlVmlld2VyRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb3JyZWN0RGV2aWNlRnJhbWVBdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbXB0eVN0YXRlQ29uZmlnID0gZ2V0RW1wdHlTdGF0ZVByZXNldCgnbm90aGluZ1RvRGlzcGxheScpO1xuICByZWFkb25seSBkZXZpY2VFcnJvckVtcHR5U3RhdGVDb25maWcgPSB7XG4gICAgLi4udGhpcy5lbXB0eVN0YXRlQ29uZmlnLFxuICAgIHRpdGxlOiAnRGV2aWNlIE5vdCBTdXBwb3J0ZWQnLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRldmljZSB5b3UgYXJlIHRyeWluZyB0byB1c2UgaXMgbm90IHN1cHBvcnRlZC4nLFxuICAgIGFjdGlvbnM6IFtdXG4gIH07XG5cbiAgZ2V0IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHsgd2lkdGg6IDEyODAsIGhlaWdodDogNzIwIH07XG5cbiAgICBpZiAoIXRoaXMuYnJvd3NlclZpZXdQb3J0KSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gTnVtYmVyKCh0aGlzLmJyb3dzZXJWaWV3UG9ydCBhcyBhbnkpLndpZHRoKTtcbiAgICBjb25zdCBoZWlnaHQgPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkuaGVpZ2h0KTtcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHdpZHRoKSB8fCAhTnVtYmVyLmlzRmluaXRlKGhlaWdodCkgfHwgd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWaWV3cG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRldmljZUZyYW1lQ29uZmlnczogUmVjb3JkPHN0cmluZywgRGV2aWNlRnJhbWVDb25maWc+ID0ge1xuICAgIC8vIFBpeGVsc1xuICAgICdQaXhlbCA1Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtNS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDgnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC04LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIuNSUnLFxuICAgICAgICBsZWZ0OiAnNC41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdQaXhlbCA5Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtOS1wcm8ud2VicCcsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICc0JScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICc0JScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdQaXhlbCAxMCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTEwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxJScsXG4gICAgICAgIHJpZ2h0OiAnMi41JScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNSUnXG4gICAgfSxcbiAgICAvLyBpUGhvbmVzXG4gICAgJ2lQaG9uZSAxMSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2FwcGxlLWlwaG9uZS0xMS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMyUnLFxuICAgICAgICByaWdodDogJzcuNSUnLFxuICAgICAgICBib3R0b206ICczJScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxMyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2FwcGxlLWlwaG9uZS0xMy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzUlJyxcbiAgICAgICAgYm90dG9tOiAnMiUnLFxuICAgICAgICBsZWZ0OiAnNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDE1Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTE1LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSBYUic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2FwcGxlLWlwaG9uZS14ci5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMy41JScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMuNSUnLFxuICAgICAgICBsZWZ0OiAnNy41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTYgUHJvJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE2LXByby5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMS41JScsXG4gICAgICAgIGJvdHRvbTogJzAuNSUnLFxuICAgICAgICBsZWZ0OiAnMS41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTYnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzAuNSUnLFxuICAgICAgICByaWdodDogJzMlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc2JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTcgUHJvIE1heCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy1wcm8tbWF4LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxJScsXG4gICAgICAgIHJpZ2h0OiAnMiUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTcnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTcucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIEdhbGF4eSBcbiAgICAnR2FsYXh5IFMyMCBGRSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3NhbXN1bmctZ2FsYXh5LXMyMC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMS41JScsXG4gICAgICAgIHJpZ2h0OiAnMiUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBTMjUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9nYWxheHktczI1LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnOCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSBVbHRyYSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUtdWx0cmEucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzAuNSUnLFxuICAgICAgICByaWdodDogJzElJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICczJSdcbiAgICB9LFxuICAgICdHYWxheHkgVGFiIEE5Kyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS10YWItYTktcGx1cy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzMlJyxcbiAgICAgICAgYm90dG9tOiAnMiUnLFxuICAgICAgICBsZWZ0OiAnMyUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMSUnXG4gICAgfSxcbiAgICAvLyBCcm93c2VyXG4gICAgYnJvd3Nlcjoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYnJvd3Nlci1tb2NrdXAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzYlJyxcbiAgICAgICAgcmlnaHQ6ICcwJScsXG4gICAgICAgIGJvdHRvbTogJzAlJyxcbiAgICAgICAgbGVmdDogJzAlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzAlJ1xuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRldmljZUZyYW1lQ29uZmlnKCk6IERldmljZUZyYW1lQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGRldmljZU5hbWUgYW5kIGl0cyBmcmFtZSBpcyBhdmFpbGFibGUsIHJldHVybiBpdFxuICAgICAgaWYgKHRoaXMuZGV2aWNlTmFtZSAmJiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1t0aGlzLmRldmljZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1t0aGlzLmRldmljZU5hbWVdO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBubyBkZXZpY2VOYW1lIG9yIGRldmljZU5hbWUncyBmcmFtZSBub3QgYXZhaWxhYmxlLCB1c2UgZGVmYXVsdHMgYmFzZWQgb24gcGxhdGZvcm1cbiAgICAgIC8vIGlmICh0aGlzLnBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICAgIC8vICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzWydQaXhlbCA5J10gfHwgbnVsbDtcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmICh0aGlzLnBsYXRmb3JtID09PSAnaW9zJykge1xuICAgICAgLy8gICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZ3NbJ2lQaG9uZSAxNSddIHx8IG51bGw7XG4gICAgICAvLyB9XG4gICAgICBcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IGRldmljZU1vY2t1cEltYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWcgPyB0aGlzLmRldmljZUZyYW1lQ29uZmlnLm1vY2t1cEltYWdlIDogJyc7XG4gIH1cblxuICBnZXQgZGV2aWNlU2NyZWVuU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZztcbiAgICBpZiAoIWNmZykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogY2ZnLnNjcmVlbkluc2V0LnRvcCxcbiAgICAgIHJpZ2h0OiBjZmcuc2NyZWVuSW5zZXQucmlnaHQsXG4gICAgICBib3R0b206IGNmZy5zY3JlZW5JbnNldC5ib3R0b20sXG4gICAgICBsZWZ0OiBjZmcuc2NyZWVuSW5zZXQubGVmdCxcbiAgICAgICdib3JkZXItcmFkaXVzJzogY2ZnLmJvcmRlclJhZGl1cyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuc2VsZWN0ZWRWaWV3O1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnVwZGF0ZVNhZmVUcmFjZVVybCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2aWRlb1VybHMnXSkge1xuICAgICAgY29uc3QgYXJyID0gY2hhbmdlc1sndmlkZW9VcmxzJ10uY3VycmVudFZhbHVlIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyciAmJiBhcnIubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhhcnIpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlUHJlbG9hZEFsbFNlZ21lbnRzKGFycik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddICYmICFjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBuZXdEdXJhdGlvbiA9IGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gSWdub3JlIHNlbnRpbmVsIHZhbHVlICgtMSkgdXNlZCB0byBmb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICBpZiAobmV3RHVyYXRpb24gPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gbmdPbkNoYW5nZXMgdmlkZW9DdXJyZW50RHVyYXRpb246IHBhdXNlZCB2aWRlbyBiZWZvcmUgc2Vla2luZycpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgICBjb25zdCB0YXJnZXRWaWRlb0luZGV4ID0gdGhpcy5maW5kVmlkZW9JbmRleEZvclRpbWVzdGFtcChuZXdEdXJhdGlvbik7XG4gICAgICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBuZXdEdXJhdGlvbiAtIHRhcmdldEJvdW5kYXJ5LnN0YXJ0O1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG5lZWRzU3dpdGNoID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCAhPT0gdGFyZ2V0VmlkZW9JbmRleDtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmlkZW9UaW1lTXMgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5jdXJyZW50VGltZSAqIDEwMDA7XG4gICAgICAgICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKHJlbGF0aXZlVGltZXN0YW1wIC0gY3VycmVudFZpZGVvVGltZU1zKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5lZWRzU3dpdGNoIHx8IG5ld0R1cmF0aW9uICE9PSB0aGlzLmxhc3RTZXREdXJhdGlvbiB8fCB0aW1lRGlmZmVyZW5jZSA+IDEwMCkge1xuICAgICAgICAgICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5lZWRzU3dpdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKG5ld0R1cmF0aW9uIC0gY3VycmVudFZpZGVvVGltZU1zKTtcbiAgICAgICAgICBpZiAobmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlZWtUb1RpbWUobmV3RHVyYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndHJhY2VWaWV3VXJsJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsICYmIHRoaXMuY3VycmVudFZpZXcgPT09ICd0cmFjZScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuaGlkZVZpZGVvVGFiID8gJ3NjcmVlbnNob3RzJyA6ICd2aWRlbyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoaWRlVmlkZW9UYWInXSkge1xuICAgICAgdGhpcy51cGRhdGVTZWdtZW50cygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRWaWV3J10pIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gbmdPbkRlc3Ryb3k6IGNsZWFuZWQgdXAgbGlzdGVuZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VlayB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHNlZWtUb1RpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqIFRoaXMgcHJldmVudHMgcGlwZWxpbmUgcmVhZCBlcnJvcnMgZHVyaW5nIHJhcGlkIHNlZWsgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWVrVG9UaW1lSW50ZXJuYWwobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF2aWRlby5kdXJhdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgY29uc3QgdGFyZ2V0VGltZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlY29uZHMsIHZpZGVvLmR1cmF0aW9uKSk7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc2Vla1RvVGltZUludGVybmFsOiBzZWVraW5nJywge1xuICAgICAgbWlsbGlzZWNvbmRzLFxuICAgICAgdGFyZ2V0VGltZSxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWVCZWZvcmU6IHZpZGVvLmN1cnJlbnRUaW1lXG4gICAgfSk7XG4gICAgXG4gICAgLy8gU2V0IHNlZWtpbmcgc3RhdGVcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3NlZWtpbmcnO1xuXG4gICAgLy8gQ1JJVElDQUw6IFBhdXNlIGJlZm9yZSBzZWVraW5nIHRvIGF2b2lkIHBpcGVsaW5lIGVycm9yc1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIC8vIFBlcmZvcm0gc2Vla1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdGFyZ2V0VGltZTtcbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IG1pbGxpc2Vjb25kcztcbiAgICBcbiAgICAvLyBXYWl0IGJyaWVmbHkgZm9yIHNlZWsgdG8gY29tcGxldGUgKHByZXZlbnRzIHJhcGlkIHNlZWsgaXNzdWVzKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpO1xuXG4gICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzICgwLTEwMCUgb2YgY3VycmVudCB2aWRlbylcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMCAvIGR1cmF0aW9uTXMpICogMTAwKSk7XG4gICAgfVxuICAgIGNvbnN0IHNlZ21lbnRTdGFydCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApO1xuICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoc2VnbWVudFN0YXJ0ICsgdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICBcbiAgICAvLyBTZXQgdG8gcGF1c2VkIHN0YXRlICh1c2VyIG11c3QgZXhwbGljaXRseSBwbGF5KVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWsgY29tcGxldGUnLCB7XG4gICAgICBjdXJyZW50VGltZUFmdGVyOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBvblZpZGVvS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgIT09ICcgJyAmJiBldmVudC5jb2RlICE9PSAnU3BhY2UnKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9VcmwpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgcGxheS9wYXVzZSAobm93IHRyaXZpYWwgd2l0aCBzdGF0ZSBtYWNoaW5lKVxuICAgKi9cbiAgdG9nZ2xlUGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiB2aWRlbyBlbGVtZW50IG5vdCBmb3VuZCcsIHtcbiAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW5cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciB2YWxpZCBzb3VyY2VcbiAgICBpZiAoIXRoaXMuY3VycmVudFZpZGVvVXJsIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gSFRNTE1lZGlhRWxlbWVudC5ORVRXT1JLX05PX1NPVVJDRSB8fCB2aWRlby5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogbm8gdmFsaWQgc291cmNlJywge1xuICAgICAgICBjdXJyZW50VmlkZW9Vcmw6IHRoaXMuY3VycmVudFZpZGVvVXJsLFxuICAgICAgICBuZXR3b3JrU3RhdGU6IHZpZGVvLm5ldHdvcmtTdGF0ZSxcbiAgICAgICAgZXJyb3I6IHZpZGVvLmVycm9yXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWNvdmVyIGZyb20gc3R1Y2sgJ2xvYWRpbmcnIHN0YXRlIHdoZW4gdmlkZW8gaXMgYWN0dWFsbHkgcmVhZHkgKGUuZy4gYWZ0ZXIganVtcC10by1zZWdtZW50KVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycgJiYgdmlkZW8ucmVhZHlTdGF0ZSA+PSBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB9XG5cbiAgICAvLyBEb24ndCBhbGxvdyBwbGF5IGR1cmluZyBlcnJvciBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHBsYXllciBpbiBlcnJvciBzdGF0ZScsIHsgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZSB9KTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuXG4gICAgLy8gSWYgc3RpbGwgbG9hZGluZyBhbmQgdmlkZW8gbm90IHJlYWR5LCB3YWl0IGFuZCByZXRyeVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIG5vdCByZWFkeScsIHtcbiAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSAmJiB0aGlzLnBsYXllclN0YXRlICE9PSAncGxheWluZycpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OicsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZyxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFNpbXBsZSB0b2dnbGUgYmFzZWQgb24gc3RhdGVcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGxheVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBlbGltaW5hdGVzIEZGbXBlZ0RlbXV4ZXIgZXJyb3JzIGFuZCBwbGF5IHByb21pc2UgaW50ZXJydXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwbGF5VmlkZW9JbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IHBsYXlpbmcgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBsYXlpbmcsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBzdGFydGluZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCBmb3IgdmlkZW8gdG8gYmUgcmVhZHkgaWYgbmVlZGVkXG4gICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogd2FpdGluZyBmb3IgbWV0YWRhdGEnKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbyBtZXRhZGF0YScpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgaGl0IG1hcmtlcnMgaWYgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmdcbiAgICBjb25zdCBjdXJyZW50VGltZU1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuICAgIGlmIChjdXJyZW50VGltZU1zIDwgMTAwKSB7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdGUgdG8gbG9hZGluZ1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGJlZm9yZSBwbGF5aW5nXG4gICAgICBjb25zdCBjdXJyZW50VmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWN1cnJlbnRWaWRlbyB8fCBjdXJyZW50VmlkZW8gIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBvciB1bmF2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF3YWl0IHBsYXkgcHJvbWlzZSAtIHRoaXMgaXMgY3JpdGljYWxcbiAgICAgIGF3YWl0IHZpZGVvLnBsYXkoKTtcbiAgICAgIFxuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHBsYXkgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgY29uc3QgdmlkZW9BZnRlclBsYXkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJQbGF5IHx8IHZpZGVvQWZ0ZXJQbGF5ICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIHBsYXknKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQbGF5IHN1Y2NlZWRlZFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHBsYXlpbmcgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICB9KTtcbiAgICAgICAgXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nICYmIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIHYuY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBQbGF5IGZhaWxlZFxuICAgICAgLy8gQ2hlY2sgaWYgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJFcnJvciA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlckVycm9yIHx8IHZpZGVvQWZ0ZXJFcnJvciAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBlcnJvcicpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhYm9ydGVkIChleHBlY3RlZCBkdXJpbmcgcGF1c2UpJyk7XG4gICAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQsIHJlc2V0IHRvIHBhdXNlZCBzdGF0ZSBpbnN0ZWFkIG9mIGVycm9yXG4gICAgICAgIGlmICh2aWRlb0FmdGVyRXJyb3IgJiYgdmlkZW9BZnRlckVycm9yID09PSB2aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBhdXNlVmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXVzZVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgLy8gQWxyZWFkeSBwYXVzZWQgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBhdXNlZCwgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzaW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcblxuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBtZWRpYSBvcGVyYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyB0aGUgQ1JJVElDQUwgZml4IGZvciBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICogQWxsIG1lZGlhIG9wZXJhdGlvbnMgKHBsYXksIHBhdXNlLCBzZWVrLCBzd2l0Y2gpIGdvIHRocm91Z2ggdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgPSB0aGlzLm9wZXJhdGlvblF1ZXVlXG4gICAgICAudGhlbigoKSA9PiBvcGVyYXRpb24oKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBNZWRpYSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgaGFzTXVsdGlwbGVWaWRlb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIFttc10uIHNlZ21lbnRCb3VuZGFyaWVzW2ldID0gc3VtIG9mIGR1cmF0aW9ucyBbMC4uaV0gKi9cbiAgZ2V0IHNlZ21lbnRCb3VuZGFyaWVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRhcmllczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgZHVyYXRpb25zKSB7XG4gICAgICBzdW0gKz0gZDtcbiAgICAgIGJvdW5kYXJpZXMucHVzaChzdW0pO1xuICAgIH1cbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKiBUb3RhbCBkdXJhdGlvbiBhY3Jvc3MgYWxsIHNlZ21lbnRzIGluIG1zICovXG4gIGdldCB0b3RhbER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG4gIC8qKiBWaWRlbyBkdXJhdGlvbnMgaW4gbXMgKGRldGVjdGVkIG9yIGZyb20gc2luZ2xlIHZpZGVvIGVsZW1lbnQpICovXG4gIHByaXZhdGUgZ2V0IHZpZGVvRHVyYXRpb25zKCk6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucztcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvPy5kdXJhdGlvbiAmJiBpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHtcbiAgICAgIHJldHVybiBbdmlkZW8uZHVyYXRpb24gKiAxMDAwXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRWaWRlb01hcmtlcnMoKTogU3RlcE1hcmtlcltdIHtcbiAgICBsZXQgbWFya2Vyc1RvUHJvY2VzczogU3RlcE1hcmtlcltdO1xuICAgIFxuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLmdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk7XG4gICAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPT09IDAgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSBib3VuZGFyaWVzLmxlbmd0aCkge1xuICAgICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2VycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgICAgIFxuICAgICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2Vyc1xuICAgICAgICAgIC5maWx0ZXIobWFya2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uID49IGN1cnJlbnRCb3VuZGFyeS5zdGFydCAmJiBcbiAgICAgICAgICAgICAgICAgICBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgY3VycmVudEJvdW5kYXJ5LmVuZDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAobWFya2VyID0+IHRoaXMuYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKFxuICAgICAgICAgICAgbWFya2VyLCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5zdGFydCwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuc3RhcnQsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LmVuZFxuICAgICAgICAgICkpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5mbGF0dGVuTWFya2VycyhtYXJrZXJzVG9Qcm9jZXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKG1hcmtlcjogU3RlcE1hcmtlciwgYWRqdXN0bWVudDogbnVtYmVyLCB2aWRlb1N0YXJ0OiBudW1iZXIsIHZpZGVvRW5kOiBudW1iZXIpOiBTdGVwTWFya2VyIHtcbiAgICBjb25zdCBhZGp1c3RlZE1hcmtlcjogU3RlcE1hcmtlciA9IHtcbiAgICAgIC4uLm1hcmtlcixcbiAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiAtIGFkanVzdG1lbnRcbiAgICB9O1xuICAgIFxuICAgIGlmIChtYXJrZXIuY2hpbGRTdGVwcyAmJiBtYXJrZXIuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhZGp1c3RlZE1hcmtlci5jaGlsZFN0ZXBzID0gbWFya2VyLmNoaWxkU3RlcHNcbiAgICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPj0gdmlkZW9TdGFydCAmJiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPCB2aWRlb0VuZClcbiAgICAgICAgLm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgY29uc3QgYWRqdXN0ZWRDaGlsZDogU3RlcE1hcmtlciA9IHtcbiAgICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgICAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gLSBhZGp1c3RtZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRTdGVwcyAmJiBjaGlsZC5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFkanVzdGVkQ2hpbGQuY2hpbGRTdGVwcyA9IGNoaWxkLmNoaWxkU3RlcHNcbiAgICAgICAgICAgICAgLmZpbHRlcihuZXN0ZWRDaGlsZCA9PiBuZXN0ZWRDaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPj0gdmlkZW9TdGFydCAmJiBuZXN0ZWRDaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPCB2aWRlb0VuZClcbiAgICAgICAgICAgICAgLm1hcChuZXN0ZWRDaGlsZCA9PiB0aGlzLmFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihuZXN0ZWRDaGlsZCwgYWRqdXN0bWVudCwgdmlkZW9TdGFydCwgdmlkZW9FbmQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFkanVzdGVkQ2hpbGQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWRqdXN0ZWRNYXJrZXI7XG4gIH1cblxuICBnZXRTdGVwTGVmdFBvc2l0aW9uKHN0ZXA6IFN0ZXBNYXJrZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm4gMDtcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIHJldHVybiAoc3RlcC5jdW11bGF0aXZlRHVyYXRpb24gLyBkdXJhdGlvbk1zKSAqIDEwMDtcbiAgfVxuXG4gIGdldFN0ZXBDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5sZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjNjM2NkYxJztcbiAgfVxuXG4gIGdldFN0ZXBSZXN1bHRDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihzdGVwLnJlc3VsdCk7XG4gIH1cblxuICBnZXRHbG9iYWxNYXJrZXJDb2xvcihsZXZlbD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxldmVsID09PSAxID8gJyMwMDAwMDAnIDogJyNGRkE1MDAnO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IocmVzdWx0OiBTdGVwTWFya2VyWydyZXN1bHQnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgIGNhc2UgJ1NVQ0NFU1MnOlxuICAgICAgICByZXR1cm4gJyMxMkI3NkEnO1xuICAgICAgY2FzZSAnRkFJTFVSRSc6XG4gICAgICAgIHJldHVybiAnI0I5MUMxQyc7XG4gICAgICBjYXNlICdBQk9SVEVEJzpcbiAgICAgICAgcmV0dXJuICcjRjc5MDA5JztcbiAgICAgIGNhc2UgJ1NLSVBQRUQnOlxuICAgICAgICByZXR1cm4gJyM2NjcwODUnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcjNjM2NkYxJztcbiAgICB9XG4gIH1cblxuICBvbk1hcmtlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBtYXJrZXI6IFN0ZXBNYXJrZXIpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbjtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChtYXJrZXIudGVzdFN0ZXBJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5hZGQobWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICB0aGlzLm1hcmtlckhpdC5lbWl0KG1hcmtlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMuY3VycmVudFZpZGVvSW5kZXgsIDApLCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0aGlzLnZpZGVvVXJsc1tpZHhdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWRlb1VybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcmVzZXRWaWRlb1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogcmVzZXR0aW5nJyk7XG5cbiAgICB2aWRlby5wYXVzZSgpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gLTE7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogY29tcGxldGUnKTtcbiAgfVxuXG4gIHByZXZWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDEpKTtcbiAgICB9XG4gIH1cblxuICBvblRpbWVsaW5lQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQgfHwgIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpY2tYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgY2xpY2tYIC8gcmVjdC53aWR0aCkpO1xuXG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gcGVyY2VudCAqIHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25UaW1lbGluZUNsaWNrJywge1xuICAgICAgcGVyY2VudCxcbiAgICAgIHRhcmdldFRpbWVNcyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmdcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhcnREcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICBcbiAgICAvLyBDUklUSUNBTDogQ2FwdHVyZSBwbGF5aW5nIHN0YXRlIEJFRk9SRSBwYXVzaW5nXG4gICAgLy8gVXNlIGJvdGggaXNQbGF5aW5nIGZsYWcgYW5kIHBsYXllclN0YXRlIGZvciByZWxpYWJpbGl0eVxuICAgIHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWcgPSB0aGlzLmlzUGxheWluZyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZyc7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0YXJ0RHJhZycsIHtcbiAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmcsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZ1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFBhdXNlIHZpZGVvIGR1cmluZyBkcmFnIHRvIGF2b2lkIGNvbmZsaWN0c1xuICAgIGlmICh0aGlzLmlzUGxheWluZyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmFkZERyYWdMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIG9uRHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZyB8fCAhdGhpcy50aW1lbGluZUJhcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGltZWxpbmVCYXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oeCAvIHJlY3Qud2lkdGgsIDEpKTtcbiAgICB0aGlzLnByb2dyZXNzID0gcGVyY2VudCAqIDEwMDsgLy8gR2xvYmFsIHRpbWVsaW5lIHBvc2l0aW9uXG4gIH1cblxuICBzdG9wRHJhZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcbiAgICBcbiAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZztcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IGRyYWcgZW5kZWQnLCB7XG4gICAgICBwcm9ncmVzczogdGhpcy5wcm9ncmVzcyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZzogc2hvdWxkUmVzdW1lUGxheWluZyxcbiAgICAgIGN1cnJlbnRQbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbyB8fCAhdmlkZW8uZHVyYXRpb24gfHwgIWlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gKHRoaXMucHJvZ3Jlc3MgLyAxMDApICogdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuXG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgc2VlaycsIHtcbiAgICAgICAgICB0YXJnZXRUaW1lTXMsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBXYWl0IGEgYml0IGxvbmdlciB0byBlbnN1cmUgc2VlayBpcyBmdWxseSBjb21wbGV0ZVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgIFxuICAgICAgICAvLyBWZXJpZnkgc3RhdGUgaXMgJ3BhdXNlZCcgYWZ0ZXIgc2VlayAoc2Vla1RvVGltZUludGVybmFsIHNldHMgaXQgdG8gJ3BhdXNlZCcpXG4gICAgICAgIC8vIElmIHN0YXRlIGlzIHN0aWxsICdzZWVraW5nJywgd2FpdCBhIGJpdCBtb3JlXG4gICAgICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnc2Vla2luZycpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHNlZWsgc3RpbGwgaW4gcHJvZ3Jlc3MsIHdhaXRpbmcgbW9yZScpO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTm93IHJlc3VtZSBwbGF5YmFjayAoc3RhdGUgc2hvdWxkIGJlICdwYXVzZWQnIGF0IHRoaXMgcG9pbnQpXG4gICAgICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGF1c2VkJykge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHBsYXliYWNrIHJlc3VtZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICAgICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogdW5leHBlY3RlZCBzdGF0ZSBhZnRlciBzZWVrLCBhdHRlbXB0aW5nIHRvIHJlc3VtZSBhbnl3YXknLCB7XG4gICAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFRyeSB0byByZXN1bWUgYW55d2F5IC0gYmV0dGVyIHRvIHRyeSB0aGFuIHRvIGxlYXZlIGl0IHN0dWNrXG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHZpZGVvIHdhcyBwYXVzZWQsIG5vdCByZXN1bWluZycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuXG4gICAgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm9uRHJhZyhlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BEcmFnKCk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURyYWdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICAgICAgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb01ldGFkYXRhTG9hZGVkJyk7XG4gICAgLy8gRW5zdXJlIHBsYXliYWNrIHNwZWVkIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCB2aWRlb3NcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgfVxuICBcbiAgb25WaWRlb0NhblBsYXkoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9DYW5QbGF5Jyk7XG4gICAgLy8gRW5zdXJlIHBsYXliYWNrIHNwZWVkIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCB2aWRlb3NcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIG9uVmlkZW9FbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgLy8gU3dpdGNoIHRvIG5leHQgdmlkZW8gYW5kIGF1dG8tcGxheSBpdFxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMTtcblxuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChuZXh0SW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5jdXJyZW50VmlkZW9VcmwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgMTAwKSByZXR1cm47XG5cbiAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcbiAgICAgICAgY29uc3QgY3VycmVudE1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuXG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZyAmJiB0aGlzLnBsYXllclN0YXRlICE9PSAnc3dpdGNoaW5nJykge1xuICAgICAgICAgIC8vIFBlci12aWRlbyBwcm9ncmVzcyAoMC0xMDAlIG9mIGN1cnJlbnQgdmlkZW8pXG4gICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICAgICAgICBpZiAoZHVyYXRpb25NcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIChjdXJyZW50TXMgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbWl0IGN1bXVsYXRpdmUgdGltZSBmb3IgcGFyZW50IChzdGVwIGhpZ2hsaWdodGluZylcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCArIGN1cnJlbnRNcyk7XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIHRoaXMubWF5YmVQcmVsb2FkTmV4dFNlZ21lbnQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZXIpO1xuXG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGFcbiAgICogVGhpcyBjcmVhdGVzIHRlbXBvcmFyeSB2aWRlbyBlbGVtZW50cyB0byByZWFkIGR1cmF0aW9uIHdpdGhvdXQgcGxheWluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RWaWRlb0R1cmF0aW9ucyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgZGV0ZWN0ZWQgZHVyYXRpb25zXG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgbGV0IGxvYWRlZENvdW50ID0gMDtcblxuICAgIHZpZGVvVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0ZW1wVmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgdGVtcFZpZGVvLnByZWxvYWQgPSAnbWV0YWRhdGEnO1xuICAgICAgXG4gICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gdGVtcFZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zW2luZGV4XSA9IGR1cmF0aW9uTXM7XG4gICAgICAgIGxvYWRlZENvdW50Kys7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhbiB1cFxuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHRlbXBWaWRlby5zcmMgPSAnJztcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZSgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxvYWRlZENvdW50ID09PSB2aWRlb1VybHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIEFsbCB2aWRlbyBkdXJhdGlvbnMgZGV0ZWN0ZWQ6JywgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2ltdWxhdG9yXSBGYWlsZWQgdG8gbG9hZCBtZXRhZGF0YSBmb3IgdmlkZW8gJHtpbmRleCArIDF9YCk7XG4gICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSAwO1xuICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHRlbXBWaWRlby5zcmMgPSAnJztcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZSgpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBnZXRTdGF0dXNCYWRnZUNsYXNzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSAnY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtcm91bmRlZC1bNnB4XSBjcWEtaC1bMjFweF0nO1xuICAgIHN3aXRjaCAodGhpcy5saXZlU3RhdHVzKSB7XG4gICAgICBjYXNlICdJbiBQcm9ncmVzcyc6XG4gICAgICBjYXNlICdFeGVjdXRpb24nOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0UwRjJGRV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjN0REM0ZDXWA7XG4gICAgICBjYXNlICdQYXVzZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZFRjNDN10gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkNEMzREXWA7XG4gICAgICBjYXNlICdBYm9ydGVkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUUyRTJdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDQTVBNV1gO1xuICAgICAgY2FzZSAnRmFpbGVkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0Y5QkZCRl1gO1xuICAgICAgY2FzZSAnUGFzc2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNEMUZBRTVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzZFRTdCN11gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctZ3JheS0yMDAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWdyYXktMzAwYDtcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0dXNUZXh0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDI4NEM3XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjRDk3NzA2XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzA1OTY2OV0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTYwMCBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwcm9jZXNzZWRUcmFjZVVybCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwpIHJldHVybiAnJztcbiAgICBcbiAgICBpZiAodGhpcy50cmFjZVZpZXdVcmwuZW5kc1dpdGgoJy56aXAnKSkge1xuICAgICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIHRyYWNlOiB0aGlzLnRyYWNlVmlld1VybCxcbiAgICAgICAgaGlkZUhlYWRlcjogJ3RydWUnLFxuICAgICAgICBoaWRlQnJhbmRpbmc6ICd0cnVlJyxcbiAgICAgICAgZW1iZWQ6ICd0cnVlJyxcbiAgICAgICAgbWluaW1hbDogJ3RydWUnLFxuICAgICAgICBub0hlYWRlcjogJ3RydWUnXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGBodHRwczovL3RyYWNlLnBsYXl3cmlnaHQuZGV2Lz8ke3VybFBhcmFtcy50b1N0cmluZygpfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzLnRyYWNlVmlld1VybDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2FmZVRyYWNlVXJsKCk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMucHJvY2Vzc2VkVHJhY2VVcmw7XG4gICAgaWYgKHVybCkge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gICAgICB0aGlzLnNhZmVUcmFjZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gICAgICB0aGlzLnNhZmVUcmFjZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgnJyk7XG4gICAgfVxuICB9XG5cbiAgb25UcmFjZVZpZXdlckxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJFcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IHRydWU7XG4gIH1cblxuICBvblNwZWVkQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTcGVlZCA9IHZhbHVlO1xuICAgIC8vIFdoZW5ldmVyIHNwZWVkIGNoYW5nZXMsIGFwcGx5IGl0IHRvIHRoZSBjdXJyZW50IHZpZGVvXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlU3BlZWRDb250cm9sKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gIXRoaXMuaXNTcGVlZENvbnRyb2xPcGVuO1xuICAgIGlmICh0aGlzLmlzU3BlZWRDb250cm9sT3Blbikge1xuICAgICAgdGhpcy5hZGRTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldCAmJiB0aGlzLnNwZWVkQ29udHJvbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCAmJiBcbiAgICAgICAgICAgICF0aGlzLnNwZWVkQ29udHJvbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcik7XG4gICAgICB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VnbWVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgYmFzZVNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgICB7IGxhYmVsOiAnU2NyZWVuc2hvdHMnLCB2YWx1ZTogJ3NjcmVlbnNob3RzJywgaWNvbjogJ3Bob3RvJyAgfSxcbiAgICBdO1xuICAgIFxuICAgIC8vIE9ubHkgYWRkIFZpZGVvIHRhYiBpZiBoaWRlVmlkZW9UYWIgaXMgZmFsc2VcbiAgICBpZiAoIXRoaXMuaGlkZVZpZGVvVGFiKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVmlkZW8nLCB2YWx1ZTogJ3ZpZGVvJywgaWNvbjogJ3ZpZGVvY2FtJyB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVHJhY2UnLCB2YWx1ZTogJ3RyYWNlJywgaWNvbjogJ2dyYXBoaWNfZXEnIH0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlZ21lbnRzID0gYmFzZVNlZ21lbnRzO1xuICAgIFxuICAgIC8vIElmIGN1cnJlbnQgdmlldyBpcyAndmlkZW8nIGFuZCB2aWRlbyB0YWIgaXMgaGlkZGVuLCBzd2l0Y2ggdG8gc2NyZWVuc2hvdHNcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3ZpZGVvJyAmJiB0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdzY3JlZW5zaG90cyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblZpZGVvRWxlbWVudFJlYWR5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy5fdnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb0VsZW1lbnRSZWFkeTogdmlkZW8gZWxlbWVudCByZWFkeScsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IGVycm9yL2xvYWRpbmcgc3RhdGVzIHdoZW4gdmlkZW8gZWxlbWVudCBpcyByZWNyZWF0ZWQgKGUuZy4sIGR1cmluZyBmdWxsc2NyZWVuIHRvZ2dsZSlcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgZXJyb3IvbG9hZGluZyBzdGF0ZScpO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIHdoZW4gdGhlIHZpZGVvIGVsZW1lbnQgaXMgZmlyc3QgcmVhZHlcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuXG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc3QgbnVtZXJpYyA9IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50U3BlZWQucmVwbGFjZSgneCcsICcnKSk7XG4gICAgY29uc3QgcmF0ZSA9ICFpc05hTihudW1lcmljKSAmJiBudW1lcmljID4gMCA/IG51bWVyaWMgOiAxO1xuICAgIHZpZGVvLnBsYXliYWNrUmF0ZSA9IHJhdGU7XG4gIH1cblxuICBwcml2YXRlIGZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXA6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZpbmQgd2hpY2ggdmlkZW8gY29udGFpbnMgdGhpcyB0aW1lc3RhbXBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvdW5kYXJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJvdW5kYXJ5ID0gYm91bmRhcmllc1tpXTtcbiAgICAgIGlmIChjdW11bGF0aXZlVGltZXN0YW1wID49IGJvdW5kYXJ5LnN0YXJ0ICYmIGN1bXVsYXRpdmVUaW1lc3RhbXAgPCBib3VuZGFyeS5lbmQpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGltZXN0YW1wIGlzIGV4YWN0bHkgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCB2aWRlbywgcmV0dXJuIHRoZSBsYXN0IHZpZGVvIGluZGV4XG4gICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdEJvdW5kYXJ5ID0gYm91bmRhcmllc1tib3VuZGFyaWVzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPT09IGxhc3RCb3VuZGFyeS5lbmQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kYXJpZXMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGFyZ2V0VmlkZW9JbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGFyZ2V0VmlkZW9JbmRleCA8IDAgfHwgdGFyZ2V0VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICB2aWRlby5jdXJyZW50VGltZSA9IDA7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IC0xO1xuXG4gICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0YXJnZXRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RhcmdldFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoc2VnbWVudFN0YXJ0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRSZXNldCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzd2l0Y2hUb1ZpZGVvQW5kU2VlayhjdW11bGF0aXZlVGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICBjb25zdCBzZWVrU2Vjb25kcyA9IHJlbGF0aXZlVGltZXN0YW1wIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2Vjb25kcywgdmlkZW8uZHVyYXRpb24gfHwgc2Vla1NlY29uZHMpKTtcbiAgICAgIFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qgb25TZWVrZWQgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCIgICBbbmdTdHlsZV09XCJ7XG4gIHBvc2l0aW9uOiBpc0Z1bGxTY3JlZW4gPyAnZml4ZWQnIDogbnVsbCxcbiAgaW5zZXQ6IGlzRnVsbFNjcmVlbiA/ICcxcmVtJyA6IG51bGwsXG4gIHpJbmRleDogaXNGdWxsU2NyZWVuID8gJzUwJyA6IG51bGwsXG4gIGJveFNoYWRvdzogaXNGdWxsU2NyZWVuID8gJzBweCAxM3B4IDI1cHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjI1KScgOiBudWxsLFxuICBib3JkZXJSYWRpdXM6IGlzRnVsbFNjcmVlbiA/ICcuNXJlbScgOiBudWxsLFxuICBib3JkZXI6IGlzRnVsbFNjcmVlbiA/ICcxcHggc29saWQgI0U1RTdFQicgOiBudWxsLFxuICB3aWR0aDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6IG51bGwsXG4gIGhlaWdodDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6ICcxMDAlJyxcbiAgb3ZlcmZsb3c6IGlzRnVsbFNjcmVlbiA/ICdoaWRkZW4nIDogbnVsbFxufVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyNGRkZGRkZdXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtib3gtc2hhZG93OiAwcHggMXB4IDJweCAwcHggIzAwMDAwMDBEO1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1NjcmVlbiBzaXplOiAnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoICsgJ3gnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LmhlaWdodFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgwrdcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj5cbiAgICAgICAgICAgICAge3sgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIH19eHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKClcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNUZXh0Q2xhc3MoKVwiPnt7IGxpdmVTdGF0dXMgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgXG4gICAgICAgICAgICBbc2VnbWVudHNdPVwic2VnbWVudHNcIiBcbiAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50Vmlld1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWdtZW50Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwYW5kXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1IDEuMjVIOC43NVYzLjc1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNzQ5OTIgMS4yNUw1LjgzMzI1IDQuMTY2NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4yNSA4Ljc0OTY3TDQuMTY2NjcgNS44MzMwMVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc1IDguNzVIMS4yNVY2LjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGdWxsU2NyZWVuXCIgXG4gICAgICAgICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxTY3JlZW4oKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkV4aXQgZnVsbCBzY3JlZW5cIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNzUgNi4yNUg2LjI1VjguNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNTAwOCA2LjI1TDkuMTY2NzUgOS4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjgzMzI1MiAwLjgzMzAwOEwzLjc0OTkyIDMuNzQ5NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4yNSAzLjc1SDMuNzVWMS4yNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJnLVsjRjNGNEY2XSBjcWEtaC1bY2FsYygxMDAlLTQxcHgpXVwiPlxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICdjcWEtdy1hdXRvJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAnY3FhLXctZnVsbCBjcWEtZmxleC1jb2wnOiAhaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLFxuICAgICAgICAgICAgICAgJ2NxYS1tYXgtaC1mdWxsIGNxYS1oLWZ1bGwnOiBoYXNEZXZpY2VGcmFtZSAmJiAocGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgfHwgIWlzTGl2ZSksXG4gICAgICAgICAgICAgICAnY3FhLW1pbi13LW1heCc6IGhhc0RldmljZUZyYW1lICYmIHBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScsXG4gICAgICAgICAgICAgICAnIWNxYS1oLWZ1bGwgIWNxYS1tYXgtaC1bNTAwcHhdJzogc2hvdWxkQXBwbHlTbWFsbEhlaWdodENsYXNzZXNcbiAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgPGltZyAqbmdJZj1cImhhc0RldmljZUZyYW1lXCJcbiAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtbWF4LWgtZnVsbCBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAnY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCc6IGhhc0RldmljZUZyYW1lLFxuICAgICAgICAgICAgICAgICAnY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmUnOiAhaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtei0yMCc6IGhhc0RldmljZUZyYW1lICYmIHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLFxuICAgICAgICAgICAgICAgICAnY3FhLWJnLXdoaXRlJzogaGFzRGV2aWNlRnJhbWUgJiYgcGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcidcbiAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaGFzRGV2aWNlRnJhbWUgPyBkZXZpY2VTY3JlZW5TdHlsZSA6IHt9XCI+XG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi00XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgZGlhbWV0ZXI9XCI0MFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+e3sgbGl2ZUxvYWRpbmdMYWJlbCB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIExpdmUgQ29udGVudCAod2hlbiBub3QgbG9hZGluZykgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ29udGVudFZpZGVvTG9hZGluZ1wiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxpdmVTdGF0dXMgPT09ICdGYWlsZWQnICYmIGZhaWxlZFN0YXR1c01lc3NhZ2VcIiBjbGFzcz1cImNxYS1wLTYgY3FhLXRleHQtY2VudGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS0zIGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICNDNjM1MzU7IGZvbnQtc2l6ZTogMThweDtcIj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLW0tMFwiPnt7IGZhaWxlZFN0YXR1c01lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctY29udGVudCAqbmdJZj1cImxpdmVTdGF0dXMgIT09ICdGYWlsZWQnIHx8ICFmYWlsZWRTdGF0dXNNZXNzYWdlXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE5vcm1hbCBWaWRlbyBWaWV3ICh3aGVuIG5vdCBsaXZlKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3ZpZGVvJ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sXCJcbiAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICByb2xlPVwicmVnaW9uXCJcbiAgICAgICAgIGFyaWEtbGFiZWw9XCJWaWRlbyBwbGF5YmFja1wiXG4gICAgICAgICAoa2V5ZG93bik9XCJvblZpZGVvS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1tYXgtaC1bY2FsYygxMDAlLTYwcHgpXVwiICpuZ0lmPVwiY3VycmVudFZpZGVvVXJsXCIgW25nQ2xhc3NdPVwieychY3FhLWgtZnVsbCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScsICdjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lfVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWU7IGVsc2UgdmlkZW9Ob0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtZnVsbFwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1pbi13LW1heCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtbWF4LWgtZnVsbCBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogcGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvdmVyIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50VmlkZW9VcmxcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cInZpZGVvL3dlYm1cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0yMCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25WaWRlb01ldGFkYXRhTG9hZGVkKClcIlxuICAgICAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgICAgICAoZW5kZWQpPVwib25WaWRlb0VuZGVkKClcIlxuICAgICAgICAgICAgICAgID48L3ZpZGVvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN2aWRlb05vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgI3ZwbGF5ZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50VmlkZW9VcmxcIlxuICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvblZpZGVvTWV0YWRhdGFMb2FkZWQoKVwiXG4gICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAoZW5kZWQpPVwib25WaWRlb0VuZGVkKClcIlxuICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIWN1cnJlbnRWaWRlb1VybFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNWTkNTZXNzaW9uSW50cnVwcHRlZCAmJiB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZTsgZWxzZSBub1ZpZGVvRGVmYXVsdFwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIHt7IHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1ZpZGVvRGVmYXVsdD5cbiAgICAgICAgICA8c3Bhbj5ObyB2aWRlbyByZWNvcmRpbmcgZm91bmQ8L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMiBjcWEtYmctd2hpdGVcIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjRTVFN0VCO1wiIFtuZ0NsYXNzXT1cInsnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZX1cIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybCAmJiAhaXNMaXZlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW1iLTIgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1ibG9ja1wiPlxuICAgICAgICAgIFZpZGVvIHt7IGN1cnJlbnRWaWRlb0luZGV4ICsgMSB9fSBwbGF5aW5nIG91dCBvZiB7eyB2aWRlb1VybHM/Lmxlbmd0aCB8fCAwIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3NcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRWaWRlb0luZGV4ID09PSAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldlZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlByZXZpb3VzIHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIj5za2lwX3ByZXZpb3VzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDtcIj5cbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICBkaWFtZXRlcj1cIjE2XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiB2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm5leHRWaWRlbygpXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJOZXh0IHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiB2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKX1cIj5za2lwX25leHQ8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmVcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgfHwgMCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XCI+XG4gICAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNwZWVkU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50U3BlZWRcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJCZ0NvbG9yXT1cIicjRjBGMEYxJ1wiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU3BlZWRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgI3RpbWVsaW5lQmFyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLTEgY3FhLWJnLWdyYXktMjAwIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1wb2ludGVyIGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25UaW1lbGluZUNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1hcmtlciBvZiBjdXJyZW50VmlkZW9NYXJrZXJzXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImdldFN0ZXBMZWZ0UG9zaXRpb24obWFya2VyKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInOHB4J1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRHbG9iYWxNYXJrZXJDb2xvcihtYXJrZXIubGV2ZWwpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCInMnB4IHNvbGlkICcgKyBnZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihtYXJrZXIucmVzdWx0KVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3gtc2l6aW5nXT1cIidib3JkZXItYm94J1wiXG4gICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm1hcmtlci50aXRsZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87IHotaW5kZXg6IDUwOyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB0b3A6IDUwJTtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25NYXJrZXJDbGljaygkZXZlbnQsIG1hcmtlcilcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10b3AtMS8yIGNxYS13LTMgY3FhLWgtMyBjcWEtYmctYmx1ZS02MDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLWdyYWIgYWN0aXZlOmNxYS1jdXJzb3ItZ3JhYmJpbmcgY3FhLXNoYWRvdy1tZFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB6LWluZGV4OiA2MDtcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmVcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uZHVyYXRpb24gfHwgMCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3NjcmVlbnNob3RzJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSBzY3JlZW5zaG90Tm9GcmFtZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1heC1oLWZ1bGxcIiBbbmdDbGFzc109XCJ7J2NxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW4nOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1taW4tdy1tYXgnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtbWF4LWgtW2luaGVyaXRdJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWF4LWgtZnVsbCc6IHBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS1iZy13aGl0ZSc6IHBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJTY3JlZW5zaG90XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2NyZWVuc2hvdE5vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgTm8gc2NyZWVuc2hvdCBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICd0cmFjZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1yZWxhdGl2ZVwiICpuZ0lmPVwidHJhY2VWaWV3VXJsXCIgW25nQ2xhc3NdPVwieychY3FhLWgtZnVsbCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNDhweDsgcGFkZGluZy1ib3R0b206IDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgIDxpZnJhbWUgXG4gICAgICAgICAgICBbc3JjXT1cInNhZmVUcmFjZVVybFwiIFxuICAgICAgICAgICAgdGl0bGU9XCJUcmFjZSBWaWV3ZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtbWluLWgtWzI1MHB4XSBjcWEtbWF4LWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNDhweDsgaGVpZ2h0OiBjYWxjKDEwMCUgKyA0OHB4KTtcIlxuICAgICAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGxvYWRpbmc9XCJsYXp5XCJcbiAgICAgICAgICAgIChsb2FkKT1cIm9uVHJhY2VWaWV3ZXJMb2FkKClcIlxuICAgICAgICAgICAgKGVycm9yKT1cIm9uVHJhY2VWaWV3ZXJFcnJvcigpXCI+XG4gICAgICAgICAgPC9pZnJhbWU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyTG9hZGluZ1wiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBMb2FkaW5nIHRyYWNlIHZpZXdlci4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckVycm9yXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIEZhaWxlZCB0byBsb2FkIHRyYWNlIHZpZXdlclxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhdHJhY2VWaWV3VXJsXCI+XG4gICAgICAgIE5vIHRyYWNlIGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+ICBcbiAgPC9kaXY+XG48L2Rpdj4iXX0=
1737
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWtFLFlBQVksRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFbkwsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7Ozs7O0FBbUNuRixNQUFNLE9BQU8sa0JBQWtCO0lBbVY3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFuVnZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdBQVksS0FBSyxDQUFD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TTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBS0gsVUFBVTtzQkFEYixTQUFTO3VCQUFDLFNBQVM7Z0JBZWhCLGNBQWM7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFhdkMsd0JBQXdCO3NCQUQzQixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFtU3JELGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRFbXB0eVN0YXRlUHJlc2V0IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtcHJlc2V0cy5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnU0tJUFBFRCc7XG4gIHRlc3RTdGVwSWQ/OiBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBjaGlsZFN0ZXBzPzogU3RlcE1hcmtlcltdO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFR5cGUgPSAnc2NyZWVuc2hvdHMnIHwgJ3ZpZGVvJyB8ICd0cmFjZSc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn07XG5pbnRlcmZhY2UgRGV2aWNlRnJhbWVDb25maWcge1xuICBtb2NrdXBJbWFnZTogc3RyaW5nO1xuICBzY3JlZW5JbnNldDoge1xuICAgIHRvcDogc3RyaW5nO1xuICAgIHJpZ2h0OiBzdHJpbmc7XG4gICAgYm90dG9tOiBzdHJpbmc7XG4gICAgbGVmdDogc3RyaW5nO1xuICB9O1xuICBib3JkZXJSYWRpdXM6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHZpZGVvVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdmlkZW9VcmxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSB2aWRlb0N1cnJlbnREdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc3RlcE1hcmtlcnM6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzY3JlZW5TaG90VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhY2VWaWV3VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhdGZvcm1OYW1lOiBzdHJpbmcgPSAnV2ViIC0gQ2hyb21lJztcbiAgQElucHV0KCkgcGxhdGZvcm1UeXBlOiAnYnJvd3NlcicgfCAnZGV2aWNlJyA9ICdicm93c2VyJztcbiAgQElucHV0KCkgcGxhdGZvcm06IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBTZWdtZW50VHlwZSA9ICd2aWRlbyc7XG4gIEBJbnB1dCgpIGhpZGVWaWRlb1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBicm93c2VyVmlld1BvcnQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIEBPdXRwdXQoKSB2aWRlb1RpbWVVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGxheSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGF1c2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtYXJrZXJIaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNYXJrZXI+KCk7XG4gIEBPdXRwdXQoKSBpc1ZpZGVvUGxheWluZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwcml2YXRlIF92cGxheWVyPzogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd2cGxheWVyJylcbiAgc2V0IHZwbGF5ZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RpbWVsaW5lQmFyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHRpbWVsaW5lQmFyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3RpbWVsaW5lQmFyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHRpbWVsaW5lQmFyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVCYXI7XG4gIH1cblxuICBwcml2YXRlIF9zcGVlZENvbnRyb2xDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzcGVlZENvbnRyb2xDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNwZWVkQ29udHJvbENvbnRhaW5lclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXIgPSByZWY7XG4gIH1cblxuICBnZXQgc3BlZWRDb250cm9sQ29udGFpbmVyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyO1xuICB9XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNGdWxsU2NyZWVuOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRWaWV3OiBzdHJpbmcgPSAndmlkZW8nO1xuICBjdXJyZW50VmlkZW9JbmRleDogbnVtYmVyID0gMDtcbiAgY3VycmVudFNwZWVkOiBzdHJpbmcgPSAnMXgnO1xuICBpc1NwZWVkQ29udHJvbE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXRlY3RlZFZpZGVvRHVyYXRpb25zOiBudW1iZXJbXSA9IFtdOyAvLyBBY3R1YWwgZHVyYXRpb25zIGRldGVjdGVkIGZyb20gdmlkZW8gbWV0YWRhdGFcbiAgcHJpdmF0ZSB3YXNQbGF5aW5nQmVmb3JlRHJhZzogYm9vbGVhbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB2aWRlbyB3YXMgcGxheWluZyBiZWZvcmUgZHJhZyBzdGFydGVkXG4gIHByaXZhdGUgcGxheVByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgcGxheSBwcm9taXNlXG4gIHByaXZhdGUgaGl0TWFya2VyczogU2V0PG51bWJlcj4gPSBuZXcgU2V0KCk7IC8vIFRyYWNrIHdoaWNoIG1hcmtlcnMgaGF2ZSBiZWVuIGhpdCAoYnkgdGVzdFN0ZXBJZClcblxuICAvLyBTdGF0ZSBtYWNoaW5lIGZvciByb2J1c3QgbWVkaWEgb3BlcmF0aW9uc1xuICBwcml2YXRlIHBsYXllclN0YXRlOiAnaWRsZScgfCAnbG9hZGluZycgfCAncmVhZHknIHwgJ3BsYXlpbmcnIHwgJ3BhdXNlZCcgfCAnc2Vla2luZycgfCAnc3dpdGNoaW5nJyB8ICdlcnJvcicgPSAnaWRsZSc7XG4gIHByaXZhdGUgb3BlcmF0aW9uUXVldWU6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTsgLy8gU2VyaWFsaXplIGFsbCBtZWRpYSBvcGVyYXRpb25zXG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cblxuICBnZXQgaXNBc3BlY3RSYXRpb01hdGNoZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgd2luZG93QXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB2aWV3cG9ydEFyID0gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQud2lkdGggLyB0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC4xNTtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93QXIgLSB2aWV3cG9ydEFyKSAvIHZpZXdwb3J0QXIgPCB0b2xlcmFuY2U7XG4gIH1cblxuICBnZXQgbGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMucGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXNwZWN0UmF0aW9NYXRjaGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWF4KDIwMCwgd2luZG93LmlubmVySGVpZ2h0IC0gMjAwKX1weGAsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIHByaXZhdGUgdmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFNldER1cmF0aW9uOiBudW1iZXIgPSAtMTtcbiAgcHJpdmF0ZSBkcmFnTW91c2VNb3ZlSGFuZGxlcjogKChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdNb3VzZVVwSGFuZGxlcjogKChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmVsb2FkVmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZEFsbFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBcbiAgc2FmZVRyYWNlVXJsOiBTYWZlUmVzb3VyY2VVcmw7XG4gIHRyYWNlVmlld2VyTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICB0cmFjZVZpZXdlckVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGlzQ29ycmVjdERldmljZUZyYW1lQXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1wdHlTdGF0ZUNvbmZpZyA9IGdldEVtcHR5U3RhdGVQcmVzZXQoJ25vdGhpbmdUb0Rpc3BsYXknKTtcbiAgcmVhZG9ubHkgZGV2aWNlRXJyb3JFbXB0eVN0YXRlQ29uZmlnID0ge1xuICAgIC4uLnRoaXMuZW1wdHlTdGF0ZUNvbmZpZyxcbiAgICB0aXRsZTogJ0RldmljZSBOb3QgU3VwcG9ydGVkJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkZXZpY2UgeW91IGFyZSB0cnlpbmcgdG8gdXNlIGlzIG5vdCBzdXBwb3J0ZWQuJyxcbiAgICBhY3Rpb25zOiBbXVxuICB9O1xuXG4gIGdldCBlZmZlY3RpdmVCcm93c2VyVmlld1BvcnQoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB7IHdpZHRoOiAxMjgwLCBoZWlnaHQ6IDcyMCB9O1xuXG4gICAgaWYgKCF0aGlzLmJyb3dzZXJWaWV3UG9ydCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWaWV3cG9ydDtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS53aWR0aCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTnVtYmVyKCh0aGlzLmJyb3dzZXJWaWV3UG9ydCBhcyBhbnkpLmhlaWdodCk7XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh3aWR0aCkgfHwgIU51bWJlci5pc0Zpbml0ZShoZWlnaHQpIHx8IHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VGcmFtZUNvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIERldmljZUZyYW1lQ29uZmlnPiA9IHtcbiAgICAvLyBQaXhlbHNcbiAgICAnUGl4ZWwgNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMiUnLFxuICAgICAgICBsZWZ0OiAnNC41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdQaXhlbCA4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtOC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcyLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTktcHJvLndlYnAnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNCUnLFxuICAgICAgICByaWdodDogJzUlJyxcbiAgICAgICAgYm90dG9tOiAnNCUnLFxuICAgICAgICBsZWZ0OiAnNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnOCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgMTAnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC0xMC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gaVBob25lc1xuICAgICdpUGhvbmUgMTEnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTEucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzMlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMyUnLFxuICAgICAgICBsZWZ0OiAnNy41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTMnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTMucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2FwcGxlLWlwaG9uZS0xNS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMS41JScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnNC41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgWFInOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUteHIucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzMuNSUnLFxuICAgICAgICByaWdodDogJzcuNSUnLFxuICAgICAgICBib3R0b206ICczLjUlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDE2IFBybyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi1wcm8ucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzAuNSUnLFxuICAgICAgICByaWdodDogJzEuNSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzEuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnOCUnXG4gICAgfSxcbiAgICAnaVBob25lIDE2Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE2LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICczJScsXG4gICAgICAgIGJvdHRvbTogJzAuNSUnLFxuICAgICAgICBsZWZ0OiAnMyUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNiUnXG4gICAgfSxcbiAgICAnaVBob25lIDE3IFBybyBNYXgnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTctcHJvLW1heC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnOCUnXG4gICAgfSxcbiAgICAnaVBob25lIDE3Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxJScsXG4gICAgICAgIHJpZ2h0OiAnMi41JScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNSUnXG4gICAgfSxcbiAgICAvLyBHYWxheHkgXG4gICAgJ0dhbGF4eSBTMjAgRkUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9zYW1zdW5nLWdhbGF4eS1zMjAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMS41JScsXG4gICAgICAgIHJpZ2h0OiAnMiUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBTMjUgVWx0cmEnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9nYWxheHktczI1LXVsdHJhLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxJScsXG4gICAgICAgIGJvdHRvbTogJzAuNSUnLFxuICAgICAgICBsZWZ0OiAnMSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMyUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFRhYiBBOSsnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9nYWxheHktdGFiLWE5LXBsdXMucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICczJScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzElJ1xuICAgIH0sXG4gICAgLy8gQnJvd3NlclxuICAgIGJyb3dzZXI6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2Jyb3dzZXItbW9ja3VwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICc2JScsXG4gICAgICAgIHJpZ2h0OiAnMCUnLFxuICAgICAgICBib3R0b206ICcwJScsXG4gICAgICAgIGxlZnQ6ICcwJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcwJSdcbiAgICB9XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRldmljZUZyYW1lQ29uZmlnKCk6IERldmljZUZyYW1lQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGRldmljZU5hbWUgYW5kIGl0cyBmcmFtZSBpcyBhdmFpbGFibGUsIHJldHVybiBpdFxuICAgICAgaWYgKHRoaXMuZGV2aWNlTmFtZSAmJiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1t0aGlzLmRldmljZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1t0aGlzLmRldmljZU5hbWVdO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBubyBkZXZpY2VOYW1lIG9yIGRldmljZU5hbWUncyBmcmFtZSBub3QgYXZhaWxhYmxlLCB1c2UgZGVmYXVsdHMgYmFzZWQgb24gcGxhdGZvcm1cbiAgICAgIC8vIGlmICh0aGlzLnBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICAgIC8vICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzWydQaXhlbCA5J10gfHwgbnVsbDtcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmICh0aGlzLnBsYXRmb3JtID09PSAnaW9zJykge1xuICAgICAgLy8gICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZ3NbJ2lQaG9uZSAxNSddIHx8IG51bGw7XG4gICAgICAvLyB9XG4gICAgICBcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IGRldmljZU1vY2t1cEltYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWcgPyB0aGlzLmRldmljZUZyYW1lQ29uZmlnLm1vY2t1cEltYWdlIDogJyc7XG4gIH1cblxuICBnZXQgZGV2aWNlU2NyZWVuU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZztcbiAgICBpZiAoIWNmZykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogY2ZnLnNjcmVlbkluc2V0LnRvcCxcbiAgICAgIHJpZ2h0OiBjZmcuc2NyZWVuSW5zZXQucmlnaHQsXG4gICAgICBib3R0b206IGNmZy5zY3JlZW5JbnNldC5ib3R0b20sXG4gICAgICBsZWZ0OiBjZmcuc2NyZWVuSW5zZXQubGVmdCxcbiAgICAgICdib3JkZXItcmFkaXVzJzogY2ZnLmJvcmRlclJhZGl1cyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuc2VsZWN0ZWRWaWV3O1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnVwZGF0ZVNhZmVUcmFjZVVybCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2aWRlb1VybHMnXSkge1xuICAgICAgY29uc3QgYXJyID0gY2hhbmdlc1sndmlkZW9VcmxzJ10uY3VycmVudFZhbHVlIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyciAmJiBhcnIubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhhcnIpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlUHJlbG9hZEFsbFNlZ21lbnRzKGFycik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddICYmICFjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBuZXdEdXJhdGlvbiA9IGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gSWdub3JlIHNlbnRpbmVsIHZhbHVlICgtMSkgdXNlZCB0byBmb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICBpZiAobmV3RHVyYXRpb24gPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gbmdPbkNoYW5nZXMgdmlkZW9DdXJyZW50RHVyYXRpb246IHBhdXNlZCB2aWRlbyBiZWZvcmUgc2Vla2luZycpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgICBjb25zdCB0YXJnZXRWaWRlb0luZGV4ID0gdGhpcy5maW5kVmlkZW9JbmRleEZvclRpbWVzdGFtcChuZXdEdXJhdGlvbik7XG4gICAgICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBuZXdEdXJhdGlvbiAtIHRhcmdldEJvdW5kYXJ5LnN0YXJ0O1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG5lZWRzU3dpdGNoID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCAhPT0gdGFyZ2V0VmlkZW9JbmRleDtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmlkZW9UaW1lTXMgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5jdXJyZW50VGltZSAqIDEwMDA7XG4gICAgICAgICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKHJlbGF0aXZlVGltZXN0YW1wIC0gY3VycmVudFZpZGVvVGltZU1zKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5lZWRzU3dpdGNoIHx8IG5ld0R1cmF0aW9uICE9PSB0aGlzLmxhc3RTZXREdXJhdGlvbiB8fCB0aW1lRGlmZmVyZW5jZSA+IDEwMCkge1xuICAgICAgICAgICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5lZWRzU3dpdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKG5ld0R1cmF0aW9uIC0gY3VycmVudFZpZGVvVGltZU1zKTtcbiAgICAgICAgICBpZiAobmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlZWtUb1RpbWUobmV3RHVyYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndHJhY2VWaWV3VXJsJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsICYmIHRoaXMuY3VycmVudFZpZXcgPT09ICd0cmFjZScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuaGlkZVZpZGVvVGFiID8gJ3NjcmVlbnNob3RzJyA6ICd2aWRlbyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoaWRlVmlkZW9UYWInXSkge1xuICAgICAgdGhpcy51cGRhdGVTZWdtZW50cygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRWaWV3J10pIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gbmdPbkRlc3Ryb3k6IGNsZWFuZWQgdXAgbGlzdGVuZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VlayB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHNlZWtUb1RpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqIFRoaXMgcHJldmVudHMgcGlwZWxpbmUgcmVhZCBlcnJvcnMgZHVyaW5nIHJhcGlkIHNlZWsgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZWVrVG9UaW1lSW50ZXJuYWwobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF2aWRlby5kdXJhdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgY29uc3QgdGFyZ2V0VGltZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlY29uZHMsIHZpZGVvLmR1cmF0aW9uKSk7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc2Vla1RvVGltZUludGVybmFsOiBzZWVraW5nJywge1xuICAgICAgbWlsbGlzZWNvbmRzLFxuICAgICAgdGFyZ2V0VGltZSxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWVCZWZvcmU6IHZpZGVvLmN1cnJlbnRUaW1lXG4gICAgfSk7XG4gICAgXG4gICAgLy8gU2V0IHNlZWtpbmcgc3RhdGVcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3NlZWtpbmcnO1xuXG4gICAgLy8gQ1JJVElDQUw6IFBhdXNlIGJlZm9yZSBzZWVraW5nIHRvIGF2b2lkIHBpcGVsaW5lIGVycm9yc1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIC8vIFBlcmZvcm0gc2Vla1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdGFyZ2V0VGltZTtcbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IG1pbGxpc2Vjb25kcztcbiAgICBcbiAgICAvLyBXYWl0IGJyaWVmbHkgZm9yIHNlZWsgdG8gY29tcGxldGUgKHByZXZlbnRzIHJhcGlkIHNlZWsgaXNzdWVzKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpO1xuXG4gICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzICgwLTEwMCUgb2YgY3VycmVudCB2aWRlbylcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMCAvIGR1cmF0aW9uTXMpICogMTAwKSk7XG4gICAgfVxuICAgIGNvbnN0IHNlZ21lbnRTdGFydCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApO1xuICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoc2VnbWVudFN0YXJ0ICsgdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICBcbiAgICAvLyBTZXQgdG8gcGF1c2VkIHN0YXRlICh1c2VyIG11c3QgZXhwbGljaXRseSBwbGF5KVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWsgY29tcGxldGUnLCB7XG4gICAgICBjdXJyZW50VGltZUFmdGVyOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBvblZpZGVvS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgIT09ICcgJyAmJiBldmVudC5jb2RlICE9PSAnU3BhY2UnKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9VcmwpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgcGxheS9wYXVzZSAobm93IHRyaXZpYWwgd2l0aCBzdGF0ZSBtYWNoaW5lKVxuICAgKi9cbiAgdG9nZ2xlUGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiB2aWRlbyBlbGVtZW50IG5vdCBmb3VuZCcsIHtcbiAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW5cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciB2YWxpZCBzb3VyY2VcbiAgICBpZiAoIXRoaXMuY3VycmVudFZpZGVvVXJsIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gSFRNTE1lZGlhRWxlbWVudC5ORVRXT1JLX05PX1NPVVJDRSB8fCB2aWRlby5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogbm8gdmFsaWQgc291cmNlJywge1xuICAgICAgICBjdXJyZW50VmlkZW9Vcmw6IHRoaXMuY3VycmVudFZpZGVvVXJsLFxuICAgICAgICBuZXR3b3JrU3RhdGU6IHZpZGVvLm5ldHdvcmtTdGF0ZSxcbiAgICAgICAgZXJyb3I6IHZpZGVvLmVycm9yXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWNvdmVyIGZyb20gc3R1Y2sgJ2xvYWRpbmcnIHN0YXRlIHdoZW4gdmlkZW8gaXMgYWN0dWFsbHkgcmVhZHkgKGUuZy4gYWZ0ZXIganVtcC10by1zZWdtZW50KVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycgJiYgdmlkZW8ucmVhZHlTdGF0ZSA+PSBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB9XG5cbiAgICAvLyBEb24ndCBhbGxvdyBwbGF5IGR1cmluZyBlcnJvciBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHBsYXllciBpbiBlcnJvciBzdGF0ZScsIHsgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZSB9KTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuXG4gICAgLy8gSWYgc3RpbGwgbG9hZGluZyBhbmQgdmlkZW8gbm90IHJlYWR5LCB3YWl0IGFuZCByZXRyeVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIG5vdCByZWFkeScsIHtcbiAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSAmJiB0aGlzLnBsYXllclN0YXRlICE9PSAncGxheWluZycpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OicsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZyxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFNpbXBsZSB0b2dnbGUgYmFzZWQgb24gc3RhdGVcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGxheVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBlbGltaW5hdGVzIEZGbXBlZ0RlbXV4ZXIgZXJyb3JzIGFuZCBwbGF5IHByb21pc2UgaW50ZXJydXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwbGF5VmlkZW9JbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IHBsYXlpbmcgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBsYXlpbmcsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBzdGFydGluZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCBmb3IgdmlkZW8gdG8gYmUgcmVhZHkgaWYgbmVlZGVkXG4gICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogd2FpdGluZyBmb3IgbWV0YWRhdGEnKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbyBtZXRhZGF0YScpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgaGl0IG1hcmtlcnMgaWYgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmdcbiAgICBjb25zdCBjdXJyZW50VGltZU1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuICAgIGlmIChjdXJyZW50VGltZU1zIDwgMTAwKSB7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdGUgdG8gbG9hZGluZ1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGJlZm9yZSBwbGF5aW5nXG4gICAgICBjb25zdCBjdXJyZW50VmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWN1cnJlbnRWaWRlbyB8fCBjdXJyZW50VmlkZW8gIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBvciB1bmF2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF3YWl0IHBsYXkgcHJvbWlzZSAtIHRoaXMgaXMgY3JpdGljYWxcbiAgICAgIGF3YWl0IHZpZGVvLnBsYXkoKTtcbiAgICAgIFxuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHBsYXkgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgY29uc3QgdmlkZW9BZnRlclBsYXkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJQbGF5IHx8IHZpZGVvQWZ0ZXJQbGF5ICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIHBsYXknKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQbGF5IHN1Y2NlZWRlZFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHBsYXlpbmcgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICB9KTtcbiAgICAgICAgXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nICYmIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIHYuY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBQbGF5IGZhaWxlZFxuICAgICAgLy8gQ2hlY2sgaWYgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJFcnJvciA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlckVycm9yIHx8IHZpZGVvQWZ0ZXJFcnJvciAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBlcnJvcicpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhYm9ydGVkIChleHBlY3RlZCBkdXJpbmcgcGF1c2UpJyk7XG4gICAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQsIHJlc2V0IHRvIHBhdXNlZCBzdGF0ZSBpbnN0ZWFkIG9mIGVycm9yXG4gICAgICAgIGlmICh2aWRlb0FmdGVyRXJyb3IgJiYgdmlkZW9BZnRlckVycm9yID09PSB2aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBhdXNlVmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXVzZVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgLy8gQWxyZWFkeSBwYXVzZWQgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBhdXNlZCwgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzaW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcblxuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBtZWRpYSBvcGVyYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyB0aGUgQ1JJVElDQUwgZml4IGZvciBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICogQWxsIG1lZGlhIG9wZXJhdGlvbnMgKHBsYXksIHBhdXNlLCBzZWVrLCBzd2l0Y2gpIGdvIHRocm91Z2ggdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgPSB0aGlzLm9wZXJhdGlvblF1ZXVlXG4gICAgICAudGhlbigoKSA9PiBvcGVyYXRpb24oKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBNZWRpYSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgaGFzTXVsdGlwbGVWaWRlb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIFttc10uIHNlZ21lbnRCb3VuZGFyaWVzW2ldID0gc3VtIG9mIGR1cmF0aW9ucyBbMC4uaV0gKi9cbiAgZ2V0IHNlZ21lbnRCb3VuZGFyaWVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRhcmllczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgZHVyYXRpb25zKSB7XG4gICAgICBzdW0gKz0gZDtcbiAgICAgIGJvdW5kYXJpZXMucHVzaChzdW0pO1xuICAgIH1cbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKiBUb3RhbCBkdXJhdGlvbiBhY3Jvc3MgYWxsIHNlZ21lbnRzIGluIG1zICovXG4gIGdldCB0b3RhbER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG4gIC8qKiBWaWRlbyBkdXJhdGlvbnMgaW4gbXMgKGRldGVjdGVkIG9yIGZyb20gc2luZ2xlIHZpZGVvIGVsZW1lbnQpICovXG4gIHByaXZhdGUgZ2V0IHZpZGVvRHVyYXRpb25zKCk6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucztcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvPy5kdXJhdGlvbiAmJiBpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHtcbiAgICAgIHJldHVybiBbdmlkZW8uZHVyYXRpb24gKiAxMDAwXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRWaWRlb01hcmtlcnMoKTogU3RlcE1hcmtlcltdIHtcbiAgICBsZXQgbWFya2Vyc1RvUHJvY2VzczogU3RlcE1hcmtlcltdO1xuICAgIFxuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLmdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk7XG4gICAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPT09IDAgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSBib3VuZGFyaWVzLmxlbmd0aCkge1xuICAgICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2VycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgICAgIFxuICAgICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2Vyc1xuICAgICAgICAgIC5maWx0ZXIobWFya2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uID49IGN1cnJlbnRCb3VuZGFyeS5zdGFydCAmJiBcbiAgICAgICAgICAgICAgICAgICBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgY3VycmVudEJvdW5kYXJ5LmVuZDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAobWFya2VyID0+IHRoaXMuYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKFxuICAgICAgICAgICAgbWFya2VyLCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5zdGFydCwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuc3RhcnQsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LmVuZFxuICAgICAgICAgICkpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5mbGF0dGVuTWFya2VycyhtYXJrZXJzVG9Qcm9jZXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKG1hcmtlcjogU3RlcE1hcmtlciwgYWRqdXN0bWVudDogbnVtYmVyLCB2aWRlb1N0YXJ0OiBudW1iZXIsIHZpZGVvRW5kOiBudW1iZXIpOiBTdGVwTWFya2VyIHtcbiAgICBjb25zdCBhZGp1c3RlZE1hcmtlcjogU3RlcE1hcmtlciA9IHtcbiAgICAgIC4uLm1hcmtlcixcbiAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiAtIGFkanVzdG1lbnRcbiAgICB9O1xuICAgIFxuICAgIGlmIChtYXJrZXIuY2hpbGRTdGVwcyAmJiBtYXJrZXIuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhZGp1c3RlZE1hcmtlci5jaGlsZFN0ZXBzID0gbWFya2VyLmNoaWxkU3RlcHNcbiAgICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPj0gdmlkZW9TdGFydCAmJiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPCB2aWRlb0VuZClcbiAgICAgICAgLm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgY29uc3QgYWRqdXN0ZWRDaGlsZDogU3RlcE1hcmtlciA9IHtcbiAgICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgICAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gLSBhZGp1c3RtZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRTdGVwcyAmJiBjaGlsZC5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFkanVzdGVkQ2hpbGQuY2hpbGRTdGVwcyA9IGNoaWxkLmNoaWxkU3RlcHNcbiAgICAgICAgICAgICAgLmZpbHRlcihuZXN0ZWRDaGlsZCA9PiBuZXN0ZWRDaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPj0gdmlkZW9TdGFydCAmJiBuZXN0ZWRDaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPCB2aWRlb0VuZClcbiAgICAgICAgICAgICAgLm1hcChuZXN0ZWRDaGlsZCA9PiB0aGlzLmFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihuZXN0ZWRDaGlsZCwgYWRqdXN0bWVudCwgdmlkZW9TdGFydCwgdmlkZW9FbmQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFkanVzdGVkQ2hpbGQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWRqdXN0ZWRNYXJrZXI7XG4gIH1cblxuICBnZXRTdGVwTGVmdFBvc2l0aW9uKHN0ZXA6IFN0ZXBNYXJrZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm4gMDtcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIHJldHVybiAoc3RlcC5jdW11bGF0aXZlRHVyYXRpb24gLyBkdXJhdGlvbk1zKSAqIDEwMDtcbiAgfVxuXG4gIGdldFN0ZXBDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5sZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjNjM2NkYxJztcbiAgfVxuXG4gIGdldFN0ZXBSZXN1bHRDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihzdGVwLnJlc3VsdCk7XG4gIH1cblxuICBnZXRHbG9iYWxNYXJrZXJDb2xvcihsZXZlbD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxldmVsID09PSAxID8gJyMwMDAwMDAnIDogJyNGRkE1MDAnO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IocmVzdWx0OiBTdGVwTWFya2VyWydyZXN1bHQnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgIGNhc2UgJ1NVQ0NFU1MnOlxuICAgICAgICByZXR1cm4gJyMxMkI3NkEnO1xuICAgICAgY2FzZSAnRkFJTFVSRSc6XG4gICAgICAgIHJldHVybiAnI0I5MUMxQyc7XG4gICAgICBjYXNlICdBQk9SVEVEJzpcbiAgICAgICAgcmV0dXJuICcjRjc5MDA5JztcbiAgICAgIGNhc2UgJ1NLSVBQRUQnOlxuICAgICAgICByZXR1cm4gJyM2NjcwODUnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcjNjM2NkYxJztcbiAgICB9XG4gIH1cblxuICBvbk1hcmtlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBtYXJrZXI6IFN0ZXBNYXJrZXIpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbjtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChtYXJrZXIudGVzdFN0ZXBJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5hZGQobWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICB0aGlzLm1hcmtlckhpdC5lbWl0KG1hcmtlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMuY3VycmVudFZpZGVvSW5kZXgsIDApLCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0aGlzLnZpZGVvVXJsc1tpZHhdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWRlb1VybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcmVzZXRWaWRlb1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogcmVzZXR0aW5nJyk7XG5cbiAgICB2aWRlby5wYXVzZSgpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gLTE7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogY29tcGxldGUnKTtcbiAgfVxuXG4gIHByZXZWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDEpKTtcbiAgICB9XG4gIH1cblxuICBvblRpbWVsaW5lQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQgfHwgIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpY2tYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgY2xpY2tYIC8gcmVjdC53aWR0aCkpO1xuXG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gcGVyY2VudCAqIHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25UaW1lbGluZUNsaWNrJywge1xuICAgICAgcGVyY2VudCxcbiAgICAgIHRhcmdldFRpbWVNcyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmdcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhcnREcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICBcbiAgICAvLyBDUklUSUNBTDogQ2FwdHVyZSBwbGF5aW5nIHN0YXRlIEJFRk9SRSBwYXVzaW5nXG4gICAgLy8gVXNlIGJvdGggaXNQbGF5aW5nIGZsYWcgYW5kIHBsYXllclN0YXRlIGZvciByZWxpYWJpbGl0eVxuICAgIHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWcgPSB0aGlzLmlzUGxheWluZyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZyc7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0YXJ0RHJhZycsIHtcbiAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmcsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZ1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFBhdXNlIHZpZGVvIGR1cmluZyBkcmFnIHRvIGF2b2lkIGNvbmZsaWN0c1xuICAgIGlmICh0aGlzLmlzUGxheWluZyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmFkZERyYWdMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIG9uRHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZyB8fCAhdGhpcy50aW1lbGluZUJhcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGltZWxpbmVCYXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oeCAvIHJlY3Qud2lkdGgsIDEpKTtcbiAgICB0aGlzLnByb2dyZXNzID0gcGVyY2VudCAqIDEwMDsgLy8gR2xvYmFsIHRpbWVsaW5lIHBvc2l0aW9uXG4gIH1cblxuICBzdG9wRHJhZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcbiAgICBcbiAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZztcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IGRyYWcgZW5kZWQnLCB7XG4gICAgICBwcm9ncmVzczogdGhpcy5wcm9ncmVzcyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZzogc2hvdWxkUmVzdW1lUGxheWluZyxcbiAgICAgIGN1cnJlbnRQbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbyB8fCAhdmlkZW8uZHVyYXRpb24gfHwgIWlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gKHRoaXMucHJvZ3Jlc3MgLyAxMDApICogdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuXG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgc2VlaycsIHtcbiAgICAgICAgICB0YXJnZXRUaW1lTXMsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBXYWl0IGEgYml0IGxvbmdlciB0byBlbnN1cmUgc2VlayBpcyBmdWxseSBjb21wbGV0ZVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgIFxuICAgICAgICAvLyBWZXJpZnkgc3RhdGUgaXMgJ3BhdXNlZCcgYWZ0ZXIgc2VlayAoc2Vla1RvVGltZUludGVybmFsIHNldHMgaXQgdG8gJ3BhdXNlZCcpXG4gICAgICAgIC8vIElmIHN0YXRlIGlzIHN0aWxsICdzZWVraW5nJywgd2FpdCBhIGJpdCBtb3JlXG4gICAgICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnc2Vla2luZycpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHNlZWsgc3RpbGwgaW4gcHJvZ3Jlc3MsIHdhaXRpbmcgbW9yZScpO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTm93IHJlc3VtZSBwbGF5YmFjayAoc3RhdGUgc2hvdWxkIGJlICdwYXVzZWQnIGF0IHRoaXMgcG9pbnQpXG4gICAgICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGF1c2VkJykge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHBsYXliYWNrIHJlc3VtZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICAgICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogdW5leHBlY3RlZCBzdGF0ZSBhZnRlciBzZWVrLCBhdHRlbXB0aW5nIHRvIHJlc3VtZSBhbnl3YXknLCB7XG4gICAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFRyeSB0byByZXN1bWUgYW55d2F5IC0gYmV0dGVyIHRvIHRyeSB0aGFuIHRvIGxlYXZlIGl0IHN0dWNrXG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHZpZGVvIHdhcyBwYXVzZWQsIG5vdCByZXN1bWluZycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuXG4gICAgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm9uRHJhZyhlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BEcmFnKCk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURyYWdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICAgICAgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb01ldGFkYXRhTG9hZGVkJyk7XG4gICAgLy8gRW5zdXJlIHBsYXliYWNrIHNwZWVkIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCB2aWRlb3NcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgfVxuICBcbiAgb25WaWRlb0NhblBsYXkoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9DYW5QbGF5Jyk7XG4gICAgLy8gRW5zdXJlIHBsYXliYWNrIHNwZWVkIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCB2aWRlb3NcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIG9uVmlkZW9FbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgLy8gU3dpdGNoIHRvIG5leHQgdmlkZW8gYW5kIGF1dG8tcGxheSBpdFxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMTtcblxuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChuZXh0SW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5jdXJyZW50VmlkZW9VcmwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgMTAwKSByZXR1cm47XG5cbiAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcbiAgICAgICAgY29uc3QgY3VycmVudE1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuXG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZyAmJiB0aGlzLnBsYXllclN0YXRlICE9PSAnc3dpdGNoaW5nJykge1xuICAgICAgICAgIC8vIFBlci12aWRlbyBwcm9ncmVzcyAoMC0xMDAlIG9mIGN1cnJlbnQgdmlkZW8pXG4gICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICAgICAgICBpZiAoZHVyYXRpb25NcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIChjdXJyZW50TXMgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbWl0IGN1bXVsYXRpdmUgdGltZSBmb3IgcGFyZW50IChzdGVwIGhpZ2hsaWdodGluZylcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCArIGN1cnJlbnRNcyk7XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIHRoaXMubWF5YmVQcmVsb2FkTmV4dFNlZ21lbnQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZXIpO1xuXG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGFcbiAgICogVGhpcyBjcmVhdGVzIHRlbXBvcmFyeSB2aWRlbyBlbGVtZW50cyB0byByZWFkIGR1cmF0aW9uIHdpdGhvdXQgcGxheWluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RWaWRlb0R1cmF0aW9ucyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgZGV0ZWN0ZWQgZHVyYXRpb25zXG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgbGV0IGxvYWRlZENvdW50ID0gMDtcblxuICAgIHZpZGVvVXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0ZW1wVmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgdGVtcFZpZGVvLnByZWxvYWQgPSAnbWV0YWRhdGEnO1xuICAgICAgXG4gICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gdGVtcFZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zW2luZGV4XSA9IGR1cmF0aW9uTXM7XG4gICAgICAgIGxvYWRlZENvdW50Kys7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhbiB1cFxuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHRlbXBWaWRlby5zcmMgPSAnJztcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZSgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxvYWRlZENvdW50ID09PSB2aWRlb1VybHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIEFsbCB2aWRlbyBkdXJhdGlvbnMgZGV0ZWN0ZWQ6JywgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2ltdWxhdG9yXSBGYWlsZWQgdG8gbG9hZCBtZXRhZGF0YSBmb3IgdmlkZW8gJHtpbmRleCArIDF9YCk7XG4gICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSAwO1xuICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHRlbXBWaWRlby5zcmMgPSAnJztcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZSgpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBnZXRTdGF0dXNCYWRnZUNsYXNzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSAnY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtcm91bmRlZC1bNnB4XSBjcWEtaC1bMjFweF0nO1xuICAgIHN3aXRjaCAodGhpcy5saXZlU3RhdHVzKSB7XG4gICAgICBjYXNlICdJbiBQcm9ncmVzcyc6XG4gICAgICBjYXNlICdFeGVjdXRpb24nOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0UwRjJGRV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjN0REM0ZDXWA7XG4gICAgICBjYXNlICdQYXVzZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZFRjNDN10gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkNEMzREXWA7XG4gICAgICBjYXNlICdBYm9ydGVkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUUyRTJdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDQTVBNV1gO1xuICAgICAgY2FzZSAnRmFpbGVkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0Y5QkZCRl1gO1xuICAgICAgY2FzZSAnUGFzc2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNEMUZBRTVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzZFRTdCN11gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctZ3JheS0yMDAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWdyYXktMzAwYDtcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0dXNUZXh0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDI4NEM3XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjRDk3NzA2XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzA1OTY2OV0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTYwMCBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwcm9jZXNzZWRUcmFjZVVybCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwpIHJldHVybiAnJztcbiAgICBcbiAgICBpZiAodGhpcy50cmFjZVZpZXdVcmwuZW5kc1dpdGgoJy56aXAnKSkge1xuICAgICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIHRyYWNlOiB0aGlzLnRyYWNlVmlld1VybCxcbiAgICAgICAgaGlkZUhlYWRlcjogJ3RydWUnLFxuICAgICAgICBoaWRlQnJhbmRpbmc6ICd0cnVlJyxcbiAgICAgICAgZW1iZWQ6ICd0cnVlJyxcbiAgICAgICAgbWluaW1hbDogJ3RydWUnLFxuICAgICAgICBub0hlYWRlcjogJ3RydWUnXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGBodHRwczovL3RyYWNlLnBsYXl3cmlnaHQuZGV2Lz8ke3VybFBhcmFtcy50b1N0cmluZygpfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzLnRyYWNlVmlld1VybDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2FmZVRyYWNlVXJsKCk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMucHJvY2Vzc2VkVHJhY2VVcmw7XG4gICAgaWYgKHVybCkge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gICAgICB0aGlzLnNhZmVUcmFjZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gICAgICB0aGlzLnNhZmVUcmFjZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgnJyk7XG4gICAgfVxuICB9XG5cbiAgb25UcmFjZVZpZXdlckxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJFcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IHRydWU7XG4gIH1cblxuICBvblNwZWVkQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTcGVlZCA9IHZhbHVlO1xuICAgIC8vIFdoZW5ldmVyIHNwZWVkIGNoYW5nZXMsIGFwcGx5IGl0IHRvIHRoZSBjdXJyZW50IHZpZGVvXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlU3BlZWRDb250cm9sKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gIXRoaXMuaXNTcGVlZENvbnRyb2xPcGVuO1xuICAgIGlmICh0aGlzLmlzU3BlZWRDb250cm9sT3Blbikge1xuICAgICAgdGhpcy5hZGRTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldCAmJiB0aGlzLnNwZWVkQ29udHJvbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCAmJiBcbiAgICAgICAgICAgICF0aGlzLnNwZWVkQ29udHJvbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcik7XG4gICAgICB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VnbWVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgYmFzZVNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgICB7IGxhYmVsOiAnU2NyZWVuc2hvdHMnLCB2YWx1ZTogJ3NjcmVlbnNob3RzJywgaWNvbjogJ3Bob3RvJyAgfSxcbiAgICBdO1xuICAgIFxuICAgIC8vIE9ubHkgYWRkIFZpZGVvIHRhYiBpZiBoaWRlVmlkZW9UYWIgaXMgZmFsc2VcbiAgICBpZiAoIXRoaXMuaGlkZVZpZGVvVGFiKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVmlkZW8nLCB2YWx1ZTogJ3ZpZGVvJywgaWNvbjogJ3ZpZGVvY2FtJyB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVHJhY2UnLCB2YWx1ZTogJ3RyYWNlJywgaWNvbjogJ2dyYXBoaWNfZXEnIH0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlZ21lbnRzID0gYmFzZVNlZ21lbnRzO1xuICAgIFxuICAgIC8vIElmIGN1cnJlbnQgdmlldyBpcyAndmlkZW8nIGFuZCB2aWRlbyB0YWIgaXMgaGlkZGVuLCBzd2l0Y2ggdG8gc2NyZWVuc2hvdHNcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3ZpZGVvJyAmJiB0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdzY3JlZW5zaG90cyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblZpZGVvRWxlbWVudFJlYWR5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy5fdnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb0VsZW1lbnRSZWFkeTogdmlkZW8gZWxlbWVudCByZWFkeScsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IGVycm9yL2xvYWRpbmcgc3RhdGVzIHdoZW4gdmlkZW8gZWxlbWVudCBpcyByZWNyZWF0ZWQgKGUuZy4sIGR1cmluZyBmdWxsc2NyZWVuIHRvZ2dsZSlcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgZXJyb3IvbG9hZGluZyBzdGF0ZScpO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIHdoZW4gdGhlIHZpZGVvIGVsZW1lbnQgaXMgZmlyc3QgcmVhZHlcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuXG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc3QgbnVtZXJpYyA9IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50U3BlZWQucmVwbGFjZSgneCcsICcnKSk7XG4gICAgY29uc3QgcmF0ZSA9ICFpc05hTihudW1lcmljKSAmJiBudW1lcmljID4gMCA/IG51bWVyaWMgOiAxO1xuICAgIHZpZGVvLnBsYXliYWNrUmF0ZSA9IHJhdGU7XG4gIH1cblxuICBwcml2YXRlIGZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXA6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZpbmQgd2hpY2ggdmlkZW8gY29udGFpbnMgdGhpcyB0aW1lc3RhbXBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvdW5kYXJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJvdW5kYXJ5ID0gYm91bmRhcmllc1tpXTtcbiAgICAgIGlmIChjdW11bGF0aXZlVGltZXN0YW1wID49IGJvdW5kYXJ5LnN0YXJ0ICYmIGN1bXVsYXRpdmVUaW1lc3RhbXAgPCBib3VuZGFyeS5lbmQpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGltZXN0YW1wIGlzIGV4YWN0bHkgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCB2aWRlbywgcmV0dXJuIHRoZSBsYXN0IHZpZGVvIGluZGV4XG4gICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdEJvdW5kYXJ5ID0gYm91bmRhcmllc1tib3VuZGFyaWVzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPT09IGxhc3RCb3VuZGFyeS5lbmQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kYXJpZXMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGFyZ2V0VmlkZW9JbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGFyZ2V0VmlkZW9JbmRleCA8IDAgfHwgdGFyZ2V0VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICB2aWRlby5jdXJyZW50VGltZSA9IDA7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IC0xO1xuXG4gICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0YXJnZXRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RhcmdldFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoc2VnbWVudFN0YXJ0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRSZXNldCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzd2l0Y2hUb1ZpZGVvQW5kU2VlayhjdW11bGF0aXZlVGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICBjb25zdCBzZWVrU2Vjb25kcyA9IHJlbGF0aXZlVGltZXN0YW1wIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2Vjb25kcywgdmlkZW8uZHVyYXRpb24gfHwgc2Vla1NlY29uZHMpKTtcbiAgICAgIFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qgb25TZWVrZWQgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCIgICBbbmdTdHlsZV09XCJ7XG4gIHBvc2l0aW9uOiBpc0Z1bGxTY3JlZW4gPyAnZml4ZWQnIDogbnVsbCxcbiAgaW5zZXQ6IGlzRnVsbFNjcmVlbiA/ICcxcmVtJyA6IG51bGwsXG4gIHpJbmRleDogaXNGdWxsU2NyZWVuID8gJzUwJyA6IG51bGwsXG4gIGJveFNoYWRvdzogaXNGdWxsU2NyZWVuID8gJzBweCAxM3B4IDI1cHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjI1KScgOiBudWxsLFxuICBib3JkZXJSYWRpdXM6IGlzRnVsbFNjcmVlbiA/ICcuNXJlbScgOiBudWxsLFxuICBib3JkZXI6IGlzRnVsbFNjcmVlbiA/ICcxcHggc29saWQgI0U1RTdFQicgOiBudWxsLFxuICB3aWR0aDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6IG51bGwsXG4gIGhlaWdodDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6ICcxMDAlJyxcbiAgb3ZlcmZsb3c6IGlzRnVsbFNjcmVlbiA/ICdoaWRkZW4nIDogbnVsbFxufVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyNGRkZGRkZdXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtib3gtc2hhZG93OiAwcHggMXB4IDJweCAwcHggIzAwMDAwMDBEO1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1NjcmVlbiBzaXplOiAnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoICsgJ3gnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LmhlaWdodFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgwrdcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj5cbiAgICAgICAgICAgICAge3sgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIH19eHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKClcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNUZXh0Q2xhc3MoKVwiPnt7IGxpdmVTdGF0dXMgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgXG4gICAgICAgICAgICBbc2VnbWVudHNdPVwic2VnbWVudHNcIiBcbiAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50Vmlld1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWdtZW50Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwYW5kXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1IDEuMjVIOC43NVYzLjc1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNzQ5OTIgMS4yNUw1LjgzMzI1IDQuMTY2NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4yNSA4Ljc0OTY3TDQuMTY2NjcgNS44MzMwMVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc1IDguNzVIMS4yNVY2LjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGdWxsU2NyZWVuXCIgXG4gICAgICAgICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxTY3JlZW4oKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkV4aXQgZnVsbCBzY3JlZW5cIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNzUgNi4yNUg2LjI1VjguNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNTAwOCA2LjI1TDkuMTY2NzUgOS4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjgzMzI1MiAwLjgzMzAwOEwzLjc0OTkyIDMuNzQ5NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4yNSAzLjc1SDMuNzVWMS4yNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJnLVsjRjNGNEY2XSBjcWEtaC1bY2FsYygxMDAlLTQxcHgpXVwiPlxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ2NxYS13LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1mbGV4LWNvbCc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAnY3FhLW1heC1oLWZ1bGwgY3FhLWgtZnVsbCc6IGhhc0RldmljZUZyYW1lICYmIChwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJyB8fCAhaXNMaXZlKSxcbiAgICAgICAgICAgICAgICdjcWEtbWluLXctbWF4JzogaGFzRGV2aWNlRnJhbWUgJiYgcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1xuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImxpdmVDb250ZW50Q29udGFpbmVyU3R5bGVcIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWVcIlxuICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICdjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZSc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS16LTIwJzogaGFzRGV2aWNlRnJhbWUgJiYgcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICdjcWEtYmctd2hpdGUnOiBoYXNEZXZpY2VGcmFtZSAmJiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ1xuICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoYXNEZXZpY2VGcmFtZSA/IGRldmljZVNjcmVlblN0eWxlIDoge31cIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTGl2ZSBDb250ZW50ICh3aGVuIG5vdCBsb2FkaW5nKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGl2ZVN0YXR1cyA9PT0gJ0ZhaWxlZCcgJiYgZmFpbGVkU3RhdHVzTWVzc2FnZVwiIGNsYXNzPVwiY3FhLXAtNiBjcWEtdGV4dC1jZW50ZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTMgY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyNDNjM1MzVdIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtbS0wXCI+e3sgZmFpbGVkU3RhdHVzTWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwibGl2ZVN0YXR1cyAhPT0gJ0ZhaWxlZCcgfHwgIWZhaWxlZFN0YXR1c01lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTm9ybWFsIFZpZGVvIFZpZXcgKHdoZW4gbm90IGxpdmUpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgYXJpYS1sYWJlbD1cIlZpZGVvIHBsYXliYWNrXCJcbiAgICAgICAgIChrZXlkb3duKT1cIm9uVmlkZW9LZXlkb3duKCRldmVudClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLW1heC1oLVtjYWxjKDEwMCUtNjBweCldXCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJywgJ2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSB2aWRlb05vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICN2cGxheWVyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY292ZXIgY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvblZpZGVvTWV0YWRhdGFMb2FkZWQoKVwiXG4gICAgICAgICAgICAgICAgICAoY2FucGxheSk9XCJvblZpZGVvQ2FuUGxheSgpXCJcbiAgICAgICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3ZpZGVvTm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhY3VycmVudFZpZGVvVXJsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkICYmIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOyBlbHNlIG5vVmlkZW9EZWZhdWx0XCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAge3sgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2UgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI25vVmlkZW9EZWZhdWx0PlxuICAgICAgICAgIDxzcGFuPk5vIHZpZGVvIHJlY29yZGluZyBmb3VuZDwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0yIGNxYS1iZy13aGl0ZVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU3RUI7XCIgW25nQ2xhc3NdPVwieydjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lfVwiICpuZ0lmPVwiY3VycmVudFZpZGVvVXJsICYmICFpc0xpdmVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbWItMiBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgVmlkZW8ge3sgY3VycmVudFZpZGVvSW5kZXggKyAxIH19IHBsYXlpbmcgb3V0IG9mIHt7IHZpZGVvVXJscz8ubGVuZ3RoIHx8IDAgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgKm5nSWY9XCJoYXNNdWx0aXBsZVZpZGVvc1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFZpZGVvSW5kZXggPT09IDBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogY3VycmVudFZpZGVvSW5kZXggPT09IDB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJwcmV2VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiUHJldmlvdXMgdmlkZW9cIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjMzc0MTUxXVwiIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiPnNraXBfcHJldmlvdXM8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgc3R5bGU9XCJ3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4O1wiPlxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgIGRpYW1ldGVyPVwiMTZcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgIDwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICAqbmdJZj1cIiFpc1BsYXllclN3aXRjaGluZ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQbGF5KClcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgaXNQbGF5aW5nID8gJ1BhdXNlJyA6ICdQbGF5JyB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAyTDEzIDhMMyAxNFYyWlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNQbGF5aW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiMlwiIHdpZHRoPVwiM1wiIGhlaWdodD1cIjEyXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTBcIiB5PVwiMlwiIHdpZHRoPVwiM1wiIGhlaWdodD1cIjEyXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3NcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IHZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwibmV4dFZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk5leHQgdmlkZW9cIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjMzc0MTUxXVwiIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IHZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpfVwiPnNraXBfbmV4dDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmUgY3FhLWlubGluZS1ibG9ja1wiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICB7eyBmb3JtYXRUaW1lKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDApIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPGRpdiAjc3BlZWRDb250cm9sQ29udGFpbmVyIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1tci1bOHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmUgY3FhLXB4LTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU3BlZWRDb250cm9sKClcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInUGxheWJhY2sgU3BlZWQnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCI+XG4gICAgICAgICAgICAgIHt7IGN1cnJlbnRTcGVlZCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNTcGVlZENvbnRyb2xPcGVuXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWJvdHRvbS1mdWxsIGNxYS1tYi0yIGNxYS1yaWdodC0wIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXJvdW5kZWQtbGcgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtc2hhZG93LWxnIGNxYS16LTUwXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IG1heC1jb250ZW50OyBsZWZ0OiA1MCU7IGJvdHRvbTogMCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiPlxuICAgICAgICAgICAgICA8Y3FhLXNlZ21lbnQtY29udHJvbFxuICAgICAgICAgICAgICAgIFtzZWdtZW50c109XCJzcGVlZFNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFNwZWVkXCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyQmdDb2xvcl09XCInI0YwRjBGMSdcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNwZWVkQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICN0aW1lbGluZUJhclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC0xIGNxYS1iZy1ncmF5LTIwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdy1mdWxsXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGltZWxpbmVDbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2YgY3VycmVudFZpZGVvTWFya2Vyc1wiIFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJnZXRTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcilcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0R2xvYmFsTWFya2VyQ29sb3IobWFya2VyLmxldmVsKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzJweCBzb2xpZCAnICsgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IobWFya2VyLnJlc3VsdClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm94LXNpemluZ109XCInYm9yZGVyLWJveCdcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJtYXJrZXIudGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvOyB6LWluZGV4OiA1MDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgdG9wOiA1MCU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFya2VyQ2xpY2soJGV2ZW50LCBtYXJrZXIpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtMCBjcWEtdG9wLTAgY3FhLWgtZnVsbCBjcWEtYmctYmx1ZS01MDAgY3FhLXJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnRyYW5zaXRpb25dPVwiZHJhZ2dpbmcgPyAnbm9uZScgOiAnd2lkdGggMTAwbXMnXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogMjtcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtdG9wLTEvMiBjcWEtdy0zIGNxYS1oLTMgY3FhLWJnLWJsdWUtNjAwIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1ncmFiIGFjdGl2ZTpjcWEtY3Vyc29yLWdyYWJiaW5nIGNxYS1zaGFkb3ctbWRcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cInByb2dyZXNzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgei1pbmRleDogNjA7XCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydERyYWcoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVs5cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGNxYS1tci0yXCI+XG4gICAgICAgICAgICB7eyBmb3JtYXRUaW1lKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmR1cmF0aW9uIHx8IDApIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICdzY3JlZW5zaG90cydcIiBjbGFzcz1cImNxYS1oLWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwic2NyZWVuU2hvdFVybFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWU7IGVsc2Ugc2NyZWVuc2hvdE5vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW1heC1oLVtpbmhlcml0XSc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1heC1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cInNjcmVlblNob3RVcmxcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3NjcmVlbnNob3ROb0ZyYW1lPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBbc3JjXT1cInNjcmVlblNob3RVcmxcIlxuICAgICAgICAgICAgICBhbHQ9XCJTY3JlZW5zaG90XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIE5vIHNjcmVlbnNob3QgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndHJhY2UnXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcmVsYXRpdmVcIiAqbmdJZj1cInRyYWNlVmlld1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiIHN0eWxlPVwicGFkZGluZy10b3A6IDQ4cHg7IHBhZGRpbmctYm90dG9tOiAwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtcmVsYXRpdmVcIj5cbiAgICAgICAgICA8aWZyYW1lIFxuICAgICAgICAgICAgW3NyY109XCJzYWZlVHJhY2VVcmxcIiBcbiAgICAgICAgICAgIHRpdGxlPVwiVHJhY2UgVmlld2VyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLW1pbi1oLVsyNTBweF0gY3FhLW1heC1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogLTQ4cHg7IGhlaWdodDogY2FsYygxMDAlICsgNDhweCk7XCJcbiAgICAgICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW5cbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBsb2FkaW5nPVwibGF6eVwiXG4gICAgICAgICAgICAobG9hZCk9XCJvblRyYWNlVmlld2VyTG9hZCgpXCJcbiAgICAgICAgICAgIChlcnJvcik9XCJvblRyYWNlVmlld2VyRXJyb3IoKVwiPlxuICAgICAgICAgIDwvaWZyYW1lPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckxvYWRpbmdcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgTG9hZGluZyB0cmFjZSB2aWV3ZXIuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJFcnJvclwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBGYWlsZWQgdG8gbG9hZCB0cmFjZSB2aWV3ZXJcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXRyYWNlVmlld1VybFwiPlxuICAgICAgICBObyB0cmFjZSBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiAgXG4gIDwvZGl2PlxuPC9kaXY+Il19