fx-form-builder-wrapper 2.0.4 → 2.0.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.
@@ -3,7 +3,7 @@ import { HttpClient } from '@angular/common/http';
3
3
  import { Component, inject } from '@angular/core';
4
4
  import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
5
  import { FxBaseComponent, FxComponent, FxSelectSetting, FxStringSetting, FxValidatorService } from '@instantsys-labs/fx';
6
- import { forkJoin, map, Subject, takeUntil } from 'rxjs';
6
+ import { Subject, takeUntil } from 'rxjs';
7
7
  import { v4 as uuidv4 } from 'uuid';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "../../fx-builder-wrapper.service";
@@ -19,6 +19,12 @@ export class UploaderComponent extends FxBaseComponent {
19
19
  uploadedFiles: [],
20
20
  deletedFiles: []
21
21
  };
22
+ categories = [
23
+ 'Oral Images',
24
+ 'Past Docs',
25
+ 'X-Rays',
26
+ 'Profile',
27
+ ];
22
28
  destroy$ = new Subject();
23
29
  http = inject(HttpClient);
24
30
  constructor(cdr, fxBuilderWrapperService) {
@@ -114,67 +120,68 @@ export class UploaderComponent extends FxBaseComponent {
114
120
  // }
115
121
  // });
116
122
  // }
117
- ngOnInit() {
118
- this.fxBuilderWrapperService.variables$
119
- .pipe(takeUntil(this.destroy$))
120
- .subscribe((variables) => {
121
- if (!variables)
122
- return;
123
- const uploadedFilesMap = {};
124
- // Extract uploader keys and their corresponding URL arrays
125
- for (const [key, value] of Object.entries(variables)) {
126
- if (key.includes('uploader') && Array.isArray(value)) {
127
- uploadedFilesMap[key] = value;
128
- }
129
- }
130
- for (const [uploaderKey, urls] of Object.entries(uploadedFilesMap)) {
131
- // const imageFetches: Observable<{ result: string; originalUrl: any; title:string ; notes:string }>[] = [];
132
- // urls.forEach((originalUrl:any) => {
133
- // if (originalUrl) {
134
- // const image$ = this.http.get(originalUrl?.originalUrl, { responseType: 'blob' }).pipe(
135
- // map((blob: Blob) => ({
136
- // result: URL.createObjectURL(blob), // for preview
137
- // originalUrl: originalUrl?.originalUrl // preserve original
138
- // }))
139
- // );
140
- // imageFetches.push(image$);
141
- // }
142
- // });
143
- const imageFetches = [];
144
- urls.forEach((originalUrl) => {
145
- if (originalUrl) {
146
- const image$ = this.http.get(originalUrl?.originalUrl, { responseType: 'blob' }).pipe(map((blob) => ({
147
- result: URL.createObjectURL(blob), // for preview
148
- originalUrl: originalUrl?.originalUrl, // preserve original
149
- title: originalUrl?.title || '', // default empty if not present
150
- notes: originalUrl?.notes || ''
151
- })));
152
- imageFetches.push(image$);
153
- }
154
- });
155
- if (imageFetches.length > 0) {
156
- forkJoin(imageFetches).subscribe({
157
- next: (imageData) => {
158
- const formatted = imageData.map(item => ({
159
- id: uuidv4(),
160
- file: null,
161
- originalUrl: item.originalUrl,
162
- result: item.result,
163
- title: item.title,
164
- notes: ''
165
- }));
166
- this.uploadedFiles = [...this.uploadedFiles, ...formatted];
167
- this.formattedData.uploadedFiles = this.uploadedFiles;
168
- this.uploadFileControl.setValue(this.formattedData);
169
- },
170
- error: (err) => {
171
- console.error(`Failed to fetch images for ${uploaderKey}:`, err);
172
- }
173
- });
174
- }
175
- }
176
- });
177
- }
123
+ // ngOnInit(): void {
124
+ // this.fxBuilderWrapperService.variables$
125
+ // .pipe(takeUntil(this.destroy$))
126
+ // .subscribe((variables: any) => {
127
+ // if (!variables) return;
128
+ // const uploadedFilesMap: { [key: string]: string[] } = {};
129
+ // // Extract uploader keys and their corresponding URL arrays
130
+ // for (const [key, value] of Object.entries(variables)) {
131
+ // if (key.includes('uploader') && Array.isArray(value)) {
132
+ // uploadedFilesMap[key] = value;
133
+ // }
134
+ // }
135
+ // for (const [uploaderKey, urls] of Object.entries(uploadedFilesMap)) {
136
+ // // const imageFetches: Observable<{ result: string; originalUrl: any; title:string ; notes:string }>[] = [];
137
+ // // urls.forEach((originalUrl:any) => {
138
+ // // if (originalUrl) {
139
+ // // const image$ = this.http.get(originalUrl?.originalUrl, { responseType: 'blob' }).pipe(
140
+ // // map((blob: Blob) => ({
141
+ // // result: URL.createObjectURL(blob), // for preview
142
+ // // originalUrl: originalUrl?.originalUrl // preserve original
143
+ // // }))
144
+ // // );
145
+ // // imageFetches.push(image$);
146
+ // // }
147
+ // // });
148
+ // const imageFetches: Observable<{ result: string; originalUrl: any; title: string; notes: string }>[] = [];
149
+ // urls.forEach((originalUrl: any) => {
150
+ // if (originalUrl) {
151
+ // const image$ = this.http.get(originalUrl?.originalUrl, { responseType: 'blob' }).pipe(
152
+ // map((blob: Blob) => ({
153
+ // result: URL.createObjectURL(blob), // for preview
154
+ // originalUrl: originalUrl?.originalUrl, // preserve original
155
+ // title: originalUrl?.title || '', // default empty if not present
156
+ // notes: originalUrl?.notes || ''
157
+ // }))
158
+ // );
159
+ // imageFetches.push(image$);
160
+ // }
161
+ // });
162
+ // if (imageFetches.length > 0) {
163
+ // forkJoin(imageFetches).subscribe({
164
+ // next: (imageData) => {
165
+ // const formatted = imageData.map(item => ({
166
+ // id: uuidv4(),
167
+ // file: null,
168
+ // originalUrl: item.originalUrl,
169
+ // result: item.result,
170
+ // title: item.title,
171
+ // notes: ''
172
+ // }));
173
+ // this.uploadedFiles = [...this.uploadedFiles, ...formatted];
174
+ // this.formattedData.uploadedFiles = this.uploadedFiles;
175
+ // this.uploadFileControl.setValue(this.formattedData);
176
+ // },
177
+ // error: (err) => {
178
+ // console.error(`Failed to fetch images for ${uploaderKey}:`, err);
179
+ // }
180
+ // });
181
+ // }
182
+ // }
183
+ // });
184
+ // }
178
185
  // ngOnInit(): void {
179
186
  // this.fxBuilderWrapperService.variables$
180
187
  // .pipe(takeUntil(this.destroy$))
@@ -236,29 +243,147 @@ export class UploaderComponent extends FxBaseComponent {
236
243
  // }
237
244
  // }
238
245
  // }
246
+ // onFileSelected(event: Event) {
247
+ // const input = event.target as HTMLInputElement;
248
+ // if (input.files) {
249
+ // for (let i = 0; i < input.files.length; i++) {
250
+ // const file = input.files[i];
251
+ // const reader = new FileReader();
252
+ // reader.onload = e => {
253
+ // const newFile = {
254
+ // id: uuidv4(),
255
+ // file: file,
256
+ // originalUrl: null,
257
+ // result: e.target?.result,
258
+ // name: file.name,
259
+ // title: '',
260
+ // notes: '',
261
+ // category: '',
262
+ // type: this.detectFileType(file),
263
+ // };
264
+ // this.uploadedFiles.push(newFile);
265
+ // this.formattedData.uploadedFiles = this.uploadedFiles;
266
+ // this.uploadFileControl.setValue(this.formattedData);
267
+ // };
268
+ // reader.readAsDataURL(file);
269
+ // }
270
+ // }
271
+ // }
272
+ // ngOnInit(): void {
273
+ // this.fxBuilderWrapperService.variables$
274
+ // .pipe(takeUntil(this.destroy$))
275
+ // .subscribe((variables: any) => {
276
+ // if (!variables) return;
277
+ // const uploadedFilesMap: { [key: string]: any[] } = {};
278
+ // for (const [key, value] of Object.entries(variables)) {
279
+ // if (key.includes('uploader') && Array.isArray(value)) {
280
+ // uploadedFilesMap[key] = value;
281
+ // }
282
+ // }
283
+ // for (const [uploaderKey, urls] of Object.entries(uploadedFilesMap)) {
284
+ // const formatted = urls
285
+ // .filter((fileObj: any) => !!fileObj)
286
+ // .map((fileObj: any) => {
287
+ // // const fileType = this.detectFileTypeFromUrl(fileObj?.originalUrl || fileObj?.name);
288
+ // return {
289
+ // id: uuidv4(),
290
+ // file: null,
291
+ // originalUrl: fileObj.originalUrl,
292
+ // result: fileObj?.type === 'image' ? fileObj.originalUrl.previewUrl : null,
293
+ // name: fileObj?.name || '',
294
+ // title: fileObj?.title || '',
295
+ // notes: fileObj?.notes || '',
296
+ // category: fileObj?.category || '',
297
+ // type: fileObj?.type,
298
+ // };
299
+ // });
300
+ // if (formatted.length > 0) {
301
+ // this.uploadedFiles = [...this.uploadedFiles, ...formatted];
302
+ // this.formattedData.uploadedFiles = this.uploadedFiles;
303
+ // this.uploadFileControl.setValue(this.formattedData);
304
+ // }
305
+ // }
306
+ // });
307
+ // }
308
+ ngOnInit() {
309
+ this.fxBuilderWrapperService.variables$
310
+ .pipe(takeUntil(this.destroy$))
311
+ .subscribe((variables) => {
312
+ if (!variables)
313
+ return;
314
+ const uploadedFilesMap = {};
315
+ for (const [key, value] of Object.entries(variables)) {
316
+ if (key.includes('uploader') && value?.uploadedFiles) {
317
+ uploadedFilesMap[key] = value.uploadedFiles;
318
+ }
319
+ }
320
+ for (const [uploaderKey, files] of Object.entries(uploadedFilesMap)) {
321
+ const formatted = files
322
+ .filter((fileObj) => !!fileObj)
323
+ .map((fileObj) => {
324
+ const originalUrlObj = fileObj.originalUrl;
325
+ const fileName = originalUrlObj?.fileName || '';
326
+ const fileUrl = originalUrlObj?.fileUrl || '';
327
+ const previewUrl = originalUrlObj?.previewUrl;
328
+ const type = fileObj?.type;
329
+ // detect type based on file extension
330
+ // const fileType = this.detectFileTypeFromUrl(fileName || fileUrl);
331
+ return {
332
+ id: uuidv4(),
333
+ file: null, // nothing local
334
+ originalUrl: originalUrlObj, // keep whole object
335
+ result: type === 'image'
336
+ ? (previewUrl) // prefer previewUrl, fallback to fileUrl
337
+ : null,
338
+ name: fileName,
339
+ title: fileObj?.title || '',
340
+ notes: fileObj?.notes || '',
341
+ category: fileObj?.category || '',
342
+ type: type, // computed type
343
+ };
344
+ });
345
+ if (formatted.length > 0) {
346
+ this.uploadedFiles = [...this.uploadedFiles, ...formatted];
347
+ this.formattedData.uploadedFiles = this.uploadedFiles;
348
+ this.uploadFileControl.setValue(this.formattedData);
349
+ }
350
+ }
351
+ });
352
+ }
239
353
  onFileSelected(event) {
240
354
  const input = event.target;
241
- if (input.files) {
242
- for (let i = 0; i < input.files.length; i++) {
243
- const file = input.files[i];
355
+ if (!input.files)
356
+ return;
357
+ Array.from(input.files).forEach(file => {
358
+ const fileType = this.detectFileType(file);
359
+ const newFile = {
360
+ id: uuidv4(),
361
+ file: file,
362
+ originalUrl: null,
363
+ result: null, // will be filled for images only
364
+ name: file.name,
365
+ title: '',
366
+ notes: '',
367
+ category: '',
368
+ type: fileType, // <-- keep detected type
369
+ };
370
+ if (fileType === 'image') {
244
371
  const reader = new FileReader();
245
372
  reader.onload = e => {
246
- const newFile = {
247
- id: uuidv4(),
248
- file: file,
249
- originalUrl: null,
250
- result: e.target?.result,
251
- name: file.name,
252
- title: '',
253
- notes: ''
254
- };
373
+ newFile.result = e.target?.result;
255
374
  this.uploadedFiles.push(newFile);
256
375
  this.formattedData.uploadedFiles = this.uploadedFiles;
257
376
  this.uploadFileControl.setValue(this.formattedData);
258
377
  };
259
- reader.readAsDataURL(file);
378
+ reader.readAsDataURL(file); // only images need preview
379
+ }
380
+ else {
381
+ // non-image → push directly
382
+ this.uploadedFiles.push(newFile);
383
+ this.formattedData.uploadedFiles = this.uploadedFiles;
384
+ this.uploadFileControl.setValue(this.formattedData);
260
385
  }
261
- }
386
+ });
262
387
  }
263
388
  onMetaChange() {
264
389
  this.formattedData.uploadedFiles = this.uploadedFiles;
@@ -307,11 +432,22 @@ export class UploaderComponent extends FxBaseComponent {
307
432
  validations() {
308
433
  return [FxValidatorService.required];
309
434
  }
435
+ detectFileType(file) {
436
+ const mime = (file.type || '').toLowerCase();
437
+ const name = (file.name || '').toLowerCase();
438
+ if (mime.startsWith('image/') || /\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(name))
439
+ return 'image';
440
+ if (mime === 'text/csv' || name.endsWith('.csv'))
441
+ return 'csv';
442
+ if (mime.startsWith('text/') || /\.(txt|md|rtf|log|json|xml|yaml|yml)$/i.test(name))
443
+ return 'text';
444
+ return 'other';
445
+ }
310
446
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploaderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FxBuilderWrapperService }], target: i0.ɵɵFactoryTarget.Component });
311
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UploaderComponent, isStandalone: true, selector: "fx-uploader", usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload flex flex-row items-center gap-2 p-2 pb-0 rounded-sm\">\r\n <div class=\"flex flex-col justify-center items-center\" (click)=\"fileInput.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"fileInput.click()\" class=\"text-base cursor-pointer\">\r\n {{ setting('upload-text') }}\r\n </a>\r\n </div>\r\n <input #fileInput type=\"file\" [multiple]=\"setting('multiple-upload')\" (change)=\"onFileSelected($event)\" hidden />\r\n <div class=\"separator\"></div>\r\n <div class=\"file-list flex items-center gap-4 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\"\r\n class=\"flex flex-col items-center justify-center\">\r\n <div class=\"relative\">\r\n <div class=\"close_icon cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\" width=\"24\"\r\n height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <img class=\"file-thumbnail\" style=\"border-radius: 4px\" [src]=\"file?.result\" alt=\"\" />\r\n <div class=\"flex flex-col w-full\">\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n \r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n </div>\r\n \r\n\r\n </div>\r\n\r\n <p>{{file?.name}}</p>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</fx-component>", styles: [".custom-upload{border:1px solid #ccc}.custom-upload a{color:#000}.custom-upload .file-list .file-thumbnail{width:120px;height:auto;border:1px solid #ccc;background-color:#fff;padding:4px}.custom-upload .separator{height:56px;width:2px;background-color:#ccc;margin:10px}.close_icon{position:absolute;top:-8px;right:-8px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: FxComponent, selector: "fx-component", inputs: ["fxData"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
447
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UploaderComponent, isStandalone: true, selector: "fx-uploader", usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload flex flex-row items-center gap-2 p-2 pb-0 rounded-sm\">\r\n <div class=\"flex flex-col justify-center items-center\" (click)=\"fileInput.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"fileInput.click()\" class=\"text-base cursor-pointer\">\r\n {{ setting('upload-text') }}\r\n </a>\r\n </div>\r\n <!-- <input #fileInput type=\"file\" [multiple]=\"setting('multiple-upload')\" (change)=\"onFileSelected($event)\" hidden />\r\n <div class=\"separator\"></div>\r\n <div class=\"file-list flex items-center gap-4 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\" \r\n class=\"flex flex-col items-center justify-center\" (click)=\"deleteFile(i)\">\r\n <div class=\"relative\">\r\n <div class=\"close_icon cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\" width=\"24\"\r\n height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <img class=\"file-thumbnail\" style=\"border-radius: 4px\" [src]=\"file?.result\" alt=\"\" />\r\n <div class=\"flex flex-col w-full\">\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n \r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n </div>\r\n \r\n\r\n </div>\r\n\r\n <p>{{file?.name}}</p>\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <input #fileInput\r\n type=\"file\"\r\n [multiple]=\"setting('multiple-upload')\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden />\r\n\r\n<div class=\"separator\"></div>\r\n\r\n<div class=\"file-list flex items-center gap-6 flex-wrap\" *ngIf=\"false\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\"\r\n class=\"flex flex-col items-center justify-center\">\r\n\r\n <div class=\"relative p-3 border rounded-lg shadow-sm bg-white w-64\">\r\n <!-- Close icon -->\r\n <div class=\"close_icon cursor-pointer absolute top-2 right-2\" (click)=\"deleteFile(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <path d=\"M8.2 9l-2.4-2.4.8-.8L9 8.2l2.4-2.4.8.8L9.8 9l2.4 2.4-.8.8L9 9.8l-2.4 2.4-.8-.8L8.2 9z\"\r\n fill=\"white\"/>\r\n </svg>\r\n </div>\r\n\r\n <!-- Thumbnail -->\r\n <ng-container *ngIf=\"file.type === 'image'; else nonImageThumb\">\r\n <img class=\"file-thumbnail w-full h-32 object-cover rounded mb-3\"\r\n [src]=\"file?.result\"\r\n alt=\"preview\" />\r\n </ng-container>\r\n\r\n <ng-template #nonImageThumb>\r\n <div class=\"file-thumbnail flex items-center justify-center border rounded mb-3 w-full h-32 bg-gray-50\">\r\n <ng-container [ngSwitch]=\"file.type\">\r\n <!-- CSV -->\r\n <svg *ngSwitchCase=\"'csv'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <text x=\"14\" y=\"34\" font-size=\"10\" font-family=\"monospace\" fill=\"#22c55e\">CSV</text>\r\n </svg>\r\n\r\n <!-- TEXT -->\r\n <svg *ngSwitchCase=\"'text'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M14 24h20M14 29h20M14 34h12\" stroke=\"#3b82f6\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n\r\n <!-- Generic -->\r\n <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M16 30h16\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Metadata -->\r\n <div class=\"flex flex-col w-full\">\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n\r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n\r\n <label class=\"font-semibold text-sm mt-3 mb-1\">Category</label>\r\n <select [(ngModel)]=\"file.category\"\r\n name=\"category{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Select Category\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\">\r\n <option *ngFor=\"let c of categories\" [ngValue]=\"c\">{{ c }}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <p class=\"mt-2 text-sm text-gray-600\">{{ file?.name }}</p>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n<div class=\"file-list flex items-center gap-8 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\"\r\n class=\"relative p-3 border rounded-lg shadow-sm bg-white w-[500px] flex\">\r\n\r\n <!-- Close icon -->\r\n <div class=\"close_icon cursor-pointer absolute top-2 right-2\" (click)=\"deleteFile(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <path d=\"M8.2 9l-2.4-2.4.8-.8L9 8.2l2.4-2.4.8.8L9.8 9l2.4 2.4-.8.8L9 9.8l-2.4 2.4-.8-.8L8.2 9z\"\r\n fill=\"white\"/>\r\n </svg>\r\n </div>\r\n\r\n <!-- Thumbnail on left -->\r\n <div class=\"w-28 h-28 flex-shrink-0\">\r\n <ng-container *ngIf=\"file.type === 'image'; else nonImageThumb\">\r\n <img class=\"file-thumbnail w-full h-full object-cover rounded\"\r\n [src]=\"file?.result\"\r\n alt=\"preview\" />\r\n </ng-container>\r\n\r\n <ng-template #nonImageThumb>\r\n <div class=\"file-thumbnail flex items-center justify-center border rounded w-full h-full bg-gray-50\">\r\n <ng-container [ngSwitch]=\"file.type\">\r\n <!-- CSV -->\r\n <svg *ngSwitchCase=\"'csv'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <text x=\"14\" y=\"34\" font-size=\"10\" font-family=\"monospace\" fill=\"#22c55e\">CSV</text>\r\n </svg>\r\n <!-- TEXT -->\r\n <svg *ngSwitchCase=\"'text'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M14 24h20M14 29h20M14 34h12\" stroke=\"#3b82f6\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <!-- Generic -->\r\n <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M16 30h16\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Metadata on right -->\r\n <div class=\"flex flex-col flex-1 ml-4\">\r\n <!-- Title -->\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n\r\n <!-- Notes -->\r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n\r\n <!-- Category -->\r\n <label class=\"font-semibold text-sm mb-1\">Category</label>\r\n <select [(ngModel)]=\"file.category\"\r\n name=\"category{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\">\r\n <option value=\"\">Select Category</option>\r\n <option *ngFor=\"let c of categories\" [ngValue]=\"c\">{{ c }}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n\r\n\r\n </div>\r\n</fx-component>", styles: [".custom-upload{border:1px solid #ccc}.custom-upload a{color:#000}.custom-upload .file-list .file-thumbnail{width:234px;height:234px;border:1px solid #ccc;background-color:#fff;padding:4px}.custom-upload .separator{height:56px;width:2px;background-color:#ccc;margin:10px}.close_icon{position:absolute;top:-8px;right:-8px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}.gap-8{gap:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
312
448
  }
313
449
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploaderComponent, decorators: [{
314
450
  type: Component,
315
- args: [{ selector: 'fx-uploader', standalone: true, imports: [CommonModule, FxComponent, FormsModule, ReactiveFormsModule], template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload flex flex-row items-center gap-2 p-2 pb-0 rounded-sm\">\r\n <div class=\"flex flex-col justify-center items-center\" (click)=\"fileInput.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"fileInput.click()\" class=\"text-base cursor-pointer\">\r\n {{ setting('upload-text') }}\r\n </a>\r\n </div>\r\n <input #fileInput type=\"file\" [multiple]=\"setting('multiple-upload')\" (change)=\"onFileSelected($event)\" hidden />\r\n <div class=\"separator\"></div>\r\n <div class=\"file-list flex items-center gap-4 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\"\r\n class=\"flex flex-col items-center justify-center\">\r\n <div class=\"relative\">\r\n <div class=\"close_icon cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\" width=\"24\"\r\n height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <img class=\"file-thumbnail\" style=\"border-radius: 4px\" [src]=\"file?.result\" alt=\"\" />\r\n <div class=\"flex flex-col w-full\">\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n \r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n </div>\r\n \r\n\r\n </div>\r\n\r\n <p>{{file?.name}}</p>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</fx-component>", styles: [".custom-upload{border:1px solid #ccc}.custom-upload a{color:#000}.custom-upload .file-list .file-thumbnail{width:120px;height:auto;border:1px solid #ccc;background-color:#fff;padding:4px}.custom-upload .separator{height:56px;width:2px;background-color:#ccc;margin:10px}.close_icon{position:absolute;top:-8px;right:-8px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}\n"] }]
451
+ args: [{ selector: 'fx-uploader', standalone: true, imports: [CommonModule, FxComponent, FormsModule, ReactiveFormsModule], template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload flex flex-row items-center gap-2 p-2 pb-0 rounded-sm\">\r\n <div class=\"flex flex-col justify-center items-center\" (click)=\"fileInput.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"fileInput.click()\" class=\"text-base cursor-pointer\">\r\n {{ setting('upload-text') }}\r\n </a>\r\n </div>\r\n <!-- <input #fileInput type=\"file\" [multiple]=\"setting('multiple-upload')\" (change)=\"onFileSelected($event)\" hidden />\r\n <div class=\"separator\"></div>\r\n <div class=\"file-list flex items-center gap-4 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\" \r\n class=\"flex flex-col items-center justify-center\" (click)=\"deleteFile(i)\">\r\n <div class=\"relative\">\r\n <div class=\"close_icon cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\" width=\"24\"\r\n height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <img class=\"file-thumbnail\" style=\"border-radius: 4px\" [src]=\"file?.result\" alt=\"\" />\r\n <div class=\"flex flex-col w-full\">\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n \r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n </div>\r\n \r\n\r\n </div>\r\n\r\n <p>{{file?.name}}</p>\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n\r\n <input #fileInput\r\n type=\"file\"\r\n [multiple]=\"setting('multiple-upload')\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden />\r\n\r\n<div class=\"separator\"></div>\r\n\r\n<div class=\"file-list flex items-center gap-6 flex-wrap\" *ngIf=\"false\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\"\r\n class=\"flex flex-col items-center justify-center\">\r\n\r\n <div class=\"relative p-3 border rounded-lg shadow-sm bg-white w-64\">\r\n <!-- Close icon -->\r\n <div class=\"close_icon cursor-pointer absolute top-2 right-2\" (click)=\"deleteFile(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <path d=\"M8.2 9l-2.4-2.4.8-.8L9 8.2l2.4-2.4.8.8L9.8 9l2.4 2.4-.8.8L9 9.8l-2.4 2.4-.8-.8L8.2 9z\"\r\n fill=\"white\"/>\r\n </svg>\r\n </div>\r\n\r\n <!-- Thumbnail -->\r\n <ng-container *ngIf=\"file.type === 'image'; else nonImageThumb\">\r\n <img class=\"file-thumbnail w-full h-32 object-cover rounded mb-3\"\r\n [src]=\"file?.result\"\r\n alt=\"preview\" />\r\n </ng-container>\r\n\r\n <ng-template #nonImageThumb>\r\n <div class=\"file-thumbnail flex items-center justify-center border rounded mb-3 w-full h-32 bg-gray-50\">\r\n <ng-container [ngSwitch]=\"file.type\">\r\n <!-- CSV -->\r\n <svg *ngSwitchCase=\"'csv'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <text x=\"14\" y=\"34\" font-size=\"10\" font-family=\"monospace\" fill=\"#22c55e\">CSV</text>\r\n </svg>\r\n\r\n <!-- TEXT -->\r\n <svg *ngSwitchCase=\"'text'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M14 24h20M14 29h20M14 34h12\" stroke=\"#3b82f6\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n\r\n <!-- Generic -->\r\n <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M16 30h16\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Metadata -->\r\n <div class=\"flex flex-col w-full\">\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n\r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n\r\n <label class=\"font-semibold text-sm mt-3 mb-1\">Category</label>\r\n <select [(ngModel)]=\"file.category\"\r\n name=\"category{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Select Category\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\">\r\n <option *ngFor=\"let c of categories\" [ngValue]=\"c\">{{ c }}</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <p class=\"mt-2 text-sm text-gray-600\">{{ file?.name }}</p>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n<div class=\"file-list flex items-center gap-8 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\"\r\n class=\"relative p-3 border rounded-lg shadow-sm bg-white w-[500px] flex\">\r\n\r\n <!-- Close icon -->\r\n <div class=\"close_icon cursor-pointer absolute top-2 right-2\" (click)=\"deleteFile(i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <path d=\"M8.2 9l-2.4-2.4.8-.8L9 8.2l2.4-2.4.8.8L9.8 9l2.4 2.4-.8.8L9 9.8l-2.4 2.4-.8-.8L8.2 9z\"\r\n fill=\"white\"/>\r\n </svg>\r\n </div>\r\n\r\n <!-- Thumbnail on left -->\r\n <div class=\"w-28 h-28 flex-shrink-0\">\r\n <ng-container *ngIf=\"file.type === 'image'; else nonImageThumb\">\r\n <img class=\"file-thumbnail w-full h-full object-cover rounded\"\r\n [src]=\"file?.result\"\r\n alt=\"preview\" />\r\n </ng-container>\r\n\r\n <ng-template #nonImageThumb>\r\n <div class=\"file-thumbnail flex items-center justify-center border rounded w-full h-full bg-gray-50\">\r\n <ng-container [ngSwitch]=\"file.type\">\r\n <!-- CSV -->\r\n <svg *ngSwitchCase=\"'csv'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#22c55e\" stroke-width=\"2\"/>\r\n <text x=\"14\" y=\"34\" font-size=\"10\" font-family=\"monospace\" fill=\"#22c55e\">CSV</text>\r\n </svg>\r\n <!-- TEXT -->\r\n <svg *ngSwitchCase=\"'text'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#3b82f6\" stroke-width=\"2\"/>\r\n <path d=\"M14 24h20M14 29h20M14 34h12\" stroke=\"#3b82f6\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <!-- Generic -->\r\n <svg *ngSwitchDefault xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\r\n <rect x=\"8\" y=\"6\" width=\"28\" height=\"36\" rx=\"3\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M28 6v8a2 2 0 0 0 2 2h6\" stroke=\"#9ca3af\" stroke-width=\"2\"/>\r\n <path d=\"M16 30h16\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Metadata on right -->\r\n <div class=\"flex flex-col flex-1 ml-4\">\r\n <!-- Title -->\r\n <label class=\"font-semibold text-sm mb-1\">Title</label>\r\n <input [(ngModel)]=\"file.title\"\r\n name=\"title{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter title\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\" />\r\n\r\n <!-- Notes -->\r\n <label class=\"font-semibold text-sm mb-1\">Notes</label>\r\n <textarea [(ngModel)]=\"file.notes\"\r\n name=\"notes{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n placeholder=\"Enter notes\"\r\n class=\"border border-orange-300 rounded px-3 py-2 mb-3 w-full outline-none focus:ring focus:ring-orange-200\"\r\n rows=\"2\"></textarea>\r\n\r\n <!-- Category -->\r\n <label class=\"font-semibold text-sm mb-1\">Category</label>\r\n <select [(ngModel)]=\"file.category\"\r\n name=\"category{{i}}\"\r\n (ngModelChange)=\"onMetaChange()\"\r\n class=\"border border-orange-300 rounded px-3 py-2 w-full outline-none focus:ring focus:ring-orange-200\">\r\n <option value=\"\">Select Category</option>\r\n <option *ngFor=\"let c of categories\" [ngValue]=\"c\">{{ c }}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n\r\n\r\n </div>\r\n</fx-component>", styles: [".custom-upload{border:1px solid #ccc}.custom-upload a{color:#000}.custom-upload .file-list .file-thumbnail{width:234px;height:234px;border:1px solid #ccc;background-color:#fff;padding:4px}.custom-upload .separator{height:56px;width:2px;background-color:#ccc;margin:10px}.close_icon{position:absolute;top:-8px;right:-8px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}.gap-8{gap:8px}\n"] }]
316
452
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FxBuilderWrapperService }] });
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy91cGxvYWRlci91cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3VwbG9hZGVyL3VwbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFvQyxTQUFTLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxKLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7O0FBU25DLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBVWhDO0lBQStCO0lBVG5ELHVEQUF1RDtJQUNoRCxpQkFBaUIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLGFBQWEsR0FBZSxFQUFFLENBQUM7SUFDL0IsYUFBYSxHQUFRO1FBQzFCLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLFlBQVksRUFBRSxFQUFFO0tBQ2pCLENBQUM7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LENBQUM7U0FDN0osQ0FBQztJQUNKLENBQUM7SUFFUyxXQUFXO1FBQ25CLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO3dHQTNWVSxpQkFBaUI7NEZBQWpCLGlCQUFpQiw4RkNoQjlCLHUwTkEyRWUsaWdCRC9ESCxZQUFZLGdRQUFFLFdBQVcsNEVBQUUsV0FBVyw4bUJBQUUsbUJBQW1COzs0RkFJMUQsaUJBQWlCO2tCQVA3QixTQUFTOytCQUNFLGFBQWEsY0FDWCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGluamVjdCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZ4QmFzZUNvbXBvbmVudCwgRnhDb21wb25lbnQsIEZ4U2VsZWN0U2V0dGluZywgRnhTZXR0aW5nLCBGeFN0cmluZ1NldHRpbmcsIEZ4VmFsaWRhdGlvbiwgRnhWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGluc3RhbnRzeXMtbGFicy9meCc7XHJcbmltcG9ydCB7IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZngtYnVpbGRlci13cmFwcGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdjQgYXMgdXVpZHY0fSBmcm9tICd1dWlkJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZngtdXBsb2FkZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRnhDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi91cGxvYWRlci5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXBsb2FkZXJDb21wb25lbnQgZXh0ZW5kcyBGeEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXR7XHJcbiAgLy8gcHVibGljIHVwbG9hZEZpbGVDb250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gIHB1YmxpYyB1cGxvYWRGaWxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIHB1YmxpYyB1cGxvYWRlZEZpbGVzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcHVibGljIGZvcm1hdHRlZERhdGE6IGFueSA9IHtcclxuICAgIHVwbG9hZGVkRmlsZXM6IFtdLFxyXG4gICAgZGVsZXRlZEZpbGVzOiBbXVxyXG4gIH07XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PEJvb2xlYW4+KCk7XHJcbiAgcHJpdmF0ZSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIGZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlOiBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSkge1xyXG4gICAgc3VwZXIoY2RyKVxyXG4gICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKChmeERhdGEpPT57XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMudXBsb2FkRmlsZUNvbnRyb2wpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuICB1cGxvYWRlZEltYWdlczogeyBba2V5OiBzdHJpbmddOiB7IHJlc3VsdDogc3RyaW5nLCBmaWxlOiBGaWxlIHwgbnVsbCB9W10gfSA9IHt9O1xyXG4gIGRlbGV0ZWRGaWxlczogYW55W10gPSBbXTtcclxuICAvLyBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAvLyAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC8vICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xyXG4gIC8vICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygndXBsb2FkZXInKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gIC8vICAgICAgICAgICB1cGxvYWRlZEZpbGVzW2tleV0gPSB2YWx1ZTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBbdXBsb2FkZXJLZXksIHVybHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwbG9hZGVkRmlsZXMpKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBpbWFnZUZldGNoZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XHJcbiAgXHJcbiAgLy8gICAgICAgICB1cmxzLmZvckVhY2goKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmICh1cmwpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKVxyXG4gIC8vICAgICAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgXHJcbiAgLy8gICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlVXJsczogc3RyaW5nW10pID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXNbdXBsb2FkZXJLZXldID0gaW1hZ2VVcmxzLm1hcChyZXN1bHQgPT4gKHtcclxuICAvLyAgICAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gIC8vICAgICAgICAgICAgICAgICBmaWxlOiBudWxsXHJcbiAgLy8gICAgICAgICAgICAgICB9KSk7XHJcbiAgLy8gICAgICAgICAgICAgICAvLyB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEltYWdlc11cclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IE9iamVjdC52YWx1ZXModGhpcy51cGxvYWRlZEltYWdlcykuZmxhdCgpO1xyXG4gIC8vICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZXMgZm9yICR7dXBsb2FkZXJLZXl9OmAsIGVycik7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuICBcclxuICAvLyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gIC8vICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgLy8gICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcblxyXG4gIC8vICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcclxuICAvLyAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ3VwbG9hZGVyJykgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAvLyAgICAgICAgICAgdXBsb2FkZWRGaWxlc1trZXldID0gdmFsdWU7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG5cclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlcykpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nLCBvcmlnaW5hbFVybDogc3RyaW5nIH0+W10gPSBbXTtcclxuXHJcbiAgLy8gICAgICAgICB1cmxzLmZvckVhY2goKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmICh1cmwpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiAoe1xyXG4gIC8vICAgICAgICAgICAgICAgICByZXN1bHQ6IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYiksIC8vIGp1c3QgZm9yIHByZXZpZXdcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IHVybFxyXG4gIC8vICAgICAgICAgICAgICAgfSkpXHJcbiAgLy8gICAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAvLyAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzLCAuLi5mb3JtYXR0ZWRdO1xyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZXMpO1xyXG4gIC8vICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZXMgZm9yICR7dXBsb2FkZXJLZXl9OmAsIGVycik7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgXHJcbiAgICAgICAgLy8gRXh0cmFjdCB1cGxvYWRlciBrZXlzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIFVSTCBhcnJheXNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpKSB7XHJcbiAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCd1cGxvYWRlcicpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHVwbG9hZGVkRmlsZXNNYXBba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlc01hcCkpIHtcclxuICAgICAgICAgIC8vIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nOyBvcmlnaW5hbFVybDogYW55OyB0aXRsZTpzdHJpbmcgOyBub3RlczpzdHJpbmcgfT5bXSA9IFtdO1xyXG4gIFxyXG4gICAgICAgICAgLy8gdXJscy5mb3JFYWNoKChvcmlnaW5hbFVybDphbnkpID0+IHtcclxuICAgICAgICAgIC8vICAgaWYgKG9yaWdpbmFsVXJsKSB7XHJcbiAgICAgICAgICAvLyAgICAgY29uc3QgaW1hZ2UkID0gdGhpcy5odHRwLmdldChvcmlnaW5hbFVybD8ub3JpZ2luYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkucGlwZShcclxuICAgICAgICAgIC8vICAgICAgIG1hcCgoYmxvYjogQmxvYikgPT4gKHtcclxuICAgICAgICAgIC8vICAgICAgICAgcmVzdWx0OiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLCAvLyBmb3IgcHJldmlld1xyXG4gICAgICAgICAgLy8gICAgICAgICBvcmlnaW5hbFVybDogb3JpZ2luYWxVcmw/Lm9yaWdpbmFsVXJsICAgICAgICAgIC8vIHByZXNlcnZlIG9yaWdpbmFsXHJcbiAgICAgICAgICAvLyAgICAgICB9KSlcclxuICAgICAgICAgIC8vICAgICApO1xyXG4gICAgICAgICAgLy8gICAgIGltYWdlRmV0Y2hlcy5wdXNoKGltYWdlJCk7XHJcbiAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nOyBvcmlnaW5hbFVybDogYW55OyB0aXRsZTogc3RyaW5nOyBub3Rlczogc3RyaW5nIH0+W10gPSBbXTtcclxuXHJcbnVybHMuZm9yRWFjaCgob3JpZ2luYWxVcmw6IGFueSkgPT4ge1xyXG4gIGlmIChvcmlnaW5hbFVybCkge1xyXG4gICAgY29uc3QgaW1hZ2UkID0gdGhpcy5odHRwLmdldChvcmlnaW5hbFVybD8ub3JpZ2luYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkucGlwZShcclxuICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiAoe1xyXG4gICAgICAgIHJlc3VsdDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwgLy8gZm9yIHByZXZpZXdcclxuICAgICAgICBvcmlnaW5hbFVybDogb3JpZ2luYWxVcmw/Lm9yaWdpbmFsVXJsLCAvLyBwcmVzZXJ2ZSBvcmlnaW5hbFxyXG4gICAgICAgIHRpdGxlOiBvcmlnaW5hbFVybD8udGl0bGUgfHwgJycsIC8vIGRlZmF1bHQgZW1wdHkgaWYgbm90IHByZXNlbnRcclxuICAgICAgICBub3Rlczogb3JpZ2luYWxVcmw/Lm5vdGVzIHx8ICcnXHJcbiAgICAgIH0pKVxyXG4gICAgKTtcclxuICAgIGltYWdlRmV0Y2hlcy5wdXNoKGltYWdlJCk7XHJcbiAgfVxyXG59KTtcclxuXHJcbiAgXHJcbiAgICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9ya0pvaW4oaW1hZ2VGZXRjaGVzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6IChpbWFnZURhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGltYWdlRGF0YS5tYXAoaXRlbSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICBpZDogdXVpZHY0KCksXHJcbiAgICAgICAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVXJsOiBpdGVtLm9yaWdpbmFsVXJsLFxyXG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IGl0ZW0ucmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgbm90ZXM6ICcnXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzLCAuLi5mb3JtYXR0ZWRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWREYXRhLnVwbG9hZGVkRmlsZXMgPSB0aGlzLnVwbG9hZGVkRmlsZXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVDb250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0dGVkRGF0YSk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoIGltYWdlcyBmb3IgJHt1cGxvYWRlcktleX06YCwgZXJyKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkXHJcbiAgLy8gICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAvLyAgICAgLnN1YnNjcmliZSgodmFyaWFibGVzOiBhbnkpID0+IHtcclxuICAvLyAgICAgICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuO1xyXG4gIFxyXG4gIC8vICAgICAgIGNvbnN0IHVwbG9hZGVkRmlsZXNNYXA6IHsgW2tleTogc3RyaW5nXTogeyBvcmlnaW5hbFVybDogc3RyaW5nIH1bXSB9ID0gdmFyaWFibGVzLnVwbG9hZGVkRmlsZXM7XHJcbiAgXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBbdXBsb2FkZXJLZXksIHVybHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwbG9hZGVkRmlsZXNNYXApKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBpbWFnZUZldGNoZXM6IE9ic2VydmFibGU8eyByZXN1bHQ6IHN0cmluZzsgb3JpZ2luYWxVcmw6IHN0cmluZyB9PltdID0gW107XHJcbiAgXHJcbiAgLy8gICAgICAgICB1cmxzLmZvckVhY2goKGZpbGVPYmo6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBvcmlnaW5hbFVybCA9IGZpbGVPYmo/Lm9yaWdpbmFsVXJsO1xyXG4gIC8vICAgICAgICAgICBpZiAob3JpZ2luYWxVcmwpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KG9yaWdpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXHJcbiAgLy8gICAgICAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IpID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwgLy8gZm9yIHByZXZpZXdcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmxcclxuICAvLyAgICAgICAgICAgICAgIH0pKVxyXG4gIC8vICAgICAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgXHJcbiAgLy8gICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgICAgICAgZm9ya0pvaW4oaW1hZ2VGZXRjaGVzKS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICAgICAgICAgIG5leHQ6IChpbWFnZURhdGEpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGltYWdlRGF0YS5tYXAoaXRlbSA9PiAoe1xyXG4gIC8vICAgICAgICAgICAgICAgICBpZDogdXVpZHY0KCksXHJcbiAgLy8gICAgICAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgLy8gICAgICAgICAgICAgICAgIG9yaWdpbmFsVXJsOiBpdGVtLm9yaWdpbmFsVXJsLFxyXG4gIC8vICAgICAgICAgICAgICAgICByZXN1bHQ6IGl0ZW0ucmVzdWx0XHJcbiAgLy8gICAgICAgICAgICAgICB9KSk7XHJcbiAgXHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzLCAuLi5mb3JtYXR0ZWRdO1xyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWREYXRhLnVwbG9hZGVkRmlsZXMgPSB0aGlzLnVwbG9hZGVkRmlsZXM7XHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVDb250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0dGVkRGF0YSk7XHJcbiAgLy8gICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoIGltYWdlcyBmb3IgJHt1cGxvYWRlcktleX06YCwgZXJyKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gfVxyXG4gIFxyXG5cclxuICAvLyBwdWJsaWMgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgLy8gICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIC8vICAgaWYgKGlucHV0LmZpbGVzKSB7XHJcbiAgLy8gICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbnB1dD8uZmlsZXM/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzW2ldO1xyXG4gIC8vICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xyXG4gIC8vICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnB1c2goe1xyXG4gIC8vICAgICAgICAgICBmaWxlOiBmaWxlLFxyXG4gIC8vICAgICAgICAgICByZXN1bHQ6IGUudGFyZ2V0Py5yZXN1bHQsXHJcbiAgLy8gICAgICAgICAgIG5hbWU6IGZpbGU/Lm5hbWUsXHJcbiAgLy8gICAgICAgICAgIGlkOiB1dWlkdjQoKVxyXG4gIC8vICAgICAgICAgfSlcclxuICAvLyAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy51cGxvYWRlZEZpbGVzKTtcclxuICAvLyAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMudXBsb2FkRmlsZUNvbnRyb2wpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGlucHV0LmZpbGVzKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQuZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXNbaV07XHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3RmlsZSA9IHtcclxuICAgICAgICAgICAgaWQ6IHV1aWR2NCgpLFxyXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxyXG4gICAgICAgICAgICBvcmlnaW5hbFVybDogbnVsbCxcclxuICAgICAgICAgICAgcmVzdWx0OiBlLnRhcmdldD8ucmVzdWx0LFxyXG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICAgICAgbm90ZXM6ICcnXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKG5ld0ZpbGUpO1xyXG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWREYXRhLnVwbG9hZGVkRmlsZXMgPSB0aGlzLnVwbG9hZGVkRmlsZXM7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVDb250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0dGVkRGF0YSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTWV0YUNoYW5nZSgpIHtcclxuICAgIHRoaXMuZm9ybWF0dGVkRGF0YS51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzO1xyXG4gICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIHB1YmxpYyBkZWxldGVGaWxlKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcy5maWx0ZXIoZmlsZSA9PiBmaWxlPy5pZCAhPT0gaWQpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZGVsZXRlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBbZGVsZXRlZEZpbGVdID0gdGhpcy51cGxvYWRlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgXHJcbiAgLy8gICBpZiAoZGVsZXRlZEZpbGUpIHtcclxuICAvLyAgICAgdGhpcy5kZWxldGVkRmlsZXMucHVzaChkZWxldGVkRmlsZSk7XHJcbiAgLy8gICAgIHRoaXMuZm9ybWF0dGVkRGF0YSA9IHtcclxuICAvLyAgICAgICAuLi50aGlzLmZvcm1hdHRlZERhdGEsXHJcbiAgLy8gICAgICAgdXBsb2FkZWRGaWxlczogWy4uLnRoaXMudXBsb2FkZWRGaWxlc10sXHJcbiAgLy8gICAgICAgZGVsZXRlZEZpbGVzOiBbLi4udGhpcy5kZWxldGVkRmlsZXNdXHJcbiAgLy8gICAgIH07XHJcbiAgLy8gICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGRlbGV0ZUZpbGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgZGVsZXRlZEZpbGUgPSB0aGlzLnVwbG9hZGVkRmlsZXM/LltpbmRleF07XHJcbiAgICBpZiAoIWRlbGV0ZWRGaWxlKSByZXR1cm47XHJcbiAgXHJcbiAgICAvLyBFbnN1cmUgZm9ybWF0dGVkRGF0YSBleGlzdHMgYW5kIGluaXRpYWxpemUgaWYgdW5kZWZpbmVkXHJcbiAgICB0aGlzLmZvcm1hdHRlZERhdGEgPSB0aGlzLmZvcm1hdHRlZERhdGEgfHwgeyB1cGxvYWRlZEZpbGVzOiBbXSwgZGVsZXRlZEZpbGVzOiBbXSB9O1xyXG4gIFxyXG4gICAgLy8gQWRkIHRoZSBkZWxldGVkIGZpbGUgdG8gdGhlIGRlbGV0ZWRGaWxlcyBhcnJheVxyXG4gICAgdGhpcy5kZWxldGVkRmlsZXMgPSBbLi4udGhpcy5kZWxldGVkRmlsZXMsIGRlbGV0ZWRGaWxlXTtcclxuICBcclxuICAgIC8vIFJlbW92ZSB0aGUgZmlsZSBmcm9tIHVwbG9hZGVkRmlsZXMgdXNpbmcgZmlsdGVyIGZvciBpbW11dGFiaWxpdHlcclxuICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICBcclxuICAgIC8vIFVwZGF0ZSBmb3JtYXR0ZWREYXRhXHJcbiAgICB0aGlzLmZvcm1hdHRlZERhdGEgPSB7XHJcbiAgICAgIC4uLnRoaXMuZm9ybWF0dGVkRGF0YSxcclxuICAgICAgdXBsb2FkZWRGaWxlczogdGhpcy51cGxvYWRlZEZpbGVzLFxyXG4gICAgICBkZWxldGVkRmlsZXM6IHRoaXMuZGVsZXRlZEZpbGVzXHJcbiAgICB9O1xyXG4gIFxyXG4gICAgLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgdXBsb2FkRmlsZUNvbnRyb2xcclxuICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICB9XHJcbiAgXHJcbiAgXHJcblxyXG4gIHByb3RlY3RlZCBzZXR0aW5ncygpOiBGeFNldHRpbmdbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAndXBsb2FkLXRleHQnLCAkdGl0bGU6ICdVcGxvYWQgVGV4dCcsIHZhbHVlOiAnVXBsb2FkIEZpbGUnfSksXHJcbiAgICAgIG5ldyBGeFNlbGVjdFNldHRpbmcoe2tleTogJ211bHRpcGxlLXVwbG9hZCcsICR0aXRsZTogJ011bHRpcGxlIFVwbG9hZCcsIHZhbHVlOiBmYWxzZX0sIFt7b3B0aW9uOiAnRW5hYmxlJywgdmFsdWU6IHRydWV9LCB7b3B0aW9uOiAnRGlzYWJsZScsIHZhbHVlOiBmYWxzZX1dKVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB2YWxpZGF0aW9ucygpOiBGeFZhbGlkYXRpb25bXSB7XHJcbiAgICByZXR1cm4gW0Z4VmFsaWRhdG9yU2VydmljZS5yZXF1aXJlZF07XHJcbiAgfVxyXG59XHJcbiIsIjxmeC1jb21wb25lbnQgW2Z4RGF0YV09XCJmeERhdGFcIj5cclxuICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXVwbG9hZCBmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBwLTIgcGItMCByb3VuZGVkLXNtXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI5XCIgaGVpZ2h0PVwiMjhcIiB2aWV3Qm94PVwiMCAwIDI5IDI4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgZD1cIk0xNC4wMDEgMy4wMDE5NUMxMS41MzIyIDMuMDAxOTUgOS4xNjcyMiAzLjg2OTU2IDcuMjM2NDEgNS4zODQxNEw3LjIzNTk4IDQuNTk2OTVDNy4yMzU5OCA0LjUyNDczIDcuMjIxNzUgNC40NTMyMSA3LjE5NDExIDQuMzg2NDhDNy4xNjY0NyA0LjMxOTc1IDcuMTI1OTYgNC4yNTkxMiA3LjA3NDg5IDQuMjA4MDRDNy4wMjM4MSA0LjE1Njk3IDYuOTYzMTggNC4xMTY0NiA2Ljg5NjQ1IDQuMDg4ODJDNi44Mjk3MiA0LjA2MTE4IDYuNzU4MiA0LjA0Njk1IDYuNjg1OTggNC4wNDY5NUM2LjYxMzc1IDQuMDQ2OTUgNi41NDIyMyA0LjA2MTE4IDYuNDc1NSA0LjA4ODgyQzYuNDA4NzcgNC4xMTY0NiA2LjM0ODE0IDQuMTU2OTcgNi4yOTcwNyA0LjIwODA0QzYuMjQ1OTkgNC4yNTkxMiA2LjIwNTQ4IDQuMzE5NzUgNi4xNzc4NCA0LjM4NjQ4QzYuMTUwMiA0LjQ1MzIxIDYuMTM1OTggNC41MjQ3MyA2LjEzNTk4IDQuNTk2OTVMNi4xMzY0MiA2LjY4NjUyQzYuMTM2NDMgNi44MzIzOSA2LjE5NDM4IDYuOTcyMjggNi4yOTc1MiA3LjA3NTQyQzYuNDAwNjcgNy4xNzg1NiA2LjU0MDU1IDcuMjM2NTEgNi42ODY0MiA3LjIzNjUySDguNzc1OThDOC44NDgyIDcuMjM2NTIgOC45MTk3MiA3LjIyMjMgOC45ODY0NSA3LjE5NDY2QzkuMDUzMTggNy4xNjcwMiA5LjExMzgxIDcuMTI2NTEgOS4xNjQ4OSA3LjA3NTQzQzkuMjE1OTYgNy4wMjQzNiA5LjI1NjQ3IDYuOTYzNzMgOS4yODQxMSA2Ljg5N0M5LjMxMTc1IDYuODMwMjcgOS4zMjU5OCA2Ljc1ODc1IDkuMzI1OTggNi42ODY1MkM5LjMyNTk4IDYuNjE0MyA5LjMxMTc1IDYuNTQyNzggOS4yODQxMSA2LjQ3NjA1QzkuMjU2NDcgNi40MDkzMiA5LjIxNTk2IDYuMzQ4NjkgOS4xNjQ4OSA2LjI5NzYxQzkuMTEzODEgNi4yNDY1NCA5LjA1MzE4IDYuMjA2MDMgOC45ODY0NSA2LjE3ODM5QzguOTE5NzIgNi4xNTA3NSA4Ljg0ODIgNi4xMzY1MiA4Ljc3NTk4IDYuMTM2NTJIOC4wNTg0QzkuNzcwMiA0Ljg0Mzg3IDExLjgzOTkgNC4xMDE5NSAxNC4wMDEgNC4xMDE5NUMxOS40NzUxIDQuMTAxOTUgMjMuOTAxIDguNTI3ODIgMjMuOTAxIDE0LjAwMkMyMy45MDEgMTkuNDc2MSAxOS40NzUxIDIzLjkwMiAxNC4wMDEgMjMuOTAyQzguNTI2ODQgMjMuOTAyIDQuMTAwOTggMTkuNDc2MSA0LjEwMDk4IDE0LjAwMkM0LjEwMDk4IDEyLjYzODEgNC4zODI2MyAxMS4yODg4IDQuOTI4NTUgMTAuMDM4OUM0Ljk4NjkxIDkuOTA1MzIgNC45ODk4MiA5Ljc1Mzk5IDQuOTM2NjUgOS42MTgyMkM0Ljg4MzQ3IDkuNDgyNDYgNC43Nzg1NSA5LjM3MzM2IDQuNjQ0OTYgOS4zMTQ5MkM0LjU3ODc3IDkuMjg1OTYgNC41MDc1MyA5LjI3MDMyIDQuNDM1MyA5LjI2ODlDNC4zNjMwNiA5LjI2NzQ3IDQuMjkxMjYgOS4yODAzIDQuMjIzOTggOS4zMDY2M0M0LjE1NjcxIDkuMzMyOTcgNC4wOTUyOCA5LjM3MjMgNC4wNDMyMSA5LjQyMjM4QzMuOTkxMTQgOS40NzI0NyAzLjk0OTQ0IDkuNTMyMzIgMy45MjA1MSA5LjU5ODUyQzMuMzEzOTMgMTAuOTg3MiAzLjAwMDk4IDEyLjQ4NjYgMy4wMDA5OCAxNC4wMDJDMy4wMDA5OCAyMC4wNzA2IDcuOTMyMzYgMjUuMDAyIDE0LjAwMSAyNS4wMDJDMjAuMDY5NiAyNS4wMDIgMjUuMDAxIDIwLjA3MDYgMjUuMDAxIDE0LjAwMkMyNS4wMDEgNy45MzMzNCAyMC4wNjk2IDMuMDAxOTUgMTQuMDAxIDMuMDAxOTVaXCJcclxuICAgICAgICAgICAgZmlsbD1cIiNGM0EwNDFcIiAvPlxyXG4gICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICBkPVwiTTEzLjk5ODggNi4xMzk2NUM5LjY2MTYgNi4xMzk2NSA2LjEzMzc5IDkuNjY3NDYgNi4xMzM3OSAxNC4wMDQ2QzYuMTMzNzkgMTguMzQxOCA5LjY2MTYgMjEuODY5NiAxMy45OTg4IDIxLjg2OTZDMTguMzM2IDIxLjg2OTYgMjEuODYzOCAxOC4zNDE4IDIxLjg2MzggMTQuMDA0NkMyMS44NjM4IDkuNjY3NDYgMTguMzM2IDYuMTM5NjUgMTMuOTk4OCA2LjEzOTY1Wk0xMy45OTg4IDguMjI5NjVDMTQuMTQ0NyA4LjIyOTY1IDE0LjI4NDYgOC4yODc1OSAxNC4zODc3IDguMzkwNzRDMTQuNDkwOCA4LjQ5Mzg4IDE0LjU0ODggOC42MzM3OCAxNC41NDg4IDguNzc5NjVWMTMuNzc2OUwxNy41MjI3IDE2Ljc1MDhDMTcuNjI1OCAxNi44NTM5IDE3LjY4MzcgMTYuOTkzOCAxNy42ODM3IDE3LjEzOTZDMTcuNjgzNyAxNy4yODU1IDE3LjYyNTggMTcuNDI1NCAxNy41MjI3IDE3LjUyODVDMTcuNDE5NSAxNy42MzE2IDE3LjI3OTYgMTcuNjg5NiAxNy4xMzM4IDE3LjY4OTZDMTYuOTg3OSAxNy42ODk2IDE2Ljg0ODEgMTcuNjMxNiAxNi43NDQ5IDE3LjUyODVMMTMuNjA5OSAxNC4zOTM1QzEzLjUwNjggMTQuMjkwNCAxMy40NDg4IDE0LjE1MDUgMTMuNDQ4OCAxNC4wMDQ2VjguNzc5NjVDMTMuNDQ4OCA4LjYzMzc4IDEzLjUwNjcgOC40OTM4OCAxMy42MDk5IDguMzkwNzRDMTMuNzEzIDguMjg3NTkgMTMuODUyOSA4LjIyOTY1IDEzLjk5ODggOC4yMjk2NVpcIlxyXG4gICAgICAgICAgICBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI4LjU2XCIgaGVpZ2h0PVwiMjhcIiByeD1cIjEuNTE0NzlcIiBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTE1LjA2OCAyMi43MzkxVjE3LjY3MDhIMTguNDk2OEwxNC4yMTA4IDEyLjYwMjVMOS45MjQ4IDE3LjY3MDhIMTMuMzUzNlYyMi43MzkxSDkuMDY3NTlWMjIuNjk2OUM4LjkyMzU4IDIyLjcwNTMgOC43ODY0MyAyMi43MzkxIDguNjM4OTkgMjIuNzM5MUM2LjkzMzkxIDIyLjczOTEgNS4yOTg2NiAyMi4wNzE3IDQuMDkyOTggMjAuODgzNUMyLjg4NzMgMTkuNjk1NCAyLjIwOTk2IDE4LjA4NCAyLjIwOTk2IDE2LjQwMzdDMi4yMDk5NiAxMy4xNTMyIDQuNzA0NDMgMTAuNTA0MiA3LjkwNTIzIDEwLjE0MUM4LjE4NTg1IDguNjk1MyA4Ljk2ODkyIDcuMzkxMTggMTAuMTE5NyA2LjQ1MjkyQzExLjI3MDYgNS41MTQ2NSAxMi43MTcyIDUuMDAwODkgMTQuMjEwOCA1QzE1LjcwNDcgNS4wMDA4MiAxNy4xNTE1IDUuNTE0NTIgMTguMzAyNiA2LjQ1Mjc3QzE5LjQ1MzcgNy4zOTEwMSAyMC4yMzcxIDguNjk1MTYgMjAuNTE4MSAxMC4xNDFDMjMuNzE4OSAxMC41MDQyIDI2LjIxIDEzLjE1MzIgMjYuMjEgMTYuNDAzN0MyNi4yMSAxOC4wODQgMjUuNTMyNiAxOS42OTU0IDI0LjMyNjkgMjAuODgzNUMyMy4xMjEzIDIyLjA3MTcgMjEuNDg2IDIyLjczOTEgMTkuNzgwOSAyMi43MzkxQzE5LjYzNjkgMjIuNzM5MSAxOS40OTgxIDIyLjcwNTMgMTkuMzUyMyAyMi42OTY5VjIyLjczOTFIMTUuMDY4WlwiXHJcbiAgICAgICAgICAgIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCIgY2xhc3M9XCJ0ZXh0LWJhc2UgY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICB7eyBzZXR0aW5nKCd1cGxvYWQtdGV4dCcpIH19XHJcbiAgICAgIDwvYT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBbbXVsdGlwbGVdPVwic2V0dGluZygnbXVsdGlwbGUtdXBsb2FkJylcIiAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIiBoaWRkZW4gLz5cclxuICAgIDxkaXYgY2xhc3M9XCJzZXBhcmF0b3JcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmaWxlLWxpc3QgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgZmxleC13cmFwXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1cGxvYWRlZEZpbGVzPy5sZW5ndGhcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIHVwbG9hZGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZV9pY29uIGN1cnNvci1wb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzY4MzdfMjk2ODMpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiOVwiIGZpbGw9XCIjRjNBMDQxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPG1hc2sgaWQ9XCJtYXNrMF82ODM3XzI5NjgzXCIgc3R5bGU9XCJtYXNrLXR5cGU6YWxwaGFcIiBtYXNrVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwiI0Q5RDlEOVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWFzaz5cclxuICAgICAgICAgICAgICAgICAgPGcgbWFzaz1cInVybCgjbWFzazBfNjgzN18yOTY4MylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjIwNDUgOC45OTgxNUw1LjgxODAyIDYuNjExNjdMNi42MTM1MSA1LjgxNjE3TDkgOC4yMDI2NkwxMS4zODY1IDUuODE2MTdMMTIuMTgyIDYuNjExNjdMOS43OTU1IDguOTk4MTVMMTIuMTgyIDExLjM4NDZMMTEuMzg2NSAxMi4xODAxTDkgOS43OTM2NUw2LjYxMzUxIDEyLjE4MDFMNS44MTgwMiAxMS4zODQ2TDguMjA0NSA4Ljk5ODE1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNjgzN18yOTY4M1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiOVwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiZmlsZS10aHVtYm5haWxcIiBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDRweFwiIFtzcmNdPVwiZmlsZT8ucmVzdWx0XCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNtIG1iLTFcIj5UaXRsZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiZmlsZS50aXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ0aXRsZXt7aX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25NZXRhQ2hhbmdlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHRpdGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgYm9yZGVyLW9yYW5nZS0zMDAgcm91bmRlZCBweC0zIHB5LTIgbWItMyB3LWZ1bGwgb3V0bGluZS1ub25lIGZvY3VzOnJpbmcgZm9jdXM6cmluZy1vcmFuZ2UtMjAwXCIgLz5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1zbSBtYi0xXCI+Tm90ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDx0ZXh0YXJlYSBbKG5nTW9kZWwpXT1cImZpbGUubm90ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwibm90ZXN7e2l9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWV0YUNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBub3Rlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIGJvcmRlci1vcmFuZ2UtMzAwIHJvdW5kZWQgcHgtMyBweS0yIHctZnVsbCBvdXRsaW5lLW5vbmUgZm9jdXM6cmluZyBmb2N1czpyaW5nLW9yYW5nZS0yMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzPVwiMlwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgXHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPHA+e3tmaWxlPy5uYW1lfX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZngtY29tcG9uZW50PiJdfQ==
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy91cGxvYWRlci91cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3VwbG9hZGVyL3VwbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFvQyxTQUFTLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxKLE9BQU8sRUFBNkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRSxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBQyxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFTbkMsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGVBQWU7SUFnQmhDO0lBQStCO0lBZm5ELHVEQUF1RDtJQUNoRCxpQkFBaUIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLGFBQWEsR0FBZSxFQUFFLENBQUM7SUFDL0IsYUFBYSxHQUFRO1FBQzFCLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLFlBQVksRUFBRSxFQUFFO0tBQ2pCLENBQUM7SUFDRixVQUFVLEdBQUc7UUFD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RSxDQUFDO1FBRTdDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDL0YsSUFBSSxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUNuRyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO3dHQXBmVSxpQkFBaUI7NEZBQWpCLGlCQUFpQiw4RkNoQjlCLDJtZ0JBeVBlLGloQkQ3T0gsWUFBWSw0Z0JBQUUsV0FBVyw0RUFBRSxXQUFXLHlnQ0FBRSxtQkFBbUI7OzRGQUkxRCxpQkFBaUI7a0JBUDdCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRnhCYXNlQ29tcG9uZW50LCBGeENvbXBvbmVudCwgRnhTZWxlY3RTZXR0aW5nLCBGeFNldHRpbmcsIEZ4U3RyaW5nU2V0dGluZywgRnhWYWxpZGF0aW9uLCBGeFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBtYXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjR9IGZyb20gJ3V1aWQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmeC11cGxvYWRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGeENvbXBvbmVudCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3VwbG9hZGVyLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVcGxvYWRlckNvbXBvbmVudCBleHRlbmRzIEZ4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdHtcclxuICAvLyBwdWJsaWMgdXBsb2FkRmlsZUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIHVwbG9hZEZpbGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIHVwbG9hZGVkRmlsZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBwdWJsaWMgZm9ybWF0dGVkRGF0YTogYW55ID0ge1xyXG4gICAgdXBsb2FkZWRGaWxlczogW10sXHJcbiAgICBkZWxldGVkRmlsZXM6IFtdXHJcbiAgfTtcclxuICBjYXRlZ29yaWVzID0gW1xyXG4gICAgJ09yYWwgSW1hZ2VzJyxcclxuICAgICdQYXN0IERvY3MnLFxyXG4gICAgJ1gtUmF5cycsXHJcbiAgICAnUHJvZmlsZScsXHJcbiAgXTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Qm9vbGVhbj4oKTtcclxuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLHByaXZhdGUgZnhCdWlsZGVyV3JhcHBlclNlcnZpY2U6IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihjZHIpXHJcbiAgICB0aGlzLm9uSW5pdC5zdWJzY3JpYmUoKGZ4RGF0YSk9PntcclxuICAgICAgdGhpcy5fcmVnaXN0ZXIodGhpcy51cGxvYWRGaWxlQ29udHJvbCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4gIHVwbG9hZGVkSW1hZ2VzOiB7IFtrZXk6IHN0cmluZ106IHsgcmVzdWx0OiBzdHJpbmcsIGZpbGU6IEZpbGUgfCBudWxsIH1bXSB9ID0ge307XHJcbiAgZGVsZXRlZEZpbGVzOiBhbnlbXSA9IFtdO1xyXG4gIC8vIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gIC8vICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgLy8gICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuICBcclxuICAvLyAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcclxuICBcclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpKSB7XHJcbiAgLy8gICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCd1cGxvYWRlcicpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgLy8gICAgICAgICAgIHVwbG9hZGVkRmlsZXNba2V5XSA9IHZhbHVlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICBcclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlcykpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcclxuICBcclxuICAvLyAgICAgICAgIHVybHMuZm9yRWFjaCgodXJsOiBzdHJpbmcpID0+IHtcclxuICAvLyAgICAgICAgICAgaWYgKHVybCkge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXHJcbiAgLy8gICAgICAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IpID0+IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYikpXHJcbiAgLy8gICAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuICBcclxuICAvLyAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICAgIGZvcmtKb2luKGltYWdlRmV0Y2hlcykuc3Vic2NyaWJlKHtcclxuICAvLyAgICAgICAgICAgICBuZXh0OiAoaW1hZ2VVcmxzOiBzdHJpbmdbXSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1t1cGxvYWRlcktleV0gPSBpbWFnZVVybHMubWFwKHJlc3VsdCA9PiAoe1xyXG4gIC8vICAgICAgICAgICAgICAgICByZXN1bHQsXHJcbiAgLy8gICAgICAgICAgICAgICAgIGZpbGU6IG51bGxcclxuICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuICAvLyAgICAgICAgICAgICAgIC8vIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkSW1hZ2VzXVxyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnVwbG9hZGVkSW1hZ2VzKS5mbGF0KCk7XHJcbiAgLy8gICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoIGltYWdlcyBmb3IgJHt1cGxvYWRlcktleX06YCwgZXJyKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gfVxyXG4gIFxyXG4gIC8vIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkXHJcbiAgLy8gICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAvLyAgICAgLnN1YnNjcmliZSgodmFyaWFibGVzOiBhbnkpID0+IHtcclxuICAvLyAgICAgICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuO1xyXG5cclxuICAvLyAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcclxuXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xyXG4gIC8vICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygndXBsb2FkZXInKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gIC8vICAgICAgICAgICB1cGxvYWRlZEZpbGVzW2tleV0gPSB2YWx1ZTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGZvciAoY29uc3QgW3VwbG9hZGVyS2V5LCB1cmxzXSBvZiBPYmplY3QuZW50cmllcyh1cGxvYWRlZEZpbGVzKSkge1xyXG4gIC8vICAgICAgICAgY29uc3QgaW1hZ2VGZXRjaGVzOiBPYnNlcnZhYmxlPHsgcmVzdWx0OiBzdHJpbmcsIG9yaWdpbmFsVXJsOiBzdHJpbmcgfT5bXSA9IFtdO1xyXG5cclxuICAvLyAgICAgICAgIHVybHMuZm9yRWFjaCgodXJsOiBzdHJpbmcpID0+IHtcclxuICAvLyAgICAgICAgICAgaWYgKHVybCkge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXHJcbiAgLy8gICAgICAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IpID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwgLy8ganVzdCBmb3IgcHJldmlld1xyXG4gIC8vICAgICAgICAgICAgICAgICBvcmlnaW5hbFVybDogdXJsXHJcbiAgLy8gICAgICAgICAgICAgICB9KSlcclxuICAvLyAgICAgICAgICAgICApO1xyXG4gIC8vICAgICAgICAgICAgIGltYWdlRmV0Y2hlcy5wdXNoKGltYWdlJCk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pO1xyXG5cclxuICAvLyAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICAgIGZvcmtKb2luKGltYWdlRmV0Y2hlcykuc3Vic2NyaWJlKHtcclxuICAvLyAgICAgICAgICAgICBuZXh0OiAoaW1hZ2VEYXRhKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSBpbWFnZURhdGEubWFwKGl0ZW0gPT4gKHtcclxuICAvLyAgICAgICAgICAgICAgICAgaWQ6IHV1aWR2NCgpLFxyXG4gIC8vICAgICAgICAgICAgICAgICBmaWxlOiBudWxsLFxyXG4gIC8vICAgICAgICAgICAgICAgICBvcmlnaW5hbFVybDogaXRlbS5vcmlnaW5hbFVybCxcclxuICAvLyAgICAgICAgICAgICAgICAgcmVzdWx0OiBpdGVtLnJlc3VsdFxyXG4gIC8vICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLmZvcm1hdHRlZF07XHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVDb250cm9sLnNldFZhbHVlKHRoaXMudXBsb2FkZWRGaWxlcyk7XHJcbiAgLy8gICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoIGltYWdlcyBmb3IgJHt1cGxvYWRlcktleX06YCwgZXJyKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuLy8gICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuLy8gICAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4vLyAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbi8vICAgICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbi8vICAgICAgICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuICBcclxuLy8gICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzTWFwOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcclxuICBcclxuLy8gICAgICAgICAvLyBFeHRyYWN0IHVwbG9hZGVyIGtleXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgVVJMIGFycmF5c1xyXG4vLyAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcclxuLy8gICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ3VwbG9hZGVyJykgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuLy8gICAgICAgICAgICAgdXBsb2FkZWRGaWxlc01hcFtrZXldID0gdmFsdWU7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG4gIFxyXG4vLyAgICAgICAgIGZvciAoY29uc3QgW3VwbG9hZGVyS2V5LCB1cmxzXSBvZiBPYmplY3QuZW50cmllcyh1cGxvYWRlZEZpbGVzTWFwKSkge1xyXG4vLyAgICAgICAgICAgLy8gY29uc3QgaW1hZ2VGZXRjaGVzOiBPYnNlcnZhYmxlPHsgcmVzdWx0OiBzdHJpbmc7IG9yaWdpbmFsVXJsOiBhbnk7IHRpdGxlOnN0cmluZyA7IG5vdGVzOnN0cmluZyB9PltdID0gW107XHJcbiAgXHJcbi8vICAgICAgICAgICAvLyB1cmxzLmZvckVhY2goKG9yaWdpbmFsVXJsOmFueSkgPT4ge1xyXG4vLyAgICAgICAgICAgLy8gICBpZiAob3JpZ2luYWxVcmwpIHtcclxuLy8gICAgICAgICAgIC8vICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KG9yaWdpbmFsVXJsPy5vcmlnaW5hbFVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4vLyAgICAgICAgICAgLy8gICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiAoe1xyXG4vLyAgICAgICAgICAgLy8gICAgICAgICByZXN1bHQ6IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYiksIC8vIGZvciBwcmV2aWV3XHJcbi8vICAgICAgICAgICAvLyAgICAgICAgIG9yaWdpbmFsVXJsOiBvcmlnaW5hbFVybD8ub3JpZ2luYWxVcmwgICAgICAgICAgLy8gcHJlc2VydmUgb3JpZ2luYWxcclxuLy8gICAgICAgICAgIC8vICAgICAgIH0pKVxyXG4vLyAgICAgICAgICAgLy8gICAgICk7XHJcbi8vICAgICAgICAgICAvLyAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuLy8gICAgICAgICAgIC8vICAgfVxyXG4vLyAgICAgICAgICAgLy8gfSk7XHJcblxyXG4vLyAgICAgICAgICAgY29uc3QgaW1hZ2VGZXRjaGVzOiBPYnNlcnZhYmxlPHsgcmVzdWx0OiBzdHJpbmc7IG9yaWdpbmFsVXJsOiBhbnk7IHRpdGxlOiBzdHJpbmc7IG5vdGVzOiBzdHJpbmcgfT5bXSA9IFtdO1xyXG5cclxuLy8gdXJscy5mb3JFYWNoKChvcmlnaW5hbFVybDogYW55KSA9PiB7XHJcbi8vICAgaWYgKG9yaWdpbmFsVXJsKSB7XHJcbi8vICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KG9yaWdpbmFsVXJsPy5vcmlnaW5hbFVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4vLyAgICAgICBtYXAoKGJsb2I6IEJsb2IpID0+ICh7XHJcbi8vICAgICAgICAgcmVzdWx0OiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLCAvLyBmb3IgcHJldmlld1xyXG4vLyAgICAgICAgIG9yaWdpbmFsVXJsOiBvcmlnaW5hbFVybD8ub3JpZ2luYWxVcmwsIC8vIHByZXNlcnZlIG9yaWdpbmFsXHJcbi8vICAgICAgICAgdGl0bGU6IG9yaWdpbmFsVXJsPy50aXRsZSB8fCAnJywgLy8gZGVmYXVsdCBlbXB0eSBpZiBub3QgcHJlc2VudFxyXG4vLyAgICAgICAgIG5vdGVzOiBvcmlnaW5hbFVybD8ubm90ZXMgfHwgJydcclxuLy8gICAgICAgfSkpXHJcbi8vICAgICApO1xyXG4vLyAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuLy8gICB9XHJcbi8vIH0pO1xyXG5cclxuICBcclxuLy8gICAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoID4gMCkge1xyXG4vLyAgICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbi8vICAgICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4vLyAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbi8vICAgICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuLy8gICAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuLy8gICAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbi8vICAgICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHQsXHJcbi8vICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxyXG4vLyAgICAgICAgICAgICAgICAgICBub3RlczogJydcclxuLy8gICAgICAgICAgICAgICAgIH0pKTtcclxuICBcclxuLy8gICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLmZvcm1hdHRlZF07XHJcbi8vICAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuLy8gICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuLy8gICAgICAgICAgICAgICB9LFxyXG4vLyAgICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggaW1hZ2VzIGZvciAke3VwbG9hZGVyS2V5fTpgLCBlcnIpO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9KTtcclxuLy8gICB9XHJcbiAgXHJcbiAgLy8gbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAvLyAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC8vICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiB7IG9yaWdpbmFsVXJsOiBzdHJpbmcgfVtdIH0gPSB2YXJpYWJsZXMudXBsb2FkZWRGaWxlcztcclxuICBcclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlc01hcCkpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nOyBvcmlnaW5hbFVybDogc3RyaW5nIH0+W10gPSBbXTtcclxuICBcclxuICAvLyAgICAgICAgIHVybHMuZm9yRWFjaCgoZmlsZU9iajogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gZmlsZU9iaj8ub3JpZ2luYWxVcmw7XHJcbiAgLy8gICAgICAgICAgIGlmIChvcmlnaW5hbFVybCkge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQob3JpZ2luYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkucGlwZShcclxuICAvLyAgICAgICAgICAgICAgIG1hcCgoYmxvYjogQmxvYikgPT4gKHtcclxuICAvLyAgICAgICAgICAgICAgICAgcmVzdWx0OiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLCAvLyBmb3IgcHJldmlld1xyXG4gIC8vICAgICAgICAgICAgICAgICBvcmlnaW5hbFVybFxyXG4gIC8vICAgICAgICAgICAgICAgfSkpXHJcbiAgLy8gICAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuICBcclxuICAvLyAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAvLyAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuICBcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLmZvcm1hdHRlZF07XHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAvLyAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggaW1hZ2VzIGZvciAke3VwbG9hZGVyS2V5fTpgLCBlcnIpO1xyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcbiAgXHJcblxyXG4gIC8vIHB1YmxpYyBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgLy8gICBpZiAoaW5wdXQuZmlsZXMpIHtcclxuICAvLyAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucHV0Py5maWxlcz8ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXNbaV07XHJcbiAgLy8gICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAvLyAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaCh7XHJcbiAgLy8gICAgICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgLy8gICAgICAgICAgIHJlc3VsdDogZS50YXJnZXQ/LnJlc3VsdCxcclxuICAvLyAgICAgICAgICAgbmFtZTogZmlsZT8ubmFtZSxcclxuICAvLyAgICAgICAgICAgaWQ6IHV1aWR2NCgpXHJcbiAgLy8gICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZXMpO1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2codGhpcy51cGxvYWRGaWxlQ29udHJvbCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgLy8gICBpZiAoaW5wdXQuZmlsZXMpIHtcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlc1tpXTtcclxuICAvLyAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAvLyAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XHJcbiAgLy8gICAgICAgICBjb25zdCBuZXdGaWxlID0ge1xyXG4gIC8vICAgICAgICAgICBpZDogdXVpZHY0KCksXHJcbiAgLy8gICAgICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgLy8gICAgICAgICAgIG9yaWdpbmFsVXJsOiBudWxsLFxyXG4gIC8vICAgICAgICAgICByZXN1bHQ6IGUudGFyZ2V0Py5yZXN1bHQsXHJcbiAgLy8gICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcclxuICAvLyAgICAgICAgICAgdGl0bGU6ICcnLFxyXG4gIC8vICAgICAgICAgICBub3RlczogJycsXHJcbiAgLy8gICAgICAgICAgIGNhdGVnb3J5OiAnJyxcclxuICAvLyAgICAgICAgICAgdHlwZTogdGhpcy5kZXRlY3RGaWxlVHlwZShmaWxlKSxcclxuICAvLyAgICAgICAgIH07XHJcblxyXG4gIC8vICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnB1c2gobmV3RmlsZSk7XHJcbiAgLy8gICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAvLyAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAvLyAgICAgICB9O1xyXG5cclxuICAvLyAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbi8vICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbi8vICAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkXHJcbi8vICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbi8vICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4vLyAgICAgICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuO1xyXG5cclxuLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiBhbnlbXSB9ID0ge307XHJcblxyXG4gICAgIFxyXG4vLyAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpKSB7XHJcbi8vICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygndXBsb2FkZXInKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4vLyAgICAgICAgICAgdXBsb2FkZWRGaWxlc01hcFtrZXldID0gdmFsdWU7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9XHJcblxyXG4vLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlc01hcCkpIHtcclxuLy8gICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSB1cmxzXHJcbi8vICAgICAgICAgICAuZmlsdGVyKChmaWxlT2JqOiBhbnkpID0+ICEhZmlsZU9iaikgXHJcbi8vICAgICAgICAgICAubWFwKChmaWxlT2JqOiBhbnkpID0+IHtcclxuLy8gICAgICAgICAgICAgLy8gY29uc3QgZmlsZVR5cGUgPSB0aGlzLmRldGVjdEZpbGVUeXBlRnJvbVVybChmaWxlT2JqPy5vcmlnaW5hbFVybCB8fCBmaWxlT2JqPy5uYW1lKTtcclxuXHJcbi8vICAgICAgICAgICAgIHJldHVybiB7XHJcbi8vICAgICAgICAgICAgICAgaWQ6IHV1aWR2NCgpLFxyXG4vLyAgICAgICAgICAgICAgIGZpbGU6IG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4vLyAgICAgICAgICAgICAgIG9yaWdpbmFsVXJsOiBmaWxlT2JqLm9yaWdpbmFsVXJsLCAgICBcclxuLy8gICAgICAgICAgICAgICByZXN1bHQ6IGZpbGVPYmo/LnR5cGUgPT09ICdpbWFnZScgPyBmaWxlT2JqLm9yaWdpbmFsVXJsLnByZXZpZXdVcmwgOiBudWxsLFxyXG4vLyAgICAgICAgICAgICAgIG5hbWU6IGZpbGVPYmo/Lm5hbWUgfHwgJycsXHJcbi8vICAgICAgICAgICAgICAgdGl0bGU6IGZpbGVPYmo/LnRpdGxlIHx8ICcnLFxyXG4vLyAgICAgICAgICAgICAgIG5vdGVzOiBmaWxlT2JqPy5ub3RlcyB8fCAnJyxcclxuLy8gICAgICAgICAgICAgICBjYXRlZ29yeTogZmlsZU9iaj8uY2F0ZWdvcnkgfHwgJycsXHJcbi8vICAgICAgICAgICAgICAgdHlwZTogZmlsZU9iaj8udHlwZSwgICAgICAgICAgICAgICAgXHJcbi8vICAgICAgICAgICAgIH07XHJcbi8vICAgICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgICAgaWYgKGZvcm1hdHRlZC5sZW5ndGggPiAwKSB7XHJcbi8vICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzLCAuLi5mb3JtYXR0ZWRdO1xyXG4vLyAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWREYXRhLnVwbG9hZGVkRmlsZXMgPSB0aGlzLnVwbG9hZGVkRmlsZXM7XHJcbi8vICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVDb250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0dGVkRGF0YSk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gfVxyXG5cclxubmdPbkluaXQoKTogdm9pZCB7XHJcbiAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkXHJcbiAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXZhcmlhYmxlcykgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiBhbnlbXSB9ID0ge307XHJcblxyXG4gICAgICBcclxuICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xyXG4gIGlmIChrZXkuaW5jbHVkZXMoJ3VwbG9hZGVyJykgJiYgKHZhbHVlIGFzIGFueSk/LnVwbG9hZGVkRmlsZXMpIHtcclxuICAgIHVwbG9hZGVkRmlsZXNNYXBba2V5XSA9ICh2YWx1ZSBhcyBhbnkpLnVwbG9hZGVkRmlsZXM7XHJcbiAgfVxyXG59XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgZmlsZXNdIG9mIE9iamVjdC5lbnRyaWVzKHVwbG9hZGVkRmlsZXNNYXApKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gZmlsZXNcclxuICAgICAgICAgIC5maWx0ZXIoKGZpbGVPYmo6IGFueSkgPT4gISFmaWxlT2JqKVxyXG4gICAgICAgICAgLm1hcCgoZmlsZU9iajogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVXJsT2JqID0gZmlsZU9iai5vcmlnaW5hbFVybDtcclxuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBvcmlnaW5hbFVybE9iaj8uZmlsZU5hbWUgfHwgJyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmwgPSBvcmlnaW5hbFVybE9iaj8uZmlsZVVybCB8fCAnJztcclxuICAgICAgICAgICAgY29uc3QgcHJldmlld1VybCA9IG9yaWdpbmFsVXJsT2JqPy5wcmV2aWV3VXJsO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gZmlsZU9iaj8udHlwZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRldGVjdCB0eXBlIGJhc2VkIG9uIGZpbGUgZXh0ZW5zaW9uXHJcbiAgICAgICAgICAgIC8vIGNvbnN0IGZpbGVUeXBlID0gdGhpcy5kZXRlY3RGaWxlVHlwZUZyb21VcmwoZmlsZU5hbWUgfHwgZmlsZVVybCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAgICAgICAgICAgICBmaWxlOiBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgbG9jYWxcclxuICAgICAgICAgICAgICBvcmlnaW5hbFVybDogb3JpZ2luYWxVcmxPYmosICAgICAgIC8vIGtlZXAgd2hvbGUgb2JqZWN0XHJcbiAgICAgICAgICAgICAgcmVzdWx0OiB0eXBlID09PSAnaW1hZ2UnXHJcbiAgICAgICAgICAgICAgICA/IChwcmV2aWV3VXJsKSAgICAgICAgLy8gcHJlZmVyIHByZXZpZXdVcmwsIGZhbGxiYWNrIHRvIGZpbGVVcmxcclxuICAgICAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgICAgICBuYW1lOiBmaWxlTmFtZSxcclxuICAgICAgICAgICAgICB0aXRsZTogZmlsZU9iaj8udGl0bGUgfHwgJycsXHJcbiAgICAgICAgICAgICAgbm90ZXM6IGZpbGVPYmo/Lm5vdGVzIHx8ICcnLFxyXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBmaWxlT2JqPy5jYXRlZ29yeSB8fCAnJyxcclxuICAgICAgICAgICAgICB0eXBlOiB0eXBlLCAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgdHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChmb3JtYXR0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gWy4uLnRoaXMudXBsb2FkZWRGaWxlcywgLi4uZm9ybWF0dGVkXTtcclxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkRGF0YS51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcblxyXG5cclxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIGlmICghaW5wdXQuZmlsZXMpIHJldHVybjtcclxuXHJcbiAgQXJyYXkuZnJvbShpbnB1dC5maWxlcykuZm9yRWFjaChmaWxlID0+IHtcclxuICAgIGNvbnN0IGZpbGVUeXBlID0gdGhpcy5kZXRlY3RGaWxlVHlwZShmaWxlKTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWxlOiBhbnkgPSB7XHJcbiAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAgICAgZmlsZTogZmlsZSxcclxuICAgICAgb3JpZ2luYWxVcmw6IG51bGwsXHJcbiAgICAgIHJlc3VsdDogbnVsbCwgICAgICAgICAgLy8gd2lsbCBiZSBmaWxsZWQgZm9yIGltYWdlcyBvbmx5XHJcbiAgICAgIG5hbWU6IGZpbGUubmFtZSxcclxuICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICBub3RlczogJycsXHJcbiAgICAgIGNhdGVnb3J5OiAnJyxcclxuICAgICAgdHlwZTogZmlsZVR5cGUsICAgICAgICAvLyA8LS0ga2VlcCBkZXRlY3RlZCB0eXBlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChmaWxlVHlwZSA9PT0gJ2ltYWdlJykge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XHJcbiAgICAgICAgbmV3RmlsZS5yZXN1bHQgPSBlLnRhcmdldD8ucmVzdWx0O1xyXG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKG5ld0ZpbGUpO1xyXG4gICAgICAgIHRoaXMuZm9ybWF0dGVkRGF0YS51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzO1xyXG4gICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7IC8vIG9ubHkgaW1hZ2VzIG5lZWQgcHJldmlld1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gbm9uLWltYWdlIOKGkiBwdXNoIGRpcmVjdGx5XHJcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKG5ld0ZpbGUpO1xyXG4gICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5cclxuICBvbk1ldGFDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICB9XHJcblxyXG5cclxuICAvLyBwdWJsaWMgZGVsZXRlRmlsZShpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLnVwbG9hZGVkRmlsZXMgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZT8uaWQgIT09IGlkKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGRlbGV0ZUZpbGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgW2RlbGV0ZWRGaWxlXSA9IHRoaXMudXBsb2FkZWRGaWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIFxyXG4gIC8vICAgaWYgKGRlbGV0ZWRGaWxlKSB7XHJcbiAgLy8gICAgIHRoaXMuZGVsZXRlZEZpbGVzLnB1c2goZGVsZXRlZEZpbGUpO1xyXG4gIC8vICAgICB0aGlzLmZvcm1hdHRlZERhdGEgPSB7XHJcbiAgLy8gICAgICAgLi4udGhpcy5mb3JtYXR0ZWREYXRhLFxyXG4gIC8vICAgICAgIHVwbG9hZGVkRmlsZXM6IFsuLi50aGlzLnVwbG9hZGVkRmlsZXNdLFxyXG4gIC8vICAgICAgIGRlbGV0ZWRGaWxlczogWy4uLnRoaXMuZGVsZXRlZEZpbGVzXVxyXG4gIC8vICAgICB9O1xyXG4gIC8vICAgICB0aGlzLnVwbG9hZEZpbGVDb250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0dGVkRGF0YSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBkZWxldGVGaWxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRlbGV0ZWRGaWxlID0gdGhpcy51cGxvYWRlZEZpbGVzPy5baW5kZXhdO1xyXG4gICAgaWYgKCFkZWxldGVkRmlsZSkgcmV0dXJuO1xyXG4gIFxyXG4gICAgLy8gRW5zdXJlIGZvcm1hdHRlZERhdGEgZXhpc3RzIGFuZCBpbml0aWFsaXplIGlmIHVuZGVmaW5lZFxyXG4gICAgdGhpcy5mb3JtYXR0ZWREYXRhID0gdGhpcy5mb3JtYXR0ZWREYXRhIHx8IHsgdXBsb2FkZWRGaWxlczogW10sIGRlbGV0ZWRGaWxlczogW10gfTtcclxuICBcclxuICAgIC8vIEFkZCB0aGUgZGVsZXRlZCBmaWxlIHRvIHRoZSBkZWxldGVkRmlsZXMgYXJyYXlcclxuICAgIHRoaXMuZGVsZXRlZEZpbGVzID0gWy4uLnRoaXMuZGVsZXRlZEZpbGVzLCBkZWxldGVkRmlsZV07XHJcbiAgXHJcbiAgICAvLyBSZW1vdmUgdGhlIGZpbGUgZnJvbSB1cGxvYWRlZEZpbGVzIHVzaW5nIGZpbHRlciBmb3IgaW1tdXRhYmlsaXR5XHJcbiAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XHJcbiAgXHJcbiAgICAvLyBVcGRhdGUgZm9ybWF0dGVkRGF0YVxyXG4gICAgdGhpcy5mb3JtYXR0ZWREYXRhID0ge1xyXG4gICAgICAuLi50aGlzLmZvcm1hdHRlZERhdGEsXHJcbiAgICAgIHVwbG9hZGVkRmlsZXM6IHRoaXMudXBsb2FkZWRGaWxlcyxcclxuICAgICAgZGVsZXRlZEZpbGVzOiB0aGlzLmRlbGV0ZWRGaWxlc1xyXG4gICAgfTtcclxuICBcclxuICAgIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIHVwbG9hZEZpbGVDb250cm9sXHJcbiAgICB0aGlzLnVwbG9hZEZpbGVDb250cm9sLnNldFZhbHVlKHRoaXMuZm9ybWF0dGVkRGF0YSk7XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG5cclxuICBwcm90ZWN0ZWQgc2V0dGluZ3MoKTogRnhTZXR0aW5nW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3VwbG9hZC10ZXh0JywgJHRpdGxlOiAnVXBsb2FkIFRleHQnLCB2YWx1ZTogJ1VwbG9hZCBGaWxlJ30pLFxyXG4gICAgICBuZXcgRnhTZWxlY3RTZXR0aW5nKHtrZXk6ICdtdWx0aXBsZS11cGxvYWQnLCAkdGl0bGU6ICdNdWx0aXBsZSBVcGxvYWQnLCB2YWx1ZTogZmFsc2V9LCBbe29wdGlvbjogJ0VuYWJsZScsIHZhbHVlOiB0cnVlfSwge29wdGlvbjogJ0Rpc2FibGUnLCB2YWx1ZTogZmFsc2V9XSlcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdmFsaWRhdGlvbnMoKTogRnhWYWxpZGF0aW9uW10ge1xyXG4gICAgcmV0dXJuIFtGeFZhbGlkYXRvclNlcnZpY2UucmVxdWlyZWRdO1xyXG4gIH1cclxuXHJcbiAgICBkZXRlY3RGaWxlVHlwZShmaWxlOiBGaWxlKTogJ2ltYWdlJyB8ICdjc3YnIHwgJ3RleHQnIHwgJ290aGVyJyB7XHJcbiAgICBjb25zdCBtaW1lID0gKGZpbGUudHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IG5hbWUgPSAoZmlsZS5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoJ2ltYWdlLycpIHx8IC9cXC4ocG5nfGpwZT9nfGdpZnx3ZWJwfGJtcHxzdmcpJC9pLnRlc3QobmFtZSkpIHJldHVybiAnaW1hZ2UnO1xyXG4gICAgaWYgKG1pbWUgPT09ICd0ZXh0L2NzdicgfHwgbmFtZS5lbmRzV2l0aCgnLmNzdicpKSByZXR1cm4gJ2Nzdic7XHJcbiAgICBpZiAobWltZS5zdGFydHNXaXRoKCd0ZXh0LycpIHx8IC9cXC4odHh0fG1kfHJ0Znxsb2d8anNvbnx4bWx8eWFtbHx5bWwpJC9pLnRlc3QobmFtZSkpIHJldHVybiAndGV4dCc7XHJcbiAgICByZXR1cm4gJ290aGVyJztcclxuICB9XHJcblxyXG59XHJcbiIsIjxmeC1jb21wb25lbnQgW2Z4RGF0YV09XCJmeERhdGFcIj5cclxuICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXVwbG9hZCBmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBwLTIgcGItMCByb3VuZGVkLXNtXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI5XCIgaGVpZ2h0PVwiMjhcIiB2aWV3Qm94PVwiMCAwIDI5IDI4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgZD1cIk0xNC4wMDEgMy4wMDE5NUMxMS41MzIyIDMuMDAxOTUgOS4xNjcyMiAzLjg2OTU2IDcuMjM2NDEgNS4zODQxNEw3LjIzNTk4IDQuNTk2OTVDNy4yMzU5OCA0LjUyNDczIDcuMjIxNzUgNC40NTMyMSA3LjE5NDExIDQuMzg2NDhDNy4xNjY0NyA0LjMxOTc1IDcuMTI1OTYgNC4yNTkxMiA3LjA3NDg5IDQuMjA4MDRDNy4wMjM4MSA0LjE1Njk3IDYuOTYzMTggNC4xMTY0NiA2Ljg5NjQ1IDQuMDg4ODJDNi44Mjk3MiA0LjA2MTE4IDYuNzU4MiA0LjA0Njk1IDYuNjg1OTggNC4wNDY5NUM2LjYxMzc1IDQuMDQ2OTUgNi41NDIyMyA0LjA2MTE4IDYuNDc1NSA0LjA4ODgyQzYuNDA4NzcgNC4xMTY0NiA2LjM0ODE0IDQuMTU2OTcgNi4yOTcwNyA0LjIwODA0QzYuMjQ1OTkgNC4yNTkxMiA2LjIwNTQ4IDQuMzE5NzUgNi4xNzc4NCA0LjM4NjQ4QzYuMTUwMiA0LjQ1MzIxIDYuMTM1OTggNC41MjQ3MyA2LjEzNTk4IDQuNTk2OTVMNi4xMzY0MiA2LjY4NjUyQzYuMTM2NDMgNi44MzIzOSA2LjE5NDM4IDYuOTcyMjggNi4yOTc1MiA3LjA3NTQyQzYuNDAwNjcgNy4xNzg1NiA2LjU0MDU1IDcuMjM2NTEgNi42ODY0MiA3LjIzNjUySDguNzc1OThDOC44NDgyIDcuMjM2NTIgOC45MTk3MiA3LjIyMjMgOC45ODY0NSA3LjE5NDY2QzkuMDUzMTggNy4xNjcwMiA5LjExMzgxIDcuMTI2NTEgOS4xNjQ4OSA3LjA3NTQzQzkuMjE1OTYgNy4wMjQzNiA5LjI1NjQ3IDYuOTYzNzMgOS4yODQxMSA2Ljg5N0M5LjMxMTc1IDYuODMwMjcgOS4zMjU5OCA2Ljc1ODc1IDkuMzI1OTggNi42ODY1MkM5LjMyNTk4IDYuNjE0MyA5LjMxMTc1IDYuNTQyNzggOS4yODQxMSA2LjQ3NjA1QzkuMjU2NDcgNi40MDkzMiA5LjIxNTk2IDYuMzQ4NjkgOS4xNjQ4OSA2LjI5NzYxQzkuMTEzODEgNi4yNDY1NCA5LjA1MzE4IDYuMjA2MDMgOC45ODY0NSA2LjE3ODM5QzguOTE5NzIgNi4xNTA3NSA4Ljg0ODIgNi4xMzY1MiA4Ljc3NTk4IDYuMTM2NTJIOC4wNTg0QzkuNzcwMiA0Ljg0Mzg3IDExLjgzOTkgNC4xMDE5NSAxNC4wMDEgNC4xMDE5NUMxOS40NzUxIDQuMTAxOTUgMjMuOTAxIDguNTI3ODIgMjMuOTAxIDE0LjAwMkMyMy45MDEgMTkuNDc2MSAxOS40NzUxIDIzLjkwMiAxNC4wMDEgMjMuOTAyQzguNTI2ODQgMjMuOTAyIDQuMTAwOTggMTkuNDc2MSA0LjEwMDk4IDE0LjAwMkM0LjEwMDk4IDEyLjYzODEgNC4zODI2MyAxMS4yODg4IDQuOTI4NTUgMTAuMDM4OUM0Ljk4NjkxIDkuOTA1MzIgNC45ODk4MiA5Ljc1Mzk5IDQuOTM2NjUgOS42MTgyMkM0Ljg4MzQ3IDkuNDgyNDYgNC43Nzg1NSA5LjM3MzM2IDQuNjQ0OTYgOS4zMTQ5MkM0LjU3ODc3IDkuMjg1OTYgNC41MDc1MyA5LjI3MDMyIDQuNDM1MyA5LjI2ODlDNC4zNjMwNiA5LjI2NzQ3IDQuMjkxMjYgOS4yODAzIDQuMjIzOTggOS4zMDY2M0M0LjE1NjcxIDkuMzMyOTcgNC4wOTUyOCA5LjM3MjMgNC4wNDMyMSA5LjQyMjM4QzMuOTkxMTQgOS40NzI0NyAzLjk0OTQ0IDkuNTMyMzIgMy45MjA1MSA5LjU5ODUyQzMuMzEzOTMgMTAuOTg3MiAzLjAwMDk4IDEyLjQ4NjYgMy4wMDA5OCAxNC4wMDJDMy4wMDA5OCAyMC4wNzA2IDcuOTMyMzYgMjUuMDAyIDE0LjAwMSAyNS4wMDJDMjAuMDY5NiAyNS4wMDIgMjUuMDAxIDIwLjA3MDYgMjUuMDAxIDE0LjAwMkMyNS4wMDEgNy45MzMzNCAyMC4wNjk2IDMuMDAxOTUgMTQuMDAxIDMuMDAxOTVaXCJcclxuICAgICAgICAgICAgZmlsbD1cIiNGM0EwNDFcIiAvPlxyXG4gICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICBkPVwiTTEzLjk5ODggNi4xMzk2NUM5LjY2MTYgNi4xMzk2NSA2LjEzMzc5IDkuNjY3NDYgNi4xMzM3OSAxNC4wMDQ2QzYuMTMzNzkgMTguMzQxOCA5LjY2MTYgMjEuODY5NiAxMy45OTg4IDIxLjg2OTZDMTguMzM2IDIxLjg2OTYgMjEuODYzOCAxOC4zNDE4IDIxLjg2MzggMTQuMDA0NkMyMS44NjM4IDkuNjY3NDYgMTguMzM2IDYuMTM5NjUgMTMuOTk4OCA2LjEzOTY1Wk0xMy45OTg4IDguMjI5NjVDMTQuMTQ0NyA4LjIyOTY1IDE0LjI4NDYgOC4yODc1OSAxNC4zODc3IDguMzkwNzRDMTQuNDkwOCA4LjQ5Mzg4IDE0LjU0ODggOC42MzM3OCAxNC41NDg4IDguNzc5NjVWMTMuNzc2OUwxNy41MjI3IDE2Ljc1MDhDMTcuNjI1OCAxNi44NTM5IDE3LjY4MzcgMTYuOTkzOCAxNy42ODM3IDE3LjEzOTZDMTcuNjgzNyAxNy4yODU1IDE3LjYyNTggMTcuNDI1NCAxNy41MjI3IDE3LjUyODVDMTcuNDE5NSAxNy42MzE2IDE3LjI3OTYgMTcuNjg5NiAxNy4xMzM4IDE3LjY4OTZDMTYuOTg3OSAxNy42ODk2IDE2Ljg0ODEgMTcuNjMxNiAxNi43NDQ5IDE3LjUyODVMMTMuNjA5OSAxNC4zOTM1QzEzLjUwNjggMTQuMjkwNCAxMy40NDg4IDE0LjE1MDUgMTMuNDQ4OCAxNC4wMDQ2VjguNzc5NjVDMTMuNDQ4OCA4LjYzMzc4IDEzLjUwNjcgOC40OTM4OCAxMy42MDk5IDguMzkwNzRDMTMuNzEzIDguMjg3NTkgMTMuODUyOSA4LjIyOTY1IDEzLjk5ODggOC4yMjk2NVpcIlxyXG4gICAgICAgICAgICBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI4LjU2XCIgaGVpZ2h0PVwiMjhcIiByeD1cIjEuNTE0NzlcIiBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTE1LjA2OCAyMi43MzkxVjE3LjY3MDhIMTguNDk2OEwxNC4yMTA4IDEyLjYwMjVMOS45MjQ4IDE3LjY3MDhIMTMuMzUzNlYyMi43MzkxSDkuMDY3NTlWMjIuNjk2OUM4LjkyMzU4IDIyLjcwNTMgOC43ODY0MyAyMi43MzkxIDguNjM4OTkgMjIuNzM5MUM2LjkzMzkxIDIyLjczOTEgNS4yOTg2NiAyMi4wNzE3IDQuMDkyOTggMjAuODgzNUMyLjg4NzMgMTkuNjk1NCAyLjIwOTk2IDE4LjA4NCAyLjIwOTk2IDE2LjQwMzdDMi4yMDk5NiAxMy4xNTMyIDQuNzA0NDMgMTAuNTA0MiA3LjkwNTIzIDEwLjE0MUM4LjE4NTg1IDguNjk1MyA4Ljk2ODkyIDcuMzkxMTggMTAuMTE5NyA2LjQ1MjkyQzExLjI3MDYgNS41MTQ2NSAxMi43MTcyIDUuMDAwODkgMTQuMjEwOCA1QzE1LjcwNDcgNS4wMDA4MiAxNy4xNTE1IDUuNTE0NTIgMTguMzAyNiA2LjQ1Mjc3QzE5LjQ1MzcgNy4zOTEwMSAyMC4yMzcxIDguNjk1MTYgMjAuNTE4MSAxMC4xNDFDMjMuNzE4OSAxMC41MDQyIDI2LjIxIDEzLjE1MzIgMjYuMjEgMTYuNDAzN0MyNi4yMSAxOC4wODQgMjUuNTMyNiAxOS42OTU0IDI0LjMyNjkgMjAuODgzNUMyMy4xMjEzIDIyLjA3MTcgMjEuNDg2IDIyLjczOTEgMTkuNzgwOSAyMi43MzkxQzE5LjYzNjkgMjIuNzM5MSAxOS40OTgxIDIyLjcwNTMgMTkuMzUyMyAyMi42OTY5VjIyLjczOTFIMTUuMDY4WlwiXHJcbiAgICAgICAgICAgIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCIgY2xhc3M9XCJ0ZXh0LWJhc2UgY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICB7eyBzZXR0aW5nKCd1cGxvYWQtdGV4dCcpIH19XHJcbiAgICAgIDwvYT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSA8aW5wdXQgI2ZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIFttdWx0aXBsZV09XCJzZXR0aW5nKCdtdWx0aXBsZS11cGxvYWQnKVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiIGhpZGRlbiAvPlxyXG4gICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtbGlzdCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBmbGV4LXdyYXBcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVwbG9hZGVkRmlsZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2YgdXBsb2FkZWRGaWxlczsgbGV0IGkgPSBpbmRleFwiIFxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiIChjbGljayk9XCJkZWxldGVGaWxlKGkpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsb3NlX2ljb24gY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNjgzN18yOTY4MylcIj5cclxuICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCI5XCIgZmlsbD1cIiNGM0EwNDFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bWFzayBpZD1cIm1hc2swXzY4MzdfMjk2ODNcIiBzdHlsZT1cIm1hc2stdHlwZTphbHBoYVwiIG1hc2tVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIGZpbGw9XCIjRDlEOUQ5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9tYXNrPlxyXG4gICAgICAgICAgICAgICAgICA8ZyBtYXNrPVwidXJsKCNtYXNrMF82ODM3XzI5NjgzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMjA0NSA4Ljk5ODE1TDUuODE4MDIgNi42MTE2N0w2LjYxMzUxIDUuODE2MTdMOSA4LjIwMjY2TDExLjM4NjUgNS44MTYxN0wxMi4xODIgNi42MTE2N0w5Ljc5NTUgOC45OTgxNUwxMi4xODIgMTEuMzg0NkwxMS4zODY1IDEyLjE4MDFMOSA5Ljc5MzY1TDYuNjEzNTEgMTIuMTgwMUw1LjgxODAyIDExLjM4NDZMOC4yMDQ1IDguOTk4MTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF82ODM3XzI5NjgzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCI5XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJmaWxlLXRodW1ibmFpbFwiIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogNHB4XCIgW3NyY109XCJmaWxlPy5yZXN1bHRcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtc20gbWItMVwiPlRpdGxlPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJmaWxlLnRpdGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInRpdGxle3tpfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1ldGFDaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBib3JkZXItb3JhbmdlLTMwMCByb3VuZGVkIHB4LTMgcHktMiBtYi0zIHctZnVsbCBvdXRsaW5lLW5vbmUgZm9jdXM6cmluZyBmb2N1czpyaW5nLW9yYW5nZS0yMDBcIiAvPlxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNtIG1iLTFcIj5Ob3RlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPHRleHRhcmVhIFsobmdNb2RlbCldPVwiZmlsZS5ub3Rlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJub3Rlc3t7aX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25NZXRhQ2hhbmdlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG5vdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgYm9yZGVyLW9yYW5nZS0zMDAgcm91bmRlZCBweC0zIHB5LTIgdy1mdWxsIG91dGxpbmUtbm9uZSBmb2N1czpyaW5nIGZvY3VzOnJpbmctb3JhbmdlLTIwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCIyXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8cD57e2ZpbGU/Lm5hbWV9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgPGlucHV0ICNmaWxlSW5wdXRcclxuICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgIFttdWx0aXBsZV09XCJzZXR0aW5nKCdtdWx0aXBsZS11cGxvYWQnKVwiXHJcbiAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgaGlkZGVuIC8+XHJcblxyXG48ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+PC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiZmlsZS1saXN0IGZsZXggaXRlbXMtY2VudGVyIGdhcC02IGZsZXgtd3JhcFwiICpuZ0lmPVwiZmFsc2VcIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidXBsb2FkZWRGaWxlcz8ubGVuZ3RoXCI+XHJcbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIHVwbG9hZGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgcC0zIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBiZy13aGl0ZSB3LTY0XCI+XHJcbiAgICAgICAgPCEtLSBDbG9zZSBpY29uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZV9pY29uIGN1cnNvci1wb2ludGVyIGFic29sdXRlIHRvcC0yIHJpZ2h0LTJcIiAoY2xpY2spPVwiZGVsZXRlRmlsZShpKVwiPlxyXG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiOVwiIGZpbGw9XCIjRjNBMDQxXCIgLz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk04LjIgOWwtMi40LTIuNC44LS44TDkgOC4ybDIuNC0yLjQuOC44TDkuOCA5bDIuNCAyLjQtLjguOEw5IDkuOGwtMi40IDIuNC0uOC0uOEw4LjIgOXpcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBUaHVtYm5haWwgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbGUudHlwZSA9PT0gJ2ltYWdlJzsgZWxzZSBub25JbWFnZVRodW1iXCI+XHJcbiAgICAgICAgICA8aW1nIGNsYXNzPVwiZmlsZS10aHVtYm5haWwgdy1mdWxsIGgtMzIgb2JqZWN0LWNvdmVyIHJvdW5kZWQgbWItM1wiXHJcbiAgICAgICAgICAgICAgIFtzcmNdPVwiZmlsZT8ucmVzdWx0XCJcclxuICAgICAgICAgICAgICAgYWx0PVwicHJldmlld1wiIC8+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9uSW1hZ2VUaHVtYj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLXRodW1ibmFpbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXIgcm91bmRlZCBtYi0zIHctZnVsbCBoLTMyIGJnLWdyYXktNTBcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZmlsZS50eXBlXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBDU1YgLS0+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2NzdidcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgdmlld0JveD1cIjAgMCA0OCA0OFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiOFwiIHk9XCI2XCIgd2lkdGg9XCIyOFwiIGhlaWdodD1cIjM2XCIgcng9XCIzXCIgc3Ryb2tlPVwiIzIyYzU1ZVwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI4IDZ2OGEyIDIgMCAwIDAgMiAyaDZcIiBzdHJva2U9XCIjMjJjNTVlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cclxuICAgICAgICAgICAgICAgIDx0ZXh0IHg9XCIxNFwiIHk9XCIzNFwiIGZvbnQtc2l6ZT1cIjEwXCIgZm9udC1mYW1pbHk9XCJtb25vc3BhY2VcIiBmaWxsPVwiIzIyYzU1ZVwiPkNTVjwvdGV4dD5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBURVhUIC0tPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI4XCIgeT1cIjZcIiB3aWR0aD1cIjI4XCIgaGVpZ2h0PVwiMzZcIiByeD1cIjNcIiBzdHJva2U9XCIjM2I4MmY2XCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjggNnY4YTIgMiAwIDAgMCAyIDJoNlwiIHN0cm9rZT1cIiMzYjgyZjZcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAyNGgyME0xNCAyOWgyME0xNCAzNGgxMlwiIHN0cm9rZT1cIiMzYjgyZjZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBHZW5lcmljIC0tPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoRGVmYXVsdCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgdmlld0JveD1cIjAgMCA0OCA0OFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiOFwiIHk9XCI2XCIgd2lkdGg9XCIyOFwiIGhlaWdodD1cIjM2XCIgcng9XCIzXCIgc3Ryb2tlPVwiIzljYTNhZlwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI4IDZ2OGEyIDIgMCAwIDAgMiAyaDZcIiBzdHJva2U9XCIjOWNhM2FmXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYgMzBoMTZcIiBzdHJva2U9XCIjOWNhM2FmXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPCEtLSBNZXRhZGF0YSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGxcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1zbSBtYi0xXCI+VGl0bGU8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiZmlsZS50aXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgbmFtZT1cInRpdGxle3tpfX1cIlxyXG4gICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWV0YUNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHRpdGxlXCJcclxuICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBib3JkZXItb3JhbmdlLTMwMCByb3VuZGVkIHB4LTMgcHktMiBtYi0zIHctZnVsbCBvdXRsaW5lLW5vbmUgZm9jdXM6cmluZyBmb2N1czpyaW5nLW9yYW5nZS0yMDBcIiAvPlxyXG5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1zbSBtYi0xXCI+Tm90ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgPHRleHRhcmVhIFsobmdNb2RlbCldPVwiZmlsZS5ub3Rlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm5vdGVze3tpfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWV0YUNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG5vdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlciBib3JkZXItb3JhbmdlLTMwMCByb3VuZGVkIHB4LTMgcHktMiB3LWZ1bGwgb3V0bGluZS1ub25lIGZvY3VzOnJpbmcgZm9jdXM6cmluZy1vcmFuZ2UtMjAwXCJcclxuICAgICAgICAgICAgICAgICAgICByb3dzPVwiMlwiPjwvdGV4dGFyZWE+XHJcblxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNtIG10LTMgbWItMVwiPkNhdGVnb3J5PC9sYWJlbD5cclxuICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJmaWxlLmNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgbmFtZT1cImNhdGVnb3J5e3tpfX1cIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1ldGFDaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBDYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIGJvcmRlci1vcmFuZ2UtMzAwIHJvdW5kZWQgcHgtMyBweS0yIHctZnVsbCBvdXRsaW5lLW5vbmUgZm9jdXM6cmluZyBmb2N1czpyaW5nLW9yYW5nZS0yMDBcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjYXRlZ29yaWVzXCIgW25nVmFsdWVdPVwiY1wiPnt7IGMgfX08L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxwIGNsYXNzPVwibXQtMiB0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj57eyBmaWxlPy5uYW1lIH19PC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImZpbGUtbGlzdCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtOCBmbGV4LXdyYXBcIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidXBsb2FkZWRGaWxlcz8ubGVuZ3RoXCI+XHJcbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIHVwbG9hZGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHAtMyBib3JkZXIgcm91bmRlZC1sZyBzaGFkb3ctc20gYmctd2hpdGUgdy1bNTAwcHhdIGZsZXhcIj5cclxuXHJcbiAgICAgIDwhLS0gQ2xvc2UgaWNvbiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNsb3NlX2ljb24gY3Vyc29yLXBvaW50ZXIgYWJzb2x1dGUgdG9wLTIgcmlnaHQtMlwiIChjbGljayk9XCJkZWxldGVGaWxlKGkpXCI+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjlcIiBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTguMiA5bC0yLjQtMi40LjgtLjhMOSA4LjJsMi40LTIuNC44LjhMOS44IDlsMi40IDIuNC0uOC44TDkgOS44bC0yLjQgMi40LS44LS44TDguMiA5elwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBUaHVtYm5haWwgb24gbGVmdCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInctMjggaC0yOCBmbGV4LXNocmluay0wXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbGUudHlwZSA9PT0gJ2ltYWdlJzsgZWxzZSBub25JbWFnZVRodW1iXCI+XHJcbiAgICAgICAgICA8aW1nIGNsYXNzPVwiZmlsZS10aHVtYm5haWwgdy1mdWxsIGgtZnVsbCBvYmplY3QtY292ZXIgcm91bmRlZFwiXHJcbiAgICAgICAgICAgICAgIFtzcmNdPVwiZmlsZT8ucmVzdWx0XCJcclxuICAgICAgICAgICAgICAgYWx0PVwicHJldmlld1wiIC8+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9uSW1hZ2VUaHVtYj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLXRodW1ibmFpbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXIgcm91bmRlZCB3LWZ1bGwgaC1mdWxsIGJnLWdyYXktNTBcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZmlsZS50eXBlXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBDU1YgLS0+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2NzdidcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgdmlld0JveD1cIjAgMCA0OCA0OFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB4PVwiOFwiIHk9XCI2XCIgd2lkdGg9XCIyOFwiIGhlaWdodD1cIjM2XCIgcng9XCIzXCIgc3Ryb2tlPVwiIzIyYzU1ZVwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI4IDZ2OGEyIDIgMCAwIDAgMiAyaDZcIiBzdHJva2U9XCIjMjJjNTVlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cclxuICAgICAgICAgICAgICAgIDx0ZXh0IHg9XCIxNFwiIHk9XCIzNFwiIGZvbnQtc2l6ZT1cIjEwXCIgZm9udC1mYW1pbHk9XCJtb25vc3BhY2VcIiBmaWxsPVwiIzIyYzU1ZVwiPkNTVjwvdGV4dD5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8IS0tIFRFWFQgLS0+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHZpZXdCb3g9XCIwIDAgNDggNDhcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjhcIiB5PVwiNlwiIHdpZHRoPVwiMjhcIiBoZWlnaHQ9XCIzNlwiIHJ4PVwiM1wiIHN0cm9rZT1cIiMzYjgyZjZcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yOCA2djhhMiAyIDAgMCAwIDIgMmg2XCIgc3Ryb2tlPVwiIzNiODJmNlwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDI0aDIwTTE0IDI5aDIwTTE0IDM0aDEyXCIgc3Ryb2tlPVwiIzNiODJmNlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwhLS0gR2VuZXJpYyAtLT5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaERlZmF1bHQgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHZpZXdCb3g9XCIwIDAgNDggNDhcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjhcIiB5PVwiNlwiIHdpZHRoPVwiMjhcIiBoZWlnaHQ9XCIzNlwiIHJ4PVwiM1wiIHN0cm9rZT1cIiM5Y2EzYWZcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yOCA2djhhMiAyIDAgMCAwIDIgMmg2XCIgc3Ryb2tlPVwiIzljYTNhZlwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE2IDMwaDE2XCIgc3Ryb2tlPVwiIzljYTNhZlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBNZXRhZGF0YSBvbiByaWdodCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC0xIG1sLTRcIj5cclxuICAgICAgICA8IS0tIFRpdGxlIC0tPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1zbSBtYi0xXCI+VGl0bGU8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImZpbGUudGl0bGVcIlxyXG4gICAgICAgICAgICAgICBuYW1lPVwidGl0bGV7e2l9fVwiXHJcbiAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWV0YUNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0aXRsZVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIGJvcmRlci1vcmFuZ2UtMzAwIHJvdW5kZWQgcHgtMyBweS0yIG1iLTMgdy1mdWxsIG91dGxpbmUtbm9uZSBmb2N1czpyaW5nIGZvY3VzOnJpbmctb3JhbmdlLTIwMFwiIC8+XHJcblxyXG4gICAgICAgIDwhLS0gTm90ZXMgLS0+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNtIG1iLTFcIj5Ob3RlczwvbGFiZWw+XHJcbiAgICAgICAgPHRleHRhcmVhIFsobmdNb2RlbCldPVwiZmlsZS5ub3Rlc1wiXHJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJub3Rlc3t7aX19XCJcclxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25NZXRhQ2hhbmdlKClcIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG5vdGVzXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgYm9yZGVyLW9yYW5nZS0zMDAgcm91bmRlZCBweC0zIHB5LTIgbWItMyB3LWZ1bGwgb3V0bGluZS1ub25lIGZvY3VzOnJpbmcgZm9jdXM6cmluZy1vcmFuZ2UtMjAwXCJcclxuICAgICAgICAgICAgICAgICAgcm93cz1cIjJcIj48L3RleHRhcmVhPlxyXG5cclxuICAgICAgICA8IS0tIENhdGVnb3J5IC0tPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1zbSBtYi0xXCI+Q2F0ZWdvcnk8L2xhYmVsPlxyXG4gICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJmaWxlLmNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgIG5hbWU9XCJjYXRlZ29yeXt7aX19XCJcclxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWV0YUNoYW5nZSgpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIGJvcmRlci1vcmFuZ2UtMzAwIHJvdW5kZWQgcHgtMyBweS0yIHctZnVsbCBvdXRsaW5lLW5vbmUgZm9jdXM6cmluZyBmb2N1czpyaW5nLW9yYW5nZS0yMDBcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgQ2F0ZWdvcnk8L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGMgb2YgY2F0ZWdvcmllc1wiIFtuZ1ZhbHVlXT1cImNcIj57eyBjIH19PC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG4gIDwvZGl2PlxyXG48L2Z4LWNvbXBvbmVudD4iXX0=