@cqa-lib/cqa-ui 1.1.556 → 1.1.557-epsilon.1

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.
@@ -384,7 +384,65 @@ export class SimulatorComponent {
384
384
  return 'browser';
385
385
  }
386
386
  get hasDeviceFrame() {
387
- return !!this.deviceFrameConfig;
387
+ if (!this.deviceFrameConfig)
388
+ return false;
389
+ return true;
390
+ }
391
+ /** Render the CSS-built browser frame for every web/browser run that
392
+ * has a known viewport — including mobile-sized viewports (375×667,
393
+ * 412×915, etc.). Phone-mockup PNGs are reserved for actual mobile
394
+ * *device* emulation (`platformType === 'device'`). */
395
+ get useCssBrowserFrame() {
396
+ if (this.effectivePlatformType !== 'browser')
397
+ return false;
398
+ const vp = this.effectiveBrowserViewPort;
399
+ return !!(vp && vp.width && vp.height);
400
+ }
401
+ /** Size the CSS browser frame **dynamically** from the viewport's aspect
402
+ * ratio. The binding dimension is picked from the viewport's own
403
+ * orientation so the frame fills the pane along its dominant axis and
404
+ * keeps the viewport's exact aspect on the other axis.
405
+ *
406
+ * - Landscape (`w >= h`, e.g. 1024×768, 1920×1080, 3000×2000):
407
+ * `width: 100%` is primary; height is derived via `aspect-ratio`.
408
+ * `max-height: 100%` lets the engine clamp + shrink width when the
409
+ * pane is shorter than the derived height would require.
410
+ * - Portrait (`w < h`, e.g. 375×667, 412×915):
411
+ * `height: 100%` is primary; width follows via `aspect-ratio`.
412
+ * `max-width: 100%` clamps when the pane is narrower.
413
+ *
414
+ * The 40px chrome bar is baked into the ratio so the inner content
415
+ * area below the chrome lands at the viewport's exact `vp.w / vp.h`.
416
+ * Returns `{}` when no viewport data is available — the parent flex
417
+ * container then keeps the default look (no resize). */
418
+ get cssBrowserFrameOuterStyle() {
419
+ const vp = this.effectiveBrowserViewPort;
420
+ if (!vp || !vp.width || !vp.height)
421
+ return {};
422
+ const chromeHeight = 40;
423
+ const aspect = `${vp.width} / ${vp.height + chromeHeight}`;
424
+ const portrait = vp.height > vp.width;
425
+ const sizing = portrait
426
+ ? {
427
+ height: '100%',
428
+ 'max-height': '100%',
429
+ 'max-width': '100%',
430
+ }
431
+ : {
432
+ width: '100%',
433
+ 'max-width': '100%',
434
+ 'max-height': '100%',
435
+ };
436
+ return {
437
+ ...sizing,
438
+ 'min-width': '0',
439
+ 'min-height': '0',
440
+ 'aspect-ratio': aspect,
441
+ 'border-left': '1px solid #E5E7EB',
442
+ 'border-right': '1px solid #E5E7EB',
443
+ 'border-bottom': '1px solid #E5E7EB',
444
+ 'box-sizing': 'border-box',
445
+ };
388
446
  }
389
447
  get isPlayerSwitching() {
390
448
  return this.playerState === 'switching';
@@ -2412,10 +2470,10 @@ export class SimulatorComponent {
2412
2470
  }
2413
2471
  }
2414
2472
  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 });
2415
- 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", browserDevice: "browserDevice", isFastForwarding: "isFastForwarding", fastForwardConfig: "fastForwardConfig", showVideoLibrary: "showVideoLibrary", showCaptureVideo: "showCaptureVideo", isCapturingVideo: "isCapturingVideo", liveSessionView: "liveSessionView" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange", captureVideoRequested: "captureVideoRequested", liveSessionViewChange: "liveSessionViewChange" }, 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 }, { propertyName: "clipsScrollerRef", first: true, predicate: ["clipsScroller"], descendants: true }, { propertyName: "clipVideos", predicate: ["clipVideo"], 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=\"effectivePlatformType === '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=\"effectivePlatformType === '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=\"effectivePlatformType === '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 <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === '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 && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== '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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\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': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === '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': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\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 (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\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 <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\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 && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n 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 && !isVideoFullMode\"\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 && !isVideoFullMode\"\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(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (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%); z-index: 101;\">\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 (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !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': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === '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]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === '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=\"!isFastForwarding && !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': effectivePlatformType === '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", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i5.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2473
+ 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", browserDevice: "browserDevice", isFastForwarding: "isFastForwarding", fastForwardConfig: "fastForwardConfig", showVideoLibrary: "showVideoLibrary", showCaptureVideo: "showCaptureVideo", isCapturingVideo: "isCapturingVideo", liveSessionView: "liveSessionView" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange", captureVideoRequested: "captureVideoRequested", liveSessionViewChange: "liveSessionViewChange" }, 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 }, { propertyName: "clipsScrollerRef", first: true, predicate: ["clipsScroller"], descendants: true }, { propertyName: "clipVideos", predicate: ["clipVideo"], 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=\"effectivePlatformType === '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=\"effectivePlatformType === '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=\"effectivePlatformType === '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 <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-h-full': !useCssBrowserFrame,\n 'cqa-w-auto': hasDeviceFrame && !useCssBrowserFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device',\n 'cqa-flex-col': useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? cssBrowserFrameOuterStyle : liveContentContainerStyle\">\n\n <!-- CSS-built browser chrome bar (used when useCssBrowserFrame).\n Height scales with width via aspect-ratio (30:1, clamped\n 20\u201340px) so the chrome shrinks when the splitter narrows\n the simulator and grows again when it widens. Dots use\n percent-of-parent so they track the bar's height. -->\n <div *ngIf=\"useCssBrowserFrame\"\n class=\"cqa-w-full cqa-flex cqa-items-center cqa-px-3 cqa-bg-[#2a2a2a]\"\n style=\"aspect-ratio: 30 / 1; min-height: 20px; max-height: 40px; flex: 0 0 auto; box-sizing: border-box;\">\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FF5F57;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FEBC2E;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full\" style=\"aspect-ratio: 1; height: 35%; background: #28C840;\"></span>\n </div>\n\n <!-- Image-based mockup (default / legacy frame). -->\n <img *ngIf=\"hasDeviceFrame && !useCssBrowserFrame\"\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\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame && !useCssBrowserFrame,\n 'cqa-flex-1 cqa-w-full cqa-flex cqa-flex-col cqa-bg-white cqa-overflow-hidden': useCssBrowserFrame,\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 && effectivePlatformType === 'browser' && !useCssBrowserFrame,\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"(hasDeviceFrame && !useCssBrowserFrame) ? 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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\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-flex cqa-items-center cqa-justify-center cqa-max-h-full\"\n [ngClass]=\"{\n 'cqa-h-full cqa-w-auto': !useCssBrowserFrame,\n 'cqa-flex-col cqa-overflow-hidden': useCssBrowserFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-min-w-max': effectivePlatformType === 'device' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? cssBrowserFrameOuterStyle : {}\">\n\n <!-- CSS-built browser chrome bar (used when useCssBrowserFrame). -->\n <div *ngIf=\"useCssBrowserFrame\"\n class=\"cqa-w-full cqa-flex cqa-items-center cqa-px-3 cqa-bg-[#2a2a2a]\"\n style=\"aspect-ratio: 30 / 1; min-height: 20px; max-height: 40px; flex: 0 0 auto; box-sizing: border-box;\">\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FF5F57;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FEBC2E;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full\" style=\"aspect-ratio: 1; height: 35%; background: #28C840;\"></span>\n </div>\n\n <!-- Image-based mockup (default / legacy frame). -->\n <img *ngIf=\"!useCssBrowserFrame\"\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': !useCssBrowserFrame,\n 'cqa-flex-1 cqa-w-full cqa-flex cqa-flex-col cqa-bg-white cqa-overflow-hidden cqa-relative': useCssBrowserFrame,\n 'cqa-bg-white': effectivePlatformType !== 'browser' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? {} : deviceScreenStyle\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [ngClass]=\"{\n 'cqa-z-20': effectivePlatformType === 'browser' && !useCssBrowserFrame,\n 'cqa-object-cover': useCssBrowserFrame,\n 'cqa-object-contain': !useCssBrowserFrame\n }\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\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 (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\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 <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\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 && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n 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 && !isVideoFullMode\"\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 && !isVideoFullMode\"\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(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (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%); z-index: 101;\">\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 (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !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-flex cqa-items-center cqa-justify-center cqa-max-h-full\"\n [ngClass]=\"{\n 'cqa-h-full cqa-w-auto': !useCssBrowserFrame,\n 'cqa-flex-col cqa-overflow-hidden': useCssBrowserFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-min-w-max': effectivePlatformType === 'device' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? cssBrowserFrameOuterStyle : {}\">\n\n <!-- CSS-built browser chrome bar (used when useCssBrowserFrame). -->\n <div *ngIf=\"useCssBrowserFrame\"\n class=\"cqa-w-full cqa-flex cqa-items-center cqa-px-3 cqa-bg-[#2a2a2a]\"\n style=\"aspect-ratio: 30 / 1; min-height: 20px; max-height: 40px; flex: 0 0 auto; box-sizing: border-box;\">\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FF5F57;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FEBC2E;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full\" style=\"aspect-ratio: 1; height: 35%; background: #28C840;\"></span>\n </div>\n\n <img *ngIf=\"!useCssBrowserFrame\"\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]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': !useCssBrowserFrame,\n 'cqa-flex-1 cqa-w-full cqa-flex cqa-flex-col cqa-bg-white cqa-overflow-hidden cqa-relative': useCssBrowserFrame,\n 'cqa-bg-white': effectivePlatformType !== 'browser' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? {} : deviceScreenStyle\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser' && !useCssBrowserFrame}\"\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=\"!isFastForwarding && !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': effectivePlatformType === '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", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i5.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2416
2474
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, decorators: [{
2417
2475
  type: Component,
2418
- 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=\"effectivePlatformType === '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=\"effectivePlatformType === '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=\"effectivePlatformType === '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 <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === '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 && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== '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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\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': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === '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': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\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 (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\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 <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\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 && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n 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 && !isVideoFullMode\"\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 && !isVideoFullMode\"\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(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (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%); z-index: 101;\">\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 (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !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': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === '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]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === '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=\"!isFastForwarding && !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': effectivePlatformType === '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: [] }]
2476
+ 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=\"effectivePlatformType === '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=\"effectivePlatformType === '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=\"effectivePlatformType === '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 <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-h-full': !useCssBrowserFrame,\n 'cqa-w-auto': hasDeviceFrame && !useCssBrowserFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device',\n 'cqa-flex-col': useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? cssBrowserFrameOuterStyle : liveContentContainerStyle\">\n\n <!-- CSS-built browser chrome bar (used when useCssBrowserFrame).\n Height scales with width via aspect-ratio (30:1, clamped\n 20\u201340px) so the chrome shrinks when the splitter narrows\n the simulator and grows again when it widens. Dots use\n percent-of-parent so they track the bar's height. -->\n <div *ngIf=\"useCssBrowserFrame\"\n class=\"cqa-w-full cqa-flex cqa-items-center cqa-px-3 cqa-bg-[#2a2a2a]\"\n style=\"aspect-ratio: 30 / 1; min-height: 20px; max-height: 40px; flex: 0 0 auto; box-sizing: border-box;\">\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FF5F57;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FEBC2E;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full\" style=\"aspect-ratio: 1; height: 35%; background: #28C840;\"></span>\n </div>\n\n <!-- Image-based mockup (default / legacy frame). -->\n <img *ngIf=\"hasDeviceFrame && !useCssBrowserFrame\"\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\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame && !useCssBrowserFrame,\n 'cqa-flex-1 cqa-w-full cqa-flex cqa-flex-col cqa-bg-white cqa-overflow-hidden': useCssBrowserFrame,\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 && effectivePlatformType === 'browser' && !useCssBrowserFrame,\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"(hasDeviceFrame && !useCssBrowserFrame) ? 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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\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-flex cqa-items-center cqa-justify-center cqa-max-h-full\"\n [ngClass]=\"{\n 'cqa-h-full cqa-w-auto': !useCssBrowserFrame,\n 'cqa-flex-col cqa-overflow-hidden': useCssBrowserFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-min-w-max': effectivePlatformType === 'device' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? cssBrowserFrameOuterStyle : {}\">\n\n <!-- CSS-built browser chrome bar (used when useCssBrowserFrame). -->\n <div *ngIf=\"useCssBrowserFrame\"\n class=\"cqa-w-full cqa-flex cqa-items-center cqa-px-3 cqa-bg-[#2a2a2a]\"\n style=\"aspect-ratio: 30 / 1; min-height: 20px; max-height: 40px; flex: 0 0 auto; box-sizing: border-box;\">\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FF5F57;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FEBC2E;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full\" style=\"aspect-ratio: 1; height: 35%; background: #28C840;\"></span>\n </div>\n\n <!-- Image-based mockup (default / legacy frame). -->\n <img *ngIf=\"!useCssBrowserFrame\"\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': !useCssBrowserFrame,\n 'cqa-flex-1 cqa-w-full cqa-flex cqa-flex-col cqa-bg-white cqa-overflow-hidden cqa-relative': useCssBrowserFrame,\n 'cqa-bg-white': effectivePlatformType !== 'browser' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? {} : deviceScreenStyle\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [ngClass]=\"{\n 'cqa-z-20': effectivePlatformType === 'browser' && !useCssBrowserFrame,\n 'cqa-object-cover': useCssBrowserFrame,\n 'cqa-object-contain': !useCssBrowserFrame\n }\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\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 (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!overlayShowsPlayingIcon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\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 <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\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 && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n 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 && !isVideoFullMode\"\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 && !isVideoFullMode\"\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(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (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%); z-index: 101;\">\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 (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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.%]=\"isVideoFullMode ? globalScrubberPercent : 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(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !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-flex cqa-items-center cqa-justify-center cqa-max-h-full\"\n [ngClass]=\"{\n 'cqa-h-full cqa-w-auto': !useCssBrowserFrame,\n 'cqa-flex-col cqa-overflow-hidden': useCssBrowserFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-min-w-max': effectivePlatformType === 'device' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? cssBrowserFrameOuterStyle : {}\">\n\n <!-- CSS-built browser chrome bar (used when useCssBrowserFrame). -->\n <div *ngIf=\"useCssBrowserFrame\"\n class=\"cqa-w-full cqa-flex cqa-items-center cqa-px-3 cqa-bg-[#2a2a2a]\"\n style=\"aspect-ratio: 30 / 1; min-height: 20px; max-height: 40px; flex: 0 0 auto; box-sizing: border-box;\">\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FF5F57;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full cqa-mr-2\" style=\"aspect-ratio: 1; height: 35%; background: #FEBC2E;\"></span>\n <span class=\"cqa-inline-block cqa-rounded-full\" style=\"aspect-ratio: 1; height: 35%; background: #28C840;\"></span>\n </div>\n\n <img *ngIf=\"!useCssBrowserFrame\"\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]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': !useCssBrowserFrame,\n 'cqa-flex-1 cqa-w-full cqa-flex cqa-flex-col cqa-bg-white cqa-overflow-hidden cqa-relative': useCssBrowserFrame,\n 'cqa-bg-white': effectivePlatformType !== 'browser' && !useCssBrowserFrame\n }\"\n [ngStyle]=\"useCssBrowserFrame ? {} : deviceScreenStyle\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser' && !useCssBrowserFrame}\"\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=\"!isFastForwarding && !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': effectivePlatformType === '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: [] }]
2419
2477
  }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { videoUrl: [{
2420
2478
  type: Input
2421
2479
  }], videoUrls: [{
@@ -2503,4 +2561,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
2503
2561
  type: HostListener,
2504
2562
  args: ['window:resize']
2505
2563
  }] } });
2506
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUErRixZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlOLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBK2U3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEvZXZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdB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QXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU1HLGVBQWU7c0JBQXZCLEtBQUs7Z0JBUUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFLSCxVQUFVO3NCQURiLFNBQVM7dUJBQUMsU0FBUztnQkFxQmhCLGNBQWM7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFhdkMsd0JBQXdCO3NCQUQzQixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkE2QzFCLFVBQVU7c0JBQXBDLFlBQVk7dUJBQUMsV0FBVztnQkFDRyxnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTtnQkFxWDFCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZ2V0RW1wdHlTdGF0ZVByZXNldCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLXByZXNldHMuY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBGYXN0Rm9yd2FyZENvbmZpZyB7XG4gIGZyb21TdGVwOiBudW1iZXI7XG4gIHRvU3RlcDogbnVtYmVyO1xuICBjdXJyZW50U3RlcDogbnVtYmVyO1xuICB0b3RhbFN0ZXBzOiBudW1iZXI7XG4gIHRhcmdldFN0ZXBOdW1iZXI6IHN0cmluZztcbiAgdGFyZ2V0U3RlcExhYmVsOiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwTWFya2VyIHtcbiAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBudW1iZXI7XG4gIHJlc3VsdDogJ1NVQ0NFU1MnIHwgJ0ZBSUxVUkUnIHwgJ0FCT1JURUQnIHwgJ1NLSVBQRUQnO1xuICB0ZXN0U3RlcElkPzogbnVtYmVyO1xuICBsZXZlbD86IG51bWJlcjtcbiAgY2hpbGRTdGVwcz86IFN0ZXBNYXJrZXJbXTtcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnRUeXBlID0gJ3NjcmVlbnNob3RzJyB8ICd2aWRlbycgfCAndHJhY2UnO1xuXG50eXBlIFNlZ21lbnRPcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG59O1xuaW50ZXJmYWNlIERldmljZUZyYW1lQ29uZmlnIHtcbiAgbW9ja3VwSW1hZ2U6IHN0cmluZztcbiAgc2NyZWVuSW5zZXQ6IHtcbiAgICB0b3A6IHN0cmluZztcbiAgICByaWdodDogc3RyaW5nO1xuICAgIGJvdHRvbTogc3RyaW5nO1xuICAgIGxlZnQ6IHN0cmluZztcbiAgfTtcbiAgYm9yZGVyUmFkaXVzOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zaW11bGF0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vc2ltdWxhdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXVxufSlcblxuZXhwb3J0IGNsYXNzIFNpbXVsYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSB2aWRlb1VybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHZpZGVvVXJsczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgdmlkZW9DdXJyZW50RHVyYXRpb246IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHN0ZXBNYXJrZXJzOiBTdGVwTWFya2VyW10gPSBbXTtcbiAgQElucHV0KCkgc2NyZWVuU2hvdFVybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRyYWNlVmlld1VybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHBsYXRmb3JtTmFtZTogc3RyaW5nID0gJ1dlYiAtIENocm9tZSc7XG4gIEBJbnB1dCgpIHBsYXRmb3JtVHlwZTogJ2Jyb3dzZXInIHwgJ2RldmljZScgPSAnYnJvd3Nlcic7XG4gIEBJbnB1dCgpIHBsYXRmb3JtOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGV2aWNlTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBsaXZlU3RhdHVzOiAnSW4gUHJvZ3Jlc3MnIHwgJ1BhdXNlZCcgfCAnQWJvcnRlZCcgfCAnRmFpbGVkJyB8ICdQYXNzZWQnIHwgJ0V4ZWN1dGlvbicgPSAnSW4gUHJvZ3Jlc3MnO1xuICBASW5wdXQoKSBsaXZlTG9hZGluZ0xhYmVsOiBzdHJpbmcgPSAnTG9hZGluZy4uLic7XG4gIEBJbnB1dCgpIGlzQ29udGVudFZpZGVvTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmYWlsZWRTdGF0dXNNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgaXNWTkNTZXNzaW9uSW50cnVwcHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmlldzogU2VnbWVudFR5cGUgPSAndmlkZW8nO1xuICBASW5wdXQoKSBoaWRlVmlkZW9UYWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYnJvd3NlclZpZXdQb3J0OiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYnJvd3NlckRldmljZTogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KCkgaXNGYXN0Rm9yd2FyZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmYXN0Rm9yd2FyZENvbmZpZzogRmFzdEZvcndhcmRDb25maWcgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBzaG93VmlkZW9MaWJyYXJ5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dDYXB0dXJlVmlkZW86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNDYXB0dXJpbmdWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFdoZW4gYGlzTGl2ZWAgYW5kIGF0IGxlYXN0IG9uZSBjbGlwIGlzIHByZXNlbnQgaW4gYHZpZGVvVXJsc2AsIHRoZSBzaW11bGF0b3JcbiAgLy8gaGVhZGVyIHNob3dzIGEgTGl2ZS9DYXB0dXJlZCBzZWdtZW50IGNvbnRyb2wuIFBhcmVudCBjYW4gYWxzbyBkcml2ZSB0aGUgdmlld1xuICAvLyBpbXBlcmF0aXZlbHkgKGUuZy4gXCJXYXRjaCBOb3dcIiBidXR0b24gaW4gdGhlIGNhcHR1cmUgZGlhbG9nKSBieSBwdXNoaW5nIGFcbiAgLy8gbmV3IHZhbHVlIHRocm91Z2ggdGhpcyBpbnB1dC5cbiAgQElucHV0KCkgbGl2ZVNlc3Npb25WaWV3OiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gJ2xpdmUnO1xuXG4gIGdldCBmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGMgPSB0aGlzLmZhc3RGb3J3YXJkQ29uZmlnO1xuICAgIGlmICghYyB8fCAhYy50b3RhbFN0ZXBzKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCAoYy5jdXJyZW50U3RlcCAvIGMudG90YWxTdGVwcykgKiAxMDApO1xuICB9XG5cbiAgQE91dHB1dCgpIHZpZGVvVGltZVVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QbGF5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QYXVzZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1hcmtlckhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8U3RlcE1hcmtlcj4oKTtcbiAgQE91dHB1dCgpIGlzVmlkZW9QbGF5aW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgY2FwdHVyZVZpZGVvUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbGl2ZVNlc3Npb25WaWV3Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwnbGl2ZScgfCAnY2FwdHVyZWQnPigpO1xuXG4gIHByaXZhdGUgX3ZwbGF5ZXI/OiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3ZwbGF5ZXInKVxuICBzZXQgdnBsYXllclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikge1xuICAgICAgLy8gRWxlbWVudCBpcyBiZWluZyB1bm1vdW50ZWQgKGUuZy4gdXNlciB0b2dnbGVkIGZyb20gQ2FwdHVyZWQg4oaSIExpdmUgZHVyaW5nIGFcbiAgICAgIC8vIG1pZC1mbGlnaHQgc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwpLiBEcm9wIHRoZSBzdGFsZSByZWZlcmVuY2Ugc28gYW55XG4gICAgICAvLyBmb2xsb3ctdXAgYXR0ZW1wdCB0byBvcGVyYXRlIG9uIC5uYXRpdmVFbGVtZW50IHNob3J0LWNpcmN1aXRzIG91dCBjbGVhbmx5LlxuICAgICAgdGhpcy5fdnBsYXllciA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl92cGxheWVyID0gcmVmO1xuICAgIHRoaXMub25WaWRlb0VsZW1lbnRSZWFkeSgpO1xuICB9XG5cbiAgZ2V0IHZwbGF5ZXIoKTogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZwbGF5ZXI7XG4gIH1cblxuICBwcml2YXRlIF90aW1lbGluZUJhcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3RpbWVsaW5lQmFyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCB0aW1lbGluZUJhclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl90aW1lbGluZUJhciA9IHJlZjtcbiAgfVxuXG4gIGdldCB0aW1lbGluZUJhcigpOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lQmFyO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3BlZWRDb250cm9sQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnc3BlZWRDb250cm9sQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCBzcGVlZENvbnRyb2xDb250YWluZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSByZXR1cm47XG4gICAgdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHNwZWVkQ29udHJvbENvbnRhaW5lcigpOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWVkQ29udHJvbENvbnRhaW5lcjtcbiAgfVxuXG4gIHByb2dyZXNzID0gMDtcbiAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgaXNQbGF5aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dQbGF5UGF1c2VPdmVybGF5OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJY29uIHNob3duIGJ5IHRoZSBwbGF5L3BhdXNlIG92ZXJsYXkgZHVyaW5nIGl0cyA1MDBtcyBsaWZldGltZS4gUGlubmVkIGF0IGNsaWNrIHRpbWVcbiAgICogc28gdGhlIGljb24gZG9lc24ndCBmbGlja2VyIGFzIGBpc1BsYXlpbmdgIGZsaXBzIGFzeW5jIGJldHdlZW5cbiAgICogYDx2aWRlbz4ucGxheSgpYCBpbnZvY2F0aW9uIGFuZCBpdHMgcHJvbWlzZSByZXNvbHZpbmcuIE1pcnJvcnMgdGhlIFlvdVR1YmUtc3R5bGVcbiAgICogY29udmVudGlvbjogc2hvdyB0aGUgYWN0aW9uIGp1c3QgdGFrZW4gKOKWtiBhZnRlciBwbGF5LCDiiKUgYWZ0ZXIgcGF1c2UpLlxuICAgKi9cbiAgb3ZlcmxheVNob3dzUGxheWluZ0ljb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwbGF5UGF1c2VPdmVybGF5VGltZXI6IGFueSA9IG51bGw7XG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50Vmlldzogc3RyaW5nID0gJ3ZpZGVvJztcbiAgY3VycmVudFZpZGVvSW5kZXg6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRTcGVlZDogc3RyaW5nID0gJzF4JztcbiAgaXNTcGVlZENvbnRyb2xPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uczogbnVtYmVyW10gPSBbXTsgLy8gQWN0dWFsIGR1cmF0aW9ucyBkZXRlY3RlZCBmcm9tIHZpZGVvIG1ldGFkYXRhXG4gIHByaXZhdGUgd2FzUGxheWluZ0JlZm9yZURyYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVHJhY2sgaWYgdmlkZW8gd2FzIHBsYXlpbmcgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICBwcml2YXRlIHBsYXlQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHBsYXkgcHJvbWlzZVxuICBwcml2YXRlIGhpdE1hcmtlcnM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpOyAvLyBUcmFjayB3aGljaCBtYXJrZXJzIGhhdmUgYmVlbiBoaXQgKGJ5IHRlc3RTdGVwSWQpXG5cbiAgLy8gU3RhdGUgbWFjaGluZSBmb3Igcm9idXN0IG1lZGlhIG9wZXJhdGlvbnNcbiAgcHJpdmF0ZSBwbGF5ZXJTdGF0ZTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ3JlYWR5JyB8ICdwbGF5aW5nJyB8ICdwYXVzZWQnIHwgJ3NlZWtpbmcnIHwgJ3N3aXRjaGluZycgfCAnZXJyb3InID0gJ2lkbGUnO1xuICBwcml2YXRlIG9wZXJhdGlvblF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFNlcmlhbGl6ZSBhbGwgbWVkaWEgb3BlcmF0aW9uc1xuXG4gIC8vIFZpZGVvLW9uLWRlbWFuZCAoVmlkZW8gTGlicmFyeSkgc3RhdGUg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaXMgYHZpZGVvVXJsc2AuXG4gIC8vIGBuZXdWaWRlb0luZGV4ZXNgIG1hcmtzIHdoaWNoIGluZGV4ZXMgd2VyZSBqdXN0IGNhcHR1cmVkIChzbyB3ZSBjYW4gc2hvdyB0aGVcbiAgLy8gTkVXIGJhZGdlIHVudGlsIHRoYXQgY2xpcCBpcyBzZWxlY3RlZCk7IGBsaWJyYXJ5VmlkZW9EdXJhdGlvbnNgIGNhY2hlcyB0aGVcbiAgLy8gbWV0YWRhdGEtbG9hZGVkIGR1cmF0aW9uIHBlciBpbmRleCBmb3IgZWFjaCBsaWJyYXJ5IGNhcmQncyB0aHVtYm5haWwuXG4gIGlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgbmV3VmlkZW9JbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsaWJyYXJ5VmlkZW9EdXJhdGlvbnM6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBkb3dubG9hZGluZ0luZGV4ZXM6IFNldDxudW1iZXI+ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGRvd25sb2FkUHJvZ3Jlc3M6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyAwLTEwMCBwZXIgY2xpcCBpbmRleFxuICBAVmlld0NoaWxkcmVuKCdjbGlwVmlkZW8nKSBjbGlwVmlkZW9zPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4+O1xuICBAVmlld0NoaWxkKCdjbGlwc1Njcm9sbGVyJykgY2xpcHNTY3JvbGxlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhc3RMaWJyYXJ5U3luY0tleTogc3RyaW5nID0gJyc7XG4gIC8vIFRyYWNrcyB3aGljaCBjbGlwIGluZGV4IHRoZSBsaWJyYXJ5IHJvdyB3YXMgbGFzdCBhdXRvLXNjcm9sbGVkIHRvLCBzbyB0aGVcbiAgLy8gdGltZXVwZGF0ZSBoYW5kbGVyIGRvZXNuJ3QgcmUtdHJpZ2dlciBhIHNjcm9sbCBldmVyeSBmcmFtZS5cbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsZWRDbGlwSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIEF1dG8tcmVjb3Zlcnk6IHdoZW4gdGhlIDx2aWRlbz4gZmlyZXMgYW4gZXJyb3IgZXZlbnQgKGUuZy4gQ2hyb21lJ3NcbiAgLy8gXCJQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyXCIgYWZ0ZXIgYSBuZXR3b3JrIGdsaXRjaCksIHdlIGZsaXBcbiAgLy8gdGhpcyBmbGFnIHRvIHVubW91bnQgdGhlIDx2aWRlbz4gdmlhICpuZ0lmLCB0aGVuIGZsaXAgaXQgYmFjayBzbyBBbmd1bGFyXG4gIC8vIHJlbW91bnRzIGEgZnJlc2ggZWxlbWVudCDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlXG4gIC8vIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kIHJlY292ZXIgcGxheWJhY2sgdG9kYXkuXG4gIHZpZGVvUmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVNlZWtTZWM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVBsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRzOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SRUNPVkVSWV9BVFRFTVBUUyA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFJFQ09WRVJZX1dJTkRPV19NUyA9IDEwXzAwMDtcblxuICAvLyBQaGFzZSAyIOKAlCBcIlNob3cgRnVsbCBWaWRlb1wiIG1vZGUuIFdoZW4gdHJ1ZSwgdGhlIG1haW4gdGltZWxpbmUgc3BhbnMgdGhlIHRvdGFsXG4gIC8vIGR1cmF0aW9uIGFjcm9zcyBhbGwgY2xpcHMgYW5kIHN0ZXAgbWFya2VycyBmcm9tIGV2ZXJ5IGNsaXAgYXJlIGxhaWQgb3V0IG9uIGl0LlxuICAvLyBDbGlwLXRvLWNsaXAgdHJhbnNpdGlvbnMgaGFwcGVuIHVuZGVyIHRoZSBob29kIHZpYSB0aGUgZXhpc3Rpbmcgb25WaWRlb0VuZGVkXG4gIC8vIGF1dG8tYWR2YW5jZSBwYXRoIOKAlCB0aGUgdXNlciBkb2Vzbid0IHNlZSBhIHJlc2V0LlxuICBpc1ZpZGVvRnVsbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gMC0xMDAgcG9zaXRpb24gb24gdGhlIGdsb2JhbCB0aW1lbGluZSB3aGlsZSB0aGUgdXNlciBpcyBhY3RpdmVseSBkcmFnZ2luZy5cbiAgLy8gTmVlZGVkIGJlY2F1c2UgYHByb2dyZXNzYCBpcyBwZXItY3VycmVudC1jbGlwIGFuZCB3b3VsZCBnaXZlIHRoZSB3cm9uZyB2YWx1ZS5cbiAgZ2xvYmFsRHJhZ1Byb2dyZXNzOiBudW1iZXIgPSAwO1xuXG4gIC8vIERyYWctdG8tc2Nyb2xsIHN0YXRlIGZvciB0aGUgY2xpcHMgcm93IChtb3VzZSBlcXVpdmFsZW50IG9mIHRvdWNoLXN3aXBlKS5cbiAgcHJpdmF0ZSBjbGlwc0RyYWdTdGF0ZSA9IHsgZHJhZ2dpbmc6IGZhbHNlLCBzdGFydFg6IDAsIHN0YXJ0U2Nyb2xsTGVmdDogMCwgZGlkTW92ZTogZmFsc2UgfTtcbiAgY2xpcHNEcmFnQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSgpOiAnYnJvd3NlcicgfCAnZGV2aWNlJyB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykgcmV0dXJuICdkZXZpY2UnO1xuICAgIGlmICh0aGlzLnJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCkpIHJldHVybiAnZGV2aWNlJztcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cblxuICBnZXQgaXNBc3BlY3RSYXRpb01hdGNoZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgd2luZG93QXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB2aWV3cG9ydEFyID0gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQud2lkdGggLyB0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC4xNTtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93QXIgLSB2aWV3cG9ydEFyKSAvIHZpZXdwb3J0QXIgPCB0b2xlcmFuY2U7XG4gIH1cblxuICBnZXQgbGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXNwZWN0UmF0aW9NYXRjaGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWF4KDIwMCwgd2luZG93LmlubmVySGVpZ2h0IC0gMjAwKX1weGAsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIGxpdmVTZXNzaW9uU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTGl2ZScsIHZhbHVlOiAnbGl2ZScgfSxcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZWQnLCB2YWx1ZTogJ2NhcHR1cmVkJyB9LFxuICBdO1xuXG4gIG9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkOiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gKG5leHQgPT09ICdjYXB0dXJlZCcgPyAnY2FwdHVyZWQnIDogJ2xpdmUnKTtcbiAgICBpZiAocmVzb2x2ZWQgIT09IHRoaXMubGl2ZVNlc3Npb25WaWV3KSB7XG4gICAgICB0aGlzLmxpdmVTZXNzaW9uVmlldyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5yZXNldExpdmVTZXNzaW9uUGxheWJhY2tTdGF0ZSgpO1xuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXdDaGFuZ2UuZW1pdChyZXNvbHZlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IHRoZSB2aWRlbyBwbGF5ZXIgdG8gYSBjbGVhbiBzbGF0ZSB3aGVuZXZlciB0aGUgTGl2ZS9DYXB0dXJlZCB2aWV3IHRvZ2dsZXNcbiAgICogIGR1cmluZyBhbiBhY3RpdmUgZGVidWcgc2Vzc2lvbi4gUGF1c2VzIHBsYXliYWNrLCBleGl0cyBGdWxsIFZpZGVvIG1vZGUsIHJld2luZHNcbiAgICogIHRvIGNsaXAgMCwgYW5kIGNsZWFycyBkcmFnL3Njcm9sbC9tYXJrZXIgc3RhdGUuXG4gICAqXG4gICAqICBBcHBsaWVkIHN5bmNocm9ub3VzbHkgKG5vIG9wZXJhdGlvblF1ZXVlKSBiZWNhdXNlIHRoZSB0b2dnbGUgdXN1YWxseSBhbHNvXG4gICAqICB1bm1vdW50cy9yZW1vdW50cyB0aGUgPHZpZGVvPiBlbGVtZW50IOKAlCBhbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiB0aGUgb2xkXG4gICAqICBlbGVtZW50IGlzIGFscmVhZHkgZGVhZCwgYW5kIGEgZnJlc2ggZWxlbWVudCBuYXR1cmFsbHkgbW91bnRzIHdpdGhcbiAgICogIGBzcmMgPSB2aWRlb1VybHNbMF1gIGZyb20gYGN1cnJlbnRWaWRlb1VybGAuIEVucXVldWVpbmcgaGVyZSB3b3VsZCByYWNlIHdpdGhcbiAgICogIHRoZSBlbGVtZW50IGxpZmVjeWNsZSBhbmQgZWl0aGVyIGdldCBkaXNjYXJkZWQgb3IgYmxvY2sgdGhlIHF1ZXVlLiAqL1xuICBwcml2YXRlIHJlc2V0TGl2ZVNlc3Npb25QbGF5YmFja1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0Z1bGxNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IC0xO1xuICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvKSB7XG4gICAgICB0cnkgeyB2aWRlby5wYXVzZSgpOyB9IGNhdGNoIHsgLyogZGV0YWNoZWQgZWxlbWVudCDigJQgaWdub3JlICovIH1cbiAgICAgIHRyeSB7IHZpZGVvLmN1cnJlbnRUaW1lID0gMDsgfSBjYXRjaCB7IC8qIGRldGFjaGVkIGVsZW1lbnQg4oCUIGlnbm9yZSAqLyB9XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgYWN0aXZlIGxpYnJhcnkgY2FyZCdzIDx2aWRlbz4gZWxlbWVudCdzIHBsYXkgc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBtYWluIHBsYXllclxuICAgIC8vIHNvIHRoZSBjYXJkIGRvZXNuJ3Qgc2hvdyBhIGZyb3plbiB0aHVtYm5haWwgd2hpbGUgdGhlIG1haW4gdmlkZW8gaXMgcGxheWluZy5cbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmN1cnJlbnRWaWRlb0luZGV4fToke3RoaXMuaXNQbGF5aW5nfWA7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXN0TGlicmFyeVN5bmNLZXkpIHtcbiAgICAgIHRoaXMubGFzdExpYnJhcnlTeW5jS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zeW5jTGlicmFyeUNsaXBQbGF5YmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0xpYnJhcnlDbGlwUGxheWJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMuY2xpcFZpZGVvcztcbiAgICBpZiAoIXJlZnMpIHJldHVybjtcbiAgICBjb25zdCBtYWluRWwgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IGkgPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXggJiYgdGhpcy5pc1BsYXlpbmc7XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICAvLyBTZWVkIHRoZSBjYXJkJ3MgY3VycmVudFRpbWUgZnJvbSB0aGUgbWFpbiBwbGF5ZXIgc28gdGhleSBzdGFydCByb3VnaGx5IGFsaWduZWQuXG4gICAgICAgIGlmIChtYWluRWwgJiYgaXNGaW5pdGUobWFpbkVsLmN1cnJlbnRUaW1lKSAmJiAhaXNOYU4obWFpbkVsLmN1cnJlbnRUaW1lKSkge1xuICAgICAgICAgIHRyeSB7IGVsLmN1cnJlbnRUaW1lID0gbWFpbkVsLmN1cnJlbnRUaW1lOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnBhdXNlZCkge1xuICAgICAgICAgIGNvbnN0IHAgPSBlbC5wbGF5KCk7XG4gICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goKCkgPT4geyAvKiBhdXRvcGxheSBtYXkgYmUgYmxvY2tlZCDigJQgaWdub3JlICovIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlbC5wYXVzZWQpIHtcbiAgICAgICAgZWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlkZW9VcmxzJ10pIHtcbiAgICAgIGNvbnN0IHByZXYgPSAoY2hhbmdlc1sndmlkZW9VcmxzJ10ucHJldmlvdXNWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjdXJyID0gKGNoYW5nZXNbJ3ZpZGVvVXJscyddLmN1cnJlbnRWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICAvLyBNaWQtc2Vzc2lvbiBjYXB0dXJlcyBhcHBlbmQgdG8gdmlkZW9VcmxzLiBUcmVhdCBhcHBlbmQtb25seSBjaGFuZ2VzIGFzXG4gICAgICAvLyBhZGRpdGl2ZSBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBpc24ndCB5YW5rZWQgYmFjayB0byBpbmRleCAwLFxuICAgICAgLy8gYW5kIG1hcmsgdGhlIG5ldyB0YWlsIGNsaXBzIHdpdGggTkVXIGJhZGdlcy5cbiAgICAgIGNvbnN0IGlzQXBwZW5kT25seSA9XG4gICAgICAgIGN1cnIubGVuZ3RoID4gcHJldi5sZW5ndGggJiZcbiAgICAgICAgcHJldi5ldmVyeSgodSwgaSkgPT4gY3VycltpXSA9PT0gdSk7XG5cbiAgICAgIGlmIChjdXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGlzQXBwZW5kT25seSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBwcmV2Lmxlbmd0aDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubmV3VmlkZW9JbmRleGVzLmFkZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgICAvLyBVUkxzIHJlcGxhY2VkIChlLmcuIGV4ZWN1dGlvbl9jb21wbGV0ZWQgc3dhcHBpbmcgY2FwdHVyZWQg4oaSIHNjcmVlbl9yZWNvcmRpbmdzKS5cbiAgICAgICAgICAvLyBEaXNjYXJkIHN0YWxlIGR1cmF0aW9uICsgbGlicmFyeSBjYWNoZXMgc28gdGhlIG5ldyBjbGlwcyBhcmUgcmUtcHJvYmVkLlxuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhjdXJyKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyhjdXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpc0xpdmUnXSAmJiBjaGFuZ2VzWydpc0xpdmUnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAvLyBOZXcgcG9zdC1leGVjdXRpb24gc2Vzc2lvbjogZGVmYXVsdCBiYWNrIHRvICdsaXZlJyBzbyB0aGUgbmV4dCBsaXZlXG4gICAgICAvLyBydW4gc3RhcnRzIHdpdGggdGhlIGxpdmUgdmlldywgbm90IHdoYXRldmVyIHRoZSB1c2VyIHdhcyBsYXN0IG9uLlxuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXcgPSAnbGl2ZSc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXSAmJiAhY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZDogJ2xpdmUnIHwgJ2NhcHR1cmVkJyA9IChuZXh0ID09PSAnY2FwdHVyZWQnID8gJ2NhcHR1cmVkJyA6ICdsaXZlJyk7XG4gICAgICBjb25zdCBwcmV2ID0gY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10ucHJldmlvdXNWYWx1ZTtcbiAgICAgIHRoaXMubGl2ZVNlc3Npb25WaWV3ID0gcmVzb2x2ZWQ7XG4gICAgICBpZiAocmVzb2x2ZWQgIT09IHByZXYpIHtcbiAgICAgICAgLy8gUGFyZW50IHB1c2hlZCBhIG5ldyB2aWV3IChlLmcuIFwiV2F0Y2ggTm93XCIgb3IgcmVzdW1lLWFjdGlvbiByZXR1cm5pbmcgdG8gTGl2ZSkuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBzaW11bGF0b3IgdGhlIHNhbWUgd2F5IHRoZSBzZWdtZW50IGNvbnRyb2wgd291bGQuXG4gICAgICAgIHRoaXMucmVzZXRMaXZlU2Vzc2lvblBsYXliYWNrU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlLlxuICAgKlxuICAgKiBEZWNpc2lvbiBpcyBiYXNlZCBvbiB0aGUgdmlkZW8gZWxlbWVudCdzIG5hdGl2ZSBgcGF1c2VkYCBwcm9wZXJ0eSAoZ3JvdW5kIHRydXRoKVxuICAgKiByYXRoZXIgdGhhbiBvbiBgcGxheWVyU3RhdGVgLCB3aGljaCBsYWdzIGR1cmluZyBhc3luYyBwbGF5KCkgLyBwYXVzZSgpIHRyYW5zaXRpb25zLlxuICAgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd291bGQsIG9uIGEgcmFwaWQgc2Vjb25kIGNsaWNrIGR1cmluZyB0aGUgfjUwLTIwMG1zXG4gICAqIGB2aWRlby5wbGF5KClgIGF3YWl0IHdpbmRvdywgc2VlIGBwbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnYCBhbmQgcXVldWUgYW5vdGhlclxuICAgKiBgcGxheVZpZGVvKClgIGluc3RlYWQgb2YgdGhlIGludGVuZGVkIGBwYXVzZVZpZGVvKClgIOKAlCBzbyB0aGUgc2Vjb25kIGNsaWNrXG4gICAqIHNpbGVudGx5IFwiZGlkIG5vdGhpbmdcIiB3aGlsZSB0aGUgdmlkZW8ga2VwdCBwbGF5aW5nLiBSZWFkaW5nIGB2aWRlby5wYXVzZWRgXG4gICAqIGRpcmVjdGx5IG1ha2VzIHRoZSB0b2dnbGUgY29ycmVjdCByZWdhcmRsZXNzIG9mIHdoYXQgc3RhZ2UgdGhlIHN0YXRlIG1hY2hpbmVcbiAgICogaGFwcGVucyB0byBiZSBpbi5cbiAgICovXG4gIHRvZ2dsZVBsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnLCB7XG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgc291cmNlXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWRlb1VybCB8fCB2aWRlby5uZXR3b3JrU3RhdGUgPT09IEhUTUxNZWRpYUVsZW1lbnQuTkVUV09SS19OT19TT1VSQ0UgfHwgdmlkZW8uZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IG5vIHZhbGlkIHNvdXJjZScsIHtcbiAgICAgICAgY3VycmVudFZpZGVvVXJsOiB0aGlzLmN1cnJlbnRWaWRlb1VybCxcbiAgICAgICAgbmV0d29ya1N0YXRlOiB2aWRlby5uZXR3b3JrU3RhdGUsXG4gICAgICAgIGVycm9yOiB2aWRlby5lcnJvclxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXJyb3Igc3RhdGUgc28gdGhlIG5leHQgcGxheSBhdHRlbXB0IGNhbiBwcm9jZWVkLlxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHBsYXllciBpbiBlcnJvciBzdGF0ZScsIHsgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZSB9KTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgdmlkZW9QYXVzZWQ6IHZpZGVvLnBhdXNlZCxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIEdyb3VuZCB0cnV0aDogaWYgdGhlIHZpZGVvIGVsZW1lbnQgaXMgcGF1c2VkIChvciBoYXNuJ3Qgc3RhcnRlZCB5ZXQpLCBwbGF5OyBlbHNlIHBhdXNlLlxuICAgIC8vIFRoZSBvcGVyYXRpb24gcXVldWUgc2VyaWFsaXplcyB0aGVzZSBzbyBiYWNrLXRvLWJhY2sgY2xpY2tzIHJlc29sdmUgaW4gb3JkZXIuXG4gICAgaWYgKHZpZGVvLnBhdXNlZCkge1xuICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gIFNIT1cgUExBWSBQQVVTRSBPVkVSTEFZXG4gIG9uVmlkZW9GcmFtZUNsaWNrKCk6IHZvaWQge1xuICAgIC8vIFBpbiB0aGUgb3ZlcmxheSBpY29uIHRvIHRoZSB1c2VyJ3MgSU5URU5UIGZvciB0aGlzIGNsaWNrICh0aGUgYWN0aW9uIGp1c3QgdGFrZW4pLFxuICAgIC8vIGluZGVwZW5kZW50IG9mIGhvdyB0aGUgYXN5bmMgcGxheS9wYXVzZSByZXNvbHZlcy4gUHJldmVudHMgZmxpY2tlciB3aGVyZSB0aGUgaWNvblxuICAgIC8vIGJyaWVmbHkgc2hvd3MgdGhlIHByZS1jbGljayBzdGF0ZSBiZWZvcmUgZmxpcHBpbmcgd2hlbiBgaXNQbGF5aW5nYCB1cGRhdGVzLlxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHdhc1BhdXNlZCA9IHZpZGVvID8gdmlkZW8ucGF1c2VkIDogIXRoaXMuaXNQbGF5aW5nO1xuICAgIC8vIFlvdVR1YmUgY29udmVudGlvbjogYWZ0ZXIgY2xpY2tpbmcgdG8gUExBWSwgc2hvdyDilrYgKFwianVzdCBwbGF5ZWRcIik7IGFmdGVyIFBBVVNFLFxuICAgIC8vIHNob3cg4oilLiBUZW1wbGF0ZSBicmFuY2hlcyBvbiBgb3ZlcmxheVNob3dzUGxheWluZ0ljb25gIHNvIGl0IHN0YXlzIHN0YWJsZSBmb3JcbiAgICAvLyB0aGUgZW50aXJlIDUwMG1zIG92ZXJsYXkgbGlmZXRpbWUuXG4gICAgdGhpcy5vdmVybGF5U2hvd3NQbGF5aW5nSWNvbiA9IHdhc1BhdXNlZDtcblxuICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSB0cnVlO1xuICAgIGlmICh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucGxheVBhdXNlT3ZlcmxheVRpbWVyKTtcbiAgICB0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93UGxheVBhdXNlT3ZlcmxheSA9IGZhbHNlO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGxheVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBlbGltaW5hdGVzIEZGbXBlZ0RlbXV4ZXIgZXJyb3JzIGFuZCBwbGF5IHByb21pc2UgaW50ZXJydXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwbGF5VmlkZW9JbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IHBsYXlpbmcgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBsYXlpbmcsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBzdGFydGluZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCBmb3IgdmlkZW8gdG8gYmUgcmVhZHkgaWYgbmVlZGVkXG4gICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogd2FpdGluZyBmb3IgbWV0YWRhdGEnKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbyBtZXRhZGF0YScpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgaGl0IG1hcmtlcnMgaWYgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmdcbiAgICBjb25zdCBjdXJyZW50VGltZU1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuICAgIGlmIChjdXJyZW50VGltZU1zIDwgMTAwKSB7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdGUgdG8gbG9hZGluZ1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGJlZm9yZSBwbGF5aW5nXG4gICAgICBjb25zdCBjdXJyZW50VmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWN1cnJlbnRWaWRlbyB8fCBjdXJyZW50VmlkZW8gIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBvciB1bmF2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF3YWl0IHBsYXkgcHJvbWlzZSAtIHRoaXMgaXMgY3JpdGljYWxcbiAgICAgIGF3YWl0IHZpZGVvLnBsYXkoKTtcbiAgICAgIFxuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHBsYXkgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgY29uc3QgdmlkZW9BZnRlclBsYXkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJQbGF5IHx8IHZpZGVvQWZ0ZXJQbGF5ICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIHBsYXknKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQbGF5IHN1Y2NlZWRlZFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHBsYXlpbmcgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICB9KTtcbiAgICAgICAgXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nICYmIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIHYuY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBQbGF5IGZhaWxlZFxuICAgICAgLy8gQ2hlY2sgaWYgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJFcnJvciA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlckVycm9yIHx8IHZpZGVvQWZ0ZXJFcnJvciAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBlcnJvcicpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhYm9ydGVkIChleHBlY3RlZCBkdXJpbmcgcGF1c2UpJyk7XG4gICAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQsIHJlc2V0IHRvIHBhdXNlZCBzdGF0ZSBpbnN0ZWFkIG9mIGVycm9yXG4gICAgICAgIGlmICh2aWRlb0FmdGVyRXJyb3IgJiYgdmlkZW9BZnRlckVycm9yID09PSB2aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBhdXNlVmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXVzZVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgLy8gQWxyZWFkeSBwYXVzZWQgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBhdXNlZCwgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzaW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcblxuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBtZWRpYSBvcGVyYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyB0aGUgQ1JJVElDQUwgZml4IGZvciBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICogQWxsIG1lZGlhIG9wZXJhdGlvbnMgKHBsYXksIHBhdXNlLCBzZWVrLCBzd2l0Y2gpIGdvIHRocm91Z2ggdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgPSB0aGlzLm9wZXJhdGlvblF1ZXVlXG4gICAgICAudGhlbigoKSA9PiBvcGVyYXRpb24oKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBNZWRpYSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgaGFzTXVsdGlwbGVWaWRlb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIFttc10uIHNlZ21lbnRCb3VuZGFyaWVzW2ldID0gc3VtIG9mIGR1cmF0aW9ucyBbMC4uaV0gKi9cbiAgZ2V0IHNlZ21lbnRCb3VuZGFyaWVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRhcmllczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgZHVyYXRpb25zKSB7XG4gICAgICBzdW0gKz0gZDtcbiAgICAgIGJvdW5kYXJpZXMucHVzaChzdW0pO1xuICAgIH1cbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKiBUb3RhbCBkdXJhdGlvbiBhY3Jvc3MgYWxsIHNlZ21lbnRzIGluIG1zICovXG4gIGdldCB0b3RhbER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG4gIC8qKiBWaWRlbyBkdXJhdGlvbnMgaW4gbXMgKGRldGVjdGVkIG9yIGZyb20gc2luZ2xlIHZpZGVvIGVsZW1lbnQpLlxuICAgKlxuICAgKiAgTWVyZ2VzIHR3byBpbmRlcGVuZGVudCBwcm9iZXM6IGBkZXRlY3RlZFZpZGVvRHVyYXRpb25zYCAob2ZmLURPTSB0ZW1wIHZpZGVvcylcbiAgICogIGFuZCBgbGlicmFyeVZpZGVvRHVyYXRpb25zYCAodGhlIHJlbmRlcmVkIGxpYnJhcnkgdGh1bWJuYWlscykuIEVpdGhlciBjYW5cbiAgICogIHJlc29sdmUgZmlyc3QgZGVwZW5kaW5nIG9uIGJyb3dzZXIgcXVpcmtzIHdpdGggV2ViTS9JbmZpbml0eS1kdXJhdGlvbiBjbGlwcztcbiAgICogIHdlIHRha2UgdGhlIGZpcnN0IGZpbml0ZSB2YWx1ZSBwZXIgaW5kZXguICovXG4gIHByaXZhdGUgZ2V0IHZpZGVvRHVyYXRpb25zKCk6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgY29uc3QgdXJscyA9IHRoaXMudmlkZW9VcmxzIHx8IFtdO1xuICAgICAgaWYgKHVybHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICBjb25zdCBtZXJnZWQ6IG51bWJlcltdID0gbmV3IEFycmF5KHVybHMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkZXRlY3RlZCA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXRlY3RlZCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZGV0ZWN0ZWQpICYmIGRldGVjdGVkID4gMCkge1xuICAgICAgICAgIG1lcmdlZFtpXSA9IGRldGVjdGVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyb21MaWJyYXJ5UyA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tTGlicmFyeVMgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGZyb21MaWJyYXJ5UykgJiYgZnJvbUxpYnJhcnlTID4gMCkge1xuICAgICAgICAgIG1lcmdlZFtpXSA9IGZyb21MaWJyYXJ5UyAqIDEwMDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW5rbm93biB5ZXQg4oCUIGxlYXZlIHRoZSBzbG90IGFzIGEgaG9sZSBzbyBjYWxsZXJzIGNhbiBkZXRlY3QgcGFydGlhbCBzdGF0ZS5cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh2aWRlbz8uZHVyYXRpb24gJiYgaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSB7XG4gICAgICByZXR1cm4gW3ZpZGVvLmR1cmF0aW9uICogMTAwMF07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VmlkZW9NYXJrZXJzKCk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgbGV0IG1hcmtlcnNUb1Byb2Nlc3M6IFN0ZXBNYXJrZXJbXTtcbiAgICBcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID09PSAwIHx8IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPj0gYm91bmRhcmllcy5sZW5ndGgpIHtcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50Qm91bmRhcnkgPSBib3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXhdO1xuICAgICAgICBcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnNcbiAgICAgICAgICAuZmlsdGVyKG1hcmtlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSBjdXJyZW50Qm91bmRhcnkuc3RhcnQgJiYgXG4gICAgICAgICAgICAgICAgICAgbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA8IGN1cnJlbnRCb3VuZGFyeS5lbmQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKG1hcmtlciA9PiB0aGlzLmFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihcbiAgICAgICAgICAgIG1hcmtlciwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuc3RhcnQsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5lbmRcbiAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbk1hcmtlcnMobWFya2Vyc1RvUHJvY2Vzcyk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihtYXJrZXI6IFN0ZXBNYXJrZXIsIGFkanVzdG1lbnQ6IG51bWJlciwgdmlkZW9TdGFydDogbnVtYmVyLCB2aWRlb0VuZDogbnVtYmVyKTogU3RlcE1hcmtlciB7XG4gICAgY29uc3QgYWRqdXN0ZWRNYXJrZXI6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAuLi5tYXJrZXIsXG4gICAgICBjdW11bGF0aXZlRHVyYXRpb246IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gLSBhZGp1c3RtZW50XG4gICAgfTtcbiAgICBcbiAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgYWRqdXN0ZWRNYXJrZXIuY2hpbGRTdGVwcyA9IG1hcmtlci5jaGlsZFN0ZXBzXG4gICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgIC5tYXAoY2hpbGQgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2hpbGQ6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAgICAgICAuLi5jaGlsZCxcbiAgICAgICAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNoaWxkLmNoaWxkU3RlcHMgJiYgY2hpbGQuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZGp1c3RlZENoaWxkLmNoaWxkU3RlcHMgPSBjaGlsZC5jaGlsZFN0ZXBzXG4gICAgICAgICAgICAgIC5maWx0ZXIobmVzdGVkQ2hpbGQgPT4gbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgICAgICAgIC5tYXAobmVzdGVkQ2hpbGQgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obmVzdGVkQ2hpbGQsIGFkanVzdG1lbnQsIHZpZGVvU3RhcnQsIHZpZGVvRW5kKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhZGp1c3RlZENoaWxkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGFkanVzdGVkTWFya2VyO1xuICB9XG5cbiAgZ2V0U3RlcExlZnRQb3NpdGlvbihzdGVwOiBTdGVwTWFya2VyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuIDA7XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICByZXR1cm4gKHN0ZXAuY3VtdWxhdGl2ZUR1cmF0aW9uIC8gZHVyYXRpb25NcykgKiAxMDA7XG4gIH1cblxuICAvKiogRnVsbC12aWRlbyBtYXJrZXJzOiBldmVyeSBtYXJrZXIsIGZsYXR0ZW5lZCwgbGFpZCBvdXQgb24gdGhlIGdsb2JhbCB0aW1lbGluZS5cbiAgICogYHN0ZXBNYXJrZXJzYCBpcyBhbHJlYWR5IGluIGdsb2JhbCBjb29yZGluYXRlcyDigJQgYGN1cnJlbnRWaWRlb01hcmtlcnNgIGRvZXMgdGhlXG4gICAqIGludmVyc2UgKGZpbHRlcnMgKyBhZGp1c3RzIHBlci1jbGlwKTsgaGVyZSB3ZSBqdXN0IGZsYXR0ZW4gdGhlIG9yaWdpbmFsIGxpc3QuICovXG4gIGdldCBmdWxsVmlkZW9NYXJrZXJzKCk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbk1hcmtlcnModGhpcy5zdGVwTWFya2VycyB8fCBbXSk7XG4gIH1cblxuICBnZXRHbG9iYWxGdWxsU3RlcExlZnRQb3NpdGlvbihzdGVwOiBTdGVwTWFya2VyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICBpZiAoIXRvdGFsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoc3RlcC5jdW11bGF0aXZlRHVyYXRpb24gLyB0b3RhbCkgKiAxMDApKTtcbiAgfVxuXG4gIC8qKiBDdW11bGF0aXZlIGVsYXBzZWQgbXMgb24gdGhlIGdsb2JhbCB0aW1lbGluZSAocHJpb3IgY2xpcCBkdXJhdGlvbnMgKyBjdXJyZW50IGxvY2FsIHRpbWUpLiAqL1xuICBnZXQgZ2xvYmFsQ3VycmVudFRpbWVNcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGxvY2FsID0gKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgPz8gMCkgKiAxMDAwO1xuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgIGNvbnN0IHByaW9yRW5kID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDAgPyAoYm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCkgOiAwO1xuICAgIHJldHVybiBwcmlvckVuZCArIGxvY2FsO1xuICB9XG5cbiAgLyoqIDAtMTAwIHBvc2l0aW9uIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUsIGRyaXZlbiBieSB0aW1ldXBkYXRlLiAqL1xuICBnZXQgZ2xvYmFsUHJvZ3Jlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICBpZiAoIXRvdGFsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodGhpcy5nbG9iYWxDdXJyZW50VGltZU1zIC8gdG90YWwpICogMTAwKSk7XG4gIH1cblxuICAvKiogV2hpbGUgZHJhZ2dpbmcgaW4gZnVsbCBtb2RlLCB0aGUgc2NydWJiZXIgcmVhZHMgdGhlIG92ZXJyaWRlOyBvdGhlcndpc2UgZ2xvYmFsUHJvZ3Jlc3MuICovXG4gIGdldCBnbG9iYWxTY3J1YmJlclBlcmNlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2luZyA/IHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzIDogdGhpcy5nbG9iYWxQcm9ncmVzcztcbiAgfVxuXG4gIGdldFN0ZXBDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5sZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjNjM2NkYxJztcbiAgfVxuXG4gIGdldFN0ZXBSZXN1bHRDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihzdGVwLnJlc3VsdCk7XG4gIH1cblxuICBnZXRHbG9iYWxNYXJrZXJDb2xvcihsZXZlbD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxldmVsID09PSAxID8gJyMwMDAwMDAnIDogJyNGRkE1MDAnO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IocmVzdWx0OiBTdGVwTWFya2VyWydyZXN1bHQnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgIGNhc2UgJ1NVQ0NFU1MnOlxuICAgICAgICByZXR1cm4gJyMxMkI3NkEnO1xuICAgICAgY2FzZSAnRkFJTFVSRSc6XG4gICAgICAgIHJldHVybiAnI0I5MUMxQyc7XG4gICAgICBjYXNlICdBQk9SVEVEJzpcbiAgICAgICAgcmV0dXJuICcjRjc5MDA5JztcbiAgICAgIGNhc2UgJ1NLSVBQRUQnOlxuICAgICAgICByZXR1cm4gJyM2NjcwODUnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcjNjM2NkYxJztcbiAgICB9XG4gIH1cblxuICBvbk1hcmtlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBtYXJrZXI6IFN0ZXBNYXJrZXIpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbjtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChtYXJrZXIudGVzdFN0ZXBJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5hZGQobWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICB0aGlzLm1hcmtlckhpdC5lbWl0KG1hcmtlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMuY3VycmVudFZpZGVvSW5kZXgsIDApLCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0aGlzLnZpZGVvVXJsc1tpZHhdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWRlb1VybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcmVzZXRWaWRlb1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogcmVzZXR0aW5nJyk7XG5cbiAgICB2aWRlby5wYXVzZSgpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gLTE7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogY29tcGxldGUnKTtcbiAgfVxuXG4gIHByZXZWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDEpKTtcbiAgICB9XG4gIH1cblxuICBvblRpbWVsaW5lQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpY2tYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgY2xpY2tYIC8gcmVjdC53aWR0aCkpO1xuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICAgIGlmICghdG90YWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcbiAgICAgIGNvbnN0IHRhcmdldEdsb2JhbE1zID0gcGVyY2VudCAqIHRvdGFsO1xuICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vlayh0YXJnZXRHbG9iYWxNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMjApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IHBlcmNlbnQgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVGltZWxpbmVDbGljaycsIHtcbiAgICAgIHBlcmNlbnQsXG4gICAgICB0YXJnZXRUaW1lTXMsXG4gICAgICBzaG91bGRSZXN1bWVQbGF5aW5nXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0RHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENhcHR1cmUgcGxheWluZyBzdGF0ZSBCRUZPUkUgcGF1c2luZ1xuICAgIC8vIFVzZSBib3RoIGlzUGxheWluZyBmbGFnIGFuZCBwbGF5ZXJTdGF0ZSBmb3IgcmVsaWFiaWxpdHlcbiAgICB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnID0gdGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdGFydERyYWcnLCB7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgd2FzUGxheWluZ0JlZm9yZURyYWc6IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWdcbiAgICB9KTtcbiAgICBcbiAgICAvLyBQYXVzZSB2aWRlbyBkdXJpbmcgZHJhZyB0byBhdm9pZCBjb25mbGljdHNcbiAgICBpZiAodGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5hZGREcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvbkRyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgfHwgIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHggLyByZWN0LndpZHRoLCAxKSk7XG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IHBlcmNlbnQgKiAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwOyAvLyBQZXItY2xpcCB0aW1lbGluZSBwb3NpdGlvblxuICAgIH1cbiAgfVxuXG4gIHN0b3BEcmFnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuXG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IGRyYWcgZW5kZWQnLCB7XG4gICAgICBwcm9ncmVzczogdGhpcy5wcm9ncmVzcyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZzogc2hvdWxkUmVzdW1lUGxheWluZyxcbiAgICAgIGN1cnJlbnRQbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICAgIGlmICghdG90YWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHRhcmdldEdsb2JhbE1zID0gKHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzIC8gMTAwKSAqIHRvdGFsO1xuICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vlayh0YXJnZXRHbG9iYWxNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9ICh0aGlzLnByb2dyZXNzIC8gMTAwKSAqIHZpZGVvLmR1cmF0aW9uICogMTAwMDtcblxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgXG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHJlc3VtaW5nIHBsYXliYWNrIGFmdGVyIHNlZWsnLCB7XG4gICAgICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBhIGJpdCBsb25nZXIgdG8gZW5zdXJlIHNlZWsgaXMgZnVsbHkgY29tcGxldGVcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDE1MCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IHN0YXRlIGlzICdwYXVzZWQnIGFmdGVyIHNlZWsgKHNlZWtUb1RpbWVJbnRlcm5hbCBzZXRzIGl0IHRvICdwYXVzZWQnKVxuICAgICAgICAvLyBJZiBzdGF0ZSBpcyBzdGlsbCAnc2Vla2luZycsIHdhaXQgYSBiaXQgbW9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBzZWVrIHN0aWxsIGluIHByb2dyZXNzLCB3YWl0aW5nIG1vcmUnKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE5vdyByZXN1bWUgcGxheWJhY2sgKHN0YXRlIHNob3VsZCBiZSAncGF1c2VkJyBhdCB0aGlzIHBvaW50KVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBwbGF5YmFjayByZXN1bWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gc3RvcERyYWc6IHVuZXhwZWN0ZWQgc3RhdGUgYWZ0ZXIgc2VlaywgYXR0ZW1wdGluZyB0byByZXN1bWUgYW55d2F5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBUcnkgdG8gcmVzdW1lIGFueXdheSAtIGJldHRlciB0byB0cnkgdGhhbiB0byBsZWF2ZSBpdCBzdHVja1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB2aWRlbyB3YXMgcGF1c2VkLCBub3QgcmVzdW1pbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkRyYWcoZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvblZpZGVvTWV0YWRhdGFMb2FkZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCcpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cbiAgXG4gIG9uVmlkZW9DYW5QbGF5KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvQ2FuUGxheScpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBDb25zdW1lIGFueSBwZW5kaW5nIHJlY292ZXJ5IHN0YXRlIHF1ZXVlZCBieSBvblZpZGVvRXJyb3IoKTogc2VlayBiYWNrIHRvXG4gICAgLy8gd2hlcmUgcGxheWJhY2sgZXJyb3JlZCBhbmQgYXV0by1yZXN1bWUgaWYgd2Ugd2VyZSBwbGF5aW5nIGF0IHRoZSB0aW1lLlxuICAgIGlmICh0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2Vla1NlYyA9IHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYztcbiAgICAgIGNvbnN0IHNob3VsZFBsYXkgPSB0aGlzLnBlbmRpbmdSZWNvdmVyeVBsYXk7XG4gICAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlQbGF5ID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvICYmIGlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vla1NlYywgdmlkZW8uZHVyYXRpb24pKTtcbiAgICAgICAgfSBjYXRjaCAoXykgeyAvKiBlbGVtZW50IG1heSBub3QgYmUgc2Vla2FibGUgeWV0OyBoYXJtbGVzcyAqLyB9XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA4MCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIE5hdGl2ZSBlcnJvci1ldmVudCBoYW5kbGVyIGZvciB0aGUgbWFpbiA8dmlkZW8+IGVsZW1lbnQuIFRoZSBDaHJvbWUgbWVkaWFcbiAgICogc3RhY2sgb2NjYXNpb25hbGx5IHRocm93cyBcIlBpcGVsaW5lU3RhdHVzOjpQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyOlxuICAgKiBkYXRhIHNvdXJjZSBlcnJvclwiIGR1cmluZyBwbGF5YmFjayBhZnRlciBhIGJyaWVmIG5ldHdvcmsgYmxpcCBvciBhIGJ1cnN0IG9mXG4gICAqIGZhc3QgdXNlciBhY3Rpb25zOyBvbmNlIHRoYXQgaGFwcGVucyB0aGUgZWxlbWVudCBiZWNvbWVzIHVucmVzcG9uc2l2ZSB0b1xuICAgKiBwbGF5L3BhdXNlL3NlZWsuIFdlIHJlY292ZXIgYnkgdW5tb3VudGluZytyZW1vdW50aW5nIHRoZSA8dmlkZW8+IHZpYSAqbmdJZlxuICAgKiDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kXG4gICAqIHdvcmsgdG9kYXkg4oCUIHRoZW4gcmVzdG9yZSB0aGUgcHJlLWVycm9yIHBsYXloZWFkIGFuZCByZXN1bWUgcGxheWJhY2suICovXG4gIG9uVmlkZW9FcnJvcigpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlcnIgPSB2aWRlbz8uZXJyb3I7XG5cbiAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBvblZpZGVvRXJyb3Ig4oCUIHRyaWdnZXJpbmcgYXV0by1yZWNvdmVyeScsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgZXJyb3JDb2RlOiBlcnI/LmNvZGUsXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycj8ubWVzc2FnZSxcbiAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8/Lm5ldHdvcmtTdGF0ZSxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvPy5yZWFkeVN0YXRlLFxuICAgICAgY3VycmVudFZpZGVvSW5kZXg6IHRoaXMuY3VycmVudFZpZGVvSW5kZXgsXG4gICAgICBjdXJyZW50VmlkZW9Vcmw6IHRoaXMuY3VycmVudFZpZGVvVXJsLFxuICAgICAgYXR0ZW1wdHM6IHRoaXMucmVjb3ZlcnlBdHRlbXB0c1xuICAgIH0pO1xuXG4gICAgLy8gQm91bmQgdGhlIHJldHJ5IGJ1ZGdldCB0byBhIHJvbGxpbmcgd2luZG93IHNvIGEgcGVyc2lzdGVudGx5IGJyb2tlblxuICAgIC8vIHNvdXJjZSAoNDA0LCB1bnN1cHBvcnRlZCBjb2RlYywg4oCmKSBkb2Vzbid0IGZsYXAgZm9yZXZlci5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3cgLSB0aGlzLnJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0ID4gdGhpcy5SRUNPVkVSWV9XSU5ET1dfTVMpIHtcbiAgICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0ID0gbm93O1xuICAgIH1cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMrKztcbiAgICBpZiAodGhpcy5yZWNvdmVyeUF0dGVtcHRzID4gdGhpcy5NQVhfUkVDT1ZFUllfQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIG9uVmlkZW9FcnJvcjogZXhjZWVkZWQgcmVjb3ZlcnkgYXR0ZW1wdHMsIGdpdmluZyB1cCcpO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIHdoYXQgd2UgbmVlZCB0byByZXN0b3JlIGFmdGVyIHRoZSByZW1vdW50LlxuICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYyA9ICh2aWRlbyAmJiBpc0Zpbml0ZSh2aWRlby5jdXJyZW50VGltZSkpID8gdmlkZW8uY3VycmVudFRpbWUgOiAwO1xuICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5UGxheSA9IHRoaXMuaXNQbGF5aW5nO1xuXG4gICAgLy8gUHV0IHRoZSBzdGF0ZSBtYWNoaW5lIGludG8gJ2Vycm9yJyBzbyBvblZpZGVvRWxlbWVudFJlYWR5IHJlc2V0cyBpdFxuICAgIC8vIGJhY2sgdG8gJ2lkbGUnIHdoZW4gdGhlIHJlbW91bnRlZCBlbGVtZW50IGFycml2ZXMuXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gVW5tb3VudCDihpIgcmVtb3VudC4gQnJpZWYgMTAwbXMgZ2FwIG1pcnJvcnMgdGhlIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZC5cbiAgICB0aGlzLnZpZGVvUmVmcmVzaGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZpZGVvUmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uVmlkZW9FbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgLy8gU3dpdGNoIHRvIG5leHQgdmlkZW8gYW5kIGF1dG8tcGxheSBpdFxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMTtcblxuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChuZXh0SW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5jdXJyZW50VmlkZW9VcmwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgMTAwKSByZXR1cm47XG5cbiAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcbiAgICAgICAgY29uc3QgY3VycmVudE1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuXG4gICAgICAgIC8vIFNhZmV0eSBuZXQ6IGlmIGBpc1BsYXlpbmdgIGRyaWZ0ZWQgZnJvbSB0aGUgZWxlbWVudCdzIGFjdHVhbCBzdGF0ZVxuICAgICAgICAvLyAoZS5nLiBhIHF1ZXVlZCBvcCBzZXQgaXQgZmFsc2UgYnV0IHBsYXliYWNrIG5ldmVyIGFjdHVhbGx5IHN0b3BwZWQsXG4gICAgICAgIC8vIG9yIHRoZSBwbGF5IHByb21pc2UgaGFzbid0IHJlc29sdmVkIHlldCBidXQgYHBsYXlgIGZpcmVkKSwgcmVhbGlnblxuICAgICAgICAvLyBoZXJlIHNvIHRoZSB0b29sYmFyIFBsYXkvUGF1c2UgaWNvbiBkb2Vzbid0IGdldCBzdHVjayBvbiB0aGUgd3JvbmdcbiAgICAgICAgLy8gZ2x5cGggd2hpbGUgcGxheWJhY2sgY29udGludWVzLlxuICAgICAgICBjb25zdCB2aWRlb0lzUGxheWluZyA9ICF2aWRlby5wYXVzZWQ7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAhPT0gdmlkZW9Jc1BsYXlpbmcpIHtcbiAgICAgICAgICB0aGlzLmlzUGxheWluZyA9IHZpZGVvSXNQbGF5aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdzd2l0Y2hpbmcnKSB7XG4gICAgICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzICgwLTEwMCUgb2YgY3VycmVudCB2aWRlbylcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKGN1cnJlbnRNcyAvIGR1cmF0aW9uTXMpICogMTAwKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBjdW11bGF0aXZlIHRpbWUgZm9yIHBhcmVudCAoc3RlcCBoaWdobGlnaHRpbmcpXG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuXG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIHRoaXMubWF5YmVQcmVsb2FkTmV4dFNlZ21lbnQoKTtcblxuICAgICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRoZSBsaWJyYXJ5IHJvdyBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBzdGF5cyB2aXNpYmxlLlxuICAgICAgICAgIC8vIE9ubHkgd2hpbGUgcGxheWluZzsgd2hlbiBwYXVzZWQgd2UgbGVhdmUgdGhlIHJvdyB3aGVyZSB0aGUgdXNlciBsZWZ0IGl0LlxuICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4O1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDdXJyZW50Q2xpcEludG9WaWV3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBNaXJyb3IgdGhlIDx2aWRlbz4gZWxlbWVudCdzIG5hdGl2ZSBzdGF0ZSBpbnRvIGBpc1BsYXlpbmdgLiBUaGUgZWxlbWVudFxuICAgICAgLy8gaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCDigJQgdGhlIGV4aXN0aW5nIHBsYXlWaWRlb0ludGVybmFsIC8gcGF1c2VWaWRlb0ludGVybmFsXG4gICAgICAvLyBwYXRocyBzZXQgYGlzUGxheWluZ2AgYWZ0ZXIgdGhlaXIgYXN5bmMgd29yaywgYnV0IG90aGVyIHBhdGhzIChlbGVtZW50XG4gICAgICAvLyByZW1vdW50cyB2aWEgb25WaWRlb0VsZW1lbnRSZWFkeSwgZHJvcHBlZCBxdWV1ZSBvcHMsIGV0Yy4pIGNhbiBsZWF2ZSBpdFxuICAgICAgLy8gb3V0IG9mIHN5bmMgd2l0aCByZWFsaXR5LiBUaGVzZSBsaXN0ZW5lcnMgbWFrZSB0aGUgZmllbGQgc2VsZi1jb3JyZWN0aW5nLlxuICAgICAgY29uc3Qgb25QbGF5ID0gKCkgPT4geyB0aGlzLmlzUGxheWluZyA9IHRydWU7IH07XG4gICAgICBjb25zdCBvblBhdXNlID0gKCkgPT4geyB0aGlzLmlzUGxheWluZyA9IGZhbHNlOyB9O1xuXG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5Jywgb25QbGF5KTtcbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCBvblBsYXkpO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcblxuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCBvblBsYXkpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgb25QbGF5KTtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGEuXG4gICAqXG4gICAqIEJyb3dzZXItcmVjb3JkZWQgV2ViTSBjbGlwcyBmcmVxdWVudGx5IHJlcG9ydCBgZHVyYXRpb24gPT09IEluZmluaXR5YCBvbiB0aGUgZmlyc3RcbiAgICogYGxvYWRlZG1ldGFkYXRhYCBmaXJpbmc7IHRoZSByZWFsIGR1cmF0aW9uIG9ubHkgcmVzb2x2ZXMgYWZ0ZXIgc2Vla2luZyBwYXN0IHRoZSBlbmRcbiAgICogKHNhbWUgdHJpY2sgYG9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZGAgdXNlcyBmb3IgdGhlIGxpYnJhcnkgdGh1bWJuYWlscykuIFdlIG1pcnJvclxuICAgKiB0aGF0IHByb2JlIGhlcmUgc28gYGRldGVjdGVkVmlkZW9EdXJhdGlvbnNgIGVuZHMgdXAgZGVuc2UgYW5kIGB0b3RhbER1cmF0aW9uYCBpc1xuICAgKiBjb3JyZWN0IGluIEZ1bGwgVmlkZW8gbW9kZS5cbiAgICpcbiAgICogUHJlc2VydmVzIHByZXZpb3VzbHktZGV0ZWN0ZWQgZW50cmllcyBvbiByZS1pbnZvY2F0aW9uIChhcHBlbmQtb25seSB2aWRlb1VybHNcbiAgICogY2hhbmdlcyBzaG91bGRuJ3Qgd2lwZSBmaW5pc2hlZCBkZXRlY3Rpb25zIGZyb20gZWFybGllciBjbGlwcykuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91c2x5LWRldGVjdGVkIHZhbHVlcyBmb3IgZXhpc3RpbmcgaW5kZXhlczsgdHJpbS9wYWQgdG8gY3VycmVudCBsZW5ndGguXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMuc2xpY2UoMCwgdmlkZW9VcmxzLmxlbmd0aCk7XG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gcHJldmlvdXM7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZXhpc3RpbmcpICYmIGV4aXN0aW5nID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcmVzb2x2ZWQgZm9yIHRoaXMgVVJMIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICB0ZW1wVmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgICAgKHRlbXBWaWRlbyBhcyBhbnkpLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgIC8vIENocm9tZSBpZ25vcmVzIGBjdXJyZW50VGltZSA9IE1BWF9TQUZFX0lOVEVHRVJgIG9uIGEgZGV0YWNoZWQgZWxlbWVudCwgc28gdGhlXG4gICAgICAvLyBgZHVyYXRpb25jaGFuZ2VgIGV2ZW50IG5ldmVyIGZpcmVzIGZvciBJbmZpbml0eS1kdXJhdGlvbiBXZWJNIGNsaXBzLiBBdHRhY2hcbiAgICAgIC8vIG9mZi1zY3JlZW4gKDHDlzEgaW52aXNpYmxlKSBzbyB0aGUgc2VlayBwcm9iZSBhY3R1YWxseSByZXNvbHZlcywgbWF0Y2hpbmdcbiAgICAgIC8vIHRoZSBsaWJyYXJ5IHRodW1ibmFpbHMnIGJlaGF2aW9yLlxuICAgICAgdGVtcFZpZGVvLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS53aWR0aCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICB0ZW1wVmlkZW8uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFZpZGVvKTtcbiAgICAgIGxldCBwcm9iZWQgPSBmYWxzZTtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0b3JlSWZWYWxpZCA9IChkOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkICogMTAwMDtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbk1ldGFkYXRhT3JDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGQgPSB0ZW1wVmlkZW8uZHVyYXRpb247XG4gICAgICAgIGlmIChkID09PSBJbmZpbml0eSAmJiAhcHJvYmVkKSB7XG4gICAgICAgICAgLy8gV2ViTSB3aXRoIHVua25vd24gZHVyYXRpb246IGZvcmNlIHRoZSBicm93c2VyIHRvIHJlc29sdmUgYnkgc2Vla2luZyB0byB0aGVcbiAgICAgICAgICAvLyBlbmQuIFRoZSBzdWJzZXF1ZW50IGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgcmVwb3J0cyB0aGUgcmVhbCB2YWx1ZS5cbiAgICAgICAgICBwcm9iZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0ZW1wVmlkZW8uY3VycmVudFRpbWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7IC8qIHNvbWUgYnJvd3NlcnMgdGhyb3cgYmVmb3JlIG1ldGFkYXRhIGlzIHJlYWR5ICovIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0b3JlSWZWYWxpZChkKSkge1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcblxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25NZXRhZGF0YU9yQ2hhbmdlKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBjYXB0dXJlVmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dDYXB0dXJlVmlkZW8gfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuaXNDYXB0dXJpbmdWaWRlbykgcmV0dXJuO1xuICAgIHRoaXMuY2FwdHVyZVZpZGVvUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDbGlwcyByb3cgZHJhZy10by1zY3JvbGwgKG1vdXNlIGVxdWl2YWxlbnQgb2YgdG91Y2gtc3dpcGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZXNpZ246IHRyYWNraW5nIHN0YXJ0cyBvbiBtb3VzZWRvd24gYnV0IHdlIERPTidUIGZsaXAgdG8gdGhlIFwiZHJhZ2dpbmdcIiB2aXN1YWwgc3RhdGVcbiAgLy8gb3IgYmxvY2sgY2xpY2tzIHVudGlsIHRoZSBwb2ludGVyIGNyb3NzZXMgYSA1cHggdGhyZXNob2xkLiBUaGF0IHdheSBhIHBsYWluIGNsaWNrXG4gIC8vIChubyBtb3ZlbWVudCkgcmVnaXN0ZXJzIG5vcm1hbGx5IG9uIHRoZSBjYXJkIC8gZG93bmxvYWQgYnV0dG9uIHdpdGggdGhlIHVzdWFsIGN1cnNvci5cbiAgb25DbGlwc01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhc2Nyb2xsZXIpIHJldHVybjtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFNjcm9sbExlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICB9XG5cbiAgb25DbGlwc01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nIHx8ICFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuY2xpcHNEcmFnU3RhdGUuc3RhcnRYO1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlICYmIE1hdGguYWJzKGR4KSA+IDUpIHtcbiAgICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSA9IHRydWU7XG4gICAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IHRydWU7IC8vIGZsaXAgdGhlIGdyYWJiaW5nIGN1cnNvciBub3cgdGhhdCBpdCdzIGEgcmVhbCBkcmFnXG4gICAgfVxuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0U2Nyb2xsTGVmdCAtIGR4O1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZVVwKF9ldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIC8vIEtlZXAgZGlkTW92ZT10cnVlIGJyaWVmbHkgc28gdGhlIHN5bnRoZXRpYyBjbGljayBmaXJlcyBhbmQgaXMgaWdub3JlZCwgdGhlbiByZXNldC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTsgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlwc01vdXNlTGVhdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpcHNNb3VzZVVwKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBDbGljayBoYW5kbGVyIG9uIGEgVmlkZW8gTGlicmFyeSBjYXJkIOKAlCBzd2l0Y2hlcyB0aGUgbWFpbiBwbGF5ZXIgdG8gdGhhdCBjbGlwIGFuZCBhdXRvLXBsYXlzLlxuICAgKiBTZWxlY3RpbmcgYSAqZGlmZmVyZW50KiBjbGlwIGFsc28gY29sbGFwc2VzIHRoZSBsaWJyYXJ5IHNvIHRoZSBuZXdseS1wbGF5aW5nIHZpZGVvIGlzIHVub2JzdHJ1Y3RlZDtcbiAgICogcmUtY2xpY2tpbmcgdGhlIGFjdGl2ZSBjbGlwIGp1c3QgdG9nZ2xlcyBwbGF5L3BhdXNlIGFuZCBrZWVwcyB0aGUgZHJhd2VyIHN0YXRlLlxuICAgKiBJZ25vcmVkIHdoZW4gdGhlIGNsaWNrIG9yaWdpbmF0ZWQgZnJvbSBhIGhvcml6b250YWwgZHJhZy1zY3JvbGwuICovXG4gIHNlbGVjdExpYnJhcnlDbGlwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuZGVsZXRlKGluZGV4KTtcblxuICAgIC8vIEZ1bGwtbW9kZTogc2VlayB0aGUgZ2xvYmFsIHRpbWVsaW5lIHRvIHRoaXMgY2xpcCdzIHN0YXJ0LiBLZWVwIGZ1bGwgbW9kZSBhbmRcbiAgICAvLyB0aGUgbGlicmFyeSBwYW5lbCBvcGVuIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGhpZ2hsaWdodCBmb2xsb3cgYWxvbmcuXG4gICAgLy8gSWYgdGhlIGNsaWNrZWQgY2FyZCBpcyB0aGUgb25lIGFscmVhZHkgcGxheWluZyB1bmRlciB0aGUgaG9vZCwgdHJlYXQgdGhlXG4gICAgLy8gY2xpY2sgYXMgYSBwbGF5L3BhdXNlIHRvZ2dsZSAodGhlIGNhcmQncyBvdmVybGF5IGljb24gcmVmbGVjdHMgdGhhdCBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSBpbmRleCA9PT0gMCA/IDAgOiAoYm91bmRhcmllc1tpbmRleCAtIDFdID8/IDApO1xuICAgICAgY29uc3Qgc2hvdWxkUmVzdW1lID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChpbmRleCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGVyLWNhcmQgbWV0YWRhdGEgaGFuZGxlciDigJQgY2FjaGVzIGR1cmF0aW9uIHNvIHRoZSBgMDo0MmAgdGh1bWJuYWlsIGxhYmVsIGNhbiByZW5kZXIuXG4gICAqIEJvdW5kIHRvIEJPVEggYGxvYWRlZG1ldGFkYXRhYCBhbmQgYGR1cmF0aW9uY2hhbmdlYDpcbiAgICogICAtIFNvbWUgTVA0cyAoZXNwLiBzaG9ydCBjbGlwcyB3aXRoIG1vb3YgYXQgdGhlIGVuZCkgcmVwb3J0IGEgd3JvbmcvcGFydGlhbCBkdXJhdGlvblxuICAgKiAgICAgb24gYGxvYWRlZG1ldGFkYXRhYDsgQ2hyb21lIGxhdGVyIGNvcnJlY3RzIGl0IHZpYSBgZHVyYXRpb25jaGFuZ2VgLiBMaXN0ZW5pbmcgdG9cbiAgICogICAgIGJvdGggKyBrZWVwaW5nIHRoZSBtYXgtc28tZmFyIGF2b2lkcyBzdGFsZSB3cm9uZyB2YWx1ZXMgbGlrZSBcIjAwOjAxXCIgZm9yIGEgNXMgY2xpcC5cbiAgICogICAtIEZvciBzdHJlYW1lZCBNUDRzIHRoYXQgcmVwb3J0IGBJbmZpbml0eWAsIHNlZWsgdG8gdGhlIGVuZCBvbmNlIHNvIENocm9tZSBmZXRjaGVzXG4gICAqICAgICB0aGUgY3Vlcy90cmFpbGVyIGFuZCBmaXJlcyBhIGNvcnJlY3RlZCBgZHVyYXRpb25jaGFuZ2VgLiAqL1xuICBvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaW5kZXg6IG51bWJlciwgdmlkZW9FbDogSFRNTFZpZGVvRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGQgPSB2aWRlb0VsPy5kdXJhdGlvbjtcbiAgICBpZiAoZCA9PT0gSW5maW5pdHkgJiYgIXZpZGVvRWwuZGF0YXNldFsnY3FhRHVyYXRpb25Qcm9iZWQnXSkge1xuICAgICAgdmlkZW9FbC5kYXRhc2V0WydjcWFEdXJhdGlvblByb2JlZCddID0gJzEnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmlkZW9FbC5jdXJyZW50VGltZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBzb21lIGJyb3dzZXJzIHRocm93IGJlZm9yZSBtZXRhZGF0YTsgaWdub3JlICovIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpbmRleCkgfHwgMDtcbiAgICAgIGlmIChkID4gcHJldikge1xuICAgICAgICB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5zZXQoaW5kZXgsIGQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFja0xpYnJhcnlDbGlwQnlJbmRleChpbmRleDogbnVtYmVyLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluZGV4ICsgJzonICsgKHVybCB8fCAnJyk7XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGNsaXAgYXQgYGluZGV4YC4gU3RyZWFtcyB0aGUgYnl0ZXMgd2l0aCBmZXRjaCBzbyB3ZSBjYW4gc2hvdyBwcm9ncmVzcyxcbiAgICogdGhlbiBzYXZlcyB2aWEgYSB0ZW1wb3JhcnkgYmxvYiBVUkwgc28gdGhlIGZpbGUgY29tZXMgZG93biBvbiB0aGUgc2FtZSBwYWdlXG4gICAqIChubyBuZXcgdGFiIC8gd2luZG93KS4gRmFsbHMgYmFjayB0byBhIGRpcmVjdCBhbmNob3IgY2xpY2sgaWYgZmV0Y2ggaXMgdW5hdmFpbGFibGUgb3IgZmFpbHMuICovXG4gIGFzeW5jIGRvd25sb2FkQ2xpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpID8gdGhpcy52aWRlb1VybHNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghdXJsIHx8IHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpbmRleCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kZXJpdmVDbGlwRmlsZW5hbWUodXJsLCBpbmRleCk7XG4gICAgdGhpcy5kb3dubG9hZGluZ0luZGV4ZXMuYWRkKGluZGV4KTtcbiAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3Muc2V0KGluZGV4LCAwKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCcgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWQgZmFpbGVkOiAnICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLnNldChpbmRleCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChyZWNlaXZlZCAvIHRvdGFsKSAqIDEwMCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGNodW5rcyBhcyBCbG9iUGFydFtdLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcbiAgICAgIHRoaXMuc2F2ZUJsb2JBc0Rvd25sb2FkKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyBDT1JTIGJsb2NrIG9yIG5ldHdvcmsgZmFpbHVyZSDigJQgZmFsbCBiYWNrIHRvIGEgZGlyZWN0IGFuY2hvciBjbGljayAobWF5IG9wZW4gaW4gYSBuZXcgdGFiXG4gICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHNlcnZlcidzIENvbnRlbnQtRGlzcG9zaXRpb24sIGJ1dCBhdCBsZWFzdCBhbHdheXMgdHJpZ2dlcnMgdGhlIGJyb3dzZXIncyBzYXZlIGZsb3cpLlxuICAgICAgdGhpcy50cmlnZ2VyRGlyZWN0RG93bmxvYWQodXJsLCBmaWxlbmFtZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlQ2xpcEZpbGVuYW1lKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IGxhc3QgPSAodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIHx8ICcnKS5zcGxpdCgnPycpWzBdO1xuICAgICAgaWYgKGxhc3QgJiYgL1xcLlthLXowLTldKyQvaS50ZXN0KGxhc3QpKSByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LSR7bGFzdH1gO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LndlYm1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQmxvYkFzRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICBhLnJlbCA9ICdub29wZW5lcic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCksIDIwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaXJjdW1mZXJlbmNlIG9mIHRoZSA2LXJhZGl1cyBwcm9ncmVzcyByaW5nIChzZWUgY2xpcC1kb3dubG9hZC1idG5fX3JpbmcgaW4gdGVtcGxhdGUpLiAqL1xuICByZWFkb25seSBkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlOiBudW1iZXIgPSAyICogTWF0aC5QSSAqIDY7XG5cbiAgLyoqIHN0cm9rZS1kYXNob2Zmc2V0IGZvciB0aGUgcHJvZ3Jlc3MgcmluZyBvZiBjbGlwIGBpbmRleGA7IDAgPSBmdWxsLCBjaXJjdW1mZXJlbmNlID0gZW1wdHkuICovXG4gIGRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGN0ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZ2V0KGluZGV4KSB8fCAwKSk7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZSAqICgxIC0gcGN0IC8gMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckRpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgIGEucmVsID0gJ25vb3BlbmVyJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICB9XG5cbiAgb25TaG93RnVsbFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VmlkZW9MaWJyYXJ5KSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCB0aGlzLnZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmlzVmlkZW9GdWxsTW9kZSA9IHRydWU7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gLTE7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoMCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkV4aXRGdWxsVmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvRnVsbE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSAtMTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCgwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIb3Jpem9udGFsbHkgc2Nyb2xscyB0aGUgYC5jbGlwcy1yb3dgIHNvIHRoZSBjdXJyZW50bHktcGxheWluZyBjbGlwIGNhcmQgaXNcbiAgICogaW4gdGhlIHZpc2libGUgc3RyaXAuIE5vLW9wIGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgb24gc2NyZWVuLiBDYWxsZXIgZ3VhcmRzXG4gICAqIG9uIGBpc1BsYXlpbmdgIHNvIHRoZSB1c2VyIGNhbiBmcmVlbHkgc2Nyb2xsIHRoZSByb3cgd2hpbGUgcGF1c2VkLiAqL1xuICBwcml2YXRlIHNjcm9sbEN1cnJlbnRDbGlwSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLmNsaXBzU2Nyb2xsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmRzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jbGlwLWNhcmQnKTtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWRkaW5nID0gODtcbiAgICBjb25zdCBjYXJkTGVmdCA9IGNhcmQub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjYXJkUmlnaHQgPSBjYXJkTGVmdCArIGNhcmQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgdmlld0xlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgc2Nyb2xsZXIuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoY2FyZExlZnQgPCB2aWV3TGVmdCArIHBhZGRpbmcpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvKHsgbGVmdDogTWF0aC5tYXgoMCwgY2FyZExlZnQgLSBwYWRkaW5nKSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FyZFJpZ2h0ID4gdmlld1JpZ2h0IC0gcGFkZGluZykge1xuICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG8oeyBsZWZ0OiBjYXJkUmlnaHQgLSBzY3JvbGxlci5jbGllbnRXaWR0aCArIHBhZGRpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVWaWRlb0xpYnJhcnlDb2xsYXBzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9ICF0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLWgtWzIxcHhdJztcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNFMEYyRkVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzdERDNGQ11gO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUYzQzddIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDRDM0RF1gO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVFMkUyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0E1QTVdYDtcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdYDtcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRDFGQUU1XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM2RUU3QjddYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMjAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzVGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzAyODRDN10gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0Q5NzcwNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwNTk2NjldIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS02MDAgY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICB9XG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkVHJhY2VVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICB0cmFjZTogdGhpcy50cmFjZVZpZXdVcmwsXG4gICAgICAgIGhpZGVIZWFkZXI6ICd0cnVlJyxcbiAgICAgICAgaGlkZUJyYW5kaW5nOiAndHJ1ZScsXG4gICAgICAgIGVtYmVkOiAndHJ1ZScsXG4gICAgICAgIG1pbmltYWw6ICd0cnVlJyxcbiAgICAgICAgbm9IZWFkZXI6ICd0cnVlJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBgaHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldi8/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy50cmFjZVZpZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNhZmVUcmFjZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnByb2Nlc3NlZFRyYWNlVXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gIH1cblxuICBvblRyYWNlVmlld2VyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgb25TcGVlZENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSB2YWx1ZTtcbiAgICAvLyBXaGVuZXZlciBzcGVlZCBjaGFuZ2VzLCBhcHBseSBpdCB0byB0aGUgY3VycmVudCB2aWRlb1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWVkQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9ICF0aGlzLmlzU3BlZWRDb250cm9sT3BlbjtcbiAgICBpZiAodGhpcy5pc1NwZWVkQ29udHJvbE9wZW4pIHtcbiAgICAgIHRoaXMuYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgXG4gICAgICAgICAgICAhdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgXTtcbiAgICBcbiAgICAvLyBPbmx5IGFkZCBWaWRlbyB0YWIgaWYgaGlkZVZpZGVvVGFiIGlzIGZhbHNlXG4gICAgaWYgKCF0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybCkge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1RyYWNlJywgdmFsdWU6ICd0cmFjZScsIGljb246ICdncmFwaGljX2VxJyB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWdtZW50cyA9IGJhc2VTZWdtZW50cztcbiAgICBcbiAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgJ3ZpZGVvJyBhbmQgdmlkZW8gdGFiIGlzIGhpZGRlbiwgc3dpdGNoIHRvIHNjcmVlbnNob3RzXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd2aWRlbycgJiYgdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnc2NyZWVuc2hvdHMnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25WaWRlb0VsZW1lbnRSZWFkeSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHZpZGVvIGVsZW1lbnQgcmVhZHknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBBbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiBhIHByaW9yIDx2aWRlbz4gZWxlbWVudCBpcyBkZWFkIG9uY2UgaXQgdW5tb3VudHNcbiAgICAvLyAoZS5nLiBsaXZlU2Vzc2lvblZpZXcgdG9nZ2xlZCBtaWQtc3dpdGNoIOKAlCB0aGUgZGV0YWNoZWQgZWxlbWVudCBuZXZlciBmaXJlc1xuICAgIC8vIGBsb2FkZWRtZXRhZGF0YWAgYW5kIGBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbGAgaGFuZ3MgZm9yZXZlciwgYmxvY2tpbmdcbiAgICAvLyB0aGUgb3BlcmF0aW9uUXVldWUgYmVoaW5kIGl0KS4gUmVzZXQgZnJvbSBldmVyeSB0cmFuc2llbnQgc3RhdGUgYW5kIGRyb3AgdGhlXG4gICAgLy8gc3R1Y2sgY2hhaW4gc28gc3Vic2VxdWVudCB0b2dnbGVQbGF5IC8gc2VlayAvIHN3aXRjaCBjYWxscyBhY3R1YWxseSBydW4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZydcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgc3R1Y2sgc3RhdGUnLCB0aGlzLnBsYXllclN0YXRlKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0YXJnZXRWaWRlb0luZGV4IDwgMCB8fCB0YXJnZXRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVzZXItaW5pdGlhdGVkIG5hdmlnYXRpb24g4oCUIHJlc2V0IHRoZSBhdXRvLXJlY292ZXJ5IHJldHJ5IGJ1ZGdldC5cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0V2luZG93U3RhcnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHRhcmdldFZpZGVvSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUxvYWRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2V0dGxlID0gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHNldHRsZShyZXNvbHZlKTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHNldHRsZSgoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbycpKSk7XG5cbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBtZXRhZGF0YUxvYWRlZDtcblxuICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcblxuICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGFyZ2V0VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXQgZmFpbGVkOicsIGVycik7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9WaWRlb0FuZFNlZWsoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVXNlci1pbml0aWF0ZWQgc2VlayDigJQgcmVzZXQgdGhlIGF1dG8tcmVjb3ZlcnkgcmV0cnkgYnVkZ2V0LlxuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IDA7XG5cbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICBjb25zdCBzZWVrU2Vjb25kcyA9IHJlbGF0aXZlVGltZXN0YW1wIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2Vjb25kcywgdmlkZW8uZHVyYXRpb24gfHwgc2Vla1NlY29uZHMpKTtcbiAgICAgIFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qgb25TZWVrZWQgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCIgICBbbmdTdHlsZV09XCJ7XG4gIHBvc2l0aW9uOiBpc0Z1bGxTY3JlZW4gPyAnZml4ZWQnIDogbnVsbCxcbiAgaW5zZXQ6IGlzRnVsbFNjcmVlbiA/ICcxcmVtJyA6IG51bGwsXG4gIHpJbmRleDogaXNGdWxsU2NyZWVuID8gJzUwJyA6IG51bGwsXG4gIGJveFNoYWRvdzogaXNGdWxsU2NyZWVuID8gJzBweCAxM3B4IDI1cHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjI1KScgOiBudWxsLFxuICBib3JkZXJSYWRpdXM6IGlzRnVsbFNjcmVlbiA/ICcuNXJlbScgOiBudWxsLFxuICBib3JkZXI6IGlzRnVsbFNjcmVlbiA/ICcxcHggc29saWQgI0U1RTdFQicgOiBudWxsLFxuICB3aWR0aDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6IG51bGwsXG4gIGhlaWdodDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6ICcxMDAlJyxcbiAgb3ZlcmZsb3c6IGlzRnVsbFNjcmVlbiA/ICdoaWRkZW4nIDogbnVsbFxufVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyNGRkZGRkZdXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtib3gtc2hhZG93OiAwcHggMXB4IDJweCAwcHggIzAwMDAwMDBEO1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1NjcmVlbiBzaXplOiAnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoICsgJ3gnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LmhlaWdodFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgwrdcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj5cbiAgICAgICAgICAgICAge3sgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIH19eHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0NhcHR1cmVWaWRlbyAmJiBpc0xpdmVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1sb2FkaW5nXT1cImlzQ2FwdHVyaW5nVmlkZW9cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NhcHR1cmluZ1ZpZGVvXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FwdHVyZVZpZGVvKClcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NhcHR1cmluZ1ZpZGVvXCIgY2xhc3M9XCJjYXB0dXJlLXZpZGVvLWJ0bl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNDYXB0dXJpbmdWaWRlb1wiIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5fX3NwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgaXNDYXB0dXJpbmdWaWRlbyA/ICdDYXB0dXJpbmfigKYnIDogJ0NhcHR1cmUgVmlkZW8nIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKClcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNUZXh0Q2xhc3MoKVwiPnt7IGxpdmVTdGF0dXMgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJpc0xpdmUgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwibGl2ZVNlc3Npb25TZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImxpdmVTZXNzaW9uVmlld1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJzZWdtZW50c1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBhbmRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUgMS4yNUg4Ljc1VjMuNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NDk5MiAxLjI1TDUuODMzMjUgNC4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDguNzQ5NjdMNC4xNjY2NyA1LjgzMzAxXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgOC43NUgxLjI1VjYuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhpdCBmdWxsIHNjcmVlblwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NSA2LjI1SDYuMjVWOC43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1MDA4IDYuMjVMOS4xNjY3NSA5LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuODMzMjUyIDAuODMzMDA4TDMuNzQ5OTIgMy43NDk2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDMuNzVIMy43NVYxLjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1oLVtjYWxjKDEwMCUtNDFweCldXCI+XG4gICAgPCEtLSBGYXN0LWZvcndhcmQgb3ZlcmxheTogY292ZXJzIGNvbnRlbnQgYXJlYSBidXQgbm90IGhlYWRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNGYXN0Rm9yd2FyZGluZyAmJiBmYXN0Rm9yd2FyZENvbmZpZ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC02XCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQteGwgY3FhLXctZnVsbFwiXG4gICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA1MDBweDsgcGFkZGluZzogMzJweDsgYm94LXNoYWRvdzogMHB4IDI1cHggNTBweCAtMTJweCAjMDAwMDAwNDA7IGJvcmRlcjogMXB4IHNvbGlkICNFNUU1RTVcIj5cbiAgICAgICAgPCEtLSBTcGFya2xlIGF2YXRhciB3aXRoIHJvdGF0aW5nIGFyYyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWItMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsNjcsMjM4LDAuMTIpO1wiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDI0IDI2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjAyNTEgMEMxMi4xNzMgMC4wNjM0MTIxIDEyLjIzNjIgMC4yMTgyNjQgMTIuMjk2OCAwLjM2MjExQzEyLjMyNzIgMC40NDU5MjMgMTIuMzU1IDAuNTMwMTkyIDEyLjM4MjEgMC42MTUxMzNDMTIuMzkyNyAwLjY0NzY4MiAxMi40MDMzIDAuNjgwMjMxIDEyLjQxNDIgMC43MTM3NjZDMTIuNTU0OCAxLjE1MTc3IDEyLjY4MDEgMS41OTQ0NyAxMi44MDYxIDIuMDM2ODZDMTIuODM0NiAyLjEzNjczIDEyLjg2MzIgMi4yMzY1NiAxMi44OTE4IDIuMzM2MzhDMTMuMDM3NSAyLjg0NDY0IDEzLjE4MjEgMy4zNTMyMSAxMy4zMjU4IDMuODYyMDFDMTMuMzQ2IDMuOTMzNDcgMTMuMzY2MiA0LjAwNDkyIDEzLjM4NjQgNC4wNzYzOEMxMy40NDM0IDQuMjc3ODMgMTMuNTAwMyA0LjQ3OTMgMTMuNTU2OSA0LjY4MDg3QzEzLjY3NjQgNS4xMDY3OCAxMy43OTkzIDUuNTMxNDUgMTMuOTMwMSA1Ljk1NDA1QzEzLjk0MTUgNS45OTEwMiAxMy45NTI5IDYuMDI3OTkgMTMuOTY0NyA2LjA2NjA4QzE0LjMwNDUgNy4xNTMxOCAxNC43ODYyIDguMTI3NTEgMTUuNTc1NyA4Ljk1NzQzQzE1LjU5NTMgOC45NzkgMTUuNjE0OCA5LjAwMDU4IDE1LjYzNSA5LjAyMjgyQzE1Ljk3MiA5LjM4MjQ2IDE2LjQwNDUgOS42NzA2MyAxNi44MzY4IDkuOTAzMjJDMTYuODU4OCA5LjkxNTI2IDE2Ljg4MDggOS45MjcyOSAxNi45MDM1IDkuOTM5N0MxOC4xNzU3IDEwLjYyMzEgMTkuNzA1MyAxMC45MjM3IDIxLjA4MzIgMTEuMzIzOEMyMS42ODY5IDExLjQ5OTIgMjIuMjg4OCAxMS42ODAyIDIyLjg4ODUgMTEuODY5MUMyMi45MzA2IDExLjg4MjMgMjIuOTcyNyAxMS44OTU2IDIzLjAxNDkgMTEuOTA4OEMyMy4xNDA5IDExLjk0ODMgMjMuMjY2NyAxMS45ODg1IDIzLjM5MjMgMTIuMDI5M0MyMy40MjE2IDEyLjAzODUgMjMuNDUwOSAxMi4wNDc4IDIzLjQ4MSAxMi4wNTczQzIzLjY1NDEgMTIuMTE0NiAyMy44MTk3IDEyLjE4MjEgMjMuOTYxOCAxMi4yOTkyQzI0LjAwNTEgMTIuMzkzOCAyNC4wMDUxIDEyLjM5MzggMjMuOTkzMyAxMi40ODg0QzIzLjg1NSAxMi42MjU4IDIzLjcxNzkgMTIuNjkwMiAyMy41MzU0IDEyLjc1M0MyMy41MDkzIDEyLjc2MjMgMjMuNDgzMiAxMi43NzE2IDIzLjQ1NjQgMTIuNzgxMUMyMy4xNDgzIDEyLjg4OTIgMjIuODM2IDEyLjk4MzggMjIuNTIzNCAxMy4wNzc1QzIyLjQ1OTIgMTMuMDk2OSAyMi4zOTUgMTMuMTE2MyAyMi4zMzA5IDEzLjEzNTdDMjEuOTM1MiAxMy4yNTUxIDIxLjUzODkgMTMuMzcxOSAyMS4xNDIxIDEzLjQ4NzRDMjAuNjE5NSAxMy42Mzk1IDIwLjA5NzcgMTMuNzk0MiAxOS41NzYzIDEzLjk1MDZDMTkuNDkwOSAxMy45NzYzIDE5LjQwNTUgMTQuMDAxOCAxOS4zMiAxNC4wMjcyQzE4Ljg3MTIgMTQuMTYxIDE4LjQyNDYgMTQuMjk5NSAxNy45ODE3IDE0LjQ1MTZDMTcuOTQ1IDE0LjQ2NDIgMTcuOTA4MiAxNC40NzY4IDE3Ljg3MDQgMTQuNDg5N0MxNi4zODcgMTUuMDA1OSAxNS4yNTYzIDE1Ljk2ODcgMTQuNTQ4NiAxNy4zNzY4QzE0LjE2NyAxOC4xNjgxIDEzLjk0MTkgMTkuMDIzOSAxMy43MTI0IDE5Ljg2ODVDMTMuNjUwMyAyMC4wOTY0IDEzLjU4NDIgMjAuMzIzIDEzLjUxNzUgMjAuNTQ5NkMxMy40NjUxIDIwLjcyNzggMTMuNDEzOSAyMC45MDY0IDEzLjM2NCAyMS4wODUzQzEzLjM1OCAyMS4xMDY2IDEzLjM1MjEgMjEuMTI3OSAxMy4zNDYgMjEuMTQ5OUMxMy4zMTcyIDIxLjI1MyAxMy4yODg1IDIxLjM1NjIgMTMuMjYgMjEuNDU5NEMxMy4xODcyIDIxLjcyMTEgMTMuMTA4NyAyMS45ODA3IDEzLjAyODEgMjIuMjQwMUMxMi44ODUxIDIyLjcwMTIgMTIuNzU0OSAyMy4xNjU2IDEyLjYyNTYgMjMuNjMwNkMxMi40MzA1IDI0LjMzMDggMTIuNDMwNSAyNC4zMzA4IDEyLjMxOTkgMjQuNjY3NEMxMi4zMTI2IDI0LjY5IDEyLjMwNTIgMjQuNzEyNiAxMi4yOTc3IDI0LjczNTlDMTIuMjU3MyAyNC44NTU3IDEyLjIxNTggMjQuOTY2IDEyLjEzOTQgMjUuMDY3NEMxMi4wMjMxIDI1LjA5MyAxMi4wMjMxIDI1LjA5MyAxMS45MTg3IDI1LjA5ODlDMTEuNzk5MyAyNC45MjQ5IDExLjcyMDIgMjQuNzU2MiAxMS42NTY5IDI0LjU1NTNDMTEuNjQ3NiAyNC41MjY5IDExLjYzODQgMjQuNDk4NCAxMS42Mjg5IDI0LjQ2OTFDMTEuNTExNiAyNC4xMDE5IDExLjQwNjcgMjMuNzMwOSAxMS4zMDE4IDIzLjM2QzExLjI3NzggMjMuMjc1MiAxMS4yNTM2IDIzLjE5MDQgMTEuMjI5NSAyMy4xMDU2QzExLjA0OTYgMjIuNDczNyAxMC44NzI3IDIxLjg0MDkgMTAuNjk2IDIxLjIwODFDOS45NjAxOSAxOC4wNzc1IDkuOTYwMTkgMTguMDc3NSA4LjEwNCAxNS41NDY0QzguMDc0MjUgMTUuNTIyMiA4LjA0NDUgMTUuNDk3OSA4LjAxMzg1IDE1LjQ3MjlDNi43OTc2NyAxNC40OTg5IDUuMTk1NTYgMTQuMTM4MiAzLjcyODQgMTMuNzE1NUMzLjM2NTUzIDEzLjYxMDkgMy4wMDI4IDEzLjUwNTggMi42NDAwOSAxMy40MDA3QzIuNjA4MzcgMTMuMzkxNSAyLjYwODM3IDEzLjM5MTUgMi41NzYwMSAxMy4zODIxQzIuMDUyODMgMTMuMjMwNCAxLjUyOTggMTMuMDc4MyAxLjAwODYgMTIuOTE5OUMwLjk4NjU0OSAxMi45MTMyIDAuOTY0NSAxMi45MDY2IDAuOTQxNzgzIDEyLjg5OTdDMC4xNDEwNjQgMTIuNjU3OCAwLjE0MTA2NCAxMi42NTc4IDAuMDAxNzI0MSAxMi40ODg0Qy0wLjAwMjIxNjcgMTIuNDExNSAtMC4wMDIyMTY3IDEyLjQxMTUgMC4wMzMyNTA1IDEyLjMzMDdDMC4xNzg4ODkgMTIuMTg4IDAuMzIwMjA1IDEyLjEyNjkgMC41MTI0MjYgMTIuMDY0N0MwLjU0MDI1OSAxMi4wNTU0IDAuNTY4MDkgMTIuMDQ2IDAuNTk2NzY2IDEyLjAzNjRDMC42ODIwMDggMTIuMDA3OSAwLjc2NzQzNiAxMS45ODAxIDAuODUyOTM2IDExLjk1MjRDMC44NzczMzUgMTEuOTQ0NCAwLjkwMTczNSAxMS45MzY0IDAuOTI2ODc0IDExLjkyODJDMS4wOTk0MyAxMS44NzE2IDEuMjcyNiAxMS44MTcxIDEuNDQ2MDMgMTEuNzYzM0MxLjQ4ODY0IDExLjc1IDEuNDg4NjQgMTEuNzUgMS41MzIxMiAxMS43MzY0QzIuMjcyNzIgMTEuNTA2MSAzLjAxODE1IDExLjI5MTcgMy43NjMzNiAxMS4wNzY5QzQuMzE4NjYgMTAuOTE2OCA0Ljg3MzAyIDEwLjc1NCA1LjQyNTYxIDEwLjU4NDdDNS40NTEgMTAuNTc3IDUuNDc2NCAxMC41NjkyIDUuNTAyNTYgMTAuNTYxM0M2Ljc4MjY3IDEwLjE3MDUgOC4wMzQwOSA5LjYxNjEyIDguODYwNjMgOC41MTYwNkM4Ljg3MyA4LjQ5OTc0IDguODg1MzggOC40ODM0MiA4Ljg5ODEzIDguNDY2NjFDOS44MTg2IDcuMjQ1NjQgMTAuMTc3NSA1Ljc2MDgyIDEwLjU3ODUgNC4zMTIwMUMxMC43MTA1IDMuODM1NTIgMTAuODQ0IDMuMzU5NDcgMTAuOTc3OSAyLjg4MzU2QzExLjAxNSAyLjc1MTc3IDExLjA1MjEgMi42MTk5NyAxMS4wODkgMi40ODgxMkMxMS4yMzcyIDEuOTU4NTIgMTEuMzg3NiAxLjQyOTY0IDExLjU0NjcgMC45MDMxODFDMTEuNTYxNiAwLjg1Mzg4MiAxMS41NzY0IDAuODA0NTYxIDExLjU5MTEgMC43NTUyMThDMTEuODEzOCAwLjAxMTEyMDUgMTEuODEzOCAwLjAxMTEyMDUgMTIuMDI1MSAwWlwiIGZpbGw9XCIjM0Y0M0VFXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkuMjk2MiAxLjU0ODk5QzE5LjQ0MSAxLjcxMjggMTkuNDY5OSAxLjkwNTMyIDE5LjUxNSAyLjExNDQ5QzE5LjY2NTMgMi43NzE2MSAxOS44Mzg0IDMuMzc1ODQgMjAuNDM5NCAzLjc1NzU2QzIwLjgxMDIgMy45NjI2MyAyMS4yNTIyIDQuMDU1OTUgMjEuNjYzIDQuMTQ0MDlDMjEuODM2NCA0LjE4MjA1IDIxLjk4MjkgNC4yMzI0MiAyMi4xMzE2IDQuMzMzMTZDMjIuMTY1MSA0LjM4NjM2IDIyLjE2NTEgNC4zODYzNiAyMi4xNjMyIDQuNDc4OTdDMjIuMTI4NyA0LjU5MTU5IDIyLjA5ODQgNC42Mjc5MSAyMi4wMDc1IDQuNzAxNjNDMjEuOTA4MSA0LjczNDg4IDIxLjkwODEgNC43MzQ4OCAyMS43ODg4IDQuNzYwNzRDMjEuNzQzNyA0Ljc3MTEgMjEuNjk4NSA0Ljc4MTU4IDIxLjY1MzUgNC43OTIxNEMyMS42MjkzIDQuNzk3NzQgMjEuNjA1MSA0LjgwMzM1IDIxLjU4MDMgNC44MDkxMkMyMC44NDU2IDQuOTc5MDcgMjAuODQ1NiA0Ljk3OTA3IDIwLjIxMDUgNS4zNjM2OEMyMC4xODk5IDUuMzgwMyAyMC4xNjkyIDUuMzk2OTIgMjAuMTQ3OSA1LjQxNDA1QzE5LjY5NDEgNS44MTQyNiAxOS41OTgxIDYuNDggMTkuNDYxNSA3LjAzNzdDMTkuNDUzNiA3LjA2ODMzIDE5LjQ0NTggNy4wOTg5NiAxOS40Mzc3IDcuMTMwNTFDMTkuNDMxIDcuMTU3NjIgMTkuNDI0MiA3LjE4NDc0IDE5LjQxNzIgNy4yMTI2N0MxOS4zODc3IDcuMjk1NDYgMTkuMzU3MiA3LjM0OTQ1IDE5LjI5NjIgNy40MTI4OUMxOS4xMjY2IDcuNDM0NDQgMTkuMTI2NiA3LjQzNDQ0IDE5LjA0NCA3LjQxMjg5QzE4LjkxMjggNy4zMTExNCAxOC44ODM0IDcuMTk1MjQgMTguODQ5MSA3LjAzOTVDMTguODQzMyA3LjAxNTM5IDE4LjgzNzYgNi45OTEyNyAxOC44MzE3IDYuOTY2NDJDMTguODEzNCA2Ljg4OTQgMTguNzk1NiA2LjgxMjI2IDE4Ljc3OCA2LjczNTA4QzE4LjYzOTggNi4xMzQwMyAxOC40ODM3IDUuNTQ0MzIgMTcuOTMyNCA1LjE5MjAxQzE3LjUwMTUgNC45NTE3MiAxNi45Nzc2IDQuODM4MDggMTYuNDk2IDQuNzQ2MzFDMTYuMzY0IDQuNzE4ODMgMTYuMjg4NCA0LjY4NDI3IDE2LjIwNjcgNC41NzU1MkMxNi4xODg5IDQuNDY1MTggMTYuMTg4OSA0LjQ2NTE4IDE2LjIwNjcgNC4zNTQ4NEMxNi4zMzIyIDQuMjI0ODQgMTYuNDY0NCA0LjE5MzExIDE2LjYzNDIgNC4xNTM4NkMxNi42ODc3IDQuMTQwNjEgMTYuNzQxMiA0LjEyNzI2IDE2Ljc5NDcgNC4xMTM4M0MxNi44MjIzIDQuMTA2OTQgMTYuODUgNC4xMDAwNCAxNi44Nzg0IDQuMDkyOTRDMTcuMDE5MyA0LjA1NjY4IDE3LjE1ODggNC4wMTYwMiAxNy4yOTgzIDMuOTc0NTVDMTcuMzIzNiAzLjk2NzIgMTcuMzQ4OSAzLjk1OTg1IDE3LjM3NTEgMy45NTIyN0MxNy42NTg1IDMuODY3NTIgMTcuOTAzMiAzLjc1OTExIDE4LjEyOTggMy41NjY2OEMxOC4xNTA5IDMuNTQ5MjggMTguMTcyIDMuNTMxODkgMTguMTkzOCAzLjUxMzk3QzE4LjU0NjUgMy4xOTY1OCAxOC42NjYzIDIuNzE5NzYgMTguNzc1MSAyLjI3NDg0QzE4Ljc4MzQgMi4yNDEwNiAxOC43OTE2IDIuMjA3MjggMTguODAwMiAyLjE3MjQ4QzE4LjgxNjcgMi4xMDQ2MyAxOC44MzI5IDIuMDM2NyAxOC44NDg4IDEuOTY4N0MxOC44NjAyIDEuOTIxMzkgMTguODYwMiAxLjkyMTM5IDE4Ljg3MTcgMS44NzMxMkMxOC44Nzg0IDEuODQ0ODYgMTguODg1IDEuODE2NTkgMTguODkxOCAxLjc4NzQ3QzE4LjkyMDkgMS42OTc0OSAxOC45NTkgMS42MjY4MyAxOS4wMTI1IDEuNTQ4OTlDMTkuMTE1MyAxLjQ5NzYxIDE5LjE4NzQgMS41MjA4NCAxOS4yOTYyIDEuNTQ4OTlaXCIgZmlsbD1cIiMwRjEyQThcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk00Ljc4ODEgMTcuNDIxOUM0LjgyNTYxIDE3LjQyMjIgNC44MjU2MSAxNy40MjIyIDQuODYzODcgMTcuNDIyNUM1LjEzMjk2IDE3LjQzMDcgNS4zMTUwMyAxNy41MTY5IDUuNTEzMjEgMTcuNjk3OEM1Ljc0MzgxIDE3Ljk0NjkgNS44NTAyOSAxOC4yMjc5IDUuODQ0MjMgMTguNTYzN0M1LjgxODMzIDE4LjgzNTkgNS42NTc3OSAxOS4wNzM2IDUuNDYwODcgMTkuMjU3NkM1LjIyOTA4IDE5LjQ0NDcgNC45OTUyNSAxOS41MDY1IDQuNjk5MDYgMTkuNDk3OUM0LjQ0OTMzIDE5LjQ2ODggNC4yMTQzOCAxOS4zNTAyIDQuMDM3MzggMTkuMTcxN0MzLjgxNzI2IDE4Ljg3MTMgMy43NTI5MSAxOC41OTU4IDMuNzg1MTcgMTguMjI1OUMzLjg1MTggMTcuOTM0NiA0LjA0MzkgMTcuNjk4MSA0LjI4OTU5IDE3LjUzMjNDNC40NjAyNyAxNy40NDU4IDQuNTk3NTUgMTcuNDIwMyA0Ljc4ODEgMTcuNDIxOVpcIiBmaWxsPVwiIzEyMTZDQ1wiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgIHdpZHRoPVwiNjBcIiBoZWlnaHQ9XCI2MFwiIHZpZXdCb3g9XCIwIDAgNjAgNjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogLTJweDsgbGVmdDogLTJweDtcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjMwXCIgY3k9XCIzMFwiIHI9XCIyOFwiIHN0cm9rZT1cIiNFMkUyRTNcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZmLXNwaW5cIlxuICAgICAgICAgICAgICAgICB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IC0ycHg7IGxlZnQ6IC0ycHg7IHRyYW5zZm9ybS1vcmlnaW46IDMwcHggMzBweDtcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMCAyIEEgMjggMjggMCAwIDEgNTQuMjQgNDRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtbS0wIGNxYS1tYi0yXCJcbiAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMTYxNjE3O1wiPlxuICAgICAgICAgIEZhc3QtZm9yd2FyZGluZyB0byB5b3VyIHN0ZXBcbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1tLTBcIlxuICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM2RDZENzQ7XCI+XG4gICAgICAgICAgU3RlcHMge3sgZmFzdEZvcndhcmRDb25maWcuZnJvbVN0ZXAgfX3igJN7eyBmYXN0Rm9yd2FyZENvbmZpZy50b1N0ZXAgfX0gYXJlIHJ1bm5pbmcgYXQgZnVsbCBzcGVlZCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+TGl2ZSB2aWV3IGFuZCBzY3JlZW5zaG90cyBhcmUgcGF1c2VkPC9zdHJvbmc+XG4gICAgICAgICAgdW50aWwgZXhlY3V0aW9uIHJlYWNoZXMgeW91ciB0YXJnZXQgc3RlcCDigJQgdGhlbiB5b3UncmUgaW4gYXV0b21hdGljYWxseS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNiBjcWEtbWItNVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzRDNEM1MTtcIj5TdGVwcyBleGVjdXRpbmcgaW4gYmFja2dyb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzZENkQ3NDtcIj5cbiAgICAgICAgICAgICAge3sgZmFzdEZvcndhcmRDb25maWcuY3VycmVudFN0ZXAgfX0gb2Yge3sgZmFzdEZvcndhcmRDb25maWcudG90YWxTdGVwcyB9fSBzdGVwc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMzsgYm9yZGVyLXJhZGl1czogOTk5OXB4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGguJV09XCJmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMzRjQzRUUgMCUsICM4MThDRjggMTAwJSk7IHRyYW5zaXRpb246IHdpZHRoIDMwMG1zIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSk7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICM2MzY2RjExQTsgYm9yZGVyOiAxcHggc29saWQgIzYzNjZGMTMzO1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjYuNVwiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiM1wiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMVwiIGZpbGw9XCIjM2Y0M2VlXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0O1wiPkp1bXBpbmcgdG88L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjM0Y0M0VFOyBmb250LXdlaWdodDogNDAwOyBkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgU3RlcCB7eyBmYXN0Rm9yd2FyZENvbmZpZy50YXJnZXRTdGVwTnVtYmVyIH19IOKAlCA8c3BhbiBbaW5uZXJIVE1MXT1cImZhc3RGb3J3YXJkQ29uZmlnLnRhcmdldFN0ZXBMYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiBpc0xpdmUgJiYgbGl2ZVNlc3Npb25WaWV3ID09PSAnbGl2ZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ2NxYS13LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1mbGV4LWNvbCc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAnY3FhLW1heC1oLWZ1bGwgY3FhLWgtZnVsbCc6IGhhc0RldmljZUZyYW1lICYmIChlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJyB8fCAhaXNMaXZlKSxcbiAgICAgICAgICAgICAgICdjcWEtbWluLXctbWF4JzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1xuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImxpdmVDb250ZW50Q29udGFpbmVyU3R5bGVcIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWVcIlxuICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICdjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZSc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS16LTIwJzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICdjcWEtYmctd2hpdGUnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ1xuICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoYXNEZXZpY2VGcmFtZSA/IGRldmljZVNjcmVlblN0eWxlIDoge31cIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTGl2ZSBDb250ZW50ICh3aGVuIG5vdCBsb2FkaW5nKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGl2ZVN0YXR1cyA9PT0gJ0ZhaWxlZCcgJiYgZmFpbGVkU3RhdHVzTWVzc2FnZVwiIGNsYXNzPVwiY3FhLXAtNiBjcWEtdGV4dC1jZW50ZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTMgY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyNDNjM1MzVdIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtbS0wXCI+e3sgZmFpbGVkU3RhdHVzTWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwibGl2ZVN0YXR1cyAhPT0gJ0ZhaWxlZCcgfHwgIWZhaWxlZFN0YXR1c01lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVmlkZW8gVmlldzogcG9zdC1leGVjdXRpb24gVmlkZW8gdGFiLCBvciBtaWQtc2Vzc2lvbiBDYXB0dXJlZCB2aWV3IGluc2lkZSBhIGxpdmUgc2Vzc2lvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgKCghaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nKSB8fCAoaXNMaXZlICYmIGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJykpXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgYXJpYS1sYWJlbD1cIlZpZGVvIHBsYXliYWNrXCJcbiAgICAgICAgIChrZXlkb3duKT1cIm9uVmlkZW9LZXlkb3duKCRldmVudClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSwgJ2NxYS1tYXgtaC1bY2FsYygxMDAlLTEwOHB4KV0nOiBzaG93VmlkZW9MaWJyYXJ5LCAnY3FhLW1heC1oLVtjYWxjKDEwMCUtNjBweCldJzogIXNob3dWaWRlb0xpYnJhcnl9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSB2aWRlb05vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXZpZGVvUmVmcmVzaGluZ1wiXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvdmVyIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl0gY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudFZpZGVvVXJsXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uVmlkZW9FbmRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgICAgPCEtLSBQbGF5L1BhdXNlIG92ZXJsYXkgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0zMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7YW5pbWF0aW9uOiAnY3FhRmFkZU91dCA1MDBtcyBlYXNlLW91dCBmb3J3YXJkcyd9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSWNvbiBwaW5uZWQgdG8gdGhlIGp1c3QtdGFrZW4gYWN0aW9uIChzZXQgaW4gb25WaWRlb0ZyYW1lQ2xpY2spIHNvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgZG9lc24ndCBmbGlja2VyIGFzIGBpc1BsYXlpbmdgIGZsaXBzIGFzeW5jIGJldHdlZW4gcGxheSgpIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIHByb21pc2UgcmVzb2x2aW5nLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIm92ZXJsYXlTaG93c1BsYXlpbmdJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIW92ZXJsYXlTaG93c1BsYXlpbmdJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN2aWRlb05vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAqbmdJZj1cIiF2aWRlb1JlZnJlc2hpbmdcIlxuICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgIDwhLS0gUGxheS9QYXVzZSBvdmVybGF5IGljb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInthbmltYXRpb246ICdjcWFGYWRlT3V0IDUwMG1zIGVhc2Utb3V0IGZvcndhcmRzJ31cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBJY29uIHBpbm5lZCB0byB0aGUganVzdC10YWtlbiBhY3Rpb24gKHNldCBpbiBvblZpZGVvRnJhbWVDbGljaykgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgIGRvZXNuJ3QgZmxpY2tlciBhcyBgaXNQbGF5aW5nYCBmbGlwcyBhc3luYyBiZXR3ZWVuIHBsYXkoKSBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIHByb21pc2UgcmVzb2x2aW5nLiAtLT5cbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwib3ZlcmxheVNob3dzUGxheWluZ0ljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNSwzIDE5LDEyIDUsMjFcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhb3ZlcmxheVNob3dzUGxheWluZ0ljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFjdXJyZW50VmlkZW9VcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQgJiYgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U7IGVsc2Ugbm9WaWRlb0RlZmF1bHRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICB7eyB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWRlb0RlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4+Tm8gdmlkZW8gcmVjb3JkaW5nIGZvdW5kPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8IS0tIFZpZGVvIExpYnJhcnkgUGFuZWwg4oCUIHJlc2VydmVzIG9ubHkgaGVhZGVyLWhlaWdodCBpbiBmbG93OyB0aGUgaW5uZXIgcGFuZWwgaXMgYWJzb2x1dGVseSBhbmNob3JlZCB0byBpdHMgYm90dG9tIGVkZ2UsIHNvIHRoZSBib2R5IGV4cGFuZGluZyBtYWtlcyB0aGUgcGFuZWwgZ3JvdyBVUFdBUkQgb3ZlciB0aGUgdmlkZW8uIFRpbWVsaW5lIHN0YXlzIHB1dC4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cInZpZGVvLWxpYnJhcnlcIlxuICAgICAgICAgICBbY2xhc3MudmlkZW8tbGlicmFyeS0tb3Blbl09XCIhaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIlxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2lubmVyXCI+XG4gICAgICAgIDwhLS0gSGVhZGVyIOKAlCBhbHdheXMgdmlzaWJsZSwgY2xpY2tpbmcgdGhlIGNoZXZyb24gdG9nZ2xlcyB0aGUgYm9keSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2hlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X190aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlkZW8tbGlicmFyeV9faWNvblwiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzMzOTggNy41ODMwOEwxMi4zODA3IDkuNjE0MjVDMTIuNDI0NyA5LjY0MzQ4IDEyLjQ3NTcgOS42NjAyNCAxMi41Mjg0IDkuNjYyNzZDMTIuNTgxMSA5LjY2NTI4IDEyLjYzMzUgOS42NTM0NyAxMi42OCA5LjYyODU2QzEyLjcyNjUgOS42MDM2NiAxMi43NjU0IDkuNTY2NjEgMTIuNzkyNSA5LjUyMTM2QzEyLjgxOTYgOS40NzYxIDEyLjgzNCA5LjQyNDM0IDEyLjgzNCA5LjM3MTU4VjQuNTkwNThDMTIuODM0IDQuNTM5MjYgMTIuODIwNSA0LjQ4ODg1IDEyLjc5NDggNC40NDQ0M0MxMi43NjkxIDQuNDAwMDEgMTIuNzMyMSA0LjM2MzE1IDEyLjY4NzYgNC4zMzc1OUMxMi42NDMxIDQuMzEyMDMgMTIuNTkyNiA0LjI5ODY2IDEyLjU0MTMgNC4yOTg4M0MxMi40OSA0LjI5OSAxMi40Mzk2IDQuMzEyNzIgMTIuMzk1MyA0LjMzODU4TDkuMzMzOTggNi4xMjQ3NVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgMy41SDIuMzMyNjhDMS42ODgzNSAzLjUgMS4xNjYwMiA0LjAyMjMzIDEuMTY2MDIgNC42NjY2N1Y5LjMzMzMzQzEuMTY2MDIgOS45Nzc2NyAxLjY4ODM1IDEwLjUgMi4zMzI2OCAxMC41SDguMTY2MDJDOC44MTAzNSAxMC41IDkuMzMyNjggOS45Nzc2NyA5LjMzMjY4IDkuMzMzMzNWNC42NjY2N0M5LjMzMjY4IDQuMDIyMzMgOC44MTAzNSAzLjUgOC4xNjYwMiAzLjVaXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlkZW8tbGlicmFyeV9fdGl0bGVcIj5WaWRlbyBMaWJyYXJ5PC9zcGFuPlxuICAgICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBpbmxpbmVTdHlsZXM9XCJtaW4td2lkdGg6IG1heC1jb250ZW50O1wiXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFREU5RkVcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCIjNkQyOEQ5XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cInZpZGVvVXJscy5sZW5ndGggKyAnIGNsaXAnICsgKHZpZGVvVXJscy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJylcIj5cbiAgICAgICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19zdWJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc1ZpZGVvRnVsbE1vZGUgPyAnUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ0VhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZSdcIlxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIj57eyBpc1ZpZGVvRnVsbE1vZGUgPyAnwrcgUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ8K3IEVhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZScgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwicGxheV9hcnJvd1wiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIlNob3cgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uU2hvd0Z1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIkV4aXQgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uRXhpdEZ1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2NvbGxhcHNlXCIgKGNsaWNrKT1cInRvZ2dsZVZpZGVvTGlicmFyeUNvbGxhcHNlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA/ICdTaG93IHZpZGVvIGxpYnJhcnknIDogJ0hpZGUgdmlkZW8gbGlicmFyeSdcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNy41TDYgNC41TDkgNy41XCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDcuNUw5IDQuNVwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJvZHkgKGNhcmRzKSDigJQgbWF4LWhlaWdodCBhbmltYXRlcyBmcm9tIDAgKGNvbGxhcHNlZCkgdG8gYSBmaXhlZCBoZWlnaHQgKG9wZW4pLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2JvZHlcIlxuICAgICAgICAgICAgIFtjbGFzcy52aWRlby1saWJyYXJ5X19ib2R5LS1vcGVuXT1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPyB0cnVlIDogbnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwcy1yb3dcIlxuICAgICAgICAgICAgICAgI2NsaXBzU2Nyb2xsZXJcbiAgICAgICAgICAgICAgIFtjbGFzcy5jbGlwcy1yb3ctLWRyYWdnaW5nXT1cImNsaXBzRHJhZ0FjdGl2ZVwiXG4gICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ2xpcHNNb3VzZURvd24oJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2xpcHNNb3VzZU1vdmUoJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2V1cCk9XCJvbkNsaXBzTW91c2VVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uQ2xpcHNNb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVybCBvZiB2aWRlb1VybHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrTGlicmFyeUNsaXBCeUluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWNhcmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1jYXJkLS1wbGF5aW5nXT1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC10aHVtYi0tcmVhZHldPVwibGlicmFyeVZpZGVvRHVyYXRpb25zLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExpYnJhcnlDbGlwKGkpXCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAjY2xpcFZpZGVvXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaXAtdGh1bWJfX3ZpZGVvXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIHByZWxvYWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICAgICAgICBwbGF5c2lubGluZVxuICAgICAgICAgICAgICAgICAgbXV0ZWRcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaSwgY2xpcFZpZGVvKVwiXG4gICAgICAgICAgICAgICAgICAoZHVyYXRpb25jaGFuZ2UpPVwib25MaWJyYXJ5Q2xpcE1ldGFkYXRhTG9hZGVkKGksIGNsaXBWaWRlbylcIj48L3ZpZGVvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iX19vdmVybGF5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC10aHVtYl9fcGxheS1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiEoaSA9PT0gY3VycmVudFZpZGVvSW5kZXggJiYgaXNQbGF5aW5nKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjc1TDExLjM3NSA3TDMuNSAxMi4yNVYxLjc1WlwiIGZpbGw9XCIjRkZGRkZGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMy41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMi41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMC41XCIgZmlsbD1cIiNGRkZGRkZcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjhcIiB5PVwiMi41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIwLjVcIiBmaWxsPVwiI0ZGRkZGRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLXBsYXlpbmdcIj5QTEFZSU5HPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibmV3VmlkZW9JbmRleGVzLmhhcyhpKSAmJiBpICE9PSBjdXJyZW50VmlkZW9JbmRleFwiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLW5ld1wiPk5FVzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsaXAtdGh1bWJfX2R1cmF0aW9uXCI+e3sgZm9ybWF0VGltZShsaWJyYXJ5VmlkZW9EdXJhdGlvbnMuZ2V0KGkpIHx8IDApIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtbWV0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLW1ldGFfX3RpdGxlXCI+Q2xpcCB7eyBpICsgMSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0blwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1kb3dubG9hZC1idG4tLWRvd25sb2FkaW5nXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ2xpcChpKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWdtYSBpY29uOiB1cHdhcmQgYXJyb3cgd2l0aCBhIHNob3J0IHRyYXkgbGluZSBhdCB0aGUgYm90dG9tIChzaGFyZS9leHBvcnQgZ2x5cGgpLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgOC41VjJNNiAyTDMgNU02IDJMOSA1TTMgMTAuNUg5XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0bl9fcmluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBzdHJva2U9XCIjRTVFN0VCXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS1kYXNob2Zmc2V0XT1cImRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCA3IDcpXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZG93bmxvYWRQcm9ncmVzcy5nZXQoaSkgfHwgMCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0yIGNxYS1iZy13aGl0ZVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU3RUI7XCIgW25nQ2xhc3NdPVwieydjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lICYmICEoc2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDApfVwiICpuZ0lmPVwiY3VycmVudFZpZGVvVXJsICYmICghaXNMaXZlIHx8IGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJylcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbWItMiBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgVmlkZW8ge3sgY3VycmVudFZpZGVvSW5kZXggKyAxIH19IHBsYXlpbmcgb3V0IG9mIHt7IHZpZGVvVXJscz8ubGVuZ3RoIHx8IDAgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zICYmICFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRWaWRlb0luZGV4ID09PSAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldlZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlByZXZpb3VzIHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIj5za2lwX3ByZXZpb3VzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDtcIj5cbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICBkaWFtZXRlcj1cIjE2XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3MgJiYgIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTmV4dCB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCI+c2tpcF9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUoaXNWaWRlb0Z1bGxNb2RlID8gKGdsb2JhbEN1cnJlbnRUaW1lTXMgLyAxMDAwKSA6ICh2cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwKSkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDEwMTtcIj5cbiAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgICAgICBbc2VnbWVudHNdPVwic3BlZWRTZWdtZW50c1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRTcGVlZFwiXG4gICAgICAgICAgICAgICAgW2NvbnRhaW5lckJnQ29sb3JdPVwiJyNGMEYwRjEnXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TcGVlZENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAjdGltZWxpbmVCYXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtMSBjcWEtYmctZ3JheS0yMDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRpbWVsaW5lQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2YgKGlzVmlkZW9GdWxsTW9kZSA/IGZ1bGxWaWRlb01hcmtlcnMgOiBjdXJyZW50VmlkZW9NYXJrZXJzKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImlzVmlkZW9GdWxsTW9kZSA/IGdldEdsb2JhbEZ1bGxTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcikgOiBnZXRTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcilcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0R2xvYmFsTWFya2VyQ29sb3IobWFya2VyLmxldmVsKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzJweCBzb2xpZCAnICsgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IobWFya2VyLnJlc3VsdClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm94LXNpemluZ109XCInYm9yZGVyLWJveCdcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJtYXJrZXIudGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvOyB6LWluZGV4OiA1MDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgdG9wOiA1MCU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFya2VyQ2xpY2soJGV2ZW50LCBtYXJrZXIpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiaXNWaWRlb0Z1bGxNb2RlID8gZ2xvYmFsU2NydWJiZXJQZXJjZW50IDogcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRvcC0xLzIgY3FhLXctMyBjcWEtaC0zIGNxYS1iZy1ibHVlLTYwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItZ3JhYiBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZyBjcWEtc2hhZG93LW1kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJpc1ZpZGVvRnVsbE1vZGUgPyBnbG9iYWxTY3J1YmJlclBlcmNlbnQgOiBwcm9ncmVzc1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDYwO1wiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtbXItMlwiPlxuICAgICAgICAgICAge3sgZm9ybWF0VGltZShpc1ZpZGVvRnVsbE1vZGUgPyAodG90YWxEdXJhdGlvbiAvIDEwMDApIDogKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmR1cmF0aW9uIHx8IDApKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiAhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAnc2NyZWVuc2hvdHMnXCIgY2xhc3M9XCJjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lOyBlbHNlIHNjcmVlbnNob3ROb0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtZnVsbFwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1pbi13LW1heCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tYXgtaC1baW5oZXJpdF0nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1tYXgtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0yMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzY3JlZW5zaG90Tm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhc2NyZWVuU2hvdFVybFwiPlxuICAgICAgICBObyBzY3JlZW5zaG90IGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3RyYWNlJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXJlbGF0aXZlXCIgKm5nSWY9XCJ0cmFjZVZpZXdVcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIiBzdHlsZT1cInBhZGRpbmctdG9wOiA0OHB4OyBwYWRkaW5nLWJvdHRvbTogMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgPGlmcmFtZSBcbiAgICAgICAgICAgIFtzcmNdPVwic2FmZVRyYWNlVXJsXCIgXG4gICAgICAgICAgICB0aXRsZT1cIlRyYWNlIFZpZXdlclwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1taW4taC1bMjUwcHhdIGNxYS1tYXgtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IC00OHB4OyBoZWlnaHQ6IGNhbGMoMTAwJSArIDQ4cHgpO1wiXG4gICAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgKGxvYWQpPVwib25UcmFjZVZpZXdlckxvYWQoKVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25UcmFjZVZpZXdlckVycm9yKClcIj5cbiAgICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJMb2FkaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIExvYWRpbmcgdHJhY2Ugdmlld2VyLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyRXJyb3JcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgdHJhY2Ugdmlld2VyXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiF0cmFjZVZpZXdVcmxcIj5cbiAgICAgICAgTm8gdHJhY2UgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
2564
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUErRixZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlOLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBd2lCN0IsWUFDVSxTQUF1QixFQUN2QixHQUFzQjtRQUR0QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBeGlCdkIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBVyxjQUFjLENBQUM7UUFDdEMsaUJBQVksR0FBeUIsU0FBUyxDQUFDO1FBQy9DLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDakMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQTZFLGFBQWEsQ0FBQztRQUNyRyxxQkFBZ0IsR0FBVyxZQUFZLENBQUM7UUFDeEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLHdCQUFtQixHQUFXLEVBQUUsQ0FBQztRQUNqQywyQkFBc0Is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SztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFNRyxlQUFlO3NCQUF2QixLQUFLO2dCQVFJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBS0gsVUFBVTtzQkFEYixTQUFTO3VCQUFDLFNBQVM7Z0JBcUJoQixjQUFjO3NCQURqQixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBYXZDLHdCQUF3QjtzQkFEM0IsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBNkMxQixVQUFVO3NCQUFwQyxZQUFZO3VCQUFDLFdBQVc7Z0JBQ0csZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBOGExQixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgSG9zdExpc3RlbmVyLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGdldEVtcHR5U3RhdGVQcmVzZXQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1wcmVzZXRzLmNvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFzdEZvcndhcmRDb25maWcge1xuICBmcm9tU3RlcDogbnVtYmVyO1xuICB0b1N0ZXA6IG51bWJlcjtcbiAgY3VycmVudFN0ZXA6IG51bWJlcjtcbiAgdG90YWxTdGVwczogbnVtYmVyO1xuICB0YXJnZXRTdGVwTnVtYmVyOiBzdHJpbmc7XG4gIHRhcmdldFN0ZXBMYWJlbDogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1hcmtlciB7XG4gIGN1bXVsYXRpdmVEdXJhdGlvbjogbnVtYmVyO1xuICByZXN1bHQ6ICdTVUNDRVNTJyB8ICdGQUlMVVJFJyB8ICdBQk9SVEVEJyB8ICdTS0lQUEVEJztcbiAgdGVzdFN0ZXBJZD86IG51bWJlcjtcbiAgbGV2ZWw/OiBudW1iZXI7XG4gIGNoaWxkU3RlcHM/OiBTdGVwTWFya2VyW107XG4gIHRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTZWdtZW50VHlwZSA9ICdzY3JlZW5zaG90cycgfCAndmlkZW8nIHwgJ3RyYWNlJztcblxudHlwZSBTZWdtZW50T3B0aW9uID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xufTtcbmludGVyZmFjZSBEZXZpY2VGcmFtZUNvbmZpZyB7XG4gIG1vY2t1cEltYWdlOiBzdHJpbmc7XG4gIHNjcmVlbkluc2V0OiB7XG4gICAgdG9wOiBzdHJpbmc7XG4gICAgcmlnaHQ6IHN0cmluZztcbiAgICBib3R0b206IHN0cmluZztcbiAgICBsZWZ0OiBzdHJpbmc7XG4gIH07XG4gIGJvcmRlclJhZGl1czogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc2ltdWxhdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbXVsYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5cbmV4cG9ydCBjbGFzcyBTaW11bGF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgdmlkZW9Vcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB2aWRlb1VybHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHZpZGVvQ3VycmVudER1cmF0aW9uOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBzdGVwTWFya2VyczogU3RlcE1hcmtlcltdID0gW107XG4gIEBJbnB1dCgpIHNjcmVlblNob3RVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0cmFjZVZpZXdVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBwbGF0Zm9ybU5hbWU6IHN0cmluZyA9ICdXZWIgLSBDaHJvbWUnO1xuICBASW5wdXQoKSBwbGF0Zm9ybVR5cGU6ICdicm93c2VyJyB8ICdkZXZpY2UnID0gJ2Jyb3dzZXInO1xuICBASW5wdXQoKSBwbGF0Zm9ybTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGRldmljZU5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBpc0xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbGl2ZVN0YXR1czogJ0luIFByb2dyZXNzJyB8ICdQYXVzZWQnIHwgJ0Fib3J0ZWQnIHwgJ0ZhaWxlZCcgfCAnUGFzc2VkJyB8ICdFeGVjdXRpb24nID0gJ0luIFByb2dyZXNzJztcbiAgQElucHV0KCkgbGl2ZUxvYWRpbmdMYWJlbDogc3RyaW5nID0gJ0xvYWRpbmcuLi4nO1xuICBASW5wdXQoKSBpc0NvbnRlbnRWaWRlb0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZmFpbGVkU3RhdHVzTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3RlZFZpZXc6IFNlZ21lbnRUeXBlID0gJ3ZpZGVvJztcbiAgQElucHV0KCkgaGlkZVZpZGVvVGFiOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGJyb3dzZXJWaWV3UG9ydDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGJyb3dzZXJEZXZpY2U6IHN0cmluZyA9ICcnO1xuXG4gIEBJbnB1dCgpIGlzRmFzdEZvcndhcmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZmFzdEZvcndhcmRDb25maWc6IEZhc3RGb3J3YXJkQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgc2hvd1ZpZGVvTGlicmFyeTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93Q2FwdHVyZVZpZGVvOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzQ2FwdHVyaW5nVmlkZW86IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBXaGVuIGBpc0xpdmVgIGFuZCBhdCBsZWFzdCBvbmUgY2xpcCBpcyBwcmVzZW50IGluIGB2aWRlb1VybHNgLCB0aGUgc2ltdWxhdG9yXG4gIC8vIGhlYWRlciBzaG93cyBhIExpdmUvQ2FwdHVyZWQgc2VnbWVudCBjb250cm9sLiBQYXJlbnQgY2FuIGFsc28gZHJpdmUgdGhlIHZpZXdcbiAgLy8gaW1wZXJhdGl2ZWx5IChlLmcuIFwiV2F0Y2ggTm93XCIgYnV0dG9uIGluIHRoZSBjYXB0dXJlIGRpYWxvZykgYnkgcHVzaGluZyBhXG4gIC8vIG5ldyB2YWx1ZSB0aHJvdWdoIHRoaXMgaW5wdXQuXG4gIEBJbnB1dCgpIGxpdmVTZXNzaW9uVmlldzogJ2xpdmUnIHwgJ2NhcHR1cmVkJyA9ICdsaXZlJztcblxuICBnZXQgZmFzdEZvcndhcmRQcm9ncmVzc1BlcmNlbnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjID0gdGhpcy5mYXN0Rm9yd2FyZENvbmZpZztcbiAgICBpZiAoIWMgfHwgIWMudG90YWxTdGVwcykgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgKGMuY3VycmVudFN0ZXAgLyBjLnRvdGFsU3RlcHMpICogMTAwKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSB2aWRlb1RpbWVVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGxheSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGF1c2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtYXJrZXJIaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNYXJrZXI+KCk7XG4gIEBPdXRwdXQoKSBpc1ZpZGVvUGxheWluZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGNhcHR1cmVWaWRlb1JlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGxpdmVTZXNzaW9uVmlld0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8J2xpdmUnIHwgJ2NhcHR1cmVkJz4oKTtcblxuICBwcml2YXRlIF92cGxheWVyPzogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd2cGxheWVyJylcbiAgc2V0IHZwbGF5ZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIC8vIEVsZW1lbnQgaXMgYmVpbmcgdW5tb3VudGVkIChlLmcuIHVzZXIgdG9nZ2xlZCBmcm9tIENhcHR1cmVkIOKGkiBMaXZlIGR1cmluZyBhXG4gICAgICAvLyBtaWQtZmxpZ2h0IHN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKS4gRHJvcCB0aGUgc3RhbGUgcmVmZXJlbmNlIHNvIGFueVxuICAgICAgLy8gZm9sbG93LXVwIGF0dGVtcHQgdG8gb3BlcmF0ZSBvbiAubmF0aXZlRWxlbWVudCBzaG9ydC1jaXJjdWl0cyBvdXQgY2xlYW5seS5cbiAgICAgIHRoaXMuX3ZwbGF5ZXIgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdnBsYXllciA9IHJlZjtcbiAgICB0aGlzLm9uVmlkZW9FbGVtZW50UmVhZHkoKTtcbiAgfVxuXG4gIGdldCB2cGxheWVyKCk6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92cGxheWVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGltZWxpbmVCYXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd0aW1lbGluZUJhcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzZXQgdGltZWxpbmVCYXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSByZXR1cm47XG4gICAgdGhpcy5fdGltZWxpbmVCYXIgPSByZWY7XG4gIH1cblxuICBnZXQgdGltZWxpbmVCYXIoKTogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90aW1lbGluZUJhcjtcbiAgfVxuXG4gIHByaXZhdGUgX3NwZWVkQ29udHJvbENvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3NwZWVkQ29udHJvbENvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzZXQgc3BlZWRDb250cm9sQ29udGFpbmVyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3NwZWVkQ29udHJvbENvbnRhaW5lciA9IHJlZjtcbiAgfVxuXG4gIGdldCBzcGVlZENvbnRyb2xDb250YWluZXIoKTogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXI7XG4gIH1cblxuICBwcm9ncmVzcyA9IDA7XG4gIGRyYWdnaW5nID0gZmFsc2U7XG4gIGlzUGxheWluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93UGxheVBhdXNlT3ZlcmxheTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogSWNvbiBzaG93biBieSB0aGUgcGxheS9wYXVzZSBvdmVybGF5IGR1cmluZyBpdHMgNTAwbXMgbGlmZXRpbWUuIFBpbm5lZCBhdCBjbGljayB0aW1lXG4gICAqIHNvIHRoZSBpY29uIGRvZXNuJ3QgZmxpY2tlciBhcyBgaXNQbGF5aW5nYCBmbGlwcyBhc3luYyBiZXR3ZWVuXG4gICAqIGA8dmlkZW8+LnBsYXkoKWAgaW52b2NhdGlvbiBhbmQgaXRzIHByb21pc2UgcmVzb2x2aW5nLiBNaXJyb3JzIHRoZSBZb3VUdWJlLXN0eWxlXG4gICAqIGNvbnZlbnRpb246IHNob3cgdGhlIGFjdGlvbiBqdXN0IHRha2VuICjilrYgYWZ0ZXIgcGxheSwg4oilIGFmdGVyIHBhdXNlKS5cbiAgICovXG4gIG92ZXJsYXlTaG93c1BsYXlpbmdJY29uOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcGxheVBhdXNlT3ZlcmxheVRpbWVyOiBhbnkgPSBudWxsO1xuICBpc0Z1bGxTY3JlZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudFZpZXc6IHN0cmluZyA9ICd2aWRlbyc7XG4gIGN1cnJlbnRWaWRlb0luZGV4OiBudW1iZXIgPSAwO1xuICBjdXJyZW50U3BlZWQ6IHN0cmluZyA9ICcxeCc7XG4gIGlzU3BlZWRDb250cm9sT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGRldGVjdGVkVmlkZW9EdXJhdGlvbnM6IG51bWJlcltdID0gW107IC8vIEFjdHVhbCBkdXJhdGlvbnMgZGV0ZWN0ZWQgZnJvbSB2aWRlbyBtZXRhZGF0YVxuICBwcml2YXRlIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiBib29sZWFuID0gZmFsc2U7IC8vIFRyYWNrIGlmIHZpZGVvIHdhcyBwbGF5aW5nIGJlZm9yZSBkcmFnIHN0YXJ0ZWRcbiAgcHJpdmF0ZSBwbGF5UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBwbGF5IHByb21pc2VcbiAgcHJpdmF0ZSBoaXRNYXJrZXJzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTsgLy8gVHJhY2sgd2hpY2ggbWFya2VycyBoYXZlIGJlZW4gaGl0IChieSB0ZXN0U3RlcElkKVxuXG4gIC8vIFN0YXRlIG1hY2hpbmUgZm9yIHJvYnVzdCBtZWRpYSBvcGVyYXRpb25zXG4gIHByaXZhdGUgcGxheWVyU3RhdGU6ICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdyZWFkeScgfCAncGxheWluZycgfCAncGF1c2VkJyB8ICdzZWVraW5nJyB8ICdzd2l0Y2hpbmcnIHwgJ2Vycm9yJyA9ICdpZGxlJztcbiAgcHJpdmF0ZSBvcGVyYXRpb25RdWV1ZTogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpOyAvLyBTZXJpYWxpemUgYWxsIG1lZGlhIG9wZXJhdGlvbnNcblxuICAvLyBWaWRlby1vbi1kZW1hbmQgKFZpZGVvIExpYnJhcnkpIHN0YXRlIOKAlCBzaW5nbGUgc291cmNlIG9mIHRydXRoIGlzIGB2aWRlb1VybHNgLlxuICAvLyBgbmV3VmlkZW9JbmRleGVzYCBtYXJrcyB3aGljaCBpbmRleGVzIHdlcmUganVzdCBjYXB0dXJlZCAoc28gd2UgY2FuIHNob3cgdGhlXG4gIC8vIE5FVyBiYWRnZSB1bnRpbCB0aGF0IGNsaXAgaXMgc2VsZWN0ZWQpOyBgbGlicmFyeVZpZGVvRHVyYXRpb25zYCBjYWNoZXMgdGhlXG4gIC8vIG1ldGFkYXRhLWxvYWRlZCBkdXJhdGlvbiBwZXIgaW5kZXggZm9yIGVhY2ggbGlicmFyeSBjYXJkJ3MgdGh1bWJuYWlsLlxuICBpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZDogYm9vbGVhbiA9IHRydWU7XG4gIG5ld1ZpZGVvSW5kZXhlczogU2V0PG51bWJlcj4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGlicmFyeVZpZGVvRHVyYXRpb25zOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgZG93bmxvYWRpbmdJbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBkb3dubG9hZFByb2dyZXNzOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTsgLy8gMC0xMDAgcGVyIGNsaXAgaW5kZXhcbiAgQFZpZXdDaGlsZHJlbignY2xpcFZpZGVvJykgY2xpcFZpZGVvcz86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+PjtcbiAgQFZpZXdDaGlsZCgnY2xpcHNTY3JvbGxlcicpIGNsaXBzU2Nyb2xsZXJSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSBsYXN0TGlicmFyeVN5bmNLZXk6IHN0cmluZyA9ICcnO1xuICAvLyBUcmFja3Mgd2hpY2ggY2xpcCBpbmRleCB0aGUgbGlicmFyeSByb3cgd2FzIGxhc3QgYXV0by1zY3JvbGxlZCB0bywgc28gdGhlXG4gIC8vIHRpbWV1cGRhdGUgaGFuZGxlciBkb2Vzbid0IHJlLXRyaWdnZXIgYSBzY3JvbGwgZXZlcnkgZnJhbWUuXG4gIHByaXZhdGUgbGFzdFNjcm9sbGVkQ2xpcEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBBdXRvLXJlY292ZXJ5OiB3aGVuIHRoZSA8dmlkZW8+IGZpcmVzIGFuIGVycm9yIGV2ZW50IChlLmcuIENocm9tZSdzXG4gIC8vIFwiUElQRUxJTkVfRVJST1JfUkVBRDogRkZtcGVnRGVtdXhlclwiIGFmdGVyIGEgbmV0d29yayBnbGl0Y2gpLCB3ZSBmbGlwXG4gIC8vIHRoaXMgZmxhZyB0byB1bm1vdW50IHRoZSA8dmlkZW8+IHZpYSAqbmdJZiwgdGhlbiBmbGlwIGl0IGJhY2sgc28gQW5ndWxhclxuICAvLyByZW1vdW50cyBhIGZyZXNoIGVsZW1lbnQg4oCUIHRoZSBzYW1lIG1lY2hhbmlzbSB0aGF0IG1ha2VzIHRoZVxuICAvLyBTY3JlZW5zaG90c+KGlFZpZGVvIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZCByZWNvdmVyIHBsYXliYWNrIHRvZGF5LlxuICB2aWRlb1JlZnJlc2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwZW5kaW5nUmVjb3ZlcnlTZWVrU2VjOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nUmVjb3ZlcnlQbGF5OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVjb3ZlcnlBdHRlbXB0czogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfUkVDT1ZFUllfQVRURU1QVFMgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBSRUNPVkVSWV9XSU5ET1dfTVMgPSAxMF8wMDA7XG5cbiAgLy8gUGhhc2UgMiDigJQgXCJTaG93IEZ1bGwgVmlkZW9cIiBtb2RlLiBXaGVuIHRydWUsIHRoZSBtYWluIHRpbWVsaW5lIHNwYW5zIHRoZSB0b3RhbFxuICAvLyBkdXJhdGlvbiBhY3Jvc3MgYWxsIGNsaXBzIGFuZCBzdGVwIG1hcmtlcnMgZnJvbSBldmVyeSBjbGlwIGFyZSBsYWlkIG91dCBvbiBpdC5cbiAgLy8gQ2xpcC10by1jbGlwIHRyYW5zaXRpb25zIGhhcHBlbiB1bmRlciB0aGUgaG9vZCB2aWEgdGhlIGV4aXN0aW5nIG9uVmlkZW9FbmRlZFxuICAvLyBhdXRvLWFkdmFuY2UgcGF0aCDigJQgdGhlIHVzZXIgZG9lc24ndCBzZWUgYSByZXNldC5cbiAgaXNWaWRlb0Z1bGxNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIDAtMTAwIHBvc2l0aW9uIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUgd2hpbGUgdGhlIHVzZXIgaXMgYWN0aXZlbHkgZHJhZ2dpbmcuXG4gIC8vIE5lZWRlZCBiZWNhdXNlIGBwcm9ncmVzc2AgaXMgcGVyLWN1cnJlbnQtY2xpcCBhbmQgd291bGQgZ2l2ZSB0aGUgd3JvbmcgdmFsdWUuXG4gIGdsb2JhbERyYWdQcm9ncmVzczogbnVtYmVyID0gMDtcblxuICAvLyBEcmFnLXRvLXNjcm9sbCBzdGF0ZSBmb3IgdGhlIGNsaXBzIHJvdyAobW91c2UgZXF1aXZhbGVudCBvZiB0b3VjaC1zd2lwZSkuXG4gIHByaXZhdGUgY2xpcHNEcmFnU3RhdGUgPSB7IGRyYWdnaW5nOiBmYWxzZSwgc3RhcnRYOiAwLCBzdGFydFNjcm9sbExlZnQ6IDAsIGRpZE1vdmU6IGZhbHNlIH07XG4gIGNsaXBzRHJhZ0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUoKTogJ2Jyb3dzZXInIHwgJ2RldmljZScge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHJldHVybiAnZGV2aWNlJztcbiAgICBpZiAodGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpKSByZXR1cm4gJ2RldmljZSc7XG4gICAgcmV0dXJuICdicm93c2VyJztcbiAgfVxuXG4gIGdldCBoYXNEZXZpY2VGcmFtZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZGV2aWNlRnJhbWVDb25maWcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIENTUy1idWlsdCBicm93c2VyIGZyYW1lIGZvciBldmVyeSB3ZWIvYnJvd3NlciBydW4gdGhhdFxuICAgKiAgaGFzIGEga25vd24gdmlld3BvcnQg4oCUIGluY2x1ZGluZyBtb2JpbGUtc2l6ZWQgdmlld3BvcnRzICgzNzXDlzY2NyxcbiAgICogIDQxMsOXOTE1LCBldGMuKS4gUGhvbmUtbW9ja3VwIFBOR3MgYXJlIHJlc2VydmVkIGZvciBhY3R1YWwgbW9iaWxlXG4gICAqICAqZGV2aWNlKiBlbXVsYXRpb24gKGBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnYCkuICovXG4gIGdldCB1c2VDc3NCcm93c2VyRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB2cCA9IHRoaXMuZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0O1xuICAgIHJldHVybiAhISh2cCAmJiB2cC53aWR0aCAmJiB2cC5oZWlnaHQpO1xuICB9XG5cbiAgLyoqIFNpemUgdGhlIENTUyBicm93c2VyIGZyYW1lICoqZHluYW1pY2FsbHkqKiBmcm9tIHRoZSB2aWV3cG9ydCdzIGFzcGVjdFxuICAgKiAgcmF0aW8uIFRoZSBiaW5kaW5nIGRpbWVuc2lvbiBpcyBwaWNrZWQgZnJvbSB0aGUgdmlld3BvcnQncyBvd25cbiAgICogIG9yaWVudGF0aW9uIHNvIHRoZSBmcmFtZSBmaWxscyB0aGUgcGFuZSBhbG9uZyBpdHMgZG9taW5hbnQgYXhpcyBhbmRcbiAgICogIGtlZXBzIHRoZSB2aWV3cG9ydCdzIGV4YWN0IGFzcGVjdCBvbiB0aGUgb3RoZXIgYXhpcy5cbiAgICpcbiAgICogIC0gTGFuZHNjYXBlIChgdyA+PSBoYCwgZS5nLiAxMDI0w5c3NjgsIDE5MjDDlzEwODAsIDMwMDDDlzIwMDApOlxuICAgKiAgICBgd2lkdGg6IDEwMCVgIGlzIHByaW1hcnk7IGhlaWdodCBpcyBkZXJpdmVkIHZpYSBgYXNwZWN0LXJhdGlvYC5cbiAgICogICAgYG1heC1oZWlnaHQ6IDEwMCVgIGxldHMgdGhlIGVuZ2luZSBjbGFtcCArIHNocmluayB3aWR0aCB3aGVuIHRoZVxuICAgKiAgICBwYW5lIGlzIHNob3J0ZXIgdGhhbiB0aGUgZGVyaXZlZCBoZWlnaHQgd291bGQgcmVxdWlyZS5cbiAgICogIC0gUG9ydHJhaXQgKGB3IDwgaGAsIGUuZy4gMzc1w5c2NjcsIDQxMsOXOTE1KTpcbiAgICogICAgYGhlaWdodDogMTAwJWAgaXMgcHJpbWFyeTsgd2lkdGggZm9sbG93cyB2aWEgYGFzcGVjdC1yYXRpb2AuXG4gICAqICAgIGBtYXgtd2lkdGg6IDEwMCVgIGNsYW1wcyB3aGVuIHRoZSBwYW5lIGlzIG5hcnJvd2VyLlxuICAgKlxuICAgKiAgVGhlIDQwcHggY2hyb21lIGJhciBpcyBiYWtlZCBpbnRvIHRoZSByYXRpbyBzbyB0aGUgaW5uZXIgY29udGVudFxuICAgKiAgYXJlYSBiZWxvdyB0aGUgY2hyb21lIGxhbmRzIGF0IHRoZSB2aWV3cG9ydCdzIGV4YWN0IGB2cC53IC8gdnAuaGAuXG4gICAqICBSZXR1cm5zIGB7fWAgd2hlbiBubyB2aWV3cG9ydCBkYXRhIGlzIGF2YWlsYWJsZSDigJQgdGhlIHBhcmVudCBmbGV4XG4gICAqICBjb250YWluZXIgdGhlbiBrZWVwcyB0aGUgZGVmYXVsdCBsb29rIChubyByZXNpemUpLiAqL1xuICBnZXQgY3NzQnJvd3NlckZyYW1lT3V0ZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB2cCA9IHRoaXMuZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0O1xuICAgIGlmICghdnAgfHwgIXZwLndpZHRoIHx8ICF2cC5oZWlnaHQpIHJldHVybiB7fTtcbiAgICBjb25zdCBjaHJvbWVIZWlnaHQgPSA0MDtcbiAgICBjb25zdCBhc3BlY3QgPSBgJHt2cC53aWR0aH0gLyAke3ZwLmhlaWdodCArIGNocm9tZUhlaWdodH1gO1xuICAgIGNvbnN0IHBvcnRyYWl0ID0gdnAuaGVpZ2h0ID4gdnAud2lkdGg7XG4gICAgY29uc3Qgc2l6aW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gcG9ydHJhaXRcbiAgICAgID8ge1xuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICdtYXgtaGVpZ2h0JzogJzEwMCUnLFxuICAgICAgICAgICdtYXgtd2lkdGgnOiAnMTAwJScsXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgJ21heC13aWR0aCc6ICcxMDAlJyxcbiAgICAgICAgICAnbWF4LWhlaWdodCc6ICcxMDAlJyxcbiAgICAgICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2l6aW5nLFxuICAgICAgJ21pbi13aWR0aCc6ICcwJyxcbiAgICAgICdtaW4taGVpZ2h0JzogJzAnLFxuICAgICAgJ2FzcGVjdC1yYXRpbyc6IGFzcGVjdCxcbiAgICAgICdib3JkZXItbGVmdCc6ICAgJzFweCBzb2xpZCAjRTVFN0VCJyxcbiAgICAgICdib3JkZXItcmlnaHQnOiAgJzFweCBzb2xpZCAjRTVFN0VCJyxcbiAgICAgICdib3JkZXItYm90dG9tJzogJzFweCBzb2xpZCAjRTVFN0VCJyxcbiAgICAgICdib3gtc2l6aW5nJzogICAgJ2JvcmRlci1ib3gnLFxuICAgIH07XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cblxuICBnZXQgaXNBc3BlY3RSYXRpb01hdGNoZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgd2luZG93QXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB2aWV3cG9ydEFyID0gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQud2lkdGggLyB0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC4xNTtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93QXIgLSB2aWV3cG9ydEFyKSAvIHZpZXdwb3J0QXIgPCB0b2xlcmFuY2U7XG4gIH1cblxuICBnZXQgbGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXNwZWN0UmF0aW9NYXRjaGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWF4KDIwMCwgd2luZG93LmlubmVySGVpZ2h0IC0gMjAwKX1weGAsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIGxpdmVTZXNzaW9uU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTGl2ZScsIHZhbHVlOiAnbGl2ZScgfSxcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZWQnLCB2YWx1ZTogJ2NhcHR1cmVkJyB9LFxuICBdO1xuXG4gIG9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkOiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gKG5leHQgPT09ICdjYXB0dXJlZCcgPyAnY2FwdHVyZWQnIDogJ2xpdmUnKTtcbiAgICBpZiAocmVzb2x2ZWQgIT09IHRoaXMubGl2ZVNlc3Npb25WaWV3KSB7XG4gICAgICB0aGlzLmxpdmVTZXNzaW9uVmlldyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5yZXNldExpdmVTZXNzaW9uUGxheWJhY2tTdGF0ZSgpO1xuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXdDaGFuZ2UuZW1pdChyZXNvbHZlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IHRoZSB2aWRlbyBwbGF5ZXIgdG8gYSBjbGVhbiBzbGF0ZSB3aGVuZXZlciB0aGUgTGl2ZS9DYXB0dXJlZCB2aWV3IHRvZ2dsZXNcbiAgICogIGR1cmluZyBhbiBhY3RpdmUgZGVidWcgc2Vzc2lvbi4gUGF1c2VzIHBsYXliYWNrLCBleGl0cyBGdWxsIFZpZGVvIG1vZGUsIHJld2luZHNcbiAgICogIHRvIGNsaXAgMCwgYW5kIGNsZWFycyBkcmFnL3Njcm9sbC9tYXJrZXIgc3RhdGUuXG4gICAqXG4gICAqICBBcHBsaWVkIHN5bmNocm9ub3VzbHkgKG5vIG9wZXJhdGlvblF1ZXVlKSBiZWNhdXNlIHRoZSB0b2dnbGUgdXN1YWxseSBhbHNvXG4gICAqICB1bm1vdW50cy9yZW1vdW50cyB0aGUgPHZpZGVvPiBlbGVtZW50IOKAlCBhbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiB0aGUgb2xkXG4gICAqICBlbGVtZW50IGlzIGFscmVhZHkgZGVhZCwgYW5kIGEgZnJlc2ggZWxlbWVudCBuYXR1cmFsbHkgbW91bnRzIHdpdGhcbiAgICogIGBzcmMgPSB2aWRlb1VybHNbMF1gIGZyb20gYGN1cnJlbnRWaWRlb1VybGAuIEVucXVldWVpbmcgaGVyZSB3b3VsZCByYWNlIHdpdGhcbiAgICogIHRoZSBlbGVtZW50IGxpZmVjeWNsZSBhbmQgZWl0aGVyIGdldCBkaXNjYXJkZWQgb3IgYmxvY2sgdGhlIHF1ZXVlLiAqL1xuICBwcml2YXRlIHJlc2V0TGl2ZVNlc3Npb25QbGF5YmFja1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0Z1bGxNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IC0xO1xuICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvKSB7XG4gICAgICB0cnkgeyB2aWRlby5wYXVzZSgpOyB9IGNhdGNoIHsgLyogZGV0YWNoZWQgZWxlbWVudCDigJQgaWdub3JlICovIH1cbiAgICAgIHRyeSB7IHZpZGVvLmN1cnJlbnRUaW1lID0gMDsgfSBjYXRjaCB7IC8qIGRldGFjaGVkIGVsZW1lbnQg4oCUIGlnbm9yZSAqLyB9XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgYWN0aXZlIGxpYnJhcnkgY2FyZCdzIDx2aWRlbz4gZWxlbWVudCdzIHBsYXkgc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBtYWluIHBsYXllclxuICAgIC8vIHNvIHRoZSBjYXJkIGRvZXNuJ3Qgc2hvdyBhIGZyb3plbiB0aHVtYm5haWwgd2hpbGUgdGhlIG1haW4gdmlkZW8gaXMgcGxheWluZy5cbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmN1cnJlbnRWaWRlb0luZGV4fToke3RoaXMuaXNQbGF5aW5nfWA7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXN0TGlicmFyeVN5bmNLZXkpIHtcbiAgICAgIHRoaXMubGFzdExpYnJhcnlTeW5jS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zeW5jTGlicmFyeUNsaXBQbGF5YmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0xpYnJhcnlDbGlwUGxheWJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMuY2xpcFZpZGVvcztcbiAgICBpZiAoIXJlZnMpIHJldHVybjtcbiAgICBjb25zdCBtYWluRWwgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IGkgPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXggJiYgdGhpcy5pc1BsYXlpbmc7XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICAvLyBTZWVkIHRoZSBjYXJkJ3MgY3VycmVudFRpbWUgZnJvbSB0aGUgbWFpbiBwbGF5ZXIgc28gdGhleSBzdGFydCByb3VnaGx5IGFsaWduZWQuXG4gICAgICAgIGlmIChtYWluRWwgJiYgaXNGaW5pdGUobWFpbkVsLmN1cnJlbnRUaW1lKSAmJiAhaXNOYU4obWFpbkVsLmN1cnJlbnRUaW1lKSkge1xuICAgICAgICAgIHRyeSB7IGVsLmN1cnJlbnRUaW1lID0gbWFpbkVsLmN1cnJlbnRUaW1lOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnBhdXNlZCkge1xuICAgICAgICAgIGNvbnN0IHAgPSBlbC5wbGF5KCk7XG4gICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goKCkgPT4geyAvKiBhdXRvcGxheSBtYXkgYmUgYmxvY2tlZCDigJQgaWdub3JlICovIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlbC5wYXVzZWQpIHtcbiAgICAgICAgZWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlkZW9VcmxzJ10pIHtcbiAgICAgIGNvbnN0IHByZXYgPSAoY2hhbmdlc1sndmlkZW9VcmxzJ10ucHJldmlvdXNWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjdXJyID0gKGNoYW5nZXNbJ3ZpZGVvVXJscyddLmN1cnJlbnRWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICAvLyBNaWQtc2Vzc2lvbiBjYXB0dXJlcyBhcHBlbmQgdG8gdmlkZW9VcmxzLiBUcmVhdCBhcHBlbmQtb25seSBjaGFuZ2VzIGFzXG4gICAgICAvLyBhZGRpdGl2ZSBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBpc24ndCB5YW5rZWQgYmFjayB0byBpbmRleCAwLFxuICAgICAgLy8gYW5kIG1hcmsgdGhlIG5ldyB0YWlsIGNsaXBzIHdpdGggTkVXIGJhZGdlcy5cbiAgICAgIGNvbnN0IGlzQXBwZW5kT25seSA9XG4gICAgICAgIGN1cnIubGVuZ3RoID4gcHJldi5sZW5ndGggJiZcbiAgICAgICAgcHJldi5ldmVyeSgodSwgaSkgPT4gY3VycltpXSA9PT0gdSk7XG5cbiAgICAgIGlmIChjdXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGlzQXBwZW5kT25seSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBwcmV2Lmxlbmd0aDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubmV3VmlkZW9JbmRleGVzLmFkZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgICAvLyBVUkxzIHJlcGxhY2VkIChlLmcuIGV4ZWN1dGlvbl9jb21wbGV0ZWQgc3dhcHBpbmcgY2FwdHVyZWQg4oaSIHNjcmVlbl9yZWNvcmRpbmdzKS5cbiAgICAgICAgICAvLyBEaXNjYXJkIHN0YWxlIGR1cmF0aW9uICsgbGlicmFyeSBjYWNoZXMgc28gdGhlIG5ldyBjbGlwcyBhcmUgcmUtcHJvYmVkLlxuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhjdXJyKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyhjdXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpc0xpdmUnXSAmJiBjaGFuZ2VzWydpc0xpdmUnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAvLyBOZXcgcG9zdC1leGVjdXRpb24gc2Vzc2lvbjogZGVmYXVsdCBiYWNrIHRvICdsaXZlJyBzbyB0aGUgbmV4dCBsaXZlXG4gICAgICAvLyBydW4gc3RhcnRzIHdpdGggdGhlIGxpdmUgdmlldywgbm90IHdoYXRldmVyIHRoZSB1c2VyIHdhcyBsYXN0IG9uLlxuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXcgPSAnbGl2ZSc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXSAmJiAhY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZDogJ2xpdmUnIHwgJ2NhcHR1cmVkJyA9IChuZXh0ID09PSAnY2FwdHVyZWQnID8gJ2NhcHR1cmVkJyA6ICdsaXZlJyk7XG4gICAgICBjb25zdCBwcmV2ID0gY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10ucHJldmlvdXNWYWx1ZTtcbiAgICAgIHRoaXMubGl2ZVNlc3Npb25WaWV3ID0gcmVzb2x2ZWQ7XG4gICAgICBpZiAocmVzb2x2ZWQgIT09IHByZXYpIHtcbiAgICAgICAgLy8gUGFyZW50IHB1c2hlZCBhIG5ldyB2aWV3IChlLmcuIFwiV2F0Y2ggTm93XCIgb3IgcmVzdW1lLWFjdGlvbiByZXR1cm5pbmcgdG8gTGl2ZSkuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBzaW11bGF0b3IgdGhlIHNhbWUgd2F5IHRoZSBzZWdtZW50IGNvbnRyb2wgd291bGQuXG4gICAgICAgIHRoaXMucmVzZXRMaXZlU2Vzc2lvblBsYXliYWNrU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlLlxuICAgKlxuICAgKiBEZWNpc2lvbiBpcyBiYXNlZCBvbiB0aGUgdmlkZW8gZWxlbWVudCdzIG5hdGl2ZSBgcGF1c2VkYCBwcm9wZXJ0eSAoZ3JvdW5kIHRydXRoKVxuICAgKiByYXRoZXIgdGhhbiBvbiBgcGxheWVyU3RhdGVgLCB3aGljaCBsYWdzIGR1cmluZyBhc3luYyBwbGF5KCkgLyBwYXVzZSgpIHRyYW5zaXRpb25zLlxuICAgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd291bGQsIG9uIGEgcmFwaWQgc2Vjb25kIGNsaWNrIGR1cmluZyB0aGUgfjUwLTIwMG1zXG4gICAqIGB2aWRlby5wbGF5KClgIGF3YWl0IHdpbmRvdywgc2VlIGBwbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnYCBhbmQgcXVldWUgYW5vdGhlclxuICAgKiBgcGxheVZpZGVvKClgIGluc3RlYWQgb2YgdGhlIGludGVuZGVkIGBwYXVzZVZpZGVvKClgIOKAlCBzbyB0aGUgc2Vjb25kIGNsaWNrXG4gICAqIHNpbGVudGx5IFwiZGlkIG5vdGhpbmdcIiB3aGlsZSB0aGUgdmlkZW8ga2VwdCBwbGF5aW5nLiBSZWFkaW5nIGB2aWRlby5wYXVzZWRgXG4gICAqIGRpcmVjdGx5IG1ha2VzIHRoZSB0b2dnbGUgY29ycmVjdCByZWdhcmRsZXNzIG9mIHdoYXQgc3RhZ2UgdGhlIHN0YXRlIG1hY2hpbmVcbiAgICogaGFwcGVucyB0byBiZSBpbi5cbiAgICovXG4gIHRvZ2dsZVBsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnLCB7XG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgc291cmNlXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWRlb1VybCB8fCB2aWRlby5uZXR3b3JrU3RhdGUgPT09IEhUTUxNZWRpYUVsZW1lbnQuTkVUV09SS19OT19TT1VSQ0UgfHwgdmlkZW8uZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IG5vIHZhbGlkIHNvdXJjZScsIHtcbiAgICAgICAgY3VycmVudFZpZGVvVXJsOiB0aGlzLmN1cnJlbnRWaWRlb1VybCxcbiAgICAgICAgbmV0d29ya1N0YXRlOiB2aWRlby5uZXR3b3JrU3RhdGUsXG4gICAgICAgIGVycm9yOiB2aWRlby5lcnJvclxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXJyb3Igc3RhdGUgc28gdGhlIG5leHQgcGxheSBhdHRlbXB0IGNhbiBwcm9jZWVkLlxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHBsYXllciBpbiBlcnJvciBzdGF0ZScsIHsgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZSB9KTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgdmlkZW9QYXVzZWQ6IHZpZGVvLnBhdXNlZCxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIEdyb3VuZCB0cnV0aDogaWYgdGhlIHZpZGVvIGVsZW1lbnQgaXMgcGF1c2VkIChvciBoYXNuJ3Qgc3RhcnRlZCB5ZXQpLCBwbGF5OyBlbHNlIHBhdXNlLlxuICAgIC8vIFRoZSBvcGVyYXRpb24gcXVldWUgc2VyaWFsaXplcyB0aGVzZSBzbyBiYWNrLXRvLWJhY2sgY2xpY2tzIHJlc29sdmUgaW4gb3JkZXIuXG4gICAgaWYgKHZpZGVvLnBhdXNlZCkge1xuICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gIFNIT1cgUExBWSBQQVVTRSBPVkVSTEFZXG4gIG9uVmlkZW9GcmFtZUNsaWNrKCk6IHZvaWQge1xuICAgIC8vIFBpbiB0aGUgb3ZlcmxheSBpY29uIHRvIHRoZSB1c2VyJ3MgSU5URU5UIGZvciB0aGlzIGNsaWNrICh0aGUgYWN0aW9uIGp1c3QgdGFrZW4pLFxuICAgIC8vIGluZGVwZW5kZW50IG9mIGhvdyB0aGUgYXN5bmMgcGxheS9wYXVzZSByZXNvbHZlcy4gUHJldmVudHMgZmxpY2tlciB3aGVyZSB0aGUgaWNvblxuICAgIC8vIGJyaWVmbHkgc2hvd3MgdGhlIHByZS1jbGljayBzdGF0ZSBiZWZvcmUgZmxpcHBpbmcgd2hlbiBgaXNQbGF5aW5nYCB1cGRhdGVzLlxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHdhc1BhdXNlZCA9IHZpZGVvID8gdmlkZW8ucGF1c2VkIDogIXRoaXMuaXNQbGF5aW5nO1xuICAgIC8vIFlvdVR1YmUgY29udmVudGlvbjogYWZ0ZXIgY2xpY2tpbmcgdG8gUExBWSwgc2hvdyDilrYgKFwianVzdCBwbGF5ZWRcIik7IGFmdGVyIFBBVVNFLFxuICAgIC8vIHNob3cg4oilLiBUZW1wbGF0ZSBicmFuY2hlcyBvbiBgb3ZlcmxheVNob3dzUGxheWluZ0ljb25gIHNvIGl0IHN0YXlzIHN0YWJsZSBmb3JcbiAgICAvLyB0aGUgZW50aXJlIDUwMG1zIG92ZXJsYXkgbGlmZXRpbWUuXG4gICAgdGhpcy5vdmVybGF5U2hvd3NQbGF5aW5nSWNvbiA9IHdhc1BhdXNlZDtcblxuICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSB0cnVlO1xuICAgIGlmICh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucGxheVBhdXNlT3ZlcmxheVRpbWVyKTtcbiAgICB0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93UGxheVBhdXNlT3ZlcmxheSA9IGZhbHNlO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGxheVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBlbGltaW5hdGVzIEZGbXBlZ0RlbXV4ZXIgZXJyb3JzIGFuZCBwbGF5IHByb21pc2UgaW50ZXJydXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwbGF5VmlkZW9JbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IHBsYXlpbmcgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBsYXlpbmcsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBzdGFydGluZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCBmb3IgdmlkZW8gdG8gYmUgcmVhZHkgaWYgbmVlZGVkXG4gICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogd2FpdGluZyBmb3IgbWV0YWRhdGEnKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbyBtZXRhZGF0YScpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgaGl0IG1hcmtlcnMgaWYgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmdcbiAgICBjb25zdCBjdXJyZW50VGltZU1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuICAgIGlmIChjdXJyZW50VGltZU1zIDwgMTAwKSB7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdGUgdG8gbG9hZGluZ1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGJlZm9yZSBwbGF5aW5nXG4gICAgICBjb25zdCBjdXJyZW50VmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWN1cnJlbnRWaWRlbyB8fCBjdXJyZW50VmlkZW8gIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBvciB1bmF2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF3YWl0IHBsYXkgcHJvbWlzZSAtIHRoaXMgaXMgY3JpdGljYWxcbiAgICAgIGF3YWl0IHZpZGVvLnBsYXkoKTtcbiAgICAgIFxuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHBsYXkgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgY29uc3QgdmlkZW9BZnRlclBsYXkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJQbGF5IHx8IHZpZGVvQWZ0ZXJQbGF5ICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIHBsYXknKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQbGF5IHN1Y2NlZWRlZFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHBsYXlpbmcgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICB9KTtcbiAgICAgICAgXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nICYmIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIHYuY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBQbGF5IGZhaWxlZFxuICAgICAgLy8gQ2hlY2sgaWYgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJFcnJvciA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlckVycm9yIHx8IHZpZGVvQWZ0ZXJFcnJvciAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBlcnJvcicpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhYm9ydGVkIChleHBlY3RlZCBkdXJpbmcgcGF1c2UpJyk7XG4gICAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQsIHJlc2V0IHRvIHBhdXNlZCBzdGF0ZSBpbnN0ZWFkIG9mIGVycm9yXG4gICAgICAgIGlmICh2aWRlb0FmdGVyRXJyb3IgJiYgdmlkZW9BZnRlckVycm9yID09PSB2aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBhdXNlVmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXVzZVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgLy8gQWxyZWFkeSBwYXVzZWQgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBhdXNlZCwgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzaW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcblxuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBtZWRpYSBvcGVyYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyB0aGUgQ1JJVElDQUwgZml4IGZvciBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICogQWxsIG1lZGlhIG9wZXJhdGlvbnMgKHBsYXksIHBhdXNlLCBzZWVrLCBzd2l0Y2gpIGdvIHRocm91Z2ggdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgPSB0aGlzLm9wZXJhdGlvblF1ZXVlXG4gICAgICAudGhlbigoKSA9PiBvcGVyYXRpb24oKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBNZWRpYSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgaGFzTXVsdGlwbGVWaWRlb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIFttc10uIHNlZ21lbnRCb3VuZGFyaWVzW2ldID0gc3VtIG9mIGR1cmF0aW9ucyBbMC4uaV0gKi9cbiAgZ2V0IHNlZ21lbnRCb3VuZGFyaWVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRhcmllczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgZHVyYXRpb25zKSB7XG4gICAgICBzdW0gKz0gZDtcbiAgICAgIGJvdW5kYXJpZXMucHVzaChzdW0pO1xuICAgIH1cbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKiBUb3RhbCBkdXJhdGlvbiBhY3Jvc3MgYWxsIHNlZ21lbnRzIGluIG1zICovXG4gIGdldCB0b3RhbER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG4gIC8qKiBWaWRlbyBkdXJhdGlvbnMgaW4gbXMgKGRldGVjdGVkIG9yIGZyb20gc2luZ2xlIHZpZGVvIGVsZW1lbnQpLlxuICAgKlxuICAgKiAgTWVyZ2VzIHR3byBpbmRlcGVuZGVudCBwcm9iZXM6IGBkZXRlY3RlZFZpZGVvRHVyYXRpb25zYCAob2ZmLURPTSB0ZW1wIHZpZGVvcylcbiAgICogIGFuZCBgbGlicmFyeVZpZGVvRHVyYXRpb25zYCAodGhlIHJlbmRlcmVkIGxpYnJhcnkgdGh1bWJuYWlscykuIEVpdGhlciBjYW5cbiAgICogIHJlc29sdmUgZmlyc3QgZGVwZW5kaW5nIG9uIGJyb3dzZXIgcXVpcmtzIHdpdGggV2ViTS9JbmZpbml0eS1kdXJhdGlvbiBjbGlwcztcbiAgICogIHdlIHRha2UgdGhlIGZpcnN0IGZpbml0ZSB2YWx1ZSBwZXIgaW5kZXguICovXG4gIHByaXZhdGUgZ2V0IHZpZGVvRHVyYXRpb25zKCk6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgY29uc3QgdXJscyA9IHRoaXMudmlkZW9VcmxzIHx8IFtdO1xuICAgICAgaWYgKHVybHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICBjb25zdCBtZXJnZWQ6IG51bWJlcltdID0gbmV3IEFycmF5KHVybHMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkZXRlY3RlZCA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXRlY3RlZCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZGV0ZWN0ZWQpICYmIGRldGVjdGVkID4gMCkge1xuICAgICAgICAgIG1lcmdlZFtpXSA9IGRldGVjdGVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyb21MaWJyYXJ5UyA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tTGlicmFyeVMgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGZyb21MaWJyYXJ5UykgJiYgZnJvbUxpYnJhcnlTID4gMCkge1xuICAgICAgICAgIG1lcmdlZFtpXSA9IGZyb21MaWJyYXJ5UyAqIDEwMDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW5rbm93biB5ZXQg4oCUIGxlYXZlIHRoZSBzbG90IGFzIGEgaG9sZSBzbyBjYWxsZXJzIGNhbiBkZXRlY3QgcGFydGlhbCBzdGF0ZS5cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh2aWRlbz8uZHVyYXRpb24gJiYgaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSB7XG4gICAgICByZXR1cm4gW3ZpZGVvLmR1cmF0aW9uICogMTAwMF07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VmlkZW9NYXJrZXJzKCk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgbGV0IG1hcmtlcnNUb1Byb2Nlc3M6IFN0ZXBNYXJrZXJbXTtcbiAgICBcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID09PSAwIHx8IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPj0gYm91bmRhcmllcy5sZW5ndGgpIHtcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50Qm91bmRhcnkgPSBib3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXhdO1xuICAgICAgICBcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnNcbiAgICAgICAgICAuZmlsdGVyKG1hcmtlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSBjdXJyZW50Qm91bmRhcnkuc3RhcnQgJiYgXG4gICAgICAgICAgICAgICAgICAgbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA8IGN1cnJlbnRCb3VuZGFyeS5lbmQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKG1hcmtlciA9PiB0aGlzLmFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihcbiAgICAgICAgICAgIG1hcmtlciwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuc3RhcnQsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5lbmRcbiAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbk1hcmtlcnMobWFya2Vyc1RvUHJvY2Vzcyk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihtYXJrZXI6IFN0ZXBNYXJrZXIsIGFkanVzdG1lbnQ6IG51bWJlciwgdmlkZW9TdGFydDogbnVtYmVyLCB2aWRlb0VuZDogbnVtYmVyKTogU3RlcE1hcmtlciB7XG4gICAgY29uc3QgYWRqdXN0ZWRNYXJrZXI6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAuLi5tYXJrZXIsXG4gICAgICBjdW11bGF0aXZlRHVyYXRpb246IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gLSBhZGp1c3RtZW50XG4gICAgfTtcbiAgICBcbiAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgYWRqdXN0ZWRNYXJrZXIuY2hpbGRTdGVwcyA9IG1hcmtlci5jaGlsZFN0ZXBzXG4gICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgIC5tYXAoY2hpbGQgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2hpbGQ6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAgICAgICAuLi5jaGlsZCxcbiAgICAgICAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNoaWxkLmNoaWxkU3RlcHMgJiYgY2hpbGQuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZGp1c3RlZENoaWxkLmNoaWxkU3RlcHMgPSBjaGlsZC5jaGlsZFN0ZXBzXG4gICAgICAgICAgICAgIC5maWx0ZXIobmVzdGVkQ2hpbGQgPT4gbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgICAgICAgIC5tYXAobmVzdGVkQ2hpbGQgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obmVzdGVkQ2hpbGQsIGFkanVzdG1lbnQsIHZpZGVvU3RhcnQsIHZpZGVvRW5kKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhZGp1c3RlZENoaWxkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGFkanVzdGVkTWFya2VyO1xuICB9XG5cbiAgZ2V0U3RlcExlZnRQb3NpdGlvbihzdGVwOiBTdGVwTWFya2VyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuIDA7XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICByZXR1cm4gKHN0ZXAuY3VtdWxhdGl2ZUR1cmF0aW9uIC8gZHVyYXRpb25NcykgKiAxMDA7XG4gIH1cblxuICAvKiogRnVsbC12aWRlbyBtYXJrZXJzOiBldmVyeSBtYXJrZXIsIGZsYXR0ZW5lZCwgbGFpZCBvdXQgb24gdGhlIGdsb2JhbCB0aW1lbGluZS5cbiAgICogYHN0ZXBNYXJrZXJzYCBpcyBhbHJlYWR5IGluIGdsb2JhbCBjb29yZGluYXRlcyDigJQgYGN1cnJlbnRWaWRlb01hcmtlcnNgIGRvZXMgdGhlXG4gICAqIGludmVyc2UgKGZpbHRlcnMgKyBhZGp1c3RzIHBlci1jbGlwKTsgaGVyZSB3ZSBqdXN0IGZsYXR0ZW4gdGhlIG9yaWdpbmFsIGxpc3QuICovXG4gIGdldCBmdWxsVmlkZW9NYXJrZXJzKCk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbk1hcmtlcnModGhpcy5zdGVwTWFya2VycyB8fCBbXSk7XG4gIH1cblxuICBnZXRHbG9iYWxGdWxsU3RlcExlZnRQb3NpdGlvbihzdGVwOiBTdGVwTWFya2VyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICBpZiAoIXRvdGFsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoc3RlcC5jdW11bGF0aXZlRHVyYXRpb24gLyB0b3RhbCkgKiAxMDApKTtcbiAgfVxuXG4gIC8qKiBDdW11bGF0aXZlIGVsYXBzZWQgbXMgb24gdGhlIGdsb2JhbCB0aW1lbGluZSAocHJpb3IgY2xpcCBkdXJhdGlvbnMgKyBjdXJyZW50IGxvY2FsIHRpbWUpLiAqL1xuICBnZXQgZ2xvYmFsQ3VycmVudFRpbWVNcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGxvY2FsID0gKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgPz8gMCkgKiAxMDAwO1xuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgIGNvbnN0IHByaW9yRW5kID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDAgPyAoYm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCkgOiAwO1xuICAgIHJldHVybiBwcmlvckVuZCArIGxvY2FsO1xuICB9XG5cbiAgLyoqIDAtMTAwIHBvc2l0aW9uIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUsIGRyaXZlbiBieSB0aW1ldXBkYXRlLiAqL1xuICBnZXQgZ2xvYmFsUHJvZ3Jlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICBpZiAoIXRvdGFsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodGhpcy5nbG9iYWxDdXJyZW50VGltZU1zIC8gdG90YWwpICogMTAwKSk7XG4gIH1cblxuICAvKiogV2hpbGUgZHJhZ2dpbmcgaW4gZnVsbCBtb2RlLCB0aGUgc2NydWJiZXIgcmVhZHMgdGhlIG92ZXJyaWRlOyBvdGhlcndpc2UgZ2xvYmFsUHJvZ3Jlc3MuICovXG4gIGdldCBnbG9iYWxTY3J1YmJlclBlcmNlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2luZyA/IHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzIDogdGhpcy5nbG9iYWxQcm9ncmVzcztcbiAgfVxuXG4gIGdldFN0ZXBDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5sZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjNjM2NkYxJztcbiAgfVxuXG4gIGdldFN0ZXBSZXN1bHRDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihzdGVwLnJlc3VsdCk7XG4gIH1cblxuICBnZXRHbG9iYWxNYXJrZXJDb2xvcihsZXZlbD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxldmVsID09PSAxID8gJyMwMDAwMDAnIDogJyNGRkE1MDAnO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IocmVzdWx0OiBTdGVwTWFya2VyWydyZXN1bHQnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgIGNhc2UgJ1NVQ0NFU1MnOlxuICAgICAgICByZXR1cm4gJyMxMkI3NkEnO1xuICAgICAgY2FzZSAnRkFJTFVSRSc6XG4gICAgICAgIHJldHVybiAnI0I5MUMxQyc7XG4gICAgICBjYXNlICdBQk9SVEVEJzpcbiAgICAgICAgcmV0dXJuICcjRjc5MDA5JztcbiAgICAgIGNhc2UgJ1NLSVBQRUQnOlxuICAgICAgICByZXR1cm4gJyM2NjcwODUnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcjNjM2NkYxJztcbiAgICB9XG4gIH1cblxuICBvbk1hcmtlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBtYXJrZXI6IFN0ZXBNYXJrZXIpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbjtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChtYXJrZXIudGVzdFN0ZXBJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5hZGQobWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICB0aGlzLm1hcmtlckhpdC5lbWl0KG1hcmtlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMuY3VycmVudFZpZGVvSW5kZXgsIDApLCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0aGlzLnZpZGVvVXJsc1tpZHhdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWRlb1VybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcmVzZXRWaWRlb1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogcmVzZXR0aW5nJyk7XG5cbiAgICB2aWRlby5wYXVzZSgpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gLTE7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogY29tcGxldGUnKTtcbiAgfVxuXG4gIHByZXZWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDEpKTtcbiAgICB9XG4gIH1cblxuICBvblRpbWVsaW5lQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpY2tYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgY2xpY2tYIC8gcmVjdC53aWR0aCkpO1xuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICAgIGlmICghdG90YWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcbiAgICAgIGNvbnN0IHRhcmdldEdsb2JhbE1zID0gcGVyY2VudCAqIHRvdGFsO1xuICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vlayh0YXJnZXRHbG9iYWxNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMjApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IHBlcmNlbnQgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVGltZWxpbmVDbGljaycsIHtcbiAgICAgIHBlcmNlbnQsXG4gICAgICB0YXJnZXRUaW1lTXMsXG4gICAgICBzaG91bGRSZXN1bWVQbGF5aW5nXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0RHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENhcHR1cmUgcGxheWluZyBzdGF0ZSBCRUZPUkUgcGF1c2luZ1xuICAgIC8vIFVzZSBib3RoIGlzUGxheWluZyBmbGFnIGFuZCBwbGF5ZXJTdGF0ZSBmb3IgcmVsaWFiaWxpdHlcbiAgICB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnID0gdGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdGFydERyYWcnLCB7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgd2FzUGxheWluZ0JlZm9yZURyYWc6IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWdcbiAgICB9KTtcbiAgICBcbiAgICAvLyBQYXVzZSB2aWRlbyBkdXJpbmcgZHJhZyB0byBhdm9pZCBjb25mbGljdHNcbiAgICBpZiAodGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5hZGREcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvbkRyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgfHwgIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHggLyByZWN0LndpZHRoLCAxKSk7XG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IHBlcmNlbnQgKiAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwOyAvLyBQZXItY2xpcCB0aW1lbGluZSBwb3NpdGlvblxuICAgIH1cbiAgfVxuXG4gIHN0b3BEcmFnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuXG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IGRyYWcgZW5kZWQnLCB7XG4gICAgICBwcm9ncmVzczogdGhpcy5wcm9ncmVzcyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZzogc2hvdWxkUmVzdW1lUGxheWluZyxcbiAgICAgIGN1cnJlbnRQbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICAgIGlmICghdG90YWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHRhcmdldEdsb2JhbE1zID0gKHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzIC8gMTAwKSAqIHRvdGFsO1xuICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vlayh0YXJnZXRHbG9iYWxNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9ICh0aGlzLnByb2dyZXNzIC8gMTAwKSAqIHZpZGVvLmR1cmF0aW9uICogMTAwMDtcblxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgXG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHJlc3VtaW5nIHBsYXliYWNrIGFmdGVyIHNlZWsnLCB7XG4gICAgICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBhIGJpdCBsb25nZXIgdG8gZW5zdXJlIHNlZWsgaXMgZnVsbHkgY29tcGxldGVcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDE1MCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IHN0YXRlIGlzICdwYXVzZWQnIGFmdGVyIHNlZWsgKHNlZWtUb1RpbWVJbnRlcm5hbCBzZXRzIGl0IHRvICdwYXVzZWQnKVxuICAgICAgICAvLyBJZiBzdGF0ZSBpcyBzdGlsbCAnc2Vla2luZycsIHdhaXQgYSBiaXQgbW9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBzZWVrIHN0aWxsIGluIHByb2dyZXNzLCB3YWl0aW5nIG1vcmUnKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE5vdyByZXN1bWUgcGxheWJhY2sgKHN0YXRlIHNob3VsZCBiZSAncGF1c2VkJyBhdCB0aGlzIHBvaW50KVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBwbGF5YmFjayByZXN1bWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gc3RvcERyYWc6IHVuZXhwZWN0ZWQgc3RhdGUgYWZ0ZXIgc2VlaywgYXR0ZW1wdGluZyB0byByZXN1bWUgYW55d2F5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBUcnkgdG8gcmVzdW1lIGFueXdheSAtIGJldHRlciB0byB0cnkgdGhhbiB0byBsZWF2ZSBpdCBzdHVja1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB2aWRlbyB3YXMgcGF1c2VkLCBub3QgcmVzdW1pbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkRyYWcoZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvblZpZGVvTWV0YWRhdGFMb2FkZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCcpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cbiAgXG4gIG9uVmlkZW9DYW5QbGF5KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvQ2FuUGxheScpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBDb25zdW1lIGFueSBwZW5kaW5nIHJlY292ZXJ5IHN0YXRlIHF1ZXVlZCBieSBvblZpZGVvRXJyb3IoKTogc2VlayBiYWNrIHRvXG4gICAgLy8gd2hlcmUgcGxheWJhY2sgZXJyb3JlZCBhbmQgYXV0by1yZXN1bWUgaWYgd2Ugd2VyZSBwbGF5aW5nIGF0IHRoZSB0aW1lLlxuICAgIGlmICh0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2Vla1NlYyA9IHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYztcbiAgICAgIGNvbnN0IHNob3VsZFBsYXkgPSB0aGlzLnBlbmRpbmdSZWNvdmVyeVBsYXk7XG4gICAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlQbGF5ID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvICYmIGlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vla1NlYywgdmlkZW8uZHVyYXRpb24pKTtcbiAgICAgICAgfSBjYXRjaCAoXykgeyAvKiBlbGVtZW50IG1heSBub3QgYmUgc2Vla2FibGUgeWV0OyBoYXJtbGVzcyAqLyB9XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA4MCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIE5hdGl2ZSBlcnJvci1ldmVudCBoYW5kbGVyIGZvciB0aGUgbWFpbiA8dmlkZW8+IGVsZW1lbnQuIFRoZSBDaHJvbWUgbWVkaWFcbiAgICogc3RhY2sgb2NjYXNpb25hbGx5IHRocm93cyBcIlBpcGVsaW5lU3RhdHVzOjpQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyOlxuICAgKiBkYXRhIHNvdXJjZSBlcnJvclwiIGR1cmluZyBwbGF5YmFjayBhZnRlciBhIGJyaWVmIG5ldHdvcmsgYmxpcCBvciBhIGJ1cnN0IG9mXG4gICAqIGZhc3QgdXNlciBhY3Rpb25zOyBvbmNlIHRoYXQgaGFwcGVucyB0aGUgZWxlbWVudCBiZWNvbWVzIHVucmVzcG9uc2l2ZSB0b1xuICAgKiBwbGF5L3BhdXNlL3NlZWsuIFdlIHJlY292ZXIgYnkgdW5tb3VudGluZytyZW1vdW50aW5nIHRoZSA8dmlkZW8+IHZpYSAqbmdJZlxuICAgKiDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kXG4gICAqIHdvcmsgdG9kYXkg4oCUIHRoZW4gcmVzdG9yZSB0aGUgcHJlLWVycm9yIHBsYXloZWFkIGFuZCByZXN1bWUgcGxheWJhY2suICovXG4gIG9uVmlkZW9FcnJvcigpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlcnIgPSB2aWRlbz8uZXJyb3I7XG5cbiAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBvblZpZGVvRXJyb3Ig4oCUIHRyaWdnZXJpbmcgYXV0by1yZWNvdmVyeScsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgZXJyb3JDb2RlOiBlcnI/LmNvZGUsXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycj8ubWVzc2FnZSxcbiAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8/Lm5ldHdvcmtTdGF0ZSxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvPy5yZWFkeVN0YXRlLFxuICAgICAgY3VycmVudFZpZGVvSW5kZXg6IHRoaXMuY3VycmVudFZpZGVvSW5kZXgsXG4gICAgICBjdXJyZW50VmlkZW9Vcmw6IHRoaXMuY3VycmVudFZpZGVvVXJsLFxuICAgICAgYXR0ZW1wdHM6IHRoaXMucmVjb3ZlcnlBdHRlbXB0c1xuICAgIH0pO1xuXG4gICAgLy8gQm91bmQgdGhlIHJldHJ5IGJ1ZGdldCB0byBhIHJvbGxpbmcgd2luZG93IHNvIGEgcGVyc2lzdGVudGx5IGJyb2tlblxuICAgIC8vIHNvdXJjZSAoNDA0LCB1bnN1cHBvcnRlZCBjb2RlYywg4oCmKSBkb2Vzbid0IGZsYXAgZm9yZXZlci5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3cgLSB0aGlzLnJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0ID4gdGhpcy5SRUNPVkVSWV9XSU5ET1dfTVMpIHtcbiAgICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0ID0gbm93O1xuICAgIH1cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMrKztcbiAgICBpZiAodGhpcy5yZWNvdmVyeUF0dGVtcHRzID4gdGhpcy5NQVhfUkVDT1ZFUllfQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIG9uVmlkZW9FcnJvcjogZXhjZWVkZWQgcmVjb3ZlcnkgYXR0ZW1wdHMsIGdpdmluZyB1cCcpO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIHdoYXQgd2UgbmVlZCB0byByZXN0b3JlIGFmdGVyIHRoZSByZW1vdW50LlxuICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYyA9ICh2aWRlbyAmJiBpc0Zpbml0ZSh2aWRlby5jdXJyZW50VGltZSkpID8gdmlkZW8uY3VycmVudFRpbWUgOiAwO1xuICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5UGxheSA9IHRoaXMuaXNQbGF5aW5nO1xuXG4gICAgLy8gUHV0IHRoZSBzdGF0ZSBtYWNoaW5lIGludG8gJ2Vycm9yJyBzbyBvblZpZGVvRWxlbWVudFJlYWR5IHJlc2V0cyBpdFxuICAgIC8vIGJhY2sgdG8gJ2lkbGUnIHdoZW4gdGhlIHJlbW91bnRlZCBlbGVtZW50IGFycml2ZXMuXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gVW5tb3VudCDihpIgcmVtb3VudC4gQnJpZWYgMTAwbXMgZ2FwIG1pcnJvcnMgdGhlIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZC5cbiAgICB0aGlzLnZpZGVvUmVmcmVzaGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZpZGVvUmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uVmlkZW9FbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgLy8gU3dpdGNoIHRvIG5leHQgdmlkZW8gYW5kIGF1dG8tcGxheSBpdFxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMTtcblxuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChuZXh0SW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5jdXJyZW50VmlkZW9VcmwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgMTAwKSByZXR1cm47XG5cbiAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcbiAgICAgICAgY29uc3QgY3VycmVudE1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuXG4gICAgICAgIC8vIFNhZmV0eSBuZXQ6IGlmIGBpc1BsYXlpbmdgIGRyaWZ0ZWQgZnJvbSB0aGUgZWxlbWVudCdzIGFjdHVhbCBzdGF0ZVxuICAgICAgICAvLyAoZS5nLiBhIHF1ZXVlZCBvcCBzZXQgaXQgZmFsc2UgYnV0IHBsYXliYWNrIG5ldmVyIGFjdHVhbGx5IHN0b3BwZWQsXG4gICAgICAgIC8vIG9yIHRoZSBwbGF5IHByb21pc2UgaGFzbid0IHJlc29sdmVkIHlldCBidXQgYHBsYXlgIGZpcmVkKSwgcmVhbGlnblxuICAgICAgICAvLyBoZXJlIHNvIHRoZSB0b29sYmFyIFBsYXkvUGF1c2UgaWNvbiBkb2Vzbid0IGdldCBzdHVjayBvbiB0aGUgd3JvbmdcbiAgICAgICAgLy8gZ2x5cGggd2hpbGUgcGxheWJhY2sgY29udGludWVzLlxuICAgICAgICBjb25zdCB2aWRlb0lzUGxheWluZyA9ICF2aWRlby5wYXVzZWQ7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAhPT0gdmlkZW9Jc1BsYXlpbmcpIHtcbiAgICAgICAgICB0aGlzLmlzUGxheWluZyA9IHZpZGVvSXNQbGF5aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdzd2l0Y2hpbmcnKSB7XG4gICAgICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzICgwLTEwMCUgb2YgY3VycmVudCB2aWRlbylcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKGN1cnJlbnRNcyAvIGR1cmF0aW9uTXMpICogMTAwKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBjdW11bGF0aXZlIHRpbWUgZm9yIHBhcmVudCAoc3RlcCBoaWdobGlnaHRpbmcpXG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuXG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIHRoaXMubWF5YmVQcmVsb2FkTmV4dFNlZ21lbnQoKTtcblxuICAgICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRoZSBsaWJyYXJ5IHJvdyBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBzdGF5cyB2aXNpYmxlLlxuICAgICAgICAgIC8vIE9ubHkgd2hpbGUgcGxheWluZzsgd2hlbiBwYXVzZWQgd2UgbGVhdmUgdGhlIHJvdyB3aGVyZSB0aGUgdXNlciBsZWZ0IGl0LlxuICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4O1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDdXJyZW50Q2xpcEludG9WaWV3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBNaXJyb3IgdGhlIDx2aWRlbz4gZWxlbWVudCdzIG5hdGl2ZSBzdGF0ZSBpbnRvIGBpc1BsYXlpbmdgLiBUaGUgZWxlbWVudFxuICAgICAgLy8gaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCDigJQgdGhlIGV4aXN0aW5nIHBsYXlWaWRlb0ludGVybmFsIC8gcGF1c2VWaWRlb0ludGVybmFsXG4gICAgICAvLyBwYXRocyBzZXQgYGlzUGxheWluZ2AgYWZ0ZXIgdGhlaXIgYXN5bmMgd29yaywgYnV0IG90aGVyIHBhdGhzIChlbGVtZW50XG4gICAgICAvLyByZW1vdW50cyB2aWEgb25WaWRlb0VsZW1lbnRSZWFkeSwgZHJvcHBlZCBxdWV1ZSBvcHMsIGV0Yy4pIGNhbiBsZWF2ZSBpdFxuICAgICAgLy8gb3V0IG9mIHN5bmMgd2l0aCByZWFsaXR5LiBUaGVzZSBsaXN0ZW5lcnMgbWFrZSB0aGUgZmllbGQgc2VsZi1jb3JyZWN0aW5nLlxuICAgICAgY29uc3Qgb25QbGF5ID0gKCkgPT4geyB0aGlzLmlzUGxheWluZyA9IHRydWU7IH07XG4gICAgICBjb25zdCBvblBhdXNlID0gKCkgPT4geyB0aGlzLmlzUGxheWluZyA9IGZhbHNlOyB9O1xuXG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5Jywgb25QbGF5KTtcbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCBvblBsYXkpO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcblxuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCBvblBsYXkpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgb25QbGF5KTtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGEuXG4gICAqXG4gICAqIEJyb3dzZXItcmVjb3JkZWQgV2ViTSBjbGlwcyBmcmVxdWVudGx5IHJlcG9ydCBgZHVyYXRpb24gPT09IEluZmluaXR5YCBvbiB0aGUgZmlyc3RcbiAgICogYGxvYWRlZG1ldGFkYXRhYCBmaXJpbmc7IHRoZSByZWFsIGR1cmF0aW9uIG9ubHkgcmVzb2x2ZXMgYWZ0ZXIgc2Vla2luZyBwYXN0IHRoZSBlbmRcbiAgICogKHNhbWUgdHJpY2sgYG9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZGAgdXNlcyBmb3IgdGhlIGxpYnJhcnkgdGh1bWJuYWlscykuIFdlIG1pcnJvclxuICAgKiB0aGF0IHByb2JlIGhlcmUgc28gYGRldGVjdGVkVmlkZW9EdXJhdGlvbnNgIGVuZHMgdXAgZGVuc2UgYW5kIGB0b3RhbER1cmF0aW9uYCBpc1xuICAgKiBjb3JyZWN0IGluIEZ1bGwgVmlkZW8gbW9kZS5cbiAgICpcbiAgICogUHJlc2VydmVzIHByZXZpb3VzbHktZGV0ZWN0ZWQgZW50cmllcyBvbiByZS1pbnZvY2F0aW9uIChhcHBlbmQtb25seSB2aWRlb1VybHNcbiAgICogY2hhbmdlcyBzaG91bGRuJ3Qgd2lwZSBmaW5pc2hlZCBkZXRlY3Rpb25zIGZyb20gZWFybGllciBjbGlwcykuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91c2x5LWRldGVjdGVkIHZhbHVlcyBmb3IgZXhpc3RpbmcgaW5kZXhlczsgdHJpbS9wYWQgdG8gY3VycmVudCBsZW5ndGguXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMuc2xpY2UoMCwgdmlkZW9VcmxzLmxlbmd0aCk7XG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gcHJldmlvdXM7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZXhpc3RpbmcpICYmIGV4aXN0aW5nID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcmVzb2x2ZWQgZm9yIHRoaXMgVVJMIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICB0ZW1wVmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgICAgKHRlbXBWaWRlbyBhcyBhbnkpLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgIC8vIENocm9tZSBpZ25vcmVzIGBjdXJyZW50VGltZSA9IE1BWF9TQUZFX0lOVEVHRVJgIG9uIGEgZGV0YWNoZWQgZWxlbWVudCwgc28gdGhlXG4gICAgICAvLyBgZHVyYXRpb25jaGFuZ2VgIGV2ZW50IG5ldmVyIGZpcmVzIGZvciBJbmZpbml0eS1kdXJhdGlvbiBXZWJNIGNsaXBzLiBBdHRhY2hcbiAgICAgIC8vIG9mZi1zY3JlZW4gKDHDlzEgaW52aXNpYmxlKSBzbyB0aGUgc2VlayBwcm9iZSBhY3R1YWxseSByZXNvbHZlcywgbWF0Y2hpbmdcbiAgICAgIC8vIHRoZSBsaWJyYXJ5IHRodW1ibmFpbHMnIGJlaGF2aW9yLlxuICAgICAgdGVtcFZpZGVvLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS53aWR0aCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICB0ZW1wVmlkZW8uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFZpZGVvKTtcbiAgICAgIGxldCBwcm9iZWQgPSBmYWxzZTtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0b3JlSWZWYWxpZCA9IChkOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkICogMTAwMDtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbk1ldGFkYXRhT3JDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGQgPSB0ZW1wVmlkZW8uZHVyYXRpb247XG4gICAgICAgIGlmIChkID09PSBJbmZpbml0eSAmJiAhcHJvYmVkKSB7XG4gICAgICAgICAgLy8gV2ViTSB3aXRoIHVua25vd24gZHVyYXRpb246IGZvcmNlIHRoZSBicm93c2VyIHRvIHJlc29sdmUgYnkgc2Vla2luZyB0byB0aGVcbiAgICAgICAgICAvLyBlbmQuIFRoZSBzdWJzZXF1ZW50IGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgcmVwb3J0cyB0aGUgcmVhbCB2YWx1ZS5cbiAgICAgICAgICBwcm9iZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0ZW1wVmlkZW8uY3VycmVudFRpbWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7IC8qIHNvbWUgYnJvd3NlcnMgdGhyb3cgYmVmb3JlIG1ldGFkYXRhIGlzIHJlYWR5ICovIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0b3JlSWZWYWxpZChkKSkge1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcblxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25NZXRhZGF0YU9yQ2hhbmdlKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBjYXB0dXJlVmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dDYXB0dXJlVmlkZW8gfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuaXNDYXB0dXJpbmdWaWRlbykgcmV0dXJuO1xuICAgIHRoaXMuY2FwdHVyZVZpZGVvUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDbGlwcyByb3cgZHJhZy10by1zY3JvbGwgKG1vdXNlIGVxdWl2YWxlbnQgb2YgdG91Y2gtc3dpcGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZXNpZ246IHRyYWNraW5nIHN0YXJ0cyBvbiBtb3VzZWRvd24gYnV0IHdlIERPTidUIGZsaXAgdG8gdGhlIFwiZHJhZ2dpbmdcIiB2aXN1YWwgc3RhdGVcbiAgLy8gb3IgYmxvY2sgY2xpY2tzIHVudGlsIHRoZSBwb2ludGVyIGNyb3NzZXMgYSA1cHggdGhyZXNob2xkLiBUaGF0IHdheSBhIHBsYWluIGNsaWNrXG4gIC8vIChubyBtb3ZlbWVudCkgcmVnaXN0ZXJzIG5vcm1hbGx5IG9uIHRoZSBjYXJkIC8gZG93bmxvYWQgYnV0dG9uIHdpdGggdGhlIHVzdWFsIGN1cnNvci5cbiAgb25DbGlwc01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhc2Nyb2xsZXIpIHJldHVybjtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFNjcm9sbExlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICB9XG5cbiAgb25DbGlwc01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nIHx8ICFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuY2xpcHNEcmFnU3RhdGUuc3RhcnRYO1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlICYmIE1hdGguYWJzKGR4KSA+IDUpIHtcbiAgICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSA9IHRydWU7XG4gICAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IHRydWU7IC8vIGZsaXAgdGhlIGdyYWJiaW5nIGN1cnNvciBub3cgdGhhdCBpdCdzIGEgcmVhbCBkcmFnXG4gICAgfVxuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0U2Nyb2xsTGVmdCAtIGR4O1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZVVwKF9ldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIC8vIEtlZXAgZGlkTW92ZT10cnVlIGJyaWVmbHkgc28gdGhlIHN5bnRoZXRpYyBjbGljayBmaXJlcyBhbmQgaXMgaWdub3JlZCwgdGhlbiByZXNldC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTsgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlwc01vdXNlTGVhdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpcHNNb3VzZVVwKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBDbGljayBoYW5kbGVyIG9uIGEgVmlkZW8gTGlicmFyeSBjYXJkIOKAlCBzd2l0Y2hlcyB0aGUgbWFpbiBwbGF5ZXIgdG8gdGhhdCBjbGlwIGFuZCBhdXRvLXBsYXlzLlxuICAgKiBTZWxlY3RpbmcgYSAqZGlmZmVyZW50KiBjbGlwIGFsc28gY29sbGFwc2VzIHRoZSBsaWJyYXJ5IHNvIHRoZSBuZXdseS1wbGF5aW5nIHZpZGVvIGlzIHVub2JzdHJ1Y3RlZDtcbiAgICogcmUtY2xpY2tpbmcgdGhlIGFjdGl2ZSBjbGlwIGp1c3QgdG9nZ2xlcyBwbGF5L3BhdXNlIGFuZCBrZWVwcyB0aGUgZHJhd2VyIHN0YXRlLlxuICAgKiBJZ25vcmVkIHdoZW4gdGhlIGNsaWNrIG9yaWdpbmF0ZWQgZnJvbSBhIGhvcml6b250YWwgZHJhZy1zY3JvbGwuICovXG4gIHNlbGVjdExpYnJhcnlDbGlwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuZGVsZXRlKGluZGV4KTtcblxuICAgIC8vIEZ1bGwtbW9kZTogc2VlayB0aGUgZ2xvYmFsIHRpbWVsaW5lIHRvIHRoaXMgY2xpcCdzIHN0YXJ0LiBLZWVwIGZ1bGwgbW9kZSBhbmRcbiAgICAvLyB0aGUgbGlicmFyeSBwYW5lbCBvcGVuIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGhpZ2hsaWdodCBmb2xsb3cgYWxvbmcuXG4gICAgLy8gSWYgdGhlIGNsaWNrZWQgY2FyZCBpcyB0aGUgb25lIGFscmVhZHkgcGxheWluZyB1bmRlciB0aGUgaG9vZCwgdHJlYXQgdGhlXG4gICAgLy8gY2xpY2sgYXMgYSBwbGF5L3BhdXNlIHRvZ2dsZSAodGhlIGNhcmQncyBvdmVybGF5IGljb24gcmVmbGVjdHMgdGhhdCBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSBpbmRleCA9PT0gMCA/IDAgOiAoYm91bmRhcmllc1tpbmRleCAtIDFdID8/IDApO1xuICAgICAgY29uc3Qgc2hvdWxkUmVzdW1lID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChpbmRleCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGVyLWNhcmQgbWV0YWRhdGEgaGFuZGxlciDigJQgY2FjaGVzIGR1cmF0aW9uIHNvIHRoZSBgMDo0MmAgdGh1bWJuYWlsIGxhYmVsIGNhbiByZW5kZXIuXG4gICAqIEJvdW5kIHRvIEJPVEggYGxvYWRlZG1ldGFkYXRhYCBhbmQgYGR1cmF0aW9uY2hhbmdlYDpcbiAgICogICAtIFNvbWUgTVA0cyAoZXNwLiBzaG9ydCBjbGlwcyB3aXRoIG1vb3YgYXQgdGhlIGVuZCkgcmVwb3J0IGEgd3JvbmcvcGFydGlhbCBkdXJhdGlvblxuICAgKiAgICAgb24gYGxvYWRlZG1ldGFkYXRhYDsgQ2hyb21lIGxhdGVyIGNvcnJlY3RzIGl0IHZpYSBgZHVyYXRpb25jaGFuZ2VgLiBMaXN0ZW5pbmcgdG9cbiAgICogICAgIGJvdGggKyBrZWVwaW5nIHRoZSBtYXgtc28tZmFyIGF2b2lkcyBzdGFsZSB3cm9uZyB2YWx1ZXMgbGlrZSBcIjAwOjAxXCIgZm9yIGEgNXMgY2xpcC5cbiAgICogICAtIEZvciBzdHJlYW1lZCBNUDRzIHRoYXQgcmVwb3J0IGBJbmZpbml0eWAsIHNlZWsgdG8gdGhlIGVuZCBvbmNlIHNvIENocm9tZSBmZXRjaGVzXG4gICAqICAgICB0aGUgY3Vlcy90cmFpbGVyIGFuZCBmaXJlcyBhIGNvcnJlY3RlZCBgZHVyYXRpb25jaGFuZ2VgLiAqL1xuICBvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaW5kZXg6IG51bWJlciwgdmlkZW9FbDogSFRNTFZpZGVvRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGQgPSB2aWRlb0VsPy5kdXJhdGlvbjtcbiAgICBpZiAoZCA9PT0gSW5maW5pdHkgJiYgIXZpZGVvRWwuZGF0YXNldFsnY3FhRHVyYXRpb25Qcm9iZWQnXSkge1xuICAgICAgdmlkZW9FbC5kYXRhc2V0WydjcWFEdXJhdGlvblByb2JlZCddID0gJzEnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmlkZW9FbC5jdXJyZW50VGltZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBzb21lIGJyb3dzZXJzIHRocm93IGJlZm9yZSBtZXRhZGF0YTsgaWdub3JlICovIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpbmRleCkgfHwgMDtcbiAgICAgIGlmIChkID4gcHJldikge1xuICAgICAgICB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5zZXQoaW5kZXgsIGQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFja0xpYnJhcnlDbGlwQnlJbmRleChpbmRleDogbnVtYmVyLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluZGV4ICsgJzonICsgKHVybCB8fCAnJyk7XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGNsaXAgYXQgYGluZGV4YC4gU3RyZWFtcyB0aGUgYnl0ZXMgd2l0aCBmZXRjaCBzbyB3ZSBjYW4gc2hvdyBwcm9ncmVzcyxcbiAgICogdGhlbiBzYXZlcyB2aWEgYSB0ZW1wb3JhcnkgYmxvYiBVUkwgc28gdGhlIGZpbGUgY29tZXMgZG93biBvbiB0aGUgc2FtZSBwYWdlXG4gICAqIChubyBuZXcgdGFiIC8gd2luZG93KS4gRmFsbHMgYmFjayB0byBhIGRpcmVjdCBhbmNob3IgY2xpY2sgaWYgZmV0Y2ggaXMgdW5hdmFpbGFibGUgb3IgZmFpbHMuICovXG4gIGFzeW5jIGRvd25sb2FkQ2xpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpID8gdGhpcy52aWRlb1VybHNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghdXJsIHx8IHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpbmRleCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kZXJpdmVDbGlwRmlsZW5hbWUodXJsLCBpbmRleCk7XG4gICAgdGhpcy5kb3dubG9hZGluZ0luZGV4ZXMuYWRkKGluZGV4KTtcbiAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3Muc2V0KGluZGV4LCAwKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCcgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWQgZmFpbGVkOiAnICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLnNldChpbmRleCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChyZWNlaXZlZCAvIHRvdGFsKSAqIDEwMCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGNodW5rcyBhcyBCbG9iUGFydFtdLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcbiAgICAgIHRoaXMuc2F2ZUJsb2JBc0Rvd25sb2FkKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyBDT1JTIGJsb2NrIG9yIG5ldHdvcmsgZmFpbHVyZSDigJQgZmFsbCBiYWNrIHRvIGEgZGlyZWN0IGFuY2hvciBjbGljayAobWF5IG9wZW4gaW4gYSBuZXcgdGFiXG4gICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHNlcnZlcidzIENvbnRlbnQtRGlzcG9zaXRpb24sIGJ1dCBhdCBsZWFzdCBhbHdheXMgdHJpZ2dlcnMgdGhlIGJyb3dzZXIncyBzYXZlIGZsb3cpLlxuICAgICAgdGhpcy50cmlnZ2VyRGlyZWN0RG93bmxvYWQodXJsLCBmaWxlbmFtZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlQ2xpcEZpbGVuYW1lKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IGxhc3QgPSAodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIHx8ICcnKS5zcGxpdCgnPycpWzBdO1xuICAgICAgaWYgKGxhc3QgJiYgL1xcLlthLXowLTldKyQvaS50ZXN0KGxhc3QpKSByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LSR7bGFzdH1gO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LndlYm1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQmxvYkFzRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICBhLnJlbCA9ICdub29wZW5lcic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCksIDIwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaXJjdW1mZXJlbmNlIG9mIHRoZSA2LXJhZGl1cyBwcm9ncmVzcyByaW5nIChzZWUgY2xpcC1kb3dubG9hZC1idG5fX3JpbmcgaW4gdGVtcGxhdGUpLiAqL1xuICByZWFkb25seSBkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlOiBudW1iZXIgPSAyICogTWF0aC5QSSAqIDY7XG5cbiAgLyoqIHN0cm9rZS1kYXNob2Zmc2V0IGZvciB0aGUgcHJvZ3Jlc3MgcmluZyBvZiBjbGlwIGBpbmRleGA7IDAgPSBmdWxsLCBjaXJjdW1mZXJlbmNlID0gZW1wdHkuICovXG4gIGRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGN0ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZ2V0KGluZGV4KSB8fCAwKSk7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZSAqICgxIC0gcGN0IC8gMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckRpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgIGEucmVsID0gJ25vb3BlbmVyJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICB9XG5cbiAgb25TaG93RnVsbFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VmlkZW9MaWJyYXJ5KSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCB0aGlzLnZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmlzVmlkZW9GdWxsTW9kZSA9IHRydWU7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gLTE7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoMCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkV4aXRGdWxsVmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvRnVsbE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSAtMTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCgwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIb3Jpem9udGFsbHkgc2Nyb2xscyB0aGUgYC5jbGlwcy1yb3dgIHNvIHRoZSBjdXJyZW50bHktcGxheWluZyBjbGlwIGNhcmQgaXNcbiAgICogaW4gdGhlIHZpc2libGUgc3RyaXAuIE5vLW9wIGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgb24gc2NyZWVuLiBDYWxsZXIgZ3VhcmRzXG4gICAqIG9uIGBpc1BsYXlpbmdgIHNvIHRoZSB1c2VyIGNhbiBmcmVlbHkgc2Nyb2xsIHRoZSByb3cgd2hpbGUgcGF1c2VkLiAqL1xuICBwcml2YXRlIHNjcm9sbEN1cnJlbnRDbGlwSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLmNsaXBzU2Nyb2xsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmRzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jbGlwLWNhcmQnKTtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWRkaW5nID0gODtcbiAgICBjb25zdCBjYXJkTGVmdCA9IGNhcmQub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjYXJkUmlnaHQgPSBjYXJkTGVmdCArIGNhcmQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgdmlld0xlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgc2Nyb2xsZXIuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoY2FyZExlZnQgPCB2aWV3TGVmdCArIHBhZGRpbmcpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvKHsgbGVmdDogTWF0aC5tYXgoMCwgY2FyZExlZnQgLSBwYWRkaW5nKSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FyZFJpZ2h0ID4gdmlld1JpZ2h0IC0gcGFkZGluZykge1xuICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG8oeyBsZWZ0OiBjYXJkUmlnaHQgLSBzY3JvbGxlci5jbGllbnRXaWR0aCArIHBhZGRpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVWaWRlb0xpYnJhcnlDb2xsYXBzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9ICF0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLWgtWzIxcHhdJztcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNFMEYyRkVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzdERDNGQ11gO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUYzQzddIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDRDM0RF1gO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVFMkUyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0E1QTVdYDtcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdYDtcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRDFGQUU1XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM2RUU3QjddYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMjAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzVGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzAyODRDN10gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0Q5NzcwNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwNTk2NjldIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS02MDAgY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICB9XG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkVHJhY2VVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICB0cmFjZTogdGhpcy50cmFjZVZpZXdVcmwsXG4gICAgICAgIGhpZGVIZWFkZXI6ICd0cnVlJyxcbiAgICAgICAgaGlkZUJyYW5kaW5nOiAndHJ1ZScsXG4gICAgICAgIGVtYmVkOiAndHJ1ZScsXG4gICAgICAgIG1pbmltYWw6ICd0cnVlJyxcbiAgICAgICAgbm9IZWFkZXI6ICd0cnVlJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBgaHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldi8/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy50cmFjZVZpZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNhZmVUcmFjZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnByb2Nlc3NlZFRyYWNlVXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gIH1cblxuICBvblRyYWNlVmlld2VyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgb25TcGVlZENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSB2YWx1ZTtcbiAgICAvLyBXaGVuZXZlciBzcGVlZCBjaGFuZ2VzLCBhcHBseSBpdCB0byB0aGUgY3VycmVudCB2aWRlb1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWVkQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9ICF0aGlzLmlzU3BlZWRDb250cm9sT3BlbjtcbiAgICBpZiAodGhpcy5pc1NwZWVkQ29udHJvbE9wZW4pIHtcbiAgICAgIHRoaXMuYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgXG4gICAgICAgICAgICAhdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgXTtcbiAgICBcbiAgICAvLyBPbmx5IGFkZCBWaWRlbyB0YWIgaWYgaGlkZVZpZGVvVGFiIGlzIGZhbHNlXG4gICAgaWYgKCF0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybCkge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1RyYWNlJywgdmFsdWU6ICd0cmFjZScsIGljb246ICdncmFwaGljX2VxJyB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWdtZW50cyA9IGJhc2VTZWdtZW50cztcbiAgICBcbiAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgJ3ZpZGVvJyBhbmQgdmlkZW8gdGFiIGlzIGhpZGRlbiwgc3dpdGNoIHRvIHNjcmVlbnNob3RzXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd2aWRlbycgJiYgdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnc2NyZWVuc2hvdHMnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25WaWRlb0VsZW1lbnRSZWFkeSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHZpZGVvIGVsZW1lbnQgcmVhZHknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBBbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiBhIHByaW9yIDx2aWRlbz4gZWxlbWVudCBpcyBkZWFkIG9uY2UgaXQgdW5tb3VudHNcbiAgICAvLyAoZS5nLiBsaXZlU2Vzc2lvblZpZXcgdG9nZ2xlZCBtaWQtc3dpdGNoIOKAlCB0aGUgZGV0YWNoZWQgZWxlbWVudCBuZXZlciBmaXJlc1xuICAgIC8vIGBsb2FkZWRtZXRhZGF0YWAgYW5kIGBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbGAgaGFuZ3MgZm9yZXZlciwgYmxvY2tpbmdcbiAgICAvLyB0aGUgb3BlcmF0aW9uUXVldWUgYmVoaW5kIGl0KS4gUmVzZXQgZnJvbSBldmVyeSB0cmFuc2llbnQgc3RhdGUgYW5kIGRyb3AgdGhlXG4gICAgLy8gc3R1Y2sgY2hhaW4gc28gc3Vic2VxdWVudCB0b2dnbGVQbGF5IC8gc2VlayAvIHN3aXRjaCBjYWxscyBhY3R1YWxseSBydW4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZydcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgc3R1Y2sgc3RhdGUnLCB0aGlzLnBsYXllclN0YXRlKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0YXJnZXRWaWRlb0luZGV4IDwgMCB8fCB0YXJnZXRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVzZXItaW5pdGlhdGVkIG5hdmlnYXRpb24g4oCUIHJlc2V0IHRoZSBhdXRvLXJlY292ZXJ5IHJldHJ5IGJ1ZGdldC5cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0V2luZG93U3RhcnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHRhcmdldFZpZGVvSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUxvYWRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2V0dGxlID0gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHNldHRsZShyZXNvbHZlKTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHNldHRsZSgoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbycpKSk7XG5cbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBtZXRhZGF0YUxvYWRlZDtcblxuICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcblxuICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGFyZ2V0VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXQgZmFpbGVkOicsIGVycik7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9WaWRlb0FuZFNlZWsoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVXNlci1pbml0aWF0ZWQgc2VlayDigJQgcmVzZXQgdGhlIGF1dG8tcmVjb3ZlcnkgcmV0cnkgYnVkZ2V0LlxuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IDA7XG5cbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICBjb25zdCBzZWVrU2Vjb25kcyA9IHJlbGF0aXZlVGltZXN0YW1wIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2Vjb25kcywgdmlkZW8uZHVyYXRpb24gfHwgc2Vla1NlY29uZHMpKTtcbiAgICAgIFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qgb25TZWVrZWQgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCIgICBbbmdTdHlsZV09XCJ7XG4gIHBvc2l0aW9uOiBpc0Z1bGxTY3JlZW4gPyAnZml4ZWQnIDogbnVsbCxcbiAgaW5zZXQ6IGlzRnVsbFNjcmVlbiA/ICcxcmVtJyA6IG51bGwsXG4gIHpJbmRleDogaXNGdWxsU2NyZWVuID8gJzUwJyA6IG51bGwsXG4gIGJveFNoYWRvdzogaXNGdWxsU2NyZWVuID8gJzBweCAxM3B4IDI1cHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjI1KScgOiBudWxsLFxuICBib3JkZXJSYWRpdXM6IGlzRnVsbFNjcmVlbiA/ICcuNXJlbScgOiBudWxsLFxuICBib3JkZXI6IGlzRnVsbFNjcmVlbiA/ICcxcHggc29saWQgI0U1RTdFQicgOiBudWxsLFxuICB3aWR0aDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6IG51bGwsXG4gIGhlaWdodDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6ICcxMDAlJyxcbiAgb3ZlcmZsb3c6IGlzRnVsbFNjcmVlbiA/ICdoaWRkZW4nIDogbnVsbFxufVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyNGRkZGRkZdXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtib3gtc2hhZG93OiAwcHggMXB4IDJweCAwcHggIzAwMDAwMDBEO1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1NjcmVlbiBzaXplOiAnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoICsgJ3gnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LmhlaWdodFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgwrdcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj5cbiAgICAgICAgICAgICAge3sgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIH19eHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0NhcHR1cmVWaWRlbyAmJiBpc0xpdmVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1sb2FkaW5nXT1cImlzQ2FwdHVyaW5nVmlkZW9cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NhcHR1cmluZ1ZpZGVvXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FwdHVyZVZpZGVvKClcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NhcHR1cmluZ1ZpZGVvXCIgY2xhc3M9XCJjYXB0dXJlLXZpZGVvLWJ0bl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNDYXB0dXJpbmdWaWRlb1wiIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5fX3NwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgaXNDYXB0dXJpbmdWaWRlbyA/ICdDYXB0dXJpbmfigKYnIDogJ0NhcHR1cmUgVmlkZW8nIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKClcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNUZXh0Q2xhc3MoKVwiPnt7IGxpdmVTdGF0dXMgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJpc0xpdmUgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwibGl2ZVNlc3Npb25TZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImxpdmVTZXNzaW9uVmlld1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJzZWdtZW50c1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBhbmRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUgMS4yNUg4Ljc1VjMuNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NDk5MiAxLjI1TDUuODMzMjUgNC4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDguNzQ5NjdMNC4xNjY2NyA1LjgzMzAxXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgOC43NUgxLjI1VjYuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhpdCBmdWxsIHNjcmVlblwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NSA2LjI1SDYuMjVWOC43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1MDA4IDYuMjVMOS4xNjY3NSA5LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuODMzMjUyIDAuODMzMDA4TDMuNzQ5OTIgMy43NDk2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDMuNzVIMy43NVYxLjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1oLVtjYWxjKDEwMCUtNDFweCldXCI+XG4gICAgPCEtLSBGYXN0LWZvcndhcmQgb3ZlcmxheTogY292ZXJzIGNvbnRlbnQgYXJlYSBidXQgbm90IGhlYWRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNGYXN0Rm9yd2FyZGluZyAmJiBmYXN0Rm9yd2FyZENvbmZpZ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC02XCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQteGwgY3FhLXctZnVsbFwiXG4gICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA1MDBweDsgcGFkZGluZzogMzJweDsgYm94LXNoYWRvdzogMHB4IDI1cHggNTBweCAtMTJweCAjMDAwMDAwNDA7IGJvcmRlcjogMXB4IHNvbGlkICNFNUU1RTVcIj5cbiAgICAgICAgPCEtLSBTcGFya2xlIGF2YXRhciB3aXRoIHJvdGF0aW5nIGFyYyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWItMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsNjcsMjM4LDAuMTIpO1wiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDI0IDI2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjAyNTEgMEMxMi4xNzMgMC4wNjM0MTIxIDEyLjIzNjIgMC4yMTgyNjQgMTIuMjk2OCAwLjM2MjExQzEyLjMyNzIgMC40NDU5MjMgMTIuMzU1IDAuNTMwMTkyIDEyLjM4MjEgMC42MTUxMzNDMTIuMzkyNyAwLjY0NzY4MiAxMi40MDMzIDAuNjgwMjMxIDEyLjQxNDIgMC43MTM3NjZDMTIuNTU0OCAxLjE1MTc3IDEyLjY4MDEgMS41OTQ0NyAxMi44MDYxIDIuMDM2ODZDMTIuODM0NiAyLjEzNjczIDEyLjg2MzIgMi4yMzY1NiAxMi44OTE4IDIuMzM2MzhDMTMuMDM3NSAyLjg0NDY0IDEzLjE4MjEgMy4zNTMyMSAxMy4zMjU4IDMuODYyMDFDMTMuMzQ2IDMuOTMzNDcgMTMuMzY2MiA0LjAwNDkyIDEzLjM4NjQgNC4wNzYzOEMxMy40NDM0IDQuMjc3ODMgMTMuNTAwMyA0LjQ3OTMgMTMuNTU2OSA0LjY4MDg3QzEzLjY3NjQgNS4xMDY3OCAxMy43OTkzIDUuNTMxNDUgMTMuOTMwMSA1Ljk1NDA1QzEzLjk0MTUgNS45OTEwMiAxMy45NTI5IDYuMDI3OTkgMTMuOTY0NyA2LjA2NjA4QzE0LjMwNDUgNy4xNTMxOCAxNC43ODYyIDguMTI3NTEgMTUuNTc1NyA4Ljk1NzQzQzE1LjU5NTMgOC45NzkgMTUuNjE0OCA5LjAwMDU4IDE1LjYzNSA5LjAyMjgyQzE1Ljk3MiA5LjM4MjQ2IDE2LjQwNDUgOS42NzA2MyAxNi44MzY4IDkuOTAzMjJDMTYuODU4OCA5LjkxNTI2IDE2Ljg4MDggOS45MjcyOSAxNi45MDM1IDkuOTM5N0MxOC4xNzU3IDEwLjYyMzEgMTkuNzA1MyAxMC45MjM3IDIxLjA4MzIgMTEuMzIzOEMyMS42ODY5IDExLjQ5OTIgMjIuMjg4OCAxMS42ODAyIDIyLjg4ODUgMTEuODY5MUMyMi45MzA2IDExLjg4MjMgMjIuOTcyNyAxMS44OTU2IDIzLjAxNDkgMTEuOTA4OEMyMy4xNDA5IDExLjk0ODMgMjMuMjY2NyAxMS45ODg1IDIzLjM5MjMgMTIuMDI5M0MyMy40MjE2IDEyLjAzODUgMjMuNDUwOSAxMi4wNDc4IDIzLjQ4MSAxMi4wNTczQzIzLjY1NDEgMTIuMTE0NiAyMy44MTk3IDEyLjE4MjEgMjMuOTYxOCAxMi4yOTkyQzI0LjAwNTEgMTIuMzkzOCAyNC4wMDUxIDEyLjM5MzggMjMuOTkzMyAxMi40ODg0QzIzLjg1NSAxMi42MjU4IDIzLjcxNzkgMTIuNjkwMiAyMy41MzU0IDEyLjc1M0MyMy41MDkzIDEyLjc2MjMgMjMuNDgzMiAxMi43NzE2IDIzLjQ1NjQgMTIuNzgxMUMyMy4xNDgzIDEyLjg4OTIgMjIuODM2IDEyLjk4MzggMjIuNTIzNCAxMy4wNzc1QzIyLjQ1OTIgMTMuMDk2OSAyMi4zOTUgMTMuMTE2MyAyMi4zMzA5IDEzLjEzNTdDMjEuOTM1MiAxMy4yNTUxIDIxLjUzODkgMTMuMzcxOSAyMS4xNDIxIDEzLjQ4NzRDMjAuNjE5NSAxMy42Mzk1IDIwLjA5NzcgMTMuNzk0MiAxOS41NzYzIDEzLjk1MDZDMTkuNDkwOSAxMy45NzYzIDE5LjQwNTUgMTQuMDAxOCAxOS4zMiAxNC4wMjcyQzE4Ljg3MTIgMTQuMTYxIDE4LjQyNDYgMTQuMjk5NSAxNy45ODE3IDE0LjQ1MTZDMTcuOTQ1IDE0LjQ2NDIgMTcuOTA4MiAxNC40NzY4IDE3Ljg3MDQgMTQuNDg5N0MxNi4zODcgMTUuMDA1OSAxNS4yNTYzIDE1Ljk2ODcgMTQuNTQ4NiAxNy4zNzY4QzE0LjE2NyAxOC4xNjgxIDEzLjk0MTkgMTkuMDIzOSAxMy43MTI0IDE5Ljg2ODVDMTMuNjUwMyAyMC4wOTY0IDEzLjU4NDIgMjAuMzIzIDEzLjUxNzUgMjAuNTQ5NkMxMy40NjUxIDIwLjcyNzggMTMuNDEzOSAyMC45MDY0IDEzLjM2NCAyMS4wODUzQzEzLjM1OCAyMS4xMDY2IDEzLjM1MjEgMjEuMTI3OSAxMy4zNDYgMjEuMTQ5OUMxMy4zMTcyIDIxLjI1MyAxMy4yODg1IDIxLjM1NjIgMTMuMjYgMjEuNDU5NEMxMy4xODcyIDIxLjcyMTEgMTMuMTA4NyAyMS45ODA3IDEzLjAyODEgMjIuMjQwMUMxMi44ODUxIDIyLjcwMTIgMTIuNzU0OSAyMy4xNjU2IDEyLjYyNTYgMjMuNjMwNkMxMi40MzA1IDI0LjMzMDggMTIuNDMwNSAyNC4zMzA4IDEyLjMxOTkgMjQuNjY3NEMxMi4zMTI2IDI0LjY5IDEyLjMwNTIgMjQuNzEyNiAxMi4yOTc3IDI0LjczNTlDMTIuMjU3MyAyNC44NTU3IDEyLjIxNTggMjQuOTY2IDEyLjEzOTQgMjUuMDY3NEMxMi4wMjMxIDI1LjA5MyAxMi4wMjMxIDI1LjA5MyAxMS45MTg3IDI1LjA5ODlDMTEuNzk5MyAyNC45MjQ5IDExLjcyMDIgMjQuNzU2MiAxMS42NTY5IDI0LjU1NTNDMTEuNjQ3NiAyNC41MjY5IDExLjYzODQgMjQuNDk4NCAxMS42Mjg5IDI0LjQ2OTFDMTEuNTExNiAyNC4xMDE5IDExLjQwNjcgMjMuNzMwOSAxMS4zMDE4IDIzLjM2QzExLjI3NzggMjMuMjc1MiAxMS4yNTM2IDIzLjE5MDQgMTEuMjI5NSAyMy4xMDU2QzExLjA0OTYgMjIuNDczNyAxMC44NzI3IDIxLjg0MDkgMTAuNjk2IDIxLjIwODFDOS45NjAxOSAxOC4wNzc1IDkuOTYwMTkgMTguMDc3NSA4LjEwNCAxNS41NDY0QzguMDc0MjUgMTUuNTIyMiA4LjA0NDUgMTUuNDk3OSA4LjAxMzg1IDE1LjQ3MjlDNi43OTc2NyAxNC40OTg5IDUuMTk1NTYgMTQuMTM4MiAzLjcyODQgMTMuNzE1NUMzLjM2NTUzIDEzLjYxMDkgMy4wMDI4IDEzLjUwNTggMi42NDAwOSAxMy40MDA3QzIuNjA4MzcgMTMuMzkxNSAyLjYwODM3IDEzLjM5MTUgMi41NzYwMSAxMy4zODIxQzIuMDUyODMgMTMuMjMwNCAxLjUyOTggMTMuMDc4MyAxLjAwODYgMTIuOTE5OUMwLjk4NjU0OSAxMi45MTMyIDAuOTY0NSAxMi45MDY2IDAuOTQxNzgzIDEyLjg5OTdDMC4xNDEwNjQgMTIuNjU3OCAwLjE0MTA2NCAxMi42NTc4IDAuMDAxNzI0MSAxMi40ODg0Qy0wLjAwMjIxNjcgMTIuNDExNSAtMC4wMDIyMTY3IDEyLjQxMTUgMC4wMzMyNTA1IDEyLjMzMDdDMC4xNzg4ODkgMTIuMTg4IDAuMzIwMjA1IDEyLjEyNjkgMC41MTI0MjYgMTIuMDY0N0MwLjU0MDI1OSAxMi4wNTU0IDAuNTY4MDkgMTIuMDQ2IDAuNTk2NzY2IDEyLjAzNjRDMC42ODIwMDggMTIuMDA3OSAwLjc2NzQzNiAxMS45ODAxIDAuODUyOTM2IDExLjk1MjRDMC44NzczMzUgMTEuOTQ0NCAwLjkwMTczNSAxMS45MzY0IDAuOTI2ODc0IDExLjkyODJDMS4wOTk0MyAxMS44NzE2IDEuMjcyNiAxMS44MTcxIDEuNDQ2MDMgMTEuNzYzM0MxLjQ4ODY0IDExLjc1IDEuNDg4NjQgMTEuNzUgMS41MzIxMiAxMS43MzY0QzIuMjcyNzIgMTEuNTA2MSAzLjAxODE1IDExLjI5MTcgMy43NjMzNiAxMS4wNzY5QzQuMzE4NjYgMTAuOTE2OCA0Ljg3MzAyIDEwLjc1NCA1LjQyNTYxIDEwLjU4NDdDNS40NTEgMTAuNTc3IDUuNDc2NCAxMC41NjkyIDUuNTAyNTYgMTAuNTYxM0M2Ljc4MjY3IDEwLjE3MDUgOC4wMzQwOSA5LjYxNjEyIDguODYwNjMgOC41MTYwNkM4Ljg3MyA4LjQ5OTc0IDguODg1MzggOC40ODM0MiA4Ljg5ODEzIDguNDY2NjFDOS44MTg2IDcuMjQ1NjQgMTAuMTc3NSA1Ljc2MDgyIDEwLjU3ODUgNC4zMTIwMUMxMC43MTA1IDMuODM1NTIgMTAuODQ0IDMuMzU5NDcgMTAuOTc3OSAyLjg4MzU2QzExLjAxNSAyLjc1MTc3IDExLjA1MjEgMi42MTk5NyAxMS4wODkgMi40ODgxMkMxMS4yMzcyIDEuOTU4NTIgMTEuMzg3NiAxLjQyOTY0IDExLjU0NjcgMC45MDMxODFDMTEuNTYxNiAwLjg1Mzg4MiAxMS41NzY0IDAuODA0NTYxIDExLjU5MTEgMC43NTUyMThDMTEuODEzOCAwLjAxMTEyMDUgMTEuODEzOCAwLjAxMTEyMDUgMTIuMDI1MSAwWlwiIGZpbGw9XCIjM0Y0M0VFXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkuMjk2MiAxLjU0ODk5QzE5LjQ0MSAxLjcxMjggMTkuNDY5OSAxLjkwNTMyIDE5LjUxNSAyLjExNDQ5QzE5LjY2NTMgMi43NzE2MSAxOS44Mzg0IDMuMzc1ODQgMjAuNDM5NCAzLjc1NzU2QzIwLjgxMDIgMy45NjI2MyAyMS4yNTIyIDQuMDU1OTUgMjEuNjYzIDQuMTQ0MDlDMjEuODM2NCA0LjE4MjA1IDIxLjk4MjkgNC4yMzI0MiAyMi4xMzE2IDQuMzMzMTZDMjIuMTY1MSA0LjM4NjM2IDIyLjE2NTEgNC4zODYzNiAyMi4xNjMyIDQuNDc4OTdDMjIuMTI4NyA0LjU5MTU5IDIyLjA5ODQgNC42Mjc5MSAyMi4wMDc1IDQuNzAxNjNDMjEuOTA4MSA0LjczNDg4IDIxLjkwODEgNC43MzQ4OCAyMS43ODg4IDQuNzYwNzRDMjEuNzQzNyA0Ljc3MTEgMjEuNjk4NSA0Ljc4MTU4IDIxLjY1MzUgNC43OTIxNEMyMS42MjkzIDQuNzk3NzQgMjEuNjA1MSA0LjgwMzM1IDIxLjU4MDMgNC44MDkxMkMyMC44NDU2IDQuOTc5MDcgMjAuODQ1NiA0Ljk3OTA3IDIwLjIxMDUgNS4zNjM2OEMyMC4xODk5IDUuMzgwMyAyMC4xNjkyIDUuMzk2OTIgMjAuMTQ3OSA1LjQxNDA1QzE5LjY5NDEgNS44MTQyNiAxOS41OTgxIDYuNDggMTkuNDYxNSA3LjAzNzdDMTkuNDUzNiA3LjA2ODMzIDE5LjQ0NTggNy4wOTg5NiAxOS40Mzc3IDcuMTMwNTFDMTkuNDMxIDcuMTU3NjIgMTkuNDI0MiA3LjE4NDc0IDE5LjQxNzIgNy4yMTI2N0MxOS4zODc3IDcuMjk1NDYgMTkuMzU3MiA3LjM0OTQ1IDE5LjI5NjIgNy40MTI4OUMxOS4xMjY2IDcuNDM0NDQgMTkuMTI2NiA3LjQzNDQ0IDE5LjA0NCA3LjQxMjg5QzE4LjkxMjggNy4zMTExNCAxOC44ODM0IDcuMTk1MjQgMTguODQ5MSA3LjAzOTVDMTguODQzMyA3LjAxNTM5IDE4LjgzNzYgNi45OTEyNyAxOC44MzE3IDYuOTY2NDJDMTguODEzNCA2Ljg4OTQgMTguNzk1NiA2LjgxMjI2IDE4Ljc3OCA2LjczNTA4QzE4LjYzOTggNi4xMzQwMyAxOC40ODM3IDUuNTQ0MzIgMTcuOTMyNCA1LjE5MjAxQzE3LjUwMTUgNC45NTE3MiAxNi45Nzc2IDQuODM4MDggMTYuNDk2IDQuNzQ2MzFDMTYuMzY0IDQuNzE4ODMgMTYuMjg4NCA0LjY4NDI3IDE2LjIwNjcgNC41NzU1MkMxNi4xODg5IDQuNDY1MTggMTYuMTg4OSA0LjQ2NTE4IDE2LjIwNjcgNC4zNTQ4NEMxNi4zMzIyIDQuMjI0ODQgMTYuNDY0NCA0LjE5MzExIDE2LjYzNDIgNC4xNTM4NkMxNi42ODc3IDQuMTQwNjEgMTYuNzQxMiA0LjEyNzI2IDE2Ljc5NDcgNC4xMTM4M0MxNi44MjIzIDQuMTA2OTQgMTYuODUgNC4xMDAwNCAxNi44Nzg0IDQuMDkyOTRDMTcuMDE5MyA0LjA1NjY4IDE3LjE1ODggNC4wMTYwMiAxNy4yOTgzIDMuOTc0NTVDMTcuMzIzNiAzLjk2NzIgMTcuMzQ4OSAzLjk1OTg1IDE3LjM3NTEgMy45NTIyN0MxNy42NTg1IDMuODY3NTIgMTcuOTAzMiAzLjc1OTExIDE4LjEyOTggMy41NjY2OEMxOC4xNTA5IDMuNTQ5MjggMTguMTcyIDMuNTMxODkgMTguMTkzOCAzLjUxMzk3QzE4LjU0NjUgMy4xOTY1OCAxOC42NjYzIDIuNzE5NzYgMTguNzc1MSAyLjI3NDg0QzE4Ljc4MzQgMi4yNDEwNiAxOC43OTE2IDIuMjA3MjggMTguODAwMiAyLjE3MjQ4QzE4LjgxNjcgMi4xMDQ2MyAxOC44MzI5IDIuMDM2NyAxOC44NDg4IDEuOTY4N0MxOC44NjAyIDEuOTIxMzkgMTguODYwMiAxLjkyMTM5IDE4Ljg3MTcgMS44NzMxMkMxOC44Nzg0IDEuODQ0ODYgMTguODg1IDEuODE2NTkgMTguODkxOCAxLjc4NzQ3QzE4LjkyMDkgMS42OTc0OSAxOC45NTkgMS42MjY4MyAxOS4wMTI1IDEuNTQ4OTlDMTkuMTE1MyAxLjQ5NzYxIDE5LjE4NzQgMS41MjA4NCAxOS4yOTYyIDEuNTQ4OTlaXCIgZmlsbD1cIiMwRjEyQThcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk00Ljc4ODEgMTcuNDIxOUM0LjgyNTYxIDE3LjQyMjIgNC44MjU2MSAxNy40MjIyIDQuODYzODcgMTcuNDIyNUM1LjEzMjk2IDE3LjQzMDcgNS4zMTUwMyAxNy41MTY5IDUuNTEzMjEgMTcuNjk3OEM1Ljc0MzgxIDE3Ljk0NjkgNS44NTAyOSAxOC4yMjc5IDUuODQ0MjMgMTguNTYzN0M1LjgxODMzIDE4LjgzNTkgNS42NTc3OSAxOS4wNzM2IDUuNDYwODcgMTkuMjU3NkM1LjIyOTA4IDE5LjQ0NDcgNC45OTUyNSAxOS41MDY1IDQuNjk5MDYgMTkuNDk3OUM0LjQ0OTMzIDE5LjQ2ODggNC4yMTQzOCAxOS4zNTAyIDQuMDM3MzggMTkuMTcxN0MzLjgxNzI2IDE4Ljg3MTMgMy43NTI5MSAxOC41OTU4IDMuNzg1MTcgMTguMjI1OUMzLjg1MTggMTcuOTM0NiA0LjA0MzkgMTcuNjk4MSA0LjI4OTU5IDE3LjUzMjNDNC40NjAyNyAxNy40NDU4IDQuNTk3NTUgMTcuNDIwMyA0Ljc4ODEgMTcuNDIxOVpcIiBmaWxsPVwiIzEyMTZDQ1wiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgIHdpZHRoPVwiNjBcIiBoZWlnaHQ9XCI2MFwiIHZpZXdCb3g9XCIwIDAgNjAgNjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogLTJweDsgbGVmdDogLTJweDtcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjMwXCIgY3k9XCIzMFwiIHI9XCIyOFwiIHN0cm9rZT1cIiNFMkUyRTNcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZmLXNwaW5cIlxuICAgICAgICAgICAgICAgICB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IC0ycHg7IGxlZnQ6IC0ycHg7IHRyYW5zZm9ybS1vcmlnaW46IDMwcHggMzBweDtcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMCAyIEEgMjggMjggMCAwIDEgNTQuMjQgNDRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtbS0wIGNxYS1tYi0yXCJcbiAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMTYxNjE3O1wiPlxuICAgICAgICAgIEZhc3QtZm9yd2FyZGluZyB0byB5b3VyIHN0ZXBcbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1tLTBcIlxuICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM2RDZENzQ7XCI+XG4gICAgICAgICAgU3RlcHMge3sgZmFzdEZvcndhcmRDb25maWcuZnJvbVN0ZXAgfX3igJN7eyBmYXN0Rm9yd2FyZENvbmZpZy50b1N0ZXAgfX0gYXJlIHJ1bm5pbmcgYXQgZnVsbCBzcGVlZCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+TGl2ZSB2aWV3IGFuZCBzY3JlZW5zaG90cyBhcmUgcGF1c2VkPC9zdHJvbmc+XG4gICAgICAgICAgdW50aWwgZXhlY3V0aW9uIHJlYWNoZXMgeW91ciB0YXJnZXQgc3RlcCDigJQgdGhlbiB5b3UncmUgaW4gYXV0b21hdGljYWxseS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNiBjcWEtbWItNVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzRDNEM1MTtcIj5TdGVwcyBleGVjdXRpbmcgaW4gYmFja2dyb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzZENkQ3NDtcIj5cbiAgICAgICAgICAgICAge3sgZmFzdEZvcndhcmRDb25maWcuY3VycmVudFN0ZXAgfX0gb2Yge3sgZmFzdEZvcndhcmRDb25maWcudG90YWxTdGVwcyB9fSBzdGVwc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMzsgYm9yZGVyLXJhZGl1czogOTk5OXB4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGguJV09XCJmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMzRjQzRUUgMCUsICM4MThDRjggMTAwJSk7IHRyYW5zaXRpb246IHdpZHRoIDMwMG1zIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSk7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICM2MzY2RjExQTsgYm9yZGVyOiAxcHggc29saWQgIzYzNjZGMTMzO1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjYuNVwiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiM1wiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMVwiIGZpbGw9XCIjM2Y0M2VlXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0O1wiPkp1bXBpbmcgdG88L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjM0Y0M0VFOyBmb250LXdlaWdodDogNDAwOyBkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgU3RlcCB7eyBmYXN0Rm9yd2FyZENvbmZpZy50YXJnZXRTdGVwTnVtYmVyIH19IOKAlCA8c3BhbiBbaW5uZXJIVE1MXT1cImZhc3RGb3J3YXJkQ29uZmlnLnRhcmdldFN0ZXBMYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiBpc0xpdmUgJiYgbGl2ZVNlc3Npb25WaWV3ID09PSAnbGl2ZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1vdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICdjcWEtaC1mdWxsJzogIXVzZUNzc0Jyb3dzZXJGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1hdXRvJzogaGFzRGV2aWNlRnJhbWUgJiYgIXVzZUNzc0Jyb3dzZXJGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1mbGV4LWNvbCc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAnY3FhLW1heC1oLWZ1bGwnOiBoYXNEZXZpY2VGcmFtZSAmJiAoZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgfHwgIWlzTGl2ZSksXG4gICAgICAgICAgICAgICAnY3FhLW1pbi13LW1heCc6IGhhc0RldmljZUZyYW1lICYmIGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScsXG4gICAgICAgICAgICAgICAnY3FhLWZsZXgtY29sJzogdXNlQ3NzQnJvd3NlckZyYW1lXG4gICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgW25nU3R5bGVdPVwidXNlQ3NzQnJvd3NlckZyYW1lID8gY3NzQnJvd3NlckZyYW1lT3V0ZXJTdHlsZSA6IGxpdmVDb250ZW50Q29udGFpbmVyU3R5bGVcIj5cblxuICAgICAgICAgIDwhLS0gQ1NTLWJ1aWx0IGJyb3dzZXIgY2hyb21lIGJhciAodXNlZCB3aGVuIHVzZUNzc0Jyb3dzZXJGcmFtZSkuXG4gICAgICAgICAgICAgICBIZWlnaHQgc2NhbGVzIHdpdGggd2lkdGggdmlhIGFzcGVjdC1yYXRpbyAoMzA6MSwgY2xhbXBlZFxuICAgICAgICAgICAgICAgMjDigJM0MHB4KSBzbyB0aGUgY2hyb21lIHNocmlua3Mgd2hlbiB0aGUgc3BsaXR0ZXIgbmFycm93c1xuICAgICAgICAgICAgICAgdGhlIHNpbXVsYXRvciBhbmQgZ3Jvd3MgYWdhaW4gd2hlbiBpdCB3aWRlbnMuIERvdHMgdXNlXG4gICAgICAgICAgICAgICBwZXJjZW50LW9mLXBhcmVudCBzbyB0aGV5IHRyYWNrIHRoZSBiYXIncyBoZWlnaHQuIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VDc3NCcm93c2VyRnJhbWVcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB4LTMgY3FhLWJnLVsjMmEyYTJhXVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cImFzcGVjdC1yYXRpbzogMzAgLyAxOyBtaW4taGVpZ2h0OiAyMHB4OyBtYXgtaGVpZ2h0OiA0MHB4OyBmbGV4OiAwIDAgYXV0bzsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtcm91bmRlZC1mdWxsIGNxYS1tci0yXCIgc3R5bGU9XCJhc3BlY3QtcmF0aW86IDE7IGhlaWdodDogMzUlOyBiYWNrZ3JvdW5kOiAjRkY1RjU3O1wiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtcm91bmRlZC1mdWxsIGNxYS1tci0yXCIgc3R5bGU9XCJhc3BlY3QtcmF0aW86IDE7IGhlaWdodDogMzUlOyBiYWNrZ3JvdW5kOiAjRkVCQzJFO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtcm91bmRlZC1mdWxsXCIgc3R5bGU9XCJhc3BlY3QtcmF0aW86IDE7IGhlaWdodDogMzUlOyBiYWNrZ3JvdW5kOiAjMjhDODQwO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gSW1hZ2UtYmFzZWQgbW9ja3VwIChkZWZhdWx0IC8gbGVnYWN5IGZyYW1lKS4gLS0+XG4gICAgICAgICAgPGltZyAqbmdJZj1cImhhc0RldmljZUZyYW1lICYmICF1c2VDc3NCcm93c2VyRnJhbWVcIlxuICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgJ2NxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2wnOiBoYXNEZXZpY2VGcmFtZSAmJiAhdXNlQ3NzQnJvd3NlckZyYW1lLFxuICAgICAgICAgICAgICAgICAnY3FhLWZsZXgtMSBjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLW92ZXJmbG93LWhpZGRlbic6IHVzZUNzc0Jyb3dzZXJGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlJzogIWhhc0RldmljZUZyYW1lLFxuICAgICAgICAgICAgICAgICAnY3FhLXotMjAnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJyAmJiAhdXNlQ3NzQnJvd3NlckZyYW1lLFxuICAgICAgICAgICAgICAgICAnY3FhLWJnLXdoaXRlJzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgJiYgIXVzZUNzc0Jyb3dzZXJGcmFtZVxuICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoaGFzRGV2aWNlRnJhbWUgJiYgIXVzZUNzc0Jyb3dzZXJGcmFtZSkgPyBkZXZpY2VTY3JlZW5TdHlsZSA6IHt9XCI+XG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi00XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgZGlhbWV0ZXI9XCI0MFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+e3sgbGl2ZUxvYWRpbmdMYWJlbCB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIExpdmUgQ29udGVudCAod2hlbiBub3QgbG9hZGluZykgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ29udGVudFZpZGVvTG9hZGluZ1wiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxpdmVTdGF0dXMgPT09ICdGYWlsZWQnICYmIGZhaWxlZFN0YXR1c01lc3NhZ2VcIiBjbGFzcz1cImNxYS1wLTYgY3FhLXRleHQtY2VudGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS0zIGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICNDNjM1MzU7IGZvbnQtc2l6ZTogMThweDtcIj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLW0tMFwiPnt7IGZhaWxlZFN0YXR1c01lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctY29udGVudCAqbmdJZj1cImxpdmVTdGF0dXMgIT09ICdGYWlsZWQnIHx8ICFmYWlsZWRTdGF0dXNNZXNzYWdlXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFZpZGVvIFZpZXc6IHBvc3QtZXhlY3V0aW9uIFZpZGVvIHRhYiwgb3IgbWlkLXNlc3Npb24gQ2FwdHVyZWQgdmlldyBpbnNpZGUgYSBsaXZlIHNlc3Npb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFpc0Zhc3RGb3J3YXJkaW5nICYmICgoIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3ZpZGVvJykgfHwgKGlzTGl2ZSAmJiBsaXZlU2Vzc2lvblZpZXcgPT09ICdjYXB0dXJlZCcpKVwiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sXCJcbiAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICByb2xlPVwicmVnaW9uXCJcbiAgICAgICAgIGFyaWEtbGFiZWw9XCJWaWRlbyBwbGF5YmFja1wiXG4gICAgICAgICAoa2V5ZG93bik9XCJvblZpZGVvS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJywgJ2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWUsICdjcWEtbWF4LWgtW2NhbGMoMTAwJS0xMDhweCldJzogc2hvd1ZpZGVvTGlicmFyeSwgJ2NxYS1tYXgtaC1bY2FsYygxMDAlLTYwcHgpXSc6ICFzaG93VmlkZW9MaWJyYXJ5fVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWU7IGVsc2UgdmlkZW9Ob0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICdjcWEtaC1mdWxsIGNxYS13LWF1dG8nOiAhdXNlQ3NzQnJvd3NlckZyYW1lLFxuICAgICAgICAgICAgICAgICAgICdjcWEtZmxleC1jb2wgY3FhLW92ZXJmbG93LWhpZGRlbic6IHVzZUNzc0Jyb3dzZXJGcmFtZSxcbiAgICAgICAgICAgICAgICAgICAnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLFxuICAgICAgICAgICAgICAgICAgICdjcWEtbWluLXctbWF4JzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJyAmJiAhdXNlQ3NzQnJvd3NlckZyYW1lXG4gICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ1c2VDc3NCcm93c2VyRnJhbWUgPyBjc3NCcm93c2VyRnJhbWVPdXRlclN0eWxlIDoge31cIj5cblxuICAgICAgICAgICAgICA8IS0tIENTUy1idWlsdCBicm93c2VyIGNocm9tZSBiYXIgKHVzZWQgd2hlbiB1c2VDc3NCcm93c2VyRnJhbWUpLiAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZUNzc0Jyb3dzZXJGcmFtZVwiXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB4LTMgY3FhLWJnLVsjMmEyYTJhXVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJhc3BlY3QtcmF0aW86IDMwIC8gMTsgbWluLWhlaWdodDogMjBweDsgbWF4LWhlaWdodDogNDBweDsgZmxleDogMCAwIGF1dG87IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLW1yLTJcIiBzdHlsZT1cImFzcGVjdC1yYXRpbzogMTsgaGVpZ2h0OiAzNSU7IGJhY2tncm91bmQ6ICNGRjVGNTc7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtcm91bmRlZC1mdWxsIGNxYS1tci0yXCIgc3R5bGU9XCJhc3BlY3QtcmF0aW86IDE7IGhlaWdodDogMzUlOyBiYWNrZ3JvdW5kOiAjRkVCQzJFO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2sgY3FhLXJvdW5kZWQtZnVsbFwiIHN0eWxlPVwiYXNwZWN0LXJhdGlvOiAxOyBoZWlnaHQ6IDM1JTsgYmFja2dyb3VuZDogIzI4Qzg0MDtcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gSW1hZ2UtYmFzZWQgbW9ja3VwIChkZWZhdWx0IC8gbGVnYWN5IGZyYW1lKS4gLS0+XG4gICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhdXNlQ3NzQnJvd3NlckZyYW1lXCJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtbWF4LWgtZnVsbCBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAnY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCc6ICF1c2VDc3NCcm93c2VyRnJhbWUsXG4gICAgICAgICAgICAgICAgICAgICAnY3FhLWZsZXgtMSBjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtcmVsYXRpdmUnOiB1c2VDc3NCcm93c2VyRnJhbWUsXG4gICAgICAgICAgICAgICAgICAgICAnY3FhLWJnLXdoaXRlJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgJiYgIXVzZUNzc0Jyb3dzZXJGcmFtZVxuICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInVzZUNzc0Jyb3dzZXJGcmFtZSA/IHt9IDogZGV2aWNlU2NyZWVuU3R5bGVcIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXZpZGVvUmVmcmVzaGluZ1wiXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdjcWEtei0yMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInICYmICF1c2VDc3NCcm93c2VyRnJhbWUsXG4gICAgICAgICAgICAgICAgICAgICdjcWEtb2JqZWN0LWNvdmVyJzogdXNlQ3NzQnJvd3NlckZyYW1lLFxuICAgICAgICAgICAgICAgICAgICAnY3FhLW9iamVjdC1jb250YWluJzogIXVzZUNzc0Jyb3dzZXJGcmFtZVxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25WaWRlb0ZyYW1lQ2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25WaWRlb01ldGFkYXRhTG9hZGVkKClcIlxuICAgICAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgICAgICAoZW5kZWQpPVwib25WaWRlb0VuZGVkKClcIlxuICAgICAgICAgICAgICAgICAgKGVycm9yKT1cIm9uVmlkZW9FcnJvcigpXCJcbiAgICAgICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgICAgICA8IS0tIFBsYXkvUGF1c2Ugb3ZlcmxheSBpY29uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UGxheVBhdXNlT3ZlcmxheVwiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTMwJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInthbmltYXRpb246ICdjcWFGYWRlT3V0IDUwMG1zIGVhc2Utb3V0IGZvcndhcmRzJ31cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1ibGFjayBjcWEtYmctb3BhY2l0eS01MCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDU2cHg7IGhlaWdodDogNTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJY29uIHBpbm5lZCB0byB0aGUganVzdC10YWtlbiBhY3Rpb24gKHNldCBpbiBvblZpZGVvRnJhbWVDbGljaykgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICBkb2Vzbid0IGZsaWNrZXIgYXMgYGlzUGxheWluZ2AgZmxpcHMgYXN5bmMgYmV0d2VlbiBwbGF5KCkgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpdHMgcHJvbWlzZSByZXNvbHZpbmcuIC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwib3ZlcmxheVNob3dzUGxheWluZ0ljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUsMyAxOSwxMiA1LDIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhb3ZlcmxheVNob3dzUGxheWluZ0ljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI1XCIgeT1cIjNcIiB3aWR0aD1cIjRcIiBoZWlnaHQ9XCIxOFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjE1XCIgeT1cIjNcIiB3aWR0aD1cIjRcIiBoZWlnaHQ9XCIxOFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3ZpZGVvTm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00IGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwib25WaWRlb0ZyYW1lQ2xpY2soKVwiPlxuICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXZpZGVvUmVmcmVzaGluZ1wiXG4gICAgICAgICAgICAgICN2cGxheWVyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudFZpZGVvVXJsXCJcbiAgICAgICAgICAgICAgdHlwZT1cInZpZGVvL3dlYm1cIlxuICAgICAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25WaWRlb01ldGFkYXRhTG9hZGVkKClcIlxuICAgICAgICAgICAgICAoY2FucGxheSk9XCJvblZpZGVvQ2FuUGxheSgpXCJcbiAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uVmlkZW9FbmRlZCgpXCJcbiAgICAgICAgICAgICAgKGVycm9yKT1cIm9uVmlkZW9FcnJvcigpXCJcbiAgICAgICAgICAgID48L3ZpZGVvPlxuICAgICAgICAgICAgPCEtLSBQbGF5L1BhdXNlIG92ZXJsYXkgaWNvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UGxheVBhdXNlT3ZlcmxheVwiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie2FuaW1hdGlvbjogJ2NxYUZhZGVPdXQgNTAwbXMgZWFzZS1vdXQgZm9yd2FyZHMnfVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDU2cHg7IGhlaWdodDogNTZweDtcIj5cbiAgICAgICAgICAgICAgICA8IS0tIEljb24gcGlubmVkIHRvIHRoZSBqdXN0LXRha2VuIGFjdGlvbiAoc2V0IGluIG9uVmlkZW9GcmFtZUNsaWNrKSBzbyBpdFxuICAgICAgICAgICAgICAgICAgICAgZG9lc24ndCBmbGlja2VyIGFzIGBpc1BsYXlpbmdgIGZsaXBzIGFzeW5jIGJldHdlZW4gcGxheSgpIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgIGFuZCBpdHMgcHJvbWlzZSByZXNvbHZpbmcuIC0tPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJvdmVybGF5U2hvd3NQbGF5aW5nSWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFvdmVybGF5U2hvd3NQbGF5aW5nSWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjE1XCIgeT1cIjNcIiB3aWR0aD1cIjRcIiBoZWlnaHQ9XCIxOFwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIWN1cnJlbnRWaWRlb1VybFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNWTkNTZXNzaW9uSW50cnVwcHRlZCAmJiB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZTsgZWxzZSBub1ZpZGVvRGVmYXVsdFwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIHt7IHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1ZpZGVvRGVmYXVsdD5cbiAgICAgICAgICA8c3Bhbj5ObyB2aWRlbyByZWNvcmRpbmcgZm91bmQ8L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDwhLS0gVmlkZW8gTGlicmFyeSBQYW5lbCDigJQgcmVzZXJ2ZXMgb25seSBoZWFkZXItaGVpZ2h0IGluIGZsb3c7IHRoZSBpbm5lciBwYW5lbCBpcyBhYnNvbHV0ZWx5IGFuY2hvcmVkIHRvIGl0cyBib3R0b20gZWRnZSwgc28gdGhlIGJvZHkgZXhwYW5kaW5nIG1ha2VzIHRoZSBwYW5lbCBncm93IFVQV0FSRCBvdmVyIHRoZSB2aWRlby4gVGltZWxpbmUgc3RheXMgcHV0LiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VmlkZW9MaWJyYXJ5ICYmIHZpZGVvVXJscyAmJiB2aWRlb1VybHMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgIGNsYXNzPVwidmlkZW8tbGlicmFyeVwiXG4gICAgICAgICAgIFtjbGFzcy52aWRlby1saWJyYXJ5LS1vcGVuXT1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZX1cIj5cbiAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tbGlicmFyeV9faW5uZXJcIj5cbiAgICAgICAgPCEtLSBIZWFkZXIg4oCUIGFsd2F5cyB2aXNpYmxlLCBjbGlja2luZyB0aGUgY2hldnJvbiB0b2dnbGVzIHRoZSBib2R5IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tbGlicmFyeV9faGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX3RpdGxlLWdyb3VwXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19pY29uXCI+XG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOS4zMzM5OCA3LjU4MzA4TDEyLjM4MDcgOS42MTQyNUMxMi40MjQ3IDkuNjQzNDggMTIuNDc1NyA5LjY2MDI0IDEyLjUyODQgOS42NjI3NkMxMi41ODExIDkuNjY1MjggMTIuNjMzNSA5LjY1MzQ3IDEyLjY4IDkuNjI4NTZDMTIuNzI2NSA5LjYwMzY2IDEyLjc2NTQgOS41NjY2MSAxMi43OTI1IDkuNTIxMzZDMTIuODE5NiA5LjQ3NjEgMTIuODM0IDkuNDI0MzQgMTIuODM0IDkuMzcxNThWNC41OTA1OEMxMi44MzQgNC41MzkyNiAxMi44MjA1IDQuNDg4ODUgMTIuNzk0OCA0LjQ0NDQzQzEyLjc2OTEgNC40MDAwMSAxMi43MzIxIDQuMzYzMTUgMTIuNjg3NiA0LjMzNzU5QzEyLjY0MzEgNC4zMTIwMyAxMi41OTI2IDQuMjk4NjYgMTIuNTQxMyA0LjI5ODgzQzEyLjQ5IDQuMjk5IDEyLjQzOTYgNC4zMTI3MiAxMi4zOTUzIDQuMzM4NThMOS4zMzM5OCA2LjEyNDc1XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xNjYwMiAzLjVIMi4zMzI2OEMxLjY4ODM1IDMuNSAxLjE2NjAyIDQuMDIyMzMgMS4xNjYwMiA0LjY2NjY3VjkuMzMzMzNDMS4xNjYwMiA5Ljk3NzY3IDEuNjg4MzUgMTAuNSAyLjMzMjY4IDEwLjVIOC4xNjYwMkM4LjgxMDM1IDEwLjUgOS4zMzI2OCA5Ljk3NzY3IDkuMzMyNjggOS4zMzMzM1Y0LjY2NjY3QzkuMzMyNjggNC4wMjIzMyA4LjgxMDM1IDMuNSA4LjE2NjAyIDMuNVpcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWRlby1saWJyYXJ5X190aXRsZVwiPlZpZGVvIExpYnJhcnk8L3NwYW4+XG4gICAgICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIGlubGluZVN0eWxlcz1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7XCJcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yPVwiI0VERTlGRVwiXG4gICAgICAgICAgICAgIHRleHRDb2xvcj1cIiM2RDI4RDlcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwidmlkZW9VcmxzLmxlbmd0aCArICcgY2xpcCcgKyAodmlkZW9VcmxzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKVwiPlxuICAgICAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX3N1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImlzVmlkZW9GdWxsTW9kZSA/ICdQbGF5aW5nIGFsbCBjbGlwcyBhcyBvbmUgY29udGludW91cyB2aWRlbycgOiAnRWFjaCBjbGlwIGNvdmVycyBleGVjdXRpb24gc2luY2UgbGFzdCBjYXB0dXJlJ1wiXG4gICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiPnt7IGlzVmlkZW9GdWxsTW9kZSA/ICfCtyBQbGF5aW5nIGFsbCBjbGlwcyBhcyBvbmUgY29udGludW91cyB2aWRlbycgOiAnwrcgRWFjaCBjbGlwIGNvdmVycyBleGVjdXRpb24gc2luY2UgbGFzdCBjYXB0dXJlJyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tbGlicmFyeV9fYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIGljb249XCJwbGF5X2Fycm93XCJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwic3RhcnRcIlxuICAgICAgICAgICAgICB0ZXh0PVwiU2hvdyBGdWxsIFZpZGVvXCJcbiAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25TaG93RnVsbFZpZGVvKClcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgaWNvbj1cImNsb3NlXCJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwic3RhcnRcIlxuICAgICAgICAgICAgICB0ZXh0PVwiRXhpdCBGdWxsIFZpZGVvXCJcbiAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25FeGl0RnVsbFZpZGVvKClcIj5cbiAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlkZW8tbGlicmFyeV9fY29sbGFwc2VcIiAoY2xpY2spPVwidG9nZ2xlVmlkZW9MaWJyYXJ5Q29sbGFwc2VkKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID8gJ1Nob3cgdmlkZW8gbGlicmFyeScgOiAnSGlkZSB2aWRlbyBsaWJyYXJ5J1wiPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA3LjVMNiA0LjVMOSA3LjVcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgNy41TDkgNC41XCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQm9keSAoY2FyZHMpIOKAlCBtYXgtaGVpZ2h0IGFuaW1hdGVzIGZyb20gMCAoY29sbGFwc2VkKSB0byBhIGZpeGVkIGhlaWdodCAob3BlbikuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tbGlicmFyeV9fYm9keVwiXG4gICAgICAgICAgICAgW2NsYXNzLnZpZGVvLWxpYnJhcnlfX2JvZHktLW9wZW5dPVwiIWlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkXCJcbiAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCJpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA/IHRydWUgOiBudWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXBzLXJvd1wiXG4gICAgICAgICAgICAgICAjY2xpcHNTY3JvbGxlclxuICAgICAgICAgICAgICAgW2NsYXNzLmNsaXBzLXJvdy0tZHJhZ2dpbmddPVwiY2xpcHNEcmFnQWN0aXZlXCJcbiAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25DbGlwc01vdXNlRG93bigkZXZlbnQsIGNsaXBzU2Nyb2xsZXIpXCJcbiAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25DbGlwc01vdXNlTW92ZSgkZXZlbnQsIGNsaXBzU2Nyb2xsZXIpXCJcbiAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9uQ2xpcHNNb3VzZVVwKCRldmVudClcIlxuICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25DbGlwc01vdXNlTGVhdmUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdXJsIG9mIHZpZGVvVXJsczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tMaWJyYXJ5Q2xpcEJ5SW5kZXhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNsaXAtY2FyZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5jbGlwLWNhcmQtLXBsYXlpbmddPVwiaSA9PT0gY3VycmVudFZpZGVvSW5kZXhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtdGh1bWJcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jbGlwLXRodW1iLS1yZWFkeV09XCJsaWJyYXJ5VmlkZW9EdXJhdGlvbnMuaGFzKGkpXCJcbiAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TGlicmFyeUNsaXAoaSlcIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICNjbGlwVmlkZW9cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpcC10aHVtYl9fdmlkZW9cIlxuICAgICAgICAgICAgICAgICAgW3NyY109XCJ1cmxcIlxuICAgICAgICAgICAgICAgICAgcHJlbG9hZD1cIm1ldGFkYXRhXCJcbiAgICAgICAgICAgICAgICAgIHBsYXlzaW5saW5lXG4gICAgICAgICAgICAgICAgICBtdXRlZFxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZChpLCBjbGlwVmlkZW8pXCJcbiAgICAgICAgICAgICAgICAgIChkdXJhdGlvbmNoYW5nZSk9XCJvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaSwgY2xpcFZpZGVvKVwiPjwvdmlkZW8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtdGh1bWJfX292ZXJsYXlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iX19wbGF5LWNpcmNsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIShpID09PSBjdXJyZW50VmlkZW9JbmRleCAmJiBpc1BsYXlpbmcpXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy41IDEuNzVMMTEuMzc1IDdMMy41IDEyLjI1VjEuNzVaXCIgZmlsbD1cIiNGRkZGRkZcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaSA9PT0gY3VycmVudFZpZGVvSW5kZXggJiYgaXNQbGF5aW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzLjVcIiB5PVwiMi41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIwLjVcIiBmaWxsPVwiI0ZGRkZGRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiOFwiIHk9XCIyLjVcIiB3aWR0aD1cIjIuNVwiIGhlaWdodD1cIjlcIiByeD1cIjAuNVwiIGZpbGw9XCIjRkZGRkZGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaSA9PT0gY3VycmVudFZpZGVvSW5kZXggJiYgaXNQbGF5aW5nXCIgY2xhc3M9XCJjbGlwLXRodW1iX19iYWRnZSBjbGlwLXRodW1iX19iYWRnZS0tcGxheWluZ1wiPlBMQVlJTkc8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJuZXdWaWRlb0luZGV4ZXMuaGFzKGkpICYmIGkgIT09IGN1cnJlbnRWaWRlb0luZGV4XCIgY2xhc3M9XCJjbGlwLXRodW1iX19iYWRnZSBjbGlwLXRodW1iX19iYWRnZS0tbmV3XCI+TkVXPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xpcC10aHVtYl9fZHVyYXRpb25cIj57eyBmb3JtYXRUaW1lKGxpYnJhcnlWaWRlb0R1cmF0aW9ucy5nZXQoaSkgfHwgMCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC1tZXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtbWV0YV9fdGl0bGVcIj5DbGlwIHt7IGkgKyAxIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaXAtZG93bmxvYWQtYnRuXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5jbGlwLWRvd25sb2FkLWJ0bi0tZG93bmxvYWRpbmddPVwiZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRDbGlwKGkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpZ21hIGljb246IHVwd2FyZCBhcnJvdyB3aXRoIGEgc2hvcnQgdHJheSBsaW5lIGF0IHRoZSBib3R0b20gKHNoYXJlL2V4cG9ydCBnbHlwaCkuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiA4LjVWMk02IDJMMyA1TTYgMkw5IDVNMyAxMC41SDlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Eb3dubG9hZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNsaXAtZG93bmxvYWQtYnRuX19yaW5nXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cIiNFNUU3RUJcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cImRvd25sb2FkUmluZ0NpcmN1bWZlcmVuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hvZmZzZXRdPVwiZG93bmxvYWRSaW5nRGFzaG9mZnNldChpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoLTkwIDcgNylcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkb3dubG9hZFByb2dyZXNzLmdldChpKSB8fCAwIH19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LTIgY3FhLWJnLXdoaXRlXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIiBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWUgJiYgIShzaG93VmlkZW9MaWJyYXJ5ICYmIHZpZGVvVXJscyAmJiB2aWRlb1VybHMubGVuZ3RoID4gMCl9XCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmwgJiYgKCFpc0xpdmUgfHwgbGl2ZVNlc3Npb25WaWV3ID09PSAnY2FwdHVyZWQnKVwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1tYi0yIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBWaWRlbyB7eyBjdXJyZW50VmlkZW9JbmRleCArIDEgfX0gcGxheWluZyBvdXQgb2Yge3sgdmlkZW9VcmxzPy5sZW5ndGggfHwgMCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3MgJiYgIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFZpZGVvSW5kZXggPT09IDBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogY3VycmVudFZpZGVvSW5kZXggPT09IDB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJwcmV2VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiUHJldmlvdXMgdmlkZW9cIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjMzc0MTUxXVwiIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiPnNraXBfcHJldmlvdXM8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgc3R5bGU9XCJ3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4O1wiPlxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgIGRpYW1ldGVyPVwiMTZcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgIDwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICAqbmdJZj1cIiFpc1BsYXllclN3aXRjaGluZ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQbGF5KClcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgaXNQbGF5aW5nID8gJ1BhdXNlJyA6ICdQbGF5JyB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAyTDEzIDhMMyAxNFYyWlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNQbGF5aW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiMlwiIHdpZHRoPVwiM1wiIGhlaWdodD1cIjEyXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTBcIiB5PVwiMlwiIHdpZHRoPVwiM1wiIGhlaWdodD1cIjEyXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJoYXNNdWx0aXBsZVZpZGVvcyAmJiAhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiB2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm5leHRWaWRlbygpXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJOZXh0IHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiB2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKX1cIj5za2lwX25leHQ8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVs5cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGNxYS1pbmxpbmUtYmxvY2tcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICAgICAge3sgZm9ybWF0VGltZShpc1ZpZGVvRnVsbE1vZGUgPyAoZ2xvYmFsQ3VycmVudFRpbWVNcyAvIDEwMDApIDogKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDApKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgIDxkaXYgI3NwZWVkQ29udHJvbENvbnRhaW5lciBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtbXItWzhweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmUgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lIGNxYS1weC0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNwZWVkQ29udHJvbCgpXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1BsYXliYWNrIFNwZWVkJ1wiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2JlbG93J1wiPlxuICAgICAgICAgICAgICB7eyBjdXJyZW50U3BlZWQgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAqbmdJZj1cImlzU3BlZWRDb250cm9sT3BlblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1ib3R0b20tZnVsbCBjcWEtbWItMiBjcWEtcmlnaHQtMCBjcWEtYmctWyNGMEYwRjFdIGNxYS1yb3VuZGVkLWxnIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXNoYWRvdy1sZyBjcWEtei01MFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOiBtYXgtY29udGVudDsgbGVmdDogNTAlOyBib3R0b206IDAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgei1pbmRleDogMTAxO1wiPlxuICAgICAgICAgICAgICA8Y3FhLXNlZ21lbnQtY29udHJvbFxuICAgICAgICAgICAgICAgIFtzZWdtZW50c109XCJzcGVlZFNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFNwZWVkXCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyQmdDb2xvcl09XCInI0YwRjBGMSdcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNwZWVkQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICN0aW1lbGluZUJhclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC0xIGNxYS1iZy1ncmF5LTIwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdy1mdWxsXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGltZWxpbmVDbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1hcmtlciBvZiAoaXNWaWRlb0Z1bGxNb2RlID8gZnVsbFZpZGVvTWFya2VycyA6IGN1cnJlbnRWaWRlb01hcmtlcnMpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwiaXNWaWRlb0Z1bGxNb2RlID8gZ2V0R2xvYmFsRnVsbFN0ZXBMZWZ0UG9zaXRpb24obWFya2VyKSA6IGdldFN0ZXBMZWZ0UG9zaXRpb24obWFya2VyKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInOHB4J1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRHbG9iYWxNYXJrZXJDb2xvcihtYXJrZXIubGV2ZWwpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCInMnB4IHNvbGlkICcgKyBnZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihtYXJrZXIucmVzdWx0KVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3gtc2l6aW5nXT1cIidib3JkZXItYm94J1wiXG4gICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm1hcmtlci50aXRsZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87IHotaW5kZXg6IDUwOyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB0b3A6IDUwJTtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25NYXJrZXJDbGljaygkZXZlbnQsIG1hcmtlcilcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LTAgY3FhLXRvcC0wIGNxYS1oLWZ1bGwgY3FhLWJnLWJsdWUtNTAwIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJpc1ZpZGVvRnVsbE1vZGUgPyBnbG9iYWxTY3J1YmJlclBlcmNlbnQgOiBwcm9ncmVzc1wiXG4gICAgICAgICAgICAgIFtzdHlsZS50cmFuc2l0aW9uXT1cImRyYWdnaW5nID8gJ25vbmUnIDogJ3dpZHRoIDEwMG1zJ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IDI7XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtdG9wLTEvMiBjcWEtdy0zIGNxYS1oLTMgY3FhLWJnLWJsdWUtNjAwIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1ncmFiIGFjdGl2ZTpjcWEtY3Vyc29yLWdyYWJiaW5nIGNxYS1zaGFkb3ctbWRcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImlzVmlkZW9GdWxsTW9kZSA/IGdsb2JhbFNjcnViYmVyUGVyY2VudCA6IHByb2dyZXNzXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgei1pbmRleDogNjA7XCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydERyYWcoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVs5cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGNxYS1tci0yXCI+XG4gICAgICAgICAgICB7eyBmb3JtYXRUaW1lKGlzVmlkZW9GdWxsTW9kZSA/ICh0b3RhbER1cmF0aW9uIC8gMTAwMCkgOiAodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uZHVyYXRpb24gfHwgMCkpIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0Zhc3RGb3J3YXJkaW5nICYmICFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICdzY3JlZW5zaG90cydcIiBjbGFzcz1cImNxYS1oLWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwic2NyZWVuU2hvdFVybFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWU7IGVsc2Ugc2NyZWVuc2hvdE5vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1heC1oLWZ1bGxcIlxuICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgJ2NxYS1oLWZ1bGwgY3FhLXctYXV0byc6ICF1c2VDc3NCcm93c2VyRnJhbWUsXG4gICAgICAgICAgICAgICAgICAgJ2NxYS1mbGV4LWNvbCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogdXNlQ3NzQnJvd3NlckZyYW1lLFxuICAgICAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1tYXgnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnICYmICF1c2VDc3NCcm93c2VyRnJhbWVcbiAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInVzZUNzc0Jyb3dzZXJGcmFtZSA/IGNzc0Jyb3dzZXJGcmFtZU91dGVyU3R5bGUgOiB7fVwiPlxuXG4gICAgICAgICAgICAgIDwhLS0gQ1NTLWJ1aWx0IGJyb3dzZXIgY2hyb21lIGJhciAodXNlZCB3aGVuIHVzZUNzc0Jyb3dzZXJGcmFtZSkuIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlQ3NzQnJvd3NlckZyYW1lXCJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtMyBjcWEtYmctWyMyYTJhMmFdXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cImFzcGVjdC1yYXRpbzogMzAgLyAxOyBtaW4taGVpZ2h0OiAyMHB4OyBtYXgtaGVpZ2h0OiA0MHB4OyBmbGV4OiAwIDAgYXV0bzsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2sgY3FhLXJvdW5kZWQtZnVsbCBjcWEtbXItMlwiIHN0eWxlPVwiYXNwZWN0LXJhdGlvOiAxOyBoZWlnaHQ6IDM1JTsgYmFja2dyb3VuZDogI0ZGNUY1NztcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLW1yLTJcIiBzdHlsZT1cImFzcGVjdC1yYXRpbzogMTsgaGVpZ2h0OiAzNSU7IGJhY2tncm91bmQ6ICNGRUJDMkU7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtcm91bmRlZC1mdWxsXCIgc3R5bGU9XCJhc3BlY3QtcmF0aW86IDE7IGhlaWdodDogMzUlOyBiYWNrZ3JvdW5kOiAjMjhDODQwO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIiF1c2VDc3NCcm93c2VyRnJhbWVcIlxuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW1heC1oLVtpbmhlcml0XSc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1heC1oLWZ1bGwnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICdjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sJzogIXVzZUNzc0Jyb3dzZXJGcmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICdjcWEtZmxleC0xIGNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1iZy13aGl0ZSBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1yZWxhdGl2ZSc6IHVzZUNzc0Jyb3dzZXJGcmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICdjcWEtYmctd2hpdGUnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJyAmJiAhdXNlQ3NzQnJvd3NlckZyYW1lXG4gICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwidXNlQ3NzQnJvd3NlckZyYW1lID8ge30gOiBkZXZpY2VTY3JlZW5TdHlsZVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJTY3JlZW5zaG90XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJyAmJiAhdXNlQ3NzQnJvd3NlckZyYW1lfVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzY3JlZW5zaG90Tm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhc2NyZWVuU2hvdFVybFwiPlxuICAgICAgICBObyBzY3JlZW5zaG90IGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3RyYWNlJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXJlbGF0aXZlXCIgKm5nSWY9XCJ0cmFjZVZpZXdVcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIiBzdHlsZT1cInBhZGRpbmctdG9wOiA0OHB4OyBwYWRkaW5nLWJvdHRvbTogMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgPGlmcmFtZSBcbiAgICAgICAgICAgIFtzcmNdPVwic2FmZVRyYWNlVXJsXCIgXG4gICAgICAgICAgICB0aXRsZT1cIlRyYWNlIFZpZXdlclwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1taW4taC1bMjUwcHhdIGNxYS1tYXgtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IC00OHB4OyBoZWlnaHQ6IGNhbGMoMTAwJSArIDQ4cHgpO1wiXG4gICAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgKGxvYWQpPVwib25UcmFjZVZpZXdlckxvYWQoKVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25UcmFjZVZpZXdlckVycm9yKClcIj5cbiAgICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJMb2FkaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIExvYWRpbmcgdHJhY2Ugdmlld2VyLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyRXJyb3JcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgdHJhY2Ugdmlld2VyXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiF0cmFjZVZpZXdVcmxcIj5cbiAgICAgICAgTm8gdHJhY2UgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==