cax-design-system 2.7.0 → 2.7.2

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.
@@ -11,24 +11,37 @@ export class UploadComponent {
11
11
  uploadString = 'uploading the file';
12
12
  errorText = 'Please upload a file';
13
13
  allowMultiple = true;
14
+ componentId = '';
15
+ allowedFileTypes = [];
14
16
  // Enhanced event emitters
15
17
  fileSelected = new EventEmitter();
16
- filesQueued = new EventEmitter(); // Emit when files are queued for upload
18
+ filesQueued = new EventEmitter();
17
19
  uploadStarted = new EventEmitter();
18
20
  uploadCompleted = new EventEmitter();
19
- uploadCanceled = new EventEmitter(); // When user cancels an upload
20
- uploadError = new EventEmitter(); // When upload fails
21
- fileRemoved = new EventEmitter(); // When a file is removed from the list
22
- allFilesRemoved = new EventEmitter(); // When all files are cleared
23
- uploadStatusChange = new EventEmitter(); // Status changes
21
+ uploadCanceled = new EventEmitter();
22
+ uploadError = new EventEmitter();
23
+ fileRemoved = new EventEmitter();
24
+ allFilesRemoved = new EventEmitter();
25
+ uploadStatusChange = new EventEmitter();
24
26
  isDragging = false;
25
27
  uploadedFiles = [];
26
28
  uploadStatus = 'idle';
27
29
  isProcessingQueue = false;
30
+ uniqueId = '';
31
+ // Computed property for accept attribute in file input
32
+ get acceptFileTypes() {
33
+ if (!this.allowedFileTypes || this.allowedFileTypes.length === 0)
34
+ return '';
35
+ return this.allowedFileTypes.map((type) => `.${type}`).join(',');
36
+ }
28
37
  // Track actual files to process (excludes canceled ones)
29
38
  get activeFilesCount() {
30
39
  return this.uploadedFiles.filter((file) => file.status !== 'canceled').length;
31
40
  }
41
+ ngOnInit() {
42
+ // Generate unique ID if not provided through input
43
+ this.uniqueId = this.componentId || `upload-${Math.random().toString(36).substring(2, 11)}`;
44
+ }
32
45
  onDragOver(event) {
33
46
  event.preventDefault();
34
47
  event.stopPropagation();
@@ -47,13 +60,7 @@ export class UploadComponent {
47
60
  if (!files || files.length === 0)
48
61
  return;
49
62
  const fileArray = Array.from(files);
50
- const validFiles = fileArray.filter((file) => {
51
- if (file.size > this.maxFileSize * 1024 * 1024) {
52
- this.emitError(file, `File size should be less than ${this.maxFileSize}MB`);
53
- return false;
54
- }
55
- return true;
56
- });
63
+ const validFiles = fileArray.filter((file) => this.validateFile(file));
57
64
  // Queue all files for upload
58
65
  validFiles.forEach((file) => this.queueFile(file));
59
66
  // Emit the queued files event
@@ -70,13 +77,7 @@ export class UploadComponent {
70
77
  if (!files)
71
78
  return;
72
79
  const fileArray = Array.from(files);
73
- const validFiles = fileArray.filter((file) => {
74
- if (file.size > this.maxFileSize * 1024 * 1024) {
75
- this.emitError(file, `File size should be less than ${this.maxFileSize}MB`);
76
- return false;
77
- }
78
- return true;
79
- });
80
+ const validFiles = fileArray.filter((file) => this.validateFile(file));
80
81
  // Queue all files for upload
81
82
  validFiles.forEach((file) => this.queueFile(file));
82
83
  // Emit the queued files event
@@ -88,6 +89,27 @@ export class UploadComponent {
88
89
  this.processQueue();
89
90
  }
90
91
  }
92
+ // New method for file validation
93
+ validateFile(file) {
94
+ // Size validation
95
+ if (file.size > this.maxFileSize * 1024 * 1024) {
96
+ this.emitError(file, `File size should be less than ${this.maxFileSize}MB`);
97
+ return false;
98
+ }
99
+ // File type validation
100
+ if (this.allowedFileTypes.length > 0) {
101
+ const fileExtension = this.getFileExtension(file.name).toLowerCase();
102
+ if (!this.allowedFileTypes.includes(fileExtension)) {
103
+ this.emitError(file, `Only ${this.allowedFileTypes.join(', ')} files are allowed`);
104
+ return false;
105
+ }
106
+ }
107
+ return true;
108
+ }
109
+ // Helper method to get file extension
110
+ getFileExtension(filename) {
111
+ return filename.split('.').pop() || '';
112
+ }
91
113
  // Queue a file for upload
92
114
  queueFile(file) {
93
115
  const uploadEntry = {
@@ -128,7 +150,7 @@ export class UploadComponent {
128
150
  }
129
151
  // Trigger file input click programmatically
130
152
  openFileSelector() {
131
- const fileInput = document.getElementById('fileInput');
153
+ const fileInput = document.getElementById(`fileInput-${this.uniqueId}`);
132
154
  if (fileInput) {
133
155
  fileInput.click();
134
156
  }
@@ -153,7 +175,6 @@ export class UploadComponent {
153
175
  break;
154
176
  }
155
177
  fileEntry.progress = progress;
156
- //this.uploadProgress.emit({ file: fileEntry.file, progress });
157
178
  // Simulate network delay
158
179
  await new Promise((resolve) => setTimeout(resolve, 200));
159
180
  }
@@ -249,21 +270,6 @@ export class UploadComponent {
249
270
  this.uploadedFiles = [];
250
271
  this.updateUploadStatus('idle');
251
272
  }
252
- // Retry a failed upload
253
- retryUpload(index) {
254
- const fileToRetry = this.uploadedFiles[index];
255
- if (fileToRetry) {
256
- const currentStatus = fileToRetry.status;
257
- if (currentStatus === 'error' || currentStatus === 'canceled') {
258
- fileToRetry.status = 'queued';
259
- fileToRetry.errorMessage = undefined;
260
- // Start processing if not already doing so
261
- if (!this.isProcessingQueue) {
262
- this.processQueue();
263
- }
264
- }
265
- }
266
- }
267
273
  get hasUploading() {
268
274
  return this.uploadedFiles.some((file) => file.status === 'uploading');
269
275
  }
@@ -305,11 +311,13 @@ export class UploadComponent {
305
311
  return activeFilesCount > 0 ? Math.round((totalProgress / (activeFilesCount * 100)) * 100) : 0;
306
312
  }
307
313
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
308
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: UploadComponent, selector: "cax-upload", inputs: { invalid: "invalid", style: "style", maxFileSize: "maxFileSize", inputFiles: "inputFiles", uploadString: "uploadString", errorText: "errorText", allowMultiple: "allowMultiple" }, outputs: { fileSelected: "fileSelected", filesQueued: "filesQueued", uploadStarted: "uploadStarted", uploadCompleted: "uploadCompleted", uploadCanceled: "uploadCanceled", uploadError: "uploadError", fileRemoved: "fileRemoved", allFilesRemoved: "allFilesRemoved", uploadStatusChange: "uploadStatusChange" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, ngImport: i0, template: "<p class=\"cax-files\">{{inputFiles}}</p>\r\n<div class=\"cax-upload-menu\" [ngStyle]=\"style\"\r\n [class.dragging]=\"isDragging\" \r\n (click)=\"openFileSelector()\">\r\n <input\r\n id=\"fileInput\"\r\n type=\"file\"\r\n (change)=\"handleFileInput($event)\"\r\n hidden\r\n multiple\r\n >\r\n\r\n <!-- Default Upload State -->\r\n <ng-container *ngIf=\"uploadStatus === 'idle'\" >\r\n <div class=\"cax-upload-options\" >\r\n <p class=\"hint-text\">\r\n <span class=\"drop-files\">Drop files here</span> or browse files from your device\r\n </p>\r\n <p class=\"max-size\">Max. File Size: {{ maxFileSize }}MB</p>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- Uploading State -->\r\n<div *ngIf=\"uploadStatus === 'uploading'\" class=\"cax-upload-status uploading\" >\r\n <div class=\"status-container\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'lg'\"\r\n [animationDuration]=\"'2s'\"\r\n ></cax-progressSpinner>\r\n <p >{{ uploadingProgressText }}</p>\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"cancelCurrentUpload(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n <!-- Complete State -->\r\n <div *ngIf=\"uploadStatus === 'complete'\" class=\"cax-upload-status complete\">\r\n <div class=\"status-container\">\r\n <div class=\"success-icon\"><i class=\"cax cax-check\"></i></div>\r\n <p>{{uploadString}}</p>\r\n <cax-button\r\n [label]=\"'Remove'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"removeAllFiles(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n <div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\"></div>\r\n</div>\r\n<div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\">\r\n {{ errorText }}\r\n</div>\r\n\r\n<!-- stacked file -->\r\n<div *ngIf=\"uploadedFiles.length > 0\" class=\"cax-file-preview-wrapper\" [ngStyle]=\"style\">\r\n <div\r\n *ngFor=\"let item of uploadedFiles; let i = index\"\r\n class=\"cax-file-preview\"\r\n [ngClass]=\"{\r\n 'queued': item.status === 'queued',\r\n 'uploading': item.status === 'uploading',\r\n 'complete': item.status === 'complete',\r\n 'canceled': item.status === 'canceled'\r\n }\"\r\n >\r\n <div class=\"file-info\">\r\n <p class=\"file-name\">{{ item.file.name }}</p>\r\n </div> \r\n\r\n <!-- Show spinner for queued or uploading files -->\r\n <div *ngIf=\"item.status === 'queued' || item.status === 'uploading'\" class=\"spinner\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'sm'\"\r\n [animationDuration]=\"'2s'\">\r\n </cax-progressSpinner>\r\n </div>\r\n \r\n <!-- Show remove button only for complete or canceled files -->\r\n <button\r\n *ngIf=\"item.status === 'complete' || item.status === 'canceled'\"\r\n class=\"remove-button\"\r\n (click)=\"removeFile(i); $event.stopPropagation()\">\r\n <i class=\"cax cax-close\"></i> \r\n </button>\r\n </div>\r\n</div>", styles: ["@layer cax{.cax-files{font-size:14px;font-weight:500;margin-bottom:10px}.cax-upload-menu{width:569px;border-radius:12px;padding:24px 56px}.status-container{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:16px;height:150px}.status-container p{margin:0;font-size:14px;font-weight:500}.status-container .success-icon{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center}.status-container .success-icon i{font-size:1.5rem;font-weight:800}.cax-upload-options{text-align:center}.cax-upload-options .hint-text{font-size:14px;font-weight:500}.cax-upload-options .drop-files{font-weight:500;font-size:14px}.cax-upload-options .max-size{font-size:12px;margin-bottom:20px;font-weight:400}.cax-error-upload{font-size:14px;font-weight:400;padding-top:8px}.cax-options-container{display:flex;gap:24px;justify-content:center}.cax-upload-option{display:flex;flex-direction:column;align-items:center;cursor:pointer}.cax-upload-option .icon-container{width:48px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cax-upload-option span{font-size:14px;font-weight:600;padding-top:10px}.cax-file-preview-wrapper{display:flex;flex-direction:column;gap:10px;margin-top:1rem;width:569px}.cax-file-preview{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:8px}.cax-file-preview .file-info{display:flex;align-items:center;gap:10px}.cax-file-preview .file-info .file-icon img{width:32px;height:32px}.cax-file-preview .file-info .file-name{font-weight:500;font-size:14px}.cax-file-preview .spinner{margin-left:auto;font-size:20px!important}.cax-file-preview .remove-button{background:none;border:none;margin-left:auto;cursor:pointer}.cax-file-preview .remove-button i{font-size:20px}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.ProgressSpinner, selector: "cax-progressSpinner", inputs: ["styleClass", "strokeColor", "backgroundStrokeColor", "size", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i3.Button, selector: "cax-button", inputs: ["type", "iconPos", "icon", "badge", "rightIcon", "leftIcon", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }] });
314
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: UploadComponent, selector: "cax-upload", inputs: { invalid: "invalid", style: "style", maxFileSize: "maxFileSize", inputFiles: "inputFiles", uploadString: "uploadString", errorText: "errorText", allowMultiple: "allowMultiple", componentId: "componentId", allowedFileTypes: "allowedFileTypes" }, outputs: { fileSelected: "fileSelected", filesQueued: "filesQueued", uploadStarted: "uploadStarted", uploadCompleted: "uploadCompleted", uploadCanceled: "uploadCanceled", uploadError: "uploadError", fileRemoved: "fileRemoved", allFilesRemoved: "allFilesRemoved", uploadStatusChange: "uploadStatusChange" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" }, classAttribute: "cax-element" }, ngImport: i0, template: "<p class=\"cax-files\">{{inputFiles}}</p>\r\n<div class=\"cax-upload-menu\" [ngStyle]=\"style\"\r\n [class.dragging]=\"isDragging\" \r\n (click)=\"openFileSelector()\">\r\n <input\r\n type=\"file\"\r\n id=\"fileInput-{{uniqueId}}\"\r\n style=\"display:none\"\r\n [multiple]=\"allowMultiple\"\r\n [accept]=\"acceptFileTypes\"\r\n (change)=\"handleFileInput($event)\"\r\n />\r\n\r\n <!-- Default Upload State -->\r\n <ng-container *ngIf=\"uploadStatus === 'idle'\" >\r\n <div class=\"cax-upload-options\" >\r\n <p class=\"hint-text\">\r\n <span class=\"drop-files\">Drop files here</span> or browse files from your device\r\n </p>\r\n <p class=\"max-size\">Max. File Size: {{ maxFileSize }}MB</p>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- Uploading State -->\r\n<div *ngIf=\"uploadStatus === 'uploading'\" class=\"cax-upload-status uploading\" >\r\n <div class=\"status-container\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'lg'\"\r\n [animationDuration]=\"'2s'\"\r\n ></cax-progressSpinner>\r\n <p >{{ uploadingProgressText }}</p>\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"cancelCurrentUpload(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n <!-- Complete State -->\r\n <div *ngIf=\"uploadStatus === 'complete'\" class=\"cax-upload-status complete\">\r\n <div class=\"status-container\">\r\n <div class=\"success-icon\"><i class=\"cax cax-check\"></i></div>\r\n <p>{{uploadString}}</p>\r\n <cax-button\r\n [label]=\"'Remove'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"removeAllFiles(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n <div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\"></div>\r\n</div>\r\n<div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\">\r\n {{ errorText }}\r\n</div>\r\n\r\n<!-- stacked file -->\r\n<div *ngIf=\"uploadedFiles.length > 0\" class=\"cax-file-preview-wrapper\" [ngStyle]=\"style\">\r\n <div\r\n *ngFor=\"let item of uploadedFiles; let i = index\"\r\n class=\"cax-file-preview\"\r\n [ngClass]=\"{\r\n 'queued': item.status === 'queued',\r\n 'uploading': item.status === 'uploading',\r\n 'complete': item.status === 'complete',\r\n 'canceled': item.status === 'canceled'\r\n }\"\r\n >\r\n <div class=\"file-info\">\r\n <p class=\"file-name\">{{ item.file.name }}</p>\r\n </div> \r\n\r\n <!-- Show spinner for queued or uploading files -->\r\n <div *ngIf=\"item.status === 'queued' || item.status === 'uploading'\" class=\"spinner\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'sm'\"\r\n [animationDuration]=\"'2s'\">\r\n </cax-progressSpinner>\r\n </div>\r\n \r\n <!-- Show remove button only for complete or canceled files -->\r\n <button\r\n *ngIf=\"item.status === 'complete' || item.status === 'canceled'\"\r\n class=\"remove-button\"\r\n (click)=\"removeFile(i); $event.stopPropagation()\">\r\n <i class=\"cax cax-close\"></i> \r\n </button>\r\n </div>\r\n</div>", styles: ["@layer cax{.cax-files{font-size:14px;font-weight:500;margin-bottom:10px}.cax-upload-menu{border-radius:12px;padding:24px 56px}.status-container{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:16px;height:150px}.status-container p{margin:0;font-size:14px;font-weight:500}.status-container .success-icon{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center}.status-container .success-icon i{font-size:1.5rem;font-weight:800}.cax-upload-options{text-align:center}.cax-upload-options .hint-text{font-size:14px;font-weight:500}.cax-upload-options .drop-files{font-weight:500;font-size:14px}.cax-upload-options .max-size{font-size:12px;margin-bottom:20px;font-weight:400}.cax-error-upload{font-size:14px;font-weight:400;padding-top:8px}.cax-options-container{display:flex;gap:24px;justify-content:center}.cax-upload-option{display:flex;flex-direction:column;align-items:center;cursor:pointer}.cax-upload-option .icon-container{width:48px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cax-upload-option span{font-size:14px;font-weight:600;padding-top:10px}.cax-file-preview-wrapper{display:flex;flex-direction:column;gap:10px;margin-top:1rem}.cax-file-preview{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:8px}.cax-file-preview .file-info{display:flex;align-items:center;gap:10px}.cax-file-preview .file-info .file-icon img{width:32px;height:32px}.cax-file-preview .file-info .file-name{font-weight:500;font-size:14px}.cax-file-preview .spinner{margin-left:auto;font-size:20px!important}.cax-file-preview .remove-button{background:none;border:none;margin-left:auto;cursor:pointer}.cax-file-preview .remove-button i{font-size:20px}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.ProgressSpinner, selector: "cax-progressSpinner", inputs: ["styleClass", "strokeColor", "backgroundStrokeColor", "size", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i3.Button, selector: "cax-button", inputs: ["type", "iconPos", "icon", "badge", "rightIcon", "leftIcon", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }] });
309
315
  }
310
316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UploadComponent, decorators: [{
311
317
  type: Component,
312
- args: [{ selector: 'cax-upload', template: "<p class=\"cax-files\">{{inputFiles}}</p>\r\n<div class=\"cax-upload-menu\" [ngStyle]=\"style\"\r\n [class.dragging]=\"isDragging\" \r\n (click)=\"openFileSelector()\">\r\n <input\r\n id=\"fileInput\"\r\n type=\"file\"\r\n (change)=\"handleFileInput($event)\"\r\n hidden\r\n multiple\r\n >\r\n\r\n <!-- Default Upload State -->\r\n <ng-container *ngIf=\"uploadStatus === 'idle'\" >\r\n <div class=\"cax-upload-options\" >\r\n <p class=\"hint-text\">\r\n <span class=\"drop-files\">Drop files here</span> or browse files from your device\r\n </p>\r\n <p class=\"max-size\">Max. File Size: {{ maxFileSize }}MB</p>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- Uploading State -->\r\n<div *ngIf=\"uploadStatus === 'uploading'\" class=\"cax-upload-status uploading\" >\r\n <div class=\"status-container\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'lg'\"\r\n [animationDuration]=\"'2s'\"\r\n ></cax-progressSpinner>\r\n <p >{{ uploadingProgressText }}</p>\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"cancelCurrentUpload(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n <!-- Complete State -->\r\n <div *ngIf=\"uploadStatus === 'complete'\" class=\"cax-upload-status complete\">\r\n <div class=\"status-container\">\r\n <div class=\"success-icon\"><i class=\"cax cax-check\"></i></div>\r\n <p>{{uploadString}}</p>\r\n <cax-button\r\n [label]=\"'Remove'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"removeAllFiles(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n <div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\"></div>\r\n</div>\r\n<div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\">\r\n {{ errorText }}\r\n</div>\r\n\r\n<!-- stacked file -->\r\n<div *ngIf=\"uploadedFiles.length > 0\" class=\"cax-file-preview-wrapper\" [ngStyle]=\"style\">\r\n <div\r\n *ngFor=\"let item of uploadedFiles; let i = index\"\r\n class=\"cax-file-preview\"\r\n [ngClass]=\"{\r\n 'queued': item.status === 'queued',\r\n 'uploading': item.status === 'uploading',\r\n 'complete': item.status === 'complete',\r\n 'canceled': item.status === 'canceled'\r\n }\"\r\n >\r\n <div class=\"file-info\">\r\n <p class=\"file-name\">{{ item.file.name }}</p>\r\n </div> \r\n\r\n <!-- Show spinner for queued or uploading files -->\r\n <div *ngIf=\"item.status === 'queued' || item.status === 'uploading'\" class=\"spinner\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'sm'\"\r\n [animationDuration]=\"'2s'\">\r\n </cax-progressSpinner>\r\n </div>\r\n \r\n <!-- Show remove button only for complete or canceled files -->\r\n <button\r\n *ngIf=\"item.status === 'complete' || item.status === 'canceled'\"\r\n class=\"remove-button\"\r\n (click)=\"removeFile(i); $event.stopPropagation()\">\r\n <i class=\"cax cax-close\"></i> \r\n </button>\r\n </div>\r\n</div>", styles: ["@layer cax{.cax-files{font-size:14px;font-weight:500;margin-bottom:10px}.cax-upload-menu{width:569px;border-radius:12px;padding:24px 56px}.status-container{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:16px;height:150px}.status-container p{margin:0;font-size:14px;font-weight:500}.status-container .success-icon{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center}.status-container .success-icon i{font-size:1.5rem;font-weight:800}.cax-upload-options{text-align:center}.cax-upload-options .hint-text{font-size:14px;font-weight:500}.cax-upload-options .drop-files{font-weight:500;font-size:14px}.cax-upload-options .max-size{font-size:12px;margin-bottom:20px;font-weight:400}.cax-error-upload{font-size:14px;font-weight:400;padding-top:8px}.cax-options-container{display:flex;gap:24px;justify-content:center}.cax-upload-option{display:flex;flex-direction:column;align-items:center;cursor:pointer}.cax-upload-option .icon-container{width:48px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cax-upload-option span{font-size:14px;font-weight:600;padding-top:10px}.cax-file-preview-wrapper{display:flex;flex-direction:column;gap:10px;margin-top:1rem;width:569px}.cax-file-preview{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:8px}.cax-file-preview .file-info{display:flex;align-items:center;gap:10px}.cax-file-preview .file-info .file-icon img{width:32px;height:32px}.cax-file-preview .file-info .file-name{font-weight:500;font-size:14px}.cax-file-preview .spinner{margin-left:auto;font-size:20px!important}.cax-file-preview .remove-button{background:none;border:none;margin-left:auto;cursor:pointer}.cax-file-preview .remove-button i{font-size:20px}}\n"] }]
318
+ args: [{ selector: 'cax-upload', host: {
319
+ class: 'cax-element'
320
+ }, template: "<p class=\"cax-files\">{{inputFiles}}</p>\r\n<div class=\"cax-upload-menu\" [ngStyle]=\"style\"\r\n [class.dragging]=\"isDragging\" \r\n (click)=\"openFileSelector()\">\r\n <input\r\n type=\"file\"\r\n id=\"fileInput-{{uniqueId}}\"\r\n style=\"display:none\"\r\n [multiple]=\"allowMultiple\"\r\n [accept]=\"acceptFileTypes\"\r\n (change)=\"handleFileInput($event)\"\r\n />\r\n\r\n <!-- Default Upload State -->\r\n <ng-container *ngIf=\"uploadStatus === 'idle'\" >\r\n <div class=\"cax-upload-options\" >\r\n <p class=\"hint-text\">\r\n <span class=\"drop-files\">Drop files here</span> or browse files from your device\r\n </p>\r\n <p class=\"max-size\">Max. File Size: {{ maxFileSize }}MB</p>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <!-- Uploading State -->\r\n<div *ngIf=\"uploadStatus === 'uploading'\" class=\"cax-upload-status uploading\" >\r\n <div class=\"status-container\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'lg'\"\r\n [animationDuration]=\"'2s'\"\r\n ></cax-progressSpinner>\r\n <p >{{ uploadingProgressText }}</p>\r\n <cax-button\r\n [label]=\"'Cancel'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"cancelCurrentUpload(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n <!-- Complete State -->\r\n <div *ngIf=\"uploadStatus === 'complete'\" class=\"cax-upload-status complete\">\r\n <div class=\"status-container\">\r\n <div class=\"success-icon\"><i class=\"cax cax-check\"></i></div>\r\n <p>{{uploadString}}</p>\r\n <cax-button\r\n [label]=\"'Remove'\"\r\n [rounded]=\"false\"\r\n [severity]=\"'danger'\"\r\n [size]=\"'large'\"\r\n [outlined]=\"'false'\"\r\n [link]=\"true\"\r\n (click)=\"removeAllFiles(); $event.stopPropagation()\"\r\n />\r\n </div>\r\n </div>\r\n <div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\"></div>\r\n</div>\r\n<div *ngIf=\"invalid\" id=\"helper-text\" class=\"cax-error-upload\">\r\n {{ errorText }}\r\n</div>\r\n\r\n<!-- stacked file -->\r\n<div *ngIf=\"uploadedFiles.length > 0\" class=\"cax-file-preview-wrapper\" [ngStyle]=\"style\">\r\n <div\r\n *ngFor=\"let item of uploadedFiles; let i = index\"\r\n class=\"cax-file-preview\"\r\n [ngClass]=\"{\r\n 'queued': item.status === 'queued',\r\n 'uploading': item.status === 'uploading',\r\n 'complete': item.status === 'complete',\r\n 'canceled': item.status === 'canceled'\r\n }\"\r\n >\r\n <div class=\"file-info\">\r\n <p class=\"file-name\">{{ item.file.name }}</p>\r\n </div> \r\n\r\n <!-- Show spinner for queued or uploading files -->\r\n <div *ngIf=\"item.status === 'queued' || item.status === 'uploading'\" class=\"spinner\">\r\n <cax-progressSpinner\r\n [strokeColor]=\"'primary'\"\r\n [size]=\"'sm'\"\r\n [animationDuration]=\"'2s'\">\r\n </cax-progressSpinner>\r\n </div>\r\n \r\n <!-- Show remove button only for complete or canceled files -->\r\n <button\r\n *ngIf=\"item.status === 'complete' || item.status === 'canceled'\"\r\n class=\"remove-button\"\r\n (click)=\"removeFile(i); $event.stopPropagation()\">\r\n <i class=\"cax cax-close\"></i> \r\n </button>\r\n </div>\r\n</div>", styles: ["@layer cax{.cax-files{font-size:14px;font-weight:500;margin-bottom:10px}.cax-upload-menu{border-radius:12px;padding:24px 56px}.status-container{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:16px;height:150px}.status-container p{margin:0;font-size:14px;font-weight:500}.status-container .success-icon{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center}.status-container .success-icon i{font-size:1.5rem;font-weight:800}.cax-upload-options{text-align:center}.cax-upload-options .hint-text{font-size:14px;font-weight:500}.cax-upload-options .drop-files{font-weight:500;font-size:14px}.cax-upload-options .max-size{font-size:12px;margin-bottom:20px;font-weight:400}.cax-error-upload{font-size:14px;font-weight:400;padding-top:8px}.cax-options-container{display:flex;gap:24px;justify-content:center}.cax-upload-option{display:flex;flex-direction:column;align-items:center;cursor:pointer}.cax-upload-option .icon-container{width:48px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.cax-upload-option span{font-size:14px;font-weight:600;padding-top:10px}.cax-file-preview-wrapper{display:flex;flex-direction:column;gap:10px;margin-top:1rem}.cax-file-preview{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-radius:8px}.cax-file-preview .file-info{display:flex;align-items:center;gap:10px}.cax-file-preview .file-info .file-icon img{width:32px;height:32px}.cax-file-preview .file-info .file-name{font-weight:500;font-size:14px}.cax-file-preview .spinner{margin-left:auto;font-size:20px!important}.cax-file-preview .remove-button{background:none;border:none;margin-left:auto;cursor:pointer}.cax-file-preview .remove-button i{font-size:20px}}\n"] }]
313
321
  }], propDecorators: { invalid: [{
314
322
  type: Input
315
323
  }], style: [{
@@ -324,6 +332,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
324
332
  type: Input
325
333
  }], allowMultiple: [{
326
334
  type: Input
335
+ }], componentId: [{
336
+ type: Input
337
+ }], allowedFileTypes: [{
338
+ type: Input
327
339
  }], fileSelected: [{
328
340
  type: Output
329
341
  }], filesQueued: [{
@@ -352,4 +364,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
352
364
  type: HostListener,
353
365
  args: ['drop', ['$event']]
354
366
  }] } });
355
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy91cGxvYWQvdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy91cGxvYWQvdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQWdCckYsTUFBTSxPQUFPLGVBQWU7SUFDZixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssQ0FBOEM7SUFDbkQsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixVQUFVLEdBQVcsYUFBYSxDQUFDO0lBQ25DLFlBQVksR0FBVyxvQkFBb0IsQ0FBQztJQUM1QyxTQUFTLEdBQVcsc0JBQXNCLENBQUM7SUFDM0MsYUFBYSxHQUFZLElBQUksQ0FBQztJQUV2QywwQkFBMEI7SUFDaEIsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDeEMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUMsQ0FBQyx3Q0FBd0M7SUFDbEYsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDekMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDM0MsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUMsQ0FBQyw4QkFBOEI7SUFDekUsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDLENBQUMsb0JBQW9CO0lBQ3JGLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsdUNBQXVDO0lBQy9FLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsNkJBQTZCO0lBQ3pFLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFxQyxDQUFDLENBQUMsaUJB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ZTsyRkFBZixlQUFlLDBwQkNoQjVCLDIwR0FtR007OzJGRG5GTyxlQUFlO2tCQUwzQixTQUFTOytCQUNJLFlBQVk7OEJBS2IsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFhUCxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFwQyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFyQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBVcGxvYWRGaWxlU3RhdHVzID0gJ3F1ZXVlZCcgfCAndXBsb2FkaW5nJyB8ICdjb21wbGV0ZScgfCAnY2FuY2VsZWQnIHwgJ2Vycm9yJztcblxuZXhwb3J0IHR5cGUgVXBsb2FkRmlsZSA9IHtcbiAgICBmaWxlOiBGaWxlO1xuICAgIHN0YXR1czogVXBsb2FkRmlsZVN0YXR1cztcbiAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NheC11cGxvYWQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VwbG9hZC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHN0eWxlOiB7IFtrbGFzczogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIG1heEZpbGVTaXplOiBudW1iZXIgPSAzMDtcbiAgICBASW5wdXQoKSBpbnB1dEZpbGVzOiBzdHJpbmcgPSAnSW5wdXQgRmlsZXMnO1xuICAgIEBJbnB1dCgpIHVwbG9hZFN0cmluZzogc3RyaW5nID0gJ3VwbG9hZGluZyB0aGUgZmlsZSc7XG4gICAgQElucHV0KCkgZXJyb3JUZXh0OiBzdHJpbmcgPSAnUGxlYXNlIHVwbG9hZCBhIGZpbGUnO1xuICAgIEBJbnB1dCgpIGFsbG93TXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLy8gRW5oYW5jZWQgZXZlbnQgZW1pdHRlcnNcbiAgICBAT3V0cHV0KCkgZmlsZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlPigpO1xuICAgIEBPdXRwdXQoKSBmaWxlc1F1ZXVlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpOyAvLyBFbWl0IHdoZW4gZmlsZXMgYXJlIHF1ZXVlZCBmb3IgdXBsb2FkXG4gICAgQE91dHB1dCgpIHVwbG9hZFN0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG4gICAgQE91dHB1dCgpIHVwbG9hZENvbXBsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgICBAT3V0cHV0KCkgdXBsb2FkQ2FuY2VsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7IC8vIFdoZW4gdXNlciBjYW5jZWxzIGFuIHVwbG9hZFxuICAgIEBPdXRwdXQoKSB1cGxvYWRFcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBmaWxlOiBGaWxlOyBlcnJvcjogc3RyaW5nIH0+KCk7IC8vIFdoZW4gdXBsb2FkIGZhaWxzXG4gICAgQE91dHB1dCgpIGZpbGVSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlPigpOyAvLyBXaGVuIGEgZmlsZSBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3RcbiAgICBAT3V0cHV0KCkgYWxsRmlsZXNSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBXaGVuIGFsbCBmaWxlcyBhcmUgY2xlYXJlZFxuICAgIEBPdXRwdXQoKSB1cGxvYWRTdGF0dXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdpZGxlJyB8ICd1cGxvYWRpbmcnIHwgJ2NvbXBsZXRlJz4oKTsgLy8gU3RhdHVzIGNoYW5nZXNcblxuICAgIGlzRHJhZ2dpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRGaWxlW10gPSBbXTtcbiAgICB1cGxvYWRTdGF0dXM6ICdpZGxlJyB8ICd1cGxvYWRpbmcnIHwgJ2NvbXBsZXRlJyA9ICdpZGxlJztcbiAgICBpc1Byb2Nlc3NpbmdRdWV1ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgYWN0dWFsIGZpbGVzIHRvIHByb2Nlc3MgKGV4Y2x1ZGVzIGNhbmNlbGVkIG9uZXMpXG4gICAgcHJpdmF0ZSBnZXQgYWN0aXZlRmlsZXNDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5zdGF0dXMgIT09ICdjYW5jZWxlZCcpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gICAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcztcbiAgICAgICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWxlQXJyYXkgPSBBcnJheS5mcm9tKGZpbGVzKTtcbiAgICAgICAgY29uc3QgdmFsaWRGaWxlcyA9IGZpbGVBcnJheS5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLm1heEZpbGVTaXplICogMTAyNCAqIDEwMjQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRFcnJvcihmaWxlLCBgRmlsZSBzaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gJHt0aGlzLm1heEZpbGVTaXplfU1CYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFF1ZXVlIGFsbCBmaWxlcyBmb3IgdXBsb2FkXG4gICAgICAgIHZhbGlkRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gdGhpcy5xdWV1ZUZpbGUoZmlsZSkpO1xuXG4gICAgICAgIC8vIEVtaXQgdGhlIHF1ZXVlZCBmaWxlcyBldmVudFxuICAgICAgICBpZiAodmFsaWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVzUXVldWVkLmVtaXQodmFsaWRGaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSBpZiBub3QgYWxyZWFkeSBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUZpbGVJbnB1dChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICAgICAgaWYgKCFmaWxlcykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpbGVBcnJheSA9IEFycmF5LmZyb20oZmlsZXMpO1xuICAgICAgICBjb25zdCB2YWxpZEZpbGVzID0gZmlsZUFycmF5LmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUgKiAxMDI0ICogMTAyNCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEVycm9yKGZpbGUsIGBGaWxlIHNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAke3RoaXMubWF4RmlsZVNpemV9TUJgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUXVldWUgYWxsIGZpbGVzIGZvciB1cGxvYWRcbiAgICAgICAgdmFsaWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB0aGlzLnF1ZXVlRmlsZShmaWxlKSk7XG5cbiAgICAgICAgLy8gRW1pdCB0aGUgcXVldWVkIGZpbGVzIGV2ZW50XG4gICAgICAgIGlmICh2YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZXNRdWV1ZWQuZW1pdCh2YWxpZEZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlIGlmIG5vdCBhbHJlYWR5IHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUXVldWUgYSBmaWxlIGZvciB1cGxvYWRcbiAgICBwcml2YXRlIHF1ZXVlRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVwbG9hZEVudHJ5OiBVcGxvYWRGaWxlID0ge1xuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIHN0YXR1czogJ3F1ZXVlZCcsXG5cbiAgICAgICAgICAgIHByb2dyZXNzOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnB1c2godXBsb2FkRW50cnkpO1xuXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZFN0YXR1cyA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygndXBsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdXBsb2FkIHN0YXR1cyBhbmQgZW1pdCBldmVudFxuICAgIHByaXZhdGUgdXBkYXRlVXBsb2FkU3RhdHVzKHN0YXR1czogJ2lkbGUnIHwgJ3VwbG9hZGluZycgfCAnY29tcGxldGUnKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZFN0YXR1cyAhPT0gc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU3RhdHVzQ2hhbmdlLmVtaXQoc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgdGhlIHF1ZXVlIG9mIGZpbGVzIHNlcXVlbnRpYWxseVxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nUXVldWUgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIG5leHQgZmlsZSB0byB1cGxvYWRcbiAgICAgICAgbGV0IG5leHRGaWxlSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuXG4gICAgICAgIHdoaWxlIChuZXh0RmlsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSB0aGlzLnVwbG9hZGVkRmlsZXNbbmV4dEZpbGVJbmRleF07XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGaWxlKGN1cnJlbnRGaWxlLCBuZXh0RmlsZUluZGV4KTtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBmaWxlIGFmdGVyIHByb2Nlc3NpbmdcbiAgICAgICAgICAgIG5leHRGaWxlSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFsbCB1cGxvYWRzIGFyZSBjb21wbGV0ZSBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgZmlsZXMgdG8gcHJvY2Vzc1xuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAnY29tcGxldGUnKSAmJiAhdGhpcy5oYXNRdWV1ZWRPclVwbG9hZGluZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoJ2NvbXBsZXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGZpbGUgaW5wdXQgY2xpY2sgcHJvZ3JhbW1hdGljYWxseVxuICAgIG9wZW5GaWxlU2VsZWN0b3IoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoZmlsZUlucHV0KSB7XG4gICAgICAgICAgICBmaWxlSW5wdXQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICBwcml2YXRlIGVtaXRFcnJvcihmaWxlOiBGaWxlLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGxvYWRFcnJvci5lbWl0KHsgZmlsZSwgZXJyb3I6IG1lc3NhZ2UgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0ZpbGUoZmlsZUVudHJ5OiBVcGxvYWRGaWxlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFVwZGF0ZSBzdGF0dXMgdG8gdXBsb2FkaW5nXG4gICAgICAgIGZpbGVFbnRyeS5zdGF0dXMgPSAndXBsb2FkaW5nJztcbiAgICAgICAgZmlsZUVudHJ5LnByb2dyZXNzID0gMDtcblxuICAgICAgICB0aGlzLmZpbGVTZWxlY3RlZC5lbWl0KGZpbGVFbnRyeS5maWxlKTtcbiAgICAgICAgdGhpcy51cGxvYWRTdGFydGVkLmVtaXQoZmlsZUVudHJ5LmZpbGUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTaW11bGF0ZSB1cGxvYWQgd2l0aCBwcm9ncmVzcyB1cGRhdGVzXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9ncmVzcyA9IDA7IHByb2dyZXNzIDw9IDEwMDsgcHJvZ3Jlc3MgKz0gMTApIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB1cGxvYWQgd2FzIGNhbmNlbGVkIGR1cmluZyBwcm9ncmVzc1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgY3VycmVudCBzdGF0dXMgc2luY2UgaXQgbWlnaHQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgaWYgKGZpbGVFbnRyeS5zdGF0dXMgIT09ICd1cGxvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVpdGhlciBjYW5jZWxlZCBvciBlcnJvcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZpbGVFbnRyeS5wcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgICAgICAgICAgIC8vdGhpcy51cGxvYWRQcm9ncmVzcy5lbWl0KHsgZmlsZTogZmlsZUVudHJ5LmZpbGUsIHByb2dyZXNzIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgbmV0d29yayBkZWxheVxuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCB0byBjb21wbGV0ZSBpZiBzdGlsbCB1cGxvYWRpbmcgKG5vdCBjYW5jZWxlZCBvciBlcnJvcmVkKVxuICAgICAgICAgICAgaWYgKGZpbGVFbnRyeS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgZmlsZUVudHJ5LnN0YXR1cyA9ICdjb21wbGV0ZSc7XG4gICAgICAgICAgICAgICAgZmlsZUVudHJ5LnByb2dyZXNzID0gMTAwO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkQ29tcGxldGVkLmVtaXQoZmlsZUVudHJ5LmZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAgICAgZmlsZUVudHJ5LnN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHVwbG9hZCBlcnJvcic7XG4gICAgICAgICAgICBmaWxlRW50cnkuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlO1xuICAgICAgICAgICAgdGhpcy5lbWl0RXJyb3IoZmlsZUVudHJ5LmZpbGUsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWxVcGxvYWQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICAvLyBDYW5jZWwgdGhlIHNwZWNpZmllZCBmaWxlIGFuZCBhbGwgZmlsZXMgYmVsb3cgaXRcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVG9DYW5jZWwgPSB0aGlzLnVwbG9hZGVkRmlsZXNbaV07XG4gICAgICAgICAgICBpZiAoZmlsZVRvQ2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNTdGF0dXMgPSBmaWxlVG9DYW5jZWwuc3RhdHVzO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXR1cyA9PT0gJ3VwbG9hZGluZycgfHwgcHJldmlvdXNTdGF0dXMgPT09ICdxdWV1ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVUb0NhbmNlbC5zdGF0dXMgPSAnY2FuY2VsZWQnO1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVtaXQgaWYgaXQgd2FzIGFjdGl2ZWx5IHVwbG9hZGluZyAobm90IGp1c3QgcXVldWVkKVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0dXMgPT09ICd1cGxvYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZENhbmNlbGVkLmVtaXQoZmlsZVRvQ2FuY2VsLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggd2FzIHVwbG9hZGluZywgcHJvY2VzcyB0aGUgbmV4dCBmaWxlIGluIHF1ZXVlXG4gICAgICAgIC8vICh3aGljaCB3b3VsZCBub3cgYmUgYSBmaWxlIGJlZm9yZSB0aGUgaW5kZXggdGhhdCBtaWdodCBiZSBxdWV1ZWQpXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZXNbaW5kZXhdPy5zdGF0dXMgPT09ICdjYW5jZWxlZCcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcm9jZXNzUXVldWUoKSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgdXBsb2FkXG4gICAgY2FuY2VsQ3VycmVudFVwbG9hZCgpOiB2b2lkIHtcbiAgICAgICAgLy8gRmluZCB0aGUgZmlsZSB0aGF0J3MgY3VycmVudGx5IHVwbG9hZGluZ1xuICAgICAgICBjb25zdCBjdXJyZW50VXBsb2FkSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycpO1xuICAgICAgICBpZiAoY3VycmVudFVwbG9hZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsVXBsb2FkKGN1cnJlbnRVcGxvYWRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgYWxsIHVwbG9hZHNcbiAgICBjYW5jZWxBbGxVcGxvYWRzKCk6IHZvaWQge1xuICAgICAgICBsZXQgaGFkQWN0aXZlVXBsb2FkcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnIHx8IGZpbGUuc3RhdHVzID09PSAncXVldWVkJykge1xuICAgICAgICAgICAgICAgIGhhZEFjdGl2ZVVwbG9hZHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdHVzID0gZmlsZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgZmlsZS5zdGF0dXMgPSAnY2FuY2VsZWQnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdHVzID09PSAndXBsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZENhbmNlbGVkLmVtaXQoZmlsZS5maWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYWRBY3RpdmVVcGxvYWRzICYmICF0aGlzLmhhc1F1ZXVlZE9yVXBsb2FkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygnaWRsZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBsaXN0XG4gICAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVUb1JlbW92ZSA9IHRoaXMudXBsb2FkZWRGaWxlc1tpbmRleF07XG5cbiAgICAgICAgLy8gQ2FuY2VsIGZpcnN0IGlmIGl0J3MgYWN0aXZlXG4gICAgICAgIGlmIChmaWxlVG9SZW1vdmUuc3RhdHVzID09PSAndXBsb2FkaW5nJyB8fCBmaWxlVG9SZW1vdmUuc3RhdHVzID09PSAncXVldWVkJykge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxVcGxvYWQoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCByZW1vdmFsIGV2ZW50XG4gICAgICAgIHRoaXMuZmlsZVJlbW92ZWQuZW1pdChmaWxlVG9SZW1vdmUuZmlsZSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gYXJyYXlcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgLy8gUmVzZXQgc3RhdHVzIGlmIG5vIGZpbGVzIGxlZnRcbiAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXBsb2FkU3RhdHVzKCdpZGxlJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaGFzUXVldWVkT3JVcGxvYWRpbmcgJiYgdGhpcy51cGxvYWRTdGF0dXMgIT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtb3JlIHF1ZXVlZCBvciB1cGxvYWRpbmcgZmlsZXMgYnV0IHdlIGhhdmUgY29tcGxldGVkIGZpbGVzXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygnY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZmlsZXNcbiAgICByZW1vdmVBbGxGaWxlcygpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBhY3RpdmUgdXBsb2Fkc1xuICAgICAgICB0aGlzLmNhbmNlbEFsbFVwbG9hZHMoKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdGhlcmUgd2VyZSBmaWxlcyB0byByZW1vdmVcbiAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFsbEZpbGVzUmVtb3ZlZC5lbWl0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoJ2lkbGUnKTtcbiAgICB9XG5cbiAgICAvLyBSZXRyeSBhIGZhaWxlZCB1cGxvYWRcbiAgICByZXRyeVVwbG9hZChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVUb1JldHJ5ID0gdGhpcy51cGxvYWRlZEZpbGVzW2luZGV4XTtcbiAgICAgICAgaWYgKGZpbGVUb1JldHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gZmlsZVRvUmV0cnkuc3RhdHVzO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgPT09ICdlcnJvcicgfHwgY3VycmVudFN0YXR1cyA9PT0gJ2NhbmNlbGVkJykge1xuICAgICAgICAgICAgICAgIGZpbGVUb1JldHJ5LnN0YXR1cyA9ICdxdWV1ZWQnO1xuICAgICAgICAgICAgICAgIGZpbGVUb1JldHJ5LmVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHByb2Nlc3NpbmcgaWYgbm90IGFscmVhZHkgZG9pbmcgc29cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNQcm9jZXNzaW5nUXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaGFzVXBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1F1ZXVlZE9yVXBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyB8fCBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuICAgIH1cblxuICAgIGdldCBoYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZGVkRmlsZXMuc29tZSgoZmlsZSkgPT4gZmlsZS5zdGF0dXMgPT09ICdlcnJvcicpO1xuICAgIH1cblxuICAgIGdldCBhbGxVcGxvYWRzQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoID4gMCAmJiB0aGlzLnVwbG9hZGVkRmlsZXMuc29tZSgoZmlsZSkgPT4gZmlsZS5zdGF0dXMgPT09ICdjb21wbGV0ZScpICYmICF0aGlzLmhhc1F1ZXVlZE9yVXBsb2FkaW5nO1xuICAgIH1cblxuICAgIGdldCB1cGxvYWRpbmdQcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gQ291bnQgYWN0aXZlIGZpbGVzIChleGNsdWRpbmcgY2FuY2VsZWQgb25lcylcbiAgICAgICAgY29uc3QgdG90YWxBY3RpdmVGaWxlcyA9IHRoaXMuYWN0aXZlRmlsZXNDb3VudDtcbiAgICAgICAgY29uc3QgY29tcGxldGVkQ291bnQgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykubGVuZ3RoO1xuICAgICAgICBjb25zdCB1cGxvYWRpbmdGaWxlID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbmQoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyk7XG4gICAgICAgIGlmICh1cGxvYWRpbmdGaWxlKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgdXBsb2FkaW5nIHRoZSAoY29tcGxldGVkQ291bnQgKyAxKXRoIGFjdGl2ZSBmaWxlXG4gICAgICAgICAgICByZXR1cm4gYFVwbG9hZGluZyAke2NvbXBsZXRlZENvdW50fS8ke3RvdGFsQWN0aXZlRmlsZXN9IGZpbGUke3RvdGFsQWN0aXZlRmlsZXMgPiAxID8gJ3MnIDogJyd9Li4uYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAncXVldWVkJykpIHtcbiAgICAgICAgICAgIHJldHVybiBgVXBsb2FkaW5nICR7Y29tcGxldGVkQ291bnQgKyAxfS8ke3RvdGFsQWN0aXZlRmlsZXN9IGZpbGUke3RvdGFsQWN0aXZlRmlsZXMgPiAxID8gJ3MnIDogJyd9Li4uYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYFVwbG9hZGluZyAke2NvbXBsZXRlZENvdW50fS8ke3RvdGFsQWN0aXZlRmlsZXN9IGZpbGUke3RvdGFsQWN0aXZlRmlsZXMgPiAxID8gJ3MnIDogJyd9Li4uYDtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyBwZXJjZW50YWdlIGFjcm9zcyBhbGwgZmlsZXNcbiAgICBnZXQgb3ZlcmFsbFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcblxuICAgICAgICBjb25zdCB0b3RhbFByb2dyZXNzID0gdGhpcy51cGxvYWRlZEZpbGVzLnJlZHVjZSgoc3VtLCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZS5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHJldHVybiBzdW0gKyAxMDA7XG4gICAgICAgICAgICBpZiAoZmlsZS5zdGF0dXMgPT09ICdjYW5jZWxlZCcgfHwgZmlsZS5zdGF0dXMgPT09ICdlcnJvcicpIHJldHVybiBzdW07XG4gICAgICAgICAgICByZXR1cm4gc3VtICsgKGZpbGUucHJvZ3Jlc3MgfHwgMCk7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUZpbGVzQ291bnQgPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXR1cyAhPT0gJ2NhbmNlbGVkJyAmJiBmaWxlLnN0YXR1cyAhPT0gJ2Vycm9yJykubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBhY3RpdmVGaWxlc0NvdW50ID4gMCA/IE1hdGgucm91bmQoKHRvdGFsUHJvZ3Jlc3MgLyAoYWN0aXZlRmlsZXNDb3VudCAqIDEwMCkpICogMTAwKSA6IDA7XG4gICAgfVxufVxuIiwiPHAgY2xhc3M9XCJjYXgtZmlsZXNcIj57e2lucHV0RmlsZXN9fTwvcD5cclxuPGRpdiBjbGFzcz1cImNheC11cGxvYWQtbWVudVwiIFtuZ1N0eWxlXT1cInN0eWxlXCJcclxuICAgICBbY2xhc3MuZHJhZ2dpbmddPVwiaXNEcmFnZ2luZ1wiIFxyXG4gICAgIChjbGljayk9XCJvcGVuRmlsZVNlbGVjdG9yKClcIj5cclxuICA8aW5wdXRcclxuICAgIGlkPVwiZmlsZUlucHV0XCJcclxuICAgIHR5cGU9XCJmaWxlXCJcclxuICAgIChjaGFuZ2UpPVwiaGFuZGxlRmlsZUlucHV0KCRldmVudClcIlxyXG4gICAgaGlkZGVuXHJcbiAgICBtdWx0aXBsZVxyXG4gID5cclxuXHJcbiAgPCEtLSBEZWZhdWx0IFVwbG9hZCBTdGF0ZSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidXBsb2FkU3RhdHVzID09PSAnaWRsZSdcIiA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F4LXVwbG9hZC1vcHRpb25zXCIgPlxyXG4gICAgICA8cCBjbGFzcz1cImhpbnQtdGV4dFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1maWxlc1wiPkRyb3AgZmlsZXMgaGVyZTwvc3Bhbj4gb3IgYnJvd3NlIGZpbGVzIGZyb20geW91ciBkZXZpY2VcclxuICAgICAgPC9wPlxyXG4gICAgICA8cCBjbGFzcz1cIm1heC1zaXplXCI+TWF4LiBGaWxlIFNpemU6IHt7IG1heEZpbGVTaXplIH19TUI8L3A+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gIDwhLS0gVXBsb2FkaW5nIFN0YXRlIC0tPlxyXG48ZGl2ICpuZ0lmPVwidXBsb2FkU3RhdHVzID09PSAndXBsb2FkaW5nJ1wiIGNsYXNzPVwiY2F4LXVwbG9hZC1zdGF0dXMgdXBsb2FkaW5nXCIgPlxyXG4gIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyXCI+XHJcbiAgICA8Y2F4LXByb2dyZXNzU3Bpbm5lclxyXG4gICAgICAgIFtzdHJva2VDb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgIFtzaXplXT1cIidsZydcIlxyXG4gICAgICAgIFthbmltYXRpb25EdXJhdGlvbl09XCInMnMnXCJcclxuICAgICAgPjwvY2F4LXByb2dyZXNzU3Bpbm5lcj5cclxuICAgIDxwID57eyB1cGxvYWRpbmdQcm9ncmVzc1RleHQgfX08L3A+XHJcbiAgICA8Y2F4LWJ1dHRvblxyXG4gICAgICBbbGFiZWxdPVwiJ0NhbmNlbCdcIlxyXG4gICAgICBbcm91bmRlZF09XCJmYWxzZVwiXHJcbiAgICAgIFtzZXZlcml0eV09XCInZGFuZ2VyJ1wiXHJcbiAgICAgIFtzaXplXT1cIidsYXJnZSdcIlxyXG4gICAgICBbb3V0bGluZWRdPVwiJ2ZhbHNlJ1wiXHJcbiAgICAgIFtsaW5rXT1cInRydWVcIlxyXG4gICAgICAoY2xpY2spPVwiY2FuY2VsQ3VycmVudFVwbG9hZCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4gIDwhLS0gQ29tcGxldGUgU3RhdGUgLS0+XHJcbiAgPGRpdiAqbmdJZj1cInVwbG9hZFN0YXR1cyA9PT0gJ2NvbXBsZXRlJ1wiIGNsYXNzPVwiY2F4LXVwbG9hZC1zdGF0dXMgY29tcGxldGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdWNjZXNzLWljb25cIj48aSBjbGFzcz1cImNheCBjYXgtY2hlY2tcIj48L2k+PC9kaXY+XHJcbiAgICAgIDxwPnt7dXBsb2FkU3RyaW5nfX08L3A+XHJcbiAgICAgIDxjYXgtYnV0dG9uXHJcbiAgICAgICAgW2xhYmVsXT1cIidSZW1vdmUnXCJcclxuICAgICAgICBbcm91bmRlZF09XCJmYWxzZVwiXHJcbiAgICAgICAgW3NldmVyaXR5XT1cIidkYW5nZXInXCJcclxuICAgICAgICBbc2l6ZV09XCInbGFyZ2UnXCJcclxuICAgICAgICBbb3V0bGluZWRdPVwiJ2ZhbHNlJ1wiXHJcbiAgICAgICAgW2xpbmtdPVwidHJ1ZVwiXHJcbiAgICAgICAgKGNsaWNrKT1cInJlbW92ZUFsbEZpbGVzKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2ICpuZ0lmPVwiaW52YWxpZFwiIGlkPVwiaGVscGVyLXRleHRcIiBjbGFzcz1cImNheC1lcnJvci11cGxvYWRcIj48L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJpbnZhbGlkXCIgaWQ9XCJoZWxwZXItdGV4dFwiIGNsYXNzPVwiY2F4LWVycm9yLXVwbG9hZFwiPlxyXG4gIHt7IGVycm9yVGV4dCB9fVxyXG48L2Rpdj5cclxuXHJcbjwhLS0gc3RhY2tlZCBmaWxlIC0tPlxyXG48ZGl2ICpuZ0lmPVwidXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjYXgtZmlsZS1wcmV2aWV3LXdyYXBwZXJcIiBbbmdTdHlsZV09XCJzdHlsZVwiPlxyXG4gIDxkaXZcclxuICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHVwbG9hZGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgY2xhc3M9XCJjYXgtZmlsZS1wcmV2aWV3XCJcclxuICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgJ3F1ZXVlZCc6IGl0ZW0uc3RhdHVzID09PSAncXVldWVkJyxcclxuICAgICAgJ3VwbG9hZGluZyc6IGl0ZW0uc3RhdHVzID09PSAndXBsb2FkaW5nJyxcclxuICAgICAgJ2NvbXBsZXRlJzogaXRlbS5zdGF0dXMgPT09ICdjb21wbGV0ZScsXHJcbiAgICAgICdjYW5jZWxlZCc6IGl0ZW0uc3RhdHVzID09PSAnY2FuY2VsZWQnXHJcbiAgICB9XCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pbmZvXCI+XHJcbiAgICAgIDxwIGNsYXNzPVwiZmlsZS1uYW1lXCI+e3sgaXRlbS5maWxlLm5hbWUgfX08L3A+XHJcbiAgICA8L2Rpdj4gXHJcblxyXG4gICAgPCEtLSBTaG93IHNwaW5uZXIgZm9yIHF1ZXVlZCBvciB1cGxvYWRpbmcgZmlsZXMgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICdxdWV1ZWQnIHx8IGl0ZW0uc3RhdHVzID09PSAndXBsb2FkaW5nJ1wiIGNsYXNzPVwic3Bpbm5lclwiPlxyXG4gICAgICA8Y2F4LXByb2dyZXNzU3Bpbm5lclxyXG4gICAgICAgIFtzdHJva2VDb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgIFtzaXplXT1cIidzbSdcIlxyXG4gICAgICAgIFthbmltYXRpb25EdXJhdGlvbl09XCInMnMnXCI+XHJcbiAgICAgIDwvY2F4LXByb2dyZXNzU3Bpbm5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICA8IS0tIFNob3cgcmVtb3ZlIGJ1dHRvbiBvbmx5IGZvciBjb21wbGV0ZSBvciBjYW5jZWxlZCBmaWxlcyAtLT5cclxuICAgIDxidXR0b25cclxuICAgICAgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJyB8fCBpdGVtLnN0YXR1cyA9PT0gJ2NhbmNlbGVkJ1wiXHJcbiAgICAgIGNsYXNzPVwicmVtb3ZlLWJ1dHRvblwiXHJcbiAgICAgIChjbGljayk9XCJyZW1vdmVGaWxlKGkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgPGkgY2xhc3M9XCJjYXggY2F4LWNsb3NlXCI+PC9pPiBcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy91cGxvYWQvdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy91cGxvYWQvdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7OztBQW1CN0YsTUFBTSxPQUFPLGVBQWU7SUFDZixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssQ0FBOEM7SUFDbkQsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixVQUFVLEdBQVcsYUFBYSxDQUFDO0lBQ25DLFlBQVksR0FBVyxvQkFBb0IsQ0FBQztJQUM1QyxTQUFTLEdBQVcsc0JBQXNCLENBQUM7SUFDM0MsYUFBYSxHQUFZLElBQUksQ0FBQztJQUM5QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLGdCQUFnQixHQUFhLEVBQUUsQ0FBQztJQUN6QywwQkFBMEI7SUFDaEIsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDeEMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFDekMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDekMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDM0MsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDMUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO0lBQ2hFLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ3ZDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQzNDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFxQyxDQUFDO0lBRXJGLFVBQVUsR0FB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QUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkF5QlAsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRcEMsV0FBVztzQkFEVixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRckMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBVcGxvYWRGaWxlU3RhdHVzID0gJ3F1ZXVlZCcgfCAndXBsb2FkaW5nJyB8ICdjb21wbGV0ZScgfCAnY2FuY2VsZWQnIHwgJ2Vycm9yJztcblxuZXhwb3J0IHR5cGUgVXBsb2FkRmlsZSA9IHtcbiAgICBmaWxlOiBGaWxlO1xuICAgIHN0YXR1czogVXBsb2FkRmlsZVN0YXR1cztcbiAgICBwcm9ncmVzcz86IG51bWJlcjtcbiAgICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NheC11cGxvYWQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VwbG9hZC5jb21wb25lbnQuc2NzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdjYXgtZWxlbWVudCdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHN0eWxlOiB7IFtrbGFzczogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIG1heEZpbGVTaXplOiBudW1iZXIgPSAzMDtcbiAgICBASW5wdXQoKSBpbnB1dEZpbGVzOiBzdHJpbmcgPSAnSW5wdXQgRmlsZXMnO1xuICAgIEBJbnB1dCgpIHVwbG9hZFN0cmluZzogc3RyaW5nID0gJ3VwbG9hZGluZyB0aGUgZmlsZSc7XG4gICAgQElucHV0KCkgZXJyb3JUZXh0OiBzdHJpbmcgPSAnUGxlYXNlIHVwbG9hZCBhIGZpbGUnO1xuICAgIEBJbnB1dCgpIGFsbG93TXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGNvbXBvbmVudElkOiBzdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSBhbGxvd2VkRmlsZVR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vIEVuaGFuY2VkIGV2ZW50IGVtaXR0ZXJzXG4gICAgQE91dHB1dCgpIGZpbGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgICBAT3V0cHV0KCkgZmlsZXNRdWV1ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVbXT4oKTtcbiAgICBAT3V0cHV0KCkgdXBsb2FkU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgICBAT3V0cHV0KCkgdXBsb2FkQ29tcGxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlPigpO1xuICAgIEBPdXRwdXQoKSB1cGxvYWRDYW5jZWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgICBAT3V0cHV0KCkgdXBsb2FkRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmlsZTogRmlsZTsgZXJyb3I6IHN0cmluZyB9PigpO1xuICAgIEBPdXRwdXQoKSBmaWxlUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgICBAT3V0cHV0KCkgYWxsRmlsZXNSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSB1cGxvYWRTdGF0dXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdpZGxlJyB8ICd1cGxvYWRpbmcnIHwgJ2NvbXBsZXRlJz4oKTtcblxuICAgIGlzRHJhZ2dpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRGaWxlW10gPSBbXTtcbiAgICB1cGxvYWRTdGF0dXM6ICdpZGxlJyB8ICd1cGxvYWRpbmcnIHwgJ2NvbXBsZXRlJyA9ICdpZGxlJztcbiAgICBpc1Byb2Nlc3NpbmdRdWV1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHVuaXF1ZUlkOiBzdHJpbmcgPSAnJztcblxuICAgIC8vIENvbXB1dGVkIHByb3BlcnR5IGZvciBhY2NlcHQgYXR0cmlidXRlIGluIGZpbGUgaW5wdXRcbiAgICBnZXQgYWNjZXB0RmlsZVR5cGVzKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5hbGxvd2VkRmlsZVR5cGVzIHx8IHRoaXMuYWxsb3dlZEZpbGVUeXBlcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsb3dlZEZpbGVUeXBlcy5tYXAoKHR5cGUpID0+IGAuJHt0eXBlfWApLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvLyBUcmFjayBhY3R1YWwgZmlsZXMgdG8gcHJvY2VzcyAoZXhjbHVkZXMgY2FuY2VsZWQgb25lcylcbiAgICBwcml2YXRlIGdldCBhY3RpdmVGaWxlc0NvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXR1cyAhPT0gJ2NhbmNlbGVkJykubGVuZ3RoO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgSUQgaWYgbm90IHByb3ZpZGVkIHRocm91Z2ggaW5wdXRcbiAgICAgICAgdGhpcy51bmlxdWVJZCA9IHRoaXMuY29tcG9uZW50SWQgfHwgYHVwbG9hZC0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gICAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcztcbiAgICAgICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWxlQXJyYXkgPSBBcnJheS5mcm9tKGZpbGVzKTtcbiAgICAgICAgY29uc3QgdmFsaWRGaWxlcyA9IGZpbGVBcnJheS5maWx0ZXIoKGZpbGUpID0+IHRoaXMudmFsaWRhdGVGaWxlKGZpbGUpKTtcblxuICAgICAgICAvLyBRdWV1ZSBhbGwgZmlsZXMgZm9yIHVwbG9hZFxuICAgICAgICB2YWxpZEZpbGVzLmZvckVhY2goKGZpbGUpID0+IHRoaXMucXVldWVGaWxlKGZpbGUpKTtcblxuICAgICAgICAvLyBFbWl0IHRoZSBxdWV1ZWQgZmlsZXMgZXZlbnRcbiAgICAgICAgaWYgKHZhbGlkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maWxlc1F1ZXVlZC5lbWl0KHZhbGlkRmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUgaWYgbm90IGFscmVhZHkgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMuaXNQcm9jZXNzaW5nUXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVGaWxlSW5wdXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWxlczogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgICAgIGlmICghZmlsZXMpIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWxlQXJyYXkgPSBBcnJheS5mcm9tKGZpbGVzKTtcbiAgICAgICAgY29uc3QgdmFsaWRGaWxlcyA9IGZpbGVBcnJheS5maWx0ZXIoKGZpbGUpID0+IHRoaXMudmFsaWRhdGVGaWxlKGZpbGUpKTtcblxuICAgICAgICAvLyBRdWV1ZSBhbGwgZmlsZXMgZm9yIHVwbG9hZFxuICAgICAgICB2YWxpZEZpbGVzLmZvckVhY2goKGZpbGUpID0+IHRoaXMucXVldWVGaWxlKGZpbGUpKTtcblxuICAgICAgICAvLyBFbWl0IHRoZSBxdWV1ZWQgZmlsZXMgZXZlbnRcbiAgICAgICAgaWYgKHZhbGlkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maWxlc1F1ZXVlZC5lbWl0KHZhbGlkRmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUgaWYgbm90IGFscmVhZHkgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMuaXNQcm9jZXNzaW5nUXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOZXcgbWV0aG9kIGZvciBmaWxlIHZhbGlkYXRpb25cbiAgICBwcml2YXRlIHZhbGlkYXRlRmlsZShmaWxlOiBGaWxlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFNpemUgdmFsaWRhdGlvblxuICAgICAgICBpZiAoZmlsZS5zaXplID4gdGhpcy5tYXhGaWxlU2l6ZSAqIDEwMjQgKiAxMDI0KSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRFcnJvcihmaWxlLCBgRmlsZSBzaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gJHt0aGlzLm1heEZpbGVTaXplfU1CYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWxlIHR5cGUgdmFsaWRhdGlvblxuICAgICAgICBpZiAodGhpcy5hbGxvd2VkRmlsZVR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSB0aGlzLmdldEZpbGVFeHRlbnNpb24oZmlsZS5uYW1lKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93ZWRGaWxlVHlwZXMuaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRFcnJvcihmaWxlLCBgT25seSAke3RoaXMuYWxsb3dlZEZpbGVUeXBlcy5qb2luKCcsICcpfSBmaWxlcyBhcmUgYWxsb3dlZGApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IGZpbGUgZXh0ZW5zaW9uXG4gICAgcHJpdmF0ZSBnZXRGaWxlRXh0ZW5zaW9uKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZmlsZW5hbWUuc3BsaXQoJy4nKS5wb3AoKSB8fCAnJztcbiAgICB9XG5cbiAgICAvLyBRdWV1ZSBhIGZpbGUgZm9yIHVwbG9hZFxuICAgIHByaXZhdGUgcXVldWVGaWxlKGZpbGU6IEZpbGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXBsb2FkRW50cnk6IFVwbG9hZEZpbGUgPSB7XG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgICAgICAgIHByb2dyZXNzOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzLnB1c2godXBsb2FkRW50cnkpO1xuXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZFN0YXR1cyA9PT0gJ2lkbGUnKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygndXBsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdXBsb2FkIHN0YXR1cyBhbmQgZW1pdCBldmVudFxuICAgIHByaXZhdGUgdXBkYXRlVXBsb2FkU3RhdHVzKHN0YXR1czogJ2lkbGUnIHwgJ3VwbG9hZGluZycgfCAnY29tcGxldGUnKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZFN0YXR1cyAhPT0gc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU3RhdHVzQ2hhbmdlLmVtaXQoc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgdGhlIHF1ZXVlIG9mIGZpbGVzIHNlcXVlbnRpYWxseVxuICAgIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nUXVldWUgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIG5leHQgZmlsZSB0byB1cGxvYWRcbiAgICAgICAgbGV0IG5leHRGaWxlSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuXG4gICAgICAgIHdoaWxlIChuZXh0RmlsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSB0aGlzLnVwbG9hZGVkRmlsZXNbbmV4dEZpbGVJbmRleF07XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGaWxlKGN1cnJlbnRGaWxlLCBuZXh0RmlsZUluZGV4KTtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBmaWxlIGFmdGVyIHByb2Nlc3NpbmdcbiAgICAgICAgICAgIG5leHRGaWxlSW5kZXggPSB0aGlzLnVwbG9hZGVkRmlsZXMuZmluZEluZGV4KChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGFsbCB1cGxvYWRzIGFyZSBjb21wbGV0ZSBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgZmlsZXMgdG8gcHJvY2Vzc1xuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAnY29tcGxldGUnKSAmJiAhdGhpcy5oYXNRdWV1ZWRPclVwbG9hZGluZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoJ2NvbXBsZXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGZpbGUgaW5wdXQgY2xpY2sgcHJvZ3JhbW1hdGljYWxseVxuICAgIG9wZW5GaWxlU2VsZWN0b3IoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBmaWxlSW5wdXQtJHt0aGlzLnVuaXF1ZUlkfWApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGlmIChmaWxlSW5wdXQpIHtcbiAgICAgICAgICAgIGZpbGVJbnB1dC5jbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1pdCBlcnJvciBldmVudFxuICAgIHByaXZhdGUgZW1pdEVycm9yKGZpbGU6IEZpbGUsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwbG9hZEVycm9yLmVtaXQoeyBmaWxlLCBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHByb2Nlc3NGaWxlKGZpbGVFbnRyeTogVXBsb2FkRmlsZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBVcGRhdGUgc3RhdHVzIHRvIHVwbG9hZGluZ1xuICAgICAgICBmaWxlRW50cnkuc3RhdHVzID0gJ3VwbG9hZGluZyc7XG4gICAgICAgIGZpbGVFbnRyeS5wcm9ncmVzcyA9IDA7XG5cbiAgICAgICAgdGhpcy5maWxlU2VsZWN0ZWQuZW1pdChmaWxlRW50cnkuZmlsZSk7XG4gICAgICAgIHRoaXMudXBsb2FkU3RhcnRlZC5lbWl0KGZpbGVFbnRyeS5maWxlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU2ltdWxhdGUgdXBsb2FkIHdpdGggcHJvZ3Jlc3MgdXBkYXRlc1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvZ3Jlc3MgPSAwOyBwcm9ncmVzcyA8PSAxMDA7IHByb2dyZXNzICs9IDEwKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdXBsb2FkIHdhcyBjYW5jZWxlZCBkdXJpbmcgcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGN1cnJlbnQgc3RhdHVzIHNpbmNlIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGlmIChmaWxlRW50cnkuc3RhdHVzICE9PSAndXBsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgY2FuY2VsZWQgb3IgZXJyb3JlZFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWxlRW50cnkucHJvZ3Jlc3MgPSBwcm9ncmVzcztcblxuICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIG5ldHdvcmsgZGVsYXlcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSBzZXQgdG8gY29tcGxldGUgaWYgc3RpbGwgdXBsb2FkaW5nIChub3QgY2FuY2VsZWQgb3IgZXJyb3JlZClcbiAgICAgICAgICAgIGlmIChmaWxlRW50cnkuc3RhdHVzID09PSAndXBsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgIGZpbGVFbnRyeS5zdGF0dXMgPSAnY29tcGxldGUnO1xuICAgICAgICAgICAgICAgIGZpbGVFbnRyeS5wcm9ncmVzcyA9IDEwMDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZENvbXBsZXRlZC5lbWl0KGZpbGVFbnRyeS5maWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgICAgICAgIGZpbGVFbnRyeS5zdGF0dXMgPSAnZXJyb3InO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biB1cGxvYWQgZXJyb3InO1xuICAgICAgICAgICAgZmlsZUVudHJ5LmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdEVycm9yKGZpbGVFbnRyeS5maWxlLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FuY2VsVXBsb2FkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2FuY2VsIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgYWxsIGZpbGVzIGJlbG93IGl0XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMudXBsb2FkZWRGaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVRvQ2FuY2VsID0gdGhpcy51cGxvYWRlZEZpbGVzW2ldO1xuICAgICAgICAgICAgaWYgKGZpbGVUb0NhbmNlbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdHVzID0gZmlsZVRvQ2FuY2VsLnN0YXR1cztcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0dXMgPT09ICd1cGxvYWRpbmcnIHx8IHByZXZpb3VzU3RhdHVzID09PSAncXVldWVkJykge1xuICAgICAgICAgICAgICAgICAgICBmaWxlVG9DYW5jZWwuc3RhdHVzID0gJ2NhbmNlbGVkJztcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBlbWl0IGlmIGl0IHdhcyBhY3RpdmVseSB1cGxvYWRpbmcgKG5vdCBqdXN0IHF1ZXVlZClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdHVzID09PSAndXBsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRDYW5jZWxlZC5lbWl0KGZpbGVUb0NhbmNlbC5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHdhcyB1cGxvYWRpbmcsIHByb2Nlc3MgdGhlIG5leHQgZmlsZSBpbiBxdWV1ZVxuICAgICAgICAvLyAod2hpY2ggd291bGQgbm93IGJlIGEgZmlsZSBiZWZvcmUgdGhlIGluZGV4IHRoYXQgbWlnaHQgYmUgcXVldWVkKVxuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVzW2luZGV4XT8uc3RhdHVzID09PSAnY2FuY2VsZWQnKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucHJvY2Vzc1F1ZXVlKCksIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIHRoZSBjdXJyZW50IHVwbG9hZFxuICAgIGNhbmNlbEN1cnJlbnRVcGxvYWQoKTogdm9pZCB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGZpbGUgdGhhdCdzIGN1cnJlbnRseSB1cGxvYWRpbmdcbiAgICAgICAgY29uc3QgY3VycmVudFVwbG9hZEluZGV4ID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbmRJbmRleCgoZmlsZSkgPT4gZmlsZS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnKTtcbiAgICAgICAgaWYgKGN1cnJlbnRVcGxvYWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbFVwbG9hZChjdXJyZW50VXBsb2FkSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIGFsbCB1cGxvYWRzXG4gICAgY2FuY2VsQWxsVXBsb2FkcygpOiB2b2lkIHtcbiAgICAgICAgbGV0IGhhZEFjdGl2ZVVwbG9hZHMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSAndXBsb2FkaW5nJyB8fCBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgICAgICAgICAgICBoYWRBY3RpdmVVcGxvYWRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1N0YXR1cyA9IGZpbGUuc3RhdHVzO1xuICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gJ2NhbmNlbGVkJztcblxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXR1cyA9PT0gJ3VwbG9hZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRDYW5jZWxlZC5lbWl0KGZpbGUuZmlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaGFkQWN0aXZlVXBsb2FkcyAmJiAhdGhpcy5oYXNRdWV1ZWRPclVwbG9hZGluZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoJ2lkbGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIGZpbGUgZnJvbSB0aGUgbGlzdFxuICAgIHJlbW92ZUZpbGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWxlVG9SZW1vdmUgPSB0aGlzLnVwbG9hZGVkRmlsZXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIENhbmNlbCBmaXJzdCBpZiBpdCdzIGFjdGl2ZVxuICAgICAgICBpZiAoZmlsZVRvUmVtb3ZlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycgfHwgZmlsZVRvUmVtb3ZlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsVXBsb2FkKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgcmVtb3ZhbCBldmVudFxuICAgICAgICB0aGlzLmZpbGVSZW1vdmVkLmVtaXQoZmlsZVRvUmVtb3ZlLmZpbGUpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGFycmF5XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIC8vIFJlc2V0IHN0YXR1cyBpZiBubyBmaWxlcyBsZWZ0XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cygnaWRsZScpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmhhc1F1ZXVlZE9yVXBsb2FkaW5nICYmIHRoaXMudXBsb2FkU3RhdHVzICE9PSAnY29tcGxldGUnKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSBxdWV1ZWQgb3IgdXBsb2FkaW5nIGZpbGVzIGJ1dCB3ZSBoYXZlIGNvbXBsZXRlZCBmaWxlc1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoJ2NvbXBsZXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYWxsIGZpbGVzXG4gICAgcmVtb3ZlQWxsRmlsZXMoKTogdm9pZCB7XG4gICAgICAgIC8vIENhbmNlbCBhbnkgYWN0aXZlIHVwbG9hZHNcbiAgICAgICAgdGhpcy5jYW5jZWxBbGxVcGxvYWRzKCk7XG5cbiAgICAgICAgLy8gT25seSBlbWl0IGlmIHRoZXJlIHdlcmUgZmlsZXMgdG8gcmVtb3ZlXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hbGxGaWxlc1JlbW92ZWQuZW1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gW107XG4gICAgICAgIHRoaXMudXBkYXRlVXBsb2FkU3RhdHVzKCdpZGxlJyk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1VwbG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkZWRGaWxlcy5zb21lKChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycpO1xuICAgIH1cblxuICAgIGdldCBoYXNRdWV1ZWRPclVwbG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkZWRGaWxlcy5zb21lKChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycgfHwgZmlsZS5zdGF0dXMgPT09ICdxdWV1ZWQnKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAnZXJyb3InKTtcbiAgICB9XG5cbiAgICBnZXQgYWxsVXBsb2Fkc0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGxvYWRlZEZpbGVzLnNvbWUoKGZpbGUpID0+IGZpbGUuc3RhdHVzID09PSAnY29tcGxldGUnKSAmJiAhdGhpcy5oYXNRdWV1ZWRPclVwbG9hZGluZztcbiAgICB9XG5cbiAgICBnZXQgdXBsb2FkaW5nUHJvZ3Jlc3NUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIC8vIENvdW50IGFjdGl2ZSBmaWxlcyAoZXhjbHVkaW5nIGNhbmNlbGVkIG9uZXMpXG4gICAgICAgIGNvbnN0IHRvdGFsQWN0aXZlRmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzQ291bnQ7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5zdGF0dXMgPT09ICdjb21wbGV0ZScpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdXBsb2FkaW5nRmlsZSA9IHRoaXMudXBsb2FkZWRGaWxlcy5maW5kKChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycpO1xuICAgICAgICBpZiAodXBsb2FkaW5nRmlsZSkge1xuICAgICAgICAgICAgLy8gV2UncmUgY3VycmVudGx5IHVwbG9hZGluZyB0aGUgKGNvbXBsZXRlZENvdW50ICsgMSl0aCBhY3RpdmUgZmlsZVxuICAgICAgICAgICAgcmV0dXJuIGBVcGxvYWRpbmcgJHtjb21wbGV0ZWRDb3VudH0vJHt0b3RhbEFjdGl2ZUZpbGVzfSBmaWxlJHt0b3RhbEFjdGl2ZUZpbGVzID4gMSA/ICdzJyA6ICcnfS4uLmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlcy5zb21lKChmaWxlKSA9PiBmaWxlLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFVwbG9hZGluZyAke2NvbXBsZXRlZENvdW50ICsgMX0vJHt0b3RhbEFjdGl2ZUZpbGVzfSBmaWxlJHt0b3RhbEFjdGl2ZUZpbGVzID4gMSA/ICdzJyA6ICcnfS4uLmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBVcGxvYWRpbmcgJHtjb21wbGV0ZWRDb3VudH0vJHt0b3RhbEFjdGl2ZUZpbGVzfSBmaWxlJHt0b3RhbEFjdGl2ZUZpbGVzID4gMSA/ICdzJyA6ICcnfS4uLmA7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG92ZXJhbGwgcHJvZ3Jlc3MgcGVyY2VudGFnZSBhY3Jvc3MgYWxsIGZpbGVzXG4gICAgZ2V0IG92ZXJhbGxQcm9ncmVzcygpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgdG90YWxQcm9ncmVzcyA9IHRoaXMudXBsb2FkZWRGaWxlcy5yZWR1Y2UoKHN1bSwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSAnY29tcGxldGUnKSByZXR1cm4gc3VtICsgMTAwO1xuICAgICAgICAgICAgaWYgKGZpbGUuc3RhdHVzID09PSAnY2FuY2VsZWQnIHx8IGZpbGUuc3RhdHVzID09PSAnZXJyb3InKSByZXR1cm4gc3VtO1xuICAgICAgICAgICAgcmV0dXJuIHN1bSArIChmaWxlLnByb2dyZXNzIHx8IDApO1xuICAgICAgICB9LCAwKTtcblxuICAgICAgICBjb25zdCBhY3RpdmVGaWxlc0NvdW50ID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5zdGF0dXMgIT09ICdjYW5jZWxlZCcgJiYgZmlsZS5zdGF0dXMgIT09ICdlcnJvcicpLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4gYWN0aXZlRmlsZXNDb3VudCA+IDAgPyBNYXRoLnJvdW5kKCh0b3RhbFByb2dyZXNzIC8gKGFjdGl2ZUZpbGVzQ291bnQgKiAxMDApKSAqIDEwMCkgOiAwO1xuICAgIH1cbn1cbiIsIjxwIGNsYXNzPVwiY2F4LWZpbGVzXCI+e3tpbnB1dEZpbGVzfX08L3A+XHJcbjxkaXYgY2xhc3M9XCJjYXgtdXBsb2FkLW1lbnVcIiBbbmdTdHlsZV09XCJzdHlsZVwiXHJcbiAgICAgW2NsYXNzLmRyYWdnaW5nXT1cImlzRHJhZ2dpbmdcIiBcclxuICAgICAoY2xpY2spPVwib3BlbkZpbGVTZWxlY3RvcigpXCI+XHJcbiAgICAgPGlucHV0XHJcbiAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgIGlkPVwiZmlsZUlucHV0LXt7dW5pcXVlSWR9fVwiXHJcbiAgICAgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIlxyXG4gICAgIFttdWx0aXBsZV09XCJhbGxvd011bHRpcGxlXCJcclxuICAgICBbYWNjZXB0XT1cImFjY2VwdEZpbGVUeXBlc1wiXHJcbiAgICAgKGNoYW5nZSk9XCJoYW5kbGVGaWxlSW5wdXQoJGV2ZW50KVwiXHJcbiAgIC8+XHJcblxyXG4gIDwhLS0gRGVmYXVsdCBVcGxvYWQgU3RhdGUgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVwbG9hZFN0YXR1cyA9PT0gJ2lkbGUnXCIgPlxyXG4gICAgPGRpdiBjbGFzcz1cImNheC11cGxvYWQtb3B0aW9uc1wiID5cclxuICAgICAgPHAgY2xhc3M9XCJoaW50LXRleHRcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3AtZmlsZXNcIj5Ecm9wIGZpbGVzIGhlcmU8L3NwYW4+IG9yIGJyb3dzZSBmaWxlcyBmcm9tIHlvdXIgZGV2aWNlXHJcbiAgICAgIDwvcD5cclxuICAgICAgPHAgY2xhc3M9XCJtYXgtc2l6ZVwiPk1heC4gRmlsZSBTaXplOiB7eyBtYXhGaWxlU2l6ZSB9fU1CPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICA8IS0tIFVwbG9hZGluZyBTdGF0ZSAtLT5cclxuPGRpdiAqbmdJZj1cInVwbG9hZFN0YXR1cyA9PT0gJ3VwbG9hZGluZydcIiBjbGFzcz1cImNheC11cGxvYWQtc3RhdHVzIHVwbG9hZGluZ1wiID5cclxuICA8ZGl2IGNsYXNzPVwic3RhdHVzLWNvbnRhaW5lclwiPlxyXG4gICAgPGNheC1wcm9ncmVzc1NwaW5uZXJcclxuICAgICAgICBbc3Ryb2tlQ29sb3JdPVwiJ3ByaW1hcnknXCJcclxuICAgICAgICBbc2l6ZV09XCInbGcnXCJcclxuICAgICAgICBbYW5pbWF0aW9uRHVyYXRpb25dPVwiJzJzJ1wiXHJcbiAgICAgID48L2NheC1wcm9ncmVzc1NwaW5uZXI+XHJcbiAgICA8cCA+e3sgdXBsb2FkaW5nUHJvZ3Jlc3NUZXh0IH19PC9wPlxyXG4gICAgPGNheC1idXR0b25cclxuICAgICAgW2xhYmVsXT1cIidDYW5jZWwnXCJcclxuICAgICAgW3JvdW5kZWRdPVwiZmFsc2VcIlxyXG4gICAgICBbc2V2ZXJpdHldPVwiJ2RhbmdlcidcIlxyXG4gICAgICBbc2l6ZV09XCInbGFyZ2UnXCJcclxuICAgICAgW291dGxpbmVkXT1cIidmYWxzZSdcIlxyXG4gICAgICBbbGlua109XCJ0cnVlXCJcclxuICAgICAgKGNsaWNrKT1cImNhbmNlbEN1cnJlbnRVcGxvYWQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuICA8IS0tIENvbXBsZXRlIFN0YXRlIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJ1cGxvYWRTdGF0dXMgPT09ICdjb21wbGV0ZSdcIiBjbGFzcz1cImNheC11cGxvYWQtc3RhdHVzIGNvbXBsZXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3VjY2Vzcy1pY29uXCI+PGkgY2xhc3M9XCJjYXggY2F4LWNoZWNrXCI+PC9pPjwvZGl2PlxyXG4gICAgICA8cD57e3VwbG9hZFN0cmluZ319PC9wPlxyXG4gICAgICA8Y2F4LWJ1dHRvblxyXG4gICAgICAgIFtsYWJlbF09XCInUmVtb3ZlJ1wiXHJcbiAgICAgICAgW3JvdW5kZWRdPVwiZmFsc2VcIlxyXG4gICAgICAgIFtzZXZlcml0eV09XCInZGFuZ2VyJ1wiXHJcbiAgICAgICAgW3NpemVdPVwiJ2xhcmdlJ1wiXHJcbiAgICAgICAgW291dGxpbmVkXT1cIidmYWxzZSdcIlxyXG4gICAgICAgIFtsaW5rXT1cInRydWVcIlxyXG4gICAgICAgIChjbGljayk9XCJyZW1vdmVBbGxGaWxlcygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cImludmFsaWRcIiBpZD1cImhlbHBlci10ZXh0XCIgY2xhc3M9XCJjYXgtZXJyb3ItdXBsb2FkXCI+PC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwiaW52YWxpZFwiIGlkPVwiaGVscGVyLXRleHRcIiBjbGFzcz1cImNheC1lcnJvci11cGxvYWRcIj5cclxuICB7eyBlcnJvclRleHQgfX1cclxuPC9kaXY+XHJcblxyXG48IS0tIHN0YWNrZWQgZmlsZSAtLT5cclxuPGRpdiAqbmdJZj1cInVwbG9hZGVkRmlsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY2F4LWZpbGUtcHJldmlldy13cmFwcGVyXCIgW25nU3R5bGVdPVwic3R5bGVcIj5cclxuICA8ZGl2XHJcbiAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB1cGxvYWRlZEZpbGVzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgIGNsYXNzPVwiY2F4LWZpbGUtcHJldmlld1wiXHJcbiAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICdxdWV1ZWQnOiBpdGVtLnN0YXR1cyA9PT0gJ3F1ZXVlZCcsXHJcbiAgICAgICd1cGxvYWRpbmcnOiBpdGVtLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycsXHJcbiAgICAgICdjb21wbGV0ZSc6IGl0ZW0uc3RhdHVzID09PSAnY29tcGxldGUnLFxyXG4gICAgICAnY2FuY2VsZWQnOiBpdGVtLnN0YXR1cyA9PT0gJ2NhbmNlbGVkJ1xyXG4gICAgfVwiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtaW5mb1wiPlxyXG4gICAgICA8cCBjbGFzcz1cImZpbGUtbmFtZVwiPnt7IGl0ZW0uZmlsZS5uYW1lIH19PC9wPlxyXG4gICAgPC9kaXY+IFxyXG5cclxuICAgIDwhLS0gU2hvdyBzcGlubmVyIGZvciBxdWV1ZWQgb3IgdXBsb2FkaW5nIGZpbGVzIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSAncXVldWVkJyB8fCBpdGVtLnN0YXR1cyA9PT0gJ3VwbG9hZGluZydcIiBjbGFzcz1cInNwaW5uZXJcIj5cclxuICAgICAgPGNheC1wcm9ncmVzc1NwaW5uZXJcclxuICAgICAgICBbc3Ryb2tlQ29sb3JdPVwiJ3ByaW1hcnknXCJcclxuICAgICAgICBbc2l6ZV09XCInc20nXCJcclxuICAgICAgICBbYW5pbWF0aW9uRHVyYXRpb25dPVwiJzJzJ1wiPlxyXG4gICAgICA8L2NheC1wcm9ncmVzc1NwaW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgPCEtLSBTaG93IHJlbW92ZSBidXR0b24gb25seSBmb3IgY29tcGxldGUgb3IgY2FuY2VsZWQgZmlsZXMgLS0+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICdjb21wbGV0ZScgfHwgaXRlbS5zdGF0dXMgPT09ICdjYW5jZWxlZCdcIlxyXG4gICAgICBjbGFzcz1cInJlbW92ZS1idXR0b25cIlxyXG4gICAgICAoY2xpY2spPVwicmVtb3ZlRmlsZShpKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiY2F4IGNheC1jbG9zZVwiPjwvaT4gXHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
@@ -1015,7 +1015,7 @@ class CascadeSelect {
1015
1015
  this.cd.markForCheck();
1016
1016
  }
1017
1017
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CascadeSelect, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.caxConfig }, { token: i1.OverlayService }], target: i0.ɵɵFactoryTarget.Component });
1018
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.9", type: CascadeSelect, selector: "cax-cascadeSelect", inputs: { id: "id", selectOnFocus: ["selectOnFocus", "selectOnFocus", booleanAttribute], searchMessage: "searchMessage", emptyMessage: "emptyMessage", selectionMessage: "selectionMessage", emptySearchMessage: "emptySearchMessage", emptySelectionMessage: "emptySelectionMessage", searchLocale: "searchLocale", optionDisabled: "optionDisabled", autoOptionFocus: ["autoOptionFocus", "autoOptionFocus", booleanAttribute], styleClass: "styleClass", style: "style", options: "options", optionLabel: "optionLabel", optionValue: "optionValue", optionGroupLabel: "optionGroupLabel", optionGroupChildren: "optionGroupChildren", placeholder: "placeholder", value: "value", dataKey: "dataKey", inputId: "inputId", tabindex: ["tabindex", "tabindex", numberAttribute], ariaLabelledBy: "ariaLabelledBy", inputLabel: "inputLabel", ariaLabel: "ariaLabel", appendTo: "appendTo", disabled: ["disabled", "disabled", booleanAttribute], showClear: ["showClear", "showClear", booleanAttribute], panelStyleClass: "panelStyleClass", panelStyle: "panelStyle", overlayOptions: "overlayOptions", autofocus: ["autofocus", "autofocus", booleanAttribute], showTransitionOptions: "showTransitionOptions", variant: "variant", loading: ["loading", "loading", booleanAttribute], loadingIcon: "loadingIcon", hideTransitionOptions: "hideTransitionOptions" }, outputs: { onChange: "onChange", onGroupChange: "onGroupChange", onShow: "onShow", onHide: "onHide", onClear: "onClear", onBeforeShow: "onBeforeShow", onBeforeHide: "onBeforeHide", onFocus: "onFocus", onBlur: "onBlur" }, host: { properties: { "class.cax-inputwrapper-filled": "filled", "class.cax-inputwrapper-focus": "focused || overlayVisible", "class.cax-cascadeselect-clearable": "showClear && !disabled" }, classAttribute: "cax-element cax-inputwrapper" }, providers: [CASCADESELECT_VALUE_ACCESSOR], queries: [{ propertyName: "templates", predicate: CaxTemplate }], viewQueries: [{ propertyName: "focusInputViewChild", first: true, predicate: ["focusInput"], descendants: true }, { propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }, { propertyName: "panelViewChild", first: true, predicate: ["panel"], descendants: true }, { propertyName: "overlayViewChild", first: true, predicate: ["overlay"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container [ngClass]=\"containerClass\" [class]=\"styleClass\" [ngStyle]=\"style\" (click)=\"onContainerClick($event)\" [attr.data-pc-name]=\"'cascadeselect'\" [attr.data-pc-section]=\"'root'\">\r\n <div class=\"cax-hidden-accessible\" [attr.data-pc-section]=\"'hiddenInputWrapper'\">\r\n <input\r\n #focusInput\r\n readonly\r\n type=\"text\"\r\n role=\"combobox\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"!disabled ? tabindex : -1\"\r\n [attr.id]=\"inputId\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n aria-haspopup=\"tree\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? id + '_tree' : null\"\r\n [attr.aria-activedescendant]=\"focused ? focusedOptionId : undefined\"\r\n (focus)=\"onInputFocus($event)\"\r\n (blur)=\"onInputBlur($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n pAutoFocus\r\n [autofocus]=\"autofocus\"\r\n />\r\n </div>\r\n <span [ngClass]=\"labelClass\" [attr.data-pc-section]=\"'label'\">\r\n <ng-container *ngIf=\"valueTemplate; else defaultValueTemplate\">\r\n <ng-container *ngTemplateOutlet=\"valueTemplate; context: { $implicit: value, placeholder: placeholder }\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultValueTemplate> {{ label() }} </ng-template>\r\n </span>\r\n\r\n <ng-container *ngIf=\"filled && !disabled && showClear\">\r\n <TimesIcon *ngIf=\"!clearIconTemplate\" [styleClass]=\"'cax-cascadeselect-clear-icon'\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\" />\r\n <span *ngIf=\"clearIconTemplate\" class=\"cax-cascadeselect-clear-icon\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\">\r\n <ng-template *ngTemplateOutlet=\"clearIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n\r\n <div class=\"cax-cascadeselect-trigger\" role=\"button\" aria-haspopup=\"listbox\" [attr.aria-expanded]=\"overlayVisible ?? false\" [attr.data-pc-section]=\"'dropdownIcon'\" [attr.aria-hidden]=\"true\">\r\n <ng-container *ngIf=\"loading; else elseBlock\">\r\n <ng-container *ngIf=\"loadingIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingIconTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!loadingIconTemplate\">\r\n <span *ngIf=\"loadingIcon\" [ngClass]=\"'cax-cascadeselect-trigger-icon pi-spin ' + loadingIcon\" aria-hidden=\"true\"></span>\r\n <span *ngIf=\"!loadingIcon\" [class]=\"'cax-cascadeselect-trigger-icon pi pi-spinner pi-spin'\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <ChevronDownIcon *ngIf=\"!triggerIconTemplate\" [styleClass]=\"'cax-cascadeselect-trigger-icon'\" />\r\n <span *ngIf=\"triggerIconTemplate\" class=\"cax-cascadeselect-trigger-icon\">\r\n <ng-template *ngTemplateOutlet=\"triggerIconTemplate\"></ng-template>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ searchResultMessageText }} </span>\r\n <cax-overlay\r\n #overlay\r\n [(visible)]=\"overlayVisible\"\r\n [options]=\"overlayOptions\"\r\n [target]=\"'@parent'\"\r\n [appendTo]=\"appendTo\"\r\n [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\"\r\n (onAnimationDone)=\"onOverlayAnimationDone($event)\"\r\n (onBeforeShow)=\"onBeforeShow.emit($event)\"\r\n (onShow)=\"show($event)\"\r\n (onBeforeHide)=\"onBeforeHide.emit($event)\"\r\n (onHide)=\"hide($event)\"\r\n >\r\n <ng-template caxTemplate=\"content\">\r\n <div #panel class=\"cax-cascadeselect-panel cax-component cax-overlay-scroll\" [class]=\"panelStyleClass\" [ngStyle]=\"panelStyle\" [attr.data-pc-section]=\"'panel'\">\r\n <div class=\"cax-cascadeselect-items-wrapper\" [attr.data-pc-section]=\"'wrapper'\">\r\n <cax-cascadeSelectSub\r\n [options]=\"processedOptions\"\r\n [selectId]=\"id\"\r\n [focusedOptionId]=\"focused ? focusedOptionId : undefined\"\r\n [activeOptionPath]=\"activeOptionPath()\"\r\n [optionLabel]=\"optionLabel\"\r\n [optionValue]=\"optionValue\"\r\n [level]=\"0\"\r\n [optionTemplate]=\"optionTemplate\"\r\n [groupIconTemplate]=\"groupIconTemplate\"\r\n [optionGroupLabel]=\"optionGroupLabel\"\r\n [optionGroupChildren]=\"optionGroupChildren\"\r\n [optionDisabled]=\"optionDisabled\"\r\n [optionValue]=\"optionValue\"\r\n [optionLabel]=\"optionLabel\"\r\n [root]=\"true\"\r\n (onChange)=\"onOptionChange($event)\"\r\n [dirty]=\"dirty\"\r\n [role]=\"'tree'\"\r\n >\r\n </cax-cascadeSelectSub>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ selectedMessageText }} </span>\r\n </div>\r\n </ng-template>\r\n </cax-overlay>\r\n</div>\r\n", styles: ["@layer cax{.cax-cascadeselect{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.cax-cascadeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.cax-cascadeselect-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.cax-cascadeselect-label-empty{overflow:hidden;visibility:hidden}.cax-cascadeselect-item{cursor:pointer;font-weight:400;white-space:nowrap}.cax-cascadeselect-item-content{display:flex;align-items:center;overflow:hidden;position:relative}.cax-cascadeselect-group-icon{margin-left:auto;display:inline-flex}.cax-cascadeselect-items{margin:0;padding:0;list-style-type:none}.cax-fluid .cax-cascadeselect{display:flex}.cax-fluid .cax-cascadeselect .cax-cascadeselect-label{width:1%}.cax-cascadeselect-sublist{position:absolute;min-width:100%;z-index:1;display:none;max-height:300px;overflow-y:auto;overflow-x:hidden}.cax-cascadeselect-item-active{overflow:visible!important}.cax-cascadeselect-item-active>.cax-cascadeselect-sublist{display:block;left:100%;top:0;margin-left:4px}.cax-cascadeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.cax-cascadeselect-clearable,.cax-overlay-modal .cax-cascadeselect-sublist{position:relative}.cax-overlay-modal .cax-cascadeselect-item-active>.cax-cascadeselect-sublist{left:0}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.Overlay, selector: "cax-overlay", inputs: ["visible", "mode", "style", "styleClass", "contentStyle", "contentStyleClass", "target", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "listener", "responsive", "options"], outputs: ["visibleChange", "onBeforeShow", "onShow", "onBeforeHide", "onHide", "onAnimationStart", "onAnimationDone"] }, { kind: "directive", type: i1.CaxTemplate, selector: "[caxTemplate]", inputs: ["type", "caxTemplate"] }, { kind: "component", type: i5.ChevronDownIcon, selector: "ChevronDownIcon" }, { kind: "component", type: i6.TimesIcon, selector: "TimesIcon" }, { kind: "component", type: CascadeSelectSub, selector: "cax-cascadeSelectSub", inputs: ["role", "selectId", "activeOptionPath", "optionDisabled", "focusedOptionId", "options", "optionGroupChildren", "optionTemplate", "groupIconTemplate", "level", "optionLabel", "optionValue", "optionGroupLabel", "dirty", "root"], outputs: ["onChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1018
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.9", type: CascadeSelect, selector: "cax-cascadeSelect", inputs: { id: "id", selectOnFocus: ["selectOnFocus", "selectOnFocus", booleanAttribute], searchMessage: "searchMessage", emptyMessage: "emptyMessage", selectionMessage: "selectionMessage", emptySearchMessage: "emptySearchMessage", emptySelectionMessage: "emptySelectionMessage", searchLocale: "searchLocale", optionDisabled: "optionDisabled", autoOptionFocus: ["autoOptionFocus", "autoOptionFocus", booleanAttribute], styleClass: "styleClass", style: "style", options: "options", optionLabel: "optionLabel", optionValue: "optionValue", optionGroupLabel: "optionGroupLabel", optionGroupChildren: "optionGroupChildren", placeholder: "placeholder", value: "value", dataKey: "dataKey", inputId: "inputId", tabindex: ["tabindex", "tabindex", numberAttribute], ariaLabelledBy: "ariaLabelledBy", inputLabel: "inputLabel", ariaLabel: "ariaLabel", appendTo: "appendTo", disabled: ["disabled", "disabled", booleanAttribute], showClear: ["showClear", "showClear", booleanAttribute], panelStyleClass: "panelStyleClass", panelStyle: "panelStyle", overlayOptions: "overlayOptions", autofocus: ["autofocus", "autofocus", booleanAttribute], showTransitionOptions: "showTransitionOptions", variant: "variant", loading: ["loading", "loading", booleanAttribute], loadingIcon: "loadingIcon", hideTransitionOptions: "hideTransitionOptions" }, outputs: { onChange: "onChange", onGroupChange: "onGroupChange", onShow: "onShow", onHide: "onHide", onClear: "onClear", onBeforeShow: "onBeforeShow", onBeforeHide: "onBeforeHide", onFocus: "onFocus", onBlur: "onBlur" }, host: { properties: { "class.cax-inputwrapper-filled": "filled", "class.cax-inputwrapper-focus": "focused || overlayVisible", "class.cax-cascadeselect-clearable": "showClear && !disabled" }, classAttribute: "cax-element cax-inputwrapper" }, providers: [CASCADESELECT_VALUE_ACCESSOR], queries: [{ propertyName: "templates", predicate: CaxTemplate }], viewQueries: [{ propertyName: "focusInputViewChild", first: true, predicate: ["focusInput"], descendants: true }, { propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }, { propertyName: "panelViewChild", first: true, predicate: ["panel"], descendants: true }, { propertyName: "overlayViewChild", first: true, predicate: ["overlay"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container [ngClass]=\"containerClass\" [class]=\"styleClass\" [ngStyle]=\"style\" (click)=\"onContainerClick($event)\" [attr.data-pc-name]=\"'cascadeselect'\" [attr.data-pc-section]=\"'root'\">\r\n <div class=\"cax-hidden-accessible\" [attr.data-pc-section]=\"'hiddenInputWrapper'\">\r\n <input\r\n #focusInput\r\n readonly\r\n type=\"text\"\r\n role=\"combobox\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"!disabled ? tabindex : -1\"\r\n [attr.id]=\"inputId\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n aria-haspopup=\"tree\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? id + '_tree' : null\"\r\n [attr.aria-activedescendant]=\"focused ? focusedOptionId : undefined\"\r\n (focus)=\"onInputFocus($event)\"\r\n (blur)=\"onInputBlur($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n pAutoFocus\r\n [autofocus]=\"autofocus\"\r\n />\r\n </div>\r\n <span [ngClass]=\"labelClass\" [attr.data-pc-section]=\"'label'\">\r\n <ng-container *ngIf=\"valueTemplate; else defaultValueTemplate\">\r\n <ng-container *ngTemplateOutlet=\"valueTemplate; context: { $implicit: value, placeholder: placeholder }\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultValueTemplate> {{ label() }} </ng-template>\r\n </span>\r\n\r\n <ng-container *ngIf=\"filled && !disabled && showClear\">\r\n <TimesIcon *ngIf=\"!clearIconTemplate\" [styleClass]=\"'cax-cascadeselect-clear-icon'\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\" />\r\n <span *ngIf=\"clearIconTemplate\" class=\"cax-cascadeselect-clear-icon\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\">\r\n <ng-template *ngTemplateOutlet=\"clearIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n\r\n <div class=\"cax-cascadeselect-trigger\" role=\"button\" aria-haspopup=\"listbox\" [attr.aria-expanded]=\"overlayVisible ?? false\" [attr.data-pc-section]=\"'dropdownIcon'\" [attr.aria-hidden]=\"true\">\r\n <ng-container *ngIf=\"loading; else elseBlock\">\r\n <ng-container *ngIf=\"loadingIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingIconTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!loadingIconTemplate\">\r\n <span *ngIf=\"loadingIcon\" [ngClass]=\"'cax-cascadeselect-trigger-icon pi-spin ' + loadingIcon\" aria-hidden=\"true\"></span>\r\n <span *ngIf=\"!loadingIcon\" [class]=\"'cax-cascadeselect-trigger-icon pi pi-spinner pi-spin'\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <ChevronDownIcon *ngIf=\"!triggerIconTemplate\" [styleClass]=\"'cax-cascadeselect-trigger-icon'\" />\r\n <span *ngIf=\"triggerIconTemplate\" class=\"cax-cascadeselect-trigger-icon\">\r\n <ng-template *ngTemplateOutlet=\"triggerIconTemplate\"></ng-template>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ searchResultMessageText }} </span>\r\n <cax-overlay\r\n #overlay\r\n [(visible)]=\"overlayVisible\"\r\n [options]=\"overlayOptions\"\r\n [target]=\"'@parent'\"\r\n [appendTo]=\"appendTo\"\r\n [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\"\r\n (onAnimationDone)=\"onOverlayAnimationDone($event)\"\r\n (onBeforeShow)=\"onBeforeShow.emit($event)\"\r\n (onShow)=\"show($event)\"\r\n (onBeforeHide)=\"onBeforeHide.emit($event)\"\r\n (onHide)=\"hide($event)\"\r\n >\r\n <ng-template caxTemplate=\"content\">\r\n <div #panel class=\"cax-cascadeselect-panel cax-component cax-overlay-scroll\" [class]=\"panelStyleClass\" [ngStyle]=\"panelStyle\" [attr.data-pc-section]=\"'panel'\">\r\n <div class=\"cax-cascadeselect-items-wrapper\" [attr.data-pc-section]=\"'wrapper'\">\r\n <cax-cascadeSelectSub\r\n [options]=\"processedOptions\"\r\n [selectId]=\"id\"\r\n [focusedOptionId]=\"focused ? focusedOptionId : undefined\"\r\n [activeOptionPath]=\"activeOptionPath()\"\r\n [optionLabel]=\"optionLabel\"\r\n [optionValue]=\"optionValue\"\r\n [level]=\"0\"\r\n [optionTemplate]=\"optionTemplate\"\r\n [groupIconTemplate]=\"groupIconTemplate\"\r\n [optionGroupLabel]=\"optionGroupLabel\"\r\n [optionGroupChildren]=\"optionGroupChildren\"\r\n [optionDisabled]=\"optionDisabled\"\r\n [optionValue]=\"optionValue\"\r\n [optionLabel]=\"optionLabel\"\r\n [root]=\"true\"\r\n (onChange)=\"onOptionChange($event)\"\r\n [dirty]=\"dirty\"\r\n [role]=\"'tree'\"\r\n >\r\n </cax-cascadeSelectSub>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ selectedMessageText }} </span>\r\n </div>\r\n </ng-template>\r\n </cax-overlay>\r\n</div>\r\n", styles: ["@layer cax{.cax-cascadeselect{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.cax-cascadeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.cax-cascadeselect-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.cax-cascadeselect-label-empty{overflow:hidden;visibility:hidden}.cax-cascadeselect-item{cursor:pointer;font-weight:400;white-space:nowrap}.cax-cascadeselect-item-content{display:flex;align-items:center;overflow:hidden;position:relative}.cax-cascadeselect-group-icon{margin-left:auto;display:inline-flex}.cax-cascadeselect-items{margin:0;padding:0;list-style-type:none}.cax-fluid .cax-cascadeselect{display:flex}.cax-fluid .cax-cascadeselect .cax-cascadeselect-label{width:1%}.cax-cascadeselect-sublist{position:absolute;min-width:100%;z-index:1;display:none;max-height:300px}.cax-cascadeselect-items-wrapper{overflow-x:hidden}.cax-cascadeselect-item-active{overflow:visible!important}.cax-cascadeselect-item-active>.cax-cascadeselect-sublist{display:block;left:100%;top:4px;margin-left:8px}.cax-cascadeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.cax-cascadeselect-clearable,.cax-overlay-modal .cax-cascadeselect-sublist{position:relative}.cax-overlay-modal .cax-cascadeselect-item-active>.cax-cascadeselect-sublist{left:0}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.Overlay, selector: "cax-overlay", inputs: ["visible", "mode", "style", "styleClass", "contentStyle", "contentStyleClass", "target", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "listener", "responsive", "options"], outputs: ["visibleChange", "onBeforeShow", "onShow", "onBeforeHide", "onHide", "onAnimationStart", "onAnimationDone"] }, { kind: "directive", type: i1.CaxTemplate, selector: "[caxTemplate]", inputs: ["type", "caxTemplate"] }, { kind: "component", type: i5.ChevronDownIcon, selector: "ChevronDownIcon" }, { kind: "component", type: i6.TimesIcon, selector: "TimesIcon" }, { kind: "component", type: CascadeSelectSub, selector: "cax-cascadeSelectSub", inputs: ["role", "selectId", "activeOptionPath", "optionDisabled", "focusedOptionId", "options", "optionGroupChildren", "optionTemplate", "groupIconTemplate", "level", "optionLabel", "optionValue", "optionGroupLabel", "dirty", "root"], outputs: ["onChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1019
1019
  }
1020
1020
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CascadeSelect, decorators: [{
1021
1021
  type: Component,
@@ -1024,7 +1024,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
1024
1024
  '[class.cax-inputwrapper-filled]': 'filled',
1025
1025
  '[class.cax-inputwrapper-focus]': 'focused || overlayVisible',
1026
1026
  '[class.cax-cascadeselect-clearable]': 'showClear && !disabled'
1027
- }, providers: [CASCADESELECT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div #container [ngClass]=\"containerClass\" [class]=\"styleClass\" [ngStyle]=\"style\" (click)=\"onContainerClick($event)\" [attr.data-pc-name]=\"'cascadeselect'\" [attr.data-pc-section]=\"'root'\">\r\n <div class=\"cax-hidden-accessible\" [attr.data-pc-section]=\"'hiddenInputWrapper'\">\r\n <input\r\n #focusInput\r\n readonly\r\n type=\"text\"\r\n role=\"combobox\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"!disabled ? tabindex : -1\"\r\n [attr.id]=\"inputId\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n aria-haspopup=\"tree\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? id + '_tree' : null\"\r\n [attr.aria-activedescendant]=\"focused ? focusedOptionId : undefined\"\r\n (focus)=\"onInputFocus($event)\"\r\n (blur)=\"onInputBlur($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n pAutoFocus\r\n [autofocus]=\"autofocus\"\r\n />\r\n </div>\r\n <span [ngClass]=\"labelClass\" [attr.data-pc-section]=\"'label'\">\r\n <ng-container *ngIf=\"valueTemplate; else defaultValueTemplate\">\r\n <ng-container *ngTemplateOutlet=\"valueTemplate; context: { $implicit: value, placeholder: placeholder }\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultValueTemplate> {{ label() }} </ng-template>\r\n </span>\r\n\r\n <ng-container *ngIf=\"filled && !disabled && showClear\">\r\n <TimesIcon *ngIf=\"!clearIconTemplate\" [styleClass]=\"'cax-cascadeselect-clear-icon'\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\" />\r\n <span *ngIf=\"clearIconTemplate\" class=\"cax-cascadeselect-clear-icon\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\">\r\n <ng-template *ngTemplateOutlet=\"clearIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n\r\n <div class=\"cax-cascadeselect-trigger\" role=\"button\" aria-haspopup=\"listbox\" [attr.aria-expanded]=\"overlayVisible ?? false\" [attr.data-pc-section]=\"'dropdownIcon'\" [attr.aria-hidden]=\"true\">\r\n <ng-container *ngIf=\"loading; else elseBlock\">\r\n <ng-container *ngIf=\"loadingIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingIconTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!loadingIconTemplate\">\r\n <span *ngIf=\"loadingIcon\" [ngClass]=\"'cax-cascadeselect-trigger-icon pi-spin ' + loadingIcon\" aria-hidden=\"true\"></span>\r\n <span *ngIf=\"!loadingIcon\" [class]=\"'cax-cascadeselect-trigger-icon pi pi-spinner pi-spin'\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <ChevronDownIcon *ngIf=\"!triggerIconTemplate\" [styleClass]=\"'cax-cascadeselect-trigger-icon'\" />\r\n <span *ngIf=\"triggerIconTemplate\" class=\"cax-cascadeselect-trigger-icon\">\r\n <ng-template *ngTemplateOutlet=\"triggerIconTemplate\"></ng-template>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ searchResultMessageText }} </span>\r\n <cax-overlay\r\n #overlay\r\n [(visible)]=\"overlayVisible\"\r\n [options]=\"overlayOptions\"\r\n [target]=\"'@parent'\"\r\n [appendTo]=\"appendTo\"\r\n [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\"\r\n (onAnimationDone)=\"onOverlayAnimationDone($event)\"\r\n (onBeforeShow)=\"onBeforeShow.emit($event)\"\r\n (onShow)=\"show($event)\"\r\n (onBeforeHide)=\"onBeforeHide.emit($event)\"\r\n (onHide)=\"hide($event)\"\r\n >\r\n <ng-template caxTemplate=\"content\">\r\n <div #panel class=\"cax-cascadeselect-panel cax-component cax-overlay-scroll\" [class]=\"panelStyleClass\" [ngStyle]=\"panelStyle\" [attr.data-pc-section]=\"'panel'\">\r\n <div class=\"cax-cascadeselect-items-wrapper\" [attr.data-pc-section]=\"'wrapper'\">\r\n <cax-cascadeSelectSub\r\n [options]=\"processedOptions\"\r\n [selectId]=\"id\"\r\n [focusedOptionId]=\"focused ? focusedOptionId : undefined\"\r\n [activeOptionPath]=\"activeOptionPath()\"\r\n [optionLabel]=\"optionLabel\"\r\n [optionValue]=\"optionValue\"\r\n [level]=\"0\"\r\n [optionTemplate]=\"optionTemplate\"\r\n [groupIconTemplate]=\"groupIconTemplate\"\r\n [optionGroupLabel]=\"optionGroupLabel\"\r\n [optionGroupChildren]=\"optionGroupChildren\"\r\n [optionDisabled]=\"optionDisabled\"\r\n [optionValue]=\"optionValue\"\r\n [optionLabel]=\"optionLabel\"\r\n [root]=\"true\"\r\n (onChange)=\"onOptionChange($event)\"\r\n [dirty]=\"dirty\"\r\n [role]=\"'tree'\"\r\n >\r\n </cax-cascadeSelectSub>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ selectedMessageText }} </span>\r\n </div>\r\n </ng-template>\r\n </cax-overlay>\r\n</div>\r\n", styles: ["@layer cax{.cax-cascadeselect{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.cax-cascadeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.cax-cascadeselect-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.cax-cascadeselect-label-empty{overflow:hidden;visibility:hidden}.cax-cascadeselect-item{cursor:pointer;font-weight:400;white-space:nowrap}.cax-cascadeselect-item-content{display:flex;align-items:center;overflow:hidden;position:relative}.cax-cascadeselect-group-icon{margin-left:auto;display:inline-flex}.cax-cascadeselect-items{margin:0;padding:0;list-style-type:none}.cax-fluid .cax-cascadeselect{display:flex}.cax-fluid .cax-cascadeselect .cax-cascadeselect-label{width:1%}.cax-cascadeselect-sublist{position:absolute;min-width:100%;z-index:1;display:none;max-height:300px;overflow-y:auto;overflow-x:hidden}.cax-cascadeselect-item-active{overflow:visible!important}.cax-cascadeselect-item-active>.cax-cascadeselect-sublist{display:block;left:100%;top:0;margin-left:4px}.cax-cascadeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.cax-cascadeselect-clearable,.cax-overlay-modal .cax-cascadeselect-sublist{position:relative}.cax-overlay-modal .cax-cascadeselect-item-active>.cax-cascadeselect-sublist{left:0}}\n"] }]
1027
+ }, providers: [CASCADESELECT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div #container [ngClass]=\"containerClass\" [class]=\"styleClass\" [ngStyle]=\"style\" (click)=\"onContainerClick($event)\" [attr.data-pc-name]=\"'cascadeselect'\" [attr.data-pc-section]=\"'root'\">\r\n <div class=\"cax-hidden-accessible\" [attr.data-pc-section]=\"'hiddenInputWrapper'\">\r\n <input\r\n #focusInput\r\n readonly\r\n type=\"text\"\r\n role=\"combobox\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [tabindex]=\"!disabled ? tabindex : -1\"\r\n [attr.id]=\"inputId\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n aria-haspopup=\"tree\"\r\n [attr.aria-expanded]=\"overlayVisible ?? false\"\r\n [attr.aria-controls]=\"overlayVisible ? id + '_tree' : null\"\r\n [attr.aria-activedescendant]=\"focused ? focusedOptionId : undefined\"\r\n (focus)=\"onInputFocus($event)\"\r\n (blur)=\"onInputBlur($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n pAutoFocus\r\n [autofocus]=\"autofocus\"\r\n />\r\n </div>\r\n <span [ngClass]=\"labelClass\" [attr.data-pc-section]=\"'label'\">\r\n <ng-container *ngIf=\"valueTemplate; else defaultValueTemplate\">\r\n <ng-container *ngTemplateOutlet=\"valueTemplate; context: { $implicit: value, placeholder: placeholder }\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultValueTemplate> {{ label() }} </ng-template>\r\n </span>\r\n\r\n <ng-container *ngIf=\"filled && !disabled && showClear\">\r\n <TimesIcon *ngIf=\"!clearIconTemplate\" [styleClass]=\"'cax-cascadeselect-clear-icon'\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\" />\r\n <span *ngIf=\"clearIconTemplate\" class=\"cax-cascadeselect-clear-icon\" (click)=\"clear($event)\" [attr.data-pc-section]=\"'clearicon'\" [attr.aria-hidden]=\"true\">\r\n <ng-template *ngTemplateOutlet=\"clearIconTemplate\"></ng-template>\r\n </span>\r\n </ng-container>\r\n\r\n <div class=\"cax-cascadeselect-trigger\" role=\"button\" aria-haspopup=\"listbox\" [attr.aria-expanded]=\"overlayVisible ?? false\" [attr.data-pc-section]=\"'dropdownIcon'\" [attr.aria-hidden]=\"true\">\r\n <ng-container *ngIf=\"loading; else elseBlock\">\r\n <ng-container *ngIf=\"loadingIconTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingIconTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!loadingIconTemplate\">\r\n <span *ngIf=\"loadingIcon\" [ngClass]=\"'cax-cascadeselect-trigger-icon pi-spin ' + loadingIcon\" aria-hidden=\"true\"></span>\r\n <span *ngIf=\"!loadingIcon\" [class]=\"'cax-cascadeselect-trigger-icon pi pi-spinner pi-spin'\" aria-hidden=\"true\"></span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <ChevronDownIcon *ngIf=\"!triggerIconTemplate\" [styleClass]=\"'cax-cascadeselect-trigger-icon'\" />\r\n <span *ngIf=\"triggerIconTemplate\" class=\"cax-cascadeselect-trigger-icon\">\r\n <ng-template *ngTemplateOutlet=\"triggerIconTemplate\"></ng-template>\r\n </span>\r\n </ng-template>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ searchResultMessageText }} </span>\r\n <cax-overlay\r\n #overlay\r\n [(visible)]=\"overlayVisible\"\r\n [options]=\"overlayOptions\"\r\n [target]=\"'@parent'\"\r\n [appendTo]=\"appendTo\"\r\n [showTransitionOptions]=\"showTransitionOptions\"\r\n [hideTransitionOptions]=\"hideTransitionOptions\"\r\n (onAnimationDone)=\"onOverlayAnimationDone($event)\"\r\n (onBeforeShow)=\"onBeforeShow.emit($event)\"\r\n (onShow)=\"show($event)\"\r\n (onBeforeHide)=\"onBeforeHide.emit($event)\"\r\n (onHide)=\"hide($event)\"\r\n >\r\n <ng-template caxTemplate=\"content\">\r\n <div #panel class=\"cax-cascadeselect-panel cax-component cax-overlay-scroll\" [class]=\"panelStyleClass\" [ngStyle]=\"panelStyle\" [attr.data-pc-section]=\"'panel'\">\r\n <div class=\"cax-cascadeselect-items-wrapper\" [attr.data-pc-section]=\"'wrapper'\">\r\n <cax-cascadeSelectSub\r\n [options]=\"processedOptions\"\r\n [selectId]=\"id\"\r\n [focusedOptionId]=\"focused ? focusedOptionId : undefined\"\r\n [activeOptionPath]=\"activeOptionPath()\"\r\n [optionLabel]=\"optionLabel\"\r\n [optionValue]=\"optionValue\"\r\n [level]=\"0\"\r\n [optionTemplate]=\"optionTemplate\"\r\n [groupIconTemplate]=\"groupIconTemplate\"\r\n [optionGroupLabel]=\"optionGroupLabel\"\r\n [optionGroupChildren]=\"optionGroupChildren\"\r\n [optionDisabled]=\"optionDisabled\"\r\n [optionValue]=\"optionValue\"\r\n [optionLabel]=\"optionLabel\"\r\n [root]=\"true\"\r\n (onChange)=\"onOptionChange($event)\"\r\n [dirty]=\"dirty\"\r\n [role]=\"'tree'\"\r\n >\r\n </cax-cascadeSelectSub>\r\n </div>\r\n <span role=\"status\" aria-live=\"polite\" class=\"cax-hidden-accessible\"> {{ selectedMessageText }} </span>\r\n </div>\r\n </ng-template>\r\n </cax-overlay>\r\n</div>\r\n", styles: ["@layer cax{.cax-cascadeselect{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.cax-cascadeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.cax-cascadeselect-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.cax-cascadeselect-label-empty{overflow:hidden;visibility:hidden}.cax-cascadeselect-item{cursor:pointer;font-weight:400;white-space:nowrap}.cax-cascadeselect-item-content{display:flex;align-items:center;overflow:hidden;position:relative}.cax-cascadeselect-group-icon{margin-left:auto;display:inline-flex}.cax-cascadeselect-items{margin:0;padding:0;list-style-type:none}.cax-fluid .cax-cascadeselect{display:flex}.cax-fluid .cax-cascadeselect .cax-cascadeselect-label{width:1%}.cax-cascadeselect-sublist{position:absolute;min-width:100%;z-index:1;display:none;max-height:300px}.cax-cascadeselect-items-wrapper{overflow-x:hidden}.cax-cascadeselect-item-active{overflow:visible!important}.cax-cascadeselect-item-active>.cax-cascadeselect-sublist{display:block;left:100%;top:4px;margin-left:8px}.cax-cascadeselect-clear-icon{position:absolute;top:50%;margin-top:-.5rem;cursor:pointer}.cax-cascadeselect-clearable,.cax-overlay-modal .cax-cascadeselect-sublist{position:relative}.cax-overlay-modal .cax-cascadeselect-item-active>.cax-cascadeselect-sublist{left:0}}\n"] }]
1028
1028
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.caxConfig }, { type: i1.OverlayService }], propDecorators: { id: [{
1029
1029
  type: Input
1030
1030
  }], selectOnFocus: [{