@sunbird-cb/cbp-ai 0.1.75 → 0.1.77

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.
@@ -12,10 +12,11 @@ import * as i4 from "@angular/material/snack-bar";
12
12
  import * as i5 from "@angular/common";
13
13
  import * as i6 from "@angular/material/legacy-card";
14
14
  import * as i7 from "@angular/material/legacy-form-field";
15
- import * as i8 from "@angular/material/icon";
16
- import * as i9 from "@angular/material/legacy-select";
17
- import * as i10 from "@angular/material/legacy-core";
18
- import * as i11 from "@angular/material/progress-spinner";
15
+ import * as i8 from "@angular/material/legacy-button";
16
+ import * as i9 from "@angular/material/icon";
17
+ import * as i10 from "@angular/material/legacy-select";
18
+ import * as i11 from "@angular/material/legacy-core";
19
+ import * as i12 from "@angular/material/progress-spinner";
19
20
  export class AddDesignationComponent {
20
21
  constructor(dialogRef, data, fb, cdRef, sharedService, snackBar) {
21
22
  this.dialogRef = dialogRef;
@@ -50,6 +51,9 @@ export class AddDesignationComponent {
50
51
  this.masterData = {};
51
52
  this.searchDesignationLoadCount = 50;
52
53
  this.matchedDesignationIds = [];
54
+ this.MAX_DESIGNATIONS = 10;
55
+ this.maxDesignationCount = 10;
56
+ this.designationScrollHandler = this.onDesignationSelectScroll.bind(this);
53
57
  this.masterData = {
54
58
  designationBackup: [],
55
59
  designationFiltered: [], // filtered search results
@@ -59,31 +63,36 @@ export class AddDesignationComponent {
59
63
  console.log('this.matched_role_mappings', this.data?.matched_role_mappings);
60
64
  this.matchedDesignationIds = this.data?.matched_role_mappings?.map((item) => item?.igot_designation_id) || [];
61
65
  this.initializeForm();
62
- const searchControl = this.designationForm.get('searchDesignation');
63
- if (searchControl) {
64
- searchControl.valueChanges
65
- .pipe(debounceTime(300), distinctUntilChanged())
66
- .subscribe((res) => {
67
- const txt = res?.toString()?.trim() ?? '';
68
- this.designationSearchText = txt;
69
- // RESET SEARCH PAGINATION
70
- this.searchDesignationLoadCount = 50;
71
- if (txt?.length) {
72
- this.desigantionFilterEnable = true;
73
- // API SEARCH ONLY
74
- this.getDesignation(txt, 0);
75
- }
76
- else {
77
- this.desigantionFilterEnable = false;
78
- this.masterData.designation =
79
- (this.masterData.designationBackup || []).slice(0, this.designationDefaultLoadCount);
80
- this.designationListLoadCount =
81
- this.designationDefaultLoadCount;
82
- this.designationOffset = 0;
83
- this.checkCurrentDesignationPresent();
84
- }
85
- });
86
- }
66
+ // const searchControl = this.designationForm.get('searchDesignation');
67
+ // if (searchControl) {
68
+ // searchControl.valueChanges
69
+ // .pipe(
70
+ // debounceTime(300),
71
+ // distinctUntilChanged()
72
+ // )
73
+ // .subscribe((res: any) => {
74
+ // const txt = res?.toString()?.trim() ?? '';
75
+ // this.designationSearchText = txt;
76
+ // // RESET SEARCH PAGINATION
77
+ // this.searchDesignationLoadCount = 50;
78
+ // if (txt?.length) {
79
+ // this.desigantionFilterEnable = true;
80
+ // // API SEARCH ONLY
81
+ // this.getDesignation(txt, 0);
82
+ // } else {
83
+ // this.desigantionFilterEnable = false;
84
+ // this.masterData.designation =
85
+ // (this.masterData.designationBackup || []).slice(
86
+ // 0,
87
+ // this.designationDefaultLoadCount
88
+ // );
89
+ // this.designationListLoadCount =
90
+ // this.designationDefaultLoadCount;
91
+ // this.designationOffset = 0;
92
+ // this.checkCurrentDesignationPresent();
93
+ // }
94
+ // });
95
+ // }
87
96
  if (!this.masterData.designationBackup ||
88
97
  this.masterData.designationBackup.length === 0) {
89
98
  this.getDesignationSafe();
@@ -98,14 +107,67 @@ export class AddDesignationComponent {
98
107
  }
99
108
  initializeForm() {
100
109
  this.designationForm = this.fb.group({
101
- designation_name: [[], Validators.required],
110
+ designations: this.fb.array([])
111
+ });
112
+ this.addDesignationBlock();
113
+ }
114
+ get designationArray() {
115
+ return this.designationForm.get('designations');
116
+ }
117
+ addDesignationBlock() {
118
+ if (this.designationArray.length >= this.maxDesignationCount) {
119
+ return;
120
+ }
121
+ const group = this.createDesignationForm();
122
+ group.get('designation_name')?.valueChanges.subscribe(() => {
123
+ this.checkCurrentDesignationPresent();
124
+ });
125
+ group.get('searchDesignation')?.valueChanges
126
+ .pipe(debounceTime(300), distinctUntilChanged())
127
+ .subscribe((value) => {
128
+ const txt = value?.trim() || '';
129
+ this.designationSearchText = txt;
130
+ this.searchDesignationLoadCount = 50;
131
+ if (txt) {
132
+ this.desigantionFilterEnable = true;
133
+ this.getDesignation(txt, 0);
134
+ }
135
+ else {
136
+ this.desigantionFilterEnable = false;
137
+ this.masterData.designation =
138
+ (this.masterData.designationBackup || []).slice(0, this.designationDefaultLoadCount);
139
+ this.checkCurrentDesignationPresent();
140
+ }
141
+ });
142
+ this.designationArray.push(group);
143
+ }
144
+ saveDesignationBlock(index) {
145
+ const group = this.designationArray.at(index);
146
+ group.markAllAsTouched();
147
+ if (group.invalid) {
148
+ return;
149
+ }
150
+ group.patchValue({
151
+ isEdit: false
152
+ });
153
+ this.cdRef.detectChanges();
154
+ }
155
+ editDesignationBlock(index) {
156
+ this.designationArray.at(index).get('isEdit')?.setValue(true);
157
+ }
158
+ deleteDesignationBlock(index) {
159
+ this.designationArray.removeAt(index);
160
+ if (this.designationArray.length === 0) {
161
+ this.addDesignationBlock();
162
+ }
163
+ }
164
+ createDesignationForm() {
165
+ return this.fb.group({
166
+ designation_name: [null, Validators.required],
102
167
  instruction: ['', Validators.required],
103
168
  uploadDoc: [null, []],
104
169
  searchDesignation: [''],
105
- });
106
- this.designationForm.get('designation_name')?.valueChanges
107
- .subscribe(() => {
108
- this.checkCurrentDesignationPresent();
170
+ isEdit: [true]
109
171
  });
110
172
  }
111
173
  onFileChange(event) {
@@ -132,6 +194,7 @@ export class AddDesignationComponent {
132
194
  this.designationForm.get('uploadDoc')?.updateValueAndValidity();
133
195
  }
134
196
  cancelForm() {
197
+ this.resetPopup();
135
198
  this.dialogRef.close();
136
199
  }
137
200
  // saveDesignation() {
@@ -180,59 +243,84 @@ export class AddDesignationComponent {
180
243
  // })
181
244
  // }
182
245
  saveDesignation() {
183
- const selectedDesignations = this.designationForm.get('designation_name')?.value || [];
184
- if (!selectedDesignations.length) {
185
- this.snackBar.open('Please select at least one designation', 'X', { duration: 3000 });
246
+ if (!this.canGenerateCBP) {
247
+ this.snackBar.open('Please save all designation sections before generating CBP.', 'X', { duration: 3000 });
248
+ return;
249
+ }
250
+ const designationRows = this.designationArray.controls
251
+ .map(control => ({
252
+ designation_name: control.get('designation_name')?.value,
253
+ instruction: control.get('instruction')?.value
254
+ }))
255
+ .filter(row => row.designation_name);
256
+ if (!designationRows.length) {
257
+ this.snackBar.open('Please select at least one designation.', 'X', { duration: 3000 });
186
258
  return;
187
259
  }
188
260
  this.loading = true;
189
261
  const baseObj = {
190
262
  state_center_id: this.sharedService.cbpPlanFinalObj.ministry.identifier,
191
- state_center_name: this.sharedService.cbpPlanFinalObj.ministry.orgName,
192
- instruction: this.designationForm.value.instruction,
263
+ state_center_name: this.sharedService.cbpPlanFinalObj.ministry.orgName
193
264
  };
194
- if (this.sharedService.cbpPlanFinalObj?.ministry?.sbOrgType === 'state' && this.sharedService.cbpPlanFinalObj.department_name) {
195
- baseObj['department_id'] = this.sharedService.cbpPlanFinalObj.departments;
196
- baseObj['department_name'] = this.sharedService.cbpPlanFinalObj.department_name;
265
+ if (this.sharedService.cbpPlanFinalObj?.ministry?.sbOrgType === 'state' &&
266
+ this.sharedService.cbpPlanFinalObj.department_name) {
267
+ baseObj.department_id =
268
+ this.sharedService.cbpPlanFinalObj.departments;
269
+ baseObj.department_name =
270
+ this.sharedService.cbpPlanFinalObj.department_name;
197
271
  }
198
- if (this.sharedService.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry' && this.sharedService.cbpPlanFinalObj.department_name) {
199
- baseObj['department_id'] = this.sharedService.cbpPlanFinalObj.departments;
200
- baseObj['department_name'] = this.sharedService.cbpPlanFinalObj.department_name;
272
+ if (this.sharedService.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry' &&
273
+ this.sharedService.cbpPlanFinalObj.department_name) {
274
+ baseObj.department_id =
275
+ this.sharedService.cbpPlanFinalObj.departments;
276
+ baseObj.department_name =
277
+ this.sharedService.cbpPlanFinalObj.department_name;
201
278
  }
202
- // Create an array of observables, one per designation
203
- const apiCalls = selectedDesignations.map(designationName => {
279
+ const apiCalls = designationRows.map(row => {
204
280
  const req = {
205
281
  ...baseObj,
206
- designation_name: designationName,
282
+ designation_name: row.designation_name,
283
+ instruction: row.instruction
207
284
  };
208
285
  return this.sharedService.addDesignation(req).pipe(catchError(error => {
209
- console.error(`Failed to add designation: ${designationName}`, error);
210
- // Return observable that emits an error object but does not break forkJoin
211
- return of({ error: true, designation: designationName });
286
+ console.error(`Failed to add designation: ${row.designation_name}`, error);
287
+ return of({
288
+ error: true,
289
+ designation: row.designation_name
290
+ });
212
291
  }));
213
292
  });
214
- // Wait for all API calls to complete
215
- forkJoin(apiCalls).subscribe(results => {
216
- this.loading = false;
217
- // Check if any call failed
218
- const failed = results.filter(res => res?.error);
219
- if (failed.length > 0) {
220
- const failedNames = failed.map(f => f.designation).join(', ');
221
- this.snackBar.open(`Failed to add designations: ${failedNames}`, 'X', {
222
- duration: 5000,
223
- panelClass: ['snackbar-error']
224
- });
225
- }
226
- else {
293
+ forkJoin(apiCalls).subscribe({
294
+ next: (results) => {
295
+ this.loading = false;
296
+ const failed = results.filter(res => res?.error);
297
+ if (failed.length) {
298
+ const failedNames = failed
299
+ .map(item => item.designation)
300
+ .join(', ');
301
+ this.snackBar.open(`Failed to add designations: ${failedNames}`, 'X', {
302
+ duration: 5000,
303
+ panelClass: ['snackbar-error']
304
+ });
305
+ return;
306
+ }
227
307
  this.snackBar.open('All designations added successfully', 'X', {
228
308
  duration: 3000,
229
309
  panelClass: ['snackbar-success']
230
310
  });
231
311
  this.dialogRef.close('saved');
312
+ },
313
+ error: () => {
314
+ this.loading = false;
315
+ this.snackBar.open('Something went wrong. Please try again.', 'X', {
316
+ duration: 5000,
317
+ panelClass: ['snackbar-error']
318
+ });
232
319
  }
233
320
  });
234
321
  }
235
322
  closeDialog() {
323
+ this.resetPopup();
236
324
  this.dialogRef.close();
237
325
  }
238
326
  getDesignation(searchText, offset) {
@@ -342,7 +430,9 @@ export class AddDesignationComponent {
342
430
  }
343
431
  // FIX 2: Also inject selected items into designationBackup
344
432
  checkCurrentDesignationPresent() {
345
- const selectedDesignations = this.designationForm.get('designation_name')?.value || [];
433
+ const selectedDesignations = this.designationArray.controls
434
+ .map(control => control.get('designation_name')?.value)
435
+ .filter(value => !!value);
346
436
  if (!this.masterData?.designation) {
347
437
  return;
348
438
  }
@@ -358,19 +448,14 @@ export class AddDesignationComponent {
358
448
  this.masterData.designation = _.uniqBy([...selectedItems, ...remainingVisible], (item) => item?.name?.toLowerCase());
359
449
  this.masterData.designationBackup = _.uniqBy([...selectedItems, ...remainingBackup], (item) => item?.name?.toLowerCase());
360
450
  }
361
- onDesignationDropdownClosed() {
362
- // Keep the designation value but clear the search input
363
- const currentDesignation = this.designationForm.get('designation_name').value;
451
+ onDesignationDropdownClosed(index) {
452
+ const group = this.designationArray.at(index);
453
+ const currentDesignation = group.get('designation_name')?.value;
364
454
  setTimeout(() => {
365
- if (this.designationForm.get('searchDesignation')) {
366
- this.designationForm.get('searchDesignation').setValue('');
367
- }
368
- // Ensure the designation value remains selected
455
+ group.get('searchDesignation')?.setValue('', { emitEvent: false });
369
456
  if (currentDesignation) {
370
- const designationControl = this.designationForm.get('designation_name');
371
- if (designationControl) {
372
- designationControl.setValue(currentDesignation);
373
- }
457
+ group.get('designation_name')
458
+ ?.setValue(currentDesignation, { emitEvent: false });
374
459
  }
375
460
  }, 100);
376
461
  }
@@ -422,9 +507,8 @@ export class AddDesignationComponent {
422
507
  if (!panel) {
423
508
  return;
424
509
  }
425
- // REMOVE OLD LISTENER
426
- panel.removeEventListener('scroll', this.onDesignationSelectScroll);
427
- panel.addEventListener('scroll', this.onDesignationSelectScroll.bind(this), { passive: true });
510
+ panel.removeEventListener('scroll', this.designationScrollHandler);
511
+ panel.addEventListener('scroll', this.designationScrollHandler, { passive: true });
428
512
  }, 300);
429
513
  }
430
514
  onDesignationSelectScroll(event) {
@@ -482,22 +566,71 @@ export class AddDesignationComponent {
482
566
  get searchDesignationControl() {
483
567
  return this.designationForm.get('searchDesignation');
484
568
  }
485
- clearDesignationSearch(event) {
486
- this.searchDesignationLoadCount = 50;
569
+ clearDesignationSearch(index, event) {
487
570
  event.stopPropagation();
488
- this.searchDesignationControl.setValue('');
571
+ const control = this.designationArray
572
+ .at(index)
573
+ .get('searchDesignation');
574
+ control?.setValue('');
489
575
  this.desigantionFilterEnable = false;
490
576
  this.masterData.designation =
491
577
  (this.masterData.designationBackup || []).slice(0, this.designationDefaultLoadCount);
492
- this.designationListLoadCount = this.designationDefaultLoadCount;
578
+ this.checkCurrentDesignationPresent();
579
+ }
580
+ get canGenerateCBP() {
581
+ if (this.designationArray.length === 0) {
582
+ return false;
583
+ }
584
+ return this.designationArray.controls.every(control => !control.get('isEdit')?.value &&
585
+ control.valid);
586
+ }
587
+ getFilteredDesignations(currentIndex) {
588
+ // Get all selected designations except current row
589
+ const selectedDesignations = this.designationArray.controls
590
+ .map((control, index) => index !== currentIndex
591
+ ? control.get('designation_name')?.value
592
+ : null)
593
+ .filter(value => !!value);
594
+ return (this.masterData?.designation || []).filter((designation) => {
595
+ const currentValue = this.designationArray.at(currentIndex)
596
+ .get('designation_name')?.value;
597
+ // Keep current selected value visible
598
+ if (designation.name === currentValue) {
599
+ return true;
600
+ }
601
+ return !selectedDesignations.includes(designation.name);
602
+ });
603
+ }
604
+ resetPopup() {
605
+ this.designationForm.reset();
606
+ this.designationArray.clear();
607
+ this.designationArray.push(this.createDesignationForm());
608
+ this.masterData.designation = [];
609
+ this.masterData.designationBackup = [];
610
+ this.masterData.designationFiltered = [];
611
+ this.designationSearchText = '';
493
612
  this.designationOffset = 0;
613
+ this.searchDesignationLoadCount = 50;
614
+ this.designationListLoadCount = 50;
615
+ this.noMoreLegacyDesignations = false;
616
+ this.desigantionFilterEnable = false;
617
+ this.uploadedFile = null;
618
+ this.uploadError = null;
619
+ this.masterData = {
620
+ designation: [],
621
+ designationBackup: [],
622
+ designationFiltered: []
623
+ };
624
+ this.designationArray.clear();
625
+ this.addDesignationBlock();
626
+ this.getDesignationSafe();
494
627
  }
495
628
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AddDesignationComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.SharedService }, { token: i4.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
496
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AddDesignationComponent, selector: "app-add-designation", viewQueries: [{ propertyName: "designationRef", first: true, predicate: ["designation"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Add New Designation</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container\" [formGroup]=\"designationForm\">\n <mat-card class=\"mt-1\">\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Designation Name</p>\n </div>\n <div class=\"section-header mt-4\">\n <!-- <input type=\"text\" formControlName=\"designation_name\" placeholder=\"Enter Designation\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\"> -->\n <mat-form-field appearance=\"outline\" class=\"margin-top-s w-full required-select\">\n <mat-select multiple #position formControlName=\"designation_name\"\n placeholder=\"Select designation\" (closed)=\"onDesignationDropdownClosed()\"\n panelClass=\"search-panel\" (openedChange)=\"setupScrollListener($event)\"\n >\n\n <!-- Sticky search input container -->\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-wrapper\">\n <input type=\"text\" placeholder=\"Search designation\" style=\"width:100%\"\n formControlName=\"searchDesignation\" class=\"search-input\"\n (keydown)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation()\"\n autocomplete=\"off\">\n <!-- (keyup)=\"designationSearch($event)\" -->\n <div *ngIf=\"searchDesignationControl?.value\" type=\"button\" class=\"clear-icon\"\n (click)=\"clearDesignationSearch($event)\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <!-- Options list -->\n <mat-option [value]=\"designation?.name\" *ngFor=\"let designation of masterData?.designation\">\n {{designation?.name}}\n </mat-option>\n <!-- Loading indicator -->\n <div *ngIf=\"isLoadingMoreDesignations\" class=\"loading-indicator\">\n Load More...\n </div>\n <!-- No results message -->\n <mat-option *ngIf=\"(masterData?.designation)?.length === 0 || noMoreLegacyDesignations\" disabled class=\"no-data-option\">\n\n Designation Not Found.\n\n </mat-option>\n </mat-select>\n <!-- <mat-error class=\"text-xs\"\n *ngIf=\"designationForm?.get('designation_name')?.touched && designationForm?.get('designation_name')?.invalid\">\n Please select at least one designation.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Role & responsibilities /Additional details</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <textarea class=\"custom-textarea\" formControlName=\"instruction\" rows=\"5\"\n placeholder=\"Add Instructions\" [value]=\"\"></textarea>\n </div>\n </div>\n <!-- <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Upload Document (PDF/Word/Excel/TXT)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span>{{ uploadedFile?.name || 'Choose a file (PDF, Word, Excel, TXT)' }}</span>\n </label>\n\n <small class=\"file-upload-hint\">Max file size: 25MB</small>\n\n <input id=\"uploadDoc\" type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n\n </mat-card>\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n <input [disabled]=\"designationForm?.invalid\"\n [ngClass]=\"designationForm?.invalid ? 'btn-disable':'btn-active'\" type=\"button\" value=\"Generate CBP\"\n (click)=\"saveDesignation()\" />\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}:host ::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}:host ::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}:host ::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}:host ::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}:host ::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0 10px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0 10px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0 10px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0 10px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:6px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}:host ::ng-deep .mat-select-panel.search-panel .search-input{flex:1 1 auto;width:100%;padding:8px 10px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;color:#333;outline:none;box-sizing:border-box}:host ::ng-deep .mat-select-panel.search-panel .search-input:focus{border-color:#0074b6;box-shadow:0 0 0 3px #0074b60f}:host ::ng-deep .mat-select-panel.search-panel .clear-button{background:transparent;border:none;cursor:pointer;font-size:16px;color:#666;padding:6px;line-height:1}:host ::ng-deep .mat-select-panel.search-panel .loading-indicator{padding:10px 12px;text-align:center;color:#666;font-size:14px}:host ::ng-deep .mat-select-panel.search-panel .mat-option{padding-top:10px;padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled]{padding:8px 16px!important}:host ::ng-deep .mat-select-panel.align-panel{padding:0!important;box-sizing:border-box;margin-left:0!important;min-width:340px!important;max-width:340px!important}:host ::ng-deep .mat-select-panel.align-panel .mat-option{padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled] .mat-error,:host ::ng-deep .mat-select-panel.search-panel .mat-error{margin:0!important;padding:0!important;font-size:14px!important;line-height:1.4!important;color:#f44336}:host ::ng-deep .mat-form-field{width:100%}:host ::ng-deep .mat-text-field-wrapper{background:#fff;border-radius:25px!important;height:42px}:host ::ng-deep .mat-notched-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start,:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-width:1px!important;min-width:0!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-flex{border-radius:25px;height:42px;align-items:center;padding:0 16px;background:#fff}:host ::ng-deep .mat-select-panel{border:1px solid rgba(0,0,0,.16);border-radius:8px;box-shadow:0 6px 18px #0000001f}:host ::ng-deep .mat-select-panel.search-panel{max-height:300px!important;overflow-y:auto!important;box-sizing:border-box}::ng-deep .search-panel .sticky-search-container{position:sticky;top:0;z-index:100;background:#fff;padding:8px;border-bottom:1px solid #eee}:host ::ng-deep .search-panel .search-input-wrapper{display:flex;gap:8px;align-items:center}:host ::ng-deep .search-panel .search-input{width:100%;height:32px;padding:6px 10px}:host ::ng-deep .search-panel .mat-option{padding:8px 16px!important}:host ::ng-deep .search-panel .mat-pseudo-checkbox{margin-right:8px}:host ::ng-deep .search-panel .no-data-option{padding:10px 16px;font-size:14px;color:#f44336}::ng-deep .search-panel .no-data-option .mat-pseudo-checkbox{display:none!important}.search-input-wrapper{position:relative;width:100%;display:flex;align-items:center}.search-input{width:100%;padding-right:40px;height:40px;line-height:40px;box-sizing:border-box}.clear-icon{position:absolute;right:10px;cursor:pointer;font-size:20px;color:#666;display:flex;align-items:center;height:100%}.clear-icon:hover{color:#000}:host ::ng-deep .search-panel .mat-option:first-child{margin-top:0}.add-more-btn{border-radius:8px;font-weight:600}.designation-limit-info{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:13px;color:#6b7280}.designation-count{margin-left:auto;font-weight:600}.designation-card{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff}.designation-title{font-size:16px;font-weight:600;color:#1f4ea3;margin-bottom:20px}.designation-save-section{display:flex;justify-content:flex-end;margin-top:16px}.save-btn{min-width:100px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
629
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AddDesignationComponent, selector: "app-add-designation", viewQueries: [{ propertyName: "designationRef", first: true, predicate: ["designation"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div [formGroup]=\"designationForm\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Add New Designation</div>\n\n </div>\n <div class=\"right-container\">\n <button mat-stroked-button class=\"add-btn\" (click)=\"addDesignationBlock()\"\n [disabled]=\"designationArray?.length >= MAX_DESIGNATIONS\">\n\n\n <span style=\"font-size: 32px;\">+</span> Add More\n </button>\n\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"popup-header seperator\">\n <div class=\"info-row\">\n <mat-icon class=\"vertical-middle\">info</mat-icon>\n <span>\n Maximum 10 designations can be selected for CBP generation at one time.\n </span>\n </div>\n <div class=\"header-actions\">\n\n <span class=\"counter\">\n {{ designationArray?.length }}/{{ MAX_DESIGNATIONS }}\n </span>\n\n \n\n </div>\n\n </div>\n </div>\n <div class=\"section-container\"> \n <div formArrayName=\"designations\">\n\n <div *ngFor=\"let designationGroup of designationArray.controls; let i=index\" [formGroupName]=\"i\"\n class=\"designation-wrapper\">\n\n <!-- EDIT MODE -->\n <ng-container *ngIf=\"designationGroup.value.isEdit\">\n\n <mat-card class=\"mt-1 designation-block\">\n\n <div class=\"designation-header\">\n <span class=\"designation-title\">\n Designation {{ i + 1 }}\n </span>\n </div>\n\n <!-- Designation Dropdown -->\n <div class=\"mt-2 section\">\n\n <div class=\"sub-heading\">\n <p>Designation Name</p>\n </div>\n\n <div class=\"section-header mt-4\">\n\n <mat-form-field appearance=\"outline\" class=\"margin-top-s w-full required-select\">\n\n <mat-select placeholder=\"Select designation\" formControlName=\"designation_name\"\n (closed)=\"onDesignationDropdownClosed(i)\" panelClass=\"search-panel\"\n (openedChange)=\"setupScrollListener($event)\">\n\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"search-input-wrapper\">\n\n <input type=\"text\" placeholder=\"Search designation\"\n style=\"width:100%\" formControlName=\"searchDesignation\"\n class=\"search-input\" (keydown)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation()\"\n autocomplete=\"off\">\n\n <div *ngIf=\"searchDesignationControl?.value\" class=\"clear-icon\"\n (click)=\"clearDesignationSearch(i,$event)\">\n\n <mat-icon>close</mat-icon>\n\n </div>\n\n </div>\n\n </div>\n\n <mat-option *ngFor=\"let designation of getFilteredDesignations(i)\"\n [value]=\"designation?.name\">\n\n {{ designation?.name }}\n\n </mat-option>\n\n <div *ngIf=\"isLoadingMoreDesignations\" class=\"loading-indicator\">\n\n Load More...\n\n </div>\n\n <mat-option\n *ngIf=\"(masterData?.designation)?.length === 0 || noMoreLegacyDesignations\"\n disabled>\n\n Designation Not Found.\n\n </mat-option>\n\n </mat-select>\n\n </mat-form-field>\n\n </div>\n\n </div>\n\n <!-- Instruction -->\n <div class=\"mt-2 section\">\n\n <div class=\"sub-heading\">\n <p>Role & Responsibilities / Additional Details</p>\n </div>\n\n <div class=\"mt-4 additional-details\">\n\n <textarea class=\"custom-textarea\" formControlName=\"instruction\" rows=\"5\"\n placeholder=\"Add Instructions\">\n </textarea>\n\n </div>\n\n </div>\n\n <!-- Actions -->\n\n <div class=\"designation-actions\">\n <button mat-stroked-button color=\"warn\" type=\"button\"\n (click)=\"deleteDesignationBlock(i)\">\n\n <mat-icon>delete</mat-icon>\n\n </button>\n\n <button class=\"save-flat-button\" mat-flat-button color=\"primary\" type=\"button\" (click)=\"saveDesignationBlock(i)\">\n\n <mat-icon>check</mat-icon>\n Save\n\n </button>\n\n </div>\n\n </mat-card>\n\n </ng-container>\n\n <!-- VIEW MODE -->\n <ng-container *ngIf=\"!designationGroup.value.isEdit\">\n\n <mat-card class=\"saved-designation-card\">\n\n <div class=\"saved-content\">\n\n <div class=\"saved-content-desc\">\n\n <div class=\"saved-designation-name\" style=\"font-size: 16px ;font-weight: 600;\">\n {{ designationGroup.get('designation_name')?.value }} \n </div>\n\n <div class=\"saved-instruction\">\n {{ designationGroup.get('instruction')?.value }}\n </div>\n\n </div>\n\n <div class=\"saved-actions\">\n\n <button class=\"add-btn\" mat-stroked-button type=\"button\" (click)=\"editDesignationBlock(i)\">\n\n Edit\n\n </button>\n\n <button mat-stroked-button color=\"warn\" type=\"button\"\n (click)=\"deleteDesignationBlock(i)\">\n\n <mat-icon>delete</mat-icon>\n\n </button>\n\n </div>\n\n </div>\n\n </mat-card>\n\n </ng-container>\n\n </div>\n\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n <input [disabled]=\"!canGenerateCBP\" [ngClass]=\"!canGenerateCBP ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Generate CBP\" (click)=\"saveDesignation()\" />\n </div>\n </div>\n </div>\n </div>\n <div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}:host ::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}:host ::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}:host ::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}:host ::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}:host ::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0 10px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0 10px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0 10px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0 10px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;font-weight:700;flex-shrink:0}.seperator{border-bottom:1px solid #ddd;padding:4px}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 0;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:6px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}:host ::ng-deep .mat-select-panel.search-panel .search-input{flex:1 1 auto;width:100%;padding:8px 10px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;color:#333;outline:none;box-sizing:border-box}:host ::ng-deep .mat-select-panel.search-panel .search-input:focus{border-color:#0074b6;box-shadow:0 0 0 3px #0074b60f}:host ::ng-deep .mat-select-panel.search-panel .clear-button{background:transparent;border:none;cursor:pointer;font-size:16px;color:#666;padding:6px;line-height:1}:host ::ng-deep .mat-select-panel.search-panel .loading-indicator{padding:10px 12px;text-align:center;color:#666;font-size:14px}:host ::ng-deep .mat-select-panel.search-panel .mat-option{padding-top:10px;padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled]{padding:8px 16px!important}:host ::ng-deep .mat-select-panel.align-panel{padding:0!important;box-sizing:border-box;margin-left:0!important;min-width:340px!important;max-width:340px!important}:host ::ng-deep .mat-select-panel.align-panel .mat-option{padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled] .mat-error,:host ::ng-deep .mat-select-panel.search-panel .mat-error{margin:0!important;padding:0!important;font-size:14px!important;line-height:1.4!important;color:#f44336}:host ::ng-deep .mat-form-field{width:100%}:host ::ng-deep .mat-text-field-wrapper{background:#fff;border-radius:25px!important;height:42px}:host ::ng-deep .mat-notched-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start,:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-width:1px!important;min-width:0!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-flex{border-radius:25px;height:42px;align-items:center;padding:0 16px;background:#fff}:host ::ng-deep .mat-select-panel{border:1px solid rgba(0,0,0,.16);border-radius:8px;box-shadow:0 6px 18px #0000001f}:host ::ng-deep .mat-select-panel.search-panel{max-height:300px!important;overflow-y:auto!important;box-sizing:border-box}::ng-deep .search-panel .sticky-search-container{position:sticky;top:0;z-index:100;background:#fff;padding:8px;border-bottom:1px solid #eee}:host ::ng-deep .search-panel .search-input-wrapper{display:flex;gap:8px;align-items:center}:host ::ng-deep .search-panel .search-input{width:100%;height:32px;padding:6px 10px}:host ::ng-deep .search-panel .mat-option{padding:8px 16px!important}:host ::ng-deep .search-panel .mat-pseudo-checkbox{margin-right:8px}:host ::ng-deep .search-panel .no-data-option{padding:10px 16px;font-size:14px;color:#f44336}::ng-deep .search-panel .no-data-option .mat-pseudo-checkbox{display:none!important}.search-input-wrapper{position:relative;width:100%;display:flex;align-items:center}.search-input{width:100%;padding-right:40px;height:40px;line-height:40px;box-sizing:border-box}.clear-icon{position:absolute;right:10px;cursor:pointer;font-size:20px;color:#666;display:flex;align-items:center;height:100%}.clear-icon:hover{color:#000}:host ::ng-deep .search-panel .mat-option:first-child{margin-top:0}.add-more-btn{border-radius:8px;font-weight:600}.designation-limit-info{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:13px;color:#6b7280}.designation-count{margin-left:auto;font-weight:600}.designation-card{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff}.designation-title{font-size:16px;font-weight:600;color:#1f4ea3;margin-bottom:20px}.designation-save-section{display:flex;justify-content:flex-end;margin-top:16px}.save-btn{min-width:100px}.info-row{font-size:14px;font-weight:400}.vertical-middle{vertical-align:middle}.saved-content{border:1px solid #ccc;border-radius:8px;display:flex;flex-direction:row;justify-content:space-between;padding:10px;background-color:#fff;width:100%}.saved-content-desc{width:75%;word-break:break-word}.info-row{display:flex;align-items:center;gap:6px;color:#667085;font-size:13px;margin-top:8px}.header-actions{display:flex;align-items:center;gap:12px}.counter{font-size:16px;font-weight:600;color:#475467}.designation-card{border:1px solid #e4e7ec;border-radius:12px;padding:16px;margin-bottom:16px;background:#fff}.card-header{font-size:14px;font-weight:600;color:#175cd3;margin-bottom:16px}.field{margin-bottom:16px}.field label{display:block;margin-bottom:6px;font-weight:600}.field mat-form-field{width:100%}.summary-view{display:flex;justify-content:space-between;align-items:flex-start}.summary-content h4{margin:0;font-size:16px;font-weight:600}.summary-content p{margin-top:8px;color:#667085;white-space:pre-line}.action-buttons{display:flex;gap:4px}.card-footer{display:flex;justify-content:flex-end}:host ::ng-deep .mat-mdc-button:hover,:host ::ng-deep .mat-mdc-outlined-button:hover,:host ::ng-deep .mat-mdc-raised-button:hover,:host ::ng-deep .mat-mdc-unelevated-button:hover{--mat-text-button-state-layer-color: transparent !important;--mat-outlined-button-state-layer-color: transparent !important;--mat-filled-button-state-layer-color: transparent !important;--mat-protected-button-state-layer-color: transparent !important}:host .mat-stroked-button{border:none!important;padding:0 10px;line-height:34px;background-color:transparent}.add-btn{background-color:#efefef!important}.saved-designation-card{padding:16px 0}.designation-actions{display:flex;flex-direction:row;justify-content:end;align-items:center;margin-top:10px}:host .mat-icon{overflow:visible!important}.save-flat-button{background-color:#1b4ca1;color:#fff}.right-container{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.designation-block{padding:16px 0!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i8.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i12.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
497
630
  }
498
631
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AddDesignationComponent, decorators: [{
499
632
  type: Component,
500
- args: [{ selector: 'app-add-designation', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Add New Designation</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container\" [formGroup]=\"designationForm\">\n <mat-card class=\"mt-1\">\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Designation Name</p>\n </div>\n <div class=\"section-header mt-4\">\n <!-- <input type=\"text\" formControlName=\"designation_name\" placeholder=\"Enter Designation\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\"> -->\n <mat-form-field appearance=\"outline\" class=\"margin-top-s w-full required-select\">\n <mat-select multiple #position formControlName=\"designation_name\"\n placeholder=\"Select designation\" (closed)=\"onDesignationDropdownClosed()\"\n panelClass=\"search-panel\" (openedChange)=\"setupScrollListener($event)\"\n >\n\n <!-- Sticky search input container -->\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-wrapper\">\n <input type=\"text\" placeholder=\"Search designation\" style=\"width:100%\"\n formControlName=\"searchDesignation\" class=\"search-input\"\n (keydown)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation()\"\n autocomplete=\"off\">\n <!-- (keyup)=\"designationSearch($event)\" -->\n <div *ngIf=\"searchDesignationControl?.value\" type=\"button\" class=\"clear-icon\"\n (click)=\"clearDesignationSearch($event)\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <!-- Options list -->\n <mat-option [value]=\"designation?.name\" *ngFor=\"let designation of masterData?.designation\">\n {{designation?.name}}\n </mat-option>\n <!-- Loading indicator -->\n <div *ngIf=\"isLoadingMoreDesignations\" class=\"loading-indicator\">\n Load More...\n </div>\n <!-- No results message -->\n <mat-option *ngIf=\"(masterData?.designation)?.length === 0 || noMoreLegacyDesignations\" disabled class=\"no-data-option\">\n\n Designation Not Found.\n\n </mat-option>\n </mat-select>\n <!-- <mat-error class=\"text-xs\"\n *ngIf=\"designationForm?.get('designation_name')?.touched && designationForm?.get('designation_name')?.invalid\">\n Please select at least one designation.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Role & responsibilities /Additional details</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <textarea class=\"custom-textarea\" formControlName=\"instruction\" rows=\"5\"\n placeholder=\"Add Instructions\" [value]=\"\"></textarea>\n </div>\n </div>\n <!-- <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Upload Document (PDF/Word/Excel/TXT)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span>{{ uploadedFile?.name || 'Choose a file (PDF, Word, Excel, TXT)' }}</span>\n </label>\n\n <small class=\"file-upload-hint\">Max file size: 25MB</small>\n\n <input id=\"uploadDoc\" type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n\n </mat-card>\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n <input [disabled]=\"designationForm?.invalid\"\n [ngClass]=\"designationForm?.invalid ? 'btn-disable':'btn-active'\" type=\"button\" value=\"Generate CBP\"\n (click)=\"saveDesignation()\" />\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}:host ::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}:host ::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}:host ::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}:host ::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}:host ::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0 10px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0 10px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0 10px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0 10px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:6px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}:host ::ng-deep .mat-select-panel.search-panel .search-input{flex:1 1 auto;width:100%;padding:8px 10px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;color:#333;outline:none;box-sizing:border-box}:host ::ng-deep .mat-select-panel.search-panel .search-input:focus{border-color:#0074b6;box-shadow:0 0 0 3px #0074b60f}:host ::ng-deep .mat-select-panel.search-panel .clear-button{background:transparent;border:none;cursor:pointer;font-size:16px;color:#666;padding:6px;line-height:1}:host ::ng-deep .mat-select-panel.search-panel .loading-indicator{padding:10px 12px;text-align:center;color:#666;font-size:14px}:host ::ng-deep .mat-select-panel.search-panel .mat-option{padding-top:10px;padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled]{padding:8px 16px!important}:host ::ng-deep .mat-select-panel.align-panel{padding:0!important;box-sizing:border-box;margin-left:0!important;min-width:340px!important;max-width:340px!important}:host ::ng-deep .mat-select-panel.align-panel .mat-option{padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled] .mat-error,:host ::ng-deep .mat-select-panel.search-panel .mat-error{margin:0!important;padding:0!important;font-size:14px!important;line-height:1.4!important;color:#f44336}:host ::ng-deep .mat-form-field{width:100%}:host ::ng-deep .mat-text-field-wrapper{background:#fff;border-radius:25px!important;height:42px}:host ::ng-deep .mat-notched-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start,:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-width:1px!important;min-width:0!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-flex{border-radius:25px;height:42px;align-items:center;padding:0 16px;background:#fff}:host ::ng-deep .mat-select-panel{border:1px solid rgba(0,0,0,.16);border-radius:8px;box-shadow:0 6px 18px #0000001f}:host ::ng-deep .mat-select-panel.search-panel{max-height:300px!important;overflow-y:auto!important;box-sizing:border-box}::ng-deep .search-panel .sticky-search-container{position:sticky;top:0;z-index:100;background:#fff;padding:8px;border-bottom:1px solid #eee}:host ::ng-deep .search-panel .search-input-wrapper{display:flex;gap:8px;align-items:center}:host ::ng-deep .search-panel .search-input{width:100%;height:32px;padding:6px 10px}:host ::ng-deep .search-panel .mat-option{padding:8px 16px!important}:host ::ng-deep .search-panel .mat-pseudo-checkbox{margin-right:8px}:host ::ng-deep .search-panel .no-data-option{padding:10px 16px;font-size:14px;color:#f44336}::ng-deep .search-panel .no-data-option .mat-pseudo-checkbox{display:none!important}.search-input-wrapper{position:relative;width:100%;display:flex;align-items:center}.search-input{width:100%;padding-right:40px;height:40px;line-height:40px;box-sizing:border-box}.clear-icon{position:absolute;right:10px;cursor:pointer;font-size:20px;color:#666;display:flex;align-items:center;height:100%}.clear-icon:hover{color:#000}:host ::ng-deep .search-panel .mat-option:first-child{margin-top:0}.add-more-btn{border-radius:8px;font-weight:600}.designation-limit-info{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:13px;color:#6b7280}.designation-count{margin-left:auto;font-weight:600}.designation-card{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff}.designation-title{font-size:16px;font-weight:600;color:#1f4ea3;margin-bottom:20px}.designation-save-section{display:flex;justify-content:flex-end;margin-top:16px}.save-btn{min-width:100px}\n"] }]
633
+ args: [{ selector: 'app-add-designation', template: "<div class=\"view-cbp-plan\">\n <div [formGroup]=\"designationForm\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Add New Designation</div>\n\n </div>\n <div class=\"right-container\">\n <button mat-stroked-button class=\"add-btn\" (click)=\"addDesignationBlock()\"\n [disabled]=\"designationArray?.length >= MAX_DESIGNATIONS\">\n\n\n <span style=\"font-size: 32px;\">+</span> Add More\n </button>\n\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"popup-header seperator\">\n <div class=\"info-row\">\n <mat-icon class=\"vertical-middle\">info</mat-icon>\n <span>\n Maximum 10 designations can be selected for CBP generation at one time.\n </span>\n </div>\n <div class=\"header-actions\">\n\n <span class=\"counter\">\n {{ designationArray?.length }}/{{ MAX_DESIGNATIONS }}\n </span>\n\n \n\n </div>\n\n </div>\n </div>\n <div class=\"section-container\"> \n <div formArrayName=\"designations\">\n\n <div *ngFor=\"let designationGroup of designationArray.controls; let i=index\" [formGroupName]=\"i\"\n class=\"designation-wrapper\">\n\n <!-- EDIT MODE -->\n <ng-container *ngIf=\"designationGroup.value.isEdit\">\n\n <mat-card class=\"mt-1 designation-block\">\n\n <div class=\"designation-header\">\n <span class=\"designation-title\">\n Designation {{ i + 1 }}\n </span>\n </div>\n\n <!-- Designation Dropdown -->\n <div class=\"mt-2 section\">\n\n <div class=\"sub-heading\">\n <p>Designation Name</p>\n </div>\n\n <div class=\"section-header mt-4\">\n\n <mat-form-field appearance=\"outline\" class=\"margin-top-s w-full required-select\">\n\n <mat-select placeholder=\"Select designation\" formControlName=\"designation_name\"\n (closed)=\"onDesignationDropdownClosed(i)\" panelClass=\"search-panel\"\n (openedChange)=\"setupScrollListener($event)\">\n\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"search-input-wrapper\">\n\n <input type=\"text\" placeholder=\"Search designation\"\n style=\"width:100%\" formControlName=\"searchDesignation\"\n class=\"search-input\" (keydown)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation()\"\n autocomplete=\"off\">\n\n <div *ngIf=\"searchDesignationControl?.value\" class=\"clear-icon\"\n (click)=\"clearDesignationSearch(i,$event)\">\n\n <mat-icon>close</mat-icon>\n\n </div>\n\n </div>\n\n </div>\n\n <mat-option *ngFor=\"let designation of getFilteredDesignations(i)\"\n [value]=\"designation?.name\">\n\n {{ designation?.name }}\n\n </mat-option>\n\n <div *ngIf=\"isLoadingMoreDesignations\" class=\"loading-indicator\">\n\n Load More...\n\n </div>\n\n <mat-option\n *ngIf=\"(masterData?.designation)?.length === 0 || noMoreLegacyDesignations\"\n disabled>\n\n Designation Not Found.\n\n </mat-option>\n\n </mat-select>\n\n </mat-form-field>\n\n </div>\n\n </div>\n\n <!-- Instruction -->\n <div class=\"mt-2 section\">\n\n <div class=\"sub-heading\">\n <p>Role & Responsibilities / Additional Details</p>\n </div>\n\n <div class=\"mt-4 additional-details\">\n\n <textarea class=\"custom-textarea\" formControlName=\"instruction\" rows=\"5\"\n placeholder=\"Add Instructions\">\n </textarea>\n\n </div>\n\n </div>\n\n <!-- Actions -->\n\n <div class=\"designation-actions\">\n <button mat-stroked-button color=\"warn\" type=\"button\"\n (click)=\"deleteDesignationBlock(i)\">\n\n <mat-icon>delete</mat-icon>\n\n </button>\n\n <button class=\"save-flat-button\" mat-flat-button color=\"primary\" type=\"button\" (click)=\"saveDesignationBlock(i)\">\n\n <mat-icon>check</mat-icon>\n Save\n\n </button>\n\n </div>\n\n </mat-card>\n\n </ng-container>\n\n <!-- VIEW MODE -->\n <ng-container *ngIf=\"!designationGroup.value.isEdit\">\n\n <mat-card class=\"saved-designation-card\">\n\n <div class=\"saved-content\">\n\n <div class=\"saved-content-desc\">\n\n <div class=\"saved-designation-name\" style=\"font-size: 16px ;font-weight: 600;\">\n {{ designationGroup.get('designation_name')?.value }} \n </div>\n\n <div class=\"saved-instruction\">\n {{ designationGroup.get('instruction')?.value }}\n </div>\n\n </div>\n\n <div class=\"saved-actions\">\n\n <button class=\"add-btn\" mat-stroked-button type=\"button\" (click)=\"editDesignationBlock(i)\">\n\n Edit\n\n </button>\n\n <button mat-stroked-button color=\"warn\" type=\"button\"\n (click)=\"deleteDesignationBlock(i)\">\n\n <mat-icon>delete</mat-icon>\n\n </button>\n\n </div>\n\n </div>\n\n </mat-card>\n\n </ng-container>\n\n </div>\n\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n <input [disabled]=\"!canGenerateCBP\" [ngClass]=\"!canGenerateCBP ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Generate CBP\" (click)=\"saveDesignation()\" />\n </div>\n </div>\n </div>\n </div>\n <div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}:host ::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}:host ::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}:host ::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}:host ::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}:host ::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0 10px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0 10px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0 10px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0 10px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;font-weight:700;flex-shrink:0}.seperator{border-bottom:1px solid #ddd;padding:4px}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 0;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:6px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}:host ::ng-deep .mat-select-panel.search-panel .search-input{flex:1 1 auto;width:100%;padding:8px 10px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;color:#333;outline:none;box-sizing:border-box}:host ::ng-deep .mat-select-panel.search-panel .search-input:focus{border-color:#0074b6;box-shadow:0 0 0 3px #0074b60f}:host ::ng-deep .mat-select-panel.search-panel .clear-button{background:transparent;border:none;cursor:pointer;font-size:16px;color:#666;padding:6px;line-height:1}:host ::ng-deep .mat-select-panel.search-panel .loading-indicator{padding:10px 12px;text-align:center;color:#666;font-size:14px}:host ::ng-deep .mat-select-panel.search-panel .mat-option{padding-top:10px;padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled]{padding:8px 16px!important}:host ::ng-deep .mat-select-panel.align-panel{padding:0!important;box-sizing:border-box;margin-left:0!important;min-width:340px!important;max-width:340px!important}:host ::ng-deep .mat-select-panel.align-panel .mat-option{padding-left:16px}:host ::ng-deep .mat-select-panel.search-panel mat-option[disabled] .mat-error,:host ::ng-deep .mat-select-panel.search-panel .mat-error{margin:0!important;padding:0!important;font-size:14px!important;line-height:1.4!important;color:#f44336}:host ::ng-deep .mat-form-field{width:100%}:host ::ng-deep .mat-text-field-wrapper{background:#fff;border-radius:25px!important;height:42px}:host ::ng-deep .mat-notched-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{border-radius:25px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start,:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-width:1px!important;min-width:0!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:transparent!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-flex{border-radius:25px;height:42px;align-items:center;padding:0 16px;background:#fff}:host ::ng-deep .mat-select-panel{border:1px solid rgba(0,0,0,.16);border-radius:8px;box-shadow:0 6px 18px #0000001f}:host ::ng-deep .mat-select-panel.search-panel{max-height:300px!important;overflow-y:auto!important;box-sizing:border-box}::ng-deep .search-panel .sticky-search-container{position:sticky;top:0;z-index:100;background:#fff;padding:8px;border-bottom:1px solid #eee}:host ::ng-deep .search-panel .search-input-wrapper{display:flex;gap:8px;align-items:center}:host ::ng-deep .search-panel .search-input{width:100%;height:32px;padding:6px 10px}:host ::ng-deep .search-panel .mat-option{padding:8px 16px!important}:host ::ng-deep .search-panel .mat-pseudo-checkbox{margin-right:8px}:host ::ng-deep .search-panel .no-data-option{padding:10px 16px;font-size:14px;color:#f44336}::ng-deep .search-panel .no-data-option .mat-pseudo-checkbox{display:none!important}.search-input-wrapper{position:relative;width:100%;display:flex;align-items:center}.search-input{width:100%;padding-right:40px;height:40px;line-height:40px;box-sizing:border-box}.clear-icon{position:absolute;right:10px;cursor:pointer;font-size:20px;color:#666;display:flex;align-items:center;height:100%}.clear-icon:hover{color:#000}:host ::ng-deep .search-panel .mat-option:first-child{margin-top:0}.add-more-btn{border-radius:8px;font-weight:600}.designation-limit-info{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:13px;color:#6b7280}.designation-count{margin-left:auto;font-weight:600}.designation-card{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff}.designation-title{font-size:16px;font-weight:600;color:#1f4ea3;margin-bottom:20px}.designation-save-section{display:flex;justify-content:flex-end;margin-top:16px}.save-btn{min-width:100px}.info-row{font-size:14px;font-weight:400}.vertical-middle{vertical-align:middle}.saved-content{border:1px solid #ccc;border-radius:8px;display:flex;flex-direction:row;justify-content:space-between;padding:10px;background-color:#fff;width:100%}.saved-content-desc{width:75%;word-break:break-word}.info-row{display:flex;align-items:center;gap:6px;color:#667085;font-size:13px;margin-top:8px}.header-actions{display:flex;align-items:center;gap:12px}.counter{font-size:16px;font-weight:600;color:#475467}.designation-card{border:1px solid #e4e7ec;border-radius:12px;padding:16px;margin-bottom:16px;background:#fff}.card-header{font-size:14px;font-weight:600;color:#175cd3;margin-bottom:16px}.field{margin-bottom:16px}.field label{display:block;margin-bottom:6px;font-weight:600}.field mat-form-field{width:100%}.summary-view{display:flex;justify-content:space-between;align-items:flex-start}.summary-content h4{margin:0;font-size:16px;font-weight:600}.summary-content p{margin-top:8px;color:#667085;white-space:pre-line}.action-buttons{display:flex;gap:4px}.card-footer{display:flex;justify-content:flex-end}:host ::ng-deep .mat-mdc-button:hover,:host ::ng-deep .mat-mdc-outlined-button:hover,:host ::ng-deep .mat-mdc-raised-button:hover,:host ::ng-deep .mat-mdc-unelevated-button:hover{--mat-text-button-state-layer-color: transparent !important;--mat-outlined-button-state-layer-color: transparent !important;--mat-filled-button-state-layer-color: transparent !important;--mat-protected-button-state-layer-color: transparent !important}:host .mat-stroked-button{border:none!important;padding:0 10px;line-height:34px;background-color:transparent}.add-btn{background-color:#efefef!important}.saved-designation-card{padding:16px 0}.designation-actions{display:flex;flex-direction:row;justify-content:end;align-items:center;margin-top:10px}:host .mat-icon{overflow:visible!important}.save-flat-button{background-color:#1b4ca1;color:#fff}.right-container{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.designation-block{padding:16px 0!important}\n"] }]
501
634
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
502
635
  type: Inject,
503
636
  args: [MAT_DIALOG_DATA]
@@ -505,4 +638,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
505
638
  type: ViewChild,
506
639
  args: ['designation', { read: ElementRef }]
507
640
  }] } });
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWRlc2lnbmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1kZXNpZ25hdGlvbi9hZGQtZGVzaWduYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvYWRkLWRlc2lnbmF0aW9uL2FkZC1kZXNpZ25hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBcUMsVUFBVSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFPcEMsTUFBTSxPQUFPLHVCQUF1QjtJQThCbEMsWUFBbUIsU0FBZ0QsRUFDakMsSUFBUyxFQUNqQyxFQUFlLEVBQ2YsS0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsUUFBcUI7UUFMWixjQUFTLEdBQVQsU0FBUyxDQUF1QztRQUNqQyxTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ2pDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qixh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QUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmluYWxpemUsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZm9ya0pvaW4sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvc2hhcmVkLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkZC1kZXNpZ25hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtZGVzaWduYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hZGQtZGVzaWduYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBZGREZXNpZ25hdGlvbkNvbXBvbmVudCB7XG4gIGRlc2lnbmF0aW9uRm9ybTogRm9ybUdyb3VwO1xuICBtYXhGaWxlU2l6ZU1CID0gMjU7XG4gIGFsbG93ZWRUeXBlcyA9IFtcbiAgICAnYXBwbGljYXRpb24vcGRmJyxcbiAgICAnYXBwbGljYXRpb24vbXN3b3JkJyxcbiAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnLFxuICAgICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLFxuICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsXG4gICAgJ3RleHQvcGxhaW4nXG4gIF07XG4gIHVwbG9hZEVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdXBsb2FkZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XG4gIGNicFBsYW5GaW5hbE9iajogYW55XG4gIGxvYWRpbmcgPSBmYWxzZVxuICBAVmlld0NoaWxkKCdkZXNpZ25hdGlvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkZXNpZ25hdGlvblJlZj86IEVsZW1lbnRSZWZcbiAgZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUgPSBmYWxzZVxuICBpc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gZmFsc2U7XG4gIGRlc2lnbmF0aW9uT2Zmc2V0ID0gMFxuICBvZGNzRGVzaWduYXRpb25Db3VudCA9IDBcbiAgZGVmYXVsdFNlYXJjaERlc2lnbmF0aW9uQ291bnQgPSAwXG4gIGRlc2lnbmF0aW9uTGlzdExvYWRDb3VudCA9IDUwXG4gIGRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudCA9IDUwXG4gIG5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IGZhbHNlXG4gIGRlc2lnbmF0aW9uU2VhcmNoVGV4dCA9ICcnXG4gIGRlc2lnbmF0aW9uSW5pdEluUHJvZ3Jlc3MgPSBmYWxzZVxuICBzY3JvbGxMaXN0ZW5lckF0dGFjaGVkID0gZmFsc2VcbiAgbWFzdGVyRGF0YTogYW55ID0ge31cbiAgc2VhcmNoRGVzaWduYXRpb25Mb2FkQ291bnQgPSA1MFxuICBtYXRjaGVkRGVzaWduYXRpb25JZHMgPSBbXVxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWRkRGVzaWduYXRpb25Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0Jhcikge1xuXG4gICAgdGhpcy5tYXN0ZXJEYXRhID0ge1xuICAgICAgZGVzaWduYXRpb25CYWNrdXA6IFtdLFxuICAgICAgZGVzaWduYXRpb25GaWx0ZXJlZDogW10sIC8vIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzXG4gICAgfTtcblxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc29sZS5sb2coJ3RoaXMubWF0Y2hlZF9yb2xlX21hcHBpbmdzJywgdGhpcy5kYXRhPy5tYXRjaGVkX3JvbGVfbWFwcGluZ3MpXG4gICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25JZHMgPSB0aGlzLmRhdGE/Lm1hdGNoZWRfcm9sZV9tYXBwaW5ncz8ubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0/Lmlnb3RfZGVzaWduYXRpb25faWQpIHx8IFtdXG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuXG4gICBjb25zdCBzZWFyY2hDb250cm9sID0gdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCdzZWFyY2hEZXNpZ25hdGlvbicpO1xuXG5pZiAoc2VhcmNoQ29udHJvbCkge1xuICBzZWFyY2hDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgIC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG5cbiAgICAgIGNvbnN0IHR4dCA9IHJlcz8udG9TdHJpbmcoKT8udHJpbSgpID8/ICcnO1xuXG4gICAgICB0aGlzLmRlc2lnbmF0aW9uU2VhcmNoVGV4dCA9IHR4dDtcblxuICAgICAgLy8gUkVTRVQgU0VBUkNIIFBBR0lOQVRJT05cbiAgICAgIHRoaXMuc2VhcmNoRGVzaWduYXRpb25Mb2FkQ291bnQgPSA1MDtcblxuICAgICAgaWYgKHR4dD8ubGVuZ3RoKSB7XG5cbiAgICAgICAgdGhpcy5kZXNpZ2FudGlvbkZpbHRlckVuYWJsZSA9IHRydWU7XG5cbiAgICAgICAgLy8gQVBJIFNFQVJDSCBPTkxZXG4gICAgICAgIHRoaXMuZ2V0RGVzaWduYXRpb24odHh0LCAwKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLmRlc2lnYW50aW9uRmlsdGVyRW5hYmxlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID1cbiAgICAgICAgICAodGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwIHx8IFtdKS5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudFxuICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgPVxuICAgICAgICAgIHRoaXMuZGVzaWduYXRpb25EZWZhdWx0TG9hZENvdW50O1xuXG4gICAgICAgIHRoaXMuZGVzaWduYXRpb25PZmZzZXQgPSAwO1xuXG4gICAgICAgIHRoaXMuY2hlY2tDdXJyZW50RGVzaWduYXRpb25QcmVzZW50KCk7XG4gICAgICB9XG4gICAgfSk7XG59XG5cblxuICAgaWYgKFxuICAhdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwIHx8XG4gIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cC5sZW5ndGggPT09IDBcbikge1xuICB0aGlzLmdldERlc2lnbmF0aW9uU2FmZSgpO1xufVxuXG4gIH1cblxuICBwcml2YXRlIGdldERlc2lnbmF0aW9uU2FmZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXNpZ25hdGlvbkluaXRJblByb2dyZXNzIHx8IHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuZGVzaWduYXRpb25Jbml0SW5Qcm9ncmVzcyA9IHRydWVcbiAgICB0aGlzLmdldERlc2lnbmF0aW9uKClcbiAgfVxuXG4gIGluaXRpYWxpemVGb3JtKCkge1xuICAgIHRoaXMuZGVzaWduYXRpb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBkZXNpZ25hdGlvbl9uYW1lOiBbW10sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgaW5zdHJ1Y3Rpb246IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB1cGxvYWREb2M6IFtudWxsLCBbXV0sXG4gICAgICBzZWFyY2hEZXNpZ25hdGlvbjogWycnXSxcbiAgICB9KTtcbiAgICB0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKT8udmFsdWVDaGFuZ2VzXG4gIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgIHRoaXMuY2hlY2tDdXJyZW50RGVzaWduYXRpb25QcmVzZW50KCk7XG4gIH0pO1xuICB9XG5cbiAgb25GaWxlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuXG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZmlsZSBzaXplXG4gICAgY29uc3QgbWF4Qnl0ZXMgPSB0aGlzLm1heEZpbGVTaXplTUIgKiAxMDI0ICogMTAyNDtcbiAgICBpZiAoZmlsZS5zaXplID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRoaXMudXBsb2FkRXJyb3IgPSBgRmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke3RoaXMubWF4RmlsZVNpemVNQn1NQmA7XG4gICAgICB0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ3VwbG9hZERvYycpPy5zZXRFcnJvcnMoeyBtYXhTaXplOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGZpbGUgdHlwZVxuICAgIGlmICghdGhpcy5hbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9IGBJbnZhbGlkIGZpbGUgdHlwZS4gQWxsb3dlZDogUERGLCBXb3JkLCBFeGNlbCwgVFhUYDtcbiAgICAgIHRoaXMuZGVzaWduYXRpb25Gb3JtLmdldCgndXBsb2FkRG9jJyk/LnNldEVycm9ycyh7IGZpbGVUeXBlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkZWRGaWxlID0gZmlsZTtcbiAgICB0aGlzLnVwbG9hZEVycm9yID0gbnVsbDtcbiAgICB0aGlzLmRlc2lnbmF0aW9uRm9ybS5wYXRjaFZhbHVlKHsgdXBsb2FkRG9jOiBmaWxlIH0pO1xuICAgIHRoaXMuZGVzaWduYXRpb25Gb3JtLmdldCgndXBsb2FkRG9jJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIGNhbmNlbEZvcm0oKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG5cbiAgLy8gc2F2ZURlc2lnbmF0aW9uKCkge1xuICAvLyAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgLy8gICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAvLyAgIGZvcm1EYXRhLmFwcGVuZCgnZGVzaWduYXRpb25OYW1lJywgdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCdkZXNpZ25hdGlvbk5hbWUnKT8udmFsdWUpO1xuICAvLyAgIGZvcm1EYXRhLmFwcGVuZCgncm9sZURldGFpbHMnLCB0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ3JvbGVEZXRhaWxzJyk/LnZhbHVlKTtcbiAgLy8gICBpZiAodGhpcy51cGxvYWRlZEZpbGUpIHtcbiAgLy8gICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkRG9jJywgdGhpcy51cGxvYWRlZEZpbGUpO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLmNicFBsYW5GaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgLy8gICBjb25zb2xlLmxvZygndGhpcy5kZXNpZ25hdGlvbkZvcm0nLCB0aGlzLmRlc2lnbmF0aW9uRm9ybSlcbiAgLy8gICBsZXQgcmVxOiBhbnkgPSB7XG4gIC8vICAgICBcInN0YXRlX2NlbnRlcl9pZFwiOiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIsXG4gIC8vICAgICBcInN0YXRlX2NlbnRlcl9uYW1lXCI6IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkub3JnTmFtZSxcbiAgLy8gICAgIC8vIFwiZGVwYXJ0bWVudF9pZFwiOiBcIlwiLFxuICAvLyAgICAgXCJkZXNpZ25hdGlvbl9uYW1lXCI6IHRoaXMuZGVzaWduYXRpb25Gb3JtLnZhbHVlLmRlc2lnbmF0aW9uX25hbWUsXG4gIC8vICAgICBcImluc3RydWN0aW9uXCI6IHRoaXMuZGVzaWduYXRpb25Gb3JtLnZhbHVlLmluc3RydWN0aW9uLFxuICAvLyAgIH1cbiAgLy8gICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJyAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZSkge1xuICAvLyAgICAgcmVxWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzXG4gIC8vICAgICByZXFbJ2RlcGFydG1lbnRfbmFtZSddID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50X25hbWVcbiAgLy8gICB9XG4gIC8vICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50X25hbWUpIHtcbiAgLy8gICAgIHJlcVsnZGVwYXJ0bWVudF9pZCddID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50c1xuICAvLyAgICAgcmVxWydkZXBhcnRtZW50X25hbWUnXSA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lXG4gIC8vICAgfVxuXG4gIC8vICAgY29uc29sZS5sb2coJ3JlcScsIHJlcSlcbiAgLy8gICB0aGlzLnNoYXJlZFNlcnZpY2UuYWRkRGVzaWduYXRpb24ocmVxKS5zdWJzY3JpYmUoe1xuICAvLyAgICAgbmV4dDogKF9yZXMpID0+IHtcbiAgLy8gICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgLy8gICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdEZXNpZ25hdGlvbiBBZGRlZCBTdWNjZXNzZnVsbHknLCAnWCcsIHtcbiAgLy8gICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgLy8gICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAvLyAgICAgICB9KTtcbiAgLy8gICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgLy8gICAgIH0sXG4gIC8vICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gIC8vICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gIC8vICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRmFpbGVkIHRvIGFkZCBkZXNpZ25hdGlvbi4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnWCcsIHtcbiAgLy8gICAgICAgICBkdXJhdGlvbjogNTAwMCxcbiAgLy8gICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgLy8gICAgICAgfSk7XG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFkZGluZyBkZXNpZ25hdGlvbjonLCBlcnJvcik7XG4gIC8vICAgICB9XG4gIC8vICAgfSlcbiAgLy8gfVxuXG5cblxuICBzYXZlRGVzaWduYXRpb24oKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWREZXNpZ25hdGlvbnM6IHN0cmluZ1tdID0gdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCdkZXNpZ25hdGlvbl9uYW1lJyk/LnZhbHVlIHx8IFtdO1xuXG4gICAgaWYgKCFzZWxlY3RlZERlc2lnbmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgZGVzaWduYXRpb24nLCAnWCcsIHsgZHVyYXRpb246IDMwMDAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGJhc2VPYmogPSB7XG4gICAgICBzdGF0ZV9jZW50ZXJfaWQ6IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcixcbiAgICAgIHN0YXRlX2NlbnRlcl9uYW1lOiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5Lm9yZ05hbWUsXG4gICAgICBpbnN0cnVjdGlvbjogdGhpcy5kZXNpZ25hdGlvbkZvcm0udmFsdWUuaW5zdHJ1Y3Rpb24sXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnc3RhdGUnICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lKSB7XG4gICAgICBiYXNlT2JqWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzO1xuICAgICAgYmFzZU9ialsnZGVwYXJ0bWVudF9uYW1lJ10gPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ21pbmlzdHJ5JyAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZSkge1xuICAgICAgYmFzZU9ialsnZGVwYXJ0bWVudF9pZCddID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcbiAgICAgIGJhc2VPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50X25hbWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIG9ic2VydmFibGVzLCBvbmUgcGVyIGRlc2lnbmF0aW9uXG4gICAgY29uc3QgYXBpQ2FsbHMgPSBzZWxlY3RlZERlc2lnbmF0aW9ucy5tYXAoZGVzaWduYXRpb25OYW1lID0+IHtcbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgLi4uYmFzZU9iaixcbiAgICAgICAgZGVzaWduYXRpb25fbmFtZTogZGVzaWduYXRpb25OYW1lLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2hhcmVkU2VydmljZS5hZGREZXNpZ25hdGlvbihyZXEpLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBhZGQgZGVzaWduYXRpb246ICR7ZGVzaWduYXRpb25OYW1lfWAsIGVycm9yKTtcbiAgICAgICAgICAvLyBSZXR1cm4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGVycm9yIG9iamVjdCBidXQgZG9lcyBub3QgYnJlYWsgZm9ya0pvaW5cbiAgICAgICAgICByZXR1cm4gb2YoeyBlcnJvcjogdHJ1ZSwgZGVzaWduYXRpb246IGRlc2lnbmF0aW9uTmFtZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBXYWl0IGZvciBhbGwgQVBJIGNhbGxzIHRvIGNvbXBsZXRlXG4gICAgZm9ya0pvaW4oYXBpQ2FsbHMpLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiBhbnkgY2FsbCBmYWlsZWRcbiAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKHJlcyA9PiByZXM/LmVycm9yKTtcblxuICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZhaWxlZE5hbWVzID0gZmFpbGVkLm1hcChmID0+IGYuZGVzaWduYXRpb24pLmpvaW4oJywgJyk7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihgRmFpbGVkIHRvIGFkZCBkZXNpZ25hdGlvbnM6ICR7ZmFpbGVkTmFtZXN9YCwgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdBbGwgZGVzaWduYXRpb25zIGFkZGVkIHN1Y2Nlc3NmdWxseScsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgnc2F2ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlRGlhbG9nKCkge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgfVxuXG4gIGdldERlc2lnbmF0aW9uKHNlYXJjaFRleHQ/OiBzdHJpbmcsIG9mZnNldD86IG51bWJlcik6IHZvaWQge1xuXG4gICAgLy8gY2xlYXIgYW55IHByZXZpb3VzIGRlYnVnIGhvb2tzXG4gICAgaWYgKCFzZWFyY2hUZXh0IHx8IHNlYXJjaFRleHQ/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gbm9vcFxuICAgIH1cblxuICAgIGNvbnN0IHJlcU9mZnNldCA9ICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykgPyBvZmZzZXQgOiB0aGlzLmRlc2lnbmF0aW9uT2Zmc2V0XG4gICAgbGV0IHJlcUxpbWl0ID0gdGhpcy5kZXNpZ25hdGlvbkRlZmF1bHRMb2FkQ291bnRcbiAgICBjb25zdCBwYWdlSW5kZXggPSByZXFMaW1pdCA+IDAgPyBNYXRoLmZsb29yKHJlcU9mZnNldCAvIHJlcUxpbWl0KSA6IDBcbiAgICAvLyBpZiB3ZSdyZSByZXF1ZXN0aW5nIGZyb20gZmlyc3QgcGFnZSwgY2xlYXIgdGhlIG5vLW1vcmUtZGF0YSBndWFyZFxuICAgIGlmIChwYWdlSW5kZXggPT09IDApIHtcbiAgICAgIHRoaXMubm9Nb3JlTGVnYWN5RGVzaWduYXRpb25zID0gZmFsc2VcbiAgICAgIHJlcUxpbWl0ID0gNTBcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgIGZpbHRlckNyaXRlcmlhTWFwOiB7XG4gICAgICAgIHN0YXR1czogJ0FjdGl2ZSdcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0ZWRGaWVsZHM6IFtdLFxuICAgICAgcGFnZU51bWJlcjogcGFnZUluZGV4LFxuICAgICAgcGFnZVNpemU6IHJlcUxpbWl0LFxuICAgIH1cbiAgICBpZiAoc2VhcmNoVGV4dD8ubGVuZ3RoKSB7XG4gICAgICByZXF1ZXN0Qm9keVsnc2VhcmNoU3RyaW5nJ10gPSBzZWFyY2hUZXh0XG4gICAgICAvLyB3aGVuIHNlYXJjaGluZywgc3RhcnQgZnJvbSBmaXJzdCBwYWdlXG4gICAgICByZXF1ZXN0Qm9keS5wYWdlTnVtYmVyID0gMFxuICAgICAgLy8gYWxsb3cgbGFyZ2VyIHBhZ2UgZm9yIHNlYXJjaCBpZiBuZWVkZWRcbiAgICAgIHJlcXVlc3RCb2R5LnBhZ2VTaXplID0gcGFnZUluZGV4ID09PSAwID8gNTAgOiB0aGlzLmRlc2lnbmF0aW9uTGlzdExvYWRDb3VudFxuICAgICAgLy8gcmVzZXQgZ3VhcmQgd2hlbiBwZXJmb3JtaW5nIGEgZnJlc2ggc2VhcmNoXG4gICAgICB0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IGZhbHNlXG4gICAgfVxuXG4gICAgLy8gaW5kaWNhdGUgbG9hZGluZyBzdGF0ZSBzbyBzY3JvbGwgaGFuZGxlcnMgZG9uJ3QgdHJpZ2dlciBwYXJhbGxlbCBjYWxsc1xuICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IHRydWVcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5zZWFyY2hQdWJsaWNEZXNpZ25hdGlvbihyZXF1ZXN0Qm9keSkucGlwZShmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSBmYWxzZVxuICAgICAgdGhpcy5kZXNpZ25hdGlvbkluaXRJblByb2dyZXNzID0gZmFsc2VcbiAgICB9KSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBcblxuICBjb25zdCBjb250ZW50ID0gXy5nZXQocmVzLCAncmVzdWx0LnJlc3VsdC5kYXRhJywgW10pO1xuXG4gIGlmKGNvbnRlbnQ/Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRoaXMubm9Nb3JlTGVnYWN5RGVzaWduYXRpb25zID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlZElkcyA9IG5ldyBTZXQodGhpcy5tYXRjaGVkRGVzaWduYXRpb25JZHMpO1xuXG4gIGNvbnN0IG1hcHBlZCA9IGNvbnRlbnRcbiAgLmZpbHRlcigoaXRlbTogYW55KSA9PiAhbWF0Y2hlZElkcy5oYXMoaXRlbT8uaWQpKVxuICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgaWQ6IGl0ZW0/LmlkLFxuICAgIG5hbWU6IGl0ZW0/LmRlc2lnbmF0aW9uIHx8ICcnLFxuICAgIHN0YXR1czogaXRlbT8uc3RhdHVzIHx8ICdBY3RpdmUnLFxuICB9KSk7XG5cbiAgY29uc3QgdG90YWwgPSBfLmdldChcbiAgICByZXMsXG4gICAgJ3Jlc3VsdC5yZXN1bHQudG90YWxjb3VudCcsXG4gICAgXy5nZXQoXG4gICAgICByZXMsXG4gICAgICAncmVzdWx0LnJlc3VsdC5kYXRhLnRvdGFsQ291bnQnLFxuICAgICAgXy5nZXQocmVzLCAncmVzdWx0LnJlc3VsdC50b3RhbENvdW50JywgMClcbiAgICApXG4gICk7XG5cbiAgdGhpcy5kZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudCA9IHRvdGFsO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU0VBUkNIIE1PREVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGlmIChzZWFyY2hUZXh0Py5sZW5ndGgpIHtcblxuICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkZpbHRlcmVkID0gbWFwcGVkO1xuXG4gICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID1cbiAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkZpbHRlcmVkLnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICB0aGlzLnNlYXJjaERlc2lnbmF0aW9uTG9hZENvdW50XG4gICAgICApO1xuXG4gICAgdGhpcy5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk9STUFMIE1PREVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGlmICghdGhpcy5tYXN0ZXJEYXRhWydkZXNpZ25hdGlvbkJhY2t1cCddIHx8IHJlcU9mZnNldCA9PT0gMCkge1xuXG4gICAgdGhpcy5tYXN0ZXJEYXRhWydkZXNpZ25hdGlvbkJhY2t1cCddID0gbWFwcGVkO1xuXG4gIH0gZWxzZSB7XG5cbiAgICBjb25zdCBjb21iaW5lZCA9XG4gICAgICAodGhpcy5tYXN0ZXJEYXRhWydkZXNpZ25hdGlvbkJhY2t1cCddIHx8IFtdKS5jb25jYXQobWFwcGVkKTtcblxuICAgIHRoaXMubWFzdGVyRGF0YVsnZGVzaWduYXRpb25CYWNrdXAnXSA9IF8udW5pcUJ5KFxuICAgICAgY29tYmluZWQsXG4gICAgICAoaXQ6IGFueSkgPT4gKGl0Py5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbiA9XG4gICAgKHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cCB8fCBbXSkuc2xpY2UoXG4gICAgICAwLFxuICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnRcbiAgICApO1xuXG4gIC8vIHNlbGVjdGVkIHZhbHVlIHByZXNlcnZlXG4gIGNvbnN0IGRlc2lnbmF0aW9uQ29udHJvbCA9XG4gICAgdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCdkZXNpZ25hdGlvbl9uYW1lJyk7XG5cbiAgaWYgKGRlc2lnbmF0aW9uQ29udHJvbCkge1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9XG4gICAgICBkZXNpZ25hdGlvbkNvbnRyb2wudmFsdWUgfHwgW107XG5cbiAgICBjb25zdCB2YWxpZFZhbHVlcyA9IGN1cnJlbnRWYWx1ZXMuZmlsdGVyKFxuICAgICAgKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cC5zb21lKFxuICAgICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0/Lm5hbWUgPT09IHZhbHVlXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgaWYgKHZhbGlkVmFsdWVzLmxlbmd0aCAhPT0gY3VycmVudFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIGRlc2lnbmF0aW9uQ29udHJvbC5zZXRWYWx1ZSh2YWxpZFZhbHVlcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gbm8gbW9yZSBkYXRhXG4gIGlmICghbWFwcGVkIHx8IG1hcHBlZC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgdGhpcy5kZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudCAmJlxuICAgICh0aGlzLm1hc3RlckRhdGFbJ2Rlc2lnbmF0aW9uQmFja3VwJ10gfHwgW10pLmxlbmd0aCA+PVxuICAgIHRoaXMuZGVmYXVsdFNlYXJjaERlc2lnbmF0aW9uQ291bnRcbiAgKSB7XG4gICAgdGhpcy5ub01vcmVMZWdhY3lEZXNpZ25hdGlvbnMgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKTtcbn0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLy8gU3RvcCBmdXJ0aGVyIGF1dG9tYXRpYyBjYWxscyBvbiByZXBlYXRlZCBlcnJvcnMgdG8gYXZvaWQgdGlnaHQgbG9vcHNcbiAgICAgICAgICAvLyBsb2FkaW5nIGZsYWcgY2xlYXJlZCBpbiBmaW5hbGl6ZSgpXG4gICAgICAgICAgdGhpcy5ub01vcmVMZWdhY3lEZXNpZ25hdGlvbnMgPSB0cnVlXG4gICAgICAgICAgLy8gdGhpcy5tYXRTbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gZmV0Y2ggZGVzaWduYXRpb24gZGV0YWlscywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciEnKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG4gIC8vIEZJWCAyOiBBbHNvIGluamVjdCBzZWxlY3RlZCBpdGVtcyBpbnRvIGRlc2lnbmF0aW9uQmFja3VwXG5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKSB7XG5cbiAgY29uc3Qgc2VsZWN0ZWREZXNpZ25hdGlvbnM6IHN0cmluZ1tdID1cbiAgICB0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKT8udmFsdWUgfHwgW107XG5cbiAgaWYgKCF0aGlzLm1hc3RlckRhdGE/LmRlc2lnbmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHNlbGVjdGVkIGVudHJpZXNcbiAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkRGVzaWduYXRpb25zLm1hcCgobmFtZTogc3RyaW5nKSA9PiAoe1xuICAgIG5hbWUsXG4gICAgc3RhdHVzOiAnQWN0aXZlJ1xuICB9KSk7XG5cbiAgLy8gUmVtb3ZlIHNlbGVjdGVkIGl0ZW1zIGZyb20gY3VycmVudCBsaXN0c1xuICBjb25zdCByZW1haW5pbmdWaXNpYmxlID0gKHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbiB8fCBbXSkuZmlsdGVyKFxuICAgIChpdGVtOiBhbnkpID0+XG4gICAgICAhc2VsZWN0ZWREZXNpZ25hdGlvbnMuc29tZShcbiAgICAgICAgc2VsZWN0ZWQgPT4gc2VsZWN0ZWQudG9Mb3dlckNhc2UoKSA9PT0gaXRlbT8ubmFtZT8udG9Mb3dlckNhc2UoKVxuICAgICAgKVxuICApO1xuXG4gIGNvbnN0IHJlbWFpbmluZ0JhY2t1cCA9ICh0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25CYWNrdXAgfHwgW10pLmZpbHRlcihcbiAgICAoaXRlbTogYW55KSA9PlxuICAgICAgIXNlbGVjdGVkRGVzaWduYXRpb25zLnNvbWUoXG4gICAgICAgIHNlbGVjdGVkID0+IHNlbGVjdGVkLnRvTG93ZXJDYXNlKCkgPT09IGl0ZW0/Lm5hbWU/LnRvTG93ZXJDYXNlKClcbiAgICAgIClcbiAgKTtcblxuICAvLyBQdXQgc2VsZWN0ZWQgaXRlbXMgb24gdG9wXG4gIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbiA9IF8udW5pcUJ5KFxuICAgIFsuLi5zZWxlY3RlZEl0ZW1zLCAuLi5yZW1haW5pbmdWaXNpYmxlXSxcbiAgICAoaXRlbTogYW55KSA9PiBpdGVtPy5uYW1lPy50b0xvd2VyQ2FzZSgpXG4gICk7XG5cbiAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwID0gXy51bmlxQnkoXG4gICAgWy4uLnNlbGVjdGVkSXRlbXMsIC4uLnJlbWFpbmluZ0JhY2t1cF0sXG4gICAgKGl0ZW06IGFueSkgPT4gaXRlbT8ubmFtZT8udG9Mb3dlckNhc2UoKVxuICApO1xufVxuICBvbkRlc2lnbmF0aW9uRHJvcGRvd25DbG9zZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgZGVzaWduYXRpb24gdmFsdWUgYnV0IGNsZWFyIHRoZSBzZWFyY2ggaW5wdXRcbiAgICBjb25zdCBjdXJyZW50RGVzaWduYXRpb24gPSB0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKSEudmFsdWVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ3NlYXJjaERlc2lnbmF0aW9uJykpIHtcbiAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCdzZWFyY2hEZXNpZ25hdGlvbicpIS5zZXRWYWx1ZSgnJylcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUgZGVzaWduYXRpb24gdmFsdWUgcmVtYWlucyBzZWxlY3RlZFxuICAgICAgaWYgKGN1cnJlbnREZXNpZ25hdGlvbikge1xuICAgICAgICBjb25zdCBkZXNpZ25hdGlvbkNvbnRyb2wgPSB0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKTtcbiAgICAgICAgaWYgKGRlc2lnbmF0aW9uQ29udHJvbCkge1xuICAgICAgICAgIGRlc2lnbmF0aW9uQ29udHJvbC5zZXRWYWx1ZShjdXJyZW50RGVzaWduYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAxMDApXG4gIH1cblxuICAvLyBkZXNpZ25hdGlvblNlYXJjaChldnQ6IGFueSkge1xuICAvLyAgIGNvbnN0IHNlYXJjaFRleHQgPSBldnQ/LnRhcmdldD8udmFsdWVcbiAgLy8gICBjb25zdCB0eHQgPSAoc2VhcmNoVGV4dCB8fCAnJykudG9TdHJpbmcoKS50cmltKClcbiAgLy8gICBpZiAodGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zKSByZXR1cm5cblxuICAvLyAgIHRoaXMuZGVzaWduYXRpb25TZWFyY2hUZXh0ID0gdHh0XG4gIC8vICAgaWYgKHR4dD8ubGVuZ3RoKSB7XG4gIC8vICAgICB0aGlzLmRlc2lnYW50aW9uRmlsdGVyRW5hYmxlID0gdHJ1ZVxuICAvLyAgICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gdHJ1ZVxuICAvLyAgICAgdGhpcy5nZXREZXNpZ25hdGlvbih0eHQsIDApXG4gIC8vICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlckRhdGEgJiYgdGhpcy5tYXN0ZXJEYXRhPy5kZXNpZ25hdGlvbkJhY2t1cCkge1xuICAvLyAgICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID0gdGhpcy5tYXN0ZXJEYXRhPy5kZXNpZ25hdGlvbkJhY2t1cC5zbGljZSgwLCB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudClcbiAgLy8gICAgIHRoaXMuZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUgPSBmYWxzZVxuICAvLyAgICAgdGhpcy5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKVxuICAvLyAgIH1cbiAgLy8gfVxuIHNldHVwU2Nyb2xsTGlzdGVuZXIob3BlbmVkOiBib29sZWFuKTogdm9pZCB7XG5cbiBpZiAoIW9wZW5lZCkge1xuICAgIHRoaXMuc2Nyb2xsTGlzdGVuZXJBdHRhY2hlZCA9IGZhbHNlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLnNjcm9sbExpc3RlbmVyQXR0YWNoZWQpIHJldHVybjtcbiAgdGhpcy5zY3JvbGxMaXN0ZW5lckF0dGFjaGVkID0gdHJ1ZTtcbiAgdGhpcy5kZXNpZ2FudGlvbkZpbHRlckVuYWJsZSA9IGZhbHNlO1xuXG4gIC8vIOKchSBPbmx5IHJlc2V0IHBhZ2luYXRpb24gaWYgd2UgaGF2ZSBubyBkYXRhIHlldFxuICBpZiAoIXRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cD8ubGVuZ3RoKSB7XG4gICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgPSB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudDtcbiAgICB0aGlzLmRlc2lnbmF0aW9uT2Zmc2V0ID0gMDtcbiAgICB0aGlzLmdldERlc2lnbmF0aW9uKHVuZGVmaW5lZCwgMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8g4pyFIFJlc3RvcmUgZnJvbSBiYWNrdXAgd2l0aG91dCByZXNldHRpbmcgb2Zmc2V0XG4gICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID0gdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwLnNsaWNlKFxuICAgICAgMCwgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnRcbiAgICApO1xuICAgIHRoaXMuY2hlY2tDdXJyZW50RGVzaWduYXRpb25QcmVzZW50KCk7XG4gIH1cblxuICAvLyBmb2N1cyBzZWFyY2ggaW5wdXRcbiAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICBjb25zdCBzZWFyY2hJbnB1dCA9XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIGlmIChzZWFyY2hJbnB1dCkge1xuICAgICAgc2VhcmNoSW5wdXQuZm9jdXMoKTtcbiAgICB9XG5cbiAgfSwgMjAwKTtcblxuICAvLyBhdHRhY2ggc2Nyb2xsXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJy5tYXQtc2VsZWN0LXBhbmVsLnNlYXJjaC1wYW5lbCdcbiAgICApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgIGlmICghcGFuZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSRU1PVkUgT0xEIExJU1RFTkVSXG4gICAgcGFuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICdzY3JvbGwnLFxuICAgICAgdGhpcy5vbkRlc2lnbmF0aW9uU2VsZWN0U2Nyb2xsIGFzIGFueVxuICAgICk7XG5cbiAgICBwYW5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ3Njcm9sbCcsXG4gICAgICB0aGlzLm9uRGVzaWduYXRpb25TZWxlY3RTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9XG4gICAgKTtcblxuICB9LCAzMDApO1xufVxuXG4gIG9uRGVzaWduYXRpb25TZWxlY3RTY3JvbGwoZXZlbnQ6IGFueSk6IHZvaWQge1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCByZWFjaGVkQm90dG9tID1cbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQgPj1cbiAgICAgIGVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gNTtcblxuICAgIGlmICghcmVhY2hlZEJvdHRvbSB8fCB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gU0VBUkNIIE1PREVcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKHRoaXMuZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUpIHtcblxuICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gdHJ1ZTtcblxuICAgICAgdGhpcy5zZWFyY2hEZXNpZ25hdGlvbkxvYWRDb3VudCArPSA1MDtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID1cbiAgICAgICAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25GaWx0ZXJlZC5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0aGlzLnNlYXJjaERlc2lnbmF0aW9uTG9hZENvdW50XG4gICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpO1xuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IGZhbHNlO1xuXG4gICAgICB9LCAzMDApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5PUk1BTCBNT0RFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLy8gbG9jYWwgcGFnaW5hdGlvblxuICAgIGlmIChcbiAgICAgIHRoaXMubWFzdGVyRGF0YT8uZGVzaWduYXRpb25CYWNrdXA/Lmxlbmd0aCA+XG4gICAgICB0aGlzLm1hc3RlckRhdGE/LmRlc2lnbmF0aW9uPy5sZW5ndGhcbiAgICApIHtcblxuICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gdHJ1ZTtcblxuICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgKz1cbiAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkRlZmF1bHRMb2FkQ291bnQ7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbiA9XG4gICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwLnNsaWNlKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRoaXMuZGVzaWduYXRpb25MaXN0TG9hZENvdW50XG4gICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpO1xuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IGZhbHNlO1xuXG4gICAgICB9LCAzMDApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2VydmVyIHBhZ2luYXRpb25cbiAgICBjb25zdCBsb2FkZWRMZWdhY3kgPVxuICAgICAgKHRoaXMubWFzdGVyRGF0YT8uZGVzaWduYXRpb25CYWNrdXAgfHwgW10pLmxlbmd0aDtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyAmJlxuICAgICAgdGhpcy5kZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudCAmJlxuICAgICAgbG9hZGVkTGVnYWN5IDwgdGhpcy5kZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudFxuICAgICkge1xuXG4gICAgICB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSB0cnVlO1xuXG4gICAgICB0aGlzLmRlc2lnbmF0aW9uT2Zmc2V0ID1cbiAgICAgICAgKHRoaXMuZGVzaWduYXRpb25PZmZzZXQgfHwgMCkgK1xuICAgICAgICB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudDtcblxuICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgKz1cbiAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkRlZmF1bHRMb2FkQ291bnQ7XG5cbiAgICAgIHRoaXMuZ2V0RGVzaWduYXRpb24odW5kZWZpbmVkLCB0aGlzLmRlc2lnbmF0aW9uT2Zmc2V0KTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VhcmNoRGVzaWduYXRpb25Db250cm9sKCk6IEZvcm1Db250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCdzZWFyY2hEZXNpZ25hdGlvbicpIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgY2xlYXJEZXNpZ25hdGlvblNlYXJjaChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERlc2lnbmF0aW9uTG9hZENvdW50ID0gNTA7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLnNlYXJjaERlc2lnbmF0aW9uQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG5cbiAgICB0aGlzLmRlc2lnYW50aW9uRmlsdGVyRW5hYmxlID0gZmFsc2U7XG5cbiAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb24gPVxuICAgICAgKHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cCB8fCBbXSkuc2xpY2UoXG4gICAgICAgIDAsXG4gICAgICAgIHRoaXMuZGVzaWduYXRpb25EZWZhdWx0TG9hZENvdW50XG4gICAgICApO1xuXG4gICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgPSB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudDtcbiAgICB0aGlzLmRlc2lnbmF0aW9uT2Zmc2V0ID0gMDtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3LWNicC1wbGFuXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nXCI+QWRkIE5ldyBEZXNpZ25hdGlvbjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiY2xvc2VEaWFsb2coKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyXCIgW2Zvcm1Hcm91cF09XCJkZXNpZ25hdGlvbkZvcm1cIj5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibXQtMVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8cD5EZXNpZ25hdGlvbiBOYW1lPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlciBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzaWduYXRpb25fbmFtZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgRGVzaWduYXRpb25cIiBbdmFsdWVdPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgcGFkZGluZzogOHB4IDEycHg7IHdpZHRoOiAxMDAlO2ZvbnQtc2l6ZTogMTRweDtmb250LWZhbWlseTogJ0xhdG8nO1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJtYXJnaW4tdG9wLXMgdy1mdWxsIHJlcXVpcmVkLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgbXVsdGlwbGUgI3Bvc2l0aW9uIGZvcm1Db250cm9sTmFtZT1cImRlc2lnbmF0aW9uX25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRlc2lnbmF0aW9uXCIgKGNsb3NlZCk9XCJvbkRlc2lnbmF0aW9uRHJvcGRvd25DbG9zZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cInNlYXJjaC1wYW5lbFwiIChvcGVuZWRDaGFuZ2UpPVwic2V0dXBTY3JvbGxMaXN0ZW5lcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFN0aWNreSBzZWFyY2ggaW5wdXQgY29udGFpbmVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGlja3ktc2VhcmNoLWNvbnRhaW5lclwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBkZXNpZ25hdGlvblwiIHN0eWxlPVwid2lkdGg6MTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNoRGVzaWduYXRpb25cIiBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKGtleXVwKT1cImRlc2lnbmF0aW9uU2VhcmNoKCRldmVudClcIiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWFyY2hEZXNpZ25hdGlvbkNvbnRyb2w/LnZhbHVlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xlYXItaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRGVzaWduYXRpb25TZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9wdGlvbnMgbGlzdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZGVzaWduYXRpb24/Lm5hbWVcIiAqbmdGb3I9XCJsZXQgZGVzaWduYXRpb24gb2YgbWFzdGVyRGF0YT8uZGVzaWduYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkZXNpZ25hdGlvbj8ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9hZGluZyBpbmRpY2F0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnNcIiBjbGFzcz1cImxvYWRpbmctaW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWQgTW9yZS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gcmVzdWx0cyBtZXNzYWdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiKG1hc3RlckRhdGE/LmRlc2lnbmF0aW9uKT8ubGVuZ3RoID09PSAwIHx8IG5vTW9yZUxlZ2FjeURlc2lnbmF0aW9uc1wiIGRpc2FibGVkIGNsYXNzPVwibm8tZGF0YS1vcHRpb25cIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNpZ25hdGlvbiBOb3QgRm91bmQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgY2xhc3M9XCJ0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRlc2lnbmF0aW9uRm9ybT8uZ2V0KCdkZXNpZ25hdGlvbl9uYW1lJyk/LnRvdWNoZWQgJiYgZGVzaWduYXRpb25Gb3JtPy5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKT8uaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIGRlc2lnbmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+Um9sZSAmIHJlc3BvbnNpYmlsaXRpZXMgL0FkZGl0aW9uYWwgZGV0YWlsczwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCBhZGRpdGlvbmFsLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiY3VzdG9tLXRleHRhcmVhXCIgZm9ybUNvbnRyb2xOYW1lPVwiaW5zdHJ1Y3Rpb25cIiByb3dzPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBJbnN0cnVjdGlvbnNcIiBbdmFsdWVdPVwiXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtMiBzZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPlVwbG9hZCBEb2N1bWVudCAoUERGL1dvcmQvRXhjZWwvVFhUKTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS11cGxvYWQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidXBsb2FkRG9jXCIgY2xhc3M9XCJmaWxlLXVwbG9hZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLXVwbG9hZC1pY29uXCI+8J+Tjjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHVwbG9hZGVkRmlsZT8ubmFtZSB8fCAnQ2hvb3NlIGEgZmlsZSAoUERGLCBXb3JkLCBFeGNlbCwgVFhUKScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZmlsZS11cGxvYWQtaGludFwiPk1heCBmaWxlIHNpemU6IDI1TUI8L3NtYWxsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInVwbG9hZERvY1wiIHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3gsLnhscywueGxzeCwudHh0XCIgY2xhc3M9XCJmaWxlLXVwbG9hZC1pbnB1dFwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVwbG9hZEVycm9yXCIgY2xhc3M9XCJlcnJvclwiPnt7IHVwbG9hZEVycm9yIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgPC9tYXQtY2FyZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicG9wdXAtZm9vdGVyXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJidG4tYWN0aXZlXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiQ2FuY2VsXCIgKGNsaWNrKT1cImNhbmNlbEZvcm0oKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGlucHV0IFtkaXNhYmxlZF09XCJkZXNpZ25hdGlvbkZvcm0/LmludmFsaWRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRlc2lnbmF0aW9uRm9ybT8uaW52YWxpZCA/ICdidG4tZGlzYWJsZSc6J2J0bi1hY3RpdmUnXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiR2VuZXJhdGUgQ0JQXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZURlc2lnbmF0aW9uKClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuPC9kaXY+Il19
641
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWRlc2lnbmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1kZXNpZ25hdGlvbi9hZGQtZGVzaWduYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvYWRkLWRlc2lnbmF0aW9uL2FkZC1kZXNpZ25hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBcUMsVUFBVSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBT3BDLE1BQU0sT0FBTyx1QkFBdUI7SUFpQ2xDLFlBQW1CLFNBQWdELEVBQ2pDLElBQVMsRUFDakMsRUFBZSxFQUNmLEtBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLFFBQXFCO1FBTFosY0FBUyxHQUFULFNBQVMsQ0FBdUM7UUFDakMsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIs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Ryx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UscUJBQXFCOzswQkFzQzVCLE1BQU07MkJBQUMsZUFBZTs0SkFuQnVCLGNBQWM7c0JBQTdELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaW5hbGl6ZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBmb3JrSm9pbiwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYWRkLWRlc2lnbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1kZXNpZ25hdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FkZC1kZXNpZ25hdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEFkZERlc2lnbmF0aW9uQ29tcG9uZW50IHtcbiAgZGVzaWduYXRpb25Gb3JtOiBGb3JtR3JvdXA7XG4gIG1heEZpbGVTaXplTUIgPSAyNTtcbiAgYWxsb3dlZFR5cGVzID0gW1xuICAgICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICdhcHBsaWNhdGlvbi9tc3dvcmQnLFxuICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JyxcbiAgICAndGV4dC9wbGFpbidcbiAgXTtcbiAgdXBsb2FkRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICB1cGxvYWRlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcbiAgY2JwUGxhbkZpbmFsT2JqOiBhbnlcbiAgbG9hZGluZyA9IGZhbHNlXG4gIEBWaWV3Q2hpbGQoJ2Rlc2lnbmF0aW9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRlc2lnbmF0aW9uUmVmPzogRWxlbWVudFJlZlxuICBkZXNpZ2FudGlvbkZpbHRlckVuYWJsZSA9IGZhbHNlXG4gIGlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSBmYWxzZTtcbiAgZGVzaWduYXRpb25PZmZzZXQgPSAwXG4gIG9kY3NEZXNpZ25hdGlvbkNvdW50ID0gMFxuICBkZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudCA9IDBcbiAgZGVzaWduYXRpb25MaXN0TG9hZENvdW50ID0gNTBcbiAgZGVzaWduYXRpb25EZWZhdWx0TG9hZENvdW50ID0gNTBcbiAgbm9Nb3JlTGVnYWN5RGVzaWduYXRpb25zID0gZmFsc2VcbiAgZGVzaWduYXRpb25TZWFyY2hUZXh0ID0gJydcbiAgZGVzaWduYXRpb25Jbml0SW5Qcm9ncmVzcyA9IGZhbHNlXG4gIHNjcm9sbExpc3RlbmVyQXR0YWNoZWQgPSBmYWxzZVxuICBtYXN0ZXJEYXRhOiBhbnkgPSB7fVxuICBzZWFyY2hEZXNpZ25hdGlvbkxvYWRDb3VudCA9IDUwXG4gIG1hdGNoZWREZXNpZ25hdGlvbklkcyA9IFtdXG4gIHJlYWRvbmx5IE1BWF9ERVNJR05BVElPTlMgPSAxMDtcbiAgbWF4RGVzaWduYXRpb25Db3VudCA9IDEwO1xuICBwcml2YXRlIGRlc2lnbmF0aW9uU2Nyb2xsSGFuZGxlciA9IHRoaXMub25EZXNpZ25hdGlvblNlbGVjdFNjcm9sbC5iaW5kKHRoaXMpO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWRkRGVzaWduYXRpb25Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0Jhcikge1xuXG4gICAgdGhpcy5tYXN0ZXJEYXRhID0ge1xuICAgICAgZGVzaWduYXRpb25CYWNrdXA6IFtdLFxuICAgICAgZGVzaWduYXRpb25GaWx0ZXJlZDogW10sIC8vIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzXG4gICAgfTtcblxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc29sZS5sb2coJ3RoaXMubWF0Y2hlZF9yb2xlX21hcHBpbmdzJywgdGhpcy5kYXRhPy5tYXRjaGVkX3JvbGVfbWFwcGluZ3MpXG4gICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25JZHMgPSB0aGlzLmRhdGE/Lm1hdGNoZWRfcm9sZV9tYXBwaW5ncz8ubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0/Lmlnb3RfZGVzaWduYXRpb25faWQpIHx8IFtdXG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuXG4gICAgLy8gY29uc3Qgc2VhcmNoQ29udHJvbCA9IHRoaXMuZGVzaWduYXRpb25Gb3JtLmdldCgnc2VhcmNoRGVzaWduYXRpb24nKTtcblxuICAgIC8vIGlmIChzZWFyY2hDb250cm9sKSB7XG4gICAgLy8gICBzZWFyY2hDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgIC8vICAgICAucGlwZShcbiAgICAvLyAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAvLyAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgLy8gICAgIClcbiAgICAvLyAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcblxuICAgIC8vICAgICAgIGNvbnN0IHR4dCA9IHJlcz8udG9TdHJpbmcoKT8udHJpbSgpID8/ICcnO1xuXG4gICAgLy8gICAgICAgdGhpcy5kZXNpZ25hdGlvblNlYXJjaFRleHQgPSB0eHQ7XG5cbiAgICAvLyAgICAgICAvLyBSRVNFVCBTRUFSQ0ggUEFHSU5BVElPTlxuICAgIC8vICAgICAgIHRoaXMuc2VhcmNoRGVzaWduYXRpb25Mb2FkQ291bnQgPSA1MDtcblxuICAgIC8vICAgICAgIGlmICh0eHQ/Lmxlbmd0aCkge1xuXG4gICAgLy8gICAgICAgICB0aGlzLmRlc2lnYW50aW9uRmlsdGVyRW5hYmxlID0gdHJ1ZTtcblxuICAgIC8vICAgICAgICAgLy8gQVBJIFNFQVJDSCBPTkxZXG4gICAgLy8gICAgICAgICB0aGlzLmdldERlc2lnbmF0aW9uKHR4dCwgMCk7XG5cbiAgICAvLyAgICAgICB9IGVsc2Uge1xuXG4gICAgLy8gICAgICAgICB0aGlzLmRlc2lnYW50aW9uRmlsdGVyRW5hYmxlID0gZmFsc2U7XG5cbiAgICAvLyAgICAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbiA9XG4gICAgLy8gICAgICAgICAgICh0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25CYWNrdXAgfHwgW10pLnNsaWNlKFxuICAgIC8vICAgICAgICAgICAgIDAsXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkRlZmF1bHRMb2FkQ291bnRcbiAgICAvLyAgICAgICAgICAgKTtcblxuICAgIC8vICAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgPVxuICAgIC8vICAgICAgICAgICB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudDtcblxuICAgIC8vICAgICAgICAgdGhpcy5kZXNpZ25hdGlvbk9mZnNldCA9IDA7XG5cbiAgICAvLyAgICAgICAgIHRoaXMuY2hlY2tDdXJyZW50RGVzaWduYXRpb25QcmVzZW50KCk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyB9XG5cblxuICAgIGlmIChcbiAgICAgICF0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25CYWNrdXAgfHxcbiAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHRoaXMuZ2V0RGVzaWduYXRpb25TYWZlKCk7XG4gICAgfVxuXG4gIH1cblxuICBwcml2YXRlIGdldERlc2lnbmF0aW9uU2FmZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXNpZ25hdGlvbkluaXRJblByb2dyZXNzIHx8IHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuZGVzaWduYXRpb25Jbml0SW5Qcm9ncmVzcyA9IHRydWVcbiAgICB0aGlzLmdldERlc2lnbmF0aW9uKClcbiAgfVxuXG4gIGluaXRpYWxpemVGb3JtKCkge1xuICAgIHRoaXMuZGVzaWduYXRpb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBkZXNpZ25hdGlvbnM6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZERlc2lnbmF0aW9uQmxvY2soKTtcbiAgfVxuXG4gIGdldCBkZXNpZ25hdGlvbkFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZGVzaWduYXRpb25Gb3JtLmdldCgnZGVzaWduYXRpb25zJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgYWRkRGVzaWduYXRpb25CbG9jaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXNpZ25hdGlvbkFycmF5Lmxlbmd0aCA+PSB0aGlzLm1heERlc2lnbmF0aW9uQ291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuY3JlYXRlRGVzaWduYXRpb25Gb3JtKCk7XG5cbiAgICBncm91cC5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpO1xuICAgIH0pO1xuXG4gICAgZ3JvdXAuZ2V0KCdzZWFyY2hEZXNpZ25hdGlvbicpPy52YWx1ZUNoYW5nZXNcbiAgICAucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cbiAgICAgIGNvbnN0IHR4dCA9IHZhbHVlPy50cmltKCkgfHwgJyc7XG5cbiAgICAgIHRoaXMuZGVzaWduYXRpb25TZWFyY2hUZXh0ID0gdHh0O1xuICAgICAgdGhpcy5zZWFyY2hEZXNpZ25hdGlvbkxvYWRDb3VudCA9IDUwO1xuXG4gICAgICBpZiAodHh0KSB7XG5cbiAgICAgICAgdGhpcy5kZXNpZ2FudGlvbkZpbHRlckVuYWJsZSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5nZXREZXNpZ25hdGlvbih0eHQsIDApO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHRoaXMuZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb24gPVxuICAgICAgICAgICh0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25CYWNrdXAgfHwgW10pLnNsaWNlKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRoaXMuZGVzaWduYXRpb25EZWZhdWx0TG9hZENvdW50XG4gICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXNpZ25hdGlvbkFycmF5LnB1c2goZ3JvdXApO1xuICB9XG5cbiAgc2F2ZURlc2lnbmF0aW9uQmxvY2soaW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmRlc2lnbmF0aW9uQXJyYXkuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcblxuICAgIGdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcblxuICAgIGlmIChncm91cC5pbnZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICBpc0VkaXQ6IGZhbHNlXG4gICAgfSk7XG5cbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBlZGl0RGVzaWduYXRpb25CbG9jayhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25hdGlvbkFycmF5LmF0KGluZGV4KS5nZXQoJ2lzRWRpdCcpPy5zZXRWYWx1ZSh0cnVlKTtcbiAgfVxuXG4gIGRlbGV0ZURlc2lnbmF0aW9uQmxvY2soaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduYXRpb25BcnJheS5yZW1vdmVBdChpbmRleCk7XG5cbiAgICBpZiAodGhpcy5kZXNpZ25hdGlvbkFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hZGREZXNpZ25hdGlvbkJsb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlRGVzaWduYXRpb25Gb3JtKCk6IEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZGVzaWduYXRpb25fbmFtZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgaW5zdHJ1Y3Rpb246IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB1cGxvYWREb2M6IFtudWxsLCBbXV0sXG4gICAgICBzZWFyY2hEZXNpZ25hdGlvbjogWycnXSxcbiAgICAgIGlzRWRpdDogW3RydWVdXG4gICAgfSk7XG4gIH1cblxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG5cbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBmaWxlIHNpemVcbiAgICBjb25zdCBtYXhCeXRlcyA9IHRoaXMubWF4RmlsZVNpemVNQiAqIDEwMjQgKiAxMDI0O1xuICAgIGlmIChmaWxlLnNpemUgPiBtYXhCeXRlcykge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9IGBGaWxlIGV4Y2VlZHMgbWF4aW11bSBzaXplIG9mICR7dGhpcy5tYXhGaWxlU2l6ZU1CfU1CYDtcbiAgICAgIHRoaXMuZGVzaWduYXRpb25Gb3JtLmdldCgndXBsb2FkRG9jJyk/LnNldEVycm9ycyh7IG1heFNpemU6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZmlsZSB0eXBlXG4gICAgaWYgKCF0aGlzLmFsbG93ZWRUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYEludmFsaWQgZmlsZSB0eXBlLiBBbGxvd2VkOiBQREYsIFdvcmQsIEV4Y2VsLCBUWFRgO1xuICAgICAgdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCd1cGxvYWREb2MnKT8uc2V0RXJyb3JzKHsgZmlsZVR5cGU6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRlZEZpbGUgPSBmaWxlO1xuICAgIHRoaXMudXBsb2FkRXJyb3IgPSBudWxsO1xuICAgIHRoaXMuZGVzaWduYXRpb25Gb3JtLnBhdGNoVmFsdWUoeyB1cGxvYWREb2M6IGZpbGUgfSk7XG4gICAgdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCd1cGxvYWREb2MnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgY2FuY2VsRm9ybSgpIHtcbiAgICAgdGhpcy5yZXNldFBvcHVwKCk7XG4gIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gIH1cblxuICAvLyBzYXZlRGVzaWduYXRpb24oKSB7XG4gIC8vICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAvLyAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gIC8vICAgZm9ybURhdGEuYXBwZW5kKCdkZXNpZ25hdGlvbk5hbWUnLCB0aGlzLmRlc2lnbmF0aW9uRm9ybS5nZXQoJ2Rlc2lnbmF0aW9uTmFtZScpPy52YWx1ZSk7XG4gIC8vICAgZm9ybURhdGEuYXBwZW5kKCdyb2xlRGV0YWlscycsIHRoaXMuZGVzaWduYXRpb25Gb3JtLmdldCgncm9sZURldGFpbHMnKT8udmFsdWUpO1xuICAvLyAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZSkge1xuICAvLyAgICAgZm9ybURhdGEuYXBwZW5kKCd1cGxvYWREb2MnLCB0aGlzLnVwbG9hZGVkRmlsZSk7XG4gIC8vICAgfVxuICAvLyAgIHRoaXMuY2JwUGxhbkZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENCUFBsYW5Mb2NhbFN0b3JhZ2UoKVxuICAvLyAgIGNvbnNvbGUubG9nKCd0aGlzLmRlc2lnbmF0aW9uRm9ybScsIHRoaXMuZGVzaWduYXRpb25Gb3JtKVxuICAvLyAgIGxldCByZXE6IGFueSA9IHtcbiAgLy8gICAgIFwic3RhdGVfY2VudGVyX2lkXCI6IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcixcbiAgLy8gICAgIFwic3RhdGVfY2VudGVyX25hbWVcIjogdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5vcmdOYW1lLFxuICAvLyAgICAgLy8gXCJkZXBhcnRtZW50X2lkXCI6IFwiXCIsXG4gIC8vICAgICBcImRlc2lnbmF0aW9uX25hbWVcIjogdGhpcy5kZXNpZ25hdGlvbkZvcm0udmFsdWUuZGVzaWduYXRpb25fbmFtZSxcbiAgLy8gICAgIFwiaW5zdHJ1Y3Rpb25cIjogdGhpcy5kZXNpZ25hdGlvbkZvcm0udmFsdWUuaW5zdHJ1Y3Rpb24sXG4gIC8vICAgfVxuICAvLyAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnc3RhdGUnICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lKSB7XG4gIC8vICAgICByZXFbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHNcbiAgLy8gICAgIHJlcVsnZGVwYXJ0bWVudF9uYW1lJ10gPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZVxuICAvLyAgIH1cbiAgLy8gICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ21pbmlzdHJ5JyAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZSkge1xuICAvLyAgICAgcmVxWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzXG4gIC8vICAgICByZXFbJ2RlcGFydG1lbnRfbmFtZSddID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50X25hbWVcbiAgLy8gICB9XG5cbiAgLy8gICBjb25zb2xlLmxvZygncmVxJywgcmVxKVxuICAvLyAgIHRoaXMuc2hhcmVkU2VydmljZS5hZGREZXNpZ25hdGlvbihyZXEpLnN1YnNjcmliZSh7XG4gIC8vICAgICBuZXh0OiAoX3JlcykgPT4ge1xuICAvLyAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAvLyAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0Rlc2lnbmF0aW9uIEFkZGVkIFN1Y2Nlc3NmdWxseScsICdYJywge1xuICAvLyAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAvLyAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gIC8vICAgICAgIH0pO1xuICAvLyAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgnc2F2ZWQnKVxuICAvLyAgICAgfSxcbiAgLy8gICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgLy8gICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgLy8gICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gYWRkIGRlc2lnbmF0aW9uLiBQbGVhc2UgdHJ5IGFnYWluLicsICdYJywge1xuICAvLyAgICAgICAgIGR1cmF0aW9uOiA1MDAwLFxuICAvLyAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAvLyAgICAgICB9KTtcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWRkaW5nIGRlc2lnbmF0aW9uOicsIGVycm9yKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9KVxuICAvLyB9XG5cblxuXG5zYXZlRGVzaWduYXRpb24oKTogdm9pZCB7XG5cbiAgaWYgKCF0aGlzLmNhbkdlbmVyYXRlQ0JQKSB7XG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgJ1BsZWFzZSBzYXZlIGFsbCBkZXNpZ25hdGlvbiBzZWN0aW9ucyBiZWZvcmUgZ2VuZXJhdGluZyBDQlAuJyxcbiAgICAgICdYJyxcbiAgICAgIHsgZHVyYXRpb246IDMwMDAgfVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVzaWduYXRpb25Sb3dzID0gdGhpcy5kZXNpZ25hdGlvbkFycmF5LmNvbnRyb2xzXG4gICAgLm1hcChjb250cm9sID0+ICh7XG4gICAgICBkZXNpZ25hdGlvbl9uYW1lOiBjb250cm9sLmdldCgnZGVzaWduYXRpb25fbmFtZScpPy52YWx1ZSxcbiAgICAgIGluc3RydWN0aW9uOiBjb250cm9sLmdldCgnaW5zdHJ1Y3Rpb24nKT8udmFsdWVcbiAgICB9KSlcbiAgICAuZmlsdGVyKHJvdyA9PiByb3cuZGVzaWduYXRpb25fbmFtZSk7XG5cbiAgaWYgKCFkZXNpZ25hdGlvblJvd3MubGVuZ3RoKSB7XG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgJ1BsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIGRlc2lnbmF0aW9uLicsXG4gICAgICAnWCcsXG4gICAgICB7IGR1cmF0aW9uOiAzMDAwIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgY29uc3QgYmFzZU9iajogYW55ID0ge1xuICAgIHN0YXRlX2NlbnRlcl9pZDpcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcixcblxuICAgIHN0YXRlX2NlbnRlcl9uYW1lOlxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5vcmdOYW1lXG4gIH07XG5cbiAgaWYgKFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdzdGF0ZScgJiZcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZVxuICApIHtcbiAgICBiYXNlT2JqLmRlcGFydG1lbnRfaWQgPVxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcblxuICAgIGJhc2VPYmouZGVwYXJ0bWVudF9uYW1lID1cbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lO1xuICB9XG5cbiAgaWYgKFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScgJiZcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZVxuICApIHtcbiAgICBiYXNlT2JqLmRlcGFydG1lbnRfaWQgPVxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcblxuICAgIGJhc2VPYmouZGVwYXJ0bWVudF9uYW1lID1cbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lO1xuICB9XG5cbiAgY29uc3QgYXBpQ2FsbHMgPSBkZXNpZ25hdGlvblJvd3MubWFwKHJvdyA9PiB7XG5cbiAgICBjb25zdCByZXEgPSB7XG4gICAgICAuLi5iYXNlT2JqLFxuICAgICAgZGVzaWduYXRpb25fbmFtZTogcm93LmRlc2lnbmF0aW9uX25hbWUsXG4gICAgICBpbnN0cnVjdGlvbjogcm93Lmluc3RydWN0aW9uXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuYWRkRGVzaWduYXRpb24ocmVxKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGFkZCBkZXNpZ25hdGlvbjogJHtyb3cuZGVzaWduYXRpb25fbmFtZX1gLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBkZXNpZ25hdGlvbjogcm93LmRlc2lnbmF0aW9uX25hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xuXG4gIGZvcmtKb2luKGFwaUNhbGxzKS5zdWJzY3JpYmUoe1xuICAgIG5leHQ6IChyZXN1bHRzOiBhbnlbXSkgPT4ge1xuXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIocmVzID0+IHJlcz8uZXJyb3IpO1xuXG4gICAgICBpZiAoZmFpbGVkLmxlbmd0aCkge1xuXG4gICAgICAgIGNvbnN0IGZhaWxlZE5hbWVzID0gZmFpbGVkXG4gICAgICAgICAgLm1hcChpdGVtID0+IGl0ZW0uZGVzaWduYXRpb24pXG4gICAgICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYWRkIGRlc2lnbmF0aW9uczogJHtmYWlsZWROYW1lc31gLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgJ0FsbCBkZXNpZ25hdGlvbnMgYWRkZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAgICAgJ1gnLFxuICAgICAgICB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJyk7XG4gICAgfSxcblxuICAgIGVycm9yOiAoKSA9PiB7XG5cbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICdTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAnWCcsXG4gICAgICAgIHtcbiAgICAgICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuXG4gIGNsb3NlRGlhbG9nKCkge1xuICAgIHRoaXMucmVzZXRQb3B1cCgpO1xuICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICB9XG5cbiAgZ2V0RGVzaWduYXRpb24oc2VhcmNoVGV4dD86IHN0cmluZywgb2Zmc2V0PzogbnVtYmVyKTogdm9pZCB7XG5cbiAgICAvLyBjbGVhciBhbnkgcHJldmlvdXMgZGVidWcgaG9va3NcbiAgICBpZiAoIXNlYXJjaFRleHQgfHwgc2VhcmNoVGV4dD8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuXG4gICAgY29uc3QgcmVxT2Zmc2V0ID0gKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSA/IG9mZnNldCA6IHRoaXMuZGVzaWduYXRpb25PZmZzZXRcbiAgICBsZXQgcmVxTGltaXQgPSB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudFxuICAgIGNvbnN0IHBhZ2VJbmRleCA9IHJlcUxpbWl0ID4gMCA/IE1hdGguZmxvb3IocmVxT2Zmc2V0IC8gcmVxTGltaXQpIDogMFxuICAgIC8vIGlmIHdlJ3JlIHJlcXVlc3RpbmcgZnJvbSBmaXJzdCBwYWdlLCBjbGVhciB0aGUgbm8tbW9yZS1kYXRhIGd1YXJkXG4gICAgaWYgKHBhZ2VJbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy5ub01vcmVMZWdhY3lEZXNpZ25hdGlvbnMgPSBmYWxzZVxuICAgICAgcmVxTGltaXQgPSA1MFxuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Qm9keTogYW55ID0ge1xuICAgICAgZmlsdGVyQ3JpdGVyaWFNYXA6IHtcbiAgICAgICAgc3RhdHVzOiAnQWN0aXZlJ1xuICAgICAgfSxcbiAgICAgIHJlcXVlc3RlZEZpZWxkczogW10sXG4gICAgICBwYWdlTnVtYmVyOiBwYWdlSW5kZXgsXG4gICAgICBwYWdlU2l6ZTogcmVxTGltaXQsXG4gICAgfVxuICAgIGlmIChzZWFyY2hUZXh0Py5sZW5ndGgpIHtcbiAgICAgIHJlcXVlc3RCb2R5WydzZWFyY2hTdHJpbmcnXSA9IHNlYXJjaFRleHRcbiAgICAgIC8vIHdoZW4gc2VhcmNoaW5nLCBzdGFydCBmcm9tIGZpcnN0IHBhZ2VcbiAgICAgIHJlcXVlc3RCb2R5LnBhZ2VOdW1iZXIgPSAwXG4gICAgICAvLyBhbGxvdyBsYXJnZXIgcGFnZSBmb3Igc2VhcmNoIGlmIG5lZWRlZFxuICAgICAgcmVxdWVzdEJvZHkucGFnZVNpemUgPSBwYWdlSW5kZXggPT09IDAgPyA1MCA6IHRoaXMuZGVzaWduYXRpb25MaXN0TG9hZENvdW50XG4gICAgICAvLyByZXNldCBndWFyZCB3aGVuIHBlcmZvcm1pbmcgYSBmcmVzaCBzZWFyY2hcbiAgICAgIHRoaXMubm9Nb3JlTGVnYWN5RGVzaWduYXRpb25zID0gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBpbmRpY2F0ZSBsb2FkaW5nIHN0YXRlIHNvIHNjcm9sbCBoYW5kbGVycyBkb24ndCB0cmlnZ2VyIHBhcmFsbGVsIGNhbGxzXG4gICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gdHJ1ZVxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNlYXJjaFB1YmxpY0Rlc2lnbmF0aW9uKHJlcXVlc3RCb2R5KS5waXBlKGZpbmFsaXplKCgpID0+IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IGZhbHNlXG4gICAgICB0aGlzLmRlc2lnbmF0aW9uSW5pdEluUHJvZ3Jlc3MgPSBmYWxzZVxuICAgIH0pKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuXG5cbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gXy5nZXQocmVzLCAncmVzdWx0LnJlc3VsdC5kYXRhJywgW10pO1xuXG4gICAgICAgICAgaWYgKGNvbnRlbnQ/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5ub01vcmVMZWdhY3lEZXNpZ25hdGlvbnMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1hdGNoZWRJZHMgPSBuZXcgU2V0KHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uSWRzKTtcblxuICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IGNvbnRlbnRcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gIW1hdGNoZWRJZHMuaGFzKGl0ZW0/LmlkKSlcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgaWQ6IGl0ZW0/LmlkLFxuICAgICAgICAgICAgICBuYW1lOiBpdGVtPy5kZXNpZ25hdGlvbiB8fCAnJyxcbiAgICAgICAgICAgICAgc3RhdHVzOiBpdGVtPy5zdGF0dXMgfHwgJ0FjdGl2ZScsXG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBjb25zdCB0b3RhbCA9IF8uZ2V0KFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgJ3Jlc3VsdC5yZXN1bHQudG90YWxjb3VudCcsXG4gICAgICAgICAgICBfLmdldChcbiAgICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgICAncmVzdWx0LnJlc3VsdC5kYXRhLnRvdGFsQ291bnQnLFxuICAgICAgICAgICAgICBfLmdldChyZXMsICdyZXN1bHQucmVzdWx0LnRvdGFsQ291bnQnLCAwKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmRlZmF1bHRTZWFyY2hEZXNpZ25hdGlvbkNvdW50ID0gdG90YWw7XG5cbiAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgLy8gU0VBUkNIIE1PREVcbiAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgICAgICBpZiAoc2VhcmNoVGV4dD8ubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkZpbHRlcmVkID0gbWFwcGVkO1xuXG4gICAgICAgICAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb24gPVxuICAgICAgICAgICAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25GaWx0ZXJlZC5zbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRGVzaWduYXRpb25Mb2FkQ291bnRcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAvLyBOT1JNQUwgTU9ERVxuICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgICAgIGlmICghdGhpcy5tYXN0ZXJEYXRhWydkZXNpZ25hdGlvbkJhY2t1cCddIHx8IHJlcU9mZnNldCA9PT0gMCkge1xuXG4gICAgICAgICAgICB0aGlzLm1hc3RlckRhdGFbJ2Rlc2lnbmF0aW9uQmFja3VwJ10gPSBtYXBwZWQ7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZCA9XG4gICAgICAgICAgICAgICh0aGlzLm1hc3RlckRhdGFbJ2Rlc2lnbmF0aW9uQmFja3VwJ10gfHwgW10pLmNvbmNhdChtYXBwZWQpO1xuXG4gICAgICAgICAgICB0aGlzLm1hc3RlckRhdGFbJ2Rlc2lnbmF0aW9uQmFja3VwJ10gPSBfLnVuaXFCeShcbiAgICAgICAgICAgICAgY29tYmluZWQsXG4gICAgICAgICAgICAgIChpdDogYW55KSA9PiAoaXQ/Lm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID1cbiAgICAgICAgICAgICh0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25CYWNrdXAgfHwgW10pLnNsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0aGlzLmRlc2lnbmF0aW9uTGlzdExvYWRDb3VudFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIHNlbGVjdGVkIHZhbHVlIHByZXNlcnZlXG4gICAgICAgICAgY29uc3QgZGVzaWduYXRpb25Db250cm9sID1cbiAgICAgICAgICAgIHRoaXMuZGVzaWduYXRpb25Gb3JtLmdldCgnZGVzaWduYXRpb25fbmFtZScpO1xuXG4gICAgICAgICAgaWYgKGRlc2lnbmF0aW9uQ29udHJvbCkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID1cbiAgICAgICAgICAgICAgZGVzaWduYXRpb25Db250cm9sLnZhbHVlIHx8IFtdO1xuXG4gICAgICAgICAgICBjb25zdCB2YWxpZFZhbHVlcyA9IGN1cnJlbnRWYWx1ZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25CYWNrdXAuc29tZShcbiAgICAgICAgICAgICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0/Lm5hbWUgPT09IHZhbHVlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLmxlbmd0aCAhPT0gY3VycmVudFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZGVzaWduYXRpb25Db250cm9sLnNldFZhbHVlKHZhbGlkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBubyBtb3JlIGRhdGFcbiAgICAgICAgICBpZiAoIW1hcHBlZCB8fCBtYXBwZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudCAmJlxuICAgICAgICAgICAgKHRoaXMubWFzdGVyRGF0YVsnZGVzaWduYXRpb25CYWNrdXAnXSB8fCBbXSkubGVuZ3RoID49XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTZWFyY2hEZXNpZ25hdGlvbkNvdW50XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAvLyBTdG9wIGZ1cnRoZXIgYXV0b21hdGljIGNhbGxzIG9uIHJlcGVhdGVkIGVycm9ycyB0byBhdm9pZCB0aWdodCBsb29wc1xuICAgICAgICAgIC8vIGxvYWRpbmcgZmxhZyBjbGVhcmVkIGluIGZpbmFsaXplKClcbiAgICAgICAgICB0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyA9IHRydWVcbiAgICAgICAgICAvLyB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byBmZXRjaCBkZXNpZ25hdGlvbiBkZXRhaWxzLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIScpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cbiAgLy8gRklYIDI6IEFsc28gaW5qZWN0IHNlbGVjdGVkIGl0ZW1zIGludG8gZGVzaWduYXRpb25CYWNrdXBcbiAgY2hlY2tDdXJyZW50RGVzaWduYXRpb25QcmVzZW50KCkge1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREZXNpZ25hdGlvbnM6IHN0cmluZ1tdID1cbiAgICAgIHRoaXMuZGVzaWduYXRpb25BcnJheS5jb250cm9sc1xuICAgICAgICAubWFwKGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKT8udmFsdWUpXG4gICAgICAgIC5maWx0ZXIodmFsdWUgPT4gISF2YWx1ZSk7XG5cbiAgICBpZiAoIXRoaXMubWFzdGVyRGF0YT8uZGVzaWduYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc2VsZWN0ZWQgZW50cmllc1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBzZWxlY3RlZERlc2lnbmF0aW9ucy5tYXAoKG5hbWU6IHN0cmluZykgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGF0dXM6ICdBY3RpdmUnXG4gICAgfSkpO1xuXG4gICAgLy8gUmVtb3ZlIHNlbGVjdGVkIGl0ZW1zIGZyb20gY3VycmVudCBsaXN0c1xuICAgIGNvbnN0IHJlbWFpbmluZ1Zpc2libGUgPSAodGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uIHx8IFtdKS5maWx0ZXIoXG4gICAgICAoaXRlbTogYW55KSA9PlxuICAgICAgICAhc2VsZWN0ZWREZXNpZ25hdGlvbnMuc29tZShcbiAgICAgICAgICBzZWxlY3RlZCA9PiBzZWxlY3RlZC50b0xvd2VyQ2FzZSgpID09PSBpdGVtPy5uYW1lPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgcmVtYWluaW5nQmFja3VwID0gKHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cCB8fCBbXSkuZmlsdGVyKFxuICAgICAgKGl0ZW06IGFueSkgPT5cbiAgICAgICAgIXNlbGVjdGVkRGVzaWduYXRpb25zLnNvbWUoXG4gICAgICAgICAgc2VsZWN0ZWQgPT4gc2VsZWN0ZWQudG9Mb3dlckNhc2UoKSA9PT0gaXRlbT8ubmFtZT8udG9Mb3dlckNhc2UoKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIC8vIFB1dCBzZWxlY3RlZCBpdGVtcyBvbiB0b3BcbiAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb24gPSBfLnVuaXFCeShcbiAgICAgIFsuLi5zZWxlY3RlZEl0ZW1zLCAuLi5yZW1haW5pbmdWaXNpYmxlXSxcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0/Lm5hbWU/LnRvTG93ZXJDYXNlKClcbiAgICApO1xuXG4gICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwID0gXy51bmlxQnkoXG4gICAgICBbLi4uc2VsZWN0ZWRJdGVtcywgLi4ucmVtYWluaW5nQmFja3VwXSxcbiAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0/Lm5hbWU/LnRvTG93ZXJDYXNlKClcbiAgICApO1xuICB9XG4gIG9uRGVzaWduYXRpb25Ecm9wZG93bkNsb3NlZChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmRlc2lnbmF0aW9uQXJyYXkuYXQoaW5kZXgpO1xuXG4gIGNvbnN0IGN1cnJlbnREZXNpZ25hdGlvbiA9XG4gICAgZ3JvdXAuZ2V0KCdkZXNpZ25hdGlvbl9uYW1lJyk/LnZhbHVlO1xuXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgZ3JvdXAuZ2V0KCdzZWFyY2hEZXNpZ25hdGlvbicpPy5zZXRWYWx1ZShcbiAgICAgICcnLFxuICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgaWYgKGN1cnJlbnREZXNpZ25hdGlvbikge1xuICAgICAgZ3JvdXAuZ2V0KCdkZXNpZ25hdGlvbl9uYW1lJylcbiAgICAgICAgPy5zZXRWYWx1ZShjdXJyZW50RGVzaWduYXRpb24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgfSwgMTAwKTtcbiAgfVxuXG4gIC8vIGRlc2lnbmF0aW9uU2VhcmNoKGV2dDogYW55KSB7XG4gIC8vICAgY29uc3Qgc2VhcmNoVGV4dCA9IGV2dD8udGFyZ2V0Py52YWx1ZVxuICAvLyAgIGNvbnN0IHR4dCA9IChzZWFyY2hUZXh0IHx8ICcnKS50b1N0cmluZygpLnRyaW0oKVxuICAvLyAgIGlmICh0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMpIHJldHVyblxuXG4gIC8vICAgdGhpcy5kZXNpZ25hdGlvblNlYXJjaFRleHQgPSB0eHRcbiAgLy8gICBpZiAodHh0Py5sZW5ndGgpIHtcbiAgLy8gICAgIHRoaXMuZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUgPSB0cnVlXG4gIC8vICAgICB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSB0cnVlXG4gIC8vICAgICB0aGlzLmdldERlc2lnbmF0aW9uKHR4dCwgMClcbiAgLy8gICB9IGVsc2UgaWYgKHRoaXMubWFzdGVyRGF0YSAmJiB0aGlzLm1hc3RlckRhdGE/LmRlc2lnbmF0aW9uQmFja3VwKSB7XG4gIC8vICAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb24gPSB0aGlzLm1hc3RlckRhdGE/LmRlc2lnbmF0aW9uQmFja3VwLnNsaWNlKDAsIHRoaXMuZGVzaWduYXRpb25EZWZhdWx0TG9hZENvdW50KVxuICAvLyAgICAgdGhpcy5kZXNpZ2FudGlvbkZpbHRlckVuYWJsZSA9IGZhbHNlXG4gIC8vICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpXG4gIC8vICAgfVxuICAvLyB9XG4gIHNldHVwU2Nyb2xsTGlzdGVuZXIob3BlbmVkOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgdGhpcy5zY3JvbGxMaXN0ZW5lckF0dGFjaGVkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsTGlzdGVuZXJBdHRhY2hlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2Nyb2xsTGlzdGVuZXJBdHRhY2hlZCA9IHRydWU7XG4gICAgdGhpcy5kZXNpZ2FudGlvbkZpbHRlckVuYWJsZSA9IGZhbHNlO1xuXG4gICAgLy8g4pyFIE9ubHkgcmVzZXQgcGFnaW5hdGlvbiBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0XG4gICAgaWYgKCF0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25CYWNrdXA/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgPSB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudDtcbiAgICAgIHRoaXMuZGVzaWduYXRpb25PZmZzZXQgPSAwO1xuICAgICAgdGhpcy5nZXREZXNpZ25hdGlvbih1bmRlZmluZWQsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDinIUgUmVzdG9yZSBmcm9tIGJhY2t1cCB3aXRob3V0IHJlc2V0dGluZyBvZmZzZXRcbiAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbiA9IHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cC5zbGljZShcbiAgICAgICAgMCwgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnRcbiAgICAgICk7XG4gICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpO1xuICAgIH1cblxuICAgIC8vIGZvY3VzIHNlYXJjaCBpbnB1dFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICBjb25zdCBzZWFyY2hJbnB1dCA9XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtaW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgICBpZiAoc2VhcmNoSW5wdXQpIHtcbiAgICAgICAgc2VhcmNoSW5wdXQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgIH0sIDIwMCk7XG5cbiAgICAvLyBhdHRhY2ggc2Nyb2xsXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJy5tYXQtc2VsZWN0LXBhbmVsLnNlYXJjaC1wYW5lbCdcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgICBpZiAoIXBhbmVsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgJ3Njcm9sbCcsXG4gIHRoaXMuZGVzaWduYXRpb25TY3JvbGxIYW5kbGVyXG4pO1xuXG5wYW5lbC5hZGRFdmVudExpc3RlbmVyKFxuICAnc2Nyb2xsJyxcbiAgdGhpcy5kZXNpZ25hdGlvblNjcm9sbEhhbmRsZXIsXG4gIHsgcGFzc2l2ZTogdHJ1ZSB9XG4pO1xuXG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIG9uRGVzaWduYXRpb25TZWxlY3RTY3JvbGwoZXZlbnQ6IGFueSk6IHZvaWQge1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCByZWFjaGVkQm90dG9tID1cbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQgPj1cbiAgICAgIGVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gNTtcblxuICAgIGlmICghcmVhY2hlZEJvdHRvbSB8fCB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gU0VBUkNIIE1PREVcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKHRoaXMuZGVzaWdhbnRpb25GaWx0ZXJFbmFibGUpIHtcblxuICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gdHJ1ZTtcblxuICAgICAgdGhpcy5zZWFyY2hEZXNpZ25hdGlvbkxvYWRDb3VudCArPSA1MDtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID1cbiAgICAgICAgICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25GaWx0ZXJlZC5zbGljZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0aGlzLnNlYXJjaERlc2lnbmF0aW9uTG9hZENvdW50XG4gICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpO1xuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IGZhbHNlO1xuXG4gICAgICB9LCAzMDApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5PUk1BTCBNT0RFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLy8gbG9jYWwgcGFnaW5hdGlvblxuICAgIGlmIChcbiAgICAgIHRoaXMubWFzdGVyRGF0YT8uZGVzaWduYXRpb25CYWNrdXA/Lmxlbmd0aCA+XG4gICAgICB0aGlzLm1hc3RlckRhdGE/LmRlc2lnbmF0aW9uPy5sZW5ndGhcbiAgICApIHtcblxuICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlRGVzaWduYXRpb25zID0gdHJ1ZTtcblxuICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgKz1cbiAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkRlZmF1bHRMb2FkQ291bnQ7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICAgIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbiA9XG4gICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwLnNsaWNlKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRoaXMuZGVzaWduYXRpb25MaXN0TG9hZENvdW50XG4gICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNoZWNrQ3VycmVudERlc2lnbmF0aW9uUHJlc2VudCgpO1xuXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZURlc2lnbmF0aW9ucyA9IGZhbHNlO1xuXG4gICAgICB9LCAzMDApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2VydmVyIHBhZ2luYXRpb25cbiAgICBjb25zdCBsb2FkZWRMZWdhY3kgPVxuICAgICAgKHRoaXMubWFzdGVyRGF0YT8uZGVzaWduYXRpb25CYWNrdXAgfHwgW10pLmxlbmd0aDtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLm5vTW9yZUxlZ2FjeURlc2lnbmF0aW9ucyAmJlxuICAgICAgdGhpcy5kZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudCAmJlxuICAgICAgbG9hZGVkTGVnYWN5IDwgdGhpcy5kZWZhdWx0U2VhcmNoRGVzaWduYXRpb25Db3VudFxuICAgICkge1xuXG4gICAgICB0aGlzLmlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnMgPSB0cnVlO1xuXG4gICAgICB0aGlzLmRlc2lnbmF0aW9uT2Zmc2V0ID1cbiAgICAgICAgKHRoaXMuZGVzaWduYXRpb25PZmZzZXQgfHwgMCkgK1xuICAgICAgICB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudDtcblxuICAgICAgdGhpcy5kZXNpZ25hdGlvbkxpc3RMb2FkQ291bnQgKz1cbiAgICAgICAgdGhpcy5kZXNpZ25hdGlvbkRlZmF1bHRMb2FkQ291bnQ7XG5cbiAgICAgIHRoaXMuZ2V0RGVzaWduYXRpb24odW5kZWZpbmVkLCB0aGlzLmRlc2lnbmF0aW9uT2Zmc2V0KTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VhcmNoRGVzaWduYXRpb25Db250cm9sKCk6IEZvcm1Db250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5kZXNpZ25hdGlvbkZvcm0uZ2V0KCdzZWFyY2hEZXNpZ25hdGlvbicpIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgY2xlYXJEZXNpZ25hdGlvblNlYXJjaChpbmRleDpudW1iZXIsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgY29uc3QgY29udHJvbCA9IHRoaXMuZGVzaWduYXRpb25BcnJheVxuICAgIC5hdChpbmRleClcbiAgICAuZ2V0KCdzZWFyY2hEZXNpZ25hdGlvbicpO1xuXG4gIGNvbnRyb2w/LnNldFZhbHVlKCcnKTtcblxuICB0aGlzLmRlc2lnYW50aW9uRmlsdGVyRW5hYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID1cbiAgICAodGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uQmFja3VwIHx8IFtdKS5zbGljZShcbiAgICAgIDAsXG4gICAgICB0aGlzLmRlc2lnbmF0aW9uRGVmYXVsdExvYWRDb3VudFxuICAgICk7XG5cbiAgdGhpcy5jaGVja0N1cnJlbnREZXNpZ25hdGlvblByZXNlbnQoKTtcbiAgfVxuXG4gIGdldCBjYW5HZW5lcmF0ZUNCUCgpOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLmRlc2lnbmF0aW9uQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVzaWduYXRpb25BcnJheS5jb250cm9scy5ldmVyeShcbiAgICAgIGNvbnRyb2wgPT5cbiAgICAgICAgIWNvbnRyb2wuZ2V0KCdpc0VkaXQnKT8udmFsdWUgJiZcbiAgICAgICAgY29udHJvbC52YWxpZFxuICAgICk7XG4gIH1cblxuICBnZXRGaWx0ZXJlZERlc2lnbmF0aW9ucyhjdXJyZW50SW5kZXg6IG51bWJlcik6IGFueVtdIHtcblxuICAgIC8vIEdldCBhbGwgc2VsZWN0ZWQgZGVzaWduYXRpb25zIGV4Y2VwdCBjdXJyZW50IHJvd1xuICAgIGNvbnN0IHNlbGVjdGVkRGVzaWduYXRpb25zID0gdGhpcy5kZXNpZ25hdGlvbkFycmF5LmNvbnRyb2xzXG4gICAgICAubWFwKChjb250cm9sLCBpbmRleCkgPT5cbiAgICAgICAgaW5kZXggIT09IGN1cnJlbnRJbmRleFxuICAgICAgICAgID8gY29udHJvbC5nZXQoJ2Rlc2lnbmF0aW9uX25hbWUnKT8udmFsdWVcbiAgICAgICAgICA6IG51bGxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIodmFsdWUgPT4gISF2YWx1ZSk7XG5cbiAgICByZXR1cm4gKHRoaXMubWFzdGVyRGF0YT8uZGVzaWduYXRpb24gfHwgW10pLmZpbHRlcihcbiAgICAgIChkZXNpZ25hdGlvbjogYW55KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID1cbiAgICAgICAgICB0aGlzLmRlc2lnbmF0aW9uQXJyYXkuYXQoY3VycmVudEluZGV4KVxuICAgICAgICAgICAgLmdldCgnZGVzaWduYXRpb25fbmFtZScpPy52YWx1ZTtcblxuICAgICAgICAvLyBLZWVwIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgdmlzaWJsZVxuICAgICAgICBpZiAoZGVzaWduYXRpb24ubmFtZSA9PT0gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXNlbGVjdGVkRGVzaWduYXRpb25zLmluY2x1ZGVzKGRlc2lnbmF0aW9uLm5hbWUpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0UG9wdXAoKTogdm9pZCB7XG5cbiAgdGhpcy5kZXNpZ25hdGlvbkZvcm0ucmVzZXQoKTtcblxuICB0aGlzLmRlc2lnbmF0aW9uQXJyYXkuY2xlYXIoKTtcblxuICB0aGlzLmRlc2lnbmF0aW9uQXJyYXkucHVzaChcbiAgICB0aGlzLmNyZWF0ZURlc2lnbmF0aW9uRm9ybSgpXG4gICk7XG5cbiAgdGhpcy5tYXN0ZXJEYXRhLmRlc2lnbmF0aW9uID0gW107XG4gIHRoaXMubWFzdGVyRGF0YS5kZXNpZ25hdGlvbkJhY2t1cCA9IFtdO1xuICB0aGlzLm1hc3RlckRhdGEuZGVzaWduYXRpb25GaWx0ZXJlZCA9IFtdO1xuXG4gIHRoaXMuZGVzaWduYXRpb25TZWFyY2hUZXh0ID0gJyc7XG4gIHRoaXMuZGVzaWduYXRpb25PZmZzZXQgPSAwO1xuICB0aGlzLnNlYXJjaERlc2lnbmF0aW9uTG9hZENvdW50ID0gNTA7XG4gIHRoaXMuZGVzaWduYXRpb25MaXN0TG9hZENvdW50ID0gNTA7XG5cbiAgdGhpcy5ub01vcmVMZWdhY3lEZXNpZ25hdGlvbnMgPSBmYWxzZTtcbiAgdGhpcy5kZXNpZ2FudGlvbkZpbHRlckVuYWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMudXBsb2FkZWRGaWxlID0gbnVsbDtcbiAgdGhpcy51cGxvYWRFcnJvciA9IG51bGw7XG5cbiAgICB0aGlzLm1hc3RlckRhdGEgPSB7XG4gICAgZGVzaWduYXRpb246IFtdLFxuICAgIGRlc2lnbmF0aW9uQmFja3VwOiBbXSxcbiAgICBkZXNpZ25hdGlvbkZpbHRlcmVkOiBbXVxuICB9O1xuICB0aGlzLmRlc2lnbmF0aW9uQXJyYXkuY2xlYXIoKTtcblxuICB0aGlzLmFkZERlc2lnbmF0aW9uQmxvY2soKTtcbiAgdGhpcy5nZXREZXNpZ25hdGlvblNhZmUoKTtcblxufVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwidmlldy1jYnAtcGxhblwiPlxuICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJkZXNpZ25hdGlvbkZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nXCI+QWRkIE5ldyBEZXNpZ25hdGlvbjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjbGFzcz1cImFkZC1idG5cIiAoY2xpY2spPVwiYWRkRGVzaWduYXRpb25CbG9jaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkZXNpZ25hdGlvbkFycmF5Py5sZW5ndGggPj0gTUFYX0RFU0lHTkFUSU9OU1wiPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4O1wiPis8L3NwYW4+IEFkZCBNb3JlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlciBzZXBlcmF0b3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmVydGljYWwtbWlkZGxlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSAxMCBkZXNpZ25hdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGZvciBDQlAgZ2VuZXJhdGlvbiBhdCBvbmUgdGltZS5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYWN0aW9uc1wiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGVzaWduYXRpb25BcnJheT8ubGVuZ3RoIH19L3t7IE1BWF9ERVNJR05BVElPTlMgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jb250YWluZXJcIj4gXG4gICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJkZXNpZ25hdGlvbnNcIj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRlc2lnbmF0aW9uR3JvdXAgb2YgZGVzaWduYXRpb25BcnJheS5jb250cm9sczsgbGV0IGk9aW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXNpZ25hdGlvbi13cmFwcGVyXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBFRElUIE1PREUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXNpZ25hdGlvbkdyb3VwLnZhbHVlLmlzRWRpdFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtdC0xIGRlc2lnbmF0aW9uLWJsb2NrXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzaWduYXRpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGVzaWduYXRpb24tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lnbmF0aW9uIHt7IGkgKyAxIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVzaWduYXRpb24gRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+RGVzaWduYXRpb24gTmFtZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyIG10LTRcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJtYXJnaW4tdG9wLXMgdy1mdWxsIHJlcXVpcmVkLXNlbGVjdFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGVzaWduYXRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNpZ25hdGlvbl9uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJvbkRlc2lnbmF0aW9uRHJvcGRvd25DbG9zZWQoaSlcIiBwYW5lbENsYXNzPVwic2VhcmNoLXBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJzZXR1cFNjcm9sbExpc3RlbmVyKCRldmVudClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2t5LXNlYXJjaC1jb250YWluZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXQtd3JhcHBlclwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggZGVzaWduYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjEwMCVcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hEZXNpZ25hdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlYXJjaERlc2lnbmF0aW9uQ29udHJvbD8udmFsdWVcIiBjbGFzcz1cImNsZWFyLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJEZXNpZ25hdGlvblNlYXJjaChpLCRldmVudClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBkZXNpZ25hdGlvbiBvZiBnZXRGaWx0ZXJlZERlc2lnbmF0aW9ucyhpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGVzaWduYXRpb24/Lm5hbWVcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGVzaWduYXRpb24/Lm5hbWUgfX1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ01vcmVEZXNpZ25hdGlvbnNcIiBjbGFzcz1cImxvYWRpbmctaW5kaWNhdG9yXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWQgTW9yZS4uLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihtYXN0ZXJEYXRhPy5kZXNpZ25hdGlvbik/Lmxlbmd0aCA9PT0gMCB8fCBub01vcmVMZWdhY3lEZXNpZ25hdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lnbmF0aW9uIE5vdCBGb3VuZC5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5zdHJ1Y3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Um9sZSAmIFJlc3BvbnNpYmlsaXRpZXMgLyBBZGRpdGlvbmFsIERldGFpbHM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGFkZGl0aW9uYWwtZGV0YWlsc1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJjdXN0b20tdGV4dGFyZWFcIiBmb3JtQ29udHJvbE5hbWU9XCJpbnN0cnVjdGlvblwiIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBJbnN0cnVjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjdGlvbnMgLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzaWduYXRpb24tYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVEZXNpZ25hdGlvbkJsb2NrKGkpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gIGNsYXNzPVwic2F2ZS1mbGF0LWJ1dHRvblwiIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNhdmVEZXNpZ25hdGlvbkJsb2NrKGkpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZJRVcgTU9ERSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkZXNpZ25hdGlvbkdyb3VwLnZhbHVlLmlzRWRpdFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJzYXZlZC1kZXNpZ25hdGlvbi1jYXJkXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2F2ZWQtY29udGVudFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYXZlZC1jb250ZW50LWRlc2NcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhdmVkLWRlc2lnbmF0aW9uLW5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTZweCA7Zm9udC13ZWlnaHQ6IDYwMDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlc2lnbmF0aW9uR3JvdXAuZ2V0KCdkZXNpZ25hdGlvbl9uYW1lJyk/LnZhbHVlIH19IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYXZlZC1pbnN0cnVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlc2lnbmF0aW9uR3JvdXAuZ2V0KCdpbnN0cnVjdGlvbicpPy52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhdmVkLWFjdGlvbnNcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFkZC1idG5cIiBtYXQtc3Ryb2tlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJlZGl0RGVzaWduYXRpb25CbG9jayhpKVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRGVzaWduYXRpb25CbG9jayhpKVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkNhbmNlbFwiIChjbGljayk9XCJjYW5jZWxGb3JtKClcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbZGlzYWJsZWRdPVwiIWNhbkdlbmVyYXRlQ0JQXCIgW25nQ2xhc3NdPVwiIWNhbkdlbmVyYXRlQ0JQID8gJ2J0bi1kaXNhYmxlJzonYnRuLWFjdGl2ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiR2VuZXJhdGUgQ0JQXCIgKGNsaWNrKT1cInNhdmVEZXNpZ25hdGlvbigpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuICAgIDwvZGl2PiJdfQ==