@cqa-lib/cqa-ui 1.1.100 → 1.1.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/simulator/simulator.component.mjs +225 -12
- package/fesm2015/cqa-lib-cqa-ui.mjs +220 -11
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +222 -11
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/simulator/simulator.component.d.ts +28 -2
- package/package.json +1 -1
- package/src/lib/assets/images/mockups/apple-iphone-11.png +0 -0
- package/src/lib/assets/images/mockups/apple-iphone-13.png +0 -0
- package/src/lib/assets/images/mockups/apple-iphone-15.png +0 -0
- package/src/lib/assets/images/mockups/apple-iphone-xr.png +0 -0
- package/src/lib/assets/images/mockups/browser-mockup.png +0 -0
- package/src/lib/assets/images/mockups/pixel-5.png +0 -0
- package/src/lib/assets/images/mockups/pixel-8.png +0 -0
- package/src/lib/assets/images/mockups/pixel-9-pro.webp +0 -0
- package/src/lib/assets/images/mockups/samsung-galaxy-s20.png +0 -0
- package/styles.css +1 -1
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
|
|
2
|
+
import { getEmptyStatePreset } from '../empty-state/empty-state-presets.constants';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
import * as i1 from "@angular/platform-browser";
|
|
4
5
|
import * as i2 from "@angular/material/icon";
|
|
5
6
|
import * as i3 from "../segment-control/segment-control.component";
|
|
6
7
|
import * as i4 from "@angular/material/progress-spinner";
|
|
7
8
|
import * as i5 from "@angular/common";
|
|
9
|
+
import * as i6 from "@angular/material/tooltip";
|
|
8
10
|
export class SimulatorComponent {
|
|
9
11
|
constructor(sanitizer) {
|
|
10
12
|
this.sanitizer = sanitizer;
|
|
11
13
|
this.videoUrl = '';
|
|
14
|
+
this.videoUrls = [];
|
|
12
15
|
this.videoCurrentDuration = 0;
|
|
13
16
|
this.stepMarkers = [];
|
|
14
17
|
this.screenShotUrl = '';
|
|
15
18
|
this.traceViewUrl = '';
|
|
16
19
|
this.platformName = 'Web - Chrome';
|
|
17
20
|
this.platformType = 'browser';
|
|
21
|
+
this.deviceName = null;
|
|
18
22
|
this.isLive = false;
|
|
19
23
|
this.liveStatus = 'In Progress';
|
|
20
24
|
this.liveLoadingLabel = 'Loading...';
|
|
@@ -30,6 +34,7 @@ export class SimulatorComponent {
|
|
|
30
34
|
this.isPlaying = false;
|
|
31
35
|
this.isFullScreen = false;
|
|
32
36
|
this.currentView = 'video';
|
|
37
|
+
this.currentVideoIndex = 0;
|
|
33
38
|
this.segments = [
|
|
34
39
|
{ label: 'Screenshots', value: 'screenshots', icon: 'photo' },
|
|
35
40
|
{ label: 'Video', value: 'video', icon: 'videocam' },
|
|
@@ -40,15 +45,162 @@ export class SimulatorComponent {
|
|
|
40
45
|
this.dragMouseUpHandler = null;
|
|
41
46
|
this.traceViewerLoading = false;
|
|
42
47
|
this.traceViewerError = false;
|
|
48
|
+
this.isCorrectDeviceFrameAvailable = false;
|
|
49
|
+
this.emptyStateConfig = getEmptyStatePreset('nothingToDisplay');
|
|
50
|
+
this.deviceErrorEmptyStateConfig = {
|
|
51
|
+
...this.emptyStateConfig,
|
|
52
|
+
title: 'Device Not Supported',
|
|
53
|
+
description: 'The device you are trying to use is not supported.',
|
|
54
|
+
actions: []
|
|
55
|
+
};
|
|
56
|
+
this.deviceFrameConfigs = {
|
|
57
|
+
// Pixels
|
|
58
|
+
'Pixel 5': {
|
|
59
|
+
mockupImage: 'assets/images/mockups/pixel-5.png',
|
|
60
|
+
screenInset: {
|
|
61
|
+
top: '2%',
|
|
62
|
+
right: '4.5%',
|
|
63
|
+
bottom: '2%',
|
|
64
|
+
left: '4.5%'
|
|
65
|
+
},
|
|
66
|
+
borderRadius: '4%'
|
|
67
|
+
},
|
|
68
|
+
'Pixel 8': {
|
|
69
|
+
mockupImage: 'assets/images/mockups/pixel-8.png',
|
|
70
|
+
screenInset: {
|
|
71
|
+
top: '2%',
|
|
72
|
+
right: '4.5%',
|
|
73
|
+
bottom: '2.5%',
|
|
74
|
+
left: '4.5%'
|
|
75
|
+
},
|
|
76
|
+
borderRadius: '4%'
|
|
77
|
+
},
|
|
78
|
+
'Pixel 9': {
|
|
79
|
+
mockupImage: 'assets/images/mockups/pixel-9-pro.webp',
|
|
80
|
+
screenInset: {
|
|
81
|
+
top: '4%',
|
|
82
|
+
right: '6%',
|
|
83
|
+
bottom: '4%',
|
|
84
|
+
left: '6%'
|
|
85
|
+
},
|
|
86
|
+
borderRadius: '5%'
|
|
87
|
+
},
|
|
88
|
+
// iPhones
|
|
89
|
+
'iPhone 11': {
|
|
90
|
+
mockupImage: 'assets/images/mockups/apple-iphone-11.png',
|
|
91
|
+
screenInset: {
|
|
92
|
+
top: '3%',
|
|
93
|
+
right: '7.5%',
|
|
94
|
+
bottom: '3%',
|
|
95
|
+
left: '7.5%'
|
|
96
|
+
},
|
|
97
|
+
borderRadius: '4%'
|
|
98
|
+
},
|
|
99
|
+
'iPhone 13': {
|
|
100
|
+
mockupImage: 'assets/images/mockups/apple-iphone-13.png',
|
|
101
|
+
screenInset: {
|
|
102
|
+
top: '2%',
|
|
103
|
+
right: '5%',
|
|
104
|
+
bottom: '2%',
|
|
105
|
+
left: '5%'
|
|
106
|
+
},
|
|
107
|
+
borderRadius: '4%'
|
|
108
|
+
},
|
|
109
|
+
'iPhone 15': {
|
|
110
|
+
mockupImage: 'assets/images/mockups/apple-iphone-15.png',
|
|
111
|
+
screenInset: {
|
|
112
|
+
top: '1.5%',
|
|
113
|
+
right: '4.5%',
|
|
114
|
+
bottom: '1.5%',
|
|
115
|
+
left: '4.5%'
|
|
116
|
+
},
|
|
117
|
+
borderRadius: '4%'
|
|
118
|
+
},
|
|
119
|
+
'iPhone XR': {
|
|
120
|
+
mockupImage: 'assets/images/mockups/apple-iphone-xr.png',
|
|
121
|
+
screenInset: {
|
|
122
|
+
top: '3.5%',
|
|
123
|
+
right: '7.5%',
|
|
124
|
+
bottom: '3.5%',
|
|
125
|
+
left: '7.5%'
|
|
126
|
+
},
|
|
127
|
+
borderRadius: '4%'
|
|
128
|
+
},
|
|
129
|
+
'Galaxy S20 FE': {
|
|
130
|
+
mockupImage: 'assets/images/mockups/samsung-galaxy-s20.png',
|
|
131
|
+
screenInset: {
|
|
132
|
+
top: '1.5%',
|
|
133
|
+
right: '3%',
|
|
134
|
+
bottom: '1.5%',
|
|
135
|
+
left: '3%'
|
|
136
|
+
},
|
|
137
|
+
borderRadius: '4%'
|
|
138
|
+
},
|
|
139
|
+
browser: {
|
|
140
|
+
mockupImage: 'assets/images/mockups/browser-mockup.png',
|
|
141
|
+
screenInset: {
|
|
142
|
+
top: '6%',
|
|
143
|
+
right: '0%',
|
|
144
|
+
bottom: '0%',
|
|
145
|
+
left: '0%'
|
|
146
|
+
},
|
|
147
|
+
borderRadius: '0%'
|
|
148
|
+
}
|
|
149
|
+
};
|
|
43
150
|
this.safeTraceUrl = this.sanitizer.bypassSecurityTrustResourceUrl('');
|
|
44
151
|
this.updateSegments();
|
|
45
152
|
}
|
|
153
|
+
set vplayerRef(ref) {
|
|
154
|
+
if (!ref)
|
|
155
|
+
return;
|
|
156
|
+
this._vplayer = ref;
|
|
157
|
+
this.onVideoElementReady();
|
|
158
|
+
}
|
|
159
|
+
get vplayer() {
|
|
160
|
+
return this._vplayer;
|
|
161
|
+
}
|
|
162
|
+
get hasDeviceFrame() {
|
|
163
|
+
return !!this.deviceFrameConfig;
|
|
164
|
+
}
|
|
165
|
+
get deviceFrameConfig() {
|
|
166
|
+
if (this.platformType === 'browser') {
|
|
167
|
+
return this.deviceFrameConfigs['browser'] || null;
|
|
168
|
+
}
|
|
169
|
+
if (!this.deviceName) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
return this.deviceFrameConfigs[this.deviceName] || null;
|
|
173
|
+
}
|
|
174
|
+
get deviceMockupImage() {
|
|
175
|
+
return this.deviceFrameConfig?.mockupImage || '';
|
|
176
|
+
}
|
|
177
|
+
get deviceScreenStyle() {
|
|
178
|
+
const cfg = this.deviceFrameConfig;
|
|
179
|
+
if (!cfg) {
|
|
180
|
+
return {};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
position: 'absolute',
|
|
184
|
+
top: cfg.screenInset.top,
|
|
185
|
+
right: cfg.screenInset.right,
|
|
186
|
+
bottom: cfg.screenInset.bottom,
|
|
187
|
+
left: cfg.screenInset.left,
|
|
188
|
+
'border-radius': cfg.borderRadius,
|
|
189
|
+
overflow: 'hidden'
|
|
190
|
+
};
|
|
191
|
+
}
|
|
46
192
|
ngAfterViewInit() {
|
|
47
193
|
this.currentView = this.selectedView;
|
|
48
194
|
this.attachVideoListeners();
|
|
49
195
|
this.updateSafeTraceUrl();
|
|
50
196
|
}
|
|
51
197
|
ngOnChanges(changes) {
|
|
198
|
+
if (changes['videoUrls']) {
|
|
199
|
+
const arr = changes['videoUrls'].currentValue;
|
|
200
|
+
if (arr && arr.length > 0) {
|
|
201
|
+
this.currentVideoIndex = 0;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
52
204
|
if (changes['videoCurrentDuration'] && !changes['videoCurrentDuration'].firstChange) {
|
|
53
205
|
const newDuration = changes['videoCurrentDuration'].currentValue;
|
|
54
206
|
if (newDuration !== this.lastSetDuration && this.vplayer?.nativeElement) {
|
|
@@ -88,17 +240,60 @@ export class SimulatorComponent {
|
|
|
88
240
|
}
|
|
89
241
|
}
|
|
90
242
|
togglePlay() {
|
|
91
|
-
|
|
243
|
+
const video = this.vplayer?.nativeElement;
|
|
244
|
+
if (!video)
|
|
245
|
+
return;
|
|
246
|
+
// Do not attempt to play if there is no valid source yet
|
|
247
|
+
if (!this.currentVideoUrl || video.networkState === HTMLMediaElement.NETWORK_NO_SOURCE || video.error) {
|
|
92
248
|
return;
|
|
249
|
+
}
|
|
93
250
|
if (this.isPlaying) {
|
|
94
|
-
|
|
251
|
+
video.pause();
|
|
95
252
|
this.isPlaying = false;
|
|
96
253
|
this.videoPause.emit();
|
|
97
254
|
}
|
|
98
255
|
else {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
256
|
+
video.play().then(() => {
|
|
257
|
+
this.isPlaying = true;
|
|
258
|
+
this.videoPlay.emit();
|
|
259
|
+
}).catch(err => {
|
|
260
|
+
console.error('Video play failed:', err);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
get hasMultipleVideos() {
|
|
265
|
+
return Array.isArray(this.videoUrls) && this.videoUrls.length > 1;
|
|
266
|
+
}
|
|
267
|
+
get currentVideoUrl() {
|
|
268
|
+
if (Array.isArray(this.videoUrls) && this.videoUrls.length > 0) {
|
|
269
|
+
const idx = Math.min(Math.max(this.currentVideoIndex, 0), this.videoUrls.length - 1);
|
|
270
|
+
return this.videoUrls[idx];
|
|
271
|
+
}
|
|
272
|
+
return this.videoUrl;
|
|
273
|
+
}
|
|
274
|
+
resetVideoState() {
|
|
275
|
+
this.isPlaying = false;
|
|
276
|
+
this.progress = 0;
|
|
277
|
+
if (this.vplayer?.nativeElement) {
|
|
278
|
+
this.vplayer.nativeElement.pause();
|
|
279
|
+
this.vplayer.nativeElement.currentTime = 0;
|
|
280
|
+
}
|
|
281
|
+
this.lastSetDuration = -1;
|
|
282
|
+
}
|
|
283
|
+
prevVideo() {
|
|
284
|
+
if (!this.hasMultipleVideos)
|
|
285
|
+
return;
|
|
286
|
+
if (this.currentVideoIndex > 0) {
|
|
287
|
+
this.currentVideoIndex -= 1;
|
|
288
|
+
this.resetVideoState();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
nextVideo() {
|
|
292
|
+
if (!this.hasMultipleVideos)
|
|
293
|
+
return;
|
|
294
|
+
if (this.videoUrls && this.currentVideoIndex < this.videoUrls.length - 1) {
|
|
295
|
+
this.currentVideoIndex += 1;
|
|
296
|
+
this.resetVideoState();
|
|
102
297
|
}
|
|
103
298
|
}
|
|
104
299
|
onTimelineClick(event) {
|
|
@@ -107,7 +302,11 @@ export class SimulatorComponent {
|
|
|
107
302
|
const rect = this.timelineBar.nativeElement.getBoundingClientRect();
|
|
108
303
|
const clickX = event.clientX - rect.left;
|
|
109
304
|
const percent = Math.max(0, Math.min(1, clickX / rect.width));
|
|
110
|
-
const
|
|
305
|
+
const duration = this.vplayer.nativeElement.duration;
|
|
306
|
+
if (!duration || !isFinite(duration)) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const targetTimeSeconds = percent * duration;
|
|
111
310
|
this.vplayer.nativeElement.currentTime = targetTimeSeconds;
|
|
112
311
|
this.lastSetDuration = targetTimeSeconds * 1000;
|
|
113
312
|
}
|
|
@@ -130,7 +329,11 @@ export class SimulatorComponent {
|
|
|
130
329
|
this.dragging = false;
|
|
131
330
|
this.removeDragListeners();
|
|
132
331
|
if (this.vplayer?.nativeElement) {
|
|
133
|
-
const
|
|
332
|
+
const duration = this.vplayer.nativeElement.duration;
|
|
333
|
+
if (!duration || !isFinite(duration)) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const targetTimeSeconds = (this.progress / 100) * duration;
|
|
134
337
|
this.vplayer.nativeElement.currentTime = targetTimeSeconds;
|
|
135
338
|
this.lastSetDuration = targetTimeSeconds * 1000;
|
|
136
339
|
}
|
|
@@ -307,14 +510,22 @@ export class SimulatorComponent {
|
|
|
307
510
|
this.currentView = 'screenshots';
|
|
308
511
|
}
|
|
309
512
|
}
|
|
513
|
+
onVideoElementReady() {
|
|
514
|
+
const video = this._vplayer?.nativeElement;
|
|
515
|
+
if (!video)
|
|
516
|
+
return;
|
|
517
|
+
this.attachVideoListeners();
|
|
518
|
+
}
|
|
310
519
|
}
|
|
311
520
|
SimulatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
312
|
-
SimulatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SimulatorComponent, selector: "cqa-simulator", inputs: { videoUrl: "videoUrl", videoCurrentDuration: "videoCurrentDuration", stepMarkers: "stepMarkers", screenShotUrl: "screenShotUrl", traceViewUrl: "traceViewUrl", platformName: "platformName", platformType: "platformType", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause" }, viewQueries: [{ propertyName: "vplayer", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBar", first: true, predicate: ["timelineBar"], 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\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">{{ platformName }}</p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <!-- 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\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-35px)]\" *ngIf=\"videoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\">\n <video\n #vplayer\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-black\"\n [src]=\"videoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\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=\"!videoUrl\">\n No video recording found\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" *ngIf=\"videoUrl && !isLive\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \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 <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 \n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-[20px]\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n \n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-flex-1\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let step of stepMarkers\" \n class=\"cqa-absolute cqa-w-1 cqa-h-full cqa-top-0 cqa-rounded-sm\"\n [style.left.%]=\"getStepLeftPosition(step)\"\n [style.background]=\"getStepColor(step)\"\n style=\"pointer-events: none; z-index: 20;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-green-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-green-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 10;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-max-h-full cqa-block cqa-bg-black cqa-mx-auto\"\n />\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-py-4 cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\">\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-black\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n height=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\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"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
521
|
+
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", deviceName: "deviceName", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause" }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBar", first: true, predicate: ["timelineBar"], 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\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n matTooltip=\"Screen size: 1920x1080\"\n matTooltipPosition=\"below\"\n >\n \u00B7 <span class=\"cqa-ml-1\">1920x1080</span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <ng-container *ngIf=\"hasDeviceFrame;\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-max-h-[500px] cqa-h-full': platformType !== 'browser' || !isLive, 'cqa-h-auto': isLive && platformType === 'browser' }\">\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-z-20': platformType === 'browser', 'cqa-bg-white': platformType !== 'browser'}\">\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 </ng-container>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-35px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-[500px]\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n </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 No video recording found\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <button \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 \n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-[20px]\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n \n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-flex-1\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let step of stepMarkers\" \n class=\"cqa-absolute cqa-w-1 cqa-h-full cqa-top-0 cqa-rounded-sm\"\n [style.left.%]=\"getStepLeftPosition(step)\"\n [style.background]=\"getStepColor(step)\"\n style=\"pointer-events: none; z-index: 20;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-green-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-green-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 10;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-[500px]\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', '!cqa-h-auto': platformType === 'browser', 'cqa-h-full': platformType !== 'browser'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-py-4 cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\">\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 frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n height=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\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"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
313
522
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, decorators: [{
|
|
314
523
|
type: Component,
|
|
315
|
-
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\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">{{ platformName }}</p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <!-- 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\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-35px)]\" *ngIf=\"videoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\">\n <video\n #vplayer\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-black\"\n [src]=\"videoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\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=\"!videoUrl\">\n No video recording found\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" *ngIf=\"videoUrl && !isLive\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \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 <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 \n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-[20px]\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n \n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-flex-1\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let step of stepMarkers\" \n class=\"cqa-absolute cqa-w-1 cqa-h-full cqa-top-0 cqa-rounded-sm\"\n [style.left.%]=\"getStepLeftPosition(step)\"\n [style.background]=\"getStepColor(step)\"\n style=\"pointer-events: none; z-index: 20;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-green-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-green-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 10;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-max-h-full cqa-block cqa-bg-black cqa-mx-auto\"\n />\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-py-4 cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\">\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-black\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n height=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\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: [] }]
|
|
524
|
+
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\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"platformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n matTooltip=\"Screen size: 1920x1080\"\n matTooltipPosition=\"below\"\n >\n \u00B7 <span class=\"cqa-ml-1\">1920x1080</span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <ng-container *ngIf=\"hasDeviceFrame;\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-max-h-[500px] cqa-h-full': platformType !== 'browser' || !isLive, 'cqa-h-auto': isLive && platformType === 'browser' }\">\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-z-20': platformType === 'browser', 'cqa-bg-white': platformType !== 'browser'}\">\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 </ng-container>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-35px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-[500px]\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n </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 No video recording found\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <button \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 \n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-[20px]\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n \n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-flex-1\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let step of stepMarkers\" \n class=\"cqa-absolute cqa-w-1 cqa-h-full cqa-top-0 cqa-rounded-sm\"\n [style.left.%]=\"getStepLeftPosition(step)\"\n [style.background]=\"getStepColor(step)\"\n style=\"pointer-events: none; z-index: 20;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-green-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-green-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 10;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-[500px]\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', '!cqa-h-auto': platformType === 'browser', 'cqa-h-full': platformType !== 'browser'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-py-4 cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device'}\">\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 frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n height=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\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: [] }]
|
|
316
525
|
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { videoUrl: [{
|
|
317
526
|
type: Input
|
|
527
|
+
}], videoUrls: [{
|
|
528
|
+
type: Input
|
|
318
529
|
}], videoCurrentDuration: [{
|
|
319
530
|
type: Input
|
|
320
531
|
}], stepMarkers: [{
|
|
@@ -327,6 +538,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
327
538
|
type: Input
|
|
328
539
|
}], platformType: [{
|
|
329
540
|
type: Input
|
|
541
|
+
}], deviceName: [{
|
|
542
|
+
type: Input
|
|
330
543
|
}], isLive: [{
|
|
331
544
|
type: Input
|
|
332
545
|
}], liveStatus: [{
|
|
@@ -347,11 +560,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
347
560
|
type: Output
|
|
348
561
|
}], videoPause: [{
|
|
349
562
|
type: Output
|
|
350
|
-
}],
|
|
563
|
+
}], vplayerRef: [{
|
|
351
564
|
type: ViewChild,
|
|
352
565
|
args: ['vplayer']
|
|
353
566
|
}], timelineBar: [{
|
|
354
567
|
type: ViewChild,
|
|
355
|
-
args: ['timelineBar']
|
|
568
|
+
args: ['timelineBar', { static: false }]
|
|
356
569
|
}] } });
|
|
357
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWtFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBb0JsSixNQUFNLE9BQU8sa0JBQWtCO0lBNEM3QixZQUFvQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBMUNsQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBVyxjQUFjLENBQUM7UUFDdEMsaUJBQVksR0FBeUIsU0FBUyxDQUFDO1FBQy9DLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsaUJBQVksR0FBZ0IsT0FBTyxDQUFDO1FBQ3BDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTdCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM3QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNyQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUtoRCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsYUFBUSxH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RyxhQUFhLENBQUM7U0FDbEM7SUFDSCxDQUFDOzsrR0FsV1Usa0JBQWtCO21HQUFsQixrQkFBa0IsOHpCQ3BCL0IsOGpiQXFPTTsyRkRqTk8sa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWU7bUdBTWhCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRWUsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUNNLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRSc7XG59XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnRUeXBlID0gJ3NjcmVlbnNob3RzJyB8ICd2aWRlbycgfCAndHJhY2UnO1xuXG50eXBlIFNlZ21lbnRPcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG59O1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIFNpbXVsYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSB2aWRlb1VybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHZpZGVvQ3VycmVudER1cmF0aW9uOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBzdGVwTWFya2VyczogU3RlcE1hcmtlcltdID0gW107XG4gIEBJbnB1dCgpIHNjcmVlblNob3RVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0cmFjZVZpZXdVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBwbGF0Zm9ybU5hbWU6IHN0cmluZyA9ICdXZWIgLSBDaHJvbWUnO1xuICBASW5wdXQoKSBwbGF0Zm9ybVR5cGU6ICdicm93c2VyJyB8ICdkZXZpY2UnID0gJ2Jyb3dzZXInO1xuICBASW5wdXQoKSBpc0xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbGl2ZVN0YXR1czogJ0luIFByb2dyZXNzJyB8ICdQYXVzZWQnIHwgJ0Fib3J0ZWQnIHwgJ0ZhaWxlZCcgfCAnUGFzc2VkJyB8ICdFeGVjdXRpb24nID0gJ0luIFByb2dyZXNzJztcbiAgQElucHV0KCkgbGl2ZUxvYWRpbmdMYWJlbDogc3RyaW5nID0gJ0xvYWRpbmcuLi4nO1xuICBASW5wdXQoKSBpc0NvbnRlbnRWaWRlb0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZmFpbGVkU3RhdHVzTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmlldzogU2VnbWVudFR5cGUgPSAndmlkZW8nO1xuICBASW5wdXQoKSBoaWRlVmlkZW9UYWI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdmlkZW9UaW1lVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BsYXkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BhdXNlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZwbGF5ZXInKSB2cGxheWVyITogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInKSB0aW1lbGluZUJhciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIHByb2dyZXNzID0gMDtcbiAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgaXNQbGF5aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50Vmlldzogc3RyaW5nID0gJ3ZpZGVvJztcblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSB2aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2V0RHVyYXRpb246IG51bWJlciA9IC0xO1xuICBwcml2YXRlIGRyYWdNb3VzZU1vdmVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZHJhZ01vdXNlVXBIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICBzYWZlVHJhY2VVcmw6IFNhZmVSZXNvdXJjZVVybDtcbiAgdHJhY2VWaWV3ZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHRyYWNlVmlld2VyRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICBpZiAobmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uICYmIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNlZWtUb1RpbWUobmV3RHVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndHJhY2VWaWV3VXJsJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsICYmIHRoaXMuY3VycmVudFZpZXcgPT09ICd0cmFjZScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuaGlkZVZpZGVvVGFiID8gJ3NjcmVlbnNob3RzJyA6ICd2aWRlbyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoaWRlVmlkZW9UYWInXSkge1xuICAgICAgdGhpcy51cGRhdGVTZWdtZW50cygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRWaWV3J10pIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuICB9XG5cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50IHx8ICF0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5kdXJhdGlvbikgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHNlY29uZHMgPSBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgXG4gICAgY29uc3QgdGFyZ2V0VGltZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlY29uZHMsIHZpZGVvLmR1cmF0aW9uKSk7XG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuXG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICB2aWRlby5wbGF5KCkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoJ1BsYXkgZmFpbGVkOicsIGVycikpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVBsYXkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmlzUGxheWluZykge1xuICAgICAgdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5wbGF5KCk7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgICB0aGlzLnZpZGVvUGxheS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgb25UaW1lbGluZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50IHx8ICF0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpY2tYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgY2xpY2tYIC8gcmVjdC53aWR0aCkpO1xuICAgIFxuICAgIGNvbnN0IHRhcmdldFRpbWVTZWNvbmRzID0gcGVyY2VudCAqIHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmR1cmF0aW9uO1xuICAgIHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lID0gdGFyZ2V0VGltZVNlY29uZHM7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSB0YXJnZXRUaW1lU2Vjb25kcyAqIDEwMDA7XG4gIH1cblxuICBzdGFydERyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMuYWRkRHJhZ0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25EcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih4IC8gcmVjdC53aWR0aCwgMSkpO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwO1xuICB9XG5cbiAgc3RvcERyYWcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXRUaW1lU2Vjb25kcyA9ICh0aGlzLnByb2dyZXNzIC8gMTAwKSAqIHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmR1cmF0aW9uO1xuICAgICAgdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lU2Vjb25kcztcbiAgICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gdGFyZ2V0VGltZVNlY29uZHMgKiAxMDAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkRyYWcoZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvblZpZGVvTWV0YWRhdGFMb2FkZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25WaWRlb0NhblBsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25WaWRlb0VuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgMTAwKSByZXR1cm47XG5cbiAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcbiAgICAgICAgY29uc3QgY3VycmVudE1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuXG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgICAgIGNvbnN0IHBlcmNlbnQgPSAoY3VycmVudE1zIC8gKHZpZGVvLmR1cmF0aW9uICogMTAwMCkpICogMTAwO1xuICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIHBlcmNlbnQpKTtcbiAgICAgICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1cnJlbnRNcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcblxuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICB9O1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBnZXRTdGVwTGVmdFBvc2l0aW9uKHN0ZXA6IFN0ZXBNYXJrZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50Py5kdXJhdGlvbikgcmV0dXJuIDA7XG4gICAgcmV0dXJuIChzdGVwLmN1bXVsYXRpdmVEdXJhdGlvbiAvICh0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5kdXJhdGlvbiAqIDEwMDApKSAqIDEwMDtcbiAgfVxuXG4gIGdldFN0ZXBDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5yZXN1bHQgPT09ICdTVUNDRVNTJyA/ICcjMjhhNzQ1JyA6ICcjZGMzNTQ1JztcbiAgfVxuXG4gIHRvZ2dsZUZ1bGxTY3JlZW4oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gIH1cblxuICBvblNlZ21lbnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSB2YWx1ZTtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudD8ucGF1c2UoKTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgfVxuXG4gIGZvcm1hdFRpbWUoc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXNlY29uZHMgfHwgaXNOYU4oc2Vjb25kcykpIHJldHVybiAnMDA6MDAnO1xuICAgIFxuICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTtcbiAgICBcbiAgICByZXR1cm4gYCR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtcHgtWzlweF0gY3FhLXB5LVszcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1oLVsyMXB4XSc7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRTBGMkZFXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM3REQzRkNdYDtcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVGM0M3XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0QzNERdYDtcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZFRTJFMl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkNBNUE1XWA7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXWA7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0QxRkFFNV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjNkVFN0I3XWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTIwMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0zMDBgO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c1RleHRDbGFzcygpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5saXZlU3RhdHVzKSB7XG4gICAgICBjYXNlICdJbiBQcm9ncmVzcyc6XG4gICAgICBjYXNlICdFeGVjdXRpb24nOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwMjg0QzddIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXVzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEOTc3MDZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdBYm9ydGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjREMyNjI2XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnRmFpbGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnUGFzc2VkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDU5NjY5XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNjAwIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZFRyYWNlVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnRyYWNlVmlld1VybCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybC5lbmRzV2l0aCgnLnppcCcpKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgdHJhY2U6IHRoaXMudHJhY2VWaWV3VXJsLFxuICAgICAgICBoaWRlSGVhZGVyOiAndHJ1ZScsXG4gICAgICAgIGhpZGVCcmFuZGluZzogJ3RydWUnLFxuICAgICAgICBlbWJlZDogJ3RydWUnLFxuICAgICAgICBtaW5pbWFsOiAndHJ1ZScsXG4gICAgICAgIG5vSGVhZGVyOiAndHJ1ZSdcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gYGh0dHBzOi8vdHJhY2UucGxheXdyaWdodC5kZXYvPyR7dXJsUGFyYW1zLnRvU3RyaW5nKCl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMudHJhY2VWaWV3VXJsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTYWZlVHJhY2VVcmwoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5wcm9jZXNzZWRUcmFjZVVybDtcbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB9XG4gIH1cblxuICBvblRyYWNlVmlld2VyTG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICB9XG5cbiAgb25UcmFjZVZpZXdlckVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VnbWVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgYmFzZVNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgICB7IGxhYmVsOiAnU2NyZWVuc2hvdHMnLCB2YWx1ZTogJ3NjcmVlbnNob3RzJywgaWNvbjogJ3Bob3RvJyAgfSxcbiAgICBdO1xuICAgIFxuICAgIC8vIE9ubHkgYWRkIFZpZGVvIHRhYiBpZiBoaWRlVmlkZW9UYWIgaXMgZmFsc2VcbiAgICBpZiAoIXRoaXMuaGlkZVZpZGVvVGFiKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVmlkZW8nLCB2YWx1ZTogJ3ZpZGVvJywgaWNvbjogJ3ZpZGVvY2FtJyB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVHJhY2UnLCB2YWx1ZTogJ3RyYWNlJywgaWNvbjogJ2dyYXBoaWNfZXEnIH0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlZ21lbnRzID0gYmFzZVNlZ21lbnRzO1xuICAgIFxuICAgIC8vIElmIGN1cnJlbnQgdmlldyBpcyAndmlkZW8nIGFuZCB2aWRlbyB0YWIgaXMgaGlkZGVuLCBzd2l0Y2ggdG8gc2NyZWVuc2hvdHNcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3ZpZGVvJyAmJiB0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdzY3JlZW5zaG90cyc7XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjsgaGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiICAgW25nU3R5bGVdPVwie1xuICBwb3NpdGlvbjogaXNGdWxsU2NyZWVuID8gJ2ZpeGVkJyA6IG51bGwsXG4gIGluc2V0OiBpc0Z1bGxTY3JlZW4gPyAnMXJlbScgOiBudWxsLFxuICB6SW5kZXg6IGlzRnVsbFNjcmVlbiA/ICc1MCcgOiBudWxsLFxuICBib3hTaGFkb3c6IGlzRnVsbFNjcmVlbiA/ICcwcHggMTNweCAyNXB4IC0xMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSknIDogbnVsbCxcbiAgYm9yZGVyUmFkaXVzOiBpc0Z1bGxTY3JlZW4gPyAnLjVyZW0nIDogbnVsbCxcbiAgYm9yZGVyOiBpc0Z1bGxTY3JlZW4gPyAnMXB4IHNvbGlkICNFNUU3RUInIDogbnVsbCxcbiAgd2lkdGg6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiBudWxsLFxuICBoZWlnaHQ6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiAnMTAwJScsXG4gIG92ZXJmbG93OiBpc0Z1bGxTY3JlZW4gPyAnaGlkZGVuJyA6IG51bGxcbn1cIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXB5LTEgY3FhLXB4LTIgY3FhLWJnLVsjRkZGRkZGXVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUI7Ym94LXNoYWRvdzogMHB4IDFweCAycHggMHB4ICMwMDAwMDAwRDtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBjbGFzcz1cImNxYS1oLVsyMXB4XSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtbXItMiBjcWEtcHgtWzlweF0gY3FhLXB5LVszcHhdIGNxYS1iZy1bI0ZDRDlEOV0gY3FhLXJvdW5kZWQtWzZweF1cIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNGOUJGQkY7XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLXctMiBjcWEtaC0yIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRjQ3RjdGXVwiIHN0eWxlPVwiZmxleC1zaHJpbms6IDA7XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl0gY3FhLW9wYWNpdHktNzUgY3FhLWFuaW1hdGUtcGluZ1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtbGVhZGluZy1bMTVweF1cIj5MaXZlPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwicGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcidcIiBzdHlsZT1cIndpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7XCI+XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzkzNV8xNTg0NylcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAuNjI1IDVDMC42MjUgNi4xNjAzMiAxLjA4NTk0IDcuMjczMTIgMS45MDY0MSA4LjA5MzU5QzIuNzI2ODggOC45MTQwNiAzLjgzOTY4IDkuMzc1IDUgOS4zNzVDNi4xNjAzMiA5LjM3NSA3LjI3MzEyIDguOTE0MDYgOC4wOTM1OSA4LjA5MzU5QzguOTE0MDYgNy4yNzMxMiA5LjM3NSA2LjE2MDMyIDkuMzc1IDVDOS4zNzUgMy44Mzk2OCA4LjkxNDA2IDIuNzI2ODggOC4wOTM1OSAxLjkwNjQxQzcuMjczMTIgMS4wODU5NCA2LjE2MDMyIDAuNjI1IDUgMC42MjVDMy44Mzk2OCAwLjYyNSAyLjcyNjg4IDEuMDg1OTQgMS45MDY0MSAxLjkwNjQxQzEuMDg1OTQgMi43MjY4OCAwLjYyNSAzLjgzOTY4IDAuNjI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMy4xMjUgNUMzLjEyNSAzLjgzOTY4IDMuMzIyNTQgMi43MjY4OCAzLjY3NDE3IDEuOTA2NDFDNC4wMjU4MSAxLjA4NTk0IDQuNTAyNzIgMC42MjUgNSAwLjYyNUM1LjQ5NzI4IDAuNjI1IDUuOTc0MTkgMS4wODU5NCA2LjMyNTgyIDEuOTA2NDFDNi42Nzc0NiAyLjcyNjg4IDYuODc1IDMuODM5NjggNi44NzUgNUM2Ljg3NSA2LjE2MDMyIDYuNjc3NDYgNy4yNzMxMiA2LjMyNTgyIDguMDkzNTlDNS45NzQxOSA4LjkxNDA2IDUuNDk3MjggOS4zNzUgNSA5LjM3NUM0LjUwMjcyIDkuMzc1IDQuMDI1ODEgOC45MTQwNiAzLjY3NDE3IDguMDkzNTlDMy4zMjI1NCA3LjI3MzEyIDMuMTI1IDYuMTYwMzIgMy4xMjUgNVpcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjZcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC45Mzc1IDYuNDU4NjZIOS4wNjI1TTAuOTM3NSAzLjU0MTk5SDkuMDYyNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjZcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzkzNV8xNTg0N1wiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSdcIiBzdHlsZT1cIndpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7XCI+XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcuMDgzMjUgMC44MzMwMDhIMi45MTY1OUMyLjQ1NjM1IDAuODMzMDA4IDIuMDgzMjUgMS4yMDYxIDIuMDgzMjUgMS42NjYzNFY4LjMzMzAxQzIuMDgzMjUgOC43OTMyNCAyLjQ1NjM1IDkuMTY2MzQgMi45MTY1OSA5LjE2NjM0SDcuMDgzMjVDNy41NDM0OSA5LjE2NjM0IDcuOTE2NTggOC43OTMyNCA3LjkxNjU4IDguMzMzMDFWMS42NjYzNEM3LjkxNjU4IDEuMjA2MSA3LjU0MzQ5IDAuODMzMDA4IDcuMDgzMjUgMC44MzMwMDhaXCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUg1LjAwNDE3XCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtICFjcWEtdGV4dC1bMTBweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tbC0yXCI+e3sgcGxhdGZvcm1OYW1lIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTGl2ZVwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0JhZGdlQ2xhc3MoKVwiPlxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImdldFN0YXR1c1RleHRDbGFzcygpXCI+e3sgbGl2ZVN0YXR1cyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xpdmVcIj5cbiAgICAgICAgICA8Y3FhLXNlZ21lbnQtY29udHJvbCBcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJzZWdtZW50c1wiIFxuICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRWaWV3XCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlZ21lbnRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzRnVsbFNjcmVlblwiIFxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBhbmRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUgMS4yNUg4Ljc1VjMuNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NDk5MiAxLjI1TDUuODMzMjUgNC4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDguNzQ5NjdMNC4xNjY2NyA1LjgzMzAxXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgOC43NUgxLjI1VjYuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhpdCBmdWxsIHNjcmVlblwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NSA2LjI1SDYuMjVWOC43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1MDA4IDYuMjVMOS4xNjY3NSA5LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuODMzMjUyIDAuODMzMDA4TDMuNzQ5OTIgMy43NDk2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDMuNzVIMy43NVYxLjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1oLVtjYWxjKDEwMCUtNDFweCldXCI+XG4gICAgPCEtLSBMaXZlIENvbnRlbnQgVmlldyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi00XCI+XG4gICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgZGlhbWV0ZXI9XCI0MFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+e3sgbGl2ZUxvYWRpbmdMYWJlbCB9fTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExpdmUgQ29udGVudCAod2hlbiBub3QgbG9hZGluZykgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ29udGVudFZpZGVvTG9hZGluZ1wiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxpdmVTdGF0dXMgPT09ICdGYWlsZWQnICYmIGZhaWxlZFN0YXR1c01lc3NhZ2VcIiBjbGFzcz1cImNxYS1wLTYgY3FhLXRleHQtY2VudGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS0zIGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICNDNjM1MzU7IGZvbnQtc2l6ZTogMThweDtcIj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLW0tMFwiPnt7IGZhaWxlZFN0YXR1c01lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGVudCAqbmdJZj1cImxpdmVTdGF0dXMgIT09ICdGYWlsZWQnIHx8ICFmYWlsZWRTdGF0dXNNZXNzYWdlXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE5vcm1hbCBWaWRlbyBWaWV3ICh3aGVuIG5vdCBsaXZlKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3ZpZGVvJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktNCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1tYXgtaC1bY2FsYygxMDAlLTM1cHgpXVwiICpuZ0lmPVwidmlkZW9VcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgPHZpZGVvXG4gICAgICAgICAgI3ZwbGF5ZXJcbiAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1taW4taC1bMjUwcHhdIGNxYS1tYXgtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctYmxhY2tcIlxuICAgICAgICAgIFtzcmNdPVwidmlkZW9VcmxcIlxuICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25WaWRlb01ldGFkYXRhTG9hZGVkKClcIlxuICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgID48L3ZpZGVvPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiF2aWRlb1VybFwiPlxuICAgICAgICBObyB2aWRlbyByZWNvcmRpbmcgZm91bmRcbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMiBjcWEtYmctd2hpdGVcIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjRTVFN0VCO1wiICpuZ0lmPVwidmlkZW9VcmwgJiYgIWlzTGl2ZVwiPlxuICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBsYXkoKVwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICA8L2J1dHRvbj5cbiAgIFxuICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmUgY3FhLW1yLVsyMHB4XVwiPlxuICAgICAgICAgICB7eyBmb3JtYXRUaW1lKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDApIH19XG4gICAgICAgICA8L3NwYW4+XG4gICBcbiAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICN0aW1lbGluZUJhclxuICAgICAgICAgICBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC0xIGNxYS1iZy1ncmF5LTIwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtZmxleC0xXCJcbiAgICAgICAgICAgKGNsaWNrKT1cIm9uVGltZWxpbmVDbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgIFxuICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBNYXJrZXJzXCIgXG4gICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXctMSBjcWEtaC1mdWxsIGNxYS10b3AtMCBjcWEtcm91bmRlZC1zbVwiXG4gICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJnZXRTdGVwTGVmdFBvc2l0aW9uKHN0ZXApXCJcbiAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRTdGVwQ29sb3Ioc3RlcClcIlxuICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IDIwO1wiPlxuICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgXG4gICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtMCBjcWEtdG9wLTAgY3FhLWgtZnVsbCBjcWEtYmctZ3JlZW4tNTAwIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzXCJcbiAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IDI7XCI+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICBcbiAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtdG9wLTEvMiBjcWEtdy0zIGNxYS1oLTMgY3FhLWJnLWdyZWVuLTYwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItZ3JhYiBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZyBjcWEtc2hhZG93LW1kXCJcbiAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cInByb2dyZXNzXCJcbiAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB6LWluZGV4OiAxMDtcIlxuICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICA8L2Rpdj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3NjcmVlbnNob3RzJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXB5LTQgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIDxpbWdcbiAgICAgICAgICBbc3JjXT1cInNjcmVlblNob3RVcmxcIlxuICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLW1heC1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1ibGFjayBjcWEtbXgtYXV0b1wiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgTm8gc2NyZWVuc2hvdCBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICd0cmFjZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtcHktNCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1yZWxhdGl2ZVwiICpuZ0lmPVwidHJhY2VWaWV3VXJsXCIgW25nQ2xhc3NdPVwieychY3FhLWgtZnVsbCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgIDxpZnJhbWUgXG4gICAgICAgICAgW3NyY109XCJzYWZlVHJhY2VVcmxcIiBcbiAgICAgICAgICB0aXRsZT1cIlRyYWNlIFZpZXdlclwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtbWluLWgtWzI1MHB4XSBjcWEtbWF4LWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLWJsYWNrXCJcbiAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgIChsb2FkKT1cIm9uVHJhY2VWaWV3ZXJMb2FkKClcIlxuICAgICAgICAgIChlcnJvcik9XCJvblRyYWNlVmlld2VyRXJyb3IoKVwiPlxuICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckxvYWRpbmdcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgTG9hZGluZyB0cmFjZSB2aWV3ZXIuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJFcnJvclwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBGYWlsZWQgdG8gbG9hZCB0cmFjZSB2aWV3ZXJcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXRyYWNlVmlld1VybFwiPlxuICAgICAgICBObyB0cmFjZSBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
570
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWtFLE1BQU0sZUFBZSxDQUFDO0FBRWxKLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7OztBQStCbkYsTUFBTSxPQUFPLGtCQUFrQjtJQXlLN0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXZLbEMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBVyxjQUFjLENBQUM7UUFDdEMsaUJBQVksR0FBeUIsU0FBUyxDQUFDO1FBQy9DLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsaUJBQVksR0FBZ0IsT0FBTyxDQUFDO1FBQ3BDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTdCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM3QyxjQUFT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QUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBS0gsVUFBVTtzQkFEYixTQUFTO3VCQUFDLFNBQVM7Z0JBWXlCLFdBQVc7c0JBQXZELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZ2V0RW1wdHlTdGF0ZVByZXNldCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLXByZXNldHMuY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGVwTWFya2VyIHtcbiAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBudW1iZXI7XG4gIHJlc3VsdDogJ1NVQ0NFU1MnIHwgJ0ZBSUxVUkUnO1xufVxuXG5leHBvcnQgdHlwZSBTZWdtZW50VHlwZSA9ICdzY3JlZW5zaG90cycgfCAndmlkZW8nIHwgJ3RyYWNlJztcblxudHlwZSBTZWdtZW50T3B0aW9uID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xufTtcbmludGVyZmFjZSBEZXZpY2VGcmFtZUNvbmZpZyB7XG4gIG1vY2t1cEltYWdlOiBzdHJpbmc7XG4gIHNjcmVlbkluc2V0OiB7XG4gICAgdG9wOiBzdHJpbmc7XG4gICAgcmlnaHQ6IHN0cmluZztcbiAgICBib3R0b206IHN0cmluZztcbiAgICBsZWZ0OiBzdHJpbmc7XG4gIH07XG4gIGJvcmRlclJhZGl1czogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc2ltdWxhdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbXVsYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5cbmV4cG9ydCBjbGFzcyBTaW11bGF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgdmlkZW9Vcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB2aWRlb1VybHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHZpZGVvQ3VycmVudER1cmF0aW9uOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBzdGVwTWFya2VyczogU3RlcE1hcmtlcltdID0gW107XG4gIEBJbnB1dCgpIHNjcmVlblNob3RVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0cmFjZVZpZXdVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBwbGF0Zm9ybU5hbWU6IHN0cmluZyA9ICdXZWIgLSBDaHJvbWUnO1xuICBASW5wdXQoKSBwbGF0Zm9ybVR5cGU6ICdicm93c2VyJyB8ICdkZXZpY2UnID0gJ2Jyb3dzZXInO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3RlZFZpZXc6IFNlZ21lbnRUeXBlID0gJ3ZpZGVvJztcbiAgQElucHV0KCkgaGlkZVZpZGVvVGFiOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHZpZGVvVGltZVVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QbGF5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QYXVzZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIF92cGxheWVyPzogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd2cGxheWVyJylcbiAgc2V0IHZwbGF5ZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3RpbWVsaW5lQmFyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRpbWVsaW5lQmFyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNGdWxsU2NyZWVuOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRWaWV3OiBzdHJpbmcgPSAndmlkZW8nO1xuICBjdXJyZW50VmlkZW9JbmRleDogbnVtYmVyID0gMDtcblxuICBnZXQgaGFzRGV2aWNlRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kZXZpY2VGcmFtZUNvbmZpZztcbiAgfVxuXG4gIHNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSxcbiAgXTtcblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRldmljZUZyYW1lQ29uZmlnczogUmVjb3JkPHN0cmluZywgRGV2aWNlRnJhbWVDb25maWc+ID0ge1xuICAgIC8vIFBpeGVsc1xuICAgICdQaXhlbCA1Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtNS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDgnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC04LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIuNSUnLFxuICAgICAgICBsZWZ0OiAnNC41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdQaXhlbCA5Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtOS1wcm8ud2VicCcsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICc0JScsXG4gICAgICAgIHJpZ2h0OiAnNiUnLFxuICAgICAgICBib3R0b206ICc0JScsXG4gICAgICAgIGxlZnQ6ICc2JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG5cbiAgICAnR2FsYXh5IFMyMCBGRSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3NhbXN1bmctZ2FsYXh5LXMyMC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMS41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG5cbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcbiAgICB0aGlzLnNhZmVUcmFjZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgnJyk7XG4gICAgdGhpcy51cGRhdGVTZWdtZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGV2aWNlRnJhbWVDb25maWcoKTogRGV2aWNlRnJhbWVDb25maWcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzWydicm93c2VyJ10gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGV2aWNlTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW3RoaXMuZGV2aWNlTmFtZV0gfHwgbnVsbDtcbiAgfVxuXG4gIGdldCBkZXZpY2VNb2NrdXBJbWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnPy5tb2NrdXBJbWFnZSB8fCAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvVXJscyddKSB7XG4gICAgICBjb25zdCBhcnIgPSBjaGFuZ2VzWyd2aWRlb1VybHMnXS5jdXJyZW50VmFsdWUgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJyICYmIGFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXSAmJiAhY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3QgbmV3RHVyYXRpb24gPSBjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gJiYgdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuICBzZWVrVG9UaW1lKG1pbGxpc2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQgfHwgIXRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmR1cmF0aW9uKSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qgc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICBcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBtaWxsaXNlY29uZHM7XG5cbiAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgIHZpZGVvLnBsYXkoKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcignUGxheSBmYWlsZWQ6JywgZXJyKSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlUGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAvLyBEbyBub3QgYXR0ZW1wdCB0byBwbGF5IGlmIHRoZXJlIGlzIG5vIHZhbGlkIHNvdXJjZSB5ZXRcbiAgICBpZiAoIXRoaXMuY3VycmVudFZpZGVvVXJsIHx8IHZpZGVvLm5ldHdvcmtTdGF0ZSA9PT0gSFRNTE1lZGlhRWxlbWVudC5ORVRXT1JLX05PX1NPVVJDRSB8fCB2aWRlby5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUGxheWluZykge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWRlby5wbGF5KCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVmlkZW8gcGxheSBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBoYXNNdWx0aXBsZVZpZGVvcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnZpZGVvVXJscykgJiYgdGhpcy52aWRlb1VybHMubGVuZ3RoID4gMTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VmlkZW9VcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZpZGVvVXJscykgJiYgdGhpcy52aWRlb1VybHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5taW4oTWF0aC5tYXgodGhpcy5jdXJyZW50VmlkZW9JbmRleCwgMCksIHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpO1xuICAgICAgcmV0dXJuIHRoaXMudmlkZW9VcmxzW2lkeF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZGVvVXJsO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFZpZGVvU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5wYXVzZSgpO1xuICAgICAgdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgIH1cbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IC0xO1xuICB9XG5cbiAgcHJldlZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtPSAxO1xuICAgICAgdGhpcy5yZXNldFZpZGVvU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBuZXh0VmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSByZXR1cm47XG4gICAgaWYgKHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICs9IDE7XG4gICAgICB0aGlzLnJlc2V0VmlkZW9TdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGltZWxpbmVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aW1lbGluZUJhcj8ubmF0aXZlRWxlbWVudCB8fCAhdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNsaWNrWCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGNsaWNrWCAvIHJlY3Qud2lkdGgpKTtcblxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuZHVyYXRpb247XG4gICAgaWYgKCFkdXJhdGlvbiB8fCAhaXNGaW5pdGUoZHVyYXRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0VGltZVNlY29uZHMgPSBwZXJjZW50ICogZHVyYXRpb247XG4gICAgdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lU2Vjb25kcztcbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IHRhcmdldFRpbWVTZWNvbmRzICogMTAwMDtcbiAgfVxuXG4gIHN0YXJ0RHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5hZGREcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvbkRyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgfHwgIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHggLyByZWN0LndpZHRoLCAxKSk7XG4gICAgdGhpcy5wcm9ncmVzcyA9IHBlcmNlbnQgKiAxMDA7XG4gIH1cblxuICBzdG9wRHJhZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuZHVyYXRpb247XG4gICAgICBpZiAoIWR1cmF0aW9uIHx8ICFpc0Zpbml0ZShkdXJhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRUaW1lU2Vjb25kcyA9ICh0aGlzLnByb2dyZXNzIC8gMTAwKSAqIGR1cmF0aW9uO1xuICAgICAgdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lU2Vjb25kcztcbiAgICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gdGFyZ2V0VGltZVNlY29uZHMgKiAxMDAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkRyYWcoZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvblZpZGVvTWV0YWRhdGFMb2FkZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25WaWRlb0NhblBsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25WaWRlb0VuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgMTAwKSByZXR1cm47XG5cbiAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcbiAgICAgICAgY29uc3QgY3VycmVudE1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuXG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgICAgIGNvbnN0IHBlcmNlbnQgPSAoY3VycmVudE1zIC8gKHZpZGVvLmR1cmF0aW9uICogMTAwMCkpICogMTAwO1xuICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIHBlcmNlbnQpKTtcbiAgICAgICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1cnJlbnRNcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcblxuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICB9O1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBnZXRTdGVwTGVmdFBvc2l0aW9uKHN0ZXA6IFN0ZXBNYXJrZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50Py5kdXJhdGlvbikgcmV0dXJuIDA7XG4gICAgcmV0dXJuIChzdGVwLmN1bXVsYXRpdmVEdXJhdGlvbiAvICh0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5kdXJhdGlvbiAqIDEwMDApKSAqIDEwMDtcbiAgfVxuXG4gIGdldFN0ZXBDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5yZXN1bHQgPT09ICdTVUNDRVNTJyA/ICcjMjhhNzQ1JyA6ICcjZGMzNTQ1JztcbiAgfVxuXG4gIHRvZ2dsZUZ1bGxTY3JlZW4oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gIH1cblxuICBvblNlZ21lbnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSB2YWx1ZTtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudD8ucGF1c2UoKTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgfVxuXG4gIGZvcm1hdFRpbWUoc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXNlY29uZHMgfHwgaXNOYU4oc2Vjb25kcykpIHJldHVybiAnMDA6MDAnO1xuICAgIFxuICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTtcbiAgICBcbiAgICByZXR1cm4gYCR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtcHgtWzlweF0gY3FhLXB5LVszcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1oLVsyMXB4XSc7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRTBGMkZFXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM3REQzRkNdYDtcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVGM0M3XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0QzNERdYDtcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZFRTJFMl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkNBNUE1XWA7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXWA7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0QxRkFFNV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjNkVFN0I3XWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTIwMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0zMDBgO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c1RleHRDbGFzcygpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5saXZlU3RhdHVzKSB7XG4gICAgICBjYXNlICdJbiBQcm9ncmVzcyc6XG4gICAgICBjYXNlICdFeGVjdXRpb24nOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwMjg0QzddIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXVzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEOTc3MDZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdBYm9ydGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjREMyNjI2XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnRmFpbGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnUGFzc2VkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDU5NjY5XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNjAwIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZFRyYWNlVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnRyYWNlVmlld1VybCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybC5lbmRzV2l0aCgnLnppcCcpKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgdHJhY2U6IHRoaXMudHJhY2VWaWV3VXJsLFxuICAgICAgICBoaWRlSGVhZGVyOiAndHJ1ZScsXG4gICAgICAgIGhpZGVCcmFuZGluZzogJ3RydWUnLFxuICAgICAgICBlbWJlZDogJ3RydWUnLFxuICAgICAgICBtaW5pbWFsOiAndHJ1ZScsXG4gICAgICAgIG5vSGVhZGVyOiAndHJ1ZSdcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gYGh0dHBzOi8vdHJhY2UucGxheXdyaWdodC5kZXYvPyR7dXJsUGFyYW1zLnRvU3RyaW5nKCl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMudHJhY2VWaWV3VXJsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTYWZlVHJhY2VVcmwoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5wcm9jZXNzZWRUcmFjZVVybDtcbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB9XG4gIH1cblxuICBvblRyYWNlVmlld2VyTG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICB9XG5cbiAgb25UcmFjZVZpZXdlckVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VnbWVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgYmFzZVNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgICB7IGxhYmVsOiAnU2NyZWVuc2hvdHMnLCB2YWx1ZTogJ3NjcmVlbnNob3RzJywgaWNvbjogJ3Bob3RvJyAgfSxcbiAgICBdO1xuICAgIFxuICAgIC8vIE9ubHkgYWRkIFZpZGVvIHRhYiBpZiBoaWRlVmlkZW9UYWIgaXMgZmFsc2VcbiAgICBpZiAoIXRoaXMuaGlkZVZpZGVvVGFiKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVmlkZW8nLCB2YWx1ZTogJ3ZpZGVvJywgaWNvbjogJ3ZpZGVvY2FtJyB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsKSB7XG4gICAgICBiYXNlU2VnbWVudHMucHVzaCh7IGxhYmVsOiAnVHJhY2UnLCB2YWx1ZTogJ3RyYWNlJywgaWNvbjogJ2dyYXBoaWNfZXEnIH0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlZ21lbnRzID0gYmFzZVNlZ21lbnRzO1xuICAgIFxuICAgIC8vIElmIGN1cnJlbnQgdmlldyBpcyAndmlkZW8nIGFuZCB2aWRlbyB0YWIgaXMgaGlkZGVuLCBzd2l0Y2ggdG8gc2NyZWVuc2hvdHNcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3ZpZGVvJyAmJiB0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9ICdzY3JlZW5zaG90cyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblZpZGVvRWxlbWVudFJlYWR5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy5fdnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG4gIFxuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXVpLXJvb3RcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNGM0Y0RjY7IGhlaWdodDogMTAwJTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIiAgIFtuZ1N0eWxlXT1cIntcbiAgcG9zaXRpb246IGlzRnVsbFNjcmVlbiA/ICdmaXhlZCcgOiBudWxsLFxuICBpbnNldDogaXNGdWxsU2NyZWVuID8gJzFyZW0nIDogbnVsbCxcbiAgekluZGV4OiBpc0Z1bGxTY3JlZW4gPyAnNTAnIDogbnVsbCxcbiAgYm94U2hhZG93OiBpc0Z1bGxTY3JlZW4gPyAnMHB4IDEzcHggMjVweCAtMTJweCByZ2JhKDAsIDAsIDAsIDAuMjUpJyA6IG51bGwsXG4gIGJvcmRlclJhZGl1czogaXNGdWxsU2NyZWVuID8gJy41cmVtJyA6IG51bGwsXG4gIGJvcmRlcjogaXNGdWxsU2NyZWVuID8gJzFweCBzb2xpZCAjRTVFN0VCJyA6IG51bGwsXG4gIHdpZHRoOiBpc0Z1bGxTY3JlZW4gPyAnY2FsYygxMDAlIC0gMzJweCknIDogbnVsbCxcbiAgaGVpZ2h0OiBpc0Z1bGxTY3JlZW4gPyAnY2FsYygxMDAlIC0gMzJweCknIDogJzEwMCUnLFxuICBvdmVyZmxvdzogaXNGdWxsU2NyZWVuID8gJ2hpZGRlbicgOiBudWxsXG59XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1weS0xIGNxYS1weC0yIGNxYS1iZy1bI0ZGRkZGRl1cIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTVFN0VCO2JveC1zaGFkb3c6IDBweCAxcHggMnB4IDBweCAjMDAwMDAwMEQ7XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlNjcmVlbiBzaXplOiAxOTIweDEwODBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIMK3IDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj4xOTIweDEwODA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzcygpXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZ2V0U3RhdHVzVGV4dENsYXNzKClcIj57eyBsaXZlU3RhdHVzIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTGl2ZVwiPlxuICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sIFxuICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNlZ21lbnRzXCIgXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNGdWxsU2NyZWVuXCIgXG4gICAgICAgICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxTY3JlZW4oKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkV4cGFuZFwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNSAxLjI1SDguNzVWMy43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc0OTkyIDEuMjVMNS44MzMyNSA0LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgOC43NDk2N0w0LjE2NjY3IDUuODMzMDFcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NSA4Ljc1SDEuMjVWNi4yNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRnVsbFNjcmVlblwiIFxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeGl0IGZ1bGwgc2NyZWVuXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc1IDYuMjVINi4yNVY4Ljc1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUwMDggNi4yNUw5LjE2Njc1IDkuMTY2NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC44MzMyNTIgMC44MzMwMDhMMy43NDk5MiAzLjc0OTY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgMy43NUgzLjc1VjEuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWgtW2NhbGMoMTAwJS00MXB4KV1cIj5cbiAgICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIFtuZ0NsYXNzXT1cInsnY3FhLXAtNCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWF4LWgtWzUwMHB4XSBjcWEtaC1mdWxsJzogcGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgfHwgIWlzTGl2ZSwgJ2NxYS1oLWF1dG8nOiBpc0xpdmUgJiYgcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicgfVwiPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtYmctd2hpdGUnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgPCEtLSBMb2FkaW5nIFN0YXRlIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIGRpYW1ldGVyPVwiNDBcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIExpdmUgQ29udGVudCAod2hlbiBub3QgbG9hZGluZykgLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsaXZlU3RhdHVzID09PSAnRmFpbGVkJyAmJiBmYWlsZWRTdGF0dXNNZXNzYWdlXCIgY2xhc3M9XCJjcWEtcC02IGNxYS10ZXh0LWNlbnRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS0zIGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS1tLTBcIj57eyBmYWlsZWRTdGF0dXNNZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJsaXZlU3RhdHVzICE9PSAnRmFpbGVkJyB8fCAhZmFpbGVkU3RhdHVzTWVzc2FnZVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTm9ybWFsIFZpZGVvIFZpZXcgKHdoZW4gbm90IGxpdmUpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1weS00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLW1heC1oLVtjYWxjKDEwMCUtMzVweCldXCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJywgJ2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiBbbmdDbGFzc109XCJ7J2NxYS1wLTQnOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1bNTAwcHhdXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtbWF4LWgtZnVsbCBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogcGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvdmVyIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50VmlkZW9VcmxcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cInZpZGVvL3dlYm1cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0yMCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25WaWRlb01ldGFkYXRhTG9hZGVkKClcIlxuICAgICAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgICAgICAoZW5kZWQpPVwib25WaWRlb0VuZGVkKClcIlxuICAgICAgICAgICAgICAgID48L3ZpZGVvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhY3VycmVudFZpZGVvVXJsXCI+XG4gICAgICAgIE5vIHZpZGVvIHJlY29yZGluZyBmb3VuZFxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LTIgY3FhLWJnLXdoaXRlXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIiBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmwgJiYgIWlzTGl2ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgKm5nSWY9XCJoYXNNdWx0aXBsZVZpZGVvc1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFZpZGVvSW5kZXggPT09IDBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogY3VycmVudFZpZGVvSW5kZXggPT09IDB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJwcmV2VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiUHJldmlvdXMgdmlkZW9cIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjMzc0MTUxXVwiIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiPnNraXBfcHJldmlvdXM8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQbGF5KClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJMMTMgOEwzIDE0VjJaXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxMFwiIHk9XCIyXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgXG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3NcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IHZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwibmV4dFZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk5leHQgdmlkZW9cIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjMzc0MTUxXVwiIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IHZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpfVwiPnNraXBfbmV4dDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtbXItWzIwcHhdXCI+XG4gICAgICAgICAgICB7eyBmb3JtYXRUaW1lKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDApIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgIFxuICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAjdGltZWxpbmVCYXJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLTEgY3FhLWJnLWdyYXktMjAwIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1mbGV4LTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGltZWxpbmVDbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBNYXJrZXJzXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS13LTEgY3FhLWgtZnVsbCBjcWEtdG9wLTAgY3FhLXJvdW5kZWQtc21cIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImdldFN0ZXBMZWZ0UG9zaXRpb24oc3RlcClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRTdGVwQ29sb3Ioc3RlcClcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyMDtcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ncmVlbi01MDAgY3FhLXJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnRyYW5zaXRpb25dPVwiZHJhZ2dpbmcgPyAnbm9uZScgOiAnd2lkdGggMTAwbXMnXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogMjtcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtdG9wLTEvMiBjcWEtdy0zIGNxYS1oLTMgY3FhLWJnLWdyZWVuLTYwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItZ3JhYiBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZyBjcWEtc2hhZG93LW1kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJwcm9ncmVzc1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDEwO1wiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICdzY3JlZW5zaG90cydcIiBjbGFzcz1cImNxYS1oLWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1weS00IGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwic2NyZWVuU2hvdFVybFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgW25nQ2xhc3NdPVwieydjcWEtcC00JzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtWzUwMHB4XVwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnIWNxYS1oLWF1dG8nOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW1heC1oLVtpbmhlcml0XSc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1heC1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cInNjcmVlblNob3RVcmxcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIE5vIHNjcmVlbnNob3QgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndHJhY2UnXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLXB5LTQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcmVsYXRpdmVcIiAqbmdJZj1cInRyYWNlVmlld1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICA8aWZyYW1lIFxuICAgICAgICAgIFtzcmNdPVwic2FmZVRyYWNlVXJsXCIgXG4gICAgICAgICAgdGl0bGU9XCJUcmFjZSBWaWV3ZXJcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLW1pbi1oLVsyNTBweF0gY3FhLW1heC1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgIChsb2FkKT1cIm9uVHJhY2VWaWV3ZXJMb2FkKClcIlxuICAgICAgICAgIChlcnJvcik9XCJvblRyYWNlVmlld2VyRXJyb3IoKVwiPlxuICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckxvYWRpbmdcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgTG9hZGluZyB0cmFjZSB2aWV3ZXIuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJFcnJvclwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBGYWlsZWQgdG8gbG9hZCB0cmFjZSB2aWV3ZXJcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXRyYWNlVmlld1VybFwiPlxuICAgICAgICBObyB0cmFjZSBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiAgXG4gIDwvZGl2PlxuPC9kaXY+Il19
|