@qbs-origin/origin-form 0.8.5 → 0.8.7

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.
@@ -4,9 +4,12 @@ import { FieldType } from '@ngx-formly/core';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "../../services/applicationData.service";
6
6
  import * as i2 from "@angular/common";
7
- import * as i3 from "@angular/material/button";
8
- import * as i4 from "@angular/material/icon";
9
- import * as i5 from "@angular/material/progress-spinner";
7
+ import * as i3 from "@angular/material/form-field";
8
+ import * as i4 from "@angular/material/core";
9
+ import * as i5 from "@angular/material/select";
10
+ import * as i6 from "@angular/material/button";
11
+ import * as i7 from "@angular/material/icon";
12
+ import * as i8 from "@angular/material/progress-bar";
10
13
  export class FormlyScanIdComponent extends FieldType {
11
14
  constructor(appDataService, cdr) {
12
15
  super();
@@ -26,8 +29,24 @@ export class FormlyScanIdComponent extends FieldType {
26
29
  this.photoBase64Back = '';
27
30
  this.isLoading = false;
28
31
  this.successMessage = null;
29
- this.videoStream = null;
30
32
  this.isScanValid = true;
33
+ // Wizard state
34
+ this.currentWizardStep = 0;
35
+ this.wizardSteps = [];
36
+ // Camera management
37
+ this.cameraActive = false;
38
+ this.availableCameras = [];
39
+ this.selectedCameraId = '';
40
+ // Photo preview (full data URI for img display)
41
+ this.photoPreviewFront = '';
42
+ this.photoPreviewBack = '';
43
+ // Drag and drop
44
+ this.isDragOver = false;
45
+ // Flash animation
46
+ this.showFlash = false;
47
+ // Retry
48
+ this.canRetry = false;
49
+ this.videoStream = null;
31
50
  }
32
51
  ngOnInit() {
33
52
  const group = this.form;
@@ -40,103 +59,245 @@ export class FormlyScanIdComponent extends FieldType {
40
59
  if (this.props['config'].collected) {
41
60
  const value = this.form.get(this.props['config'].componentCollected)?.value;
42
61
  this.control.setValue(value);
43
- this.form
62
+ this.valueChangesSub = this.form
44
63
  .get(this.props['config'].componentCollected)
45
64
  ?.valueChanges.subscribe(() => {
46
65
  this.control.setValue(this.form.get(this.props['config'].componentCollected)?.value);
47
66
  });
48
67
  }
68
+ this.initWizardSteps();
69
+ }
70
+ ngOnDestroy() {
71
+ this.stopCamera();
72
+ this.valueChangesSub?.unsubscribe();
73
+ }
74
+ get currentPhotoPreview() {
75
+ return this.currentWizardStep === 1
76
+ ? this.photoPreviewFront
77
+ : this.photoPreviewBack;
78
+ }
79
+ get currentStepLabel() {
80
+ if (this.currentWizardStep === 1) {
81
+ return (this.props['labels']?.uploadFrontPrompt ||
82
+ 'Please upload the front photo of your ID card.');
83
+ }
84
+ return (this.props['labels']?.uploadBackPrompt ||
85
+ 'Please upload the back photo of your ID card.');
49
86
  }
87
+ get currentStepShortLabel() {
88
+ if (this.currentWizardStep === 1) {
89
+ return this.props['labels']?.frontPhotoLabel || 'Front of ID';
90
+ }
91
+ return this.props['labels']?.backPhotoLabel || 'Back of ID';
92
+ }
93
+ // --- Wizard Step Management ---
94
+ initWizardSteps() {
95
+ this.wizardSteps = [
96
+ {
97
+ label: this.props['labels']?.cardTypeStepLabel || 'Select Card Type',
98
+ status: 'active',
99
+ },
100
+ ];
101
+ }
102
+ updateWizardSteps() {
103
+ const frontLabel = this.props['labels']?.frontPhotoStepLabel || 'Front Photo';
104
+ const backLabel = this.props['labels']?.backPhotoStepLabel || 'Back Photo';
105
+ this.wizardSteps = [
106
+ {
107
+ label: this.props['labels']?.cardTypeStepLabel || 'Select Card Type',
108
+ status: 'completed',
109
+ },
110
+ { label: frontLabel, status: 'active' },
111
+ ];
112
+ if (!this.oldIdCard) {
113
+ this.wizardSteps.push({ label: backLabel, status: 'upcoming' });
114
+ }
115
+ }
116
+ // --- Navigation ---
117
+ goBack() {
118
+ this.closeCamera();
119
+ if (this.currentWizardStep === 2) {
120
+ // Go back to front photo step, preserve front photo
121
+ this.wizardSteps[2].status = 'upcoming';
122
+ this.wizardSteps[1].status = 'active';
123
+ this.currentWizardStep = 1;
124
+ }
125
+ else if (this.currentWizardStep === 1) {
126
+ // Go back to card type selection, reset everything
127
+ this.resetForm();
128
+ this.cardTypeSelected = false;
129
+ this.currentWizardStep = 0;
130
+ this.initWizardSteps();
131
+ }
132
+ this.cdr.detectChanges();
133
+ }
134
+ goToStep(stepIndex) {
135
+ if (stepIndex < this.currentWizardStep) {
136
+ while (this.currentWizardStep > stepIndex) {
137
+ this.goBack();
138
+ }
139
+ }
140
+ }
141
+ // --- Card Type Selection ---
50
142
  selectCardType(isOldIdCard) {
51
143
  this.oldIdCard = isOldIdCard;
52
144
  this.cardTypeSelected = true;
53
145
  this.resetForm();
146
+ this.updateWizardSteps();
147
+ this.currentWizardStep = 1;
148
+ this.cdr.detectChanges();
54
149
  }
55
- onFileSelected(event, isFront) {
56
- const file = event.target.files[0];
150
+ // --- File Upload ---
151
+ onFileSelected(event) {
152
+ const input = event.target;
153
+ const file = input?.files?.[0];
57
154
  if (file) {
58
- const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();
59
- const fileSizeKB = file.size / 1024;
60
- if (!this.validFormats.includes(fileExtension)) {
61
- this.fileError = (this.props['errorMessages']?.invalidType ||
62
- `Invalid file type. Allowed formats are ${this.validFormats.join(', ')}`).replace('{formats}', this.validFormats.join(', '));
63
- this.control.setErrors({ invalidType: true });
64
- return;
155
+ const isFront = this.currentWizardStep === 1;
156
+ this.processFile(file, isFront);
157
+ }
158
+ // Reset input so same file can be re-selected
159
+ if (input) {
160
+ input.value = '';
161
+ }
162
+ }
163
+ processFile(file, isFront) {
164
+ const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();
165
+ const fileSizeKB = file.size / 1024;
166
+ if (!this.validFormats.includes(fileExtension)) {
167
+ this.fileError = (this.props['errorMessages']?.invalidType ||
168
+ `Invalid file type. Allowed formats are ${this.validFormats.join(', ')}`).replace('{formats}', this.validFormats.join(', '));
169
+ this.control.setErrors({ invalidType: true });
170
+ this.cdr.detectChanges();
171
+ return;
172
+ }
173
+ if (fileSizeKB > this.maxFileSizeKB || fileSizeKB < 1) {
174
+ this.fileError = (this.props['errorMessages']?.maxSize ||
175
+ `File size must be between 1KB and ${this.maxFileSizeKB}KB.`).replace('{size}', this.maxFileSizeKB.toString());
176
+ this.control.setErrors({ invalidSize: true });
177
+ this.cdr.detectChanges();
178
+ return;
179
+ }
180
+ this.fileError = null;
181
+ const reader = new FileReader();
182
+ reader.readAsDataURL(file);
183
+ reader.onload = () => {
184
+ const dataUri = reader.result?.toString() || '';
185
+ const base64 = dataUri.split(',')[1] || '';
186
+ if (isFront) {
187
+ this.fileNameFront = file.name;
188
+ this.photoBase64Front = base64;
189
+ this.photoPreviewFront = dataUri;
190
+ this.frontPhotoUploaded = true;
65
191
  }
66
- if (fileSizeKB > this.maxFileSizeKB || fileSizeKB < 1) {
67
- this.fileError = (this.props['errorMessages']?.maxSize ||
68
- `File size must be between 1KB and ${this.maxFileSizeKB}KB.`).replace('{size}', this.maxFileSizeKB);
69
- this.control.setErrors({ invalidSize: true });
70
- return;
192
+ else {
193
+ this.fileNameBack = file.name;
194
+ this.photoBase64Back = base64;
195
+ this.photoPreviewBack = dataUri;
196
+ this.backPhotoUploaded = true;
71
197
  }
72
- this.fileError = null;
73
- const reader = new FileReader();
74
- reader.readAsDataURL(file);
75
- reader.onload = () => {
76
- if (isFront) {
77
- this.fileNameFront = file.name;
78
- this.photoBase64Front = reader.result?.toString().split(',')[1] || '';
79
- this.frontPhotoUploaded = true;
80
- this.cdr.detectChanges();
81
- }
82
- else {
83
- this.fileNameBack = file.name;
84
- this.photoBase64Back = reader.result?.toString().split(',')[1] || '';
85
- this.backPhotoUploaded = true;
86
- this.cdr.detectChanges();
87
- }
88
- this.checkUploadCondition();
89
- };
198
+ this.cdr.detectChanges();
199
+ };
200
+ }
201
+ // --- Drag and Drop ---
202
+ onDragOver(event) {
203
+ event.preventDefault();
204
+ event.stopPropagation();
205
+ this.isDragOver = true;
206
+ }
207
+ onDragLeave(event) {
208
+ event.preventDefault();
209
+ this.isDragOver = false;
210
+ }
211
+ onDrop(event) {
212
+ event.preventDefault();
213
+ event.stopPropagation();
214
+ this.isDragOver = false;
215
+ const files = event.dataTransfer?.files;
216
+ if (files && files.length > 0) {
217
+ const isFront = this.currentWizardStep === 1;
218
+ this.processFile(files[0], isFront);
90
219
  }
91
220
  }
92
- takePicture() {
93
- this.resetForm();
94
- if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
95
- navigator.mediaDevices
96
- .enumerateDevices()
97
- .then((devices) => {
98
- const videoDevices = devices.filter((device) => device.kind === 'videoinput');
99
- if (videoDevices.length === 0) {
100
- this.fileError = 'No camera devices found.';
101
- return;
102
- }
103
- if (videoDevices.length === 1) {
104
- this.startCamera(videoDevices[0].deviceId);
105
- }
106
- else {
107
- const selectedDeviceId = prompt('Select camera', videoDevices.map((device) => device.label).join(', '));
108
- const selectedDevice = videoDevices.find((device) => device.label === selectedDeviceId);
109
- if (selectedDevice) {
110
- this.startCamera(selectedDevice.deviceId);
111
- }
112
- else {
113
- this.fileError = 'Invalid camera selection.';
114
- }
115
- }
116
- })
117
- .catch(() => {
118
- this.fileError = 'Unable to access the camera devices.';
221
+ // --- Camera ---
222
+ async openCamera() {
223
+ this.fileError = null;
224
+ this.cdr.detectChanges();
225
+ if (!navigator.mediaDevices?.getUserMedia) {
226
+ this.fileError =
227
+ this.props['errorMessages']?.cameraNotSupported ||
228
+ 'Camera not supported by this device.';
229
+ this.cdr.detectChanges();
230
+ return;
231
+ }
232
+ try {
233
+ // Request permission first (labels are only available after permission grant)
234
+ const tempStream = await navigator.mediaDevices.getUserMedia({
235
+ video: true,
119
236
  });
237
+ tempStream.getTracks().forEach((t) => t.stop());
238
+ const devices = await navigator.mediaDevices.enumerateDevices();
239
+ this.availableCameras = devices.filter((d) => d.kind === 'videoinput');
240
+ if (this.availableCameras.length === 0) {
241
+ this.fileError =
242
+ this.props['errorMessages']?.noCamera ||
243
+ 'No camera devices found.';
244
+ this.cdr.detectChanges();
245
+ return;
246
+ }
247
+ this.selectedCameraId = this.availableCameras[0].deviceId;
248
+ this.cameraActive = true;
249
+ this.cdr.detectChanges();
250
+ await this.startCameraStream(this.selectedCameraId);
120
251
  }
121
- else {
122
- this.fileError = 'Camera not supported by this device.';
252
+ catch {
253
+ this.fileError =
254
+ this.props['errorMessages']?.cameraAccess ||
255
+ 'Unable to access camera. Please check permissions.';
256
+ this.cdr.detectChanges();
123
257
  }
124
258
  }
125
- startCamera(deviceId) {
126
- navigator.mediaDevices
127
- .getUserMedia({ video: { deviceId } })
128
- .then((stream) => {
259
+ async switchCamera(deviceId) {
260
+ this.stopCameraStream();
261
+ await this.startCameraStream(deviceId);
262
+ }
263
+ async startCameraStream(deviceId) {
264
+ try {
265
+ const stream = await navigator.mediaDevices.getUserMedia({
266
+ video: { deviceId: { exact: deviceId } },
267
+ });
129
268
  this.videoStream = stream;
130
- this.videoElement.nativeElement.srcObject = stream;
131
- this.videoElement.nativeElement.play();
132
- })
133
- .catch(() => {
134
- this.fileError = 'Unable to access the selected camera.';
135
- });
269
+ this.cdr.detectChanges();
270
+ if (this.videoElement?.nativeElement) {
271
+ this.videoElement.nativeElement.srcObject = stream;
272
+ await this.videoElement.nativeElement.play();
273
+ }
274
+ }
275
+ catch {
276
+ this.fileError =
277
+ this.props['errorMessages']?.cameraAccess ||
278
+ 'Unable to access the selected camera.';
279
+ this.cameraActive = false;
280
+ this.cdr.detectChanges();
281
+ }
282
+ }
283
+ stopCameraStream() {
284
+ if (this.videoStream) {
285
+ this.videoStream.getTracks().forEach((track) => track.stop());
286
+ this.videoStream = null;
287
+ }
136
288
  }
137
- capturePhoto(isFront) {
138
- if (!this.videoElement.nativeElement) {
289
+ stopCamera() {
290
+ this.stopCameraStream();
291
+ this.cameraActive = false;
292
+ }
293
+ closeCamera() {
294
+ this.stopCamera();
295
+ this.cdr.detectChanges();
296
+ }
297
+ captureCurrentPhoto() {
298
+ if (!this.videoElement?.nativeElement) {
139
299
  this.fileError = 'No video element available.';
300
+ this.cdr.detectChanges();
140
301
  return;
141
302
  }
142
303
  const video = this.videoElement.nativeElement;
@@ -145,35 +306,68 @@ export class FormlyScanIdComponent extends FieldType {
145
306
  canvas.height = video.videoHeight;
146
307
  const context = canvas.getContext('2d');
147
308
  context?.drawImage(video, 0, 0, canvas.width, canvas.height);
148
- this.isLoading = true;
149
- canvas.toBlob((blob) => {
150
- if (blob) {
151
- const reader = new FileReader();
152
- reader.readAsDataURL(blob);
153
- reader.onloadend = () => {
154
- if (isFront) {
155
- this.photoBase64Front =
156
- reader.result?.toString().split(',')[1] || '';
157
- this.frontPhotoUploaded = true;
158
- }
159
- else {
160
- this.photoBase64Back =
161
- reader.result?.toString().split(',')[1] || '';
162
- this.backPhotoUploaded = true;
163
- }
164
- this.isLoading = false;
165
- this.checkUploadCondition();
166
- this.cdr.detectChanges();
167
- };
168
- }
169
- if (this.videoStream) {
170
- this.videoStream.getTracks().forEach((track) => track.stop());
171
- this.videoStream = null;
172
- }
173
- }, 'image/jpeg');
309
+ // Flash animation
310
+ this.triggerFlash();
311
+ const dataUri = canvas.toDataURL('image/jpeg', 0.9);
312
+ const base64 = dataUri.split(',')[1] || '';
313
+ const isFront = this.currentWizardStep === 1;
314
+ if (isFront) {
315
+ this.photoBase64Front = base64;
316
+ this.photoPreviewFront = dataUri;
317
+ this.frontPhotoUploaded = true;
318
+ }
319
+ else {
320
+ this.photoBase64Back = base64;
321
+ this.photoPreviewBack = dataUri;
322
+ this.backPhotoUploaded = true;
323
+ }
324
+ this.stopCamera();
325
+ this.cdr.detectChanges();
326
+ }
327
+ triggerFlash() {
328
+ this.showFlash = true;
329
+ this.cdr.detectChanges();
330
+ setTimeout(() => {
331
+ this.showFlash = false;
332
+ this.cdr.detectChanges();
333
+ }, 300);
174
334
  }
335
+ // --- Photo Preview Actions ---
336
+ confirmPhoto() {
337
+ if (this.currentWizardStep === 1 && !this.oldIdCard) {
338
+ // Move to back photo step
339
+ this.wizardSteps[1].status = 'completed';
340
+ this.wizardSteps[2].status = 'active';
341
+ this.currentWizardStep = 2;
342
+ this.cdr.detectChanges();
343
+ }
344
+ else {
345
+ // All photos collected, trigger upload
346
+ this.checkUploadCondition();
347
+ }
348
+ }
349
+ resetCurrentPhoto() {
350
+ const isFront = this.currentWizardStep === 1;
351
+ if (isFront) {
352
+ this.photoBase64Front = '';
353
+ this.photoPreviewFront = '';
354
+ this.frontPhotoUploaded = false;
355
+ this.fileNameFront = '';
356
+ }
357
+ else {
358
+ this.photoBase64Back = '';
359
+ this.photoPreviewBack = '';
360
+ this.backPhotoUploaded = false;
361
+ this.fileNameBack = '';
362
+ }
363
+ this.fileError = null;
364
+ this.cdr.detectChanges();
365
+ }
366
+ // --- Upload ---
175
367
  uploadPhoto() {
176
368
  this.isLoading = true;
369
+ this.canRetry = false;
370
+ this.fileError = null;
177
371
  this.cdr.detectChanges();
178
372
  const command = {
179
373
  appId: this.props['appId'],
@@ -182,13 +376,16 @@ export class FormlyScanIdComponent extends FieldType {
182
376
  oldIdCard: this.oldIdCard,
183
377
  photos: this.oldIdCard
184
378
  ? [{ base64: this.photoBase64Front }]
185
- : [{ base64: this.photoBase64Front }, { base64: this.photoBase64Back }],
379
+ : [
380
+ { base64: this.photoBase64Front },
381
+ { base64: this.photoBase64Back },
382
+ ],
186
383
  };
187
384
  this.appDataService.scanId(command).subscribe({
188
385
  next: async (result) => {
189
386
  console.log('Scan ID result:', result);
190
387
  this.isLoading = false;
191
- var appData = await this.appDataService.getSteps(this.props['appDataId']);
388
+ const appData = await this.appDataService.getSteps(this.props['appDataId']);
192
389
  if (appData) {
193
390
  const status = this.extractStatusFromAppData(appData);
194
391
  console.log('[SCAN-ID] extracted status:', status);
@@ -196,13 +393,14 @@ export class FormlyScanIdComponent extends FieldType {
196
393
  this.fileError =
197
394
  this.props['errorMessages']?.invalidStatus ||
198
395
  'Invalid status response.';
199
- this.resetForm(true);
396
+ this.canRetry = true;
200
397
  this.control.setErrors({ invalidStatus: true });
201
398
  this.cdr.detectChanges();
202
399
  return;
203
400
  }
204
401
  this.isScanValid = true;
205
402
  this.successMessage = 'Upload successful!';
403
+ this.wizardSteps.forEach((s) => (s.status = 'completed'));
206
404
  if (this.props['event']) {
207
405
  this.props['event'](appData);
208
406
  }
@@ -213,28 +411,37 @@ export class FormlyScanIdComponent extends FieldType {
213
411
  this.fileError = 'An error occurred while processing the scan.';
214
412
  console.error('Scan ID error:', err);
215
413
  this.isLoading = false;
414
+ this.canRetry = true;
216
415
  this.cdr.detectChanges();
217
- this.resetForm();
218
416
  },
219
417
  });
220
418
  }
419
+ retryUpload() {
420
+ this.uploadPhoto();
421
+ }
422
+ // --- Helpers ---
221
423
  resetForm(preserveError = false) {
222
424
  this.fileNameFront = '';
223
425
  this.fileNameBack = '';
224
426
  this.photoBase64Front = '';
225
427
  this.photoBase64Back = '';
428
+ this.photoPreviewFront = '';
429
+ this.photoPreviewBack = '';
226
430
  this.frontPhotoUploaded = false;
227
431
  this.backPhotoUploaded = false;
228
432
  if (!preserveError) {
229
433
  this.fileError = null;
230
434
  }
231
- this.videoStream = null;
435
+ this.stopCamera();
232
436
  this.control.reset();
233
437
  this.isLoading = false;
234
438
  this.successMessage = null;
439
+ this.canRetry = false;
440
+ this.isDragOver = false;
235
441
  }
236
442
  checkUploadCondition() {
237
- if (this.oldIdCard || (this.frontPhotoUploaded && this.backPhotoUploaded)) {
443
+ if (this.oldIdCard && this.frontPhotoUploaded ||
444
+ !this.oldIdCard && this.frontPhotoUploaded && this.backPhotoUploaded) {
238
445
  this.uploadPhoto();
239
446
  }
240
447
  }
@@ -256,29 +463,26 @@ export class FormlyScanIdComponent extends FieldType {
256
463
  if (!step?.sections)
257
464
  return null;
258
465
  for (const section of step.sections) {
259
- for (const control of section.controls || []) {
260
- if (typeof control.fillValue === 'string' &&
261
- control.fillValue.trim() !== '') {
262
- return control.fillValue.trim();
466
+ for (const ctrl of section.controls || []) {
467
+ if (typeof ctrl.fillValue === 'string' &&
468
+ ctrl.fillValue.trim() !== '') {
469
+ return ctrl.fillValue.trim();
263
470
  }
264
471
  }
265
472
  }
266
473
  return null;
267
474
  }
268
475
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyScanIdComponent, deps: [{ token: i1.ApplicationDataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
269
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FormlyScanIdComponent, selector: "app-formly-scan-id", viewQueries: [{ propertyName: "fileInputFront", first: true, predicate: ["fileInputFront"], descendants: true }, { propertyName: "fileInputBack", first: true, predicate: ["fileInputBack"], descendants: true }, { propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
476
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FormlyScanIdComponent, selector: "app-formly-scan-id", viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"scan-id-container\">\n <!-- Header -->\n <h2 class=\"scan-id-title\">{{ props[\"name\"] }}</h2>\n <p class=\"scan-id-description\">{{ props[\"description\"] }}</p>\n\n <!-- Step Progress Indicator -->\n <div class=\"step-progress\" *ngIf=\"wizardSteps.length > 1\" role=\"list\">\n <div class=\"step-progress__item\" *ngFor=\"let step of wizardSteps; let i = index; let last = last\" role=\"listitem\">\n <div class=\"step-progress__circle\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\"\n [class.upcoming]=\"step.status === 'upcoming'\"\n [class.clickable]=\"step.status === 'completed'\"\n [attr.aria-current]=\"step.status === 'active' ? 'step' : null\"\n (click)=\"step.status === 'completed' ? goToStep(i) : null\">\n <mat-icon *ngIf=\"step.status === 'completed'\">check</mat-icon>\n <span *ngIf=\"step.status !== 'completed'\">{{ i + 1 }}</span>\n </div>\n <span class=\"step-progress__label\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\">\n {{ step.label }}\n </span>\n <div class=\"step-progress__connector\" *ngIf=\"!last\"\n [class.completed]=\"step.status === 'completed'\">\n </div>\n </div>\n </div>\n\n <!-- Step 1: Card Type Selection -->\n <div class=\"card-type-step\" *ngIf=\"currentWizardStep === 0\">\n <div class=\"card-type-options\" role=\"radiogroup\">\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\"\n (keydown.enter)=\"selectCardType(true)\"\n (keydown.space)=\"selectCardType(true); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === true && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.oldCardLabel || 'Old ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.oldCardHelper || 'Single-sided card - 1 photo needed' }}\n </span>\n </div>\n </div>\n\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\"\n (keydown.enter)=\"selectCardType(false)\"\n (keydown.space)=\"selectCardType(false); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === false && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.newCardLabel || 'New ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.newCardHelper || 'Card with front and back - 2 photos needed' }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Steps 2-3: Photo Capture / Upload -->\n <div class=\"photo-step\" *ngIf=\"(currentWizardStep === 1 || currentWizardStep === 2) && !isLoading && !(successMessage && isScanValid)\">\n\n <!-- Back Button -->\n <button mat-button class=\"back-btn\" (click)=\"goBack()\">\n <mat-icon>arrow_back</mat-icon>\n {{ currentWizardStep === 1\n ? (props['labels']?.changeCardTypeLabel || 'Change card type')\n : (props['labels']?.backLabel || 'Back') }}\n </button>\n\n <!-- Photo Preview Mode -->\n <div class=\"photo-preview\" *ngIf=\"currentPhotoPreview && !cameraActive\">\n <p class=\"photo-preview__label\">{{ currentStepShortLabel }}</p>\n <img class=\"photo-preview__image\" [src]=\"currentPhotoPreview\" [alt]=\"currentStepShortLabel\" />\n <div class=\"photo-preview__actions\">\n <button mat-stroked-button (click)=\"resetCurrentPhoto()\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retakeLabel || 'Retake' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"confirmPhoto()\">\n <mat-icon>check</mat-icon>\n {{ props['labels']?.usePhotoLabel || 'Use This Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Capture Mode (no photo yet) -->\n <div class=\"photo-capture\" *ngIf=\"!currentPhotoPreview && !cameraActive\">\n <p class=\"photo-capture__label\">{{ currentStepLabel }}</p>\n\n <!-- Drop Zone -->\n <div class=\"photo-capture__dropzone\"\n [class.dragover]=\"isDragOver\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Drop zone for ' + currentStepShortLabel + ' upload'\">\n <mat-icon class=\"dropzone-icon\">cloud_upload</mat-icon>\n <p class=\"dropzone-text\">\n {{ props['labels']?.dragDropPrompt || 'Drag & drop your photo here, or use the buttons below' }}\n </p>\n <p class=\"dropzone-formats\">\n {{ props['labels']?.formatsLabel || 'Accepted' }}: {{ validFormats.join(', ') }} &middot;\n {{ props['labels']?.maxSizeLabel || 'Max' }}: {{ maxFileSizeKB }}KB\n </p>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"photo-capture__actions\">\n <input type=\"file\" #fileInput (change)=\"onFileSelected($event)\" hidden [accept]=\"validFormats.join(',')\" />\n <button mat-flat-button color=\"primary\" (click)=\"fileInput.click()\" class=\"action-btn\">\n <mat-icon>upload_file</mat-icon>\n {{ props['labels']?.uploadFileButtonTranslations || 'Upload File' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"openCamera()\" class=\"action-btn\"\n *ngIf=\"props['config'].showTakePictureButton !== false\">\n <mat-icon>photo_camera</mat-icon>\n {{ props['labels']?.takePictureButtonTranslations || 'Take Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Camera Viewfinder -->\n <div class=\"camera-container\" *ngIf=\"cameraActive\">\n <!-- Camera selector -->\n <mat-form-field *ngIf=\"availableCameras.length > 1\" appearance=\"outline\" class=\"camera-selector\">\n <mat-label>{{ props['labels']?.selectCameraLabel || 'Select camera' }}</mat-label>\n <mat-select [(value)]=\"selectedCameraId\" (selectionChange)=\"switchCamera($event.value)\">\n <mat-option *ngFor=\"let cam of availableCameras; let i = index\" [value]=\"cam.deviceId\">\n {{ cam.label || 'Camera ' + (i + 1) }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"camera-viewfinder\">\n <video #videoElement autoplay playsinline class=\"camera-video\"></video>\n <div class=\"camera-flash-overlay\" [class.flash]=\"showFlash\"></div>\n </div>\n\n <div class=\"camera-controls\">\n <button mat-stroked-button (click)=\"closeCamera()\" class=\"camera-cancel-btn\">\n {{ props['labels']?.cancelLabel || 'Cancel' }}\n </button>\n <button mat-fab color=\"primary\" (click)=\"captureCurrentPhoto()\" class=\"camera-capture-btn\"\n [attr.aria-label]=\"'Capture ' + currentStepShortLabel\">\n <mat-icon>photo_camera</mat-icon>\n </button>\n <div class=\"camera-spacer\"></div>\n </div>\n </div>\n\n <!-- Error Display -->\n <div class=\"photo-step__error\" *ngIf=\"fileError\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon>error_outline</mat-icon>\n <span>{{ fileError }}</span>\n <button mat-stroked-button *ngIf=\"canRetry\" (click)=\"retryUpload()\" class=\"retry-btn\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retryLabel || 'Try Again' }}\n </button>\n </div>\n </div>\n\n <!-- Loading / Processing State -->\n <div class=\"processing-overlay\" *ngIf=\"isLoading\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <p class=\"processing-text\">\n {{ props['labels']?.processingMessage || 'Processing your ID scan...' }}\n </p>\n </div>\n\n <!-- Success State -->\n <div class=\"scan-success\" *ngIf=\"successMessage && isScanValid\" role=\"status\" aria-live=\"polite\">\n <mat-icon class=\"scan-success__icon\">check_circle</mat-icon>\n <h3 class=\"scan-success__title\">\n {{ props['labels']?.successTitle || 'ID scan successful' }}\n </h3>\n </div>\n</div>\n", styles: ["@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes flashCapture{0%{opacity:0}50%{opacity:.8}to{opacity:0}}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:24px;background-color:#fff;border-radius:7px;box-shadow:0 2px 12px #00000014;text-align:center}@media (max-width: 600px){.scan-id-container{padding:16px}}.scan-id-title{font-size:22px;font-weight:700;color:#2a3547;margin:0 0 8px}.scan-id-description{font-size:14px;color:#5a6a85;margin:0 0 24px}.step-progress{display:flex;justify-content:center;align-items:flex-start;gap:0;margin-bottom:32px;padding:0 8px}@media (max-width: 600px){.step-progress{margin-bottom:24px}}.step-progress__item{display:flex;flex-direction:column;align-items:center;position:relative;flex:1;min-width:0}.step-progress__circle{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:600;transition:all .3s ease;position:relative;z-index:1;flex-shrink:0}.step-progress__circle.upcoming{background:#f2f6fa;color:#a1aab4;border:2px solid #dfe5ef}.step-progress__circle.active{background:#5d87ff;color:#fff;border:2px solid #5d87ff;box-shadow:0 2px 8px #5d87ff59}.step-progress__circle.completed{background:#13deb9;color:#fff;border:2px solid #13deb9}.step-progress__circle.completed mat-icon{font-size:18px;width:18px;height:18px}.step-progress__label{font-size:12px;color:#a1aab4;margin-top:8px;text-align:center;line-height:1.3;max-width:100px}.step-progress__label.active{color:#5d87ff;font-weight:600}.step-progress__label.completed{color:#13deb9;font-weight:500}@media (max-width: 600px){.step-progress__label{font-size:11px;max-width:80px}}.step-progress__connector{position:absolute;top:18px;left:calc(50% + 22px);right:calc(-50% + 22px);height:2px;background:#dfe5ef;transition:background .3s ease;z-index:0;width:calc(100% - 44px)}.step-progress__connector.completed{background:#13deb9}.card-type-step{animation:fadeIn .3s ease-out}.card-type-options{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width: 600px){.card-type-options{grid-template-columns:1fr;gap:12px}}.card-type-option{border:2px solid #e5eaef;border-radius:7px;cursor:pointer;padding:16px;text-align:center;transition:border-color .2s,background-color .2s,box-shadow .2s;outline:none}.card-type-option:hover{border-color:#5d87ff4d;background:#5d87ff14}.card-type-option:focus-visible{border-color:#5d87ff;box-shadow:0 0 0 3px #5d87ff33}.card-type-option.selected{border-color:#5d87ff;background:#5d87ff14;box-shadow:0 2px 8px #5d87ff26}.card-type-option__image-wrapper{margin-bottom:12px}.card-type-option__image-wrapper img{max-width:100%;height:auto;max-height:140px;object-fit:contain;border-radius:4px}@media (max-width: 600px){.card-type-option__image-wrapper img{max-height:120px}}.card-type-option__info{display:flex;flex-direction:column;gap:4px}.card-type-option__label{font-size:15px;font-weight:600;color:#2a3547}.card-type-option__helper{font-size:13px;color:#5a6a85}.back-btn{display:inline-flex;align-items:center;gap:4px;margin-bottom:16px;color:#5a6a85;font-size:14px;cursor:pointer}.back-btn mat-icon{font-size:18px;width:18px;height:18px}.step-progress__circle.clickable{cursor:pointer}.step-progress__circle.clickable:hover{transform:scale(1.1)}.photo-step{animation:fadeIn .3s ease-out}.photo-capture__label{font-size:15px;color:#2a3547;font-weight:500;margin:0 0 16px}.photo-capture__dropzone{border:2px dashed #ccd5e0;border-radius:7px;padding:32px 16px;display:flex;flex-direction:column;align-items:center;gap:8px;transition:border-color .2s,background-color .2s;cursor:default;margin-bottom:16px}.photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff14}@media (max-width: 600px){.photo-capture__dropzone{padding:24px 12px}}.dropzone-icon{font-size:40px;width:40px;height:40px;color:#a1aab4}.dropzone-text{font-size:14px;color:#5a6a85;margin:0}.dropzone-formats{font-size:12px;color:#a1aab4;margin:0}.photo-capture__actions{display:flex;gap:12px;justify-content:center}@media (max-width: 600px){.photo-capture__actions{flex-direction:column;align-items:stretch}}.action-btn{display:flex;align-items:center;gap:8px;padding:10px 24px;font-size:14px;font-weight:600;border-radius:7px;min-height:44px}.action-btn mat-icon{font-size:20px;width:20px;height:20px}@media (max-width: 600px){.action-btn{justify-content:center;width:100%}}.photo-preview{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:16px}.photo-preview__label{font-size:15px;font-weight:500;color:#2a3547;margin:0}.photo-preview__image{max-height:280px;max-width:100%;object-fit:contain;border-radius:7px;border:1px solid #e5eaef}@media (max-width: 600px){.photo-preview__image{max-height:220px}}.photo-preview__actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}.photo-preview__actions button{display:flex;align-items:center;gap:6px;min-height:44px;border-radius:7px}@media (max-width: 600px){.photo-preview__actions{flex-direction:column;align-items:stretch;width:100%}.photo-preview__actions button{justify-content:center}}.camera-container{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;gap:16px}.camera-selector{width:100%}.camera-viewfinder{position:relative;border-radius:7px;overflow:hidden;background:#000}.camera-video{width:100%;max-height:400px;object-fit:cover;display:block}@media (max-width: 600px){.camera-video{max-height:300px}}.camera-flash-overlay{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none}.camera-flash-overlay.flash{animation:flashCapture .3s ease-out}.camera-controls{display:flex;align-items:center;justify-content:center;gap:16px;padding:8px 0}.camera-cancel-btn{min-height:44px;border-radius:7px}.camera-capture-btn{width:56px;height:56px}.camera-spacer{width:0}@media (min-width: 600px){.camera-spacer{width:80px}}.photo-step__error{display:flex;align-items:center;gap:12px;padding:12px 16px;margin-top:16px;background:#fa896b14;border:1px solid #fa896b;border-radius:7px;color:#2a3547;text-align:left}.photo-step__error>mat-icon{color:#fa896b;flex-shrink:0}.photo-step__error>span{flex:1;font-size:14px}@media (max-width: 600px){.photo-step__error{flex-wrap:wrap}.photo-step__error .retry-btn{width:100%;justify-content:center}}.retry-btn{display:flex;align-items:center;gap:6px;min-height:36px;border-radius:7px;flex-shrink:0}.processing-overlay{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 0}.processing-overlay mat-progress-bar{width:100%;border-radius:7px}.processing-text{font-size:14px;color:#5a6a85;margin:0}.scan-success{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:12px;padding:32px 16px;background:#13deb914;border:1px solid #13deb9;border-radius:7px}.scan-success__icon{font-size:48px;width:48px;height:48px;color:#13deb9}.scan-success__title{font-size:18px;font-weight:600;color:#2a3547;margin:0}:host-context(.dark-theme) .scan-id-container{background-color:#2a3447;box-shadow:0 2px 12px #0000004d}:host-context(.dark-theme) .scan-id-title,:host-context(.dark-theme) .card-type-option__label,:host-context(.dark-theme) .photo-capture__label,:host-context(.dark-theme) .photo-preview__label,:host-context(.dark-theme) .scan-success__title{color:#ffffffde}:host-context(.dark-theme) .scan-id-description,:host-context(.dark-theme) .card-type-option__helper,:host-context(.dark-theme) .dropzone-text,:host-context(.dark-theme) .processing-text,:host-context(.dark-theme) .back-btn{color:#fff9}:host-context(.dark-theme) .dropzone-icon,:host-context(.dark-theme) .dropzone-formats{color:#fff6}:host-context(.dark-theme) .card-type-option{border-color:#333f55}:host-context(.dark-theme) .card-type-option:hover{border-color:#5d87ff80;background:#5d87ff1a}:host-context(.dark-theme) .card-type-option.selected{border-color:#5d87ff;background:#5d87ff26}:host-context(.dark-theme) .step-progress__circle.upcoming{background:#333f55;border-color:#465670;color:#fff6}:host-context(.dark-theme) .step-progress__label{color:#fff6}:host-context(.dark-theme) .step-progress__connector{background:#465670}:host-context(.dark-theme) .photo-capture__dropzone{border-color:#465670}:host-context(.dark-theme) .photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff1a}:host-context(.dark-theme) .photo-preview__image{border-color:#333f55}:host-context(.dark-theme) .photo-step__error{background:#fa896b1a;color:#ffffffde}:host-context(.dark-theme) .scan-success{background:#13deb91a}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab]", inputs: ["extended"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }] }); }
270
477
  }
271
478
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyScanIdComponent, decorators: [{
272
479
  type: Component,
273
- args: [{ selector: 'app-formly-scan-id', template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"] }]
274
- }], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i0.ChangeDetectorRef }], propDecorators: { fileInputFront: [{
275
- type: ViewChild,
276
- args: ['fileInputFront']
277
- }], fileInputBack: [{
480
+ args: [{ selector: 'app-formly-scan-id', template: "<div class=\"scan-id-container\">\n <!-- Header -->\n <h2 class=\"scan-id-title\">{{ props[\"name\"] }}</h2>\n <p class=\"scan-id-description\">{{ props[\"description\"] }}</p>\n\n <!-- Step Progress Indicator -->\n <div class=\"step-progress\" *ngIf=\"wizardSteps.length > 1\" role=\"list\">\n <div class=\"step-progress__item\" *ngFor=\"let step of wizardSteps; let i = index; let last = last\" role=\"listitem\">\n <div class=\"step-progress__circle\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\"\n [class.upcoming]=\"step.status === 'upcoming'\"\n [class.clickable]=\"step.status === 'completed'\"\n [attr.aria-current]=\"step.status === 'active' ? 'step' : null\"\n (click)=\"step.status === 'completed' ? goToStep(i) : null\">\n <mat-icon *ngIf=\"step.status === 'completed'\">check</mat-icon>\n <span *ngIf=\"step.status !== 'completed'\">{{ i + 1 }}</span>\n </div>\n <span class=\"step-progress__label\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\">\n {{ step.label }}\n </span>\n <div class=\"step-progress__connector\" *ngIf=\"!last\"\n [class.completed]=\"step.status === 'completed'\">\n </div>\n </div>\n </div>\n\n <!-- Step 1: Card Type Selection -->\n <div class=\"card-type-step\" *ngIf=\"currentWizardStep === 0\">\n <div class=\"card-type-options\" role=\"radiogroup\">\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\"\n (keydown.enter)=\"selectCardType(true)\"\n (keydown.space)=\"selectCardType(true); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === true && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.oldCardLabel || 'Old ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.oldCardHelper || 'Single-sided card - 1 photo needed' }}\n </span>\n </div>\n </div>\n\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\"\n (keydown.enter)=\"selectCardType(false)\"\n (keydown.space)=\"selectCardType(false); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === false && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.newCardLabel || 'New ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.newCardHelper || 'Card with front and back - 2 photos needed' }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Steps 2-3: Photo Capture / Upload -->\n <div class=\"photo-step\" *ngIf=\"(currentWizardStep === 1 || currentWizardStep === 2) && !isLoading && !(successMessage && isScanValid)\">\n\n <!-- Back Button -->\n <button mat-button class=\"back-btn\" (click)=\"goBack()\">\n <mat-icon>arrow_back</mat-icon>\n {{ currentWizardStep === 1\n ? (props['labels']?.changeCardTypeLabel || 'Change card type')\n : (props['labels']?.backLabel || 'Back') }}\n </button>\n\n <!-- Photo Preview Mode -->\n <div class=\"photo-preview\" *ngIf=\"currentPhotoPreview && !cameraActive\">\n <p class=\"photo-preview__label\">{{ currentStepShortLabel }}</p>\n <img class=\"photo-preview__image\" [src]=\"currentPhotoPreview\" [alt]=\"currentStepShortLabel\" />\n <div class=\"photo-preview__actions\">\n <button mat-stroked-button (click)=\"resetCurrentPhoto()\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retakeLabel || 'Retake' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"confirmPhoto()\">\n <mat-icon>check</mat-icon>\n {{ props['labels']?.usePhotoLabel || 'Use This Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Capture Mode (no photo yet) -->\n <div class=\"photo-capture\" *ngIf=\"!currentPhotoPreview && !cameraActive\">\n <p class=\"photo-capture__label\">{{ currentStepLabel }}</p>\n\n <!-- Drop Zone -->\n <div class=\"photo-capture__dropzone\"\n [class.dragover]=\"isDragOver\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Drop zone for ' + currentStepShortLabel + ' upload'\">\n <mat-icon class=\"dropzone-icon\">cloud_upload</mat-icon>\n <p class=\"dropzone-text\">\n {{ props['labels']?.dragDropPrompt || 'Drag & drop your photo here, or use the buttons below' }}\n </p>\n <p class=\"dropzone-formats\">\n {{ props['labels']?.formatsLabel || 'Accepted' }}: {{ validFormats.join(', ') }} &middot;\n {{ props['labels']?.maxSizeLabel || 'Max' }}: {{ maxFileSizeKB }}KB\n </p>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"photo-capture__actions\">\n <input type=\"file\" #fileInput (change)=\"onFileSelected($event)\" hidden [accept]=\"validFormats.join(',')\" />\n <button mat-flat-button color=\"primary\" (click)=\"fileInput.click()\" class=\"action-btn\">\n <mat-icon>upload_file</mat-icon>\n {{ props['labels']?.uploadFileButtonTranslations || 'Upload File' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"openCamera()\" class=\"action-btn\"\n *ngIf=\"props['config'].showTakePictureButton !== false\">\n <mat-icon>photo_camera</mat-icon>\n {{ props['labels']?.takePictureButtonTranslations || 'Take Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Camera Viewfinder -->\n <div class=\"camera-container\" *ngIf=\"cameraActive\">\n <!-- Camera selector -->\n <mat-form-field *ngIf=\"availableCameras.length > 1\" appearance=\"outline\" class=\"camera-selector\">\n <mat-label>{{ props['labels']?.selectCameraLabel || 'Select camera' }}</mat-label>\n <mat-select [(value)]=\"selectedCameraId\" (selectionChange)=\"switchCamera($event.value)\">\n <mat-option *ngFor=\"let cam of availableCameras; let i = index\" [value]=\"cam.deviceId\">\n {{ cam.label || 'Camera ' + (i + 1) }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"camera-viewfinder\">\n <video #videoElement autoplay playsinline class=\"camera-video\"></video>\n <div class=\"camera-flash-overlay\" [class.flash]=\"showFlash\"></div>\n </div>\n\n <div class=\"camera-controls\">\n <button mat-stroked-button (click)=\"closeCamera()\" class=\"camera-cancel-btn\">\n {{ props['labels']?.cancelLabel || 'Cancel' }}\n </button>\n <button mat-fab color=\"primary\" (click)=\"captureCurrentPhoto()\" class=\"camera-capture-btn\"\n [attr.aria-label]=\"'Capture ' + currentStepShortLabel\">\n <mat-icon>photo_camera</mat-icon>\n </button>\n <div class=\"camera-spacer\"></div>\n </div>\n </div>\n\n <!-- Error Display -->\n <div class=\"photo-step__error\" *ngIf=\"fileError\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon>error_outline</mat-icon>\n <span>{{ fileError }}</span>\n <button mat-stroked-button *ngIf=\"canRetry\" (click)=\"retryUpload()\" class=\"retry-btn\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retryLabel || 'Try Again' }}\n </button>\n </div>\n </div>\n\n <!-- Loading / Processing State -->\n <div class=\"processing-overlay\" *ngIf=\"isLoading\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <p class=\"processing-text\">\n {{ props['labels']?.processingMessage || 'Processing your ID scan...' }}\n </p>\n </div>\n\n <!-- Success State -->\n <div class=\"scan-success\" *ngIf=\"successMessage && isScanValid\" role=\"status\" aria-live=\"polite\">\n <mat-icon class=\"scan-success__icon\">check_circle</mat-icon>\n <h3 class=\"scan-success__title\">\n {{ props['labels']?.successTitle || 'ID scan successful' }}\n </h3>\n </div>\n</div>\n", styles: ["@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes flashCapture{0%{opacity:0}50%{opacity:.8}to{opacity:0}}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:24px;background-color:#fff;border-radius:7px;box-shadow:0 2px 12px #00000014;text-align:center}@media (max-width: 600px){.scan-id-container{padding:16px}}.scan-id-title{font-size:22px;font-weight:700;color:#2a3547;margin:0 0 8px}.scan-id-description{font-size:14px;color:#5a6a85;margin:0 0 24px}.step-progress{display:flex;justify-content:center;align-items:flex-start;gap:0;margin-bottom:32px;padding:0 8px}@media (max-width: 600px){.step-progress{margin-bottom:24px}}.step-progress__item{display:flex;flex-direction:column;align-items:center;position:relative;flex:1;min-width:0}.step-progress__circle{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:600;transition:all .3s ease;position:relative;z-index:1;flex-shrink:0}.step-progress__circle.upcoming{background:#f2f6fa;color:#a1aab4;border:2px solid #dfe5ef}.step-progress__circle.active{background:#5d87ff;color:#fff;border:2px solid #5d87ff;box-shadow:0 2px 8px #5d87ff59}.step-progress__circle.completed{background:#13deb9;color:#fff;border:2px solid #13deb9}.step-progress__circle.completed mat-icon{font-size:18px;width:18px;height:18px}.step-progress__label{font-size:12px;color:#a1aab4;margin-top:8px;text-align:center;line-height:1.3;max-width:100px}.step-progress__label.active{color:#5d87ff;font-weight:600}.step-progress__label.completed{color:#13deb9;font-weight:500}@media (max-width: 600px){.step-progress__label{font-size:11px;max-width:80px}}.step-progress__connector{position:absolute;top:18px;left:calc(50% + 22px);right:calc(-50% + 22px);height:2px;background:#dfe5ef;transition:background .3s ease;z-index:0;width:calc(100% - 44px)}.step-progress__connector.completed{background:#13deb9}.card-type-step{animation:fadeIn .3s ease-out}.card-type-options{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width: 600px){.card-type-options{grid-template-columns:1fr;gap:12px}}.card-type-option{border:2px solid #e5eaef;border-radius:7px;cursor:pointer;padding:16px;text-align:center;transition:border-color .2s,background-color .2s,box-shadow .2s;outline:none}.card-type-option:hover{border-color:#5d87ff4d;background:#5d87ff14}.card-type-option:focus-visible{border-color:#5d87ff;box-shadow:0 0 0 3px #5d87ff33}.card-type-option.selected{border-color:#5d87ff;background:#5d87ff14;box-shadow:0 2px 8px #5d87ff26}.card-type-option__image-wrapper{margin-bottom:12px}.card-type-option__image-wrapper img{max-width:100%;height:auto;max-height:140px;object-fit:contain;border-radius:4px}@media (max-width: 600px){.card-type-option__image-wrapper img{max-height:120px}}.card-type-option__info{display:flex;flex-direction:column;gap:4px}.card-type-option__label{font-size:15px;font-weight:600;color:#2a3547}.card-type-option__helper{font-size:13px;color:#5a6a85}.back-btn{display:inline-flex;align-items:center;gap:4px;margin-bottom:16px;color:#5a6a85;font-size:14px;cursor:pointer}.back-btn mat-icon{font-size:18px;width:18px;height:18px}.step-progress__circle.clickable{cursor:pointer}.step-progress__circle.clickable:hover{transform:scale(1.1)}.photo-step{animation:fadeIn .3s ease-out}.photo-capture__label{font-size:15px;color:#2a3547;font-weight:500;margin:0 0 16px}.photo-capture__dropzone{border:2px dashed #ccd5e0;border-radius:7px;padding:32px 16px;display:flex;flex-direction:column;align-items:center;gap:8px;transition:border-color .2s,background-color .2s;cursor:default;margin-bottom:16px}.photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff14}@media (max-width: 600px){.photo-capture__dropzone{padding:24px 12px}}.dropzone-icon{font-size:40px;width:40px;height:40px;color:#a1aab4}.dropzone-text{font-size:14px;color:#5a6a85;margin:0}.dropzone-formats{font-size:12px;color:#a1aab4;margin:0}.photo-capture__actions{display:flex;gap:12px;justify-content:center}@media (max-width: 600px){.photo-capture__actions{flex-direction:column;align-items:stretch}}.action-btn{display:flex;align-items:center;gap:8px;padding:10px 24px;font-size:14px;font-weight:600;border-radius:7px;min-height:44px}.action-btn mat-icon{font-size:20px;width:20px;height:20px}@media (max-width: 600px){.action-btn{justify-content:center;width:100%}}.photo-preview{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:16px}.photo-preview__label{font-size:15px;font-weight:500;color:#2a3547;margin:0}.photo-preview__image{max-height:280px;max-width:100%;object-fit:contain;border-radius:7px;border:1px solid #e5eaef}@media (max-width: 600px){.photo-preview__image{max-height:220px}}.photo-preview__actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}.photo-preview__actions button{display:flex;align-items:center;gap:6px;min-height:44px;border-radius:7px}@media (max-width: 600px){.photo-preview__actions{flex-direction:column;align-items:stretch;width:100%}.photo-preview__actions button{justify-content:center}}.camera-container{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;gap:16px}.camera-selector{width:100%}.camera-viewfinder{position:relative;border-radius:7px;overflow:hidden;background:#000}.camera-video{width:100%;max-height:400px;object-fit:cover;display:block}@media (max-width: 600px){.camera-video{max-height:300px}}.camera-flash-overlay{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none}.camera-flash-overlay.flash{animation:flashCapture .3s ease-out}.camera-controls{display:flex;align-items:center;justify-content:center;gap:16px;padding:8px 0}.camera-cancel-btn{min-height:44px;border-radius:7px}.camera-capture-btn{width:56px;height:56px}.camera-spacer{width:0}@media (min-width: 600px){.camera-spacer{width:80px}}.photo-step__error{display:flex;align-items:center;gap:12px;padding:12px 16px;margin-top:16px;background:#fa896b14;border:1px solid #fa896b;border-radius:7px;color:#2a3547;text-align:left}.photo-step__error>mat-icon{color:#fa896b;flex-shrink:0}.photo-step__error>span{flex:1;font-size:14px}@media (max-width: 600px){.photo-step__error{flex-wrap:wrap}.photo-step__error .retry-btn{width:100%;justify-content:center}}.retry-btn{display:flex;align-items:center;gap:6px;min-height:36px;border-radius:7px;flex-shrink:0}.processing-overlay{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 0}.processing-overlay mat-progress-bar{width:100%;border-radius:7px}.processing-text{font-size:14px;color:#5a6a85;margin:0}.scan-success{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:12px;padding:32px 16px;background:#13deb914;border:1px solid #13deb9;border-radius:7px}.scan-success__icon{font-size:48px;width:48px;height:48px;color:#13deb9}.scan-success__title{font-size:18px;font-weight:600;color:#2a3547;margin:0}:host-context(.dark-theme) .scan-id-container{background-color:#2a3447;box-shadow:0 2px 12px #0000004d}:host-context(.dark-theme) .scan-id-title,:host-context(.dark-theme) .card-type-option__label,:host-context(.dark-theme) .photo-capture__label,:host-context(.dark-theme) .photo-preview__label,:host-context(.dark-theme) .scan-success__title{color:#ffffffde}:host-context(.dark-theme) .scan-id-description,:host-context(.dark-theme) .card-type-option__helper,:host-context(.dark-theme) .dropzone-text,:host-context(.dark-theme) .processing-text,:host-context(.dark-theme) .back-btn{color:#fff9}:host-context(.dark-theme) .dropzone-icon,:host-context(.dark-theme) .dropzone-formats{color:#fff6}:host-context(.dark-theme) .card-type-option{border-color:#333f55}:host-context(.dark-theme) .card-type-option:hover{border-color:#5d87ff80;background:#5d87ff1a}:host-context(.dark-theme) .card-type-option.selected{border-color:#5d87ff;background:#5d87ff26}:host-context(.dark-theme) .step-progress__circle.upcoming{background:#333f55;border-color:#465670;color:#fff6}:host-context(.dark-theme) .step-progress__label{color:#fff6}:host-context(.dark-theme) .step-progress__connector{background:#465670}:host-context(.dark-theme) .photo-capture__dropzone{border-color:#465670}:host-context(.dark-theme) .photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff1a}:host-context(.dark-theme) .photo-preview__image{border-color:#333f55}:host-context(.dark-theme) .photo-step__error{background:#fa896b1a;color:#ffffffde}:host-context(.dark-theme) .scan-success{background:#13deb91a}\n"] }]
481
+ }], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i0.ChangeDetectorRef }], propDecorators: { fileInput: [{
278
482
  type: ViewChild,
279
- args: ['fileInputBack']
483
+ args: ['fileInput']
280
484
  }], videoElement: [{
281
485
  type: ViewChild,
282
486
  args: ['videoElement']
283
487
  }] } });
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFHVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFVN0MsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFNBQVM7SUFzQmxELFlBQ1UsY0FBc0MsRUFDdEMsR0FBc0I7UUFFOUIsS0FBSyxFQUFFLENBQUM7UUFIQSxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF2QmhDLFlBQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFpQixH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UUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUNFLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRO29CQUNyQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDL0IsQ0FBQztvQkFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0F6VFUscUJBQXFCO21HQUFyQixxQkFBcUIsbVlDbEJsQyxraUhBMEVNOzs0RkR4RE8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG9CQUFvQjsySEFvQkQsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0MsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNDLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbkRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBTY2FuSWREdG8gfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQXBwRGF0YUZpbGwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybWx5LXNjYW4taWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtbHktc2Nhbi1pZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlTY2FuSWRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGUgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgZmlsZUVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmlsZU5hbWVGcm9udDogc3RyaW5nID0gJyc7XG4gIGZpbGVOYW1lQmFjazogc3RyaW5nID0gJyc7XG4gIHZhbGlkRm9ybWF0czogc3RyaW5nW10gPSBbXTtcbiAgbWF4RmlsZVNpemVLQjogbnVtYmVyID0gMDtcbiAgY2FyZFR5cGVTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBvbGRJZENhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZnJvbnRQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGJhY2tQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHBob3RvQmFzZTY0RnJvbnQ6IHN0cmluZyA9ICcnO1xuICBwaG90b0Jhc2U2NEJhY2s6IHN0cmluZyA9ICcnO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEZyb250JykgZmlsZUlucHV0RnJvbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEJhY2snKSBmaWxlSW5wdXRCYWNrOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd2aWRlb0VsZW1lbnQnKSB2aWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gIHZpZGVvU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuICBpc1NjYW5WYWxpZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcbiAgICBncm91cC5hZGRDb250cm9sKHRoaXMucHJvcHNbJ2lkZW50aWZpZXInXSwgdGhpcy5jb250cm9sKTtcblxuICAgIHRoaXMudmFsaWRGb3JtYXRzID0gdGhpcy5wcm9wc1snY29uZmlnJ10uYWxsb3dlZEZvcm1hdHM/LnNwbGl0KCcsJykgfHwgW1xuICAgICAgJy5qcGcnLFxuICAgICAgJy5wbmcnLFxuICAgIF07XG4gICAgdGhpcy5tYXhGaWxlU2l6ZUtCID0gdGhpcy5wcm9wc1snY29uZmlnJ10ubWF4RmlsZVNpemVLQiB8fCAyMDAwO1xuXG4gICAgaWYgKHRoaXMucHJvcHNbJ2NvbmZpZyddLmNvbGxlY3RlZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KFxuICAgICAgICB0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWRcbiAgICAgICk/LnZhbHVlO1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgdGhpcy5mb3JtXG4gICAgICAgIC5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKVxuICAgICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKT8udmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RDYXJkVHlwZShpc09sZElkQ2FyZDogYm9vbGVhbikge1xuICAgIHRoaXMub2xkSWRDYXJkID0gaXNPbGRJZENhcmQ7XG4gICAgdGhpcy5jYXJkVHlwZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSwgaXNGcm9udDogYm9vbGVhbikge1xuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGZpbGVTaXplS0IgPSBmaWxlLnNpemUgLyAxMDI0O1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRGb3JtYXRzLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uaW52YWxpZFR5cGUgfHxcbiAgICAgICAgICBgSW52YWxpZCBmaWxlIHR5cGUuIEFsbG93ZWQgZm9ybWF0cyBhcmUgJHt0aGlzLnZhbGlkRm9ybWF0cy5qb2luKFxuICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICl9YFxuICAgICAgICApLnJlcGxhY2UoJ3tmb3JtYXRzfScsIHRoaXMudmFsaWRGb3JtYXRzLmpvaW4oJywgJykpO1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHsgaW52YWxpZFR5cGU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVTaXplS0IgPiB0aGlzLm1heEZpbGVTaXplS0IgfHwgZmlsZVNpemVLQiA8IDEpIHtcbiAgICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5tYXhTaXplIHx8XG4gICAgICAgICAgYEZpbGUgc2l6ZSBtdXN0IGJlIGJldHdlZW4gMUtCIGFuZCAke3RoaXMubWF4RmlsZVNpemVLQn1LQi5gXG4gICAgICAgICkucmVwbGFjZSgne3NpemV9JywgdGhpcy5tYXhGaWxlU2l6ZUtCKTtcbiAgICAgICAgdGhpcy5jb250cm9sLnNldEVycm9ycyh7IGludmFsaWRTaXplOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgdGhpcy5maWxlTmFtZUZyb250ID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9IHJlYWRlci5yZXN1bHQ/LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID0gcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hlY2tVcGxvYWRDb25kaXRpb24oKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGFrZVBpY3R1cmUoKSB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcblxuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykge1xuICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAuZW51bWVyYXRlRGV2aWNlcygpXG4gICAgICAgIC50aGVuKChkZXZpY2VzKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmlkZW9EZXZpY2VzID0gZGV2aWNlcy5maWx0ZXIoXG4gICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gJ3ZpZGVvaW5wdXQnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdObyBjYW1lcmEgZGV2aWNlcyBmb3VuZC4nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHZpZGVvRGV2aWNlc1swXS5kZXZpY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGV2aWNlSWQgPSBwcm9tcHQoXG4gICAgICAgICAgICAgICdTZWxlY3QgY2FtZXJhJyxcbiAgICAgICAgICAgICAgdmlkZW9EZXZpY2VzLm1hcCgoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwpLmpvaW4oJywgJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERldmljZSA9IHZpZGVvRGV2aWNlcy5maW5kKFxuICAgICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwgPT09IHNlbGVjdGVkRGV2aWNlSWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZSkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHNlbGVjdGVkRGV2aWNlLmRldmljZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0ludmFsaWQgY2FtZXJhIHNlbGVjdGlvbi4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdVbmFibGUgdG8gYWNjZXNzIHRoZSBjYW1lcmEgZGV2aWNlcy4nO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnQ2FtZXJhIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuJztcbiAgICB9XG4gIH1cblxuICBzdGFydENhbWVyYShkZXZpY2VJZDogc3RyaW5nKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB7IGRldmljZUlkIH0gfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy52aWRlb1N0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudC5zcmNPYmplY3QgPSBzdHJlYW07XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxheSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIGNhbWVyYS4nO1xuICAgICAgfSk7XG4gIH1cblxuICBjYXB0dXJlUGhvdG8oaXNGcm9udDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnTm8gdmlkZW8gZWxlbWVudCBhdmFpbGFibGUuJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnRleHQ/LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgIGlmIChibG9iKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgICB0aGlzLnBob3RvQmFzZTY0RnJvbnQgPVxuICAgICAgICAgICAgICByZWFkZXIucmVzdWx0Py50b1N0cmluZygpLnNwbGl0KCcsJylbMV0gfHwgJyc7XG4gICAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID1cbiAgICAgICAgICAgICAgcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkQ29uZGl0aW9uKCk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aWRlb1N0cmVhbSkge1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAnaW1hZ2UvanBlZycpO1xuICB9XG5cbiAgdXBsb2FkUGhvdG8oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCBjb21tYW5kOiBTY2FuSWREdG8gPSB7XG4gICAgICBhcHBJZDogdGhpcy5wcm9wc1snYXBwSWQnXSxcbiAgICAgIGFwcERhdGFJZDogdGhpcy5wcm9wc1snYXBwRGF0YUlkJ10sXG4gICAgICBzdGVwSWQ6IHRoaXMucHJvcHNbJ3N0ZXBJZCddLFxuICAgICAgb2xkSWRDYXJkOiB0aGlzLm9sZElkQ2FyZCxcbiAgICAgIHBob3RvczogdGhpcy5vbGRJZENhcmRcbiAgICAgICAgPyBbeyBiYXNlNjQ6IHRoaXMucGhvdG9CYXNlNjRGcm9udCB9XVxuICAgICAgICA6IFt7IGJhc2U2NDogdGhpcy5waG90b0Jhc2U2NEZyb250IH0sIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0QmFjayB9XSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHBEYXRhU2VydmljZS5zY2FuSWQoY29tbWFuZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1NjYW4gSUQgcmVzdWx0OicsIHJlc3VsdCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGFwcERhdGEgPSBhd2FpdCB0aGlzLmFwcERhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2FwcERhdGFJZCddXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFwcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NDQU4tSURdIGV4dHJhY3RlZCBzdGF0dXM6Jywgc3RhdHVzKTtcblxuICAgICAgICAgIGlmIChzdGF0dXM/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludmFsaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmludmFsaWRTdGF0dXMgfHxcbiAgICAgICAgICAgICAgJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlLic7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkU3RhdHVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNTY2FuVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwhJztcbiAgICAgICAgICBpZiAodGhpcy5wcm9wc1snZXZlbnQnXSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wc1snZXZlbnQnXShhcHBEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHNjYW4uJztcbiAgICAgICAgY29uc29sZS5lcnJvcignU2NhbiBJRCBlcnJvcjonLCBlcnIpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRGb3JtKHByZXNlcnZlRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9ICcnO1xuICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEZyb250ID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEJhY2sgPSAnJztcbiAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXByZXNlcnZlRXJyb3IpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy52aWRlb1N0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gbnVsbDtcbiAgfVxuXG4gIGNoZWNrVXBsb2FkQ29uZGl0aW9uKCkge1xuICAgIGlmICh0aGlzLm9sZElkQ2FyZCB8fCAodGhpcy5mcm9udFBob3RvVXBsb2FkZWQgJiYgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCkpIHtcbiAgICAgIHRoaXMudXBsb2FkUGhvdG8oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWFwcERhdGE/LmZpbGxEYXRhIHx8ICF0aGlzLnByb3BzWydzdGVwSWQnXSkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgZmlsbERhdGE6IEFwcERhdGFGaWxsO1xuICAgIHRyeSB7XG4gICAgICBmaWxsRGF0YSA9XG4gICAgICAgIHR5cGVvZiBhcHBEYXRhLmZpbGxEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gKEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSkgYXMgQXBwRGF0YUZpbGwpXG4gICAgICAgICAgOiBhcHBEYXRhLmZpbGxEYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tleHRyYWN0U3RhdHVzRnJvbUFwcERhdGFdIEpTT04gcGFyc2UgZXJyb3InLCBlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBmaWxsRGF0YS5mbHV4LmZpbmQoXG4gICAgICAoczogYW55KSA9PiBzLnN0ZXBJZCA9PT0gdGhpcy5wcm9wc1snc3RlcElkJ11cbiAgICApO1xuICAgIGlmICghc3RlcD8uc2VjdGlvbnMpIHJldHVybiBudWxsO1xuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBzZWN0aW9uLmNvbnRyb2xzIHx8IFtdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgY29udHJvbC5maWxsVmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgY29udHJvbC5maWxsVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY29udHJvbC5maWxsVmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzY2FuLWlkLWNvbnRhaW5lclwiPlxuICA8aDIgY2xhc3M9XCJ0aXRsZVwiPnt7IHByb3BzW1wibmFtZVwiXSB9fTwvaDI+XG4gIDxwIGNsYXNzPVwiZGVzY3JpcHRpb25cIj57eyBwcm9wc1tcImRlc2NyaXB0aW9uXCJdIH19PC9wPlxuXG4gIDwhLS0gU2VsZWN0aW9uIFN0ZXAgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLXNlbGVjdGlvbi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25cIlxuICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwib2xkSWRDYXJkID09PSB0cnVlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2FyZFR5cGUodHJ1ZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL29sZC1pZC1jYXJkLnBuZ1wiIGFsdD1cIk9sZCBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtb3B0aW9uXCJcbiAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm9sZElkQ2FyZCA9PT0gZmFsc2UgJiYgY2FyZFR5cGVTZWxlY3RlZFwiXG4gICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXJkVHlwZShmYWxzZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL25ldy1pZC1jYXJkLnBuZ1wiIGFsdD1cIk5ldyBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj5cbiAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImNhcmRUeXBlU2VsZWN0ZWQgJiYgIWlzTG9hZGluZ1wiIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgIDwhLS0gU3RlcCAxOiBVcGxvYWQgRnJvbnQgUGhvdG8gLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFmcm9udFBob3RvVXBsb2FkZWRcIiBjbGFzcz1cInVwbG9hZC1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICA8cD57eyBwcm9wc1snbGFiZWxzJ10udXBsb2FkRnJvbnRQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGZyb250IHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nIH19PC9wPlxuICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgI2ZpbGVJbnB1dEZyb250IChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50LCB0cnVlKVwiIGhpZGRlbiAvPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImZpbGVJbnB1dEZyb250LmNsaWNrKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3VkX3VwbG9hZDwvbWF0LWljb24+XG4gICAgICAgIHt7IGZpbGVOYW1lRnJvbnQgPyBmaWxlTmFtZUZyb250IDogcHJvcHNbJ2xhYmVscyddLnVwbG9hZEZpbGVCdXR0b25UcmFuc2xhdGlvbnMgfHwgJ1VwbG9hZCBGcm9udCBQaG90bycgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImZpbGVFcnJvclwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICB7eyBmaWxlRXJyb3IgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwIDI6IFVwbG9hZCBCYWNrIFBob3RvIChPbmx5IGZvciBOZXcgSUQgQ2FyZHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJmcm9udFBob3RvVXBsb2FkZWQgJiYgIW9sZElkQ2FyZCAmJiAhaXNMb2FkaW5nXCIgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgICAgPHA+e3sgcHJvcHNbJ2xhYmVscyddLnVwbG9hZEJhY2tQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGJhY2sgcGhvdG8gb2YgeW91ciBJRCBjYXJkLicgfX08L3A+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0QmFjayAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudCwgZmFsc2UpXCIgaGlkZGVuIC8+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZmlsZUlucHV0QmFjay5jbGljaygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICB7eyBmaWxlTmFtZUJhY2sgPyBmaWxlTmFtZUJhY2sgOiBwcm9wc1snbGFiZWxzJ10udXBsb2FkRmlsZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVXBsb2FkIEJhY2sgUGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWxlRXJyb3JcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAge3sgZmlsZUVycm9yIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gXG4gICAgPCEtLSBUYWtlIFBob3RvIEJ1dHRvbiAoT3B0aW9uYWwpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJwcm9wc1snY29uZmlnJ10uc2hvd1Rha2VQaWN0dXJlQnV0dG9uXCIgY2xhc3M9XCJ0YWtlLXBob3RvLWNvbnRhaW5lclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwidGFrZVBpY3R1cmUoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2FtZXJhX2FsdDwvbWF0LWljb24+XG4gICAgICAgIHt7IHByb3BzWydsYWJlbHMnXS50YWtlUGljdHVyZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8dmlkZW8gI3ZpZGVvRWxlbWVudCAqbmdJZj1cInZpZGVvU3RyZWFtXCIgd2lkdGg9XCIxMDAlXCIgY2xhc3M9XCJ2aWRlby1wcmV2aWV3XCIgYXV0b3BsYXk+PC92aWRlbz5cblxuICAgICAgPCEtLSBUYWtlIEZyb250IFBob3RvIC0tPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKm5nSWY9XCJ2aWRlb1N0cmVhbSAmJiAhZnJvbnRQaG90b1VwbG9hZGVkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byh0cnVlKVwiPlxuICAgICAgICA8bWF0LWljb24+cGhvdG9fY2FtZXJhPC9tYXQtaWNvbj5cbiAgICAgICAge3sgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5mcm9udElkIHx8ICdUYWtlIGEgcGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBUYWtlIEJhY2sgUGhvdG8gLS0+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAqbmdJZj1cInZpZGVvU3RyZWFtICYmIGZyb250UGhvdG9VcGxvYWRlZCAmJiAhb2xkSWRDYXJkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byhmYWxzZSlcIj5cbiAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgIHt7IHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uYmFja0lkICB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic3VjY2Vzc01lc3NhZ2UgJiYgaXNTY2FuVmFsaWRcIiBjbGFzcz1cInN1Y2Nlc3MtbWVzc2FnZS1jb250YWluZXJcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJsYXJnZS1pY29uXCIgY29sb3I9XCJwcmltYXJ5XCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFJVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUFnQjdDLE1BQU0sT0FBTyxxQkFDWCxTQUFRLFNBQVM7SUErQ2pCLFlBQ1UsY0FBc0MsRUFDdEMsR0FBc0I7UUFFOUIsS0FBSyxFQUFFLENBQUM7UUFIQSxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE5Q2hDLFlBQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFp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QU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUM3QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUM5QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFakMsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxJQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRO29CQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDNUIsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQy9CLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0FsakJVLHFCQUFxQjttR0FBckIscUJBQXFCLHdSQ3pCbEMsbTVSQXFNQTs7NEZENUthLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxvQkFBb0I7MkhBOENOLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9uRGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IFNjYW5JZER0byB9IGZyb20gJy4uLy4uL21vZGVscy9hcHBsaWNhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBBcHBEYXRhRmlsbCB9IGZyb20gJy4uLy4uL21vZGVscy9mb3Jtcy5tb2RlbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l6YXJkU3RlcCB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHN0YXR1czogJ3VwY29taW5nJyB8ICdhY3RpdmUnIHwgJ2NvbXBsZXRlZCc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mb3JtbHktc2Nhbi1pZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtbHktc2Nhbi1pZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm1seS1zY2FuLWlkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVNjYW5JZENvbXBvbmVudFxuICBleHRlbmRzIEZpZWxkVHlwZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIGNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICBmaWxlRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBmaWxlTmFtZUZyb250OiBzdHJpbmcgPSAnJztcbiAgZmlsZU5hbWVCYWNrOiBzdHJpbmcgPSAnJztcbiAgdmFsaWRGb3JtYXRzOiBzdHJpbmdbXSA9IFtdO1xuICBtYXhGaWxlU2l6ZUtCOiBudW1iZXIgPSAwO1xuICBjYXJkVHlwZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIG9sZElkQ2FyZDogYm9vbGVhbiA9IGZhbHNlO1xuICBmcm9udFBob3RvVXBsb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYmFja1Bob3RvVXBsb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGhvdG9CYXNlNjRGcm9udDogc3RyaW5nID0gJyc7XG4gIHBob3RvQmFzZTY0QmFjazogc3RyaW5nID0gJyc7XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlzU2NhblZhbGlkOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBXaXphcmQgc3RhdGVcbiAgY3VycmVudFdpemFyZFN0ZXA6IG51bWJlciA9IDA7XG4gIHdpemFyZFN0ZXBzOiBXaXphcmRTdGVwW10gPSBbXTtcblxuICAvLyBDYW1lcmEgbWFuYWdlbWVudFxuICBjYW1lcmFBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYXZhaWxhYmxlQ2FtZXJhczogTWVkaWFEZXZpY2VJbmZvW10gPSBbXTtcbiAgc2VsZWN0ZWRDYW1lcmFJZDogc3RyaW5nID0gJyc7XG5cbiAgLy8gUGhvdG8gcHJldmlldyAoZnVsbCBkYXRhIFVSSSBmb3IgaW1nIGRpc3BsYXkpXG4gIHBob3RvUHJldmlld0Zyb250OiBzdHJpbmcgPSAnJztcbiAgcGhvdG9QcmV2aWV3QmFjazogc3RyaW5nID0gJyc7XG5cbiAgLy8gRHJhZyBhbmQgZHJvcFxuICBpc0RyYWdPdmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRmxhc2ggYW5pbWF0aW9uXG4gIHNob3dGbGFzaDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFJldHJ5XG4gIGNhblJldHJ5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndmlkZW9FbGVtZW50JykgdmlkZW9FbGVtZW50ITogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcbiAgdmlkZW9TdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB2YWx1ZUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcbiAgICBncm91cC5hZGRDb250cm9sKHRoaXMucHJvcHNbJ2lkZW50aWZpZXInXSwgdGhpcy5jb250cm9sKTtcblxuICAgIHRoaXMudmFsaWRGb3JtYXRzID0gdGhpcy5wcm9wc1snY29uZmlnJ10uYWxsb3dlZEZvcm1hdHM/LnNwbGl0KCcsJykgfHwgW1xuICAgICAgJy5qcGcnLFxuICAgICAgJy5wbmcnLFxuICAgIF07XG4gICAgdGhpcy5tYXhGaWxlU2l6ZUtCID0gdGhpcy5wcm9wc1snY29uZmlnJ10ubWF4RmlsZVNpemVLQiB8fCAyMDAwO1xuXG4gICAgaWYgKHRoaXMucHJvcHNbJ2NvbmZpZyddLmNvbGxlY3RlZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KFxuICAgICAgICB0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWRcbiAgICAgICk/LnZhbHVlO1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgdGhpcy52YWx1ZUNoYW5nZXNTdWIgPSB0aGlzLmZvcm1cbiAgICAgICAgLmdldCh0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWQpXG4gICAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKFxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWQpPy52YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdFdpemFyZFN0ZXBzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN0b3BDYW1lcmEoKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50UGhvdG9QcmV2aWV3KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDFcbiAgICAgID8gdGhpcy5waG90b1ByZXZpZXdGcm9udFxuICAgICAgOiB0aGlzLnBob3RvUHJldmlld0JhY2s7XG4gIH1cblxuICBnZXQgY3VycmVudFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRXaXphcmRTdGVwID09PSAxKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnByb3BzWydsYWJlbHMnXT8udXBsb2FkRnJvbnRQcm9tcHQgfHxcbiAgICAgICAgJ1BsZWFzZSB1cGxvYWQgdGhlIGZyb250IHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wc1snbGFiZWxzJ10/LnVwbG9hZEJhY2tQcm9tcHQgfHxcbiAgICAgICdQbGVhc2UgdXBsb2FkIHRoZSBiYWNrIHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50U3RlcFNob3J0TGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHNbJ2xhYmVscyddPy5mcm9udFBob3RvTGFiZWwgfHwgJ0Zyb250IG9mIElEJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvcHNbJ2xhYmVscyddPy5iYWNrUGhvdG9MYWJlbCB8fCAnQmFjayBvZiBJRCc7XG4gIH1cblxuICAvLyAtLS0gV2l6YXJkIFN0ZXAgTWFuYWdlbWVudCAtLS1cblxuICBwcml2YXRlIGluaXRXaXphcmRTdGVwcygpIHtcbiAgICB0aGlzLndpemFyZFN0ZXBzID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDpcbiAgICAgICAgICB0aGlzLnByb3BzWydsYWJlbHMnXT8uY2FyZFR5cGVTdGVwTGFiZWwgfHwgJ1NlbGVjdCBDYXJkIFR5cGUnLFxuICAgICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVXaXphcmRTdGVwcygpIHtcbiAgICBjb25zdCBmcm9udExhYmVsID1cbiAgICAgIHRoaXMucHJvcHNbJ2xhYmVscyddPy5mcm9udFBob3RvU3RlcExhYmVsIHx8ICdGcm9udCBQaG90byc7XG4gICAgY29uc3QgYmFja0xhYmVsID1cbiAgICAgIHRoaXMucHJvcHNbJ2xhYmVscyddPy5iYWNrUGhvdG9TdGVwTGFiZWwgfHwgJ0JhY2sgUGhvdG8nO1xuXG4gICAgdGhpcy53aXphcmRTdGVwcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6XG4gICAgICAgICAgdGhpcy5wcm9wc1snbGFiZWxzJ10/LmNhcmRUeXBlU3RlcExhYmVsIHx8ICdTZWxlY3QgQ2FyZCBUeXBlJyxcbiAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIH0sXG4gICAgICB7IGxhYmVsOiBmcm9udExhYmVsLCBzdGF0dXM6ICdhY3RpdmUnIH0sXG4gICAgXTtcbiAgICBpZiAoIXRoaXMub2xkSWRDYXJkKSB7XG4gICAgICB0aGlzLndpemFyZFN0ZXBzLnB1c2goeyBsYWJlbDogYmFja0xhYmVsLCBzdGF0dXM6ICd1cGNvbWluZycgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIE5hdmlnYXRpb24gLS0tXG5cbiAgZ29CYWNrKCkge1xuICAgIHRoaXMuY2xvc2VDYW1lcmEoKTtcbiAgICBpZiAodGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMikge1xuICAgICAgLy8gR28gYmFjayB0byBmcm9udCBwaG90byBzdGVwLCBwcmVzZXJ2ZSBmcm9udCBwaG90b1xuICAgICAgdGhpcy53aXphcmRTdGVwc1syXS5zdGF0dXMgPSAndXBjb21pbmcnO1xuICAgICAgdGhpcy53aXphcmRTdGVwc1sxXS5zdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgIHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPSAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMSkge1xuICAgICAgLy8gR28gYmFjayB0byBjYXJkIHR5cGUgc2VsZWN0aW9uLCByZXNldCBldmVyeXRoaW5nXG4gICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgdGhpcy5jYXJkVHlwZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRXaXphcmRTdGVwID0gMDtcbiAgICAgIHRoaXMuaW5pdFdpemFyZFN0ZXBzKCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGdvVG9TdGVwKHN0ZXBJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHN0ZXBJbmRleCA8IHRoaXMuY3VycmVudFdpemFyZFN0ZXApIHtcbiAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRXaXphcmRTdGVwID4gc3RlcEluZGV4KSB7XG4gICAgICAgIHRoaXMuZ29CYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIENhcmQgVHlwZSBTZWxlY3Rpb24gLS0tXG5cbiAgc2VsZWN0Q2FyZFR5cGUoaXNPbGRJZENhcmQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9sZElkQ2FyZCA9IGlzT2xkSWRDYXJkO1xuICAgIHRoaXMuY2FyZFR5cGVTZWxlY3RlZCA9IHRydWU7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLnVwZGF0ZVdpemFyZFN0ZXBzKCk7XG4gICAgdGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9IDE7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLy8gLS0tIEZpbGUgVXBsb2FkIC0tLVxuXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0Py5maWxlcz8uWzBdO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCBpc0Zyb250ID0gdGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMTtcbiAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZSwgaXNGcm9udCk7XG4gICAgfVxuICAgIC8vIFJlc2V0IGlucHV0IHNvIHNhbWUgZmlsZSBjYW4gYmUgcmUtc2VsZWN0ZWRcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRmlsZShmaWxlOiBGaWxlLCBpc0Zyb250OiBib29sZWFuKSB7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9ICcuJyArIGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZpbGVTaXplS0IgPSBmaWxlLnNpemUgLyAxMDI0O1xuXG4gICAgaWYgKCF0aGlzLnZhbGlkRm9ybWF0cy5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uKSkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uaW52YWxpZFR5cGUgfHxcbiAgICAgICAgYEludmFsaWQgZmlsZSB0eXBlLiBBbGxvd2VkIGZvcm1hdHMgYXJlICR7dGhpcy52YWxpZEZvcm1hdHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9YFxuICAgICAgKS5yZXBsYWNlKCd7Zm9ybWF0c30nLCB0aGlzLnZhbGlkRm9ybWF0cy5qb2luKCcsICcpKTtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkVHlwZTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmlsZVNpemVLQiA+IHRoaXMubWF4RmlsZVNpemVLQiB8fCBmaWxlU2l6ZUtCIDwgMSkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8ubWF4U2l6ZSB8fFxuICAgICAgICBgRmlsZSBzaXplIG11c3QgYmUgYmV0d2VlbiAxS0IgYW5kICR7dGhpcy5tYXhGaWxlU2l6ZUtCfUtCLmBcbiAgICAgICkucmVwbGFjZSgne3NpemV9JywgdGhpcy5tYXhGaWxlU2l6ZUtCLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5jb250cm9sLnNldEVycm9ycyh7IGludmFsaWRTaXplOiB0cnVlIH0pO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhVXJpID0gcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKSB8fCAnJztcbiAgICAgIGNvbnN0IGJhc2U2NCA9IGRhdGFVcmkuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9IGZpbGUubmFtZTtcbiAgICAgICAgdGhpcy5waG90b0Jhc2U2NEZyb250ID0gYmFzZTY0O1xuICAgICAgICB0aGlzLnBob3RvUHJldmlld0Zyb250ID0gZGF0YVVyaTtcbiAgICAgICAgdGhpcy5mcm9udFBob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWxlTmFtZUJhY2sgPSBmaWxlLm5hbWU7XG4gICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID0gYmFzZTY0O1xuICAgICAgICB0aGlzLnBob3RvUHJldmlld0JhY2sgPSBkYXRhVXJpO1xuICAgICAgICB0aGlzLmJhY2tQaG90b1VwbG9hZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gLS0tIERyYWcgYW5kIERyb3AgLS0tXG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xuICB9XG5cbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpc0Zyb250ID0gdGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMTtcbiAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZXNbMF0sIGlzRnJvbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBDYW1lcmEgLS0tXG5cbiAgYXN5bmMgb3BlbkNhbWVyYSgpIHtcbiAgICB0aGlzLmZpbGVFcnJvciA9IG51bGw7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgaWYgKCFuYXZpZ2F0b3IubWVkaWFEZXZpY2VzPy5nZXRVc2VyTWVkaWEpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID1cbiAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5jYW1lcmFOb3RTdXBwb3J0ZWQgfHxcbiAgICAgICAgJ0NhbWVyYSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlLic7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcXVlc3QgcGVybWlzc2lvbiBmaXJzdCAobGFiZWxzIGFyZSBvbmx5IGF2YWlsYWJsZSBhZnRlciBwZXJtaXNzaW9uIGdyYW50KVxuICAgICAgY29uc3QgdGVtcFN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgdmlkZW86IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRlbXBTdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuXG4gICAgICBjb25zdCBkZXZpY2VzID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCk7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhbWVyYXMgPSBkZXZpY2VzLmZpbHRlcihcbiAgICAgICAgKGQpID0+IGQua2luZCA9PT0gJ3ZpZGVvaW5wdXQnXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5hdmFpbGFibGVDYW1lcmFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmZpbGVFcnJvciA9XG4gICAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5ub0NhbWVyYSB8fFxuICAgICAgICAgICdObyBjYW1lcmEgZGV2aWNlcyBmb3VuZC4nO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3RlZENhbWVyYUlkID0gdGhpcy5hdmFpbGFibGVDYW1lcmFzWzBdLmRldmljZUlkO1xuICAgICAgdGhpcy5jYW1lcmFBY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydENhbWVyYVN0cmVhbSh0aGlzLnNlbGVjdGVkQ2FtZXJhSWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmNhbWVyYUFjY2VzcyB8fFxuICAgICAgICAnVW5hYmxlIHRvIGFjY2VzcyBjYW1lcmEuIFBsZWFzZSBjaGVjayBwZXJtaXNzaW9ucy4nO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN3aXRjaENhbWVyYShkZXZpY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9wQ2FtZXJhU3RyZWFtKCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydENhbWVyYVN0cmVhbShkZXZpY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0Q2FtZXJhU3RyZWFtKGRldmljZUlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICB2aWRlbzogeyBkZXZpY2VJZDogeyBleGFjdDogZGV2aWNlSWQgfSB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnZpZGVvU3RyZWFtID0gc3RyZWFtO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgICBhd2FpdCB0aGlzLnZpZGVvRWxlbWVudC5uYXRpdmVFbGVtZW50LnBsYXkoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID1cbiAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5jYW1lcmFBY2Nlc3MgfHxcbiAgICAgICAgJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIGNhbWVyYS4nO1xuICAgICAgdGhpcy5jYW1lcmFBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BDYW1lcmFTdHJlYW0oKSB7XG4gICAgaWYgKHRoaXMudmlkZW9TdHJlYW0pIHtcbiAgICAgIHRoaXMudmlkZW9TdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodHJhY2spID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgICB0aGlzLnZpZGVvU3RyZWFtID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BDYW1lcmEoKSB7XG4gICAgdGhpcy5zdG9wQ2FtZXJhU3RyZWFtKCk7XG4gICAgdGhpcy5jYW1lcmFBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIGNsb3NlQ2FtZXJhKCkge1xuICAgIHRoaXMuc3RvcENhbWVyYSgpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGNhcHR1cmVDdXJyZW50UGhvdG8oKSB7XG4gICAgaWYgKCF0aGlzLnZpZGVvRWxlbWVudD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnTm8gdmlkZW8gZWxlbWVudCBhdmFpbGFibGUuJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnRleHQ/LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIC8vIEZsYXNoIGFuaW1hdGlvblxuICAgIHRoaXMudHJpZ2dlckZsYXNoKCk7XG5cbiAgICBjb25zdCBkYXRhVXJpID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuOSk7XG4gICAgY29uc3QgYmFzZTY0ID0gZGF0YVVyaS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuXG4gICAgY29uc3QgaXNGcm9udCA9IHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDE7XG4gICAgaWYgKGlzRnJvbnQpIHtcbiAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9IGJhc2U2NDtcbiAgICAgIHRoaXMucGhvdG9QcmV2aWV3RnJvbnQgPSBkYXRhVXJpO1xuICAgICAgdGhpcy5mcm9udFBob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBob3RvQmFzZTY0QmFjayA9IGJhc2U2NDtcbiAgICAgIHRoaXMucGhvdG9QcmV2aWV3QmFjayA9IGRhdGFVcmk7XG4gICAgICB0aGlzLmJhY2tQaG90b1VwbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BDYW1lcmEoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJGbGFzaCgpIHtcbiAgICB0aGlzLnNob3dGbGFzaCA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93Rmxhc2ggPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLy8gLS0tIFBob3RvIFByZXZpZXcgQWN0aW9ucyAtLS1cblxuICBjb25maXJtUGhvdG8oKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDEgJiYgIXRoaXMub2xkSWRDYXJkKSB7XG4gICAgICAvLyBNb3ZlIHRvIGJhY2sgcGhvdG8gc3RlcFxuICAgICAgdGhpcy53aXphcmRTdGVwc1sxXS5zdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgIHRoaXMud2l6YXJkU3RlcHNbMl0uc3RhdHVzID0gJ2FjdGl2ZSc7XG4gICAgICB0aGlzLmN1cnJlbnRXaXphcmRTdGVwID0gMjtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWxsIHBob3RvcyBjb2xsZWN0ZWQsIHRyaWdnZXIgdXBsb2FkXG4gICAgICB0aGlzLmNoZWNrVXBsb2FkQ29uZGl0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRDdXJyZW50UGhvdG8oKSB7XG4gICAgY29uc3QgaXNGcm9udCA9IHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDE7XG4gICAgaWYgKGlzRnJvbnQpIHtcbiAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9ICcnO1xuICAgICAgdGhpcy5waG90b1ByZXZpZXdGcm9udCA9ICcnO1xuICAgICAgdGhpcy5mcm9udFBob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBob3RvQmFzZTY0QmFjayA9ICcnO1xuICAgICAgdGhpcy5waG90b1ByZXZpZXdCYWNrID0gJyc7XG4gICAgICB0aGlzLmJhY2tQaG90b1VwbG9hZGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbGVOYW1lQmFjayA9ICcnO1xuICAgIH1cbiAgICB0aGlzLmZpbGVFcnJvciA9IG51bGw7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLy8gLS0tIFVwbG9hZCAtLS1cblxuICB1cGxvYWRQaG90bygpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jYW5SZXRyeSA9IGZhbHNlO1xuICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCBjb21tYW5kOiBTY2FuSWREdG8gPSB7XG4gICAgICBhcHBJZDogdGhpcy5wcm9wc1snYXBwSWQnXSxcbiAgICAgIGFwcERhdGFJZDogdGhpcy5wcm9wc1snYXBwRGF0YUlkJ10sXG4gICAgICBzdGVwSWQ6IHRoaXMucHJvcHNbJ3N0ZXBJZCddLFxuICAgICAgb2xkSWRDYXJkOiB0aGlzLm9sZElkQ2FyZCxcbiAgICAgIHBob3RvczogdGhpcy5vbGRJZENhcmRcbiAgICAgICAgPyBbeyBiYXNlNjQ6IHRoaXMucGhvdG9CYXNlNjRGcm9udCB9XVxuICAgICAgICA6IFtcbiAgICAgICAgICAgIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0RnJvbnQgfSxcbiAgICAgICAgICAgIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0QmFjayB9LFxuICAgICAgICAgIF0sXG4gICAgfTtcblxuICAgIHRoaXMuYXBwRGF0YVNlcnZpY2Uuc2NhbklkKGNvbW1hbmQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTY2FuIElEIHJlc3VsdDonLCByZXN1bHQpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGFwcERhdGEgPSBhd2FpdCB0aGlzLmFwcERhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2FwcERhdGFJZCddXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFwcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NDQU4tSURdIGV4dHJhY3RlZCBzdGF0dXM6Jywgc3RhdHVzKTtcblxuICAgICAgICAgIGlmIChzdGF0dXM/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludmFsaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmludmFsaWRTdGF0dXMgfHxcbiAgICAgICAgICAgICAgJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlLic7XG4gICAgICAgICAgICB0aGlzLmNhblJldHJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkU3RhdHVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNTY2FuVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwhJztcbiAgICAgICAgICB0aGlzLndpemFyZFN0ZXBzLmZvckVhY2goKHMpID0+IChzLnN0YXR1cyA9ICdjb21wbGV0ZWQnKSk7XG4gICAgICAgICAgaWYgKHRoaXMucHJvcHNbJ2V2ZW50J10pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHNbJ2V2ZW50J10oYXBwRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBzY2FuLic7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NjYW4gSUQgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYW5SZXRyeSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXRyeVVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZFBob3RvKCk7XG4gIH1cblxuICAvLyAtLS0gSGVscGVycyAtLS1cblxuICByZXNldEZvcm0ocHJlc2VydmVFcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5maWxlTmFtZUZyb250ID0gJyc7XG4gICAgdGhpcy5maWxlTmFtZUJhY2sgPSAnJztcbiAgICB0aGlzLnBob3RvQmFzZTY0RnJvbnQgPSAnJztcbiAgICB0aGlzLnBob3RvQmFzZTY0QmFjayA9ICcnO1xuICAgIHRoaXMucGhvdG9QcmV2aWV3RnJvbnQgPSAnJztcbiAgICB0aGlzLnBob3RvUHJldmlld0JhY2sgPSAnJztcbiAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXByZXNlcnZlRXJyb3IpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zdG9wQ2FtZXJhKCk7XG4gICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhblJldHJ5ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gIH1cblxuICBjaGVja1VwbG9hZENvbmRpdGlvbigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm9sZElkQ2FyZCAmJiB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCB8fFxuICAgICAgIXRoaXMub2xkSWRDYXJkICYmIHRoaXMuZnJvbnRQaG90b1VwbG9hZGVkICYmIHRoaXMuYmFja1Bob3RvVXBsb2FkZWRcbiAgICApIHtcbiAgICAgIHRoaXMudXBsb2FkUGhvdG8oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWFwcERhdGE/LmZpbGxEYXRhIHx8ICF0aGlzLnByb3BzWydzdGVwSWQnXSkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgZmlsbERhdGE6IEFwcERhdGFGaWxsO1xuICAgIHRyeSB7XG4gICAgICBmaWxsRGF0YSA9XG4gICAgICAgIHR5cGVvZiBhcHBEYXRhLmZpbGxEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gKEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSkgYXMgQXBwRGF0YUZpbGwpXG4gICAgICAgICAgOiBhcHBEYXRhLmZpbGxEYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tleHRyYWN0U3RhdHVzRnJvbUFwcERhdGFdIEpTT04gcGFyc2UgZXJyb3InLCBlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBmaWxsRGF0YS5mbHV4LmZpbmQoXG4gICAgICAoczogYW55KSA9PiBzLnN0ZXBJZCA9PT0gdGhpcy5wcm9wc1snc3RlcElkJ11cbiAgICApO1xuICAgIGlmICghc3RlcD8uc2VjdGlvbnMpIHJldHVybiBudWxsO1xuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY3RybCBvZiBzZWN0aW9uLmNvbnRyb2xzIHx8IFtdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgY3RybC5maWxsVmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgY3RybC5maWxsVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY3RybC5maWxsVmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzY2FuLWlkLWNvbnRhaW5lclwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwic2Nhbi1pZC10aXRsZVwiPnt7IHByb3BzW1wibmFtZVwiXSB9fTwvaDI+XG4gIDxwIGNsYXNzPVwic2Nhbi1pZC1kZXNjcmlwdGlvblwiPnt7IHByb3BzW1wiZGVzY3JpcHRpb25cIl0gfX08L3A+XG5cbiAgPCEtLSBTdGVwIFByb2dyZXNzIEluZGljYXRvciAtLT5cbiAgPGRpdiBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3NcIiAqbmdJZj1cIndpemFyZFN0ZXBzLmxlbmd0aCA+IDFcIiByb2xlPVwibGlzdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzdGVwLXByb2dyZXNzX19pdGVtXCIgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygd2l6YXJkU3RlcHM7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3NfX2NpcmNsZVwiXG4gICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RlcC5zdGF0dXMgPT09ICdhY3RpdmUnXCJcbiAgICAgICAgICAgW2NsYXNzLmNvbXBsZXRlZF09XCJzdGVwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCdcIlxuICAgICAgICAgICBbY2xhc3MudXBjb21pbmddPVwic3RlcC5zdGF0dXMgPT09ICd1cGNvbWluZydcIlxuICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cInN0ZXAuc3RhdHVzID09PSAnY29tcGxldGVkJ1wiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJzdGVwLnN0YXR1cyA9PT0gJ2FjdGl2ZScgPyAnc3RlcCcgOiBudWxsXCJcbiAgICAgICAgICAgKGNsaWNrKT1cInN0ZXAuc3RhdHVzID09PSAnY29tcGxldGVkJyA/IGdvVG9TdGVwKGkpIDogbnVsbFwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzdGVwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCdcIj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic3RlcC5zdGF0dXMgIT09ICdjb21wbGV0ZWQnXCI+e3sgaSArIDEgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3RlcC1wcm9ncmVzc19fbGFiZWxcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzdGVwLnN0YXR1cyA9PT0gJ2FjdGl2ZSdcIlxuICAgICAgICAgICAgW2NsYXNzLmNvbXBsZXRlZF09XCJzdGVwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCdcIj5cbiAgICAgICAge3sgc3RlcC5sYWJlbCB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3NfX2Nvbm5lY3RvclwiICpuZ0lmPVwiIWxhc3RcIlxuICAgICAgICAgICBbY2xhc3MuY29tcGxldGVkXT1cInN0ZXAuc3RhdHVzID09PSAnY29tcGxldGVkJ1wiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCAxOiBDYXJkIFR5cGUgU2VsZWN0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC10eXBlLXN0ZXBcIiAqbmdJZj1cImN1cnJlbnRXaXphcmRTdGVwID09PSAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25zXCIgcm9sZT1cInJhZGlvZ3JvdXBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXR5cGUtb3B0aW9uXCJcbiAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm9sZElkQ2FyZCA9PT0gdHJ1ZSAmJiBjYXJkVHlwZVNlbGVjdGVkXCJcbiAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhcmRUeXBlKHRydWUpXCJcbiAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0Q2FyZFR5cGUodHJ1ZSlcIlxuICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJzZWxlY3RDYXJkVHlwZSh0cnVlKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwib2xkSWRDYXJkID09PSB0cnVlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2ltYWdlLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pbWFnZXMvb3JpZ2luLWZvcm0vb2xkLWlkLWNhcmQucG5nXCIgYWx0PVwiT2xkIElEIENhcmRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2luZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2xhYmVsXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm9sZENhcmRMYWJlbCB8fCAnT2xkIElEIENhcmQnIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10eXBlLW9wdGlvbl9faGVscGVyXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm9sZENhcmRIZWxwZXIgfHwgJ1NpbmdsZS1zaWRlZCBjYXJkIC0gMSBwaG90byBuZWVkZWQnIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10eXBlLW9wdGlvblwiXG4gICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJvbGRJZENhcmQgPT09IGZhbHNlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2FyZFR5cGUoZmFsc2UpXCJcbiAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0Q2FyZFR5cGUoZmFsc2UpXCJcbiAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwic2VsZWN0Q2FyZFR5cGUoZmFsc2UpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgIHJvbGU9XCJyYWRpb1wiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJvbGRJZENhcmQgPT09IGZhbHNlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2ltYWdlLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pbWFnZXMvb3JpZ2luLWZvcm0vbmV3LWlkLWNhcmQucG5nXCIgYWx0PVwiTmV3IElEIENhcmRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2luZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2xhYmVsXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm5ld0NhcmRMYWJlbCB8fCAnTmV3IElEIENhcmQnIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10eXBlLW9wdGlvbl9faGVscGVyXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm5ld0NhcmRIZWxwZXIgfHwgJ0NhcmQgd2l0aCBmcm9udCBhbmQgYmFjayAtIDIgcGhvdG9zIG5lZWRlZCcgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcHMgMi0zOiBQaG90byBDYXB0dXJlIC8gVXBsb2FkIC0tPlxuICA8ZGl2IGNsYXNzPVwicGhvdG8tc3RlcFwiICpuZ0lmPVwiKGN1cnJlbnRXaXphcmRTdGVwID09PSAxIHx8IGN1cnJlbnRXaXphcmRTdGVwID09PSAyKSAmJiAhaXNMb2FkaW5nICYmICEoc3VjY2Vzc01lc3NhZ2UgJiYgaXNTY2FuVmFsaWQpXCI+XG5cbiAgICA8IS0tIEJhY2sgQnV0dG9uIC0tPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgKGNsaWNrKT1cImdvQmFjaygpXCI+XG4gICAgICA8bWF0LWljb24+YXJyb3dfYmFjazwvbWF0LWljb24+XG4gICAgICB7eyBjdXJyZW50V2l6YXJkU3RlcCA9PT0gMVxuICAgICAgICAgPyAocHJvcHNbJ2xhYmVscyddPy5jaGFuZ2VDYXJkVHlwZUxhYmVsIHx8ICdDaGFuZ2UgY2FyZCB0eXBlJylcbiAgICAgICAgIDogKHByb3BzWydsYWJlbHMnXT8uYmFja0xhYmVsIHx8ICdCYWNrJykgfX1cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gUGhvdG8gUHJldmlldyBNb2RlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJwaG90by1wcmV2aWV3XCIgKm5nSWY9XCJjdXJyZW50UGhvdG9QcmV2aWV3ICYmICFjYW1lcmFBY3RpdmVcIj5cbiAgICAgIDxwIGNsYXNzPVwicGhvdG8tcHJldmlld19fbGFiZWxcIj57eyBjdXJyZW50U3RlcFNob3J0TGFiZWwgfX08L3A+XG4gICAgICA8aW1nIGNsYXNzPVwicGhvdG8tcHJldmlld19faW1hZ2VcIiBbc3JjXT1cImN1cnJlbnRQaG90b1ByZXZpZXdcIiBbYWx0XT1cImN1cnJlbnRTdGVwU2hvcnRMYWJlbFwiIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwicGhvdG8tcHJldmlld19fYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwicmVzZXRDdXJyZW50UGhvdG8oKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/LnJldGFrZUxhYmVsIHx8ICdSZXRha2UnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY29uZmlybVBob3RvKClcIj5cbiAgICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8udXNlUGhvdG9MYWJlbCB8fCAnVXNlIFRoaXMgUGhvdG8nIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhcHR1cmUgTW9kZSAobm8gcGhvdG8geWV0KSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwicGhvdG8tY2FwdHVyZVwiICpuZ0lmPVwiIWN1cnJlbnRQaG90b1ByZXZpZXcgJiYgIWNhbWVyYUFjdGl2ZVwiPlxuICAgICAgPHAgY2xhc3M9XCJwaG90by1jYXB0dXJlX19sYWJlbFwiPnt7IGN1cnJlbnRTdGVwTGFiZWwgfX08L3A+XG5cbiAgICAgIDwhLS0gRHJvcCBab25lIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBob3RvLWNhcHR1cmVfX2Ryb3B6b25lXCJcbiAgICAgICAgICAgW2NsYXNzLmRyYWdvdmVyXT1cImlzRHJhZ092ZXJcIlxuICAgICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxuICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRHJvcCB6b25lIGZvciAnICsgY3VycmVudFN0ZXBTaG9ydExhYmVsICsgJyB1cGxvYWQnXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRyb3B6b25lLWljb25cIj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICA8cCBjbGFzcz1cImRyb3B6b25lLXRleHRcIj5cbiAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/LmRyYWdEcm9wUHJvbXB0IHx8ICdEcmFnICYgZHJvcCB5b3VyIHBob3RvIGhlcmUsIG9yIHVzZSB0aGUgYnV0dG9ucyBiZWxvdycgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImRyb3B6b25lLWZvcm1hdHNcIj5cbiAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/LmZvcm1hdHNMYWJlbCB8fCAnQWNjZXB0ZWQnIH19OiB7eyB2YWxpZEZvcm1hdHMuam9pbignLCAnKSB9fSAmbWlkZG90O1xuICAgICAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8ubWF4U2l6ZUxhYmVsIHx8ICdNYXgnIH19OiB7eyBtYXhGaWxlU2l6ZUtCIH19S0JcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGhvdG8tY2FwdHVyZV9fYWN0aW9uc1wiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0IChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiIGhpZGRlbiBbYWNjZXB0XT1cInZhbGlkRm9ybWF0cy5qb2luKCcsJylcIiAvPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIiBjbGFzcz1cImFjdGlvbi1idG5cIj5cbiAgICAgICAgICA8bWF0LWljb24+dXBsb2FkX2ZpbGU8L21hdC1pY29uPlxuICAgICAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8udXBsb2FkRmlsZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVXBsb2FkIEZpbGUnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib3BlbkNhbWVyYSgpXCIgY2xhc3M9XCJhY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInByb3BzWydjb25maWcnXS5zaG93VGFrZVBpY3R1cmVCdXR0b24gIT09IGZhbHNlXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgICAge3sgcHJvcHNbJ2xhYmVscyddPy50YWtlUGljdHVyZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVGFrZSBQaG90bycgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2FtZXJhIFZpZXdmaW5kZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhbWVyYS1jb250YWluZXJcIiAqbmdJZj1cImNhbWVyYUFjdGl2ZVwiPlxuICAgICAgPCEtLSBDYW1lcmEgc2VsZWN0b3IgLS0+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJhdmFpbGFibGVDYW1lcmFzLmxlbmd0aCA+IDFcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiY2FtZXJhLXNlbGVjdG9yXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+e3sgcHJvcHNbJ2xhYmVscyddPy5zZWxlY3RDYW1lcmFMYWJlbCB8fCAnU2VsZWN0IGNhbWVyYScgfX08L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwic2VsZWN0ZWRDYW1lcmFJZFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwic3dpdGNoQ2FtZXJhKCRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY2FtIG9mIGF2YWlsYWJsZUNhbWVyYXM7IGxldCBpID0gaW5kZXhcIiBbdmFsdWVdPVwiY2FtLmRldmljZUlkXCI+XG4gICAgICAgICAgICB7eyBjYW0ubGFiZWwgfHwgJ0NhbWVyYSAnICsgKGkgKyAxKSB9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPGRpdiBjbGFzcz1cImNhbWVyYS12aWV3ZmluZGVyXCI+XG4gICAgICAgIDx2aWRlbyAjdmlkZW9FbGVtZW50IGF1dG9wbGF5IHBsYXlzaW5saW5lIGNsYXNzPVwiY2FtZXJhLXZpZGVvXCI+PC92aWRlbz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbWVyYS1mbGFzaC1vdmVybGF5XCIgW2NsYXNzLmZsYXNoXT1cInNob3dGbGFzaFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYW1lcmEtY29udHJvbHNcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImNsb3NlQ2FtZXJhKClcIiBjbGFzcz1cImNhbWVyYS1jYW5jZWwtYnRuXCI+XG4gICAgICAgICAge3sgcHJvcHNbJ2xhYmVscyddPy5jYW5jZWxMYWJlbCB8fCAnQ2FuY2VsJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtZmFiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjYXB0dXJlQ3VycmVudFBob3RvKClcIiBjbGFzcz1cImNhbWVyYS1jYXB0dXJlLWJ0blwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ2FwdHVyZSAnICsgY3VycmVudFN0ZXBTaG9ydExhYmVsXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FtZXJhLXNwYWNlclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVycm9yIERpc3BsYXkgLS0+XG4gICAgPGRpdiBjbGFzcz1cInBob3RvLXN0ZXBfX2Vycm9yXCIgKm5nSWY9XCJmaWxlRXJyb3JcIiByb2xlPVwiYWxlcnRcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgIDxtYXQtaWNvbj5lcnJvcl9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPnt7IGZpbGVFcnJvciB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uICpuZ0lmPVwiY2FuUmV0cnlcIiAoY2xpY2spPVwicmV0cnlVcGxvYWQoKVwiIGNsYXNzPVwicmV0cnktYnRuXCI+XG4gICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAge3sgcHJvcHNbJ2xhYmVscyddPy5yZXRyeUxhYmVsIHx8ICdUcnkgQWdhaW4nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb2FkaW5nIC8gUHJvY2Vzc2luZyBTdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cInByb2Nlc3Npbmctb3ZlcmxheVwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgPHAgY2xhc3M9XCJwcm9jZXNzaW5nLXRleHRcIj5cbiAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8ucHJvY2Vzc2luZ01lc3NhZ2UgfHwgJ1Byb2Nlc3NpbmcgeW91ciBJRCBzY2FuLi4uJyB9fVxuICAgIDwvcD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdWNjZXNzIFN0YXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwic2Nhbi1zdWNjZXNzXCIgKm5nSWY9XCJzdWNjZXNzTWVzc2FnZSAmJiBpc1NjYW5WYWxpZFwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJzY2FuLXN1Y2Nlc3NfX2ljb25cIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgIDxoMyBjbGFzcz1cInNjYW4tc3VjY2Vzc19fdGl0bGVcIj5cbiAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8uc3VjY2Vzc1RpdGxlIHx8ICdJRCBzY2FuIHN1Y2Nlc3NmdWwnIH19XG4gICAgPC9oMz5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==