@sunbird-cb/cbp-ai 0.1.104 → 0.1.106

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.
@@ -46,6 +46,13 @@ export class GenerateCourseRecommendationComponent {
46
46
  'Finalizing course recommendation plan...'
47
47
  ];
48
48
  this.stageStartTime = 0;
49
+ // Tracks the single active fake-progress ticker (normal generate or regenerate).
50
+ // Must be explicitly cleared wherever the display is finalized/reset instead of
51
+ // letting the interval infer completion from `loading`/`isRegeneratingWithProgress`
52
+ // (those flags flip for reasons other than real completion, e.g. the
53
+ // "recommendations already exist" pause, which previously caused the progress
54
+ // display to jump to 100% and then reset back to 0%).
55
+ this.progressTimerId = null;
49
56
  this.searchText = '';
50
57
  this.filterdCourses = [];
51
58
  this.originalData = [];
@@ -150,8 +157,23 @@ export class GenerateCourseRecommendationComponent {
150
157
  console.log('this.selectFilterCourses', this.selectFilterCourses);
151
158
  }
152
159
  closeDialog() {
160
+ this.stopProgressiveLoading();
153
161
  this.dialogRef.close();
154
162
  }
163
+ ngOnDestroy() {
164
+ this.stopProgressiveLoading();
165
+ }
166
+ /**
167
+ * Stop the fake-progress ticker (shared by generate and regenerate flows).
168
+ * Callers decide what progressPercentage/currentProcessingStage should be
169
+ * afterwards - this only stops it from continuing to tick and overwrite them.
170
+ */
171
+ stopProgressiveLoading() {
172
+ if (this.progressTimerId) {
173
+ clearInterval(this.progressTimerId);
174
+ this.progressTimerId = null;
175
+ }
176
+ }
155
177
  saveCourses() {
156
178
  this.loading = true;
157
179
  console.log('this.planData', this.planData);
@@ -628,8 +650,8 @@ export class GenerateCourseRecommendationComponent {
628
650
  console.log('allCourses--', allCourses);
629
651
  allCourses.forEach((item) => {
630
652
  if (item && item.organisation && item.organisation.length) {
631
- if (this.filteredProviders.indexOf(item.organisation[0]) < 0) {
632
- this.filteredProviders.push(item.organisation[0]);
653
+ if (this.filteredProviders.indexOf(item.organisation) < 0) {
654
+ this.filteredProviders.push(item.organisation);
633
655
  }
634
656
  }
635
657
  });
@@ -1455,6 +1477,7 @@ export class GenerateCourseRecommendationComponent {
1455
1477
  });
1456
1478
  }
1457
1479
  finally {
1480
+ this.stopProgressiveLoading();
1458
1481
  this.isRegenerating = false;
1459
1482
  this.isRegeneratingWithProgress = false;
1460
1483
  this.dataLoaded = true; // Ensure main content is shown after regeneration
@@ -1591,6 +1614,7 @@ export class GenerateCourseRecommendationComponent {
1591
1614
  * SUCCESS CASE (status COMPLETED)
1592
1615
  -------------------------------- */
1593
1616
  if (res?.status === 'COMPLETED') {
1617
+ this.stopProgressiveLoading();
1594
1618
  this.isRegeneratingWithProgress = false;
1595
1619
  this.progressPercentage = 100;
1596
1620
  this.currentProcessingStage = 'Course recommendations regenerated successfully!';
@@ -1610,6 +1634,7 @@ export class GenerateCourseRecommendationComponent {
1610
1634
  this.currentProcessingStage = 'Loading existing course recommendations...';
1611
1635
  this.sharedService.getRecommendedCourse(role_mapping_id).subscribe({
1612
1636
  next: (existingData) => {
1637
+ this.stopProgressiveLoading();
1613
1638
  this.progressPercentage = 100;
1614
1639
  this.currentProcessingStage = 'Loaded existing course recommendations successfully!';
1615
1640
  setTimeout(() => {
@@ -1623,6 +1648,7 @@ export class GenerateCourseRecommendationComponent {
1623
1648
  return;
1624
1649
  }
1625
1650
  /** Any other error → stop & reject */
1651
+ this.stopProgressiveLoading();
1626
1652
  this.isRegeneratingWithProgress = false;
1627
1653
  this.currentProcessingStage = '';
1628
1654
  this.progressPercentage = 0;
@@ -1631,16 +1657,22 @@ export class GenerateCourseRecommendationComponent {
1631
1657
  }
1632
1658
  /** ------------------------------
1633
1659
  * STILL PROCESSING (keep polling)
1660
+ * Progress/stage text is driven solely by
1661
+ * simulateRegenerativeProgressiveStages() (time-based);
1662
+ * do not also set it here or the display flickers
1663
+ * back and forth between the two sources.
1634
1664
  ------------------------------- */
1635
- this.progressPercentage = Math.min(this.progressPercentage + 10, 95);
1636
- this.currentProcessingStage = 'Still processing course recommendations...';
1637
1665
  },
1638
- error: err => reject(err)
1666
+ error: err => {
1667
+ this.stopProgressiveLoading();
1668
+ reject(err);
1669
+ }
1639
1670
  });
1640
1671
  });
1641
1672
  }
1642
1673
  // Progressive loading methods for regeneration
1643
1674
  startRegenerativeProgressiveLoading() {
1675
+ this.stopProgressiveLoading();
1644
1676
  this.currentProcessingStage = this.processingStages[0];
1645
1677
  this.progressPercentage = 0;
1646
1678
  this.stageStartTime = Date.now();
@@ -1650,12 +1682,10 @@ export class GenerateCourseRecommendationComponent {
1650
1682
  let currentStageIndex = 0;
1651
1683
  const totalDuration = 60000; // 60 seconds estimated duration
1652
1684
  const stageInterval = totalDuration / this.processingStages.length;
1653
- const progressInterval = setInterval(() => {
1654
- // Stop if regeneration is complete
1655
- if (!this.isRegeneratingWithProgress) {
1656
- clearInterval(progressInterval);
1657
- return;
1658
- }
1685
+ // Completion/error/reset are all set explicitly by the caller (via
1686
+ // stopProgressiveLoading()); this ticker only ever ramps the display
1687
+ // up while active, it never infers completion on its own.
1688
+ this.progressTimerId = setInterval(() => {
1659
1689
  const elapsed = Date.now() - this.stageStartTime;
1660
1690
  const currentStageProgress = (elapsed % stageInterval) / stageInterval;
1661
1691
  const stageIndex = Math.min(Math.floor(elapsed / stageInterval), this.processingStages.length - 1);
@@ -1667,7 +1697,13 @@ export class GenerateCourseRecommendationComponent {
1667
1697
  // Calculate overall progress (each stage is worth ~16.67%)
1668
1698
  const baseProgress = (stageIndex / this.processingStages.length) * 100;
1669
1699
  const stageProgress = (currentStageProgress / this.processingStages.length) * 100;
1670
- this.progressPercentage = Math.min(Math.round(baseProgress + stageProgress), 95);
1700
+ const computedProgress = Math.min(Math.round(baseProgress + stageProgress), 95);
1701
+ // Once the last stage is reached, `elapsed % stageInterval` keeps cycling
1702
+ // every `stageInterval` ms even though `stageIndex` is clamped - without
1703
+ // this guard the display would climb to 95% then drop back down and
1704
+ // repeat for as long as generation runs past the assumed 60s duration
1705
+ // (real generation commonly takes 1-2 minutes). Never let it regress.
1706
+ this.progressPercentage = Math.max(this.progressPercentage, computedProgress);
1671
1707
  }, 1000);
1672
1708
  }
1673
1709
  /**
@@ -1729,6 +1765,7 @@ export class GenerateCourseRecommendationComponent {
1729
1765
  }
1730
1766
  // Progressive loading methods for course generation
1731
1767
  startProgressiveLoading() {
1768
+ this.stopProgressiveLoading();
1732
1769
  this.currentProcessingStage = this.processingStages[0];
1733
1770
  this.progressPercentage = 0;
1734
1771
  this.stageStartTime = Date.now();
@@ -1738,7 +1775,10 @@ export class GenerateCourseRecommendationComponent {
1738
1775
  let currentStageIndex = 0;
1739
1776
  const totalDuration = 60000; // 60 seconds estimated duration
1740
1777
  const stageInterval = totalDuration / this.processingStages.length;
1741
- const progressInterval = setInterval(() => {
1778
+ // Completion/error/reset are all set explicitly by the caller (via
1779
+ // stopProgressiveLoading()); this ticker only ever ramps the display
1780
+ // up while active, it never infers completion on its own.
1781
+ this.progressTimerId = setInterval(() => {
1742
1782
  const elapsed = Date.now() - this.stageStartTime;
1743
1783
  const currentStageProgress = (elapsed % stageInterval) / stageInterval;
1744
1784
  const stageIndex = Math.min(Math.floor(elapsed / stageInterval), this.processingStages.length - 1);
@@ -1750,13 +1790,13 @@ export class GenerateCourseRecommendationComponent {
1750
1790
  // Calculate overall progress (each stage is worth ~16.67%)
1751
1791
  const baseProgress = (stageIndex / this.processingStages.length) * 100;
1752
1792
  const stageProgress = (currentStageProgress / this.processingStages.length) * 100;
1753
- this.progressPercentage = Math.min(Math.round(baseProgress + stageProgress), 95);
1754
- // Clear interval when loading stops
1755
- if (!this.loading) {
1756
- clearInterval(progressInterval);
1757
- this.progressPercentage = 100;
1758
- this.currentProcessingStage = 'Course recommendations generated successfully!';
1759
- }
1793
+ const computedProgress = Math.min(Math.round(baseProgress + stageProgress), 95);
1794
+ // Once the last stage is reached, `elapsed % stageInterval` keeps cycling
1795
+ // every `stageInterval` ms even though `stageIndex` is clamped - without
1796
+ // this guard the display would climb to 95% then drop back down and
1797
+ // repeat for as long as generation runs past the assumed 60s duration
1798
+ // (real generation commonly takes 1-2 minutes). Never let it regress.
1799
+ this.progressPercentage = Math.max(this.progressPercentage, computedProgress);
1760
1800
  }, 1000);
1761
1801
  }
1762
1802
  // Enhanced course generation with progressive loading
@@ -1793,6 +1833,10 @@ export class GenerateCourseRecommendationComponent {
1793
1833
  // EXISTING RECOMMENDATIONS
1794
1834
  // ===========================
1795
1835
  if (this.firstApiResponse?.is_existing && this.existingRecommendationFound) {
1836
+ // Not a real completion - just pausing for user input. Stop the
1837
+ // fake-progress ticker now so it can't wake up a second later,
1838
+ // see `loading` is false, and flash the display to 100%/"success".
1839
+ this.stopProgressiveLoading();
1796
1840
  const dialogRef = this.dialog.open(DeleteRoleMappingPopupComponent, {
1797
1841
  data: {
1798
1842
  from: 'generateCourseRecommendations' // index for UI removal
@@ -1837,6 +1881,7 @@ export class GenerateCourseRecommendationComponent {
1837
1881
  // COMPLETED
1838
1882
  // ===========================
1839
1883
  if (response?.status === 'COMPLETED') {
1884
+ this.stopProgressiveLoading();
1840
1885
  this.progressPercentage = 100;
1841
1886
  this.dataLoaded = true;
1842
1887
  this.currentProcessingStage =
@@ -1853,6 +1898,7 @@ export class GenerateCourseRecommendationComponent {
1853
1898
  }
1854
1899
  },
1855
1900
  error: (error) => {
1901
+ this.stopProgressiveLoading();
1856
1902
  this.loading = false;
1857
1903
  this.currentProcessingStage = '';
1858
1904
  this.progressPercentage = 0;
@@ -2016,11 +2062,11 @@ export class GenerateCourseRecommendationComponent {
2016
2062
  });
2017
2063
  }
2018
2064
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GenerateCourseRecommendationComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i1.MatDialog }, { token: i4.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2019
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GenerateCourseRecommendationComponent, selector: "app-generate-course-recommendation", viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }], ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Course From iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <!-- <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div> -->\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.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:16px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::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}::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:15px;font-size:20px;left:10px}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.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:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.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:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.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:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;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}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!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: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { 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: "component", type: i12.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i13.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i14.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i14.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i15.GapAnalysisRecommendedCourseComponent, selector: "app-gap-analysis-recommended-course", inputs: ["planData"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }] }); }
2065
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GenerateCourseRecommendationComponent, selector: "app-generate-course-recommendation", viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }], ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Courses from iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <!-- <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div> -->\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.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:16px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::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}::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:15px;font-size:20px;left:10px}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.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:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.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:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.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:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;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}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!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: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { 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: "component", type: i12.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i13.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i14.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i14.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i15.GapAnalysisRecommendedCourseComponent, selector: "app-gap-analysis-recommended-course", inputs: ["planData"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }] }); }
2020
2066
  }
2021
2067
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GenerateCourseRecommendationComponent, decorators: [{
2022
2068
  type: Component,
2023
- args: [{ selector: 'app-generate-course-recommendation', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Course From iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <!-- <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div> -->\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.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:16px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::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}::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:15px;font-size:20px;left:10px}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.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:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.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:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.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:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;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}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}\n"] }]
2069
+ args: [{ selector: 'app-generate-course-recommendation', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Courses from iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <!-- <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div> -->\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div> -->\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.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:16px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::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}::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:15px;font-size:20px;left:10px}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.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:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.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:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.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:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;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}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}\n"] }]
2024
2070
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
2025
2071
  type: Inject,
2026
2072
  args: [MAT_DIALOG_DATA]
@@ -2098,4 +2144,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2098
2144
  </div>
2099
2145
  `, styles: [".confirmation-dialog-container{padding:0}.dialog-header{display:flex;align-items:center;gap:12px;padding:24px 24px 16px;border-bottom:1px solid #e0e0e0}.warning-icon{font-size:24px;width:24px;height:24px;color:#ff9800}h2{margin:0;font-size:18px;font-weight:600;color:#333}.dialog-content{padding:24px}.main-message{font-size:16px;color:#333;margin:0 0 12px;line-height:1.5}.sub-message{font-size:14px;color:#666;margin:0;font-weight:500}.dialog-actions{padding:16px 24px 24px;gap:12px;justify-content:flex-end}.cancel-btn{color:#666}.confirm-btn{display:flex;align-items:center;gap:8px;.mat-icon{font-size:18px;width:18px;height:18px;margin:0}}\n"] }]
2100
2146
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }]; } });
2101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBcUIsU0FBUyxFQUFjLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHcEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFckcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQU9uSCxNQUFNLE9BQU8scUNBQXFDO0lBb0JoRCxZQUFtQixTQUE4RCxFQUMvQyxJQUFTLEVBQVMsYUFBNEIsRUFDdEUsUUFBcUIsRUFBUyxNQUFpQixFQUMvQyxFQUFlO1FBSE4sY0FBUyxHQUFULFNBQVMsQ0FBcUQ7UUFDL0MsU0FBSSxHQUFKLElBQUksQ0FBSztRQUFTLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ3RFLGFBQVEsR0FBUixRQUFRLENBQWE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQy9DLE9BQUUsR0FBRixFQUFFLENBQWE7UUFwQnpCLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFDZixlQUFVLEdBQUcsS0FBSyxDQUFBLENBQUMsd0NBQXdDO1FBQzNELCtCQUEwQixHQUFHLEtBQUssQ0FBQSxDQUFDLDJDQUEyQztRQUM5RSwwQkFBcUIsR0FBRyxFQUFFLENBQUE7UUFFMUIsNENBQTRDO1FBQzVDLDJCQUFzQixHQUFXLEVBQUUsQ0FBQztRQUNwQyx1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFDL0IscUJBQWdCLEdBQUc7WUFDakIseUNBQXlDO1lBQ3pDLHNDQUFzQztZQUN0QywwQ0FBMEM7WUFDMUMseUNBQXlDO1lBQ3pDLHlDQUF5QztZQUN6QywwQ0FBMEM7U0FDM0MsQ0FBQztRQUNGLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBTzNCLGVBQVUsR0FBRyxFQUFFLENBQUE7UUFDZixtQkFBYyxHQUFRLEVBQUUsQ0FBQTtRQUN4QixpQkFBWSxHQUFRLEVBQUUsQ0FBQTtRQUN0Qix3QkFBbUIsR0FBUSxFQUFFLENBQUE7UUFDN0IscUJBQWdCLEdBQVEsRUFBRSxDQUFBLENBQUMsMENBQTBDO1FBQ3JFLHFCQUFnQixHQUFRLEVBQUUsQ0FBQSxDQUFDLHNDQUFzQztRQUNqRSxTQUFJLEdBQUcsS0FBSyxDQUFBO1FBQ1osZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFDaEIseUJBQW9CLEdBQVEsRUFBRSxDQUFDLENBQUMsMkRBQTJEO1FBQzNGLHdCQUFtQixHQUFHLENBQUMsQ0FBQTtRQUN2Qix3QkFBbUIsR0FBRyxDQUFDLENBQUE7UUFDdkIsdUJBQWtCLEdBQUcsS0FBSyxDQUFBO1FBQzFCLHVCQUFrQixHQUFHLEtBQUssQ0FBQTtRQUMxQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsMkJBQXNCLEdBQUcsQ0FBQyxDQUFBO1FBQzFCLG9CQUFlLEdBQVEsQ0FBQyxDQUFBO1FBQ3hCLHFDQUFnQyxHQUFHLENBQUMsQ0FBQTtRQUNwQyxnQ0FBMkIsR0FBRyxDQUFDLENBQUE7UUFDL0IsdUJBQWtCLEdBQVEsQ0FBQyxDQUFBO1FBQzNCLHFDQUFnQyxHQUFHLENBQUMsQ0FBQTtRQUNwQyxnQ0FBMkIsR0FBRyxDQUFDLENBQUE7UUFDL0IsdUJBQWtCLEdBQVEsQ0FBQyxDQUFBO1FBQzNCLGlDQUE0QixHQUFHLENBQUMsQ0FBQTtRQUNoQyw0QkFBdUIsR0FBRyxDQUFDLENBQUE7UUFDM0IsbUJBQWMsR0FBUSxDQUFDLENBQUE7UUFDdkIsbUNBQThCLEdBQUcsRUFBRSxDQUFBO1FBQ25DLGdDQUEyQixHQUFHLEVBQUUsQ0FBQTtRQUNoQyxjQUFTLEdBQUc7WUFDVixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFO1lBQ3ZDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1lBQzNDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1lBQzFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO1NBQ25DLENBQUM7UUFDRiwwQkFBcUIsR0FBRyxFQUFFLENBQUE7UUFDMUIseUJBQW9CLEdBQUcsRUFBRSxDQUFBO1FBQ3pCLHFCQUFnQixHQUFHLEVBQUUsQ0FBQTtRQUNyQix3QkFBbUIsR0FBRyxFQUFFLENBQUE7UUFDeEIsNEJBQXVCLEdBQUcsRUFBRSxDQUFBO1FBQzVCLG1CQUFjLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLGtCQUFhLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQTtRQUN2QixzQkFBaUIsR0FBRyxFQUFFLENBQUE7UUFDdEIsa0JBQWEsR0FBRyxFQUFFLENBQUE7UUFFbEIscUJBQWdCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNqRSxZQUFPLEdBQUcsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUYsY0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hRLGNBQVMsR0FBRyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEQsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLHVCQUFrQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNoRCxvQkFBZSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsc0JBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxzQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLHNCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsbUJBQWMsR0FBRyxFQUFFLENBQUE7UUFDbkIsbUJBQW1CO1FBQ25CLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDdkMscUJBQWdCLEdBQVEsSUFBSSxDQUFBO1FBQzVCLGdDQUEyQixHQUFHLEtBQUssQ0FBQztRQUM1QiwrQkFBMEIsR0FBRyxFQUFFLENBQUMsQ0FBQyx1REFBdUQ7UUFqRTlGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQ3RCLENBQUM7SUFpRUQsY0FBYyxDQUFDLFFBQWdCO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDekIsQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzlCLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNoQixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWixRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVU7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQTtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxVQUFVO1FBQ1IsMkRBQTJEO0lBQzdELENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN6QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2FBQ2hEO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQzlDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQ3ZDLENBQUM7WUFFRixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDM0M7U0FDRjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNDLElBQUksT0FBTyxHQUFHO1lBQ1osaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ25DLHVCQUF1QixFQUFFLElBQUksQ0FBQyxxQkFBcUI7WUFDbkQsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtTQUMvQyxDQUFBO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDakMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQy9DLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNaLG1CQUFtQjtvQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO29CQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO3dCQUNwRCxRQUFRLEVBQUUsSUFBSTt3QkFDZCxVQUFVLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztxQkFDakMsQ0FBQyxDQUFDO29CQUNILG9EQUFvRDtnQkFDdEQsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQTtvQkFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtvQkFDdEIsMkJBQTJCO29CQUMzQixnRkFBZ0Y7b0JBQ2hGLFVBQVU7b0JBQ1YsNkNBQTZDO29CQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7d0JBQzVDLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO3FCQUMvQixDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7b0JBQ3BCLDZEQUE2RDtnQkFDL0QsQ0FBQzthQUNGLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUNuRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3QkFDWixtQkFBbUI7d0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTt3QkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7d0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTs0QkFDdEQsUUFBUSxFQUFFLElBQUk7NEJBQ2QsVUFBVSxFQUFFLENBQUMsa0JBQWtCLENBQUM7eUJBQ2pDLENBQUMsQ0FBQzt3QkFDSCxvREFBb0Q7b0JBQ3RELENBQUM7b0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7d0JBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUE7d0JBQ3RCLDJCQUEyQjt3QkFDM0IsZ0ZBQWdGO3dCQUNoRixVQUFVO3dCQUNWLDZDQUE2Qzt3QkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFOzRCQUM1QyxRQUFRLEVBQUUsSUFBSTs0QkFDZCxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQzt5QkFDL0IsQ0FBQyxDQUFDO3dCQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO3dCQUNwQiw2REFBNkQ7b0JBQy9ELENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsZ0RBQWdEO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7b0JBQ25FLFFBQVEsRUFBRSxJQUFJO29CQUNkLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUMvQixDQUFDLENBQUM7YUFDSjtTQUVGO0lBRUgsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQTtRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osbUJBQW1CO2dCQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0JBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQTtnQkFDMUIsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLGdCQUFnQixJQUFJLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUU7b0JBQ2pFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFBO29CQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDckQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUE7cUJBQ25FO2lCQUNGO2dCQUNELG9EQUFvRDtZQUN0RCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUNwQiwyQkFBMkI7Z0JBQzNCLGdGQUFnRjtnQkFDaEYsVUFBVTtnQkFDViw2Q0FBNkM7Z0JBRTdDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUNwQiw2REFBNkQ7WUFDL0QsQ0FBQztTQUdGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUE7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEUsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osbUJBQW1CO2dCQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7Z0JBQ3ZELHFDQUFxQztnQkFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFFakMscURBQXFEO2dCQUNyRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFFOUIsOERBQThEO2dCQUM5RCxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQTtnQkFDMUMsb0RBQW9EO1lBQ3RELENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQTtnQkFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0JBQ3BCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7b0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0RBQXdELENBQUMsQ0FBQztpQkFDdkU7cUJBQU07b0JBQ0wsaUNBQWlDO29CQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7aUJBQ25EO2dCQUNELDZDQUE2QztnQkFFN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0JBQ3BCLDZEQUE2RDtZQUMvRCxDQUFDO1NBR0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQTtRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osbUJBQW1CO2dCQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvREFBb0QsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7Z0JBRXRGLGtFQUFrRTtnQkFDbEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFFakMsd0RBQXdEO2dCQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDbkMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBRXZFLG9FQUFvRTtvQkFDcEUsSUFBSSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO3dCQUN6QyxVQUFVLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztxQkFDdkM7b0JBRUQsZ0VBQWdFO29CQUNoRSxJQUFJLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7d0JBQ3hDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEVBQUUsSUFBSSxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztxQkFDM0U7aUJBQ0Y7Z0JBRUQscURBQXFEO2dCQUNyRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFFOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzlFLG9EQUFvRDtZQUN0RCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUNwQiwyQkFBMkI7Z0JBQzNCLGdGQUFnRjtnQkFDaEYsVUFBVTtnQkFDViw2Q0FBNkM7Z0JBRTdDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUNwQiw2REFBNkQ7WUFDL0QsQ0FBQztTQUdGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFJO1FBQ3RCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQTtRQUNoQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzNELElBQUksR0FBRyxJQUFJLENBQUE7U0FDWjtRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQUs7UUFDcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO2FBQ2pFO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUE7U0FFOUI7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUE7U0FDckI7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFBO1NBQ2xCO0lBR0gsQ0FBQztJQUNELFVBQVUsQ0FBQyxNQUFNO1FBQ2YsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtTQUN0RDtJQUVILENBQUM7SUFFRCxVQUFVLENBQUMsVUFBa0I7UUFDM0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRS9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkUsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELHFCQUFxQixDQUFDLEdBQVE7UUFDNUIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV2QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7YUFDdkI7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNsQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTt3QkFDM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7cUJBQ3JCO3lCQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO3dCQUNsQyxNQUFNLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDakQ7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUN0RCxNQUFNLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuRDtTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQix5QkFBeUI7UUFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUU7WUFDakUsS0FBSyxFQUFFLFFBQVE7WUFDZixJQUFJLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQzlGLFVBQVUsRUFBRSxxQkFBcUI7WUFDakMsU0FBUyxFQUFFLE9BQU87WUFDbEIsU0FBUyxFQUFFLE1BQU07WUFDakIsWUFBWSxFQUFFLElBQUksQ0FBQywrQ0FBK0M7U0FDbkUsQ0FBQyxDQUFDO1FBRUgsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QyxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7Z0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDOUIsb0NBQW9DO2dCQUNwQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTthQUMxQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTthQUMxQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDRCQUE0QixDQUFDLE9BQVk7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRCxrQ0FBa0M7UUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCx5QkFBeUI7UUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRTtZQUN4RSxLQUFLLEVBQUUsUUFBUTtZQUNmLElBQUksRUFBRSxPQUFPO1lBQ2IsVUFBVSxFQUFFLHFCQUFxQjtZQUNqQyxTQUFTLEVBQUUsT0FBTztZQUNsQixTQUFTLEVBQUUsTUFBTTtZQUNqQixZQUFZLEVBQUUsSUFBSSxDQUFDLCtDQUErQztTQUNuRSxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pDLElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRTtnQkFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUM5QixvQ0FBb0M7Z0JBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQTtnQkFDL0MsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtvQkFDdkksSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQy9HLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO3dCQUN2Qiw2QkFBNkI7d0JBQzdCLDhDQUE4Qzt3QkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7d0JBQ3hCLGtEQUFrRDtvQkFDcEQsQ0FBQyxDQUFDLENBQUE7aUJBQ0g7cUJBQU07aUJBRU47YUFFRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQVksRUFBRSxLQUFLO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDakQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELDZDQUE2QztRQUM3QyxxREFBcUQ7UUFDckQsMERBQTBEO1FBQzFELHdDQUF3QztRQUN4QyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzdELFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ25DLG9JQUFvSTtTQUNySTthQUFNLElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUMxRSxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztZQUN0QyxzSUFBc0k7U0FDdkk7YUFBTTtZQUNMLDJIQUEySDtZQUMzSCw0Q0FBNEM7WUFDNUMsa0RBQWtEO1lBQ2xELGlEQUFpRDtZQUNqRCx1REFBdUQ7WUFDdkQsb0NBQW9DO1lBQ3BDLE1BQU07U0FDUDtRQUVELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsOEVBQThFO1lBQzlFLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxvRkFBb0Y7UUFDcEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNsRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFO2dCQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVqRSx1REFBdUQ7WUFDdkQsSUFBSSxjQUFjLEtBQUssYUFBYSxJQUFJLGNBQWMsS0FBSyxZQUFZLEVBQUU7Z0JBQ3ZFLE9BQU8sY0FBYyxLQUFLLFlBQVksSUFBSSxjQUFjLEtBQUssYUFBYSxDQUFDO2FBQzVFO1lBRUQsa0RBQWtEO1lBQ2xELE9BQU8sY0FBYyxLQUFLLGNBQWMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILDZIQUE2SDtRQUM3SCxPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRCwrQkFBK0IsQ0FBQyxLQUFLO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCw2Q0FBNkM7UUFDN0MsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUM3RCxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztTQUNwQzthQUFNLElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUMxRSxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztTQUN2QztRQUVELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE9BQU8sWUFBWTthQUNoQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsS0FBSyxhQUFhLENBQUMsQ0FBQzthQUNuRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLHNCQUFzQixJQUFJLEVBQUUsRUFBRSxDQUFDO2FBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsd0JBQXdCLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxHQUFHLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQyxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUVELE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQVksRUFBRSxLQUFhO1FBQzVDLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRSxPQUFPLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQXdCO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQTtRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtTQUN4QjtRQUNELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDckIsb0JBQW9CO1lBQ3BCLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7U0FDckI7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBd0I7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUE7UUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFBO1FBQzdDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBQyx5Q0FBeUM7UUFDeEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUE7UUFDMUIsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEVBQUUsQ0FBQTtRQUVyQyxnRUFBZ0U7UUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUkxRCxRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLENBQUMsRUFBRSxNQUFNO2dCQUNaLElBQUksQ0FBQyxjQUFjLEdBQUcsbUJBQW1CLENBQUM7Z0JBQzFDLE1BQU07WUFDUixLQUFLLENBQUMsRUFBRSxhQUFhO2dCQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUM5RixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9GLE1BQU07WUFDUixLQUFLLENBQUMsRUFBRSxhQUFhO2dCQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUM5RixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9GLE1BQU07WUFDUixLQUFLLENBQUMsRUFBRSxTQUFTO2dCQUNmLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUMxRixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNGLE1BQU07U0FDVDtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDbkYsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixvREFBb0Q7UUFDcEQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWxDLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqQyxJQUFJLE1BQU0sQ0FBQyxVQUFVO2dCQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlELElBQUksTUFBTSxDQUFDLEVBQUU7Z0JBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxRQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM5QyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QixlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9CO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxRQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM5QyxrREFBa0Q7Z0JBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO29CQUN2QixNQUFNLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztpQkFDbkM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRTtvQkFDbkMsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO2lCQUMvQjtnQkFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QixlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9CO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxFQUFFO1lBQy9DLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07WUFDdEMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU07WUFDOUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU07WUFDOUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxNQUFNO1NBQ2xDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ3ZDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMxQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO2dCQUN6RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQ2xEO2FBRUY7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQTtRQUNuQyxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFDdkIsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3pCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ3ZDLENBQUMsQ0FBQyxDQUFBO1FBQ0osTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN6RCxxRkFBcUY7UUFDckYscUZBQXFGO1FBQ3JGLHdGQUF3RjtRQUN4RixnREFBZ0Q7UUFDaEQsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFBO1FBQ25HLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsMEJBQTBCLElBQUksZUFBZSxDQUFDLEVBQUU7WUFDcEcsSUFBSSxDQUFDLDBCQUEwQixHQUFHLGNBQWMsQ0FBQTtZQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNsRyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDNUYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUNuRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0NBQ3JGLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7Z0NBQzNFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUE7Z0NBQzdFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7Z0NBQ3JFLE1BQU07NkJBQ1A7eUJBQ0Y7cUJBRUY7aUJBQ0Y7WUFFSCxDQUFDLENBQUMsQ0FBQTtTQUNEO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUdEOzs7T0FHRztJQUNILHNCQUFzQjtRQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBRTVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLEVBQUU7WUFDM0QsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtZQUNqQyxTQUFTLEVBQUU7Z0JBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtnQkFDbEMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUN2QyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU07YUFDeEM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsVUFBaUIsRUFBRTtRQUN4QyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3BELE9BQU8sTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUN4QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxpQ0FBaUMsQ0FBQyxVQUFpQixFQUFFO1FBQ25ELE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9FLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRSxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFbkUsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUMzQixPQUFPLFNBQVMsR0FBRyxTQUFTLENBQUM7YUFDOUI7WUFFRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxNQUFXO1FBQzNCLE1BQU0sWUFBWSxHQUFHO1lBQ25CLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUMvQixHQUFHLENBQUMsTUFBTSxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUM7U0FDbkMsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUN4QixZQUFZO2FBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7YUFDaEUsTUFBTSxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQztRQUVGLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEQsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBRXRELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFVO1FBQzNCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkQsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUNuQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7U0FDcEQ7UUFFRCxPQUFPLENBQUMsUUFBUSxDQUFBO0lBQ2xCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFXO1FBQzFCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUV4Qiw2Q0FBNkM7WUFDN0MsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDekQsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUN0RSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQzthQUNyQztZQUVELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxLQUFLLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzFKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDBCQUEwQixDQUFDLElBQVc7UUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJO2FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNiLElBQUksRUFBRSxJQUFJO1lBQ1YsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDaEU7YUFDQSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDdkUsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7UUFFN0UsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUVyRSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDcEMsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBVztRQUNwQyxNQUFNLGdCQUFnQixHQUFHLElBQUk7YUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2IsSUFBSSxFQUFFLElBQUk7WUFDVixDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQ2pEO2FBQ0EsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3ZFLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1FBRTdFLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFFckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sc0JBQXNCLENBQUM7UUFFOUIsMENBQTBDO0lBQzVDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxJQUFXO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLElBQUk7YUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2IsSUFBSSxFQUFFLElBQUk7WUFDVixDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQzdDO2FBQ0EsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3ZFLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1FBRTdFLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTdELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoQyxPQUFPLGtCQUFrQixDQUFDO1FBRTFCLDBDQUEwQztJQUM1QyxDQUFDO0lBR0QsZ0JBQWdCLENBQUMsSUFBVztRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFeEIsNkNBQTZDO1lBQzdDLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3pELFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQ2xDO2lCQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDdEUsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDckM7WUFFRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFXO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUV4Qiw2Q0FBNkM7WUFDN0MsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDekQsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUN0RSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQzthQUNyQztZQUVELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTNDLDREQUE0RDtRQUM1RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUVuRCw0Q0FBNEM7UUFDNUMsSUFBSSw0QkFBNEIsR0FBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNuRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLEVBQUU7WUFDbkMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUE7U0FDMUQ7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxZQUFZLEVBQUU7WUFDakQsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUM5SDthQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFlBQVksRUFBRTtZQUNqRCw0QkFBNEIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzlIO2FBQ0ksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxFQUFFO1lBQzNDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDOUg7UUFFRCw4REFBOEQ7UUFDOUQsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUE7UUFFeEcsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQTtRQUNoQyxNQUFNLDJCQUEyQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRWxFLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQyw2Q0FBNkM7WUFDN0MsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3ZFLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ3BDO2lCQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQ3BGLFlBQVksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO2FBQ3ZDO1lBRUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNqQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSw0QkFBNEIsQ0FBQyxDQUFBO1FBQ3pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtRQUUzRCxtREFBbUQ7UUFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFdBQVcsY0FBYyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEYsSUFBSSxjQUFjLEtBQUssYUFBYSxJQUFJLGNBQWMsS0FBSyxZQUFZLEVBQUU7Z0JBQ3ZFLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUM5RTtZQUNELElBQUksY0FBYyxLQUFLLFlBQVksRUFBRTtnQkFDbkMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQzVFO1lBQ0QsSUFBSSxjQUFjLEtBQUssUUFBUSxFQUFFO2dCQUMvQixvQkFBb0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDcEU7U0FDRjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUV6RSxtRUFBbUU7UUFDbkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRTdGLDhFQUE4RTtRQUM5RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsNEJBQTRCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUUzRyxtRkFBbUY7UUFDbkYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssS0FBSyxFQUFFO1lBQ25DLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEQ7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxZQUFZLEVBQUU7WUFDakQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakU7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxZQUFZLEVBQUU7WUFDakQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakU7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLEVBQUU7WUFDN0MsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0Q7UUFFRCx1RkFBdUY7UUFDdkYsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyx5QkFBeUI7UUFDcEYsSUFBSSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7UUFDL0UsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFDM0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLFNBQVMsR0FBRyxDQUFBO1FBRXRDLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUU7WUFDM0MsaUJBQWlCLEVBQUUsaUJBQWlCO1lBQ3BDLG1CQUFtQixFQUFFLG1CQUFtQjtZQUN4QyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUN2QyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1NBQ3BELENBQUMsQ0FBQztRQUVILGlGQUFpRjtRQUNqRix1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQywyQkFBMkIsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RSxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxtQkFBbUIsR0FBRyxDQUFDO1FBRXBELElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQywyQkFBMkIsR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RSxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxtQkFBbUIsR0FBRyxDQUFDO1FBRXBELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEosSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLGVBQWUsR0FBRyxDQUFDO1FBRTVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUU7WUFDOUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDMUksVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDMUksTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzFILE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDbkcsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUN2QyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1NBQy9ELENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1FBQ3ZGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDbEYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNqRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXpFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxZQUFtQixFQUFFLGNBQXFCO1FBQ2xFLGtEQUFrRDtRQUNsRCxNQUFNLE1BQU0sR0FBUTtZQUNsQixVQUFVLEVBQUUsQ0FBQztZQUNiLFVBQVUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsQ0FBQztTQUNULENBQUM7UUFFRix1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLDhCQUE4QixHQUFHLEVBQUUsQ0FBQztRQUV6QyxzQ0FBc0M7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMvQixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFOUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxZQUFZLEVBQUU7WUFDbEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFNUQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBRXRCLEtBQUssTUFBTSxTQUFTLElBQUksY0FBYyxFQUFFO2dCQUN0QywyQkFBMkI7Z0JBQzNCLElBQUksT0FBTyxHQUFHLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxRQUFRLEdBQUcsU0FBUyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwRSxJQUFJLFdBQVcsR0FBRyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRTFFLDZCQUE2QjtnQkFDN0IsSUFBSSxPQUFPLEtBQUssYUFBYTtvQkFBRSxPQUFPLEdBQUcsWUFBWSxDQUFDO2dCQUV0RCxpREFBaUQ7Z0JBQ2pELE1BQU0sUUFBUSxHQUFHLEdBQUcsT0FBTyxJQUFJLFFBQVEsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFFekQsOENBQThDO2dCQUM5Qyx3Q0FBd0M7Z0JBQ3hDLGtEQUFrRDtnQkFDbEQsNENBQTRDO2dCQUM1Qyw0Q0FBNEM7Z0JBQzVDLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxLQUFLLFFBQVEsQ0FBQztnQkFDaEQsTUFBTSx1QkFBdUIsR0FBRyxXQUFXLEtBQUssV0FBVyxDQUFDO2dCQUM1RCxNQUFNLG9CQUFvQixHQUFHLFFBQVEsS0FBSyxXQUFXLENBQUM7Z0JBQ3RELE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxLQUFLLFFBQVEsQ0FBQztnQkFFdEQsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBRXBCLElBQUksT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQzlDLElBQUksaUJBQWlCLEVBQUU7d0JBQ3JCLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQzt3QkFDN0IsT0FBTyxHQUFHLElBQUksQ0FBQztxQkFDaEI7eUJBQU0sSUFBSSx1QkFBdUIsRUFBRTt3QkFDbEMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO3dCQUNuQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUNoQjt5QkFBTSxJQUFJLG9CQUFvQixFQUFFO3dCQUMvQixTQUFTLEdBQUcsbUJBQW1CLENBQUM7d0JBQ2hDLE9BQU8sR0FBRyxJQUFJLENBQUM7cUJBQ2hCO3lCQUFNLElBQUksb0JBQW9CLEVBQUU7d0JBQy9CLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQzt3QkFDaEMsT0FBTyxHQUFHLElBQUksQ0FBQztxQkFDaEI7aUJBQ0Y7Z0JBRUQsSUFBSSxPQUFPLEVBQUU7b0JBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsU0FBUyxJQUFJLEVBQUU7d0JBQzNDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO3dCQUN0RSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTt3QkFDakUsU0FBUyxFQUFFLFNBQVM7cUJBQ3JCLENBQUMsQ0FBQztvQkFFSCw4Q0FBOEM7b0JBQzlDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztvQkFDYixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBQ2pFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ25CLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBQ3pFLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBRWpCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7cUJBQ25CO3lCQUFNO3dCQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3JCO29CQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsdURBQXVEO2lCQUMvRDthQUNGO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0Qsa0NBQWtDLENBQUMsWUFBWTtRQUM3QyxnRUFBZ0U7UUFDaEUsSUFBSSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLFlBQVksRUFBRSxXQUFXLEVBQUUsRUFBRTtnQkFDeEYsdUJBQXVCLENBQUMsSUFBSSxDQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FDM0MsQ0FDRixDQUFDO2FBQ0g7U0FDRjtRQUVELDBEQUEwRDtRQUMxRCxJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1FBQ2xGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25FLElBQUksSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO2dCQUN2RSxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN4RixrREFBa0Q7Z0JBQ2xELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2xGLElBQUksS0FBSyxFQUFFO3dCQUNULG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDdEQ7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtTQUNGO1FBRUQsMEZBQTBGO1FBQzFGLDJFQUEyRTtRQUMzRSxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRTVELHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQyw2Q0FBNkM7WUFDN0MsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3ZFLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ3BDO2lCQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQ3BGLFlBQVksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO2FBQ3ZDO1lBRUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLE9BQU8sR0FBRyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzdELElBQUksT0FBTyxLQUFLLGFBQWE7b0JBQUUsT0FBTyxHQUFHLFlBQVksQ0FBQztnQkFFdEQsSUFBSSxPQUFPLEtBQUssWUFBWSxFQUFFLFdBQVcsRUFBRSxFQUFFO29CQUMzQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ25FLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFFekUsOERBQThEO29CQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssWUFBWSxFQUFFLFdBQVcsRUFBRSxFQUFFOzRCQUNuRSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQzFELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFFakUsd0VBQXdFOzRCQUN4RSxnQ0FBZ0M7NEJBQ2hDLDBDQUEwQzs0QkFDMUMsb0NBQW9DOzRCQUNwQyxvQ0FBb0M7NEJBQ3BDLE1BQU0sc0JBQXNCLEdBQUcsV0FBVyxLQUFLLFNBQVMsQ0FBQzs0QkFDekQsTUFBTSw0QkFBNEIsR0FBRyxjQUFjLEtBQUssWUFBWSxDQUFDOzRCQUNyRSxNQUFNLHlCQUF5QixHQUFHLFdBQVcsS0FBSyxZQUFZLENBQUM7NEJBQy9ELE1BQU0seUJBQXlCLEdBQUcsY0FBYyxLQUFLLFNBQVMsQ0FBQzs0QkFFL0QsSUFBSSxzQkFBc0IsSUFBSSw0QkFBNEI7Z0NBQ3hELHlCQUF5QixJQUFJLHlCQUF5QixFQUFFO2dDQUV4RCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0NBQ25CLElBQUksc0JBQXNCO29DQUFFLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztxQ0FDOUQsSUFBSSw0QkFBNEI7b0NBQUUsU0FBUyxHQUFHLGdDQUFnQyxDQUFDO3FDQUMvRSxJQUFJLHlCQUF5QjtvQ0FBRSxTQUFTLEdBQUcsNkJBQTZCLENBQUM7cUNBQ3pFLElBQUkseUJBQXlCO29DQUFFLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQztnQ0FFOUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsU0FBUyxTQUFTLFlBQVksR0FBRyxFQUFFO29DQUMxRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7b0NBQ3hELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtvQ0FDbEQsU0FBUyxFQUFFLFNBQVM7aUNBQ3JCLENBQUMsQ0FBQztnQ0FFSCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2dDQUM1RSxNQUFNLENBQUMsZ0RBQWdEOzZCQUN4RDt5QkFDRjtxQkFDRjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCw4Q0FBOEM7UUFDOUMsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUV4RCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsWUFBWSxDQUFDLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLDJCQUEyQixFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDakYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksMEJBQTBCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM1RSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxrQkFBa0IsbUJBQW1CLENBQUMsTUFBTSxJQUFJLHVCQUF1QixDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuTSxtRkFBbUY7UUFDbkYsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBYyxFQUFFLElBQWM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXhELHFFQUFxRTtRQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVsRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsU0FBUyxDQUFDLGlCQUEwQixFQUFFLGNBQXVCO1FBQzNELElBQUksVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdEMscUVBQXFFO1FBQ3JFLElBQUksaUJBQWlCLElBQUksY0FBYyxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFMUUsVUFBVSxDQUFDLGlCQUFpQixHQUFHO2dCQUM3QixJQUFJLEVBQUUsY0FBYztnQkFDcEIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQztTQUNIO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDckQsS0FBSyxFQUFFLFFBQVE7WUFDZixJQUFJLEVBQUUsVUFBVTtZQUNoQixVQUFVLEVBQUUscUJBQXFCO1lBQ2pDLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsK0NBQStDO1NBQ25FLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekMsSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFO2dCQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUM7Z0JBRTdELHlEQUF5RDtnQkFDekQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUVyQiw0Q0FBNEM7Z0JBQzVDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7b0JBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztnQkFDOUQsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUNBQXVDO2FBQ2pEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsU0FBUztRQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBRTVCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRWpILDBEQUEwRDtRQUMxRCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLGNBQWMsR0FBRyxZQUFZLENBQUM7U0FDL0I7YUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLEVBQUU7WUFDekMsY0FBYyxHQUFHLFlBQVksQ0FBQztTQUMvQjthQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsRUFBRTtZQUN6QyxjQUFjLEdBQUcsUUFBUSxDQUFDO1NBQzNCO1FBRUQsb0RBQW9EO1FBQ3BELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RSxJQUFJLENBQUMsY0FBYyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4RCxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUUxQiw2Q0FBNkM7WUFDN0MsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDN0QsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7YUFDcEM7aUJBQU0sSUFBSSxNQUFNLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUMxRSxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQzthQUN2QztZQUVELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBRTVDLCtDQUErQztZQUMvQyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxJQUFJO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUV4Qiw0Q0FBNEM7Z0JBQzVDLElBQUksUUFBUSxHQUFHLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztnQkFDdkQsSUFBSSxRQUFRLEtBQUssYUFBYTtvQkFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMscUJBQXFCO2dCQUU5RSxJQUFJLFFBQVEsS0FBSyxjQUFjO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUU5QyxrRkFBa0Y7Z0JBQ2xGLE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbkUsTUFBTSxZQUFZLEdBQUcsSUFBSSxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUN6RSxNQUFNLFdBQVcsR0FBRyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQzdDLE1BQU0sY0FBYyxHQUFHLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztnQkFFbkQsbURBQW1EO2dCQUNuRCxvQ0FBb0M7Z0JBQ3BDLDhDQUE4QztnQkFDOUMsd0NBQXdDO2dCQUN4Qyx3Q0FBd0M7Z0JBQ3hDLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxJQUFJLFNBQVMsS0FBSyxXQUFXLENBQUM7Z0JBQ25FLE1BQU0sdUJBQXVCLEdBQUcsY0FBYyxJQUFJLFlBQVksS0FBSyxjQUFjLENBQUM7Z0JBQ2xGLE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxJQUFJLFlBQVksS0FBSyxXQUFXLENBQUM7Z0JBQ3pFLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxJQUFJLFNBQVMsS0FBSyxjQUFjLENBQUM7Z0JBRTVFLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixJQUFJLHVCQUF1QixJQUFJLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDO2dCQUU3RyxzREFBc0Q7Z0JBQ3RELElBQUksT0FBTyxFQUFFO29CQUNYLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxpQkFBaUI7d0JBQUUsU0FBUyxHQUFHLGdCQUFnQixDQUFDO3lCQUMvQyxJQUFJLHVCQUF1Qjt3QkFBRSxTQUFTLEdBQUcsc0JBQXNCLENBQUM7eUJBQ2hFLElBQUksb0JBQW9CO3dCQUFFLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQzt5QkFDMUQsSUFBSSxvQkFBb0I7d0JBQUUsU0FBUyxHQUFHLG1CQUFtQixDQUFDO29CQUUvRCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixTQUFTLElBQUksRUFBRTt3QkFDbEQsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO3dCQUMxRCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTt3QkFDcEUsU0FBUyxFQUFFLFNBQVM7cUJBQ3JCLENBQUMsQ0FBQztpQkFDSjtnQkFFRCx3REFBd0Q7Z0JBQ3hELE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQy9CLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7U0FDckMsQ0FBQyxDQUFDO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5REFBeUQsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILHlCQUF5QjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUNwRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUVqRiwwREFBMEQ7UUFDMUQsa0VBQWtFO1FBQ2xFLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLEVBQUU7WUFDbEMsY0FBYyxHQUFHLFlBQVksQ0FBQyxDQUFDLDZCQUE2QjtTQUM3RDthQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsRUFBRTtZQUN6QyxjQUFjLEdBQUcsWUFBWSxDQUFDLENBQUMsNEJBQTRCO1NBQzVEO2FBQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxFQUFFO1lBQ3pDLGNBQWMsR0FBRyxRQUFRLENBQUMsQ0FBQyx3QkFBd0I7U0FDcEQ7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFDeEUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUM5Qyx3QkFBd0IsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUU1QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxFQUFFO1lBQ25ELGNBQWM7WUFDZCxLQUFLO1lBQ0wsUUFBUTtZQUNSLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7U0FDOUMsQ0FBQyxDQUFDO1FBRUgsMkRBQTJEO1FBQzNELElBQUksVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsVUFBVSxDQUFDLGlCQUFpQixHQUFHO1lBQzdCLElBQUksRUFBRSxjQUFjO1lBQ3BCLEtBQUssRUFBRSxLQUFLO1lBQ1osUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsaUNBQWlDO1NBQzNELENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUNyRCxLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxVQUFVO1lBQ2hCLFVBQVUsRUFBRSxxQkFBcUI7WUFDakMsU0FBUyxFQUFFLE9BQU87WUFDbEIsU0FBUyxFQUFFLE1BQU07WUFDakIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN6QyxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7Z0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOERBQThELENBQUMsQ0FBQztnQkFFNUUseURBQXlEO2dCQUN6RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBRXJCLDRDQUE0QztnQkFDNUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7YUFDNUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFHRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQTtRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM3RSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDaEcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUNuQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvRixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQTtJQUMvQixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN2RixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUM5QjtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVPLHVCQUF1QixDQUFDLEtBQVUsRUFBRSxRQUFhO1FBQ3ZELE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFOUQsSUFBSSxlQUFlLElBQUksa0JBQWtCLEVBQUU7WUFDekMsT0FBTyxHQUFHLGVBQWUsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO1NBQ3JEO1FBRUQsT0FBTyxlQUFlLElBQUksa0JBQWtCLENBQUM7SUFDL0MsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQVUsRUFBRSxRQUFhO1FBQ25ELE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRU8scUJBQXFCLENBQUMsS0FBYTtRQUN6QyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsT0FBTztnQkFDTCxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUNuQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUU7YUFDbkMsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdEIsT0FBTztvQkFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDdEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7aUJBQzFCLENBQUM7YUFDSDtTQUNGO1FBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFOUMsMEJBQTBCO1FBQzFCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQXFCLEVBQUUsRUFBRTtZQUNoRSxJQUFJLEdBQUcsQ0FBQyxRQUFRO2dCQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzlCLE1BQU0sT0FBTyxHQUFHO2dCQUNkLE1BQU0sRUFBRSxJQUFJO2dCQUNaLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtnQkFDdEMsV0FBVyxFQUFFO29CQUNYLEtBQUssRUFBRSxDQUFDO29CQUNSLE9BQU8sRUFBRSxJQUFJO29CQUNiLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2dCQUNELEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsSUFBSTtvQkFDVixNQUFNLEVBQUUsSUFBSTtvQkFDWixXQUFXLEVBQUUsVUFBVTtpQkFDeEI7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7b0JBQ3ZCLE1BQU0sRUFBRSxhQUFhO29CQUNyQixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUM7aUJBQ3JCO2FBQ0YsQ0FBQztZQUVGLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDNUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtnQkFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDdkIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsYUFBYSxDQUFDLElBQUk7UUFDaEIsSUFBSSxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQTtTQUN6QzthQUFNO1lBQ0wsSUFBSSxHQUFHLEdBQUcsK0NBQStDLElBQUksRUFBRSxVQUFVLFlBQVksQ0FBQTtZQUNyRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtTQUMzQjtJQUVILENBQUM7SUFFRDs7T0FFRztJQUNILDBCQUEwQjtRQUN4Qiw4REFBOEQ7UUFDOUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQ3pCO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUNBQW1DO1FBQ2pDLDhFQUE4RTtRQUM5RSw4REFBOEQ7UUFFOUQsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQywrQkFBK0I7UUFDbkMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLE9BQU8sQ0FBQyw4Q0FBOEM7U0FDdkQ7UUFFRCxJQUFJO1lBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFFM0IsMkJBQTJCO1lBQzNCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFdEQsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDZCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsT0FBTzthQUNSO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBRTlELGtDQUFrQztZQUNsQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsd0NBQXdDO1lBRWpFLGlEQUFpRDtZQUNqRCxNQUFNLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBRXpDLDhDQUE4QztZQUM5QyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1lBRTlDLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUV4QixPQUFPLENBQUMsR0FBRyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFFekUsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxFQUFFLE9BQU8sRUFBRTtnQkFDOUUsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLENBQUMsa0JBQWtCLENBQUM7YUFDakMsQ0FBQyxDQUFDO1NBRUo7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0RBQWtELEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFekUscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxFQUFFLE9BQU8sRUFBRTtnQkFDNUYsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7YUFDL0IsQ0FBQyxDQUFDO1NBQ0o7Z0JBQVM7WUFDUixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsa0RBQWtEO1NBQzNFO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCO1FBQzVCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixzQ0FBc0M7WUFDdEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7Z0JBQy9ELEtBQUssRUFBRSxPQUFPO2dCQUNkLFVBQVUsRUFBRSxnQ0FBZ0M7Z0JBQzVDLFlBQVksRUFBRSxJQUFJO2FBQ25CLENBQUMsQ0FBQztZQUVILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pDLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLDJCQUEyQjtRQUNqQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBRXBDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztnQkFDL0MsT0FBTzthQUNSO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtREFBbUQsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUU1RSxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbEUsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3RFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUMvRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGdDQUFnQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQ0FBbUMsQ0FBQyxlQUF1QjtRQUNqRSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLDREQUE0RDtZQUM1RCxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztZQUUzQywyQkFBMkI7WUFDM0IsdUVBQXVFO1lBQ3ZFLDBCQUEwQjtZQUMxQixzREFBc0Q7WUFDdEQsOEVBQThFO1lBQzlFLHFDQUFxQztZQUNyQyx3RkFBd0Y7WUFFeEYsMERBQTBEO1lBQzFELHlCQUF5QjtZQUN6QiwwQ0FBMEM7WUFDMUMscUNBQXFDO1lBQ3JDLDJCQUEyQjtZQUMzQixnQkFBZ0I7WUFDaEIsT0FBTztZQUNQLHdCQUF3QjtZQUN4QixrQ0FBa0M7WUFDbEMsK0NBQStDO1lBQy9DLHdDQUF3QztZQUN4QyxtQ0FBbUM7WUFFbkMscUNBQXFDO1lBQ3JDLHFGQUFxRjtZQUNyRixpRUFBaUU7WUFDakUsdUZBQXVGO1lBRXZGLG9GQUFvRjtZQUVwRixvQ0FBb0M7WUFDcEMsNkVBQTZFO1lBQzdFLHdDQUF3QztZQUN4QyxnRkFBZ0Y7WUFDaEYsMkNBQTJDO1lBQzNDLGtHQUFrRztZQUVsRywrQkFBK0I7WUFDL0IsZ0RBQWdEO1lBQ2hELDJDQUEyQztZQUMzQyx5Q0FBeUM7WUFDekMsc0JBQXNCO1lBQ3RCLGFBQWE7WUFDYixrQ0FBa0M7WUFDbEMseUZBQXlGO1lBQ3pGLDhDQUE4QztZQUM5Qyx5Q0FBeUM7WUFDekMsK0JBQStCO1lBQy9CLFlBQVk7WUFDWixZQUFZO1lBQ1osZUFBZTtZQUNmLGtGQUFrRjtZQUNsRix1QkFBdUI7WUFDdkIsUUFBUTtZQUNSLE1BQU07WUFDTixNQUFNO1lBQ04sSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztZQUN2QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQ0FBc0MsQ0FBQztZQUVyRSxRQUFRLENBQUMsSUFBSSxDQUFDO2lCQUNYLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQzNELFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakIsZ0VBQWdFO2dCQUNoRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FDRixFQUVELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0M7Ozs7ZUFJRztZQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZCxJQUFJLEdBQUcsRUFBRSxNQUFNLEtBQUssV0FBVztvQkFBRSxPQUFPLEtBQUssQ0FBQyxDQUFPLE9BQU87Z0JBQzVELElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEtBQUssR0FBRztvQkFBRSxPQUFPLEtBQUssQ0FBQyxDQUFRLE9BQU87Z0JBQzVELElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLE9BQU87Z0JBQ2hGLE9BQU8sSUFBSSxDQUFDLENBQUMsZUFBZTtZQUM5QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMseUJBQXlCO2FBQ25DO2lCQUNBLFNBQVMsQ0FBQztnQkFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDWjs7d0RBRW9DO29CQUNwQyxJQUFJLEdBQUcsRUFBRSxNQUFNLEtBQUssV0FBVyxFQUFFO3dCQUMvQixJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO3dCQUN4QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDO3dCQUM5QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsa0RBQWtELENBQUM7d0JBRWpGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQzs0QkFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs0QkFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNmLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFFVCxPQUFPO3FCQUNSO29CQUVEOzs0REFFd0M7b0JBQ3hDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRTt3QkFDZCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO3dCQUV4QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFOzRCQUU1RSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsNENBQTRDLENBQUM7NEJBRTNFLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDO2dDQUNqRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRTtvQ0FDckIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztvQ0FDOUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHNEQUFzRCxDQUFDO29DQUVyRixVQUFVLENBQUMsR0FBRyxFQUFFO3dDQUNkLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7d0NBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7d0NBQzVCLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQ0FDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dDQUNYLENBQUM7Z0NBQ0QsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQzs2QkFDdEMsQ0FBQyxDQUFDOzRCQUVILE9BQU87eUJBQ1I7d0JBRUQsc0NBQXNDO3dCQUN0QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO3dCQUN4QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO3dCQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO3dCQUM1QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2QsT0FBTztxQkFDUjtvQkFFRDs7dURBRW1DO29CQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsNENBQTRDLENBQUM7Z0JBQzdFLENBQUM7Z0JBRUQsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUMxQixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFJRCwrQ0FBK0M7SUFDL0MsbUNBQW1DO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRUQscUNBQXFDO1FBQ25DLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLGdDQUFnQztRQUM3RCxNQUFNLGFBQWEsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUVuRSxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUU7Z0JBQ3BDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPO2FBQ1I7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNqRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQztZQUN2RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFbkcseUJBQXlCO1lBQ3pCLElBQUksVUFBVSxLQUFLLGlCQUFpQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO2dCQUNqRixpQkFBaUIsR0FBRyxVQUFVLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDakU7WUFFRCwyREFBMkQ7WUFDM0QsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUN2RSxNQUFNLGFBQWEsR0FBRyxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDbEYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUU1QyxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUM7UUFFckMsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUU3Qix1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFBO1lBQ25DLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQTtZQUNsQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtnQkFDOUQsR0FBRyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNyQyxJQUFJLElBQUksRUFBRSxTQUFTLElBQUksRUFBRSxFQUFFO3dCQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUNyQjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFDRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDMUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUE7YUFDN0Q7WUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDakIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7WUFFekIseURBQXlEO1lBQ3pELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFBO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUVwQixtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO2dCQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7YUFDdkU7aUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtnQkFDL0IseUVBQXlFO2dCQUN6RSxPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7YUFDeEQ7WUFDRCwwRUFBMEU7WUFDMUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMxQixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDN0QsTUFBTSxhQUFhLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2pELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLEdBQUcsYUFBYSxDQUFDO1lBQ3ZFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVuRyx5QkFBeUI7WUFDekIsSUFBSSxVQUFVLEtBQUssaUJBQWlCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pGLGlCQUFpQixHQUFHLFVBQVUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNqRTtZQUVELDJEQUEyRDtZQUMzRCxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3ZFLE1BQU0sYUFBYSxHQUFHLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNsRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRixvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDO2dCQUM5QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsZ0RBQWdELENBQUM7YUFDaEY7UUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELGdDQUFnQyxDQUFDLGVBQXVCO1FBQ3RELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFFckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHNDQUFzQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7WUFFN0IsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFFL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUU3QixNQUFNLENBQ0osRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFXLGlCQUFpQjtZQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUssbUJBQW1CO2FBQ3ZDO2lCQUNFLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FDekQsRUFFRCxHQUFHLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtvQkFDL0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztvQkFDakMsSUFBSSxRQUFRLEVBQUUsV0FBVyxFQUFFO3dCQUN6QixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDO3FCQUN6QztvQkFDRCxPQUFPLENBQUMsR0FBRyxDQUNULGdDQUFnQyxFQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQ3RCLENBQUM7aUJBQ0g7WUFFSCxDQUFDLENBQUMsRUFFRixTQUFTLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFFMUIsaURBQWlEO2dCQUNqRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUU7b0JBQ3RDLE9BQU8sS0FBSyxDQUFDO2lCQUNkO2dCQUVELE9BQU8sUUFBUSxFQUFFLE1BQU0sS0FBSyxXQUFXLENBQUM7WUFFMUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUVSLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQ0g7aUJBQ0EsU0FBUyxDQUFDO2dCQUVULElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO29CQUV0Qiw4QkFBOEI7b0JBQzlCLDJCQUEyQjtvQkFDM0IsOEJBQThCO29CQUM5QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFO3dCQUUxRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEMsK0JBQStCLEVBQy9COzRCQUNFLElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsK0JBQStCLENBQWlCLHVCQUF1Qjs2QkFDOUU7NEJBQ0QsS0FBSyxFQUFFLE9BQU87NEJBQ2QsWUFBWSxFQUFFLElBQUk7eUJBQ25CLENBQ0YsQ0FBQzt3QkFFRixTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUV6QyxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7Z0NBRXRCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dDQUVwQixJQUFJLENBQUMsYUFBYTtxQ0FDZiwyQkFBMkIsQ0FBQyxlQUFlLENBQUM7cUNBQzVDLFNBQVMsQ0FBQztvQ0FFVCxJQUFJLEVBQUUsR0FBRyxFQUFFO3dDQUNULElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7d0NBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO3dDQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO3dDQUU3QixhQUFhO3dDQUNiLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxlQUFlLENBQUM7NkNBQ25ELElBQUksQ0FBQyxPQUFPLENBQUM7NkNBQ2IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29DQUVuQixDQUFDO29DQUVELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO3dDQUVmLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO3dDQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO3dDQUU3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDaEIsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNOzRDQUNwQixrQ0FBa0MsRUFDbEMsR0FBRyxFQUNIOzRDQUNFLFFBQVEsRUFBRSxJQUFJOzRDQUNkLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO3lDQUMvQixDQUNGLENBQUM7b0NBQ0osQ0FBQztpQ0FDRixDQUFDLENBQUM7NkJBRU47aUNBQU07Z0NBRUwsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0NBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs2QkFFaEM7d0JBRUgsQ0FBQyxDQUFDLENBQUM7d0JBRUgsT0FBTztxQkFDUjtvQkFFRCw4QkFBOEI7b0JBQzlCLFlBQVk7b0JBQ1osOEJBQThCO29CQUM5QixJQUFJLFFBQVEsRUFBRSxNQUFNLEtBQUssV0FBVyxFQUFFO3dCQUVwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDO3dCQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzt3QkFFdkIsSUFBSSxDQUFDLHNCQUFzQjs0QkFDekIsZ0RBQWdELENBQUM7d0JBRW5ELFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQzs0QkFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQzt3QkFDOUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUVULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNoQix3QkFBd0IsRUFDeEIsR0FBRyxFQUNIOzRCQUNFLFFBQVEsRUFBRSxJQUFJOzRCQUNkLFVBQVUsRUFBRSxDQUFDLGtCQUFrQixDQUFDO3lCQUNqQyxDQUNGLENBQUM7d0JBRUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUNuQjtnQkFDSCxDQUFDO2dCQUVELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUVmLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUNyQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO29CQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO29CQUU1QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO29CQUU3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDaEIsNENBQTRDLEVBQzVDLEdBQUcsRUFDSDt3QkFDRSxRQUFRLEVBQUUsSUFBSTt3QkFDZCxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztxQkFDL0IsQ0FDRixDQUFDO29CQUVGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNwQixVQUFVLEVBQUUsRUFBRTtZQUNkLE1BQU0sRUFBRSxFQUFFO1lBQ1YsUUFBUSxFQUFFLEVBQUU7WUFDWixRQUFRLEVBQUUsRUFBRTtZQUNaLFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTdDLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0Msd0NBQXdDO1FBQ3hDLGdFQUFnRTtRQUNoRSxxRUFBcUU7UUFDckUsMERBQTBEO1FBQzFELFFBQVE7UUFFUixNQUFNO1FBQ04sS0FBSztRQUNMLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO0lBQy9CLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYSxFQUFFLElBQVk7UUFDcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRW5DLFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxZQUFZO2dCQUNmLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM5RixNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN0RixNQUFNO1lBQ1IsS0FBSyxVQUFVO2dCQUNiLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdEYsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RGLE1BQU07U0FDVDtJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFhO1FBQy9CLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxLQUFLLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUMvRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDbEQsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sUUFBUSxDQUFDO1FBRTFDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEVBQ0osVUFBVSxHQUFHLEVBQUUsRUFDZixNQUFNLEdBQUcsRUFBRSxFQUNYLFFBQVEsR0FBRyxFQUFFLEVBQ2IsUUFBUSxHQUFHLEVBQUUsRUFDYixRQUFRLEdBQUcsRUFBRSxFQUNkLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFekQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUV4RCxrREFBa0Q7WUFDbEQsTUFBTSxrQkFBa0IsR0FBRztnQkFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO2dCQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7YUFDbEMsQ0FBQztZQUVGLE1BQU0sb0JBQW9CLEdBQUcsVUFBVTtpQkFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9DLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUV6QixNQUFNLGVBQWUsR0FDbkIsb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ2pDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQ2pDLG9CQUFvQixDQUFDLFFBQVEsQ0FDM0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUMvQyxDQUNGLENBQUM7WUFFSiw4Q0FBOEM7WUFDOUMsTUFBTSxXQUFXLEdBQ2YsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVuQyxnREFBZ0Q7WUFDaEQsTUFBTSxhQUFhLEdBQ2pCLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDckIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQztvQkFDckIsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDcEMsQ0FBQztZQUVKLGdEQUFnRDtZQUNoRCxNQUFNLGFBQWEsR0FDakIsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFaEQsZ0RBQWdEO1lBQ2hELE1BQU0sYUFBYSxHQUNqQixRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ3JCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUMxQixNQUFNLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDakMsQ0FBQztZQUVKLE9BQU8sQ0FDTCxlQUFlO2dCQUNmLFdBQVc7Z0JBQ1gsYUFBYTtnQkFDYixhQUFhO2dCQUNiLGFBQWEsQ0FDZCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFXLEVBQUUsZUFBeUI7UUFDaEQsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwRCxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztTQUN0RDtRQUVELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUVsQixpQ0FBaUM7UUFDakMsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDeEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkM7UUFDRCx5Q0FBeUM7YUFDcEMsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsSUFBSSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxHQUFHLENBQUM7aUJBQ3ZCLElBQUksR0FBRyxJQUFJLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQztpQkFDNUIsSUFBSSxHQUFHLElBQUksRUFBRTtnQkFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDO2lCQUM1QixJQUFJLEdBQUcsSUFBSSxFQUFFO2dCQUFFLE1BQU0sR0FBRyxHQUFHLENBQUM7O2dCQUM1QixNQUFNLEdBQUcsR0FBRyxDQUFDO1NBQ25CO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksTUFBTSxLQUFLLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVsQyxtQ0FBbUM7UUFDbkMsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzlCLFFBQVEsQ0FBQyxFQUFFO2dCQUNULEtBQUssZUFBZSxDQUFDLENBQUMsT0FBTyxNQUFNLElBQUksR0FBRyxDQUFDO2dCQUMzQyxLQUFLLGVBQWUsQ0FBQyxDQUFDLE9BQU8sTUFBTSxJQUFJLEdBQUcsQ0FBQztnQkFDM0MsS0FBSyxlQUFlLENBQUMsQ0FBQyxPQUFPLE1BQU0sSUFBSSxHQUFHLENBQUM7Z0JBQzNDLEtBQUssZUFBZSxDQUFDLENBQUMsT0FBTyxNQUFNLElBQUksR0FBRyxDQUFDO2dCQUMzQyxLQUFLLGFBQWEsQ0FBQyxDQUFDLE9BQU8sTUFBTSxJQUFJLEdBQUcsQ0FBQztnQkFDekMsT0FBTyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7YUFDdkI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxhQUFhLENBQUMsaUJBQWtDLEVBQUUsY0FBd0I7UUFDeEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRS9DLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQyxRQUFRLEtBQUssRUFBRTtnQkFDYixLQUFLLFVBQVU7b0JBQ2IsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixLQUFLLFdBQVc7b0JBQ2QsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLEtBQUssVUFBVTtvQkFDYixPQUFPLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ25CO29CQUNFLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBN3lFVSxxQ0FBcUMsOENBcUJ0QyxlQUFlO21HQXJCZCxxQ0FBcUMsb0xDakJsRCx3NmlFQTYrQk07OzRGRDU5Qk8scUNBQXFDO2tCQUxqRCxTQUFTOytCQUNFLG9DQUFvQzs7MEJBeUIzQyxNQUFNOzJCQUFDLGVBQWU7b0pBcEJtQixVQUFVO3NCQUFyRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7O0FBK3lFNUMsZ0NBQWdDO0FBbUdoQyxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLFlBQ1MsU0FBcUQ7UUFBckQsY0FBUyxHQUFULFNBQVMsQ0FBNEM7SUFDMUQsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7K0dBWFUsNEJBQTRCO21HQUE1Qiw0QkFBNEIsc0VBaEc3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQ7OzRGQXNFVSw0QkFBNEI7a0JBbEd4QyxTQUFTOytCQUNFLGdDQUFnQyxZQUNoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgVmFsaWRhdG9ycywgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBTdWdnZXN0TW9yZUNvdXJzZXNDb21wb25lbnQgfSBmcm9tICcuLi9zdWdnZXN0LW1vcmUtY291cnNlcy9zdWdnZXN0LW1vcmUtY291cnNlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0VGFiQ2hhbmdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IEFkZENvdXJzZUNvbXBvbmVudCB9IGZyb20gJy4uL2FkZC1jb3Vyc2UvYWRkLWNvdXJzZS5jb21wb25lbnQnO1xuaW1wb3J0IGh0bWwycGRmIGZyb20gJ2h0bWwycGRmLmpzJztcbmltcG9ydCB7IGNvbmNhdCwgaW50ZXJ2YWwsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VXaGlsZSwgdGFwLCBjYXRjaEVycm9yLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9kZWxldGUtcm9sZS1tYXBwaW5nLXBvcHVwL2RlbGV0ZS1yb2xlLW1hcHBpbmctcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQge1xuICBAVmlld0NoaWxkKCdwZGZDb250ZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIHBkZkNvbnRlbnQhOiBFbGVtZW50UmVmO1xuICBwbGFuRGF0YTogYW55XG4gIGxvYWRpbmcgPSBmYWxzZVxuICBkYXRhTG9hZGVkID0gZmFsc2UgLy8gVHJhY2sgaWYgaW5pdGlhbCBkYXRhIGhhcyBiZWVuIGxvYWRlZFxuICBpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlIC8vIFRyYWNrIHJlZ2VuZXJhdGlvbiB3aXRoIHByb2dyZXNzIGxvYWRpbmdcbiAgcmVjb21tZW5kZWRfY291cnNlX2lkID0gJydcblxuICAvLyBQcm9ncmVzc2l2ZSBsb2FkaW5nIGZvciBjb3Vyc2UgZ2VuZXJhdGlvblxuICBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlOiBzdHJpbmcgPSAnJztcbiAgcHJvZ3Jlc3NQZXJjZW50YWdlOiBudW1iZXIgPSAwO1xuICBwcm9jZXNzaW5nU3RhZ2VzID0gW1xuICAgICdBbmFseXppbmcgcm9sZXMgYW5kIHJlc3BvbnNpYmlsaXRpZXMuLi4nLFxuICAgICdEZXRhaWxpbmcgY29tcGV0ZW5jeSByZXF1aXJlbWVudHMuLi4nLFxuICAgICdQcmVwYXJpbmcgaUdPVCBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJyxcbiAgICAnR2VuZXJhdGluZyBwdWJsaWMgY291cnNlIHN1Z2dlc3Rpb25zLi4uJyxcbiAgICAnQ29tcHV0aW5nIGNvbXByZWhlbnNpdmUgZ2FwIGFuYWx5c2lzLi4uJyxcbiAgICAnRmluYWxpemluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb24gcGxhbi4uLidcbiAgXTtcbiAgc3RhZ2VTdGFydFRpbWU6IG51bWJlciA9IDA7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxHZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSwgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMucGxhbkRhdGEgPSBkYXRhXG4gIH1cbiAgc2VhcmNoVGV4dCA9ICcnXG4gIGZpbHRlcmRDb3Vyc2VzOiBhbnkgPSBbXVxuICBvcmlnaW5hbERhdGE6IGFueSA9IFtdXG4gIHNlbGVjdEZpbHRlckNvdXJzZXM6IGFueSA9IFtdXG4gIHN1Z2dlc3RlZENvdXJzZXM6IGFueSA9IFtdIC8vIFRyYWNrIGlHT1Qgc3VnZ2VzdGVkIGNvdXJzZXMgc2VwYXJhdGVseVxuICB1c2VyQWRkZWRDb3Vyc2VzOiBhbnkgPSBbXSAvLyBUcmFjayB1c2VyLWFkZGVkIGNvdXJzZXMgc2VwYXJhdGVseVxuICBtb2RlID0gJ2FkZCdcbiAgY2JwX3BsYW5faWQgPSAnJ1xuICBleHBhbmRlZENvbXBldGVuY2llczogYW55ID0ge307IC8vIFRyYWNrIGV4cGFuZGVkIHN0YXRlIGZvciBlYWNoIGNvdXJzZSBhbmQgY29tcGV0ZW5jeSB0eXBlXG4gIG91dGVyVGFiQWN0aXZlSW5kZXggPSAwXG4gIGlubmVyVGFiQWN0aXZlSW5kZXggPSAwXG4gIG91dGVyVGFiQWN0aXZlVGV4dCA9ICdhbGwnXG4gIGlubmVyVGFiQWN0aXZlVGV4dCA9ICdhbGwnXG4gIHNlbGVjdGVkQ2F0ZWdvcnkgPSAnYWxsJztcbiAgY29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IDBcbiAgb3ZlcmFsbENvdmVyYWdlOiBhbnkgPSAwXG4gIGJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ID0gMFxuICBiZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMgPSAwXG4gIGJlaGF2aW9yYWxDb3ZlcmFnZTogYW55ID0gMFxuICBmdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IDBcbiAgZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzID0gMFxuICBmdW5jdGlvbmFsQ292ZXJhZ2U6IGFueSA9IDBcbiAgZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IDBcbiAgZG9tYWluVG90YWxDb21wZXRlbmNpZXMgPSAwXG4gIGRvbWFpbkNvdmVyYWdlOiBhbnkgPSAwXG4gIGNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeSA9IFtdXG4gIGNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IFtdXG4gIG1lbnVJdGVtcyA9IFtcbiAgICB7IGtleTogJ2FsbCcsIGxhYmVsOiAnQWxsIENhdGVnb3JpZXMnIH0sXG4gICAgeyBrZXk6ICdiZWhhdmlvcmFsJywgbGFiZWw6ICdCZWhhdmlvdXJhbCcgfSxcbiAgICB7IGtleTogJ2Z1bmN0aW9uYWwnLCBsYWJlbDogJ0Z1bmN0aW9uYWwnIH0sXG4gICAgeyBrZXk6ICdkb21haW4nLCBsYWJlbDogJ0RvbWFpbicgfVxuICBdO1xuICBiZWhhdmlvdXJhbE5vdE1hdGNoZWQgPSBbXVxuICBmdW5jdGlvbmFsTm90TWF0Y2hlZCA9IFtdXG4gIGRvbWFpbk5vdE1hdGNoZWQgPSBbXVxuICBzZWxlY3RlZFRoZW1lRmlsdGVyID0gJydcbiAgb3JpZ2luYWxGaWx0ZXJlZENvdXJzZXMgPSBbXVxuICBpc1JlZ2VuZXJhdGluZyA9IGZhbHNlXG4gIGlzUERGRG93bmxvYWQgPSBmYWxzZVxuICBiZWhhdmlvdXJhbE1hdGNoZWQgPSBbXVxuICBmdW5jdGlvbmFsTWF0Y2hlZCA9IFtdXG4gIGRvbWFpbk1hdGNoZWQgPSBbXVxuICBmaWx0ZXJGb3JtITogRm9ybUdyb3VwO1xuICBjb21wZXRlbmNpZXNUeXBlID0gWydBbGwnLCAnQmVoYXZpb3VyYWwnLCAnRnVuY3Rpb25hbCcsICdEb21haW4nXVxuICByYXRpbmdzID0gWyc0LjUgYW5kIGFib3ZlJywgJzQuMCBhbmQgYWJvdmUnLCAnMy41IGFuZCBhYm92ZScsICcyLjUgYW5kIGFib3ZlJywgJzEgYW5kIGFib3ZlJ107XG4gIGxhbmd1YWdlcyA9IFsnRW5nbGlzaCcsICdIaW5kaScsICdUYW1pbCcsICdLYW5uYWRhJywgJ1RlbHVndScsICdNYWxheWFsYW0nLCAnQXNzYW1lc2UnLCAnQmVuZ2FsaScsICdHdWphcmF0aScsICdNYXJhdGhpJywgJ09kaWEnLCAnUHVuamFiaScsICdLb25rYW5pJywgJ0JvZG8nLCAnRG9ncmknLCAnS2FzaG1pcmknLCAnTWFpdGhpbGknLCAnTWFuaXB1cmknLCAnTmVwYWxpJywgJ1NhbnNrcml0JywgJ1NhbnRhbGknLCAnU2luZGhpJywgJ1VyZHUnXTtcbiAgZHVyYXRpb25zID0gWyc8IDEgSG91cicsICcxLTUgSG91cnMnLCAnNSsgSG91cnMnXTtcbiAgcHJvdmlkZXJzID0gW107XG4gIGZpbHRlcmVkQ29tcGV0ZW5jeSA9IFsuLi50aGlzLmNvbXBldGVuY2llc1R5cGVdO1xuICBmaWx0ZXJlZFJhdGluZ3MgPSBbLi4udGhpcy5yYXRpbmdzXTtcbiAgZmlsdGVyZWRMYW5ndWFnZXMgPSBbLi4udGhpcy5sYW5ndWFnZXNdO1xuICBmaWx0ZXJlZER1cmF0aW9ucyA9IFsuLi50aGlzLmR1cmF0aW9uc107XG4gIGZpbHRlcmVkUHJvdmlkZXJzID0gWy4uLnRoaXMucHJvdmlkZXJzXTtcbiAgZnVsbENvdXJzZUxpc3QgPSBbXVxuICAvLyBTZWxlY3RlZCBmaWx0ZXJzXG4gIHNlbGVjdGVkQ29tcGV0ZW5jeSA9ICdBbGwnO1xuICBzZWxlY3RlZFJhdGluZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkTGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZWxlY3RlZER1cmF0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWRQcm92aWRlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGZpcnN0QXBpUmVzcG9uc2U6IGFueSA9IG51bGxcbiAgZXhpc3RpbmdSZWNvbW1lbmRhdGlvbkZvdW5kID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEVucmljaGVkSWRlbnRpZmllcnNLZXkgPSAnJzsgLy8gR3VhcmRzIGR1cGxpY2F0ZSBjYWxscyB0byB0aGUgY291cnNlIHN1Z2dlc3Rpb25zIEFQSVxuICBzZWxlY3RDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgdGhpcy5nYXBBbmFseXNpc1N0YXRzKClcbiAgfVxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZpbHRlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbXBldGVuY3k6IFtbXV0sXG4gICAgICByYXRpbmc6IFtbXV0sXG4gICAgICBsYW5ndWFnZTogW1tdXSxcbiAgICAgIGR1cmF0aW9uOiBbW11dLFxuICAgICAgcHJvdmlkZXI6IFtbXV1cbiAgICB9KTtcbiAgICB0aGlzLmxvYWRDb21wb25lbnREYXRhKCk7XG4gIH1cblxuICBhcHBseUZpbHRlcih2YWx1ZTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ3RoaXMuc2VhcmNoVGV4dCcsIHZhbHVlKVxuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuZmlsdGVyRGF0YSh0aGlzLnNlYXJjaFRleHQpO1xuICB9XG5cbiAgc2VhcmNoRGF0YSgpIHtcbiAgICAvLyAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuZmlsdGVyRGF0YSh0aGlzLnNlYXJjaFRleHQpO1xuICB9XG5cbiAgc2VsZWN0ZWRGaWx0ZXJDb3Vyc2VzKGV2ZW50LCBpdGVtKSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50JywgZXZlbnQpXG4gICAgY29uc29sZS5sb2coJ2l0ZW0nLCBpdGVtKVxuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzLmluZGV4T2YoaXRlbT8uaWRlbnRpZmllcikgPCAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5wdXNoKGl0ZW0/LmlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzLmZpbmRJbmRleChcbiAgICAgICAgY29udHJvbCA9PiBjb250cm9sID09PSBpdGVtLmlkZW50aWZpZXJcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMnLCB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMpXG4gIH1cblxuICBjbG9zZURpYWxvZygpIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpXG4gIH1cblxuICBzYXZlQ291cnNlcygpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgY29uc29sZS5sb2coJ3RoaXMucGxhbkRhdGEnLCB0aGlzLnBsYW5EYXRhKVxuICAgIGxldCByZXFCb2R5ID0ge1xuICAgICAgXCJyb2xlX21hcHBpbmdfaWRcIjogdGhpcy5wbGFuRGF0YS5pZCxcbiAgICAgIFwicmVjb21tZW5kZWRfY291cnNlX2lkXCI6IHRoaXMucmVjb21tZW5kZWRfY291cnNlX2lkLFxuICAgICAgXCJjb3Vyc2VfaWRlbnRpZmllcnNcIjogdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdyZXFCb2R5LCAnLCByZXFCb2R5KVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdhZGQnKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2F2ZUNvdXJzZShyZXFCb2R5KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIHJlcyk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgnc2F2ZWQnKVxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignQ291cnNlcyBTYXZlZCBTdWNjZXNzZnVsbHknLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICAgICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCBoZXJlXG4gICAgICAgICAgLy8gYWxlcnQoJ0NvbmZsaWN0IGRldGVjdGVkOiBUaGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgb3IgYWN0aW9uIGNvbmZsaWN0cy4nKTtcbiAgICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yPy5lcnJvcj8uZGV0YWlsLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAvL3RoaXMuYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jYnBfcGxhbl9pZCkge1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UudXBkYXRlQ291cnNlKHJlcUJvZHksIHRoaXMuY2JwX3BsYW5faWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3M6JywgcmVzKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgnc2F2ZWQnKVxuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDb3Vyc2VzIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5JywgJ1gnLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgICAgICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAgICAgLy8gYWxlcnQoJ0NvbmZsaWN0IGRldGVjdGVkOiBUaGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgb3IgYWN0aW9uIGNvbmZsaWN0cy4nKTtcbiAgICAgICAgICAgIC8vdGhpcy5nZXRcbiAgICAgICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yPy5lcnJvcj8uZGV0YWlsLCAnWCcsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgY2FzZSB3aGVuIGNicF9wbGFuX2lkIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc29sZS5lcnJvcignY2JwX3BsYW5faWQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdXBkYXRlIG9wZXJhdGlvbicpO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byB1cGRhdGUgY291cnNlczogbWlzc2luZyBwbGFuIElEJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgfVxuXG4gIH1cblxuICBnZXRDb3Vyc2VzKCkge1xuICAgIGxldCByb2xlX21hcHBpbmdfaWQgPSB0aGlzLnBsYW5EYXRhLmlkXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgICAgIHRoaXMuY2JwX3BsYW5faWQgPSByZXM/LmlkXG4gICAgICAgIGlmIChyZXMgJiYgcmVzPy5zZWxlY3RlZF9jb3Vyc2VzICYmIHJlcz8uc2VsZWN0ZWRfY291cnNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5tb2RlID0gJ2VkaXQnXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXM/LnNlbGVjdGVkX2NvdXJzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5wdXNoKHJlcy5zZWxlY3RlZF9jb3Vyc2VzW2ldPy5pZGVudGlmaWVyKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCBoZXJlXG4gICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgIC8vdGhpcy5nZXRcbiAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuXG5cbiAgICB9KVxuICB9XG4gIGdldFN1Z2dlc3RlZENvdXJzZSgpIHtcbiAgICBsZXQgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZFxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0U3VnZ2VzdGVkQ291cnNlcyhyb2xlX21hcHBpbmdfaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFN1Z2dlc3RlZENvdXJzZXMgcmVzJywgcmVzKVxuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgICAgIC8vIFN0b3JlIHN1Z2dlc3RlZCBjb3Vyc2VzIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzID0gWy4uLnJlc107XG5cbiAgICAgICAgLy8gUmVidWlsZCBmaWx0ZXJkQ291cnNlcyB0byBpbmNsdWRlIGFsbCBjb3Vyc2UgdHlwZXNcbiAgICAgICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRDb3Vyc2VzKCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGdhcCBhbmFseXNpcyBzdGF0cyBhZnRlciBzdWdnZXN0ZWQgY291cnNlcyBhcmUgYWRkZWRcbiAgICAgICAgdGhpcy51cGRhdGVHYXBBbmFseXNpc0FmdGVyQ291cnNlc1VwZGF0ZSgpXG4gICAgICAgIC8vdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicsIGVycm9yKVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVW5hdXRob3JpemVkIGFjY2VzcyAtIHVzZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGxvZ2luJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSGFuZGxlIG90aGVyIGVycm9ycyBncmFjZWZ1bGx5XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3VnZ2VzdGVkIGNvdXJzZXMnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPciB5b3UgY2FuIHNldCBhIFVJIGVycm9yIG1lc3NhZ2UgdmFyaWFibGVcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvL3RoaXMuYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9XG5cblxuICAgIH0pXG4gIH1cblxuICBnZXRVc2VyQ291cnNlKCkge1xuICAgIGxldCByb2xlX21hcHBpbmdfaWQgPSB0aGlzLnBsYW5EYXRhLmlkXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRVc2VyQ291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZygnZ2V0VXNlckNvdXJzZSBBUEkgcmVzcG9uc2U6JywgcmVzKVxuICAgICAgICBjb25zb2xlLmxvZygnQ3VycmVudCBmaWx0ZXJkQ291cnNlcyBiZWZvcmUgYWRkaW5nIHVzZXIgY291cnNlczonLCB0aGlzLmZpbHRlcmRDb3Vyc2VzKVxuXG4gICAgICAgIC8vIFN0b3JlIHVzZXItYWRkZWQgY291cnNlcyBzZXBhcmF0ZWx5IChyZXNldCB0byBhdm9pZCBkdXBsaWNhdGVzKVxuICAgICAgICB0aGlzLnVzZXJBZGRlZENvdXJzZXMgPSBbLi4ucmVzXTtcblxuICAgICAgICAvLyBQcm9jZXNzIHVzZXItYWRkZWQgY291cnNlcyB0byBlbnN1cmUgcHJvcGVyIHN0cnVjdHVyZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHVzZXJDb3Vyc2UgPSByZXNbaV07XG4gICAgICAgICAgY29uc29sZS5sb2coYFVzZXIgY291cnNlICR7aX0gY29tcGV0ZW5jaWVzOmAsIHVzZXJDb3Vyc2UuY29tcGV0ZW5jaWVzKTtcblxuICAgICAgICAgIC8vIEVuc3VyZSB1c2VyLWFkZGVkIGNvdXJzZXMgaGF2ZSB0aGUgZXhwZWN0ZWQgc3RydWN0dXJlIGZvciBkaXNwbGF5XG4gICAgICAgICAgaWYgKHVzZXJDb3Vyc2UgJiYgIXVzZXJDb3Vyc2UuY291cnNlX3R5cGUpIHtcbiAgICAgICAgICAgIHVzZXJDb3Vyc2UuY291cnNlX3R5cGUgPSAnVXNlciBBZGRlZCc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIGlkZW50aWZpZXIgaWYgbWlzc2luZyAobmVlZGVkIGZvciBjb3Vyc2Ugc2VsZWN0aW9uIGxvZ2ljKVxuICAgICAgICAgIGlmICh1c2VyQ291cnNlICYmICF1c2VyQ291cnNlLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHVzZXJDb3Vyc2UuaWRlbnRpZmllciA9IHVzZXJDb3Vyc2UuaWQgfHwgYHVzZXJfY291cnNlXyR7aX1fJHtEYXRlLm5vdygpfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVidWlsZCBmaWx0ZXJkQ291cnNlcyB0byBpbmNsdWRlIGFsbCBjb3Vyc2UgdHlwZXNcbiAgICAgICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRDb3Vyc2VzKCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2ZpbHRlcmRDb3Vyc2VzIGFmdGVyIGFkZGluZyB1c2VyIGNvdXJzZXM6JywgdGhpcy5maWx0ZXJkQ291cnNlcyk7XG4gICAgICAgIC8vdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicsIGVycm9yKVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvLyBIYW5kbGUgNDA5IENvbmZsaWN0IGhlcmVcbiAgICAgICAgLy8gYWxlcnQoJ0NvbmZsaWN0IGRldGVjdGVkOiBUaGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgb3IgYWN0aW9uIGNvbmZsaWN0cy4nKTtcbiAgICAgICAgLy90aGlzLmdldFxuICAgICAgICAvLyBPciB5b3UgY2FuIHNldCBhIFVJIGVycm9yIG1lc3NhZ2UgdmFyaWFibGVcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvL3RoaXMuYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9XG5cblxuICAgIH0pXG4gIH1cblxuICBjaGVja0lmQ291cnNlRXhpc3RzKGl0ZW0pIHtcbiAgICBsZXQgZmxhZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpID4gLTEpIHtcbiAgICAgIGZsYWcgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmbGFnXG4gIH1cblxuICBzZWxlY3RBbGxDb3Vyc2VzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJkQ291cnNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMucHVzaCh0aGlzLmZpbHRlcmRDb3Vyc2VzW2ldLmlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcyA9IFtdXG5cbiAgICB9XG4gICAgaWYgKHRoaXMuY2JwX3BsYW5faWQpIHtcbiAgICAgIHRoaXMubW9kZSA9ICd1cGRhdGUnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9kZSA9ICdhZGQnXG4gICAgfVxuXG5cbiAgfVxuICBnZXRTZWN0b3JzKHNlY3Rvcikge1xuICAgIGlmIChzZWN0b3IgJiYgc2VjdG9yLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2VjdG9yKSA/IHNlY3Rvci5qb2luKCcvICcpIDogJydcbiAgICB9XG5cbiAgfVxuXG4gIGZpbHRlckRhdGEoc2VhcmNoVGV4dDogc3RyaW5nKTogYW55W10ge1xuICAgIGNvbnN0IGZpbHRlciA9IHNlYXJjaFRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZ2V0QWxsQXZhaWxhYmxlQ291cnNlcygpLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gdGhpcy5mbGF0dGVuT2JqZWN0VG9TdHJpbmcoaXRlbSkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KGZpbHRlcmVkKTtcbiAgfVxuXG4gIGZsYXR0ZW5PYmplY3RUb1N0cmluZyhvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXN1bHQgKz0gJyAnICsgdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnICcgKyB2YWw7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcgJyArIHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5mbGF0dGVuT2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdWdnZXN0TW9yZUNvdXJzZXMoKSB7XG4gICAgLy8gdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICAgIGNvbnN0IGRpYWxvZ1JlZk5ldyA9IHRoaXMuZGlhbG9nLm9wZW4oU3VnZ2VzdE1vcmVDb3Vyc2VzQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzExMDBweCcsXG4gICAgICBkYXRhOiB7IHJlY29tbWVuZGVkX2NvdXJzZV9pZDogdGhpcy5yZWNvbW1lbmRlZF9jb3Vyc2VfaWQsIHJvbGVfbWFwcGluZ19pZDogdGhpcy5wbGFuRGF0YS5pZCB9LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnNDAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWZOZXcuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuICAgICAgICB0aGlzLmdldFN1Z2dlc3RlZENvdXJzZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdldFN1Z2dlc3RlZENvdXJzZSgpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0ZSBDb3Vyc2UgUmVjb21tZW5kYXRpb24gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihHZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzEwMDBweCcsXG4gICAgICBkYXRhOiBlbGVtZW50LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnNDAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuICAgICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaiAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5ICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWQpIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgLy8gdGhpcy5kYXRhU291cmNlLmRhdGEgPSByZXNcbiAgICAgICAgICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gcmVzO1xuICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGU6IHN0cmluZywgaW5kZXgpOiBhbnlbXSB7XG4gICAgY29uc3QgY291cnNlID0gdGhpcy5maWx0ZXJkQ291cnNlc1tpbmRleF07XG4gICAgaWYgKCFjb3Vyc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBObyBjb3Vyc2UgZm91bmQgYXQgaW5kZXggJHtpbmRleH1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAvLyBBSSBSZWNvbW1lbmRlZCAmIFB1YmxpYyBjb3Vyc2VzIHVzZSAnY29tcGV0ZW5jaWVzJ1xuICAgIC8vIE1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1QgY291cnNlcyB1c2UgJ2NvbXBldGVuY2llc192NidcbiAgICAvLyBVc2VyIEFkZGVkIGNvdXJzZXMgdXNlICdjb21wZXRlbmNpZXMnXG4gICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4gICAgICAvLyAgY29uc29sZS5sb2coYENvdXJzZSAke2luZGV4fSAoJHtjb3Vyc2UuY291cnNlX3R5cGUgfHwgY291cnNlLm5hbWUgfHwgJ1Vua25vd24nfSkgdXNpbmcgJ2NvbXBldGVuY2llcycgcHJvcGVydHk6YCwgY29tcGV0ZW5jaWVzKTtcbiAgICB9IGVsc2UgaWYgKGNvdXJzZS5jb21wZXRlbmNpZXNfdjYgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2KSkge1xuICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXNfdjYnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIGhhcyBubyB2YWxpZCBjb21wZXRlbmNpZXMgcHJvcGVydHk6YCwge1xuICAgICAgLy8gICBoYXNDb21wZXRlbmNpZXM6ICEhY291cnNlLmNvbXBldGVuY2llcyxcbiAgICAgIC8vICAgY29tcGV0ZW5jaWVzVHlwZTogdHlwZW9mIGNvdXJzZS5jb21wZXRlbmNpZXMsXG4gICAgICAvLyAgIGhhc0NvbXBldGVuY2llc1Y2OiAhIWNvdXJzZS5jb21wZXRlbmNpZXNfdjYsXG4gICAgICAvLyAgIGNvbXBldGVuY2llc1Y2VHlwZTogdHlwZW9mIGNvdXJzZS5jb21wZXRlbmNpZXNfdjYsXG4gICAgICAvLyAgIGNvdXJzZUtleXM6IE9iamVjdC5rZXlzKGNvdXJzZSlcbiAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIGlmIChjb21wZXRlbmNpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyAgY29uc29sZS5sb2coYE5vIGNvbXBldGVuY2llcyBmb3VuZCBmb3IgY291cnNlICR7aW5kZXh9IGFuZCB0eXBlICR7dHlwZX1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgZm9yIGNvbXBhcmlzb24gKGNhc2UtaW5zZW5zaXRpdmUgKyBoYW5kbGUgc3BlbGxpbmcgdmFyaWF0aW9ucylcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICBjb25zdCBtYXRjaGVkQ29tcGV0ZW5jaWVzID0gY29tcGV0ZW5jaWVzLmZpbHRlcihjID0+IHtcbiAgICAgIGlmICghYyB8fCAhYy5jb21wZXRlbmN5QXJlYU5hbWUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEludmFsaWQgY29tcGV0ZW5jeSBzdHJ1Y3R1cmUgaW4gY291cnNlICR7aW5kZXh9OmAsIGMpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBldGVuY3lBcmVhID0gYy5jb21wZXRlbmN5QXJlYU5hbWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgIC8vIEhhbmRsZSBib3RoIFwiYmVoYXZpb3JhbFwiIGFuZCBcImJlaGF2aW91cmFsXCIgc3BlbGxpbmdzXG4gICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09ICdiZWhhdmlvdXJhbCcgfHwgbm9ybWFsaXplZFR5cGUgPT09ICdiZWhhdmlvcmFsJykge1xuICAgICAgICByZXR1cm4gY29tcGV0ZW5jeUFyZWEgPT09ICdiZWhhdmlvcmFsJyB8fCBjb21wZXRlbmN5QXJlYSA9PT0gJ2JlaGF2aW91cmFsJztcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIG90aGVyIHR5cGVzLCBkbyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBjb21wZXRlbmN5QXJlYSA9PT0gbm9ybWFsaXplZFR5cGU7XG4gICAgfSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhgRm91bmQgJHttYXRjaGVkQ29tcGV0ZW5jaWVzLmxlbmd0aH0gY29tcGV0ZW5jaWVzIG9mIHR5cGUgJHt0eXBlfSBmb3IgY291cnNlICR7aW5kZXh9OmAsIG1hdGNoZWRDb21wZXRlbmNpZXMpO1xuICAgIHJldHVybiBtYXRjaGVkQ29tcGV0ZW5jaWVzO1xuICB9XG5cbiAgZ2V0Q29tcGV0ZW5jaWVzQnlCZWh2aW91cmFsVHlwZShpbmRleCk6IHN0cmluZyB7XG4gICAgY29uc3QgY291cnNlID0gdGhpcy5maWx0ZXJkQ291cnNlc1tpbmRleF07XG4gICAgaWYgKCFjb3Vyc2UpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgaWYgKGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llcztcbiAgICB9IGVsc2UgaWYgKGNvdXJzZS5jb21wZXRlbmNpZXNfdjYgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2KSkge1xuICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICB9XG5cbiAgICBpZiAoY29tcGV0ZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wZXRlbmNpZXNcbiAgICAgIC5maWx0ZXIoYyA9PiBjICYmIChjLmNvbXBldGVuY3lBcmVhTmFtZSA9PT0gJ0JlaGF2aW9yYWwnIHx8IGMuY29tcGV0ZW5jeUFyZWFOYW1lID09PSAnQmVoYXZpb3VyYWwnKSlcbiAgICAgIC5tYXAoYyA9PiBgJHtjLmNvbXBldGVuY3lUaGVtZU5hbWUgfHwgJyd9IC0gJHtjLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfHwgJyd9YClcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICBjb25zdCBjb21wZXRlbmNpZXMgPSB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCk7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuXG4gICAgaWYgKHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSkge1xuICAgICAgcmV0dXJuIGNvbXBldGVuY2llcztcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNsaWNlKDAsIDIpO1xuICB9XG5cbiAgdG9nZ2xlQ29tcGV0ZW5jaWVzKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGAke2luZGV4fS0ke3R5cGV9YDtcbiAgICB0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV0gPSAhdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldO1xuICB9XG5cbiAgaXNFeHBhbmRlZCh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSB8fCBmYWxzZTtcbiAgfVxuXG4gIGhhc01vcmVUaGFuVHdvKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoID4gMjtcbiAgfVxuXG4gIGdldFJlbWFpbmluZ0NvdW50KHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHRoaXMuZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGUsIGluZGV4KS5sZW5ndGg7XG4gICAgcmV0dXJuIHRvdGFsQ291bnQgLSAyO1xuICB9XG5cbiAgb25PdXRlclRhYkNoYW5nZShldmVudDogTWF0VGFiQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm91dGVyVGFiQWN0aXZlSW5kZXggPSBldmVudC5pbmRleFxuICAgIHRoaXMub3V0ZXJUYWJBY3RpdmVUZXh0ID0gZXZlbnQudGFiLnRleHRMYWJlbFxuICAgIGNvbnNvbGUubG9nKCdPdXRlciBUYWIgSW5kZXg6JywgZXZlbnQuaW5kZXgpO1xuICAgIGNvbnNvbGUubG9nKCdPdXRlciBUYWIgTGFiZWw6JywgZXZlbnQudGFiLnRleHRMYWJlbCk7XG4gICAgaWYgKGV2ZW50LmluZGV4ID09PSAxKSB7XG4gICAgICB0aGlzLmdhcEFuYWx5c2lzU3RhdHMoKVxuICAgIH1cbiAgICBpZiAoZXZlbnQuaW5kZXggPT09IDApIHtcbiAgICAgIC8vIHRoaXMuZ2V0Q291cnNlcygpXG4gICAgICAvLyB0aGlzLmdldFN1Z2dlc3RlZENvdXJzZSgpXG4gICAgICB0aGlzLmdldFVzZXJDb3Vyc2UoKVxuICAgIH1cbiAgfVxuXG4gIG9uSW5uZXJUYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID0gZXZlbnQuaW5kZXhcbiAgICB0aGlzLmlubmVyVGFiQWN0aXZlVGV4dCA9IGV2ZW50LnRhYi50ZXh0TGFiZWxcbiAgICB0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIgPSAnJzsgLy8gUmVzZXQgdGhlbWUgZmlsdGVyIHdoZW4gc3dpdGNoaW5nIHRhYnNcbiAgICBjb25zb2xlLmxvZygnSW5uZXIgVGFiIEluZGV4OicsIGV2ZW50LmluZGV4KTtcbiAgICBjb25zb2xlLmxvZygnSW5uZXIgVGFiIExhYmVsOicsIGV2ZW50LnRhYi50ZXh0TGFiZWwpO1xuICAgIGxldCB0YWJJbmRleCA9IGV2ZW50LmluZGV4XG4gICAgdGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSBbXVxuXG4gICAgLy8gR2V0IGFsbCBhdmFpbGFibGUgY291cnNlcyAob3JpZ2luYWwgKyBzdWdnZXN0ZWQgKyB1c2VyIGFkZGVkKVxuICAgIGNvbnN0IGFsbEF2YWlsYWJsZUNvdXJzZXMgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKTtcblxuXG5cbiAgICBzd2l0Y2ggKHRhYkluZGV4KSB7XG4gICAgICBjYXNlIDA6IC8vIEFsbFxuICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQXZhaWxhYmxlQ291cnNlcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6IC8vIEJlaGF2aW9yYWxcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeSh0aGlzLmJlaGF2aW9yYWxGaWx0ZXIoYWxsQXZhaWxhYmxlQ291cnNlcykpO1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IHRoaXMuYmVoYXZpb3JhbENvbXBldGVuY3lGaWx0ZXIodGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogLy8gRnVuY3Rpb25hbFxuICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gdGhpcy5zb3J0Q291cnNlc0J5UmVsZXZhbmN5KHRoaXMuZnVuY3Rpb25hbEZpbHRlcihhbGxBdmFpbGFibGVDb3Vyc2VzKSk7XG4gICAgICAgIHRoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5ID0gdGhpcy5mdW5jdGlvbmFsQ29tcGV0ZW5jeUZpbHRlcih0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOiAvLyBEb21haW5cbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeSh0aGlzLmRvbWFpbkZpbHRlcihhbGxBdmFpbGFibGVDb3Vyc2VzKSk7XG4gICAgICAgIHRoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5ID0gdGhpcy5kb21haW5Db21wZXRlbmN5RmlsdGVyKHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmZpbHRlcmRDb3Vyc2VzJywgdGhpcy5maWx0ZXJkQ291cnNlcylcbiAgICBjb25zb2xlLmxvZygndGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnknLCB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSlcbiAgfVxuXG4gIGdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKSB7XG4gICAgLy8gU3RhcnQgd2l0aCBvcmlnaW5hbCBkYXRhIChBSSByZWNvbW1lbmRlZCBjb3Vyc2VzKVxuICAgIGNvbnN0IGFsbENvdXJzZXMgPSBbLi4udGhpcy5vcmlnaW5hbERhdGFdO1xuICAgIGNvbnN0IHNlZW5JZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcblxuICAgIC8vIFRyYWNrIG9yaWdpbmFsIGNvdXJzZSBpZGVudGlmaWVyc1xuICAgIHRoaXMub3JpZ2luYWxEYXRhLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIGlmIChjb3Vyc2UuaWRlbnRpZmllcikgc2VlbklkZW50aWZpZXJzLmFkZChjb3Vyc2UuaWRlbnRpZmllcik7XG4gICAgICBpZiAoY291cnNlLmlkKSBzZWVuSWRlbnRpZmllcnMuYWRkKGNvdXJzZS5pZCk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgc3VnZ2VzdGVkIGNvdXJzZXMgKGlHT1QgcGxhdGZvcm0gY291cnNlcylcbiAgICB0aGlzLnN1Z2dlc3RlZENvdXJzZXMuZm9yRWFjaChjb3Vyc2UgPT4ge1xuICAgICAgY29uc3QgY291cnNlSWQgPSBjb3Vyc2UuaWRlbnRpZmllciB8fCBjb3Vyc2UuaWQ7XG4gICAgICBpZiAoY291cnNlSWQgJiYgIXNlZW5JZGVudGlmaWVycy5oYXMoY291cnNlSWQpKSB7XG4gICAgICAgIGFsbENvdXJzZXMucHVzaChjb3Vyc2UpO1xuICAgICAgICBzZWVuSWRlbnRpZmllcnMuYWRkKGNvdXJzZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFkZCB1c2VyLWFkZGVkIGNvdXJzZXNcbiAgICB0aGlzLnVzZXJBZGRlZENvdXJzZXMuZm9yRWFjaChjb3Vyc2UgPT4ge1xuICAgICAgY29uc3QgY291cnNlSWQgPSBjb3Vyc2UuaWRlbnRpZmllciB8fCBjb3Vyc2UuaWQ7XG4gICAgICBpZiAoY291cnNlSWQgJiYgIXNlZW5JZGVudGlmaWVycy5oYXMoY291cnNlSWQpKSB7XG4gICAgICAgIC8vIEVuc3VyZSB1c2VyLWFkZGVkIGNvdXJzZXMgaGF2ZSBwcm9wZXIgc3RydWN0dXJlXG4gICAgICAgIGlmICghY291cnNlLmNvdXJzZV90eXBlKSB7XG4gICAgICAgICAgY291cnNlLmNvdXJzZV90eXBlID0gJ1VzZXIgQWRkZWQnO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY291cnNlLmlkZW50aWZpZXIgJiYgY291cnNlLmlkKSB7XG4gICAgICAgICAgY291cnNlLmlkZW50aWZpZXIgPSBjb3Vyc2UuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgYWxsQ291cnNlcy5wdXNoKGNvdXJzZSk7XG4gICAgICAgIHNlZW5JZGVudGlmaWVycy5hZGQoY291cnNlSWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ2dldEFsbEF2YWlsYWJsZUNvdXJzZXMgYnJlYWtkb3duOicsIHtcbiAgICAgIG9yaWdpbmFsRGF0YTogdGhpcy5vcmlnaW5hbERhdGEubGVuZ3RoLFxuICAgICAgc3VnZ2VzdGVkQ291cnNlczogdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzLmxlbmd0aCxcbiAgICAgIHVzZXJBZGRlZENvdXJzZXM6IHRoaXMudXNlckFkZGVkQ291cnNlcy5sZW5ndGgsXG4gICAgICB0b3RhbEF2YWlsYWJsZTogYWxsQ291cnNlcy5sZW5ndGhcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdhbGxDb3Vyc2VzLS0nLCBhbGxDb3Vyc2VzKVxuICAgIGFsbENvdXJzZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5vcmdhbmlzYXRpb24gJiYgaXRlbS5vcmdhbmlzYXRpb24ubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkUHJvdmlkZXJzLmluZGV4T2YoaXRlbS5vcmdhbmlzYXRpb25bMF0pIDwgMCkge1xuICAgICAgICAgIHRoaXMuZmlsdGVyZWRQcm92aWRlcnMucHVzaChpdGVtLm9yZ2FuaXNhdGlvblswXSlcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCBzb3J0ZWRDb3Vyc2VzID0gdGhpcy5zb3J0Q291cnNlc0J5Q2F0ZWdvcnlBbmRSZWxldmFuY3koYWxsQ291cnNlcylcbiAgICB0aGlzLmZ1bGxDb3Vyc2VMaXN0ID0gc29ydGVkQ291cnNlc1xuICAgIGxldCBpZGVudGlmaWVyc0FyciA9IFtdXG4gICAgc29ydGVkQ291cnNlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlkZW50aWZpZXJzQXJyLnB1c2goaXRlbT8uaWRlbnRpZmllcilcbiAgICB9KVxuICBjb25zdCBpZGVudGlmaWVyc0tleSA9IFsuLi5pZGVudGlmaWVyc0Fycl0uc29ydCgpLmpvaW4oJywnKVxuICAgIC8vIFJlLWZldGNoIHdoZW5ldmVyIHRoZSBpZGVudGlmaWVyIHNldCBjaGFuZ2VzLCBvciB3aGVuIGFueSBjb3Vyc2Ugb2JqZWN0IGlzIG1pc3NpbmdcbiAgICAvLyB0aGUgZW5yaWNoZWQgZmllbGRzIChlZy4gYWZ0ZXIgZ2V0VXNlckNvdXJzZS9nZXRTdWdnZXN0ZWRDb3Vyc2UgcmVwbGFjZSBpdGVtcyB3aXRoXG4gICAgLy8gZnJlc2ggb2JqZWN0cyBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBoYXZlbid0IGJlZW4gZW5yaWNoZWQgeWV0LCBldmVuIGlmIHRoZSBpZGVudGlmaWVyc1xuICAgIC8vIGFyZSB1bmNoYW5nZWQgZnJvbSB0aGUgbGFzdCBlbnJpY2htZW50IGNhbGwpLlxuICAgIGNvbnN0IG5lZWRzRW5yaWNobWVudCA9IHNvcnRlZENvdXJzZXMuc29tZSgoaXRlbSkgPT4gaXRlbT8uaWRlbnRpZmllciAmJiBpdGVtLmNvdXJzZSA9PT0gdW5kZWZpbmVkKVxuICAgIGlmIChpZGVudGlmaWVyc0Fyci5sZW5ndGggJiYgKGlkZW50aWZpZXJzS2V5ICE9PSB0aGlzLmxhc3RFbnJpY2hlZElkZW50aWZpZXJzS2V5IHx8IG5lZWRzRW5yaWNobWVudCkpIHtcbiAgICAgIHRoaXMubGFzdEVucmljaGVkSWRlbnRpZmllcnNLZXkgPSBpZGVudGlmaWVyc0tleVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRBZGRpdGlvbmFsUGFyYW1ldGVyZm9yU3VnZ2VzdGVkQ291cnNlcyhpZGVudGlmaWVyc0Fycikuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdCAmJiByZXNwb25zZS5yZXN1bHQuY29udGVudCAmJiByZXNwb25zZS5yZXN1bHQuY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZS5yZXN1bHQuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5mdWxsQ291cnNlTGlzdC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZnVsbENvdXJzZUxpc3Rbal1bJ2lkZW50aWZpZXInXSA9PT0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ2lkZW50aWZpZXInXSkge1xuICAgICAgICAgICAgICB0aGlzLmZ1bGxDb3Vyc2VMaXN0W2pdWydsYW5ndWFnZSddID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ2xhbmd1YWdlJ11cbiAgICAgICAgICAgICAgdGhpcy5mdWxsQ291cnNlTGlzdFtqXVsnYXZnUmF0aW5nJ10gPSByZXNwb25zZS5yZXN1bHQuY29udGVudFtpXVsnYXZnUmF0aW5nJ11cbiAgICAgICAgICAgICAgdGhpcy5mdWxsQ291cnNlTGlzdFtqXVsnY291cnNlJ10gPSByZXNwb25zZS5yZXN1bHQuY29udGVudFtpXVsnbmFtZSddXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gc29ydGVkQ291cnNlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgYXJyYXkgd2l0aCBhbGwgYXZhaWxhYmxlIGNvdXJzZSB0eXBlc1xuICAgKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYWNyb3NzIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgcmVidWlsZEZpbHRlcmVkQ291cnNlcygpIHtcbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gdGhpcy5zb3J0Q291cnNlc0J5Q2F0ZWdvcnlBbmRSZWxldmFuY3kodGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCkpO1xuXG4gICAgY29uc29sZS5sb2coJ1JlYnVpbHQgZmlsdGVyZENvdXJzZXMgd2l0aCBhbGwgY291cnNlIHR5cGVzOicsIHtcbiAgICAgIHRvdGFsOiB0aGlzLmZpbHRlcmRDb3Vyc2VzLmxlbmd0aCxcbiAgICAgIGJyZWFrZG93bjoge1xuICAgICAgICBvcmlnaW5hbDogdGhpcy5vcmlnaW5hbERhdGEubGVuZ3RoLFxuICAgICAgICBzdWdnZXN0ZWQ6IHRoaXMuc3VnZ2VzdGVkQ291cnNlcy5sZW5ndGgsXG4gICAgICAgIHVzZXJBZGRlZDogdGhpcy51c2VyQWRkZWRDb3Vyc2VzLmxlbmd0aFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc29ydENvdXJzZXNCeVJlbGV2YW5jeShjb3Vyc2VzOiBhbnlbXSA9IFtdKTogYW55W10ge1xuICAgIHJldHVybiBbLi4uY291cnNlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYVNjb3JlID0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYT8ucmVsZXZhbmN5KVxuICAgICAgY29uc3QgYlNjb3JlID0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYj8ucmVsZXZhbmN5KVxuICAgICAgcmV0dXJuIGJTY29yZSAtIGFTY29yZVxuICAgIH0pXG4gIH1cblxuICBzb3J0Q291cnNlc0J5Q2F0ZWdvcnlBbmRSZWxldmFuY3koY291cnNlczogYW55W10gPSBbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gWy4uLmNvdXJzZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5UHJpb3JpdHkgPSB7IGRvbWFpbjogMSwgZnVuY3Rpb25hbDogMiwgYmVoYXZpb3JhbDogMywgb3RoZXI6IDQgfTtcbiAgICAgIGNvbnN0IGFQcmlvcml0eSA9IGNhdGVnb3J5UHJpb3JpdHlbdGhpcy5nZXRDb3Vyc2VDYXRlZ29yeShhKV0gfHwgNDtcbiAgICAgIGNvbnN0IGJQcmlvcml0eSA9IGNhdGVnb3J5UHJpb3JpdHlbdGhpcy5nZXRDb3Vyc2VDYXRlZ29yeShiKV0gfHwgNDtcblxuICAgICAgaWYgKGFQcmlvcml0eSAhPT0gYlByaW9yaXR5KSB7XG4gICAgICAgIHJldHVybiBhUHJpb3JpdHkgLSBiUHJpb3JpdHk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVJlbGV2YW5jeShiPy5yZWxldmFuY3kpIC0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYT8ucmVsZXZhbmN5KTtcbiAgICB9KVxuICB9XG5cbiAgZ2V0Q291cnNlQ2F0ZWdvcnkoY291cnNlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IFtcbiAgICAgIC4uLihjb3Vyc2U/LmNvbXBldGVuY2llcyB8fCBbXSksXG4gICAgICAuLi4oY291cnNlPy5jb21wZXRlbmNpZXNfdjYgfHwgW10pXG4gICAgXTtcblxuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgU2V0KFxuICAgICAgY29tcGV0ZW5jaWVzXG4gICAgICAgIC5tYXAoKGM6IGFueSkgPT4gdGhpcy5ub3JtYWxpemVDb21wZXRlbmN5KGM/LmNvbXBldGVuY3lBcmVhTmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGM6IHN0cmluZykgPT4gYylcbiAgICApO1xuXG4gICAgaWYgKGNhdGVnb3JpZXMuaGFzKCdkb21haW4nKSkgcmV0dXJuICdkb21haW4nO1xuICAgIGlmIChjYXRlZ29yaWVzLmhhcygnZnVuY3Rpb25hbCcpKSByZXR1cm4gJ2Z1bmN0aW9uYWwnO1xuICAgIGlmIChjYXRlZ29yaWVzLmhhcygnYmVoYXZpb3JhbCcpKSByZXR1cm4gJ2JlaGF2aW9yYWwnO1xuXG4gICAgcmV0dXJuICdvdGhlcic7XG4gIH1cblxuICBub3JtYWxpemVSZWxldmFuY3kodmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZS50cmltKCkpXG4gICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiAtSW5maW5pdHlcbiAgICB9XG5cbiAgICByZXR1cm4gLUluZmluaXR5XG4gIH1cblxuICBiZWhhdmlvcmFsRmlsdGVyKGRhdGE6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBkYXRhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICAgIGlmIChpdGVtLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGl0ZW0uY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBpdGVtLmNvbXBldGVuY2llcztcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5jb21wZXRlbmNpZXNfdjYgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXMuc29tZShjID0+IGMgJiYgKChjPy5jb21wZXRlbmN5QXJlYU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdiZWhhdmlvcmFsJykgfHwgYz8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAnYmVoYXZpb3VyYWwnKSk7XG4gICAgfSk7XG4gIH1cblxuICBiZWhhdmlvcmFsQ29tcGV0ZW5jeUZpbHRlcihkYXRhOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICBjb25zdCBiZWhhdmlvcmFsVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydiZWhhdmlvcmFsJywgJ2JlaGF2aW91cmFsJ10uaW5jbHVkZXMoaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG4gICAgICApXG4gICAgICAubWFwKGl0ZW0gPT4gdGhpcy5mb3JtYXRUaGVtZVdpdGhTdWJUaGVtZShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKSlcbiAgICAgIC5maWx0ZXIoKHRoZW1lKTogdGhlbWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhlbWUpKTsgLy8gRW5zdXJlcyB0eXBlIHNhZmV0eVxuXG4gICAgY29uc3QgdW5pcXVlQmVoYXZpb3JhbFRoZW1lcyA9IEFycmF5LmZyb20obmV3IFNldChiZWhhdmlvcmFsVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVCZWhhdmlvcmFsVGhlbWVzKTtcbiAgICByZXR1cm4gdW5pcXVlQmVoYXZpb3JhbFRoZW1lcztcbiAgfVxuXG4gIGZ1bmN0aW9uYWxDb21wZXRlbmN5RmlsdGVyKGRhdGE6IGFueVtdKTogYW55IHtcbiAgICBjb25zdCBmdW5jdGlvbmFsVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydmdW5jdGlvbmFsJ10uaW5jbHVkZXMoaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG4gICAgICApXG4gICAgICAubWFwKGl0ZW0gPT4gdGhpcy5mb3JtYXRUaGVtZVdpdGhTdWJUaGVtZShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKSlcbiAgICAgIC5maWx0ZXIoKHRoZW1lKTogdGhlbWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhlbWUpKTsgLy8gRW5zdXJlcyB0eXBlIHNhZmV0eVxuXG4gICAgY29uc3QgdW5pcXVlRnVuY3Rpb25hbFRoZW1lcyA9IEFycmF5LmZyb20obmV3IFNldChmdW5jdGlvbmFsVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVGdW5jdGlvbmFsVGhlbWVzKTtcbiAgICByZXR1cm4gdW5pcXVlRnVuY3Rpb25hbFRoZW1lcztcblxuICAgIC8vIGNvbnNvbGUubG9nKHVuaXF1ZUNvbXBldGVuY3lBcmVhTmFtZXMpO1xuICB9XG5cbiAgZG9tYWluQ29tcGV0ZW5jeUZpbHRlcihkYXRhOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgZG9tYWluVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydkb21haW4nXS5pbmNsdWRlcyhpdGVtLnR5cGUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLmZvcm1hdFRoZW1lV2l0aFN1YlRoZW1lKGl0ZW0/LnRoZW1lLCBpdGVtPy5zdWJfdGhlbWUpKVxuICAgICAgLmZpbHRlcigodGhlbWUpOiB0aGVtZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih0aGVtZSkpOyAvLyBFbnN1cmVzIHR5cGUgc2FmZXR5XG5cbiAgICBjb25zdCB1bmlxdWVEb21haW5UaGVtZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoZG9tYWluVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVEb21haW5UaGVtZXMpO1xuICAgIHJldHVybiB1bmlxdWVEb21haW5UaGVtZXM7XG5cbiAgICAvLyBjb25zb2xlLmxvZyh1bmlxdWVDb21wZXRlbmN5QXJlYU5hbWVzKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb25hbEZpbHRlcihkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoaXRlbS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoYyA9PiBjICYmIGM/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2Z1bmN0aW9uYWwnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRvbWFpbkZpbHRlcihkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoaXRlbS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoYyA9PiBjICYmIGM/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2RvbWFpbicpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2FwQW5hbHlzaXNTdGF0cygpIHtcbiAgICBjb25zb2xlLmxvZygndGhpcy5wbGFuRGF0YScsIHRoaXMucGxhbkRhdGEpXG5cbiAgICAvLyBBbHdheXMgdXNlIEFMTCBjb21wZXRlbmNpZXMgZm9yIGNhbGN1bGF0aW5nIG92ZXJhbGwgc3RhdHNcbiAgICBjb25zdCBhbGxDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcztcblxuICAgIC8vIEZpbHRlciBmb3IgY2F0ZWdvcnktc3BlY2lmaWMgY2FsY3VsYXRpb25zXG4gICAgbGV0IGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXM6IGFueSA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlPy50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCcpIHtcbiAgICAgIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbicpIHtcbiAgICAgIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSk7XG4gICAgfVxuXG4gICAgLy8gQ291bnQgQUxMIGNvbXBldGVuY2llcyBieSBjYXRlZ29yeSAobm90IGp1c3QgZmlsdGVyZWQgb25lcylcbiAgICBjb25zdCBtYXN0ZXJMaXN0QnlDYXRlZ29yeSA9IHsgdG90YWw6IGFsbENvbXBldGVuY2llcy5sZW5ndGgsIGJlaGF2aW91cmFsOiAwLCBmdW5jdGlvbmFsOiAwLCBkb21haW46IDAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBVc2UgYWxsIGF2YWlsYWJsZSBjb3Vyc2VzIGZvciBjb25zaXN0ZW50IGNvdmVyYWdlIGNhbGN1bGF0aW9uXG4gICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggd2hhdCdzIGF2YWlsYWJsZSBpbiB0aGUgRmlsdGVyIEJ5IENvbXBldGVuY3kgc2VjdGlvblxuICAgIGNvbnN0IGFsbENvdXJzZUNvbXBldGVuY2llcyA9IFtdXG4gICAgY29uc3QgYWxsQXZhaWxhYmxlQ291cnNlc0ZvclN0YXRzID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG5cbiAgICBhbGxBdmFpbGFibGVDb3Vyc2VzRm9yU3RhdHMuZm9yRWFjaChjb3Vyc2UgPT4ge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoY291cnNlICYmIGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChjb3Vyc2UgJiYgY291cnNlLmNvbXBldGVuY2llc192NiAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIGNvbXBldGVuY2llcy5mb3JFYWNoKChsaXN0OiBhbnkpID0+IHtcbiAgICAgICAgYWxsQ291cnNlQ29tcGV0ZW5jaWVzLnB1c2gobGlzdClcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ2FsbENvbXBldGVuY2llcycsIGFsbENvbXBldGVuY2llcylcbiAgICBjb25zb2xlLmxvZygnY2F0ZWdvcnlTcGVjaWZpY0NvbXBldGVuY2llcycsIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMpXG4gICAgY29uc29sZS5sb2coJ2FsbENvdXJzZUNvbXBldGVuY2llcycsIGFsbENvdXJzZUNvbXBldGVuY2llcylcblxuICAgIC8vIENvdW50IGFsbCBjb21wZXRlbmNpZXMgYnkgdHlwZSBmb3IgcHJvcGVyIHRvdGFsc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wZXRlbmN5VHlwZSA9IGFsbENvbXBldGVuY2llc1tpXVsndHlwZSddPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc29sZS5sb2coYENvbXBldGVuY3kgJHtpfTogdHlwZT1cIiR7Y29tcGV0ZW5jeVR5cGV9XCIsIGRhdGE6YCwgYWxsQ29tcGV0ZW5jaWVzW2ldKTtcbiAgICAgIGlmIChjb21wZXRlbmN5VHlwZSA9PT0gJ2JlaGF2aW91cmFsJyB8fCBjb21wZXRlbmN5VHlwZSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICAgIG1hc3Rlckxpc3RCeUNhdGVnb3J5WydiZWhhdmlvdXJhbCddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2JlaGF2aW91cmFsJ10gKyAxXG4gICAgICB9XG4gICAgICBpZiAoY29tcGV0ZW5jeVR5cGUgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgICBtYXN0ZXJMaXN0QnlDYXRlZ29yeVsnZnVuY3Rpb25hbCddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2Z1bmN0aW9uYWwnXSArIDFcbiAgICAgIH1cbiAgICAgIGlmIChjb21wZXRlbmN5VHlwZSA9PT0gJ2RvbWFpbicpIHtcbiAgICAgICAgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2RvbWFpbiddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2RvbWFpbiddICsgMVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnbWFzdGVyTGlzdEJ5Q2F0ZWdvcnkgYWZ0ZXIgY291bnRpbmc6JywgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnkpXG5cbiAgICAvLyBHZXQgbWF0Y2hpbmcgcmVzdWx0cyBmb3IgQUxMIGNvbXBldGVuY2llcyAoZm9yIG92ZXJhbGwgY292ZXJhZ2UpXG4gICAgY29uc3Qgb3ZlcmFsbFJlc3VsdCA9IHRoaXMuZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyhhbGxDb21wZXRlbmNpZXMsIGFsbENvdXJzZUNvbXBldGVuY2llcyk7XG5cbiAgICAvLyBHZXQgbWF0Y2hpbmcgcmVzdWx0cyBmb3IgY2F0ZWdvcnktc3BlY2lmaWMgY29tcGV0ZW5jaWVzIChmb3IgZmlsdGVyZWQgdmlldylcbiAgICBjb25zdCBjYXRlZ29yeVJlc3VsdCA9IHRoaXMuZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyhjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzLCBhbGxDb3Vyc2VDb21wZXRlbmNpZXMpO1xuXG4gICAgLy8gU2V0IGNvbXBldGVuY3lDb3ZlcmVkQ291bnQgYmFzZWQgb24gc2VsZWN0ZWQgY2F0ZWdvcnkgKGZvciB0aGUgZmlsdGVyZWQgbnVtYmVycylcbiAgICBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gb3ZlcmFsbFJlc3VsdFsndG90YWwnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICB0aGlzLmNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBjYXRlZ29yeVJlc3VsdFsnYmVoYXZpb3JhbCddIHx8IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gY2F0ZWdvcnlSZXN1bHRbJ2Z1bmN0aW9uYWwnXSB8fCAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gY2F0ZWdvcnlSZXN1bHRbJ2RvbWFpbiddIHx8IDA7XG4gICAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBPdmVyYWxsIENvdmVyYWdlIHNob3VsZCBBTFdBWVMgYmUgYmFzZWQgb24gQUxMIGNvbXBldGVuY2llcywgbm90IGZpbHRlcmVkXG4gICAgbGV0IHRvdGFsQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMubGVuZ3RoOyAvLyBBbHdheXMgdXNlIHRvdGFsIGNvdW50XG4gICAgbGV0IG92ZXJhbGxDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0Wyd0b3RhbCddOyAvLyBBbHdheXMgdXNlIG92ZXJhbGwgcmVzdWx0c1xuICAgIGxldCBtYXRoUm91bmQgPSBNYXRoLnJvdW5kKChvdmVyYWxsQ292ZXJlZENvdW50IC8gdG90YWxDb21wZXRlbmNpZXMpICogMTAwKVxuICAgIHRoaXMub3ZlcmFsbENvdmVyYWdlID0gYCR7bWF0aFJvdW5kfSVgXG5cbiAgICBjb25zb2xlLmxvZygnT3ZlcmFsbCBDb3ZlcmFnZSBDYWxjdWxhdGlvbjonLCB7XG4gICAgICB0b3RhbENvbXBldGVuY2llczogdG90YWxDb21wZXRlbmNpZXMsXG4gICAgICBvdmVyYWxsQ292ZXJlZENvdW50OiBvdmVyYWxsQ292ZXJlZENvdW50LFxuICAgICAgb3ZlcmFsbENvdmVyYWdlOiB0aGlzLm92ZXJhbGxDb3ZlcmFnZSxcbiAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSxcbiAgICAgIGNvbXBldGVuY3lDb3ZlcmVkQ291bnQ6IHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudFxuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGNhbGN1bGF0ZSBhbGwgY2F0ZWdvcnktc3BlY2lmaWMgbWV0cmljcyByZWdhcmRsZXNzIG9mIHNlbGVjdGVkIGNhdGVnb3J5XG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGNhdGVnb3JpZXNcbiAgICAvLyBVc2Ugb3ZlcmFsbFJlc3VsdCBmb3IgY29uc2lzdGVudCBjYWxjdWxhdGlvbnMgYWNyb3NzIGFsbCBjYXRlZ29yaWVzXG4gICAgdGhpcy5iZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IG92ZXJhbGxSZXN1bHRbJ2JlaGF2aW9yYWwnXSB8fCAwO1xuICAgIHRoaXMuYmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2JlaGF2aW91cmFsJ107XG4gICAgbGV0IGJlaGF2aW9yYWxNYXRoUm91bmQgPSB0aGlzLmJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcyA+IDAgPyBNYXRoLnJvdW5kKCh0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50IC8gdGhpcy5iZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwKSA6IDA7XG4gICAgdGhpcy5iZWhhdmlvcmFsQ292ZXJhZ2UgPSBgJHtiZWhhdmlvcmFsTWF0aFJvdW5kfSVgO1xuXG4gICAgdGhpcy5mdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IG92ZXJhbGxSZXN1bHRbJ2Z1bmN0aW9uYWwnXSB8fCAwO1xuICAgIHRoaXMuZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2Z1bmN0aW9uYWwnXTtcbiAgICBsZXQgZnVuY3Rpb25hbE1hdGhSb3VuZCA9IHRoaXMuZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzID4gMCA/IE1hdGgucm91bmQoKHRoaXMuZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyB0aGlzLmZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcykgKiAxMDApIDogMDtcbiAgICB0aGlzLmZ1bmN0aW9uYWxDb3ZlcmFnZSA9IGAke2Z1bmN0aW9uYWxNYXRoUm91bmR9JWA7XG5cbiAgICB0aGlzLmRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0Wydkb21haW4nXSB8fCAwO1xuICAgIHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMgPSBtYXN0ZXJMaXN0QnlDYXRlZ29yeVsnZG9tYWluJ107XG4gICAgbGV0IGRvbWFpbk1hdGhSb3VuZCA9IHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMgPiAwID8gTWF0aC5yb3VuZCgodGhpcy5kb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50IC8gdGhpcy5kb21haW5Ub3RhbENvbXBldGVuY2llcykgKiAxMDApIDogMDtcbiAgICB0aGlzLmRvbWFpbkNvdmVyYWdlID0gYCR7ZG9tYWluTWF0aFJvdW5kfSVgO1xuXG4gICAgY29uc29sZS5sb2coJ0FsbCBjYXRlZ29yeSBtZXRyaWNzIGNhbGN1bGF0ZWQ6Jywge1xuICAgICAgYmVoYXZpb3JhbDogeyBjb3ZlcmVkOiB0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50LCB0b3RhbDogdGhpcy5iZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmJlaGF2aW9yYWxDb3ZlcmFnZSB9LFxuICAgICAgZnVuY3Rpb25hbDogeyBjb3ZlcmVkOiB0aGlzLmZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50LCB0b3RhbDogdGhpcy5mdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmZ1bmN0aW9uYWxDb3ZlcmFnZSB9LFxuICAgICAgZG9tYWluOiB7IGNvdmVyZWQ6IHRoaXMuZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCwgdG90YWw6IHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmRvbWFpbkNvdmVyYWdlIH0sXG4gICAgICBvdmVyYWxsOiB7IGNvdmVyZWQ6IG92ZXJhbGxDb3ZlcmVkQ291bnQsIHRvdGFsOiB0b3RhbENvbXBldGVuY2llcywgY292ZXJhZ2U6IHRoaXMub3ZlcmFsbENvdmVyYWdlIH0sXG4gICAgICBzZWxlY3RlZENhdGVnb3J5OiB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnksXG4gICAgICBjb21wZXRlbmN5Q292ZXJlZENvdW50Rm9yQ2F0ZWdvcnk6IHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCdPdmVyYWxsIFJlc3VsdDonLCBvdmVyYWxsUmVzdWx0KTtcbiAgICBjb25zb2xlLmxvZygnQ2F0ZWdvcnkgUmVzdWx0OicsIGNhdGVnb3J5UmVzdWx0KTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnknLCB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeSlcbiAgICB0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZCA9IHRoaXMuZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZygnYmVoYXZpb3JhbCcpXG4gICAgdGhpcy5mdW5jdGlvbmFsTm90TWF0Y2hlZCA9IHRoaXMuZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZygnZnVuY3Rpb25hbCcpXG4gICAgdGhpcy5kb21haW5Ob3RNYXRjaGVkID0gdGhpcy5nZXRDb21wZXRlbmN5QnlDYXRlZ29yeU5vdE1hdGNoaW5nKCdkb21haW4nKVxuXG4gICAgdGhpcy5nZXRCZWhhdmlvdXJhbE1hdGNoZWQoKVxuICAgIHRoaXMuZ2V0RnVuY3Rpb25hbE1hdGNoZWQoKVxuICAgIHRoaXMuZ2V0RG9tYWluTWF0Y2hlZCgpXG4gIH1cblxuICBnZXRNYXRjaGVkQ29tcGV0ZW5jeVN0YXRzKHByaW1hcnlBcnJheTogYW55W10sIHNlY29uZGFyeUFycmF5OiBhbnlbXSkge1xuICAgIC8vIENvbnZlcnQgYm90aCBhcnJheXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgY2FzaW5nXG4gICAgY29uc3QgY291bnRzOiBhbnkgPSB7XG4gICAgICBiZWhhdmlvcmFsOiAwLFxuICAgICAgZnVuY3Rpb25hbDogMCxcbiAgICAgIGRvbWFpbjogMCxcbiAgICAgIHRvdGFsOiAwXG4gICAgfTtcblxuICAgIC8vIENsZWFyIHRoZSBjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkgYXJyYXkgZm9yIGZyZXNoIGNhbGN1bGF0aW9uXG4gICAgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSBbXTtcblxuICAgIC8vIFNldCB0byBrZWVwIHRyYWNrIG9mIHVuaXF1ZSBtYXRjaGVzXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG1hdGNoZWRDb21wZXRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgcHJpbWFyeSBvZiBwcmltYXJ5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHR5cGVLZXkgPSBwcmltYXJ5LnR5cGU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgY29uc3QgdGhlbWVLZXkgPSBwcmltYXJ5LnRoZW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHN1YlRoZW1lS2V5ID0gcHJpbWFyeS5zdWJfdGhlbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICBsZXQgaXNNYXRjaGVkID0gZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5IG9mIHNlY29uZGFyeUFycmF5KSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBzZWNvbmRhcnkga2V5c1xuICAgICAgICBsZXQgc2VjVHlwZSA9IHNlY29uZGFyeT8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgbGV0IHNlY1RoZW1lID0gc2Vjb25kYXJ5Py5jb21wZXRlbmN5VGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgbGV0IHNlY1N1YlRoZW1lID0gc2Vjb25kYXJ5Py5jb21wZXRlbmN5U3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICAvLyBGaXggZm9yIGRhdGEgaW5jb25zaXN0ZW5jeVxuICAgICAgICBpZiAoc2VjVHlwZSA9PT0gJ2JlaGF2aW91cmFsJykgc2VjVHlwZSA9ICdiZWhhdmlvcmFsJztcblxuICAgICAgICAvLyBDcmVhdGUgdW5pcXVlIG1hdGNoIGtleSBmb3IgcHJpbWFyeSBjb21wZXRlbmN5XG4gICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gYCR7dHlwZUtleX18JHt0aGVtZUtleX18JHtzdWJUaGVtZUtleX1gO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNyb3NzLW1hdGNoaW5nIGxvZ2ljIGFzIHJlcXVlc3RlZDpcbiAgICAgICAgLy8gMS4gUm9sZSBtYXBwaW5nIFRoZW1lIHZzIENvdXJzZSBUaGVtZVxuICAgICAgICAvLyAyLiBSb2xlIG1hcHBpbmcgU3ViIFRoZW1lIHZzIENvdXJzZSBTdWIgVGhlbWUgIFxuICAgICAgICAvLyAzLiBSb2xlIG1hcHBpbmcgVGhlbWUgdnMgQ291cnNlIFN1YiBUaGVtZVxuICAgICAgICAvLyA0LiBSb2xlIG1hcHBpbmcgU3ViIFRoZW1lIHZzIENvdXJzZSBUaGVtZVxuICAgICAgICBjb25zdCB0aGVtZVRvVGhlbWVNYXRjaCA9IHRoZW1lS2V5ID09PSBzZWNUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2ggPSBzdWJUaGVtZUtleSA9PT0gc2VjU3ViVGhlbWU7XG4gICAgICAgIGNvbnN0IHRoZW1lVG9TdWJUaGVtZU1hdGNoID0gdGhlbWVLZXkgPT09IHNlY1N1YlRoZW1lO1xuICAgICAgICBjb25zdCBzdWJUaGVtZVRvVGhlbWVNYXRjaCA9IHN1YlRoZW1lS2V5ID09PSBzZWNUaGVtZTtcblxuICAgICAgICBsZXQgbWF0Y2hUeXBlID0gJyc7XG4gICAgICAgIGxldCBpc01hdGNoID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHR5cGVLZXkgPT09IHNlY1R5cGUgJiYgIXNlZW4uaGFzKG1hdGNoS2V5KSkge1xuICAgICAgICAgIGlmICh0aGVtZVRvVGhlbWVNYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2hUeXBlID0gJ1RoZW1lLXRvLVRoZW1lJztcbiAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIG1hdGNoVHlwZSA9ICdTdWJUaGVtZS10by1TdWJUaGVtZSc7XG4gICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW1lVG9TdWJUaGVtZU1hdGNoKSB7XG4gICAgICAgICAgICBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgICAgaXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdWJUaGVtZVRvVGhlbWVNYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2hUeXBlID0gJ1N1YlRoZW1lLXRvLVRoZW1lJztcbiAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYOKchSBNQVRDSCBGT1VORCBbJHttYXRjaFR5cGV9XTpgLCB7XG4gICAgICAgICAgICByb2xlTWFwcGluZzogeyB0eXBlOiB0eXBlS2V5LCB0aGVtZTogdGhlbWVLZXksIHN1YlRoZW1lOiBzdWJUaGVtZUtleSB9LFxuICAgICAgICAgICAgY291cnNlOiB7IHR5cGU6IHNlY1R5cGUsIHRoZW1lOiBzZWNUaGVtZSwgc3ViVGhlbWU6IHNlY1N1YlRoZW1lIH0sXG4gICAgICAgICAgICBtYXRjaFR5cGU6IG1hdGNoVHlwZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gU3RvcmUgbWF0Y2hlZCBjb21wZXRlbmN5IGluZm8gZm9yIGxhdGVyIHVzZVxuICAgICAgICAgIGxldCBvYmogPSB7fTtcbiAgICAgICAgICBvYmpbdHlwZUtleV0gPSBbdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KHRoZW1lS2V5LCBzdWJUaGVtZUtleSldO1xuICAgICAgICAgIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5LnB1c2gob2JqKTtcbiAgICAgICAgICBzZWVuLmFkZChtYXRjaEtleSk7XG4gICAgICAgICAgbWF0Y2hlZENvbXBldGVuY2llcy5hZGQodGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KHRoZW1lS2V5LCBzdWJUaGVtZUtleSkpO1xuICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoY291bnRzLmhhc093blByb3BlcnR5KHR5cGVLZXkpKSB7XG4gICAgICAgICAgICBjb3VudHNbdHlwZUtleV0rKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY291bnRzW3R5cGVLZXldID0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb3VudHMudG90YWwrKztcbiAgICAgICAgICBicmVhazsgLy8gU3RvcCBsb29raW5nIGZvciBtYXRjaGVzIGZvciB0aGlzIHByaW1hcnkgY29tcGV0ZW5jeVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50cztcbiAgfVxuICBnZXRDb21wZXRlbmN5QnlDYXRlZ29yeU5vdE1hdGNoaW5nKGNhdGVnb3J5VHlwZSkge1xuICAgIC8vIEdldCBhbGwgY29tcGV0ZW5jaWVzIGZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkgZnJvbSByb2xlIG1hcHBpbmdcbiAgICBsZXQgYWxsQ2F0ZWdvcnlDb21wZXRlbmNpZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNbaV1bJ3R5cGUnXT8udG9Mb3dlckNhc2UoKSA9PT0gY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGFsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLnB1c2goXG4gICAgICAgICAgdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KFxuICAgICAgICAgICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNbaV1bJ3RoZW1lJ10sXG4gICAgICAgICAgICB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llc1tpXVsnc3ViX3RoZW1lJ11cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IG1hdGNoZWQgY29tcGV0ZW5jaWVzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gY291cnNlc1xuICAgIGxldCBtYXRjaGVkQ29tcGV0ZW5jaWVzID0gW107XG4gICAgY29uc29sZS5sb2coJ2NvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeScsIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeVtpXVtjYXRlZ29yeVR5cGU/LnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV0nLCB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeVtpXSlcbiAgICAgICAgLy8gRXh0cmFjdCBtYXRjaGVkIHRoZW1lcyBmcm9tIGNvdXJzZSBjb21wZXRlbmNpZXNcbiAgICAgICAgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV1bY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpXS5mb3JFYWNoKHRoZW1lID0+IHtcbiAgICAgICAgICBpZiAodGhlbWUpIHtcbiAgICAgICAgICAgIG1hdGNoZWRDb21wZXRlbmNpZXMucHVzaCh0aGVtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbmhhbmNlZCBtYXRjaGluZzogY2hlY2sgYm90aCB0aGVtZSBhbmQgc3VidGhlbWUgZnJvbSBjb3Vyc2VzIGFnYWluc3QgRlJBQyBjb21wZXRlbmNpZXNcbiAgICAvLyBJTVBPUlRBTlQ6IFVzZSBhbGwgYXZhaWxhYmxlIGNvdXJzZXMgZm9yIGNvbnNpc3RlbnQgY292ZXJhZ2UgY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbGxDb3Vyc2VzRm9yTWF0Y2hpbmcgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKTtcblxuICAgIGFsbENvdXJzZXNGb3JNYXRjaGluZy5mb3JFYWNoKGNvdXJzZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICAgIGlmIChjb3Vyc2UgJiYgY291cnNlLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGNvdXJzZSAmJiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgY29tcGV0ZW5jaWVzLmZvckVhY2goKGNvbXA6IGFueSkgPT4ge1xuICAgICAgICBsZXQgc2VjVHlwZSA9IGNvbXA/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGlmIChzZWNUeXBlID09PSAnYmVoYXZpb3VyYWwnKSBzZWNUeXBlID0gJ2JlaGF2aW9yYWwnO1xuXG4gICAgICAgIGlmIChzZWNUeXBlID09PSBjYXRlZ29yeVR5cGU/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjb25zdCBjb3Vyc2VUaGVtZSA9IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgY291cnNlU3ViVGhlbWUgPSBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYW55IEZSQUMgY29tcGV0ZW5jeSBtYXRjaGVzIHRoaXMgY291cnNlIGNvbXBldGVuY3lcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmcmFjQ29tcCA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzW2ldO1xuICAgICAgICAgICAgaWYgKGZyYWNDb21wWyd0eXBlJ10/LnRvTG93ZXJDYXNlKCkgPT09IGNhdGVnb3J5VHlwZT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICBjb25zdCBmcmFjVGhlbWUgPSBmcmFjQ29tcFsndGhlbWUnXT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGZyYWNTdWJUaGVtZSA9IGZyYWNDb21wWydzdWJfdGhlbWUnXT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgLy8gRW5oYW5jZWQgY3Jvc3MtbWF0Y2hpbmcgbG9naWMgKHNhbWUgYXMgaW4gZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyk6XG4gICAgICAgICAgICAgIC8vIDEuIENvdXJzZSBUaGVtZSB2cyBGUkFDIFRoZW1lXG4gICAgICAgICAgICAgIC8vIDIuIENvdXJzZSBTdWIgVGhlbWUgdnMgRlJBQyBTdWIgVGhlbWUgIFxuICAgICAgICAgICAgICAvLyAzLiBDb3Vyc2UgVGhlbWUgdnMgRlJBQyBTdWIgVGhlbWVcbiAgICAgICAgICAgICAgLy8gNC4gQ291cnNlIFN1YiBUaGVtZSB2cyBGUkFDIFRoZW1lXG4gICAgICAgICAgICAgIGNvbnN0IGNvdXJzZVRoZW1lVG9GcmFjVGhlbWUgPSBjb3Vyc2VUaGVtZSA9PT0gZnJhY1RoZW1lO1xuICAgICAgICAgICAgICBjb25zdCBjb3Vyc2VTdWJUaGVtZVRvRnJhY1N1YlRoZW1lID0gY291cnNlU3ViVGhlbWUgPT09IGZyYWNTdWJUaGVtZTtcbiAgICAgICAgICAgICAgY29uc3QgY291cnNlVGhlbWVUb0ZyYWNTdWJUaGVtZSA9IGNvdXJzZVRoZW1lID09PSBmcmFjU3ViVGhlbWU7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdXJzZVN1YlRoZW1lVG9GcmFjVGhlbWUgPSBjb3Vyc2VTdWJUaGVtZSA9PT0gZnJhY1RoZW1lO1xuXG4gICAgICAgICAgICAgIGlmIChjb3Vyc2VUaGVtZVRvRnJhY1RoZW1lIHx8IGNvdXJzZVN1YlRoZW1lVG9GcmFjU3ViVGhlbWUgfHxcbiAgICAgICAgICAgICAgICBjb3Vyc2VUaGVtZVRvRnJhY1N1YlRoZW1lIHx8IGNvdXJzZVN1YlRoZW1lVG9GcmFjVGhlbWUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBtYXRjaFR5cGUgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY291cnNlVGhlbWVUb0ZyYWNUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVRoZW1lLXRvLUZSQUNUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlU3ViVGhlbWVUb0ZyYWNTdWJUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVN1YlRoZW1lLXRvLUZSQUNTdWJUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlVGhlbWVUb0ZyYWNTdWJUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVRoZW1lLXRvLUZSQUNTdWJUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlU3ViVGhlbWVUb0ZyYWNUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVN1YlRoZW1lLXRvLUZSQUNUaGVtZSc7XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhg4pyFIENPTVBFVEVOQ1kgTUFUQ0ggRk9VTkQgWyR7bWF0Y2hUeXBlfV0gZm9yICR7Y2F0ZWdvcnlUeXBlfTpgLCB7XG4gICAgICAgICAgICAgICAgICBjb3Vyc2U6IHsgdGhlbWU6IGNvdXJzZVRoZW1lLCBzdWJUaGVtZTogY291cnNlU3ViVGhlbWUgfSxcbiAgICAgICAgICAgICAgICAgIGZyYWM6IHsgdGhlbWU6IGZyYWNUaGVtZSwgc3ViVGhlbWU6IGZyYWNTdWJUaGVtZSB9LFxuICAgICAgICAgICAgICAgICAgbWF0Y2hUeXBlOiBtYXRjaFR5cGVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG1hdGNoZWRDb21wZXRlbmNpZXMucHVzaCh0aGlzLmdldFRoZW1lU3ViVGhlbWVLZXkoZnJhY1RoZW1lLCBmcmFjU3ViVGhlbWUpKTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gRm91bmQgYSBtYXRjaCwgbW92ZSB0byBuZXh0IGNvdXJzZSBjb21wZXRlbmN5XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBtYXRjaGVkIGNvbXBldGVuY2llc1xuICAgIG1hdGNoZWRDb21wZXRlbmNpZXMgPSBbLi4ubmV3IFNldChtYXRjaGVkQ29tcGV0ZW5jaWVzKV07XG5cbiAgICBjb25zb2xlLmxvZyhgXFxuPT09ICR7Y2F0ZWdvcnlUeXBlLnRvVXBwZXJDYXNlKCl9IENPTVBFVEVOQ1kgTUFUQ0hJTkcgPT09YCk7XG4gICAgY29uc29sZS5sb2coYCR7Y2F0ZWdvcnlUeXBlfSAtIEFsbCBGUkFDIGNvbXBldGVuY2llczpgLCBhbGxDYXRlZ29yeUNvbXBldGVuY2llcyk7XG4gICAgY29uc29sZS5sb2coYCR7Y2F0ZWdvcnlUeXBlfSAtIE1hdGNoZWQgZnJvbSBjb3Vyc2VzOmAsIG1hdGNoZWRDb21wZXRlbmNpZXMpO1xuICAgIGNvbnNvbGUubG9nKGAke2NhdGVnb3J5VHlwZX0gLSBNYXRjaCByYXRlOiAke21hdGNoZWRDb21wZXRlbmNpZXMubGVuZ3RofS8ke2FsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLmxlbmd0aH0gKCR7TWF0aC5yb3VuZCgobWF0Y2hlZENvbXBldGVuY2llcy5sZW5ndGggLyBhbGxDYXRlZ29yeUNvbXBldGVuY2llcy5sZW5ndGgpICogMTAwKX0lKWApO1xuXG4gICAgLy8gUmV0dXJuIHVubWF0Y2hlZCBjb21wZXRlbmNpZXMgKHRob3NlIGluIHJvbGUgbWFwcGluZyBidXQgbm90IGNvdmVyZWQgYnkgY291cnNlcylcbiAgICByZXR1cm4gdGhpcy5jb21wYXJlU3RyaW5nQXJyYXlzKGFsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLCBtYXRjaGVkQ29tcGV0ZW5jaWVzKTtcbiAgfVxuXG4gIGNvbXBhcmVTdHJpbmdBcnJheXMoYXJyMTogc3RyaW5nW10sIGFycjI6IHN0cmluZ1tdKSB7XG4gICAgY29uc29sZS5sb2coJ0FsbCBjb21wZXRlbmNpZXMgaW4gY2F0ZWdvcnk6JywgYXJyMSk7XG4gICAgY29uc29sZS5sb2coJ01hdGNoZWQgY29tcGV0ZW5jaWVzIGZyb20gY291cnNlczonLCBhcnIyKTtcblxuICAgIC8vIFJldHVybiBpdGVtcyBpbiBhcnIxIHRoYXQgYXJlIE5PVCBpbiBhcnIyICh1bm1hdGNoZWQgY29tcGV0ZW5jaWVzKVxuICAgIGNvbnN0IHVubWF0Y2hlZCA9IGFycjEuZmlsdGVyKGl0ZW0gPT4gIWFycjIuaW5jbHVkZXMoaXRlbSkpO1xuICAgIGNvbnNvbGUubG9nKCdVbm1hdGNoZWQgY29tcGV0ZW5jaWVzOicsIHVubWF0Y2hlZCk7XG5cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgYWRkQ291cnNlKG1pc3NpbmdDb21wZXRlbmN5Pzogc3RyaW5nLCBjb21wZXRlbmN5VHlwZT86IHN0cmluZykge1xuICAgIGxldCBkaWFsb2dEYXRhID0geyAuLi50aGlzLnBsYW5EYXRhIH07XG5cbiAgICAvLyBJZiBjb21wZXRlbmN5IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCBhZGQgdGhlbSB0byB0aGUgZGlhbG9nIGRhdGFcbiAgICBpZiAobWlzc2luZ0NvbXBldGVuY3kgJiYgY29tcGV0ZW5jeVR5cGUpIHtcbiAgICAgIGNvbnN0IHsgdGhlbWUsIHN1YlRoZW1lIH0gPSB0aGlzLnBhcnNlVGhlbWVBbmRTdWJUaGVtZShtaXNzaW5nQ29tcGV0ZW5jeSk7XG5cbiAgICAgIGRpYWxvZ0RhdGEucHJlZmlsbENvbXBldGVuY3kgPSB7XG4gICAgICAgIHR5cGU6IGNvbXBldGVuY3lUeXBlLFxuICAgICAgICB0aGVtZTogdGhlbWUsXG4gICAgICAgIHN1YlRoZW1lOiBzdWJUaGVtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFkZENvdXJzZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDb3Vyc2UgYWRkZWQgc3VjY2Vzc2Z1bGx5ISBSZWZyZXNoaW5nIGRhdGEuLi4nKTtcblxuICAgICAgICAvLyBSZWZyZXNoIHVzZXIgY291cnNlcyB0byBpbmNsdWRlIHRoZSBuZXdseSBhZGRlZCBjb3Vyc2VcbiAgICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKCk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBnYXAgYW5hbHlzaXMgd2l0aCB0aGUgbGF0ZXN0IGRhdGFcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVHYXBBbmFseXNpc0FmdGVyQ291cnNlc1VwZGF0ZSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdHYXAgYW5hbHlzaXMgcmVmcmVzaGVkIGFmdGVyIGNvdXJzZSBhZGRpdGlvbicpO1xuICAgICAgICB9LCA1MDApOyAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgZGF0YSBpcyBsb2FkZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKHRoZW1lSXRlbSkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9IHRoZW1lSXRlbTtcbiAgICBjb25zdCB7IHRoZW1lLCBzdWJUaGVtZSB9ID0gdGhpcy5wYXJzZVRoZW1lQW5kU3ViVGhlbWUodGhlbWVJdGVtIHx8ICcnKTtcbiAgICBsZXQgdGhlbWVOYW1lID0gdGhlbWU7XG4gICAgbGV0IHN1YlRoZW1lTmFtZSA9IHN1YlRoZW1lO1xuXG4gICAgY29uc29sZS5sb2coJ0ZpbHRlcmluZyBieSB0aGVtZTonLCB0aGVtZU5hbWUsICdzdWJUaGVtZTonLCBzdWJUaGVtZU5hbWUsICdUYWIgaW5kZXg6JywgdGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4KTtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBjb21wZXRlbmN5IHR5cGUgYmFzZWQgb24gdGhlIGFjdGl2ZSB0YWJcbiAgICBsZXQgY29tcGV0ZW5jeVR5cGUgPSAnJztcbiAgICBpZiAodGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID09PSAxKSB7XG4gICAgICBjb21wZXRlbmN5VHlwZSA9ICdiZWhhdmlvcmFsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMikge1xuICAgICAgY29tcGV0ZW5jeVR5cGUgPSAnZnVuY3Rpb25hbCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDMpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ2RvbWFpbic7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCBhdmFpbGFibGUgY291cnNlcyB1c2luZyB0aGUgaGVscGVyIG1ldGhvZFxuICAgIGNvbnN0IGFsbEF2YWlsYWJsZUNvdXJzZXMgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKTtcbiAgICBjb25zb2xlLmxvZygnVG90YWwgY291cnNlcyB0byBmaWx0ZXIgZnJvbTonLCBhbGxBdmFpbGFibGVDb3Vyc2VzLmxlbmd0aCk7XG5cbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQXZhaWxhYmxlQ291cnNlcy5maWx0ZXIoY291cnNlID0+IHtcbiAgICAgIGlmICghY291cnNlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgY29tcGV0ZW5jeSBwcm9wZXJ0eSBuYW1lc1xuICAgICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgICAgaWYgKGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBldGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gRmlsdGVyIGJ5IGNvbXBldGVuY3kgdHlwZSBhbmQgdGhlbWUvc3VidGhlbWVcbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXMuc29tZShjb21wID0+IHtcbiAgICAgICAgaWYgKCFjb21wKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgY29tcGV0ZW5jeSB0eXBlIG1hdGNoZXMgY3VycmVudCB0YWJcbiAgICAgICAgbGV0IGNvbXBUeXBlID0gY29tcD8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY29tcFR5cGUgPT09ICdiZWhhdmlvdXJhbCcpIGNvbXBUeXBlID0gJ2JlaGF2aW9yYWwnOyAvLyBOb3JtYWxpemUgc3BlbGxpbmdcblxuICAgICAgICBpZiAoY29tcFR5cGUgIT09IGNvbXBldGVuY3lUeXBlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgY3Jvc3MtbWF0Y2hpbmcgbGlrZSBnYXAgYW5hbHlzaXM6IHRoZW1lIHZzIHN1YnRoZW1lIGFuZCBzdWJ0aGVtZSB2cyB0aGVtZVxuICAgICAgICBjb25zdCBjb21wVGhlbWUgPSBjb21wPy5jb21wZXRlbmN5VGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpPy50cmltKCk7XG4gICAgICAgIGNvbnN0IGNvbXBTdWJUaGVtZSA9IGNvbXA/LmNvbXBldGVuY3lTdWJUaGVtZU5hbWU/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGhlbWUgPSB0aGVtZU5hbWU/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFN1YlRoZW1lID0gc3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNyb3NzLW1hdGNoaW5nIGxvZ2ljIGxpa2UgZ2FwIGFuYWx5c2lzOlxuICAgICAgICAvLyAxLiBTZWxlY3RlZCBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgLy8gMi4gU2VsZWN0ZWQgU3ViIFRoZW1lIHZzIENvdXJzZSBTdWIgVGhlbWUgIFxuICAgICAgICAvLyAzLiBTZWxlY3RlZCBUaGVtZSB2cyBDb3Vyc2UgU3ViIFRoZW1lXG4gICAgICAgIC8vIDQuIFNlbGVjdGVkIFN1YiBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgY29uc3QgdGhlbWVUb1RoZW1lTWF0Y2ggPSBzZWFyY2hUaGVtZSAmJiBjb21wVGhlbWUgPT09IHNlYXJjaFRoZW1lO1xuICAgICAgICBjb25zdCBzdWJUaGVtZVRvU3ViVGhlbWVNYXRjaCA9IHNlYXJjaFN1YlRoZW1lICYmIGNvbXBTdWJUaGVtZSA9PT0gc2VhcmNoU3ViVGhlbWU7XG4gICAgICAgIGNvbnN0IHRoZW1lVG9TdWJUaGVtZU1hdGNoID0gc2VhcmNoVGhlbWUgJiYgY29tcFN1YlRoZW1lID09PSBzZWFyY2hUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1RoZW1lTWF0Y2ggPSBzZWFyY2hTdWJUaGVtZSAmJiBjb21wVGhlbWUgPT09IHNlYXJjaFN1YlRoZW1lO1xuXG4gICAgICAgIGNvbnN0IGlzTWF0Y2ggPSB0aGVtZVRvVGhlbWVNYXRjaCB8fCBzdWJUaGVtZVRvU3ViVGhlbWVNYXRjaCB8fCB0aGVtZVRvU3ViVGhlbWVNYXRjaCB8fCBzdWJUaGVtZVRvVGhlbWVNYXRjaDtcblxuICAgICAgICAvLyBMb2cgbWF0Y2hlcyBmb3IgZGVidWdnaW5nIChzaW1pbGFyIHRvIGdhcCBhbmFseXNpcylcbiAgICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgICBsZXQgbWF0Y2hUeXBlID0gJyc7XG4gICAgICAgICAgaWYgKHRoZW1lVG9UaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHN1YlRoZW1lVG9TdWJUaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnU3ViVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHRoZW1lVG9TdWJUaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHN1YlRoZW1lVG9UaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnU3ViVGhlbWUtdG8tVGhlbWUnO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coYOKchSBGSUxURVIgTUFUQ0ggRk9VTkQgWyR7bWF0Y2hUeXBlfV06YCwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHsgdGhlbWU6IHNlYXJjaFRoZW1lLCBzdWJUaGVtZTogc2VhcmNoU3ViVGhlbWUgfSxcbiAgICAgICAgICAgIGNvdXJzZTogeyB0eXBlOiBjb21wVHlwZSwgdGhlbWU6IGNvbXBUaGVtZSwgc3ViVGhlbWU6IGNvbXBTdWJUaGVtZSB9LFxuICAgICAgICAgICAgbWF0Y2hUeXBlOiBtYXRjaFR5cGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGNoIGlmIGFueSBvZiB0aGUgY3Jvc3MtbWF0Y2hpbmcgY29uZGl0aW9ucyBhcmUgbWV0XG4gICAgICAgIHJldHVybiBpc01hdGNoO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnRmlsdGVyZWQgY291cnNlcyBmb3IgdGhlbWU6JywgdGhlbWVOYW1lLCAnQ291bnQ6JywgdGhpcy5maWx0ZXJkQ291cnNlcy5sZW5ndGgpO1xuICAgIGNvbnNvbGUubG9nKCdGaWx0ZXJlZCBjb3Vyc2VzOicsIHRoaXMuZmlsdGVyZENvdXJzZXMubWFwKGMgPT4gYy5uYW1lIHx8IGMuY291cnNlKSk7XG4gIH1cblxuICBjbGVhclRoZW1lRmlsdGVyKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnO1xuICAgIC8vIFJlc2V0IHRvIGNhdGVnb3J5IGZpbHRlcmVkIGNvdXJzZXMgYnkgY2FsbGluZyB0aGUgdGFiIGNoYW5nZSBtZXRob2RcbiAgICB0aGlzLm9uSW5uZXJUYWJDaGFuZ2Uoe1xuICAgICAgaW5kZXg6IHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCxcbiAgICAgIHRhYjogeyB0ZXh0TGFiZWw6IHRoaXMuaW5uZXJUYWJBY3RpdmVUZXh0IH1cbiAgICB9IGFzIGFueSk7XG4gICAgY29uc29sZS5sb2coJ1RoZW1lIGZpbHRlciBjbGVhcmVkLCBzaG93aW5nIGFsbCBjb3Vyc2VzIGZvciBjYXRlZ29yeTonLCB0aGlzLmlubmVyVGFiQWN0aXZlVGV4dCk7XG4gIH1cblxuICBpc1RoZW1lU2VsZWN0ZWQodGhlbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIgPT09IHRoZW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjb3Vyc2UgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGhlbWUgZmlsdGVyIHdpdGggcHJlZmlsbGVkIGNvbXBldGVuY3kgZGF0YVxuICAgKi9cbiAgYWRkQ291cnNlRm9yU2VsZWN0ZWRUaGVtZSgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlcikge1xuICAgICAgY29uc29sZS53YXJuKCdObyB0aGVtZSBzZWxlY3RlZCBmb3IgYWRkaW5nIGNvdXJzZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGhlbWUsIHN1YlRoZW1lIH0gPSB0aGlzLnBhcnNlVGhlbWVBbmRTdWJUaGVtZSh0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IGNvbXBldGVuY3kgdHlwZSBiYXNlZCBvbiB0aGUgYWN0aXZlIHRhYlxuICAgIC8vIE1hcCB0aGUgdGFiIGxhYmVscyB0byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IEFkZENvdXJzZUNvbXBvbmVudFxuICAgIGxldCBjb21wZXRlbmN5VHlwZSA9ICcnO1xuICAgIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDEpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ0JlaGF2aW9yYWwnOyAvLyBUYWIgbGFiZWwgaXMgXCJiZWhhdmlvdXJhbFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDIpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ0Z1bmN0aW9uYWwnOyAvLyBUYWIgbGFiZWwgaXMgXCJmdW5jdGlvbmFsXCJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMykge1xuICAgICAgY29tcGV0ZW5jeVR5cGUgPSAnRG9tYWluJzsgLy8gVGFiIGxhYmVsIGlzIFwiZG9tYWluXCJcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnVGFiIG1hcHBpbmcgLSBpbm5lclRhYkFjdGl2ZUluZGV4OicsIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCxcbiAgICAgICdpbm5lclRhYkFjdGl2ZVRleHQ6JywgdGhpcy5pbm5lclRhYkFjdGl2ZVRleHQsXG4gICAgICAnbWFwcGVkIGNvbXBldGVuY3lUeXBlOicsIGNvbXBldGVuY3lUeXBlKTtcblxuICAgIGNvbnNvbGUubG9nKCdBZGRpbmcgY291cnNlIGZvciBtaXNzaW5nIGNvbXBldGVuY3k6Jywge1xuICAgICAgY29tcGV0ZW5jeVR5cGUsXG4gICAgICB0aGVtZSxcbiAgICAgIHN1YlRoZW1lLFxuICAgICAgc2VsZWN0ZWRUaGVtZUZpbHRlcjogdGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIGRhdGEgd2l0aCBwcmVmaWxsZWQgY29tcGV0ZW5jeSBpbmZvcm1hdGlvblxuICAgIGxldCBkaWFsb2dEYXRhID0geyAuLi50aGlzLnBsYW5EYXRhIH07XG4gICAgZGlhbG9nRGF0YS5wcmVmaWxsQ29tcGV0ZW5jeSA9IHtcbiAgICAgIHR5cGU6IGNvbXBldGVuY3lUeXBlLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgc3ViVGhlbWU6IHN1YlRoZW1lIHx8ICcnIC8vIEluY2x1ZGUgc3ViLXRoZW1lIGlmIGF2YWlsYWJsZVxuICAgIH07XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFkZENvdXJzZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnNDAwcHgnLFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ291cnNlIGFkZGVkIHN1Y2Nlc3NmdWxseSBmb3IgY29tcGV0ZW5jeSEgUmVmcmVzaGluZyBkYXRhLi4uJyk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCB1c2VyIGNvdXJzZXMgdG8gaW5jbHVkZSB0aGUgbmV3bHkgYWRkZWQgY291cnNlXG4gICAgICAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBnYXAgYW5hbHlzaXMgYWZ0ZXIgY291cnNlIGFkZGl0aW9uXG4gICAgICAgIHRoaXMudXBkYXRlR2FwQW5hbHlzaXNBZnRlckNvdXJzZXNVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldER1cmF0aW9uKHRpbWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuY29udmVydCh0aW1lKTtcbiAgfVxuXG5cbiAgZ2V0QmVoYXZpb3VyYWxNYXRjaGVkKCkge1xuICAgIHRoaXMuYmVoYXZpb3VyYWxNYXRjaGVkID0gW11cbiAgICBjb25zb2xlLmxvZygndGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMnLCB0aGlzLnBsYW5EYXRhKVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZCcsIHRoaXMuYmVoYXZpb3VyYWxOb3RNYXRjaGVkKVxuICAgIHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29tcGV0ZW5jeUtleSA9IHRoaXMuZ2V0VGhlbWVTdWJUaGVtZUtleShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKTtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0/LnR5cGUgPT09ICdCZWhhdmlvcmFsJyAmJiB0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZC5pbmRleE9mKGNvbXBldGVuY3lLZXkpIDwgMCkge1xuICAgICAgICB0aGlzLmJlaGF2aW91cmFsTWF0Y2hlZC5wdXNoKGl0ZW0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmJlaGF2aW91cmFsTWF0Y2hlZC0tJywgdGhpcy5iZWhhdmlvdXJhbE1hdGNoZWQpXG4gIH1cblxuICBnZXRGdW5jdGlvbmFsTWF0Y2hlZCgpIHtcbiAgICB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkID0gW11cbiAgICB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbXBldGVuY3lLZXkgPSB0aGlzLmdldFRoZW1lU3ViVGhlbWVLZXkoaXRlbT8udGhlbWUsIGl0ZW0/LnN1Yl90aGVtZSk7XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtPy50eXBlID09PSAnRnVuY3Rpb25hbCcgJiYgdGhpcy5mdW5jdGlvbmFsTm90TWF0Y2hlZC5pbmRleE9mKGNvbXBldGVuY3lLZXkpIDwgMCkge1xuICAgICAgICB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkLnB1c2goaXRlbSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkXG4gIH1cblxuICBnZXREb21haW5NYXRjaGVkKCkge1xuICAgIHRoaXMuZG9tYWluTWF0Y2hlZCA9IFtdXG4gICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjb21wZXRlbmN5S2V5ID0gdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KGl0ZW0/LnRoZW1lLCBpdGVtPy5zdWJfdGhlbWUpO1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbT8udHlwZSA9PT0gJ0RvbWFpbicgJiYgdGhpcy5kb21haW5Ob3RNYXRjaGVkLmluZGV4T2YoY29tcGV0ZW5jeUtleSkgPCAwKSB7XG4gICAgICAgIHRoaXMuZG9tYWluTWF0Y2hlZC5wdXNoKGl0ZW0pXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zb2xlLmxvZygndGhpcy5kb21haW5NYXRjaGVkLS0nLCB0aGlzLmRvbWFpbk1hdGNoZWQpXG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRoZW1lV2l0aFN1YlRoZW1lKHRoZW1lOiBhbnksIHN1YlRoZW1lOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUaGVtZSA9ICh0aGVtZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFN1YlRoZW1lID0gKHN1YlRoZW1lIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcblxuICAgIGlmIChub3JtYWxpemVkVGhlbWUgJiYgbm9ybWFsaXplZFN1YlRoZW1lKSB7XG4gICAgICByZXR1cm4gYCR7bm9ybWFsaXplZFRoZW1lfSAtICR7bm9ybWFsaXplZFN1YlRoZW1lfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUaGVtZSB8fCBub3JtYWxpemVkU3ViVGhlbWU7XG4gIH1cblxuICBwcml2YXRlIGdldFRoZW1lU3ViVGhlbWVLZXkodGhlbWU6IGFueSwgc3ViVGhlbWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VGhlbWVXaXRoU3ViVGhlbWUodGhlbWUsIHN1YlRoZW1lKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUaGVtZUFuZFN1YlRoZW1lKHZhbHVlOiBzdHJpbmcpOiB7IHRoZW1lOiBzdHJpbmc7IHN1YlRoZW1lOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgdGV4dCA9ICh2YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICByZXR1cm4geyB0aGVtZTogJycsIHN1YlRoZW1lOiAnJyB9O1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCcgLSAnKSkge1xuICAgICAgY29uc3QgcGFydHMgPSB0ZXh0LnNwbGl0KCcgLSAnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRoZW1lOiAocGFydHMuc2hpZnQoKSB8fCAnJykudHJpbSgpLFxuICAgICAgICBzdWJUaGVtZTogcGFydHMuam9pbignIC0gJykudHJpbSgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCctJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGV4dC5zcGxpdCgnLScpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRoZW1lOiBwYXJ0c1swXS50cmltKCksXG4gICAgICAgICAgc3ViVGhlbWU6IHBhcnRzWzFdLnRyaW0oKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHRoZW1lOiB0ZXh0LCBzdWJUaGVtZTogJycgfTtcbiAgfVxuXG4gIGRvd25sb2FkUERGKCkge1xuICAgIHRoaXMuaXNQREZEb3dubG9hZCA9IHRydWVcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGRmQ29udGVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gV2FpdCBmb3IgaW1hZ2VzIHRvIGxvYWRcbiAgICBjb25zdCBpbWFnZXMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgIGNvbnN0IHByb21pc2VzID0gQXJyYXkuZnJvbShpbWFnZXMpLm1hcCgoaW1nOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaW1nLmNvbXBsZXRlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBpbWcub25sb2FkID0gcmVzb2x2ZSk7XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtYXJnaW46IDAuMjAsXG4gICAgICAgIGZpbGVuYW1lOiAnR2FwIEFuYWx5c2lzLnBkZicsXG4gICAgICAgIGltYWdlOiB7IHR5cGU6ICdqcGVnJywgcXVhbGl0eTogMC45OCB9LFxuICAgICAgICBodG1sMmNhbnZhczoge1xuICAgICAgICAgIHNjYWxlOiAyLFxuICAgICAgICAgIHVzZUNPUlM6IHRydWUsXG4gICAgICAgICAgc2Nyb2xsWTogMCxcbiAgICAgICAgfSxcbiAgICAgICAganNQREY6IHtcbiAgICAgICAgICB1bml0OiAnaW4nLFxuICAgICAgICAgIGZvcm1hdDogJ2E0JyxcbiAgICAgICAgICBvcmllbnRhdGlvbjogJ3BvcnRyYWl0J1xuICAgICAgICB9LFxuICAgICAgICBwYWdlYnJlYWs6IHtcbiAgICAgICAgICBtb2RlOiBbJ2NzcycsICdsZWdhY3knXSxcbiAgICAgICAgICBiZWZvcmU6ICcucGFnZS1icmVhaycsXG4gICAgICAgICAgYXZvaWQ6IFsnLm5vLWJyZWFrJ11cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaHRtbDJwZGYoKS5mcm9tKGVsZW1lbnQpLnNldChvcHRpb25zKS5zYXZlKClcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzUERGRG93bmxvYWQgPSBmYWxzZVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sIDMwMDApO1xuICAgIH0pO1xuICB9XG5cblxuICByZWRpcmVjdFRvVG9jKGl0ZW0pIHtcbiAgICBpZiAoaXRlbT8ucHVibGljX2xpbmspIHtcbiAgICAgIHdpbmRvdy5vcGVuKGl0ZW0/LnB1YmxpY19saW5rLCAnX2JsYW5rJylcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVybCA9IGBodHRwczovL3BvcnRhbC5pZ290a2FybWF5b2dpLmdvdi5pbi9hcHAvdG9jLyR7aXRlbT8uaWRlbnRpZmllcn0vb3ZlcnZpZXc/YFxuICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJylcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGdhcCBhbmFseXNpcyBzdGF0cyBhZnRlciBpbml0aWFsIGRhdGEgbG9hZFxuICAgKi9cbiAgaW5pdGlhbGl6ZUdhcEFuYWx5c2lzU3RhdHMoKSB7XG4gICAgLy8gU2V0IGEgc21hbGwgdGltZW91dCB0byBlbnN1cmUgYWxsIGFzeW5jIG9wZXJhdGlvbnMgY29tcGxldGVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcmRDb3Vyc2VzICYmIHRoaXMuZmlsdGVyZENvdXJzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdhcEFuYWx5c2lzU3RhdHMoKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHMgYWZ0ZXIgY291cnNlcyBhcmUgdXBkYXRlZCAobGlrZSBzdWdnZXN0ZWQgY291cnNlcyBhZGRlZClcbiAgICovXG4gIHVwZGF0ZUdhcEFuYWx5c2lzQWZ0ZXJDb3Vyc2VzVXBkYXRlKCkge1xuICAgIC8vIERvbid0IG1vZGlmeSBvcmlnaW5hbERhdGEgLSBpdCBzaG91bGQgcmVtYWluIGFzIEFJIHJlY29tbWVuZGVkIGNvdXJzZXMgb25seVxuICAgIC8vIFRoZSBnYXAgYW5hbHlzaXMgYWxyZWFkeSBwcm9wZXJseSBpbmNsdWRlcyBhbGwgY291cnNlIHR5cGVzXG5cbiAgICAvLyBSZWNhbGN1bGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHNcbiAgICB0aGlzLmdhcEFuYWx5c2lzU3RhdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRlIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgYnkgZGVsZXRpbmcgZXhpc3RpbmcgcmVjb21tZW5kYXRpb25zIGFuZCBnZW5lcmF0aW5nIG5ldyBvbmVzXG4gICAqL1xuICBhc3luYyByZWdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25zKCkge1xuICAgIGlmICh0aGlzLmlzUmVnZW5lcmF0aW5nKSB7XG4gICAgICByZXR1cm47IC8vIFByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlZ2VuZXJhdGlvbnNcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZyA9IHRydWU7XG5cbiAgICAgIC8vIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybWF0aW9uRGlhbG9nKCk7XG5cbiAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZygnU3RhcnRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbi4uLicpO1xuXG4gICAgICAvLyBTZXQgcmVnZW5lcmF0aW9uIHByb2dyZXNzIHN0YXRlXG4gICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlOyAvLyBIaWRlIG1haW4gY29udGVudCBkdXJpbmcgcmVnZW5lcmF0aW9uXG5cbiAgICAgIC8vIFN0ZXAgMTogRGVsZXRlIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnNcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKCk7XG5cbiAgICAgIC8vIFN0ZXAgMjogR2VuZXJhdGUgbmV3IGNvdXJzZSByZWNvbW1lbmRhdGlvbnNcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVOZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKTtcblxuICAgICAgLy8gU3RlcCAzOiBSZWZyZXNoIHRoZSBjdXJyZW50IGRhdGFcbiAgICAgIHRoaXMucmVmcmVzaENvbXBvbmVudCgpO1xuXG4gICAgICBjb25zb2xlLmxvZygnQ291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICAgIC8vIFNob3cgc3VjY2VzcyBtZXNzYWdlXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgcmVnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdDbG9zZScsIHtcbiAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnc3VjY2Vzcy1zbmFja2JhciddXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbjonLCBlcnJvcik7XG5cbiAgICAgIC8vIFNob3cgZXJyb3IgbWVzc2FnZVxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gcmVnZW5lcmF0ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdDbG9zZScsIHtcbiAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnZXJyb3Itc25hY2tiYXInXVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7IC8vIEVuc3VyZSBtYWluIGNvbnRlbnQgaXMgc2hvd24gYWZ0ZXIgcmVnZW5lcmF0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZyBmb3IgcmVnZW5lcmF0ZSBhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2hvd0NvbmZpcm1hdGlvbkRpYWxvZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFJlZ2VuZXJhdGVDb25maXJtYXRpb25EaWFsb2csIHtcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICdyZWdlbmVyYXRlLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQgPT09IHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHJvbGUgbWFwcGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZU1hcElkID0gdGhpcy5wbGFuRGF0YT8uaWQ7XG5cbiAgICAgIGlmICghcm9sZU1hcElkKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1JvbGUgbWFwcGluZyBJRCBub3QgZm91bmQnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHJvbGUgbWFwcGluZzonLCByb2xlTWFwSWQpO1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKHJvbGVNYXBJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgZGVsZXRlZCBzdWNjZXNzZnVsbHk6JywgcmVzcG9uc2UpO1xuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVsZXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uczonLCBlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbmV3IGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZHVyaW5nIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5ld0NvdXJzZVJlY29tbWVuZGF0aW9ucygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0aW5nIG5ldyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVjb21tZW5kZWRDb3Vyc2VGb3JSZWdlbmVyYXRpb24odGhpcy5wbGFuRGF0YS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgY291cnNlIGdlbmVyYXRpb24gc3BlY2lmaWNhbGx5IGZvciByZWdlbmVyYXRpb24gd2l0aCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAqL1xuICBwcml2YXRlIGdldFJlY29tbWVuZGVkQ291cnNlRm9yUmVnZW5lcmF0aW9uKHJvbGVfbWFwcGluZ19pZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU3RhcnQgdGhlIHByb2dyZXNzaXZlIGxvYWRpbmcgc2ltdWxhdGlvbiBmb3IgcmVnZW5lcmF0aW9uXG4gICAgICB0aGlzLnN0YXJ0UmVnZW5lcmF0aXZlUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG5cbiAgICAgIC8vIE1ha2UgdGhlIGFjdHVhbCBBUEkgY2FsbFxuICAgICAgLy8gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIC8vICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nIGFuZCBzaG93IGNvbXBsZXRpb25cbiAgICAgIC8vICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2U7IC8vIFRoaXMgd2lsbCBzdG9wIHRoZSBpbnRlcnZhbFxuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIHJlZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAvLyAgICAgLy8gQ2xlYXIgdGhlIGxvYWRpbmcgc3RhdGUgYWZ0ZXIgc2hvd2luZyBjb21wbGV0aW9uXG4gICAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgIC8vICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgIC8vICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgLy8gICAgIH0sIDIwMDApO1xuICAgICAgLy8gICB9LFxuICAgICAgLy8gICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAgICAvLyAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcblxuICAgICAgLy8gICAgIC8vIEhhbmRsZSBzcGVjaWZpYyBlcnJvciBjYXNlc1xuICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwOSB8fCBlcnJvci5lcnJvcj8uZGV0YWlsPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuICAgICAgLy8gICAgICAgLy8gQ291cnNlIHJlY29tbWVuZGF0aW9ucyBhbHJlYWR5IGV4aXN0IC0gdGhpcyBpcyBub3JtYWxcbiAgICAgIC8vICAgICAgIGNvbnNvbGUubG9nKCdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIGFscmVhZHkgZXhpc3QsIGxvYWRpbmcgZXhpc3RpbmcgZGF0YS4uLicpO1xuXG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGluZyBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgLy8gICAgICAgLy8gVHJ5IHRvIGdldCBleGlzdGluZyBkYXRhXG4gICAgICAvLyAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgLy8gICAgICAgICBuZXh0OiAoZXhpc3RpbmdSZXNwb25zZSkgPT4ge1xuICAgICAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgbG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMnKTtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgIC8vICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgICAgcmVzb2x2ZShleGlzdGluZ1Jlc3BvbnNlKTtcbiAgICAgIC8vICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgIC8vICAgICAgICAgfSxcbiAgICAgIC8vICAgICAgICAgZXJyb3I6IChsb2FkRXJyb3IpID0+IHtcbiAgICAgIC8vICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zOicsIGxvYWRFcnJvcik7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgIHJlamVjdChsb2FkRXJyb3IpO1xuICAgICAgLy8gICAgICAgICB9XG4gICAgICAvLyAgICAgICB9KTtcbiAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiByZWdlbmVyYXRpb246JywgZXJyb3IpO1xuICAgICAgLy8gICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0pO1xuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnR2VuZXJhdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgaW50ZXJ2YWwoNTAwMClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5waXBlKFxuICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGVycm9yIHRocm91Z2ggb2JzZXJ2YWJsZSBzbyBwb2xsaW5nIGxvZ2ljIGNhbiBpbnNwZWN0IGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIHRhcChyZXMgPT4gY29uc29sZS5sb2coXCJQb2xsaW5nIHJlc3VsdDpcIiwgcmVzKSksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiDirIfvuI8gU1RPUCBQT0xMSU5HIG9ubHkgd2hlbjpcbiAgICAgICAgICAgKiAtIFNVQ0NFU1Mg4oaSIHJlcy5zdGF0dXMgPT09IENPTVBMRVRFRFxuICAgICAgICAgICAqIC0gRVJST1Ig4oaSIGNvbmZsaWN0IC8gYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0YWtlV2hpbGUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiBmYWxzZTsgICAgICAgLy8gU3RvcFxuICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3I/LnN0YXR1cyA9PT0gNDA5KSByZXR1cm4gZmFsc2U7ICAgICAgICAvLyBTdG9wXG4gICAgICAgICAgICBpZiAocmVzPy5lcnJvcj8uZXJyb3I/LmRldGFpbD8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHJldHVybiBmYWxzZTsgLy8gU3RvcFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgcG9sbGluZ1xuICAgICAgICAgIH0sIHRydWUpIC8vIGluY2x1ZGUgZmluYWwgZW1pc3Npb25cbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICogIFNVQ0NFU1MgQ0FTRSAoc3RhdHVzIENPTVBMRVRFRClcbiAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnQ291cnNlIHJlY29tbWVuZGF0aW9ucyByZWdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhJztcblxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICogIEVSUk9SIENBU0UgKDQwOSAvIGFscmVhZHkgZXhpc3RzKVxuICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSByZXMuZXJyb3I7XG5cbiAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDA5IHx8IGVycm9yPy5lcnJvcj8uZGV0YWlsPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0xvYWRpbmcgZXhpc3RpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLic7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgbmV4dDogKGV4aXN0aW5nRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0xvYWRlZCBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGV4aXN0aW5nRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBsb2FkRXJyb3IgPT4gcmVqZWN0KGxvYWRFcnJvcilcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8qKiBBbnkgb3RoZXIgZXJyb3Ig4oaSIHN0b3AgJiByZWplY3QgKi9cbiAgICAgICAgICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgICAqICBTVElMTCBQUk9DRVNTSU5HIChrZWVwIHBvbGxpbmcpXG4gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSBNYXRoLm1pbih0aGlzLnByb2dyZXNzUGVyY2VudGFnZSArIDEwLCA5NSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnU3RpbGwgcHJvY2Vzc2luZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3I6IGVyciA9PiByZWplY3QoZXJyKVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICAvLyBQcm9ncmVzc2l2ZSBsb2FkaW5nIG1ldGhvZHMgZm9yIHJlZ2VuZXJhdGlvblxuICBzdGFydFJlZ2VuZXJhdGl2ZVByb2dyZXNzaXZlTG9hZGluZygpIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSB0aGlzLnByb2Nlc3NpbmdTdGFnZXNbMF07XG4gICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgIHRoaXMuc3RhZ2VTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuc2ltdWxhdGVSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZVN0YWdlcygpO1xuICB9XG5cbiAgc2ltdWxhdGVSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZVN0YWdlcygpIHtcbiAgICBsZXQgY3VycmVudFN0YWdlSW5kZXggPSAwO1xuICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSA2MDAwMDsgLy8gNjAgc2Vjb25kcyBlc3RpbWF0ZWQgZHVyYXRpb25cbiAgICBjb25zdCBzdGFnZUludGVydmFsID0gdG90YWxEdXJhdGlvbiAvIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGg7XG5cbiAgICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZiByZWdlbmVyYXRpb24gaXMgY29tcGxldGVcbiAgICAgIGlmICghdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcykge1xuICAgICAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5zdGFnZVN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGFnZVByb2dyZXNzID0gKGVsYXBzZWQgJSBzdGFnZUludGVydmFsKSAvIHN0YWdlSW50ZXJ2YWw7XG4gICAgICBjb25zdCBzdGFnZUluZGV4ID0gTWF0aC5taW4oTWF0aC5mbG9vcihlbGFwc2VkIC8gc3RhZ2VJbnRlcnZhbCksIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGggLSAxKTtcblxuICAgICAgLy8gVXBkYXRlIHN0YWdlIGlmIG5lZWRlZFxuICAgICAgaWYgKHN0YWdlSW5kZXggIT09IGN1cnJlbnRTdGFnZUluZGV4ICYmIHN0YWdlSW5kZXggPCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnJlbnRTdGFnZUluZGV4ID0gc3RhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyAoZWFjaCBzdGFnZSBpcyB3b3J0aCB+MTYuNjclKVxuICAgICAgY29uc3QgYmFzZVByb2dyZXNzID0gKHN0YWdlSW5kZXggLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHN0YWdlUHJvZ3Jlc3MgPSAoY3VycmVudFN0YWdlUHJvZ3Jlc3MgLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gTWF0aC5taW4oTWF0aC5yb3VuZChiYXNlUHJvZ3Jlc3MgKyBzdGFnZVByb2dyZXNzKSwgOTUpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIGNvbXBvbmVudCBkYXRhIGFmdGVyIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoQ29tcG9uZW50KCkge1xuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIGNvbXBvbmVudCBkYXRhLi4uJyk7XG5cbiAgICAvLyBSZXNldCBhbGwgZmlsdGVycyBhbmQgc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnO1xuICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSBbXTtcbiAgICB0aGlzLm9yaWdpbmFsRmlsdGVyZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy5sYXN0RW5yaWNoZWRJZGVudGlmaWVyc0tleSA9ICcnO1xuXG4gICAgLy8gUmVzZXQgdGFiIHN0YXRlc1xuICAgIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9IDA7XG4gICAgdGhpcy5vdXRlclRhYkFjdGl2ZUluZGV4ID0gMDtcblxuICAgIC8vIENhbGwgdGhlIGRhdGEgbG9hZGluZyBtZXRob2RzIGRpcmVjdGx5IHRvIGF2b2lkIHJlc2V0dGluZyBkYXRhTG9hZGVkXG4gICAgdGhpcy5sb2FkQ29tcG9uZW50RGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29tcG9uZW50IGRhdGEgKHNlcGFyYXRlZCBmcm9tIG5nT25Jbml0IGZvciByZXVzZSlcbiAgICovXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudERhdGEoKSB7XG4gICAgdGhpcy5nZXRSZWNvbW1lbmRlZENvdXJzZVdpdGhQcm9ncmVzcyh0aGlzLnBsYW5EYXRhLmlkKS50aGVuKChyZXMpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcy5pZFxuICAgICAgbGV0IGFsbENvdXJlcyA9IFtdXG4gICAgICBpZiAocmVzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICByZXM/LmZpbHRlcmVkX2NvdXJzZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtPy5yZWxldmFuY3kgPj0gNzUpIHtcbiAgICAgICAgICAgIGFsbENvdXJlcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeShhbGxDb3VyZXMpXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3koYWxsQ291cmVzKVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgICB0aGlzLmdldENvdXJzZXMoKVxuICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuXG4gICAgICAvLyBJbml0aWFsaXplIGdhcCBhbmFseXNpcyBzdGF0cyBhZnRlciBjb3Vyc2VzIGFyZSBsb2FkZWRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUdhcEFuYWx5c2lzU3RhdHMoKVxuICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKClcblxuICAgICAgLy8gTWFyayBkYXRhIGFzIGxvYWRlZCBhZnRlciBhbGwgaW5pdGlhbCBvcGVyYXRpb25zXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyByZWNvbW1lbmRlZCBjb3Vyc2VzOicsIGVycm9yKTtcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICBjb25zb2xlLmxvZygnVW5hdXRob3JpemVkIGFjY2VzcyAtIHVzZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGxvZ2luJyk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YXR1cyAhPT0gNDA5KSB7XG4gICAgICAgIC8vIERvbid0IGxvZyBlcnJvciBmb3IgNDA5IChhbHJlYWR5IGV4aXN0cykgYXMgaXQncyBoYW5kbGVkIGluIHRoZSBtZXRob2RcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgY291cnNlIHJlY29tbWVuZGF0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gTWFyayBkYXRhIGFzIGxvYWRlZCBldmVuIGlmIHRoZXJlJ3MgYW4gZXJyb3IgdG8gc2hvdyB0aGUgZGlhbG9nIGNvbnRlbnRcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyBQcm9ncmVzc2l2ZSBsb2FkaW5nIG1ldGhvZHMgZm9yIGNvdXJzZSBnZW5lcmF0aW9uXG4gIHN0YXJ0UHJvZ3Jlc3NpdmVMb2FkaW5nKCkge1xuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1swXTtcbiAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgdGhpcy5zdGFnZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5zaW11bGF0ZVByb2dyZXNzaXZlU3RhZ2VzKCk7XG4gIH1cblxuICBzaW11bGF0ZVByb2dyZXNzaXZlU3RhZ2VzKCkge1xuICAgIGxldCBjdXJyZW50U3RhZ2VJbmRleCA9IDA7XG4gICAgY29uc3QgdG90YWxEdXJhdGlvbiA9IDYwMDAwOyAvLyA2MCBzZWNvbmRzIGVzdGltYXRlZCBkdXJhdGlvblxuICAgIGNvbnN0IHN0YWdlSW50ZXJ2YWwgPSB0b3RhbER1cmF0aW9uIC8gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aDtcblxuICAgIGNvbnN0IHByb2dyZXNzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHRoaXMuc3RhZ2VTdGFydFRpbWU7XG4gICAgICBjb25zdCBjdXJyZW50U3RhZ2VQcm9ncmVzcyA9IChlbGFwc2VkICUgc3RhZ2VJbnRlcnZhbCkgLyBzdGFnZUludGVydmFsO1xuICAgICAgY29uc3Qgc3RhZ2VJbmRleCA9IE1hdGgubWluKE1hdGguZmxvb3IoZWxhcHNlZCAvIHN0YWdlSW50ZXJ2YWwpLCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoIC0gMSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBzdGFnZSBpZiBuZWVkZWRcbiAgICAgIGlmIChzdGFnZUluZGV4ICE9PSBjdXJyZW50U3RhZ2VJbmRleCAmJiBzdGFnZUluZGV4IDwgdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aCkge1xuICAgICAgICBjdXJyZW50U3RhZ2VJbmRleCA9IHN0YWdlSW5kZXg7XG4gICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1tzdGFnZUluZGV4XTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIG92ZXJhbGwgcHJvZ3Jlc3MgKGVhY2ggc3RhZ2UgaXMgd29ydGggfjE2LjY3JSlcbiAgICAgIGNvbnN0IGJhc2VQcm9ncmVzcyA9IChzdGFnZUluZGV4IC8gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aCkgKiAxMDA7XG4gICAgICBjb25zdCBzdGFnZVByb2dyZXNzID0gKGN1cnJlbnRTdGFnZVByb2dyZXNzIC8gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aCkgKiAxMDA7XG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IE1hdGgubWluKE1hdGgucm91bmQoYmFzZVByb2dyZXNzICsgc3RhZ2VQcm9ncmVzcyksIDk1KTtcblxuICAgICAgLy8gQ2xlYXIgaW50ZXJ2YWwgd2hlbiBsb2FkaW5nIHN0b3BzXG4gICAgICBpZiAoIXRoaXMubG9hZGluZykge1xuICAgICAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpO1xuICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgLy8gRW5oYW5jZWQgY291cnNlIGdlbmVyYXRpb24gd2l0aCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gIGdldFJlY29tbWVuZGVkQ291cnNlV2l0aFByb2dyZXNzKHJvbGVfbWFwcGluZ19pZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0dlbmVyYXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLic7XG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDMwO1xuXG4gICAgICB0aGlzLnN0YXJ0UHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG5cbiAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgIGNvbmNhdChcbiAgICAgICAgb2YobnVsbCksICAgICAgICAgIC8vIGltbWVkaWF0ZSBjYWxsXG4gICAgICAgIGludGVydmFsKDUwMDApICAgICAvLyBwb2xsIGV2ZXJ5IDUgc2VjXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHJvbGVfbWFwcGluZ19pZClcbiAgICAgICAgICApLFxuXG4gICAgICAgICAgdGFwKChyZXNwb25zZTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5maXJzdEFwaVJlc3BvbnNlICYmICF0aGlzLmV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCkge1xuICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc19leGlzdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhpc3RpbmdSZWNvbW1lbmRhdGlvbkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAnRmlyc3QgcmVjb21tZW5kYXRpb24gcmVzcG9uc2U6JyxcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgdGFrZVdoaWxlKChyZXNwb25zZTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgcG9sbGluZyBpZiBleGlzdGluZyByZWNvbW1lbmRhdGlvbnMgZm91bmRcbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0QXBpUmVzcG9uc2U/LmlzX2V4aXN0aW5nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlPy5zdGF0dXMgIT09ICdDT01QTEVURUQnO1xuXG4gICAgICAgICAgfSwgdHJ1ZSksXG5cbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuXG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBFWElTVElORyBSRUNPTU1FTkRBVElPTlNcbiAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RBcGlSZXNwb25zZT8uaXNfZXhpc3RpbmcgJiYgdGhpcy5leGlzdGluZ1JlY29tbWVuZGF0aW9uRm91bmQpIHtcblxuICAgICAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFxuICAgICAgICAgICAgICAgIERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiAnZ2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbnMnICAgICAgICAgICAgICAgICAvLyBpbmRleCBmb3IgVUkgcmVtb3ZhbFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucyhyb2xlX21hcHBpbmdfaWQpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGlzdGluZ1JlY29tbWVuZGF0aW9uRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZWNvbW1lbmRlZENvdXJzZVdpdGhQcm9ncmVzcyhyb2xlX21hcHBpbmdfaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yPy5lcnJvcj8uZGV0YWlsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gZGVsZXRlIHJlY29tbWVuZGF0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdYJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5maXJzdEFwaVJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgLy8gQ09NUExFVEVEXG4gICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuXG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9XG4gICAgICAgICAgICAgICAgJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgICAgICAgICAgfSwgMjAwMCk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgICAgICAgICdSZWNvbW1lbmRhdGlvbnMgcmVhZHkhJyxcbiAgICAgICAgICAgICAgICAnWCcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuXG4gICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgICAgICdGYWlsZWQgdG8gZ2VuZXJhdGUgY291cnNlIHJlY29tbWVuZGF0aW9ucy4nLFxuICAgICAgICAgICAgICAnWCcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCh7XG4gICAgICBjb21wZXRlbmN5OiBbXSxcbiAgICAgIHJhdGluZzogW10sXG4gICAgICBsYW5ndWFnZTogW10sXG4gICAgICBkdXJhdGlvbjogW10sXG4gICAgICBwcm92aWRlcjogW11cbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IGZpbHRlcmVkIGRyb3Bkb3duIGxpc3RzXG4gICAgdGhpcy5maWx0ZXJlZENvbXBldGVuY3kgPSBbLi4udGhpcy5jb21wZXRlbmNpZXNUeXBlXTtcbiAgICB0aGlzLmZpbHRlcmVkUmF0aW5ncyA9IFsuLi50aGlzLnJhdGluZ3NdO1xuICAgIHRoaXMuZmlsdGVyZWRMYW5ndWFnZXMgPSBbLi4udGhpcy5sYW5ndWFnZXNdO1xuICAgIHRoaXMuZmlsdGVyZWREdXJhdGlvbnMgPSBbLi4udGhpcy5kdXJhdGlvbnNdO1xuICAgIHRoaXMuZmlsdGVyZWRQcm92aWRlcnMgPSBbLi4udGhpcy5wcm92aWRlcnNdO1xuXG4gICAgLy8gUmVzZXQgY291cnNlIGxpc3RcbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gWy4uLnRoaXMuZnVsbENvdXJzZUxpc3RdO1xuICAgIC8vIHRoaXMuZnVsbENvdXJzZUxpc3QuZm9yRWFjaCgoaXRlbSk9PntcbiAgICAvLyAgIGlmKGl0ZW0gJiYgaXRlbS5vcmdhbmlzYXRpb24gJiYgaXRlbS5vcmdhbmlzYXRpb24ubGVuZ3RoKSB7XG4gICAgLy8gICAgIGlmKHRoaXMuZmlsdGVyZWRQcm92aWRlcnMuaW5kZXhPZihpdGVtLm9yZ2FuaXNhdGlvblswXSkgPCAwKSB7XG4gICAgLy8gICAgICAgdGhpcy5maWx0ZXJlZFByb3ZpZGVycy5wdXNoKGl0ZW0ub3JnYW5pc2F0aW9uWzBdKVxuICAgIC8vICAgICB9XG5cbiAgICAvLyAgIH1cbiAgICAvLyB9KVxuICAgIHRoaXMuZ2V0QWxsQXZhaWxhYmxlQ291cnNlcygpXG4gIH1cblxuICBmaWx0ZXJMaXN0KHZhbHVlOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNlYXJjaCA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbXBldGVuY3knOlxuICAgICAgICB0aGlzLmZpbHRlcmVkQ29tcGV0ZW5jeSA9IHRoaXMuY29tcGV0ZW5jaWVzVHlwZS5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmF0aW5nJzpcbiAgICAgICAgdGhpcy5maWx0ZXJlZFJhdGluZ3MgPSB0aGlzLnJhdGluZ3MuZmlsdGVyKHYgPT4gdi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xhbmd1YWdlJzpcbiAgICAgICAgdGhpcy5maWx0ZXJlZExhbmd1YWdlcyA9IHRoaXMubGFuZ3VhZ2VzLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkdXJhdGlvbic6XG4gICAgICAgIHRoaXMuZmlsdGVyZWREdXJhdGlvbnMgPSB0aGlzLmR1cmF0aW9ucy5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHJvdmlkZXInOlxuICAgICAgICB0aGlzLmZpbHRlcmVkUHJvdmlkZXJzID0gdGhpcy5wcm92aWRlcnMuZmlsdGVyKHYgPT4gdi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVDb21wZXRlbmN5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcbiAgICBjb25zdCB2ID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh2ID09PSAnYWxsJykgcmV0dXJuICdhbGwnO1xuICAgIGlmICh2LmluY2x1ZGVzKCdiZWhhdmlvdXJhbCcpIHx8IHYuaW5jbHVkZXMoJ2JlaGF2aW9yYWwnKSkgcmV0dXJuICdiZWhhdmlvcmFsJztcbiAgICBpZiAodi5pbmNsdWRlcygnZnVuY3Rpb25hbCcpKSByZXR1cm4gJ2Z1bmN0aW9uYWwnO1xuICAgIGlmICh2LmluY2x1ZGVzKCdkb21haW4nKSkgcmV0dXJuICdkb21haW4nO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbXBldGVuY3kgPSBbXSxcbiAgICAgIHJhdGluZyA9IFtdLFxuICAgICAgbGFuZ3VhZ2UgPSBbXSxcbiAgICAgIGR1cmF0aW9uID0gW10sXG4gICAgICBwcm92aWRlciA9IFtdXG4gICAgfSA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZTtcblxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmZ1bGxDb3Vyc2VMaXN0LS0nLCB0aGlzLmZ1bGxDb3Vyc2VMaXN0KVxuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuZnVsbENvdXJzZUxpc3QuZmlsdGVyKGNvdXJzZSA9PiB7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gQ29tcGV0ZW5jeSAtLS0tLS0tLS0tLS0tLS0tICovXG4gICAgICBjb25zdCBjb3Vyc2VDb21wZXRlbmNpZXMgPSBbXG4gICAgICAgIC4uLihjb3Vyc2UuY29tcGV0ZW5jaWVzIHx8IFtdKSxcbiAgICAgICAgLi4uKGNvdXJzZS5jb21wZXRlbmNpZXNfdjYgfHwgW10pXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZENvbXBldGVuY2llcyA9IGNvbXBldGVuY3lcbiAgICAgICAgLm1hcCgoYzogc3RyaW5nKSA9PiB0aGlzLm5vcm1hbGl6ZUNvbXBldGVuY3koYykpXG4gICAgICAgIC5maWx0ZXIoYyA9PiBjICE9PSAnJyk7XG5cbiAgICAgIGNvbnN0IGNvbXBldGVuY3lNYXRjaCA9XG4gICAgICAgIHNlbGVjdGVkQ29tcGV0ZW5jaWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBzZWxlY3RlZENvbXBldGVuY2llcy5pbmNsdWRlcygnYWxsJykgfHxcbiAgICAgICAgY291cnNlQ29tcGV0ZW5jaWVzLnNvbWUoKGM6IGFueSkgPT5cbiAgICAgICAgICBzZWxlY3RlZENvbXBldGVuY2llcy5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplQ29tcGV0ZW5jeShjLmNvbXBldGVuY3lBcmVhTmFtZSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gUmF0aW5nIC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IHJhdGluZ01hdGNoID1cbiAgICAgICAgcmF0aW5nLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICB0aGlzLm1hdGNoUmF0aW5nKGNvdXJzZSwgcmF0aW5nKTtcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBMYW5ndWFnZSAtLS0tLS0tLS0tLS0tLS0tICovXG4gICAgICBjb25zdCBsYW5ndWFnZU1hdGNoID1cbiAgICAgICAgbGFuZ3VhZ2UubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIGxhbmd1YWdlLnNvbWUoKGw6IHN0cmluZykgPT5cbiAgICAgICAgICBjb3Vyc2UubGFuZ3VhZ2UgPT09IGwgfHxcbiAgICAgICAgICBjb3Vyc2UubGFuZ3VhZ2U/LmluY2x1ZGVzPy4obCkgfHxcbiAgICAgICAgICBjb3Vyc2UubGFuZ3VhZ2U/LlswXT8uaW5jbHVkZXM/LihsKVxuICAgICAgICApO1xuXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIER1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IGR1cmF0aW9uTWF0Y2ggPVxuICAgICAgICBkdXJhdGlvbi5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgdGhpcy5tYXRjaER1cmF0aW9uKGNvdXJzZS5kdXJhdGlvbiwgZHVyYXRpb24pO1xuXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIFByb3ZpZGVyIC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IHByb3ZpZGVyTWF0Y2ggPVxuICAgICAgICBwcm92aWRlci5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgcHJvdmlkZXIuc29tZSgocDogc3RyaW5nKSA9PlxuICAgICAgICAgIGNvdXJzZS5vcmdhbmlzYXRpb24/LmluY2x1ZGVzKHApXG4gICAgICAgICk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbXBldGVuY3lNYXRjaCAmJlxuICAgICAgICByYXRpbmdNYXRjaCAmJlxuICAgICAgICBsYW5ndWFnZU1hdGNoICYmXG4gICAgICAgIGR1cmF0aW9uTWF0Y2ggJiZcbiAgICAgICAgcHJvdmlkZXJNYXRjaFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlDYXRlZ29yeUFuZFJlbGV2YW5jeSh0aGlzLmZpbHRlcmRDb3Vyc2VzKTtcbiAgfVxuXG4gIG1hdGNoUmF0aW5nKGNvdXJzZTogYW55LCBzZWxlY3RlZFJhdGluZ3M6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzZWxlY3RlZFJhdGluZ3MgfHwgc2VsZWN0ZWRSYXRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIG5vIGZpbHRlciBzZWxlY3RlZCDihpIgbWF0Y2ggZXZlcnl0aGluZ1xuICAgIH1cblxuICAgIGxldCByYXRpbmcgPSBudWxsO1xuXG4gICAgLy8gMe+4j+KDoyBVc2UgYXZnUmF0aW5nIGlmIGF2YWlsYWJsZVxuICAgIGlmIChjb3Vyc2UuYXZnUmF0aW5nICE9IG51bGwgJiYgIWlzTmFOKGNvdXJzZS5hdmdSYXRpbmcpKSB7XG4gICAgICByYXRpbmcgPSBOdW1iZXIoY291cnNlLmF2Z1JhdGluZyk7XG4gICAgfVxuICAgIC8vIDLvuI/ig6MgTWFwIHJlbGV2YW5jeSBpZiBhdmdSYXRpbmcgbWlzc2luZ1xuICAgIGVsc2UgaWYgKGNvdXJzZS5yZWxldmFuY3kgIT0gbnVsbCAmJiAhaXNOYU4oY291cnNlLnJlbGV2YW5jeSkpIHtcbiAgICAgIGNvbnN0IHJlbCA9IE51bWJlcihjb3Vyc2UucmVsZXZhbmN5KTtcbiAgICAgIGlmIChyZWwgPj0gOTApIHJhdGluZyA9IDQuNTtcbiAgICAgIGVsc2UgaWYgKHJlbCA+PSA4MCkgcmF0aW5nID0gNC4wO1xuICAgICAgZWxzZSBpZiAocmVsID49IDcwKSByYXRpbmcgPSAzLjU7XG4gICAgICBlbHNlIGlmIChyZWwgPj0gNTApIHJhdGluZyA9IDIuNTtcbiAgICAgIGVsc2UgcmF0aW5nID0gMS4wO1xuICAgIH1cblxuICAgIC8vIDPvuI/ig6MgTm8gdXNhYmxlIHJhdGluZyDihpIgZXhjbHVkZVxuICAgIGlmIChyYXRpbmcgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIDTvuI/ig6MgTWF0Y2ggc2VsZWN0ZWQgcmF0aW5nIHJhbmdlc1xuICAgIHJldHVybiBzZWxlY3RlZFJhdGluZ3Muc29tZShyID0+IHtcbiAgICAgIHN3aXRjaCAocikge1xuICAgICAgICBjYXNlICc0LjUgYW5kIGFib3ZlJzogcmV0dXJuIHJhdGluZyA+PSA0LjU7XG4gICAgICAgIGNhc2UgJzQuMCBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDQuMDtcbiAgICAgICAgY2FzZSAnMy41IGFuZCBhYm92ZSc6IHJldHVybiByYXRpbmcgPj0gMy41O1xuICAgICAgICBjYXNlICcyLjUgYW5kIGFib3ZlJzogcmV0dXJuIHJhdGluZyA+PSAyLjU7XG4gICAgICAgIGNhc2UgJzEgYW5kIGFib3ZlJzogcmV0dXJuIHJhdGluZyA+PSAxLjA7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgbWF0Y2hEdXJhdGlvbihkdXJhdGlvbkluU2Vjb25kczogbnVtYmVyIHwgc3RyaW5nLCBzZWxlY3RlZFJhbmdlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBob3VycyA9IE51bWJlcihkdXJhdGlvbkluU2Vjb25kcykgLyAzNjAwO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkUmFuZ2VzLnNvbWUocmFuZ2UgPT4ge1xuICAgICAgc3dpdGNoIChyYW5nZSkge1xuICAgICAgICBjYXNlICc8IDEgSG91cic6XG4gICAgICAgICAgcmV0dXJuIGhvdXJzIDwgMTtcbiAgICAgICAgY2FzZSAnMS01IEhvdXJzJzpcbiAgICAgICAgICByZXR1cm4gaG91cnMgPj0gMSAmJiBob3VycyA8PSA1O1xuICAgICAgICBjYXNlICc1KyBIb3Vycyc6XG4gICAgICAgICAgcmV0dXJuIGhvdXJzID4gNTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vLyBDb25maXJtYXRpb24gRGlhbG9nIENvbXBvbmVudFxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncmVnZW5lcmF0ZS1jb25maXJtYXRpb24tZGlhbG9nJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29uZmlybWF0aW9uLWRpYWxvZy1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctaGVhZGVyXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndhcm5pbmctaWNvblwiPnJlZnJlc2g8L21hdC1pY29uPlxuICAgICAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT5SZWdlbmVyYXRlIENvdXJzZSBSZWNvbW1lbmRhdGlvbnM8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJkaWFsb2ctY29udGVudFwiPlxuICAgICAgICA8cCBjbGFzcz1cIm1haW4tbWVzc2FnZVwiPlxuICAgICAgICAgIFRoaXMgd2lsbCBkZWxldGUgYWxsIGN1cnJlbnQgY291cnNlIHJlY29tbWVuZGF0aW9ucyBhbmQgZ2VuZXJhdGUgbmV3IG9uZXMgYmFzZWQgb24gdGhlIGxhdGVzdCByb2xlIG1hcHBpbmcuXG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJzdWItbWVzc2FnZVwiPlxuICAgICAgICAgIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT9cbiAgICAgICAgPC9wPlxuICAgICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICBcbiAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgY2xhc3M9XCJkaWFsb2ctYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBjbGFzcz1cImNhbmNlbC1idG5cIj5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIm9uQ29uZmlybSgpXCIgY2xhc3M9XCJjb25maXJtLWJ0blwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAgICBZZXMsIFJlZ2VuZXJhdGVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5jb25maXJtYXRpb24tZGlhbG9nLWNvbnRhaW5lciB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cbiAgICBcbiAgICAuZGlhbG9nLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIHBhZGRpbmc6IDI0cHggMjRweCAxNnB4IDI0cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UwZTBlMDtcbiAgICB9XG4gICAgXG4gICAgLndhcm5pbmctaWNvbiB7XG4gICAgICBmb250LXNpemU6IDI0cHg7XG4gICAgICB3aWR0aDogMjRweDtcbiAgICAgIGhlaWdodDogMjRweDtcbiAgICAgIGNvbG9yOiAjZmY5ODAwO1xuICAgIH1cbiAgICBcbiAgICBoMiB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMzMzM7XG4gICAgfVxuICAgIFxuICAgIC5kaWFsb2ctY29udGVudCB7XG4gICAgICBwYWRkaW5nOiAyNHB4O1xuICAgIH1cbiAgICBcbiAgICAubWFpbi1tZXNzYWdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIGNvbG9yOiAjMzMzO1xuICAgICAgbWFyZ2luOiAwIDAgMTJweCAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgICB9XG4gICAgXG4gICAgLnN1Yi1tZXNzYWdlIHtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGNvbG9yOiAjNjY2O1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICB9XG4gICAgXG4gICAgLmRpYWxvZy1hY3Rpb25zIHtcbiAgICAgIHBhZGRpbmc6IDE2cHggMjRweCAyNHB4IDI0cHg7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIH1cbiAgICBcbiAgICAuY2FuY2VsLWJ0biB7XG4gICAgICBjb2xvcjogIzY2NjtcbiAgICB9XG4gICAgXG4gICAgLmNvbmZpcm0tYnRuIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBcbiAgICAgIC5tYXQtaWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgICAgd2lkdGg6IDE4cHg7XG4gICAgICAgIGhlaWdodDogMThweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgUmVnZW5lcmF0ZUNvbmZpcm1hdGlvbkRpYWxvZyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxSZWdlbmVyYXRlQ29uZmlybWF0aW9uRGlhbG9nPlxuICApIHsgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKGZhbHNlKTtcbiAgfVxuXG4gIG9uQ29uZmlybSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3LWNicC1wbGFuXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRhaW5lclwiPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBJbml0aWFsIExvYWRpbmcgU2NyZWVuIChmb3IgaW5pdGlhbCBsb2FkIGFuZCByZWdlbmVyYXRpb24pIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5pdGlhbC1sb2FkaW5nLWNvbnRhaW5lclwiICpuZ0lmPVwiIWRhdGFMb2FkZWQgfHwgaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctdGV4dCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+e3sgY3VycmVudFByb2Nlc3NpbmdTdGFnZSB8fCAoaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3MgPyAnUmVnZW5lcmF0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMuLi4nIDogJ0xvYWRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLicpIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZGV0YWlsc1wiICpuZ0lmPVwicHJvZ3Jlc3NQZXJjZW50YWdlID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWluZGljYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwicHJvZ3Jlc3MtdGV4dFwiPnt7IHByb2dyZXNzUGVyY2VudGFnZSB9fSUgQ29tcGxldGU8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lLWVzdGltYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbC10aW1lIGNvdXJzZSBnZW5lcmF0aW9uIGluIHByb2dyZXNzLiBUaGlzIG1heSB0YWtlIDEtMiBtaW51dGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBNYWluIENvbnRlbnQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRlbnRcIiAqbmdJZj1cImRhdGFMb2FkZWQgJiYgIWlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nXCI+U2F2ZSBDb3Vyc2VzICg8c3Bhbj57e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm9yZ05hbWV9fSA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWUgXCI+LyB7e3BsYW5EYXRhPy5kZXNpZ25hdGlvbl9uYW1lfX08L3NwYW4+PC9zcGFuPik8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlZ2VuZXJhdGUtYnRuXCIgKGNsaWNrKT1cInJlZ2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWdlbmVyYXRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFpc1JlZ2VuZXJhdGluZ1wiPnJlZnJlc2g8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJpc1JlZ2VuZXJhdGluZ1wiIGRpYW1ldGVyPVwiMjBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2lzUmVnZW5lcmF0aW5nID8gJ1JlZ2VuZXJhdGluZy4uLicgOiAnUmVnZW5lcmF0ZSBSZWNvbW1lbmRhdGlvbnMnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGNsb3NlLWJ0blwiIChjbGljayk9XCJjbG9zZURpYWxvZygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNvbnRhaW5lciBtdC00XCI+XG4gICAgICAgICAgICA8bWF0LXRhYi1ncm91cCAoc2VsZWN0ZWRUYWJDaGFuZ2UpPVwib25PdXRlclRhYkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBGaXJzdCBNYWluIFRhYiAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cImNvdXJzZSByZWNvbW1lbmRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIE5lc3RlZCBUYWJzIC0tPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtdGFiLWdyb3VwIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJvbklubmVyVGFiQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiYWxsXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiYmVoYXZpb3VyYWxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJmdW5jdGlvbmFsXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiZG9tYWluXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPiAtLT5cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNlY29uZCBNYWluIFRhYiAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cImdhcCBhbmFseXNpc1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxwPkdhcCBhbmFseXNpcyBjb250ZW50IGdvZXMgaGVyZTwvcD4gLS0+XG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgY2xhc3M9XCJmaWx0ZXJzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvbGUtbWFwcGluZy1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3V0ZXJUYWJBY3RpdmVJbmRleCA9PT0gMCAmJiAoaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMCB8fCBpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAxIHx8IGlubmVyVGFiQWN0aXZlSW5kZXggPT09IDIgfHwgaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMyApXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXItaW1wcm92ZWQgbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VhcmNoIENvdXJzZXM8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvbnRhaW5lci1jb21wYWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyc2VhcmNoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzZWFyY2gtaWNvblwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzaW5wdXQtY29tcGFjdFwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFwcGx5RmlsdGVyKCRldmVudC50YXJnZXQudmFsdWUpO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggQ291cnNlc1wiIHR5cGU9XCJ0ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgQ29tcGV0ZW5jeTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckZvcm0udmFsdWUuY29tcGV0ZW5jeT8ubGVuZ3RoID8gJycgOiAnQ29tcGV0ZW5jeScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb21wZXRlbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cInNlbGVjdC1zZWFyY2gtcGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImFwcGx5RmlsdGVycygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDVweDt3aWR0aDogOTIlO21hcmdpbjogNXB4O1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggQ29tcGV0ZW5jeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAnY29tcGV0ZW5jeScpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWRDb21wZXRlbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgUmF0aW5nPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckZvcm0udmFsdWUucmF0aW5nPy5sZW5ndGggPyAnJyA6ICdSYXRpbmcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmF0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cInNlbGVjdC1zZWFyY2gtcGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImFwcGx5RmlsdGVycygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDVweDt3aWR0aDogOTIlO21hcmdpbjogNXB4O1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggUmVhdGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckxpc3QoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgJ3JhdGluZycpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWRSYXRpbmdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyLWltcHJvdmVkLXNlYy0yIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYW5kLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VsZWN0IExhbmd1YWdlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckZvcm0udmFsdWUubGFuZ3VhZ2U/Lmxlbmd0aCA/ICcnIDogJ0xhbmd1YWdlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cInNlbGVjdC1zZWFyY2gtcGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImFwcGx5RmlsdGVycygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDVweDt3aWR0aDogOTIlO21hcmdpbjogNXB4O1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggTGFuZ3VhZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJMaXN0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdsYW5ndWFnZScpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWRMYW5ndWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgRHVyYXRpb248L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5kdXJhdGlvbj8ubGVuZ3RoID8gJycgOiAnRHVyYXRpb24nIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBEdXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAnZHVyYXRpb24nKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmFsdWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkRHVyYXRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYW5kLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2VsZWN0IFByb3ZpZGVyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckZvcm0udmFsdWUucHJvdmlkZXI/Lmxlbmd0aCA/ICcnIDogJ1Byb3ZpZGVyJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb3ZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cInNlbGVjdC1zZWFyY2gtcGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImFwcGx5RmlsdGVycygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIGJveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDVweDt3aWR0aDogOTIlO21hcmdpbjogNXB4O1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggUHJvdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckxpc3QoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgJ3Byb3ZpZGVyJylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZFByb3ZpZGVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogNDVweDttYXJnaW4tbGVmdDogMjBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJidG4tYWN0aXZlXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiUmVzZXQgQWxsIEZpbHRlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXJzKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzAwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcmVkIENvdXJzZSBDb3VudCA6IHt7ZmlsdGVyZENvdXJzZXM/Lmxlbmd0aH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01IHN1Yi1oZWFkaW5nIHNlbGVjdC1hbGwtY29udGFpbmVyXCIgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJmYWxzZVwiIChjaGFuZ2UpPVwic2VsZWN0QWxsQ291cnNlcygkZXZlbnQpXCI+U2VsZWN0IEFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Vyc2VzPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAtY29tcGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJBZGQgTW9yZSBDb3Vyc2UgRnJvbSBpR09UXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdWdnZXN0TW9yZUNvdXJzZXMoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtkaXNhYmxlZF09XCJzZWxlY3RGaWx0ZXJDb3Vyc2VzPy5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdEZpbHRlckNvdXJzZXM/Lmxlbmd0aCA+IDAgPyAnYnRuLWFjdGl2ZScgOiAnYnRuLWRpc2FibGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBbdmFsdWVdPVwibW9kZSA9PT0gJ2FkZCcgPyAnU2F2ZSBDb3Vyc2VzJyA6ICdVcGRhdGUgQ291cnNlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVDb3Vyc2VzKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyLWNvbnRhaW5lciBtdC0yXCIgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci1tZXNzYWdlIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPkRpc2NsYWltZXI6PC9zdHJvbmc+IFBsZWFzZSB2ZXJpZnkgdGhlIHB1YmxpYyBjb3Vyc2UgVVJMIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIHBsYW4uXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWxpc3QtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpbm5lclRhYkFjdGl2ZUluZGV4ID4gMCA/ICdjb3Vyc2UtbGlzdC1jb250YWluZXItZmxleCc6J2NvdXJzZS1saXN0LWNvbnRhaW5lci1yaWdodC1mbGV4JyBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwID8gJ2xlZnQtcGFuZWwnOicnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Db21wZXRlbmNpZXMgaW4gQmVoYXZpb3VyYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZW1lLWZpbHRlci1jb250cm9scyBtYi0yXCIgKm5nSWY9XCJzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbGVhci1maWx0ZXItYnRuXCIgKGNsaWNrKT1cImNsZWFyVGhlbWVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj4gQ2xlYXIgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnktbGlzdC1pdGVtIGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZC10aGVtZSc6IGlzVGhlbWVTZWxlY3RlZChpdGVtKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBpbiBGdW5jdGlvbmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGVtZS1maWx0ZXItY29udHJvbHMgbWItMlwiICpuZ0lmPVwic2VsZWN0ZWRUaGVtZUZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2xlYXItZmlsdGVyLWJ0blwiIChjbGljayk9XCJjbGVhclRoZW1lRmlsdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+IENsZWFyIEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJmaWx0ZXJPbkNvbXBldGVuY3lUaGVtZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhdGVnb3J5LWxpc3QtaXRlbSBjdXJzb3ItcG9pbnRlciBtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtdGhlbWUnOiBpc1RoZW1lU2VsZWN0ZWQoaXRlbSl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Db21wZXRlbmNpZXMgaW4gRG9tYWluPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGVtZS1maWx0ZXItY29udHJvbHMgbWItMlwiICpuZ0lmPVwic2VsZWN0ZWRUaGVtZUZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2xlYXItZmlsdGVyLWJ0blwiIChjbGljayk9XCJjbGVhclRoZW1lRmlsdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+IENsZWFyIEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJmaWx0ZXJPbkNvbXBldGVuY3lUaGVtZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnktbGlzdC1pdGVtIGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLXRoZW1lJzogaXNUaGVtZVNlbGVjdGVkKGl0ZW0pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwID8gJ3JpZ2h0LXBhbmVsJzoncmlnaHQtcGFuZWwtZmxleCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gQ291cnNlIEZvdW5kIE1lc3NhZ2UgaW4gUmlnaHQgUGFuZWwgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWZvdW5kLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoID09PSAwICYmIHNlbGVjdGVkVGhlbWVGaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWNvdXJzZS1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoX29mZjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5ObyBDb3Vyc2VzIEZvdW5kPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vIGNvdXJzZXMgZm91bmQgZm9yIHRoZSBzZWxlY3RlZCB0aGVtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7c2VsZWN0ZWRUaGVtZUZpbHRlcn19PC9zdHJvbmc+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+V291bGQgeW91IGxpa2UgdG8gYWRkIGEgY291cnNlIGZvciB0aGlzIGNvbXBldGVuY3k/PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Z2dlc3QtY291cnNlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvdXJzZUZvclNlbGVjdGVkVGhlbWUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGRfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgQ291cnNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb3Vyc2VzIExpc3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWxpc3QtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmRDb3Vyc2VzO2xldCBpPWluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2VkLWNvdXJzZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImNoZWNrSWZDb3Vyc2VFeGlzdHMoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEZpbHRlckNvdXJzZXMoJGV2ZW50LCBpdGVtKVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvY291cnNlLnN2Z1wiPjwvc3Bhbj4mbmJzcDs8c3Bhbj5Db3Vyc2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZVwiPkFJIFJlY29tbWVuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5pc19wdWJsaWNcIj4gLSBQdWJsaWM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbT8uaXNfcHVibGljXCI+IC0gaUdPVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWl0ZW0/LnJhdGlvbmFsZVwiPk1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1Q8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8ucmF0aW9uYWxlICYmICFpdGVtPy5pc19wdWJsaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JlZW4tdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFJIFJlY29tbWVuZGVkIC0gaUdPVCA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8ucmF0aW9uYWxlICYmIGl0ZW0/LmlzX3B1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZCAtIFB1YmxpYyA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWl0ZW0/LnJhdGlvbmFsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyYXktdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1QgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj48c3Bhbj5QbGF0Zm9ybSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UHJvdmlkZXIgLSB7e2l0ZW0/Lm9yZ2FuaXNhdGlvbn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLXRpdGxlIG10LTMgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicmVkaXJlY3RUb1RvYyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5jb3Vyc2VcIj57e2l0ZW0/LmNvdXJzZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIml0ZW0/Lm5hbWVcIj57e2l0ZW0/Lm5hbWV9fSoqKio8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiIChjbGljayk9XCJyZWRpcmVjdFRvVG9jKGl0ZW0pXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOHB4XCIgd2lkdGg9XCIxOHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL3JlZGlyZWN0LnBuZ1wiIC8+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1kZXNjIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJpdGVtPy5yYXRpb25hbGVcIj57e2l0ZW0/LnJhdGlvbmFsZX19PC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uZGVzY3JpcHRpb25cIj57e2l0ZW0/LmRlc2NyaXB0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdCZWhhdmlvdXJhbCcsaSk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktc3ViLWhlYWRpbmdcIj5CZWhhdmlvdXJhbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYmVoYXZpb3VyYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnQmVoYXZpb3VyYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0XCI+IHt7IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5jb21wZXRlbmN5U3ViVGhlbWVOYW1lIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdCZWhhdmlvdXJhbCcsaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnQmVoYXZpb3VyYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdCZWhhdmlvdXJhbCcsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZW1haW5pbmdDb3VudCgnQmVoYXZpb3VyYWwnLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdGdW5jdGlvbmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3QgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZ1bmN0aW9uYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0Z1bmN0aW9uYWwnLGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93LW1vcmUtY29tcGV0ZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb21wZXRlbmNpZXMoJ0Z1bmN0aW9uYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdGdW5jdGlvbmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdGdW5jdGlvbmFsJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdJZj1cImdldENvbXBldGVuY2llc0J5VHlwZSgnRG9tYWluJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkRvbWFpbiBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZG9tYWluLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29tcCBvZiBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXMoJ0RvbWFpbicsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0RvbWFpbicsaSlcIiBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRG9tYWluJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXNFeHBhbmRlZCgnRG9tYWluJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdEb21haW4nLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVsZXZhbmN5IGFuZCBEdXJhdGlvbiBzZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtZm9vdGVyXCIgKm5nSWY9XCJpdGVtPy5yZWxldmFuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5SZWxldmFuY3k8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPnt7aXRlbT8ucmVsZXZhbmN5fX0lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3ktcGlsbC1ncmVlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5XCI+RHVyYXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtPy5kdXJhdGlvblwiPnt7Z2V0RHVyYXRpb24oaXRlbT8uZHVyYXRpb24pfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIShpdGVtPy5kdXJhdGlvbilcIj5OL0E8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEdlbmVyYWwgTm8gRGF0YSBNZXNzYWdlIChvbmx5IHdoZW4gbm8gdGhlbWUgZmlsdGVyIGlzIGFjdGl2ZSkgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHN1Yi1oZWFkaW5nXCIgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoID09PSAwICYmICFzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5ObyBEYXRhIEZvdW5kPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9sZS1tYXBwaW5nLWNvbnRhaW5lclwiICpuZ0lmPVwib3V0ZXJUYWJBY3RpdmVJbmRleCA9PT0gMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJnYXAtYW5hbHlzaXMtY29udGVudFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1wZGYgbXQtNCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJEb3dubG9hZFwiIChjbGljayk9XCJkb3dubG9hZFBERigpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImlzUERGRG93bmxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGRmLWhlYWRpbmdcIj57e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm5hbWV9fSA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZSBcIj5fe3twbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZX19X0dhcF9BbmFseXNpczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdmgtMTAwXCIgW25nQ2xhc3NdPVwiaXNQREZEb3dubG9hZCA/ICdtdC00JzonJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2lkZWJhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHAtMyBiZy1saWdodCBib3JkZXItZW5kXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTRcIj5BbmFseXplIGJ5IENhdGVnb3J5PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZW51SXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtYi0yIHRleHQtc3RhcnQgbWVudS1saXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENhdGVnb3J5ID09PSBpdGVtLmtleVwiIChjbGljayk9XCJzZWxlY3RDYXRlZ29yeShpdGVtLmtleSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTMgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zIGdyYXktYmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxhYmVsIHN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBDb3ZlcmVkPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIj57e2NvbXBldGVuY3lDb3ZlcmVkQ291bnR9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zIGdyYXktYmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxhYmVsIHN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2FsbCdcIj5Ub3RhbCBDb21wZXRlbmNpZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+VG90YWwgQmVoYXZpb3VyYWwgQ29tcGV0ZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCdcIj5Ub3RhbCBGdW5jdGlvbmFsIENvbXBldGVuY2llc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbidcIj5Ub3RhbCBEb21haW4gQ29tcGV0ZW5jaWVzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGh9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdiZWhhdmlvcmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2JlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llc319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2Z1bmN0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RvbWFpblRvdGFsQ29tcGV0ZW5jaWVzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMyBncmVlbi1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWxcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnXCI+T3ZlcmFsbCBDb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWxcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdiZWhhdmlvcmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWhhdmlvdXJhbCBDb3ZlcmFnZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWxcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbmFsIENvdmVyYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbidcIj5Eb21haW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ292ZXJhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e292ZXJhbGxDb3ZlcmFnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YmVoYXZpb3JhbENvdmVyYWdlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmdW5jdGlvbmFsQ292ZXJhZ2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdkb21haW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZG9tYWluQ292ZXJhZ2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCBhbGwtY2F0ZWdvcnktbGlzdFwiIFtuZ1N3aXRjaF09XCJzZWxlY3RlZENhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInYWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5BbGwgQ2F0ZWdvcmllczwvaDQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNob3cgQmVoYXZpb3VyYWwgc2VjdGlvbiBvbmx5IGlmIHRoZXJlIGFyZSB1bm1hdGNoZWQgYmVoYXZpb3VyYWwgY29tcGV0ZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJiZWhhdmlvdXJhbE5vdE1hdGNoZWQgJiYgYmVoYXZpb3VyYWxOb3RNYXRjaGVkLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CZWhhdmlvdXJhbDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiZWhhdmlvdXJhbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnQmVoYXZpb3JhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Vyc2U8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IEZ1bmN0aW9uYWwgc2VjdGlvbiBvbmx5IGlmIHRoZXJlIGFyZSB1bm1hdGNoZWQgZnVuY3Rpb25hbCBjb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZ1bmN0aW9uYWxOb3RNYXRjaGVkICYmIGZ1bmN0aW9uYWxOb3RNYXRjaGVkLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5GdW5jdGlvbmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0Z1bmN0aW9uYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBEb21haW4gc2VjdGlvbiBvbmx5IGlmIHRoZXJlIGFyZSB1bm1hdGNoZWQgZG9tYWluIGNvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiICpuZ0lmPVwiZG9tYWluTm90TWF0Y2hlZCAmJiBkb21haW5Ob3RNYXRjaGVkLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Eb21haW48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtIHwgdGl0bGVjYXNlfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdEb21haW4nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBtZXNzYWdlIHdoZW4gYWxsIGNvbXBldGVuY2llcyBhcmUgY292ZXJlZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKCFiZWhhdmlvdXJhbE5vdE1hdGNoZWQgfHwgYmVoYXZpb3VyYWxOb3RNYXRjaGVkLmxlbmd0aCA9PT0gMCkgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWZ1bmN0aW9uYWxOb3RNYXRjaGVkIHx8IGZ1bmN0aW9uYWxOb3RNYXRjaGVkLmxlbmd0aCA9PT0gMCkgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWRvbWFpbk5vdE1hdGNoZWQgfHwgZG9tYWluTm90TWF0Y2hlZC5sZW5ndGggPT09IDApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1nYXBzLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInN1Y2Nlc3MtaWNvblwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+RXhjZWxsZW50ISBBbGwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFsbCByZXF1aXJlZCBjb21wZXRlbmNpZXMgaGF2ZSBiZWVuIGFkZHJlc3NlZCBieSB0aGUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3Vyc2VzLjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInYmVoYXZpb3JhbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+QmVoYXZpb3VyYWw8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJiZWhhdmlvcmFsQ292ZXJhZ2UgIT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CZWhhdmlvdXJhbDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiZWhhdmlvdXJhbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnQmVoYXZpb3JhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3IENvdXJzZSA8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJiZWhhdmlvcmFsQ292ZXJhZ2UgPT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U4ZjVlODsgYm9yZGVyOiAxcHggc29saWQgIzRjYWY1MDsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICMyZTdkMzI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn46JIEV4Y2VsbGVudCEgQWxsIGJlaGF2aW9yYWwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNvdXJzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2Z1bmN0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkZ1bmN0aW9uYWw8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJmdW5jdGlvbmFsQ292ZXJhZ2UgIT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5GdW5jdGlvbmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW19fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0Z1bmN0aW9uYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ldyBDb3Vyc2U8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJmdW5jdGlvbmFsQ292ZXJhZ2UgPT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U4ZjVlODsgYm9yZGVyOiAxcHggc29saWQgIzRjYWY1MDsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICMyZTdkMzI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn46JIEV4Y2VsbGVudCEgQWxsIGZ1bmN0aW9uYWwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNvdXJzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RvbWFpbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+RG9tYWluPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiICpuZ0lmPVwiZG9tYWluQ292ZXJhZ2UgIT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Eb21haW48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdEb21haW4nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ldyBDb3Vyc2UgPC9zcGFuPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiICpuZ0lmPVwiZG9tYWluQ292ZXJhZ2UgPT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U4ZjVlODsgYm9yZGVyOiAxcHggc29saWQgIzRjYWY1MDsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICMyZTdkMzI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn46JIEV4Y2VsbGVudCEgQWxsIGRvbWFpbiBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQgYnkgdGhlIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cnNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIHNlbGVjdCBhIGNhdGVnb3J5LjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gPCEtLSBDbG9zZSBtYWluLWNvbnRlbnQgZGl2IC0tPlxuXG4gICAgPC9kaXY+XG48L2Rpdj5cblxuXG48ZGl2IFtoaWRkZW5dPVwiIWlzUERGRG93bmxvYWRcIiBjbGFzcz1cImdhcC1hbmFseXNpcy1wZGYtY29udGFpbmVyXCIgI3BkZkNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImdhcC1hbmFseXNpcy1wZGYtaGVhZGVyXCI+XG4gICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9rYXJtYXlvZ2lMb2dvLW1pbi5wbmdcIiBhbHQ9XCJLYXJtYXlvZ2kgQmhhcmF0IExvZ29cIiBjbGFzcz1cImxvZ29cIiAvPlxuICAgICAgPGgxPjxzcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJ1wiPnt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWU/Lm5hbWV9fTwvc3Bhbj4gXG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknXCI+e3tzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5uYW1lfX08L3NwYW4+ICAgXG4gICAgICAgIDxzcGFuICpuZ0lmPVwicGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWUgXCI+LyB7e3BsYW5EYXRhPy5kZXNpZ25hdGlvbl9uYW1lfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj48L2gxPlxuICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPkEgZGV0YWlsZWQgYnJlYWtkb3duIG9mIGNvbXBldGVuY2llcyBHYXAgQW5hbHlzaXM8L3A+XG4gICAgIFxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zbmFwc2hvdFwiPlxuICAgICAgPGgyPkNvbXBldGVuY3kgU25hcHNob3Q8L2gyPlxuICAgICAgPGRpdiBjbGFzcz1cInNuYXBzaG90LWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZS13cmFwcGVyXCI+XG4gICAgICAgICAgPHN2ZyBjbGFzcz1cInByb2dyZXNzLXJpbmdcIiB3aWR0aD1cIjEyMFwiIGhlaWdodD1cIjEyMFwiPlxuICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInByb2dyZXNzLXJpbmctYmdcIiBjeD1cIjYwXCIgY3k9XCI2MFwiIHI9XCI1MlwiIC8+XG4gICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicHJvZ3Jlc3MtcmluZy1jaXJjbGVcIiBjeD1cIjYwXCIgY3k9XCI2MFwiIHI9XCI1MlwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2UtdGV4dFwiPnt7b3ZlcmFsbENvdmVyYWdlfX08YnIgLz48c3Bhbj5PdmVyYWxsIENvdmVyYWdlPC9zcGFuPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPCEtLSBUb3RhbCBDb21wZXRlbmNpZXMgQm94IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLWJveFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5Ub3RhbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+e3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gUHJvZ3Jlc3MgQmFycyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHQgYmVoYXZpb3JhbFwiPkJlaGF2aW91cmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY292ZXJlZC10ZXh0XCI+e3tiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudH19IC8ge3tiZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXN9fSBDb3ZlcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1maWxsIGJlaGF2aW9yYWxcIiBbc3R5bGUud2lkdGguJV09XCIoYmVoYXZpb3JhbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyBiZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0IGZ1bmN0aW9uYWxcIj5GdW5jdGlvbmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY292ZXJlZC10ZXh0XCI+e3tmdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudH19IC8ge3tmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXN9fSBDb3ZlcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1maWxsIGZ1bmN0aW9uYWxcIiBbc3R5bGUud2lkdGguJV09XCIoZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyBmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0IGRvbWFpblwiPkRvbWFpbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdmVyZWQtdGV4dFwiPnt7ZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudH19IC8ge3tkb21haW5Ub3RhbENvbXBldGVuY2llc319IENvdmVyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGwgZG9tYWluXCIgW3N0eWxlLndpZHRoLiVdPVwiKGRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyBkb21haW5Ub3RhbENvbXBldGVuY2llcykgKiAxMDBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNsYXNzPVwiZ2FwLXNlY3Rpb24gbWItNFwiPlxuICAgICAgPGgyPkRldGFpbGVkIENvbXBldGVuY3kgQW5hbHlzaXM8L2gyPlxuICAgICAgPGRpdiBjbGFzcz1cImdhcC1ib3hcIj5cbiAgICAgICAgQnJpZGdlIFlvdXIgQ29tcGV0ZW5jaWVzIEdhcFxuICAgICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+SGVyZSBhcmUge3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aCAtIChiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCArIGZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCl9fSBrZXkgYXJlYXMgZm9yIGRldmVsb3BtZW50LjwvcD5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmcgbWItNFwiPlxuICAgICAgICA8cD5HYXAgdG8gQWRkcmVzcyA8c3BhbiAqbmdJZj1cIih0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aCAtIChiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCArIGZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCkpID4gMFwiPih7e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50KX19KTwvc3Bhbj48L3A+XG4gICAgICAgIFxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgYmVoYXZpb3JhbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTm90TWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGVcIj5cbiAgICAgICAgICAmbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGJlaGF2aW9yYWxcIj5CZWhhdmlvdXJhbDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZnVuY3Rpb25hbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICAmbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGZ1bmN0aW9uYWxcIj5GdW5jdGlvbmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jYXJkIGRvbWFpblwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRvbWFpbk5vdE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAgPCEtLSBQcm9qZWN0IE1hbmFnZW1lbnQgIC0tPlxuICAgICAgICAgICZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgZG9tYWluXCI+RG9tYWluPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTRcIj5cbiAgICAgICAgPHA+Q292ZXJlZCBDb21wZXRlbmNpZXMgPHNwYW4+KHt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGggLSAoYmVoYXZpb3VyYWxOb3RNYXRjaGVkPy5sZW5ndGggKyBmdW5jdGlvbmFsTm90TWF0Y2hlZD8ubGVuZ3RoICsgZG9tYWluTm90TWF0Y2hlZD8ubGVuZ3RoKX19KTwvc3Bhbj48L3A+ICAgICAgICBcbiAgICAgPC9kaXY+XG4gICAgIDxkaXYgY2xhc3M9XCJnYXAtc2VjdGlvbiBtYi00XCI+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JlZW4tYmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWwgbWItMlwiPlxuICAgICAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyFcbiAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgIFxuICAgICAgICAgICAgPHA+WW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNvdmVyZWQgPC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj57e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW91cmFsTm90TWF0Y2hlZD8ubGVuZ3RoICsgZnVuY3Rpb25hbE5vdE1hdGNoZWQ/Lmxlbmd0aCArIGRvbWFpbk5vdE1hdGNoZWQ/Lmxlbmd0aCl9fSBrZXkgY29tcGV0ZW5jaWVzLCBmb3JtaW5nIGEgc3Ryb25nIHByb2Zlc3Npb25hbCBmb3VuZGF0aW9uLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jYXJkIGJlaGF2aW9yYWxcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiZWhhdmlvdXJhbE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtPy50aGVtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgIHt7aXRlbT8uc3ViX3RoZW1lfX0mbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGJlaGF2aW9yYWxcIj5CZWhhdmlvdXJhbDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZnVuY3Rpb25hbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxNYXRjaGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7aXRlbT8udGhlbWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGVcIj5cbiAgICAgICAgICAgIHt7aXRlbT8uc3ViX3RoZW1lfX0mbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGZ1bmN0aW9uYWxcIj5GdW5jdGlvbmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jYXJkIGRvbWFpblwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRvbWFpbk1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtPy50aGVtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgIDwhLS0gUHJvamVjdCBNYW5hZ2VtZW50ICAtLT5cbiAgICAgICAgICB7e2l0ZW0/LnN1Yl90aGVtZX19Jm5ic3A7IOKAoiAmbmJzcDtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBkb21haW5cIj5Eb21haW48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FwLXNlY3Rpb24gbWItNFwiPlxuICAgICAgICA8aDI+UmVjb21tZW5kZWQgQ291cnNlczwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxhcHAtZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZSBbcGxhbkRhdGFdPVwicGxhbkRhdGFcIj48L2FwcC1nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlPlxuPC9kaXY+XG4gIFxuXG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZyAmJiBkYXRhTG9hZGVkICYmICFpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRlbnRcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0IG10LTNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+e3sgY3VycmVudFByb2Nlc3NpbmdTdGFnZSB8fCAnUHJlcGFyaW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiBnZW5lcmF0aW9uLi4uJyB9fTwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWluZGljYXRvclwiICpuZ0lmPVwicHJvZ3Jlc3NQZXJjZW50YWdlID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwicHJvZ3Jlc3MtdGV4dFwiPnt7IHByb2dyZXNzUGVyY2VudGFnZSB9fSUgQ29tcGxldGU8L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRpbWUtZXN0aW1hdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgUmVhbC10aW1lIGNvdXJzZSBnZW5lcmF0aW9uIGluIHByb2dyZXNzLiBUaGlzIG1heSB0YWtlIDEtMiBtaW51dGVzLlxuICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
2147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBcUIsU0FBUyxFQUFjLE1BQU0sRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9HLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBRXJHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sUUFBUSxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPbkgsTUFBTSxPQUFPLHFDQUFxQztJQTJCaEQsWUFBbUIsU0FBOEQsRUFDL0MsSUFBUyxFQUFTLGFBQTRC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SUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzsrR0FYVSw0QkFBNEI7bUdBQTVCLDRCQUE0QixzRUFoRzdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVDs7NEZBc0VVLDRCQUE0QjtrQkFsR3hDLFNBQVM7K0JBQ0UsZ0NBQWdDLFlBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgU3VnZ2VzdE1vcmVDb3Vyc2VzQ29tcG9uZW50IH0gZnJvbSAnLi4vc3VnZ2VzdC1tb3JlLWNvdXJzZXMvc3VnZ2VzdC1tb3JlLWNvdXJzZXMuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdFRhYkNoYW5nZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBBZGRDb3Vyc2VDb21wb25lbnQgfSBmcm9tICcuLi9hZGQtY291cnNlL2FkZC1jb3Vyc2UuY29tcG9uZW50JztcbmltcG9ydCBodG1sMnBkZiBmcm9tICdodG1sMnBkZi5qcyc7XG5pbXBvcnQgeyBjb25jYXQsIGludGVydmFsLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlV2hpbGUsIHRhcCwgY2F0Y2hFcnJvciwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVsZXRlLXJvbGUtbWFwcGluZy1wb3B1cC9kZWxldGUtcm9sZS1tYXBwaW5nLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvc2hhcmVkLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWdlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgncGRmQ29udGVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwZGZDb250ZW50ITogRWxlbWVudFJlZjtcbiAgcGxhbkRhdGE6IGFueVxuICBsb2FkaW5nID0gZmFsc2VcbiAgZGF0YUxvYWRlZCA9IGZhbHNlIC8vIFRyYWNrIGlmIGluaXRpYWwgZGF0YSBoYXMgYmVlbiBsb2FkZWRcbiAgaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3MgPSBmYWxzZSAvLyBUcmFjayByZWdlbmVyYXRpb24gd2l0aCBwcm9ncmVzcyBsb2FkaW5nXG4gIHJlY29tbWVuZGVkX2NvdXJzZV9pZCA9ICcnXG5cbiAgLy8gUHJvZ3Jlc3NpdmUgbG9hZGluZyBmb3IgY291cnNlIGdlbmVyYXRpb25cbiAgY3VycmVudFByb2Nlc3NpbmdTdGFnZTogc3RyaW5nID0gJyc7XG4gIHByb2dyZXNzUGVyY2VudGFnZTogbnVtYmVyID0gMDtcbiAgcHJvY2Vzc2luZ1N0YWdlcyA9IFtcbiAgICAnQW5hbHl6aW5nIHJvbGVzIGFuZCByZXNwb25zaWJpbGl0aWVzLi4uJyxcbiAgICAnRGV0YWlsaW5nIGNvbXBldGVuY3kgcmVxdWlyZW1lbnRzLi4uJyxcbiAgICAnUHJlcGFyaW5nIGlHT1QgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLicsXG4gICAgJ0dlbmVyYXRpbmcgcHVibGljIGNvdXJzZSBzdWdnZXN0aW9ucy4uLicsXG4gICAgJ0NvbXB1dGluZyBjb21wcmVoZW5zaXZlIGdhcCBhbmFseXNpcy4uLicsXG4gICAgJ0ZpbmFsaXppbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIHBsYW4uLi4nXG4gIF07XG4gIHN0YWdlU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuICAvLyBUcmFja3MgdGhlIHNpbmdsZSBhY3RpdmUgZmFrZS1wcm9ncmVzcyB0aWNrZXIgKG5vcm1hbCBnZW5lcmF0ZSBvciByZWdlbmVyYXRlKS5cbiAgLy8gTXVzdCBiZSBleHBsaWNpdGx5IGNsZWFyZWQgd2hlcmV2ZXIgdGhlIGRpc3BsYXkgaXMgZmluYWxpemVkL3Jlc2V0IGluc3RlYWQgb2ZcbiAgLy8gbGV0dGluZyB0aGUgaW50ZXJ2YWwgaW5mZXIgY29tcGxldGlvbiBmcm9tIGBsb2FkaW5nYC9gaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3NgXG4gIC8vICh0aG9zZSBmbGFncyBmbGlwIGZvciByZWFzb25zIG90aGVyIHRoYW4gcmVhbCBjb21wbGV0aW9uLCBlLmcuIHRoZVxuICAvLyBcInJlY29tbWVuZGF0aW9ucyBhbHJlYWR5IGV4aXN0XCIgcGF1c2UsIHdoaWNoIHByZXZpb3VzbHkgY2F1c2VkIHRoZSBwcm9ncmVzc1xuICAvLyBkaXNwbGF5IHRvIGp1bXAgdG8gMTAwJSBhbmQgdGhlbiByZXNldCBiYWNrIHRvIDAlKS5cbiAgcHJpdmF0ZSBwcm9ncmVzc1RpbWVySWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8R2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksIHB1YmxpYyBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLCBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnBsYW5EYXRhID0gZGF0YVxuICB9XG4gIHNlYXJjaFRleHQgPSAnJ1xuICBmaWx0ZXJkQ291cnNlczogYW55ID0gW11cbiAgb3JpZ2luYWxEYXRhOiBhbnkgPSBbXVxuICBzZWxlY3RGaWx0ZXJDb3Vyc2VzOiBhbnkgPSBbXVxuICBzdWdnZXN0ZWRDb3Vyc2VzOiBhbnkgPSBbXSAvLyBUcmFjayBpR09UIHN1Z2dlc3RlZCBjb3Vyc2VzIHNlcGFyYXRlbHlcbiAgdXNlckFkZGVkQ291cnNlczogYW55ID0gW10gLy8gVHJhY2sgdXNlci1hZGRlZCBjb3Vyc2VzIHNlcGFyYXRlbHlcbiAgbW9kZSA9ICdhZGQnXG4gIGNicF9wbGFuX2lkID0gJydcbiAgZXhwYW5kZWRDb21wZXRlbmNpZXM6IGFueSA9IHt9OyAvLyBUcmFjayBleHBhbmRlZCBzdGF0ZSBmb3IgZWFjaCBjb3Vyc2UgYW5kIGNvbXBldGVuY3kgdHlwZVxuICBvdXRlclRhYkFjdGl2ZUluZGV4ID0gMFxuICBpbm5lclRhYkFjdGl2ZUluZGV4ID0gMFxuICBvdXRlclRhYkFjdGl2ZVRleHQgPSAnYWxsJ1xuICBpbm5lclRhYkFjdGl2ZVRleHQgPSAnYWxsJ1xuICBzZWxlY3RlZENhdGVnb3J5ID0gJ2FsbCc7XG4gIGNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSAwXG4gIG92ZXJhbGxDb3ZlcmFnZTogYW55ID0gMFxuICBiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IDBcbiAgYmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzID0gMFxuICBiZWhhdmlvcmFsQ292ZXJhZ2U6IGFueSA9IDBcbiAgZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSAwXG4gIGZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcyA9IDBcbiAgZnVuY3Rpb25hbENvdmVyYWdlOiBhbnkgPSAwXG4gIGRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSAwXG4gIGRvbWFpblRvdGFsQ29tcGV0ZW5jaWVzID0gMFxuICBkb21haW5Db3ZlcmFnZTogYW55ID0gMFxuICBjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSBbXVxuICBjb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSBbXVxuICBtZW51SXRlbXMgPSBbXG4gICAgeyBrZXk6ICdhbGwnLCBsYWJlbDogJ0FsbCBDYXRlZ29yaWVzJyB9LFxuICAgIHsga2V5OiAnYmVoYXZpb3JhbCcsIGxhYmVsOiAnQmVoYXZpb3VyYWwnIH0sXG4gICAgeyBrZXk6ICdmdW5jdGlvbmFsJywgbGFiZWw6ICdGdW5jdGlvbmFsJyB9LFxuICAgIHsga2V5OiAnZG9tYWluJywgbGFiZWw6ICdEb21haW4nIH1cbiAgXTtcbiAgYmVoYXZpb3VyYWxOb3RNYXRjaGVkID0gW11cbiAgZnVuY3Rpb25hbE5vdE1hdGNoZWQgPSBbXVxuICBkb21haW5Ob3RNYXRjaGVkID0gW11cbiAgc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnXG4gIG9yaWdpbmFsRmlsdGVyZWRDb3Vyc2VzID0gW11cbiAgaXNSZWdlbmVyYXRpbmcgPSBmYWxzZVxuICBpc1BERkRvd25sb2FkID0gZmFsc2VcbiAgYmVoYXZpb3VyYWxNYXRjaGVkID0gW11cbiAgZnVuY3Rpb25hbE1hdGNoZWQgPSBbXVxuICBkb21haW5NYXRjaGVkID0gW11cbiAgZmlsdGVyRm9ybSE6IEZvcm1Hcm91cDtcbiAgY29tcGV0ZW5jaWVzVHlwZSA9IFsnQWxsJywgJ0JlaGF2aW91cmFsJywgJ0Z1bmN0aW9uYWwnLCAnRG9tYWluJ11cbiAgcmF0aW5ncyA9IFsnNC41IGFuZCBhYm92ZScsICc0LjAgYW5kIGFib3ZlJywgJzMuNSBhbmQgYWJvdmUnLCAnMi41IGFuZCBhYm92ZScsICcxIGFuZCBhYm92ZSddO1xuICBsYW5ndWFnZXMgPSBbJ0VuZ2xpc2gnLCAnSGluZGknLCAnVGFtaWwnLCAnS2FubmFkYScsICdUZWx1Z3UnLCAnTWFsYXlhbGFtJywgJ0Fzc2FtZXNlJywgJ0JlbmdhbGknLCAnR3VqYXJhdGknLCAnTWFyYXRoaScsICdPZGlhJywgJ1B1bmphYmknLCAnS29ua2FuaScsICdCb2RvJywgJ0RvZ3JpJywgJ0thc2htaXJpJywgJ01haXRoaWxpJywgJ01hbmlwdXJpJywgJ05lcGFsaScsICdTYW5za3JpdCcsICdTYW50YWxpJywgJ1NpbmRoaScsICdVcmR1J107XG4gIGR1cmF0aW9ucyA9IFsnPCAxIEhvdXInLCAnMS01IEhvdXJzJywgJzUrIEhvdXJzJ107XG4gIHByb3ZpZGVycyA9IFtdO1xuICBmaWx0ZXJlZENvbXBldGVuY3kgPSBbLi4udGhpcy5jb21wZXRlbmNpZXNUeXBlXTtcbiAgZmlsdGVyZWRSYXRpbmdzID0gWy4uLnRoaXMucmF0aW5nc107XG4gIGZpbHRlcmVkTGFuZ3VhZ2VzID0gWy4uLnRoaXMubGFuZ3VhZ2VzXTtcbiAgZmlsdGVyZWREdXJhdGlvbnMgPSBbLi4udGhpcy5kdXJhdGlvbnNdO1xuICBmaWx0ZXJlZFByb3ZpZGVycyA9IFsuLi50aGlzLnByb3ZpZGVyc107XG4gIGZ1bGxDb3Vyc2VMaXN0ID0gW11cbiAgLy8gU2VsZWN0ZWQgZmlsdGVyc1xuICBzZWxlY3RlZENvbXBldGVuY3kgPSAnQWxsJztcbiAgc2VsZWN0ZWRSYXRpbmc6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZWxlY3RlZExhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWREdXJhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkUHJvdmlkZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBmaXJzdEFwaVJlc3BvbnNlOiBhbnkgPSBudWxsXG4gIGV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RFbnJpY2hlZElkZW50aWZpZXJzS2V5ID0gJyc7IC8vIEd1YXJkcyBkdXBsaWNhdGUgY2FsbHMgdG8gdGhlIGNvdXJzZSBzdWdnZXN0aW9ucyBBUElcbiAgc2VsZWN0Q2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMuZ2FwQW5hbHlzaXNTdGF0cygpXG4gIH1cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wZXRlbmN5OiBbW11dLFxuICAgICAgcmF0aW5nOiBbW11dLFxuICAgICAgbGFuZ3VhZ2U6IFtbXV0sXG4gICAgICBkdXJhdGlvbjogW1tdXSxcbiAgICAgIHByb3ZpZGVyOiBbW11dXG4gICAgfSk7XG4gICAgdGhpcy5sb2FkQ29tcG9uZW50RGF0YSgpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIodmFsdWU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLnNlYXJjaFRleHQnLCB2YWx1ZSlcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB2YWx1ZVxuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLmZpbHRlckRhdGEodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG4gICAgLy8gIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLmZpbHRlckRhdGEodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIHNlbGVjdGVkRmlsdGVyQ291cnNlcyhldmVudCwgaXRlbSkge1xuICAgIGNvbnNvbGUubG9nKCdldmVudCcsIGV2ZW50KVxuICAgIGNvbnNvbGUubG9nKCdpdGVtJywgaXRlbSlcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpIDwgMCkge1xuICAgICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMucHVzaChpdGVtPy5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5maW5kSW5kZXgoXG4gICAgICAgIGNvbnRyb2wgPT4gY29udHJvbCA9PT0gaXRlbS5pZGVudGlmaWVyXG4gICAgICApO1xuXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzJywgdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzKVxuICB9XG5cbiAgY2xvc2VEaWFsb2coKSB7XG4gICAgdGhpcy5zdG9wUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdG9wUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgZmFrZS1wcm9ncmVzcyB0aWNrZXIgKHNoYXJlZCBieSBnZW5lcmF0ZSBhbmQgcmVnZW5lcmF0ZSBmbG93cykuXG4gICAqIENhbGxlcnMgZGVjaWRlIHdoYXQgcHJvZ3Jlc3NQZXJjZW50YWdlL2N1cnJlbnRQcm9jZXNzaW5nU3RhZ2Ugc2hvdWxkIGJlXG4gICAqIGFmdGVyd2FyZHMgLSB0aGlzIG9ubHkgc3RvcHMgaXQgZnJvbSBjb250aW51aW5nIHRvIHRpY2sgYW5kIG92ZXJ3cml0ZSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBzdG9wUHJvZ3Jlc3NpdmVMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLnByb2dyZXNzVGltZXJJZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnByb2dyZXNzVGltZXJJZCk7XG4gICAgICB0aGlzLnByb2dyZXNzVGltZXJJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNvdXJzZXMoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLnBsYW5EYXRhJywgdGhpcy5wbGFuRGF0YSlcbiAgICBsZXQgcmVxQm9keSA9IHtcbiAgICAgIFwicm9sZV9tYXBwaW5nX2lkXCI6IHRoaXMucGxhbkRhdGEuaWQsXG4gICAgICBcInJlY29tbWVuZGVkX2NvdXJzZV9pZFwiOiB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCxcbiAgICAgIFwiY291cnNlX2lkZW50aWZpZXJzXCI6IHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlc1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygncmVxQm9keSwgJywgcmVxQm9keSlcbiAgICBpZiAodGhpcy5tb2RlID09PSAnYWRkJykge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNhdmVDb3Vyc2UocmVxQm9keSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvdXJzZXMgU2F2ZWQgU3VjY2Vzc2Z1bGx5JywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICAgICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgICAgLy90aGlzLmdldFxuICAgICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2JwX3BsYW5faWQpIHtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZUNvdXJzZShyZXFCb2R5LCB0aGlzLmNicF9wbGFuX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIHJlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignQ291cnNlcyBVcGRhdGVkIFN1Y2Nlc3NmdWxseScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICAgICAgICAvLyBIYW5kbGUgNDA5IENvbmZsaWN0IGhlcmVcbiAgICAgICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgICAgICAvLyBPciB5b3UgY2FuIHNldCBhIFVJIGVycm9yIG1lc3NhZ2UgdmFyaWFibGVcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIC8vdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiBjYnBfcGxhbl9pZCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NicF9wbGFuX2lkIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwZGF0ZSBvcGVyYXRpb24nKTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gdXBkYXRlIGNvdXJzZXM6IG1pc3NpbmcgcGxhbiBJRCcsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIH1cblxuICB9XG5cbiAgZ2V0Q291cnNlcygpIHtcbiAgICBsZXQgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZFxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICB0aGlzLmNicF9wbGFuX2lkID0gcmVzPy5pZFxuICAgICAgICBpZiAocmVzICYmIHJlcz8uc2VsZWN0ZWRfY291cnNlcyAmJiByZXM/LnNlbGVjdGVkX2NvdXJzZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubW9kZSA9ICdlZGl0J1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzPy5zZWxlY3RlZF9jb3Vyc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMucHVzaChyZXMuc2VsZWN0ZWRfY291cnNlc1tpXT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAvLyBhbGVydCgnQ29uZmxpY3QgZGV0ZWN0ZWQ6IFRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBvciBhY3Rpb24gY29uZmxpY3RzLicpO1xuICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIH1cblxuXG4gICAgfSlcbiAgfVxuICBnZXRTdWdnZXN0ZWRDb3Vyc2UoKSB7XG4gICAgbGV0IHJvbGVfbWFwcGluZ19pZCA9IHRoaXMucGxhbkRhdGEuaWRcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFN1Z2dlc3RlZENvdXJzZXMocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKCdnZXRTdWdnZXN0ZWRDb3Vyc2VzIHJlcycsIHJlcylcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZENvdXJzZXMnLCB0aGlzLmZpbHRlcmRDb3Vyc2VzKVxuICAgICAgICAvLyBTdG9yZSBzdWdnZXN0ZWQgY291cnNlcyBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuc3VnZ2VzdGVkQ291cnNlcyA9IFsuLi5yZXNdO1xuXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkQ291cnNlcygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHMgYWZ0ZXIgc3VnZ2VzdGVkIGNvdXJzZXMgYXJlIGFkZGVkXG4gICAgICAgIHRoaXMudXBkYXRlR2FwQW5hbHlzaXNBZnRlckNvdXJzZXNVcGRhdGUoKVxuICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1VuYXV0aG9yaXplZCBhY2Nlc3MgLSB1c2VyIHdpbGwgYmUgcmVkaXJlY3RlZCB0byBsb2dpbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHN1Z2dlc3RlZCBjb3Vyc2VzJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuXG5cbiAgICB9KVxuICB9XG5cbiAgZ2V0VXNlckNvdXJzZSgpIHtcbiAgICBsZXQgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZFxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0VXNlckNvdXJzZShyb2xlX21hcHBpbmdfaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFVzZXJDb3Vyc2UgQVBJIHJlc3BvbnNlOicsIHJlcylcbiAgICAgICAgY29uc29sZS5sb2coJ0N1cnJlbnQgZmlsdGVyZENvdXJzZXMgYmVmb3JlIGFkZGluZyB1c2VyIGNvdXJzZXM6JywgdGhpcy5maWx0ZXJkQ291cnNlcylcblxuICAgICAgICAvLyBTdG9yZSB1c2VyLWFkZGVkIGNvdXJzZXMgc2VwYXJhdGVseSAocmVzZXQgdG8gYXZvaWQgZHVwbGljYXRlcylcbiAgICAgICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzID0gWy4uLnJlc107XG5cbiAgICAgICAgLy8gUHJvY2VzcyB1c2VyLWFkZGVkIGNvdXJzZXMgdG8gZW5zdXJlIHByb3BlciBzdHJ1Y3R1cmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyQ291cnNlID0gcmVzW2ldO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBVc2VyIGNvdXJzZSAke2l9IGNvbXBldGVuY2llczpgLCB1c2VyQ291cnNlLmNvbXBldGVuY2llcyk7XG5cbiAgICAgICAgICAvLyBFbnN1cmUgdXNlci1hZGRlZCBjb3Vyc2VzIGhhdmUgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBmb3IgZGlzcGxheVxuICAgICAgICAgIGlmICh1c2VyQ291cnNlICYmICF1c2VyQ291cnNlLmNvdXJzZV90eXBlKSB7XG4gICAgICAgICAgICB1c2VyQ291cnNlLmNvdXJzZV90eXBlID0gJ1VzZXIgQWRkZWQnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBpZGVudGlmaWVyIGlmIG1pc3NpbmcgKG5lZWRlZCBmb3IgY291cnNlIHNlbGVjdGlvbiBsb2dpYylcbiAgICAgICAgICBpZiAodXNlckNvdXJzZSAmJiAhdXNlckNvdXJzZS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB1c2VyQ291cnNlLmlkZW50aWZpZXIgPSB1c2VyQ291cnNlLmlkIHx8IGB1c2VyX2NvdXJzZV8ke2l9XyR7RGF0ZS5ub3coKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkQ291cnNlcygpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdmaWx0ZXJkQ291cnNlcyBhZnRlciBhZGRpbmcgdXNlciBjb3Vyc2VzOicsIHRoaXMuZmlsdGVyZENvdXJzZXMpO1xuICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCBoZXJlXG4gICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgIC8vdGhpcy5nZXRcbiAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuXG5cbiAgICB9KVxuICB9XG5cbiAgY2hlY2tJZkNvdXJzZUV4aXN0cyhpdGVtKSB7XG4gICAgbGV0IGZsYWcgPSBmYWxzZVxuICAgIGlmICh0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMuaW5kZXhPZihpdGVtPy5pZGVudGlmaWVyKSA+IC0xKSB7XG4gICAgICBmbGFnID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmxhZ1xuICB9XG5cbiAgc2VsZWN0QWxsQ291cnNlcyhldmVudCkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZENvdXJzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzLnB1c2godGhpcy5maWx0ZXJkQ291cnNlc1tpXS5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMgPSBbXVxuXG4gICAgfVxuICAgIGlmICh0aGlzLmNicF9wbGFuX2lkKSB7XG4gICAgICB0aGlzLm1vZGUgPSAndXBkYXRlJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGUgPSAnYWRkJ1xuICAgIH1cblxuXG4gIH1cbiAgZ2V0U2VjdG9ycyhzZWN0b3IpIHtcbiAgICBpZiAoc2VjdG9yICYmIHNlY3Rvci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlY3RvcikgPyBzZWN0b3Iuam9pbignLyAnKSA6ICcnXG4gICAgfVxuXG4gIH1cblxuICBmaWx0ZXJEYXRhKHNlYXJjaFRleHQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICBjb25zdCBmaWx0ZXIgPSBzZWFyY2hUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKGl0ZW0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnNvcnRDb3Vyc2VzQnlDYXRlZ29yeUFuZFJlbGV2YW5jeShmaWx0ZXJlZCk7XG4gIH1cblxuICBmbGF0dGVuT2JqZWN0VG9TdHJpbmcob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgJyArIHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgdmFsO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLmZsYXR0ZW5PYmplY3RUb1N0cmluZyh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgJyArIHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3VnZ2VzdE1vcmVDb3Vyc2VzKCkge1xuICAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgICBjb25zdCBkaWFsb2dSZWZOZXcgPSB0aGlzLmRpYWxvZy5vcGVuKFN1Z2dlc3RNb3JlQ291cnNlc0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMTAwcHgnLFxuICAgICAgZGF0YTogeyByZWNvbW1lbmRlZF9jb3Vyc2VfaWQ6IHRoaXMucmVjb21tZW5kZWRfY291cnNlX2lkLCByb2xlX21hcHBpbmdfaWQ6IHRoaXMucGxhbkRhdGEuaWQgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmTmV3LmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnR2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ0VkaXQgUm9sZSBNYXBwaW5nIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyBOYXZpZ2F0ZSBvciBvcGVuIG1vZGFsXG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oR2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcih0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gcmVzXG4gICAgICAgICAgICAvLyB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcztcbiAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJyx0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlOiBzdHJpbmcsIGluZGV4KTogYW55W10ge1xuICAgIGNvbnN0IGNvdXJzZSA9IHRoaXMuZmlsdGVyZENvdXJzZXNbaW5kZXhdO1xuICAgIGlmICghY291cnNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgTm8gY291cnNlIGZvdW5kIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgLy8gQUkgUmVjb21tZW5kZWQgJiBQdWJsaWMgY291cnNlcyB1c2UgJ2NvbXBldGVuY2llcydcbiAgICAvLyBNYW51YWxseSBTdWdnZXN0ZWQgLSBpR09UIGNvdXJzZXMgdXNlICdjb21wZXRlbmNpZXNfdjYnXG4gICAgLy8gVXNlciBBZGRlZCBjb3Vyc2VzIHVzZSAnY29tcGV0ZW5jaWVzJ1xuICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICBpZiAoY291cnNlLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgLy8gIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXMnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgQ291cnNlICR7aW5kZXh9ICgke2NvdXJzZS5jb3Vyc2VfdHlwZSB8fCBjb3Vyc2UubmFtZSB8fCAnVW5rbm93bid9KSB1c2luZyAnY29tcGV0ZW5jaWVzX3Y2JyBwcm9wZXJ0eTpgLCBjb21wZXRlbmNpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgQ291cnNlICR7aW5kZXh9ICgke2NvdXJzZS5jb3Vyc2VfdHlwZSB8fCBjb3Vyc2UubmFtZSB8fCAnVW5rbm93bid9KSBoYXMgbm8gdmFsaWQgY29tcGV0ZW5jaWVzIHByb3BlcnR5OmAsIHtcbiAgICAgIC8vICAgaGFzQ29tcGV0ZW5jaWVzOiAhIWNvdXJzZS5jb21wZXRlbmNpZXMsXG4gICAgICAvLyAgIGNvbXBldGVuY2llc1R5cGU6IHR5cGVvZiBjb3Vyc2UuY29tcGV0ZW5jaWVzLFxuICAgICAgLy8gICBoYXNDb21wZXRlbmNpZXNWNjogISFjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgLy8gICBjb21wZXRlbmNpZXNWNlR5cGU6IHR5cGVvZiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgLy8gICBjb3Vyc2VLZXlzOiBPYmplY3Qua2V5cyhjb3Vyc2UpXG4gICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29tcGV0ZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gIGNvbnNvbGUubG9nKGBObyBjb21wZXRlbmNpZXMgZm91bmQgZm9yIGNvdXJzZSAke2luZGV4fSBhbmQgdHlwZSAke3R5cGV9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIGZvciBjb21wYXJpc29uIChjYXNlLWluc2Vuc2l0aXZlICsgaGFuZGxlIHNwZWxsaW5nIHZhcmlhdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgY29uc3QgbWF0Y2hlZENvbXBldGVuY2llcyA9IGNvbXBldGVuY2llcy5maWx0ZXIoYyA9PiB7XG4gICAgICBpZiAoIWMgfHwgIWMuY29tcGV0ZW5jeUFyZWFOYW1lKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJbnZhbGlkIGNvbXBldGVuY3kgc3RydWN0dXJlIGluIGNvdXJzZSAke2luZGV4fTpgLCBjKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wZXRlbmN5QXJlYSA9IGMuY29tcGV0ZW5jeUFyZWFOYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAvLyBIYW5kbGUgYm90aCBcImJlaGF2aW9yYWxcIiBhbmQgXCJiZWhhdmlvdXJhbFwiIHNwZWxsaW5nc1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSAnYmVoYXZpb3VyYWwnIHx8IG5vcm1hbGl6ZWRUeXBlID09PSAnYmVoYXZpb3JhbCcpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBldGVuY3lBcmVhID09PSAnYmVoYXZpb3JhbCcgfHwgY29tcGV0ZW5jeUFyZWEgPT09ICdiZWhhdmlvdXJhbCc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBvdGhlciB0eXBlcywgZG8gY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uXG4gICAgICByZXR1cm4gY29tcGV0ZW5jeUFyZWEgPT09IG5vcm1hbGl6ZWRUeXBlO1xuICAgIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coYEZvdW5kICR7bWF0Y2hlZENvbXBldGVuY2llcy5sZW5ndGh9IGNvbXBldGVuY2llcyBvZiB0eXBlICR7dHlwZX0gZm9yIGNvdXJzZSAke2luZGV4fTpgLCBtYXRjaGVkQ29tcGV0ZW5jaWVzKTtcbiAgICByZXR1cm4gbWF0Y2hlZENvbXBldGVuY2llcztcbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5QmVodmlvdXJhbFR5cGUoaW5kZXgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdXJzZSA9IHRoaXMuZmlsdGVyZENvdXJzZXNbaW5kZXhdO1xuICAgIGlmICghY291cnNlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBldGVuY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGV0ZW5jaWVzXG4gICAgICAuZmlsdGVyKGMgPT4gYyAmJiAoYy5jb21wZXRlbmN5QXJlYU5hbWUgPT09ICdCZWhhdmlvcmFsJyB8fCBjLmNvbXBldGVuY3lBcmVhTmFtZSA9PT0gJ0JlaGF2aW91cmFsJykpXG4gICAgICAubWFwKGMgPT4gYCR7Yy5jb21wZXRlbmN5VGhlbWVOYW1lIHx8ICcnfSAtICR7Yy5jb21wZXRlbmN5U3ViVGhlbWVOYW1lIHx8ICcnfWApXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIGdldERpc3BsYXllZENvbXBldGVuY2llcyh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzID0gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpO1xuICAgIGNvbnN0IGtleSA9IGAke2luZGV4fS0ke3R5cGV9YDtcblxuICAgIGlmICh0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV0pIHtcbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBldGVuY2llcy5zbGljZSgwLCAyKTtcbiAgfVxuXG4gIHRvZ2dsZUNvbXBldGVuY2llcyh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG4gICAgdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldID0gIXRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQodHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV0gfHwgZmFsc2U7XG4gIH1cblxuICBoYXNNb3JlVGhhblR3byh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBnZXRSZW1haW5pbmdDb3VudCh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoO1xuICAgIHJldHVybiB0b3RhbENvdW50IC0gMjtcbiAgfVxuXG4gIG9uT3V0ZXJUYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vdXRlclRhYkFjdGl2ZUluZGV4ID0gZXZlbnQuaW5kZXhcbiAgICB0aGlzLm91dGVyVGFiQWN0aXZlVGV4dCA9IGV2ZW50LnRhYi50ZXh0TGFiZWxcbiAgICBjb25zb2xlLmxvZygnT3V0ZXIgVGFiIEluZGV4OicsIGV2ZW50LmluZGV4KTtcbiAgICBjb25zb2xlLmxvZygnT3V0ZXIgVGFiIExhYmVsOicsIGV2ZW50LnRhYi50ZXh0TGFiZWwpO1xuICAgIGlmIChldmVudC5pbmRleCA9PT0gMSkge1xuICAgICAgdGhpcy5nYXBBbmFseXNpc1N0YXRzKClcbiAgICB9XG4gICAgaWYgKGV2ZW50LmluZGV4ID09PSAwKSB7XG4gICAgICAvLyB0aGlzLmdldENvdXJzZXMoKVxuICAgICAgLy8gdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKClcbiAgICB9XG4gIH1cblxuICBvbklubmVyVGFiQ2hhbmdlKGV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9IGV2ZW50LmluZGV4XG4gICAgdGhpcy5pbm5lclRhYkFjdGl2ZVRleHQgPSBldmVudC50YWIudGV4dExhYmVsXG4gICAgdGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyID0gJyc7IC8vIFJlc2V0IHRoZW1lIGZpbHRlciB3aGVuIHN3aXRjaGluZyB0YWJzXG4gICAgY29uc29sZS5sb2coJ0lubmVyIFRhYiBJbmRleDonLCBldmVudC5pbmRleCk7XG4gICAgY29uc29sZS5sb2coJ0lubmVyIFRhYiBMYWJlbDonLCBldmVudC50YWIudGV4dExhYmVsKTtcbiAgICBsZXQgdGFiSW5kZXggPSBldmVudC5pbmRleFxuICAgIHRoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5ID0gW11cblxuICAgIC8vIEdldCBhbGwgYXZhaWxhYmxlIGNvdXJzZXMgKG9yaWdpbmFsICsgc3VnZ2VzdGVkICsgdXNlciBhZGRlZClcbiAgICBjb25zdCBhbGxBdmFpbGFibGVDb3Vyc2VzID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG5cblxuXG4gICAgc3dpdGNoICh0YWJJbmRleCkge1xuICAgICAgY2FzZSAwOiAvLyBBbGxcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IGFsbEF2YWlsYWJsZUNvdXJzZXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAvLyBCZWhhdmlvcmFsXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3kodGhpcy5iZWhhdmlvcmFsRmlsdGVyKGFsbEF2YWlsYWJsZUNvdXJzZXMpKTtcbiAgICAgICAgdGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSB0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5RmlsdGVyKHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6IC8vIEZ1bmN0aW9uYWxcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeSh0aGlzLmZ1bmN0aW9uYWxGaWx0ZXIoYWxsQXZhaWxhYmxlQ291cnNlcykpO1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IHRoaXMuZnVuY3Rpb25hbENvbXBldGVuY3lGaWx0ZXIodGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzogLy8gRG9tYWluXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3kodGhpcy5kb21haW5GaWx0ZXIoYWxsQXZhaWxhYmxlQ291cnNlcykpO1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IHRoaXMuZG9tYWluQ29tcGV0ZW5jeUZpbHRlcih0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgY29uc29sZS5sb2coJ3RoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5JywgdGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkpXG4gIH1cblxuICBnZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCkge1xuICAgIC8vIFN0YXJ0IHdpdGggb3JpZ2luYWwgZGF0YSAoQUkgcmVjb21tZW5kZWQgY291cnNlcylcbiAgICBjb25zdCBhbGxDb3Vyc2VzID0gWy4uLnRoaXMub3JpZ2luYWxEYXRhXTtcbiAgICBjb25zdCBzZWVuSWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBUcmFjayBvcmlnaW5hbCBjb3Vyc2UgaWRlbnRpZmllcnNcbiAgICB0aGlzLm9yaWdpbmFsRGF0YS5mb3JFYWNoKGNvdXJzZSA9PiB7XG4gICAgICBpZiAoY291cnNlLmlkZW50aWZpZXIpIHNlZW5JZGVudGlmaWVycy5hZGQoY291cnNlLmlkZW50aWZpZXIpO1xuICAgICAgaWYgKGNvdXJzZS5pZCkgc2VlbklkZW50aWZpZXJzLmFkZChjb3Vyc2UuaWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIHN1Z2dlc3RlZCBjb3Vyc2VzIChpR09UIHBsYXRmb3JtIGNvdXJzZXMpXG4gICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gY291cnNlLmlkZW50aWZpZXIgfHwgY291cnNlLmlkO1xuICAgICAgaWYgKGNvdXJzZUlkICYmICFzZWVuSWRlbnRpZmllcnMuaGFzKGNvdXJzZUlkKSkge1xuICAgICAgICBhbGxDb3Vyc2VzLnB1c2goY291cnNlKTtcbiAgICAgICAgc2VlbklkZW50aWZpZXJzLmFkZChjb3Vyc2VJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdXNlci1hZGRlZCBjb3Vyc2VzXG4gICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gY291cnNlLmlkZW50aWZpZXIgfHwgY291cnNlLmlkO1xuICAgICAgaWYgKGNvdXJzZUlkICYmICFzZWVuSWRlbnRpZmllcnMuaGFzKGNvdXJzZUlkKSkge1xuICAgICAgICAvLyBFbnN1cmUgdXNlci1hZGRlZCBjb3Vyc2VzIGhhdmUgcHJvcGVyIHN0cnVjdHVyZVxuICAgICAgICBpZiAoIWNvdXJzZS5jb3Vyc2VfdHlwZSkge1xuICAgICAgICAgIGNvdXJzZS5jb3Vyc2VfdHlwZSA9ICdVc2VyIEFkZGVkJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvdXJzZS5pZGVudGlmaWVyICYmIGNvdXJzZS5pZCkge1xuICAgICAgICAgIGNvdXJzZS5pZGVudGlmaWVyID0gY291cnNlLmlkO1xuICAgICAgICB9XG4gICAgICAgIGFsbENvdXJzZXMucHVzaChjb3Vyc2UpO1xuICAgICAgICBzZWVuSWRlbnRpZmllcnMuYWRkKGNvdXJzZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdnZXRBbGxBdmFpbGFibGVDb3Vyc2VzIGJyZWFrZG93bjonLCB7XG4gICAgICBvcmlnaW5hbERhdGE6IHRoaXMub3JpZ2luYWxEYXRhLmxlbmd0aCxcbiAgICAgIHN1Z2dlc3RlZENvdXJzZXM6IHRoaXMuc3VnZ2VzdGVkQ291cnNlcy5sZW5ndGgsXG4gICAgICB1c2VyQWRkZWRDb3Vyc2VzOiB0aGlzLnVzZXJBZGRlZENvdXJzZXMubGVuZ3RoLFxuICAgICAgdG90YWxBdmFpbGFibGU6IGFsbENvdXJzZXMubGVuZ3RoXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnYWxsQ291cnNlcy0tJywgYWxsQ291cnNlcylcbiAgICBhbGxDb3Vyc2VzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0ub3JnYW5pc2F0aW9uICYmIGl0ZW0ub3JnYW5pc2F0aW9uLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZFByb3ZpZGVycy5pbmRleE9mKGl0ZW0ub3JnYW5pc2F0aW9uKSA8IDApIHtcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkUHJvdmlkZXJzLnB1c2goaXRlbS5vcmdhbmlzYXRpb24pXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc3Qgc29ydGVkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KGFsbENvdXJzZXMpXG4gICAgdGhpcy5mdWxsQ291cnNlTGlzdCA9IHNvcnRlZENvdXJzZXNcbiAgICBsZXQgaWRlbnRpZmllcnNBcnIgPSBbXVxuICAgIHNvcnRlZENvdXJzZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZGVudGlmaWVyc0Fyci5wdXNoKGl0ZW0/LmlkZW50aWZpZXIpXG4gICAgfSlcbiAgY29uc3QgaWRlbnRpZmllcnNLZXkgPSBbLi4uaWRlbnRpZmllcnNBcnJdLnNvcnQoKS5qb2luKCcsJylcbiAgICAvLyBSZS1mZXRjaCB3aGVuZXZlciB0aGUgaWRlbnRpZmllciBzZXQgY2hhbmdlcywgb3Igd2hlbiBhbnkgY291cnNlIG9iamVjdCBpcyBtaXNzaW5nXG4gICAgLy8gdGhlIGVucmljaGVkIGZpZWxkcyAoZWcuIGFmdGVyIGdldFVzZXJDb3Vyc2UvZ2V0U3VnZ2VzdGVkQ291cnNlIHJlcGxhY2UgaXRlbXMgd2l0aFxuICAgIC8vIGZyZXNoIG9iamVjdHMgZnJvbSB0aGUgc2VydmVyIHRoYXQgaGF2ZW4ndCBiZWVuIGVucmljaGVkIHlldCwgZXZlbiBpZiB0aGUgaWRlbnRpZmllcnNcbiAgICAvLyBhcmUgdW5jaGFuZ2VkIGZyb20gdGhlIGxhc3QgZW5yaWNobWVudCBjYWxsKS5cbiAgICBjb25zdCBuZWVkc0VucmljaG1lbnQgPSBzb3J0ZWRDb3Vyc2VzLnNvbWUoKGl0ZW0pID0+IGl0ZW0/LmlkZW50aWZpZXIgJiYgaXRlbS5jb3Vyc2UgPT09IHVuZGVmaW5lZClcbiAgICBpZiAoaWRlbnRpZmllcnNBcnIubGVuZ3RoICYmIChpZGVudGlmaWVyc0tleSAhPT0gdGhpcy5sYXN0RW5yaWNoZWRJZGVudGlmaWVyc0tleSB8fCBuZWVkc0VucmljaG1lbnQpKSB7XG4gICAgICB0aGlzLmxhc3RFbnJpY2hlZElkZW50aWZpZXJzS2V5ID0gaWRlbnRpZmllcnNLZXlcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0QWRkaXRpb25hbFBhcmFtZXRlcmZvclN1Z2dlc3RlZENvdXJzZXMoaWRlbnRpZmllcnNBcnIpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQgJiYgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQgJiYgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZnVsbENvdXJzZUxpc3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bGxDb3Vyc2VMaXN0W2pdWydpZGVudGlmaWVyJ10gPT09IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50W2ldWydpZGVudGlmaWVyJ10pIHtcbiAgICAgICAgICAgICAgdGhpcy5mdWxsQ291cnNlTGlzdFtqXVsnbGFuZ3VhZ2UnXSA9IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50W2ldWydsYW5ndWFnZSddXG4gICAgICAgICAgICAgIHRoaXMuZnVsbENvdXJzZUxpc3Rbal1bJ2F2Z1JhdGluZyddID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ2F2Z1JhdGluZyddXG4gICAgICAgICAgICAgIHRoaXMuZnVsbENvdXJzZUxpc3Rbal1bJ2NvdXJzZSddID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ25hbWUnXVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZENvdXJzZXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkIGZpbHRlcmRDb3Vyc2VzIGFycmF5IHdpdGggYWxsIGF2YWlsYWJsZSBjb3Vyc2UgdHlwZXNcbiAgICogVGhpcyBlbnN1cmVzIGNvbnNpc3RlbmN5IGFjcm9zcyB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIHJlYnVpbGRGaWx0ZXJlZENvdXJzZXMoKSB7XG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KHRoaXMuZ2V0QWxsQXZhaWxhYmxlQ291cnNlcygpKTtcblxuICAgIGNvbnNvbGUubG9nKCdSZWJ1aWx0IGZpbHRlcmRDb3Vyc2VzIHdpdGggYWxsIGNvdXJzZSB0eXBlczonLCB7XG4gICAgICB0b3RhbDogdGhpcy5maWx0ZXJkQ291cnNlcy5sZW5ndGgsXG4gICAgICBicmVha2Rvd246IHtcbiAgICAgICAgb3JpZ2luYWw6IHRoaXMub3JpZ2luYWxEYXRhLmxlbmd0aCxcbiAgICAgICAgc3VnZ2VzdGVkOiB0aGlzLnN1Z2dlc3RlZENvdXJzZXMubGVuZ3RoLFxuICAgICAgICB1c2VyQWRkZWQ6IHRoaXMudXNlckFkZGVkQ291cnNlcy5sZW5ndGhcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNvcnRDb3Vyc2VzQnlSZWxldmFuY3koY291cnNlczogYW55W10gPSBbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gWy4uLmNvdXJzZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFTY29yZSA9IHRoaXMubm9ybWFsaXplUmVsZXZhbmN5KGE/LnJlbGV2YW5jeSlcbiAgICAgIGNvbnN0IGJTY29yZSA9IHRoaXMubm9ybWFsaXplUmVsZXZhbmN5KGI/LnJlbGV2YW5jeSlcbiAgICAgIHJldHVybiBiU2NvcmUgLSBhU2NvcmVcbiAgICB9KVxuICB9XG5cbiAgc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KGNvdXJzZXM6IGFueVtdID0gW10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIFsuLi5jb3Vyc2VzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yeVByaW9yaXR5ID0geyBkb21haW46IDEsIGZ1bmN0aW9uYWw6IDIsIGJlaGF2aW9yYWw6IDMsIG90aGVyOiA0IH07XG4gICAgICBjb25zdCBhUHJpb3JpdHkgPSBjYXRlZ29yeVByaW9yaXR5W3RoaXMuZ2V0Q291cnNlQ2F0ZWdvcnkoYSldIHx8IDQ7XG4gICAgICBjb25zdCBiUHJpb3JpdHkgPSBjYXRlZ29yeVByaW9yaXR5W3RoaXMuZ2V0Q291cnNlQ2F0ZWdvcnkoYildIHx8IDQ7XG5cbiAgICAgIGlmIChhUHJpb3JpdHkgIT09IGJQcmlvcml0eSkge1xuICAgICAgICByZXR1cm4gYVByaW9yaXR5IC0gYlByaW9yaXR5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYj8ucmVsZXZhbmN5KSAtIHRoaXMubm9ybWFsaXplUmVsZXZhbmN5KGE/LnJlbGV2YW5jeSk7XG4gICAgfSlcbiAgfVxuXG4gIGdldENvdXJzZUNhdGVnb3J5KGNvdXJzZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21wZXRlbmNpZXMgPSBbXG4gICAgICAuLi4oY291cnNlPy5jb21wZXRlbmNpZXMgfHwgW10pLFxuICAgICAgLi4uKGNvdXJzZT8uY29tcGV0ZW5jaWVzX3Y2IHx8IFtdKVxuICAgIF07XG5cbiAgICBjb25zdCBjYXRlZ29yaWVzID0gbmV3IFNldChcbiAgICAgIGNvbXBldGVuY2llc1xuICAgICAgICAubWFwKChjOiBhbnkpID0+IHRoaXMubm9ybWFsaXplQ29tcGV0ZW5jeShjPy5jb21wZXRlbmN5QXJlYU5hbWUpKVxuICAgICAgICAuZmlsdGVyKChjOiBzdHJpbmcpID0+IGMpXG4gICAgKTtcblxuICAgIGlmIChjYXRlZ29yaWVzLmhhcygnZG9tYWluJykpIHJldHVybiAnZG9tYWluJztcbiAgICBpZiAoY2F0ZWdvcmllcy5oYXMoJ2Z1bmN0aW9uYWwnKSkgcmV0dXJuICdmdW5jdGlvbmFsJztcbiAgICBpZiAoY2F0ZWdvcmllcy5oYXMoJ2JlaGF2aW9yYWwnKSkgcmV0dXJuICdiZWhhdmlvcmFsJztcblxuICAgIHJldHVybiAnb3RoZXInO1xuICB9XG5cbiAgbm9ybWFsaXplUmVsZXZhbmN5KHZhbHVlOiBhbnkpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUudHJpbSgpKVxuICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogLUluZmluaXR5XG4gICAgfVxuXG4gICAgcmV0dXJuIC1JbmZpbml0eVxuICB9XG5cbiAgYmVoYXZpb3JhbEZpbHRlcihkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoaXRlbS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoYyA9PiBjICYmICgoYz8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAnYmVoYXZpb3JhbCcpIHx8IGM/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2JlaGF2aW91cmFsJykpO1xuICAgIH0pO1xuICB9XG5cbiAgYmVoYXZpb3JhbENvbXBldGVuY3lGaWx0ZXIoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgY29uc3QgYmVoYXZpb3JhbFRoZW1lcyA9IGRhdGFcbiAgICAgIC5maWx0ZXIoaXRlbSA9PlxuICAgICAgICBpdGVtPy50eXBlICYmXG4gICAgICAgIFsnYmVoYXZpb3JhbCcsICdiZWhhdmlvdXJhbCddLmluY2x1ZGVzKGl0ZW0udHlwZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgKVxuICAgICAgLm1hcChpdGVtID0+IHRoaXMuZm9ybWF0VGhlbWVXaXRoU3ViVGhlbWUoaXRlbT8udGhlbWUsIGl0ZW0/LnN1Yl90aGVtZSkpXG4gICAgICAuZmlsdGVyKCh0aGVtZSk6IHRoZW1lIGlzIHN0cmluZyA9PiBCb29sZWFuKHRoZW1lKSk7IC8vIEVuc3VyZXMgdHlwZSBzYWZldHlcblxuICAgIGNvbnN0IHVuaXF1ZUJlaGF2aW9yYWxUaGVtZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoYmVoYXZpb3JhbFRoZW1lcykpO1xuXG4gICAgY29uc29sZS5sb2codW5pcXVlQmVoYXZpb3JhbFRoZW1lcyk7XG4gICAgcmV0dXJuIHVuaXF1ZUJlaGF2aW9yYWxUaGVtZXM7XG4gIH1cblxuICBmdW5jdGlvbmFsQ29tcGV0ZW5jeUZpbHRlcihkYXRhOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgZnVuY3Rpb25hbFRoZW1lcyA9IGRhdGFcbiAgICAgIC5maWx0ZXIoaXRlbSA9PlxuICAgICAgICBpdGVtPy50eXBlICYmXG4gICAgICAgIFsnZnVuY3Rpb25hbCddLmluY2x1ZGVzKGl0ZW0udHlwZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgKVxuICAgICAgLm1hcChpdGVtID0+IHRoaXMuZm9ybWF0VGhlbWVXaXRoU3ViVGhlbWUoaXRlbT8udGhlbWUsIGl0ZW0/LnN1Yl90aGVtZSkpXG4gICAgICAuZmlsdGVyKCh0aGVtZSk6IHRoZW1lIGlzIHN0cmluZyA9PiBCb29sZWFuKHRoZW1lKSk7IC8vIEVuc3VyZXMgdHlwZSBzYWZldHlcblxuICAgIGNvbnN0IHVuaXF1ZUZ1bmN0aW9uYWxUaGVtZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoZnVuY3Rpb25hbFRoZW1lcykpO1xuXG4gICAgY29uc29sZS5sb2codW5pcXVlRnVuY3Rpb25hbFRoZW1lcyk7XG4gICAgcmV0dXJuIHVuaXF1ZUZ1bmN0aW9uYWxUaGVtZXM7XG5cbiAgICAvLyBjb25zb2xlLmxvZyh1bmlxdWVDb21wZXRlbmN5QXJlYU5hbWVzKTtcbiAgfVxuXG4gIGRvbWFpbkNvbXBldGVuY3lGaWx0ZXIoZGF0YTogYW55W10pOiBhbnkge1xuICAgIGNvbnN0IGRvbWFpblRoZW1lcyA9IGRhdGFcbiAgICAgIC5maWx0ZXIoaXRlbSA9PlxuICAgICAgICBpdGVtPy50eXBlICYmXG4gICAgICAgIFsnZG9tYWluJ10uaW5jbHVkZXMoaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG4gICAgICApXG4gICAgICAubWFwKGl0ZW0gPT4gdGhpcy5mb3JtYXRUaGVtZVdpdGhTdWJUaGVtZShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKSlcbiAgICAgIC5maWx0ZXIoKHRoZW1lKTogdGhlbWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhlbWUpKTsgLy8gRW5zdXJlcyB0eXBlIHNhZmV0eVxuXG4gICAgY29uc3QgdW5pcXVlRG9tYWluVGhlbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGRvbWFpblRoZW1lcykpO1xuXG4gICAgY29uc29sZS5sb2codW5pcXVlRG9tYWluVGhlbWVzKTtcbiAgICByZXR1cm4gdW5pcXVlRG9tYWluVGhlbWVzO1xuXG4gICAgLy8gY29uc29sZS5sb2codW5pcXVlQ29tcGV0ZW5jeUFyZWFOYW1lcyk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uYWxGaWx0ZXIoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGRhdGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgY29tcGV0ZW5jeSBwcm9wZXJ0eSBuYW1lc1xuICAgICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgICAgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbXBldGVuY2llc192NiAmJiBBcnJheS5pc0FycmF5KGl0ZW0uY29tcGV0ZW5jaWVzX3Y2KSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBpdGVtLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBldGVuY2llcy5zb21lKGMgPT4gYyAmJiBjPy5jb21wZXRlbmN5QXJlYU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdmdW5jdGlvbmFsJyk7XG4gICAgfSk7XG4gIH1cblxuICBkb21haW5GaWx0ZXIoZGF0YTogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGRhdGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgY29tcGV0ZW5jeSBwcm9wZXJ0eSBuYW1lc1xuICAgICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgICAgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbXBldGVuY2llc192NiAmJiBBcnJheS5pc0FycmF5KGl0ZW0uY29tcGV0ZW5jaWVzX3Y2KSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBpdGVtLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBldGVuY2llcy5zb21lKGMgPT4gYyAmJiBjPy5jb21wZXRlbmN5QXJlYU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdkb21haW4nKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdhcEFuYWx5c2lzU3RhdHMoKSB7XG4gICAgY29uc29sZS5sb2coJ3RoaXMucGxhbkRhdGEnLCB0aGlzLnBsYW5EYXRhKVxuXG4gICAgLy8gQWx3YXlzIHVzZSBBTEwgY29tcGV0ZW5jaWVzIGZvciBjYWxjdWxhdGluZyBvdmVyYWxsIHN0YXRzXG4gICAgY29uc3QgYWxsQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXM7XG5cbiAgICAvLyBGaWx0ZXIgZm9yIGNhdGVnb3J5LXNwZWNpZmljIGNhbGN1bGF0aW9uc1xuICAgIGxldCBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzOiBhbnkgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcztcbiAgICBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJykge1xuICAgICAgY2F0ZWdvcnlTcGVjaWZpY0NvbXBldGVuY2llcyA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdiZWhhdmlvcmFsJykge1xuICAgICAgY2F0ZWdvcnlTcGVjaWZpY0NvbXBldGVuY2llcyA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZT8udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5zZWxlY3RlZENhdGVnb3J5KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2Z1bmN0aW9uYWwnKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlPy50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdkb21haW4nKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlPy50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICAgIH1cblxuICAgIC8vIENvdW50IEFMTCBjb21wZXRlbmNpZXMgYnkgY2F0ZWdvcnkgKG5vdCBqdXN0IGZpbHRlcmVkIG9uZXMpXG4gICAgY29uc3QgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnkgPSB7IHRvdGFsOiBhbGxDb21wZXRlbmNpZXMubGVuZ3RoLCBiZWhhdmlvdXJhbDogMCwgZnVuY3Rpb25hbDogMCwgZG9tYWluOiAwIH1cblxuICAgIC8vIElNUE9SVEFOVDogVXNlIGFsbCBhdmFpbGFibGUgY291cnNlcyBmb3IgY29uc2lzdGVudCBjb3ZlcmFnZSBjYWxjdWxhdGlvblxuICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHdoYXQncyBhdmFpbGFibGUgaW4gdGhlIEZpbHRlciBCeSBDb21wZXRlbmN5IHNlY3Rpb25cbiAgICBjb25zdCBhbGxDb3Vyc2VDb21wZXRlbmNpZXMgPSBbXVxuICAgIGNvbnN0IGFsbEF2YWlsYWJsZUNvdXJzZXNGb3JTdGF0cyA9IHRoaXMuZ2V0QWxsQXZhaWxhYmxlQ291cnNlcygpO1xuXG4gICAgYWxsQXZhaWxhYmxlQ291cnNlc0ZvclN0YXRzLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgY29tcGV0ZW5jeSBwcm9wZXJ0eSBuYW1lc1xuICAgICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgICAgaWYgKGNvdXJzZSAmJiBjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llcztcbiAgICAgIH0gZWxzZSBpZiAoY291cnNlICYmIGNvdXJzZS5jb21wZXRlbmNpZXNfdjYgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2KSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICBjb21wZXRlbmNpZXMuZm9yRWFjaCgobGlzdDogYW55KSA9PiB7XG4gICAgICAgIGFsbENvdXJzZUNvbXBldGVuY2llcy5wdXNoKGxpc3QpXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdhbGxDb21wZXRlbmNpZXMnLCBhbGxDb21wZXRlbmNpZXMpXG4gICAgY29uc29sZS5sb2coJ2NhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMnLCBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzKVxuICAgIGNvbnNvbGUubG9nKCdhbGxDb3Vyc2VDb21wZXRlbmNpZXMnLCBhbGxDb3Vyc2VDb21wZXRlbmNpZXMpXG5cbiAgICAvLyBDb3VudCBhbGwgY29tcGV0ZW5jaWVzIGJ5IHR5cGUgZm9yIHByb3BlciB0b3RhbHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbENvbXBldGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29tcGV0ZW5jeVR5cGUgPSBhbGxDb21wZXRlbmNpZXNbaV1bJ3R5cGUnXT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnNvbGUubG9nKGBDb21wZXRlbmN5ICR7aX06IHR5cGU9XCIke2NvbXBldGVuY3lUeXBlfVwiLCBkYXRhOmAsIGFsbENvbXBldGVuY2llc1tpXSk7XG4gICAgICBpZiAoY29tcGV0ZW5jeVR5cGUgPT09ICdiZWhhdmlvdXJhbCcgfHwgY29tcGV0ZW5jeVR5cGUgPT09ICdiZWhhdmlvcmFsJykge1xuICAgICAgICBtYXN0ZXJMaXN0QnlDYXRlZ29yeVsnYmVoYXZpb3VyYWwnXSA9IG1hc3Rlckxpc3RCeUNhdGVnb3J5WydiZWhhdmlvdXJhbCddICsgMVxuICAgICAgfVxuICAgICAgaWYgKGNvbXBldGVuY3lUeXBlID09PSAnZnVuY3Rpb25hbCcpIHtcbiAgICAgICAgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2Z1bmN0aW9uYWwnXSA9IG1hc3Rlckxpc3RCeUNhdGVnb3J5WydmdW5jdGlvbmFsJ10gKyAxXG4gICAgICB9XG4gICAgICBpZiAoY29tcGV0ZW5jeVR5cGUgPT09ICdkb21haW4nKSB7XG4gICAgICAgIG1hc3Rlckxpc3RCeUNhdGVnb3J5Wydkb21haW4nXSA9IG1hc3Rlckxpc3RCeUNhdGVnb3J5Wydkb21haW4nXSArIDFcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ21hc3Rlckxpc3RCeUNhdGVnb3J5IGFmdGVyIGNvdW50aW5nOicsIG1hc3Rlckxpc3RCeUNhdGVnb3J5KVxuXG4gICAgLy8gR2V0IG1hdGNoaW5nIHJlc3VsdHMgZm9yIEFMTCBjb21wZXRlbmNpZXMgKGZvciBvdmVyYWxsIGNvdmVyYWdlKVxuICAgIGNvbnN0IG92ZXJhbGxSZXN1bHQgPSB0aGlzLmdldE1hdGNoZWRDb21wZXRlbmN5U3RhdHMoYWxsQ29tcGV0ZW5jaWVzLCBhbGxDb3Vyc2VDb21wZXRlbmNpZXMpO1xuXG4gICAgLy8gR2V0IG1hdGNoaW5nIHJlc3VsdHMgZm9yIGNhdGVnb3J5LXNwZWNpZmljIGNvbXBldGVuY2llcyAoZm9yIGZpbHRlcmVkIHZpZXcpXG4gICAgY29uc3QgY2F0ZWdvcnlSZXN1bHQgPSB0aGlzLmdldE1hdGNoZWRDb21wZXRlbmN5U3RhdHMoY2F0ZWdvcnlTcGVjaWZpY0NvbXBldGVuY2llcywgYWxsQ291cnNlQ29tcGV0ZW5jaWVzKTtcblxuICAgIC8vIFNldCBjb21wZXRlbmN5Q292ZXJlZENvdW50IGJhc2VkIG9uIHNlbGVjdGVkIGNhdGVnb3J5IChmb3IgdGhlIGZpbHRlcmVkIG51bWJlcnMpXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2FsbCcpIHtcbiAgICAgIHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IG92ZXJhbGxSZXN1bHRbJ3RvdGFsJ107XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdiZWhhdmlvcmFsJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gY2F0ZWdvcnlSZXN1bHRbJ2JlaGF2aW9yYWwnXSB8fCAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCcpIHtcbiAgICAgIHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IGNhdGVnb3J5UmVzdWx0WydmdW5jdGlvbmFsJ10gfHwgMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbicpIHtcbiAgICAgIHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IGNhdGVnb3J5UmVzdWx0Wydkb21haW4nXSB8fCAwO1xuICAgIH1cblxuICAgIC8vIElNUE9SVEFOVDogT3ZlcmFsbCBDb3ZlcmFnZSBzaG91bGQgQUxXQVlTIGJlIGJhc2VkIG9uIEFMTCBjb21wZXRlbmNpZXMsIG5vdCBmaWx0ZXJlZFxuICAgIGxldCB0b3RhbENvbXBldGVuY2llcyA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmxlbmd0aDsgLy8gQWx3YXlzIHVzZSB0b3RhbCBjb3VudFxuICAgIGxldCBvdmVyYWxsQ292ZXJlZENvdW50ID0gb3ZlcmFsbFJlc3VsdFsndG90YWwnXTsgLy8gQWx3YXlzIHVzZSBvdmVyYWxsIHJlc3VsdHNcbiAgICBsZXQgbWF0aFJvdW5kID0gTWF0aC5yb3VuZCgob3ZlcmFsbENvdmVyZWRDb3VudCAvIHRvdGFsQ29tcGV0ZW5jaWVzKSAqIDEwMClcbiAgICB0aGlzLm92ZXJhbGxDb3ZlcmFnZSA9IGAke21hdGhSb3VuZH0lYFxuXG4gICAgY29uc29sZS5sb2coJ092ZXJhbGwgQ292ZXJhZ2UgQ2FsY3VsYXRpb246Jywge1xuICAgICAgdG90YWxDb21wZXRlbmNpZXM6IHRvdGFsQ29tcGV0ZW5jaWVzLFxuICAgICAgb3ZlcmFsbENvdmVyZWRDb3VudDogb3ZlcmFsbENvdmVyZWRDb3VudCxcbiAgICAgIG92ZXJhbGxDb3ZlcmFnZTogdGhpcy5vdmVyYWxsQ292ZXJhZ2UsXG4gICAgICBzZWxlY3RlZENhdGVnb3J5OiB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnksXG4gICAgICBjb21wZXRlbmN5Q292ZXJlZENvdW50OiB0aGlzLmNvbXBldGVuY3lDb3ZlcmVkQ291bnRcbiAgICB9KTtcblxuICAgIC8vIEFsd2F5cyBjYWxjdWxhdGUgYWxsIGNhdGVnb3J5LXNwZWNpZmljIG1ldHJpY3MgcmVnYXJkbGVzcyBvZiBzZWxlY3RlZCBjYXRlZ29yeVxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgZGF0YSBpcyBhdmFpbGFibGUgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBjYXRlZ29yaWVzXG4gICAgLy8gVXNlIG92ZXJhbGxSZXN1bHQgZm9yIGNvbnNpc3RlbnQgY2FsY3VsYXRpb25zIGFjcm9zcyBhbGwgY2F0ZWdvcmllc1xuICAgIHRoaXMuYmVoYXZpb3JhbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0WydiZWhhdmlvcmFsJ10gfHwgMDtcbiAgICB0aGlzLmJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcyA9IG1hc3Rlckxpc3RCeUNhdGVnb3J5WydiZWhhdmlvdXJhbCddO1xuICAgIGxldCBiZWhhdmlvcmFsTWF0aFJvdW5kID0gdGhpcy5iZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMgPiAwID8gTWF0aC5yb3VuZCgodGhpcy5iZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIHRoaXMuYmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzKSAqIDEwMCkgOiAwO1xuICAgIHRoaXMuYmVoYXZpb3JhbENvdmVyYWdlID0gYCR7YmVoYXZpb3JhbE1hdGhSb3VuZH0lYDtcblxuICAgIHRoaXMuZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0WydmdW5jdGlvbmFsJ10gfHwgMDtcbiAgICB0aGlzLmZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcyA9IG1hc3Rlckxpc3RCeUNhdGVnb3J5WydmdW5jdGlvbmFsJ107XG4gICAgbGV0IGZ1bmN0aW9uYWxNYXRoUm91bmQgPSB0aGlzLmZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcyA+IDAgPyBNYXRoLnJvdW5kKCh0aGlzLmZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50IC8gdGhpcy5mdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwKSA6IDA7XG4gICAgdGhpcy5mdW5jdGlvbmFsQ292ZXJhZ2UgPSBgJHtmdW5jdGlvbmFsTWF0aFJvdW5kfSVgO1xuXG4gICAgdGhpcy5kb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50ID0gb3ZlcmFsbFJlc3VsdFsnZG9tYWluJ10gfHwgMDtcbiAgICB0aGlzLmRvbWFpblRvdGFsQ29tcGV0ZW5jaWVzID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2RvbWFpbiddO1xuICAgIGxldCBkb21haW5NYXRoUm91bmQgPSB0aGlzLmRvbWFpblRvdGFsQ29tcGV0ZW5jaWVzID4gMCA/IE1hdGgucm91bmQoKHRoaXMuZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMpICogMTAwKSA6IDA7XG4gICAgdGhpcy5kb21haW5Db3ZlcmFnZSA9IGAke2RvbWFpbk1hdGhSb3VuZH0lYDtcblxuICAgIGNvbnNvbGUubG9nKCdBbGwgY2F0ZWdvcnkgbWV0cmljcyBjYWxjdWxhdGVkOicsIHtcbiAgICAgIGJlaGF2aW9yYWw6IHsgY292ZXJlZDogdGhpcy5iZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCwgdG90YWw6IHRoaXMuYmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzLCBjb3ZlcmFnZTogdGhpcy5iZWhhdmlvcmFsQ292ZXJhZ2UgfSxcbiAgICAgIGZ1bmN0aW9uYWw6IHsgY292ZXJlZDogdGhpcy5mdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCwgdG90YWw6IHRoaXMuZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzLCBjb3ZlcmFnZTogdGhpcy5mdW5jdGlvbmFsQ292ZXJhZ2UgfSxcbiAgICAgIGRvbWFpbjogeyBjb3ZlcmVkOiB0aGlzLmRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQsIHRvdGFsOiB0aGlzLmRvbWFpblRvdGFsQ29tcGV0ZW5jaWVzLCBjb3ZlcmFnZTogdGhpcy5kb21haW5Db3ZlcmFnZSB9LFxuICAgICAgb3ZlcmFsbDogeyBjb3ZlcmVkOiBvdmVyYWxsQ292ZXJlZENvdW50LCB0b3RhbDogdG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLm92ZXJhbGxDb3ZlcmFnZSB9LFxuICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogdGhpcy5zZWxlY3RlZENhdGVnb3J5LFxuICAgICAgY29tcGV0ZW5jeUNvdmVyZWRDb3VudEZvckNhdGVnb3J5OiB0aGlzLmNvbXBldGVuY3lDb3ZlcmVkQ291bnRcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZygnT3ZlcmFsbCBSZXN1bHQ6Jywgb3ZlcmFsbFJlc3VsdCk7XG4gICAgY29uc29sZS5sb2coJ0NhdGVnb3J5IFJlc3VsdDonLCBjYXRlZ29yeVJlc3VsdCk7XG4gICAgY29uc29sZS5sb2coJ3RoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5JywgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkpXG4gICAgdGhpcy5iZWhhdmlvdXJhbE5vdE1hdGNoZWQgPSB0aGlzLmdldENvbXBldGVuY3lCeUNhdGVnb3J5Tm90TWF0Y2hpbmcoJ2JlaGF2aW9yYWwnKVxuICAgIHRoaXMuZnVuY3Rpb25hbE5vdE1hdGNoZWQgPSB0aGlzLmdldENvbXBldGVuY3lCeUNhdGVnb3J5Tm90TWF0Y2hpbmcoJ2Z1bmN0aW9uYWwnKVxuICAgIHRoaXMuZG9tYWluTm90TWF0Y2hlZCA9IHRoaXMuZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZygnZG9tYWluJylcblxuICAgIHRoaXMuZ2V0QmVoYXZpb3VyYWxNYXRjaGVkKClcbiAgICB0aGlzLmdldEZ1bmN0aW9uYWxNYXRjaGVkKClcbiAgICB0aGlzLmdldERvbWFpbk1hdGNoZWQoKVxuICB9XG5cbiAgZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyhwcmltYXJ5QXJyYXk6IGFueVtdLCBzZWNvbmRhcnlBcnJheTogYW55W10pIHtcbiAgICAvLyBDb252ZXJ0IGJvdGggYXJyYXlzIHRvIGVuc3VyZSBjb25zaXN0ZW50IGNhc2luZ1xuICAgIGNvbnN0IGNvdW50czogYW55ID0ge1xuICAgICAgYmVoYXZpb3JhbDogMCxcbiAgICAgIGZ1bmN0aW9uYWw6IDAsXG4gICAgICBkb21haW46IDAsXG4gICAgICB0b3RhbDogMFxuICAgIH07XG5cbiAgICAvLyBDbGVhciB0aGUgY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5IGFycmF5IGZvciBmcmVzaCBjYWxjdWxhdGlvblxuICAgIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5ID0gW107XG5cbiAgICAvLyBTZXQgdG8ga2VlcCB0cmFjayBvZiB1bmlxdWUgbWF0Y2hlc1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBtYXRjaGVkQ29tcGV0ZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHByaW1hcnkgb2YgcHJpbWFyeUFycmF5KSB7XG4gICAgICBjb25zdCB0eXBlS2V5ID0gcHJpbWFyeS50eXBlPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHRoZW1lS2V5ID0gcHJpbWFyeS50aGVtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICBjb25zdCBzdWJUaGVtZUtleSA9IHByaW1hcnkuc3ViX3RoZW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgbGV0IGlzTWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IHNlY29uZGFyeSBvZiBzZWNvbmRhcnlBcnJheSkge1xuICAgICAgICAvLyBOb3JtYWxpemUgc2Vjb25kYXJ5IGtleXNcbiAgICAgICAgbGV0IHNlY1R5cGUgPSBzZWNvbmRhcnk/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGxldCBzZWNUaGVtZSA9IHNlY29uZGFyeT8uY29tcGV0ZW5jeVRoZW1lTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGxldCBzZWNTdWJUaGVtZSA9IHNlY29uZGFyeT8uY29tcGV0ZW5jeVN1YlRoZW1lTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgLy8gRml4IGZvciBkYXRhIGluY29uc2lzdGVuY3lcbiAgICAgICAgaWYgKHNlY1R5cGUgPT09ICdiZWhhdmlvdXJhbCcpIHNlY1R5cGUgPSAnYmVoYXZpb3JhbCc7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHVuaXF1ZSBtYXRjaCBrZXkgZm9yIHByaW1hcnkgY29tcGV0ZW5jeVxuICAgICAgICBjb25zdCBtYXRjaEtleSA9IGAke3R5cGVLZXl9fCR7dGhlbWVLZXl9fCR7c3ViVGhlbWVLZXl9YDtcblxuICAgICAgICAvLyBFbmhhbmNlZCBjcm9zcy1tYXRjaGluZyBsb2dpYyBhcyByZXF1ZXN0ZWQ6XG4gICAgICAgIC8vIDEuIFJvbGUgbWFwcGluZyBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgLy8gMi4gUm9sZSBtYXBwaW5nIFN1YiBUaGVtZSB2cyBDb3Vyc2UgU3ViIFRoZW1lICBcbiAgICAgICAgLy8gMy4gUm9sZSBtYXBwaW5nIFRoZW1lIHZzIENvdXJzZSBTdWIgVGhlbWVcbiAgICAgICAgLy8gNC4gUm9sZSBtYXBwaW5nIFN1YiBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgY29uc3QgdGhlbWVUb1RoZW1lTWF0Y2ggPSB0aGVtZUtleSA9PT0gc2VjVGhlbWU7XG4gICAgICAgIGNvbnN0IHN1YlRoZW1lVG9TdWJUaGVtZU1hdGNoID0gc3ViVGhlbWVLZXkgPT09IHNlY1N1YlRoZW1lO1xuICAgICAgICBjb25zdCB0aGVtZVRvU3ViVGhlbWVNYXRjaCA9IHRoZW1lS2V5ID09PSBzZWNTdWJUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1RoZW1lTWF0Y2ggPSBzdWJUaGVtZUtleSA9PT0gc2VjVGhlbWU7XG5cbiAgICAgICAgbGV0IG1hdGNoVHlwZSA9ICcnO1xuICAgICAgICBsZXQgaXNNYXRjaCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0eXBlS2V5ID09PSBzZWNUeXBlICYmICFzZWVuLmhhcyhtYXRjaEtleSkpIHtcbiAgICAgICAgICBpZiAodGhlbWVUb1RoZW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIG1hdGNoVHlwZSA9ICdUaGVtZS10by1UaGVtZSc7XG4gICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN1YlRoZW1lVG9TdWJUaGVtZU1hdGNoKSB7XG4gICAgICAgICAgICBtYXRjaFR5cGUgPSAnU3ViVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgICAgaXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVtZVRvU3ViVGhlbWVNYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2hUeXBlID0gJ1RoZW1lLXRvLVN1YlRoZW1lJztcbiAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3ViVGhlbWVUb1RoZW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIG1hdGNoVHlwZSA9ICdTdWJUaGVtZS10by1UaGVtZSc7XG4gICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGDinIUgTUFUQ0ggRk9VTkQgWyR7bWF0Y2hUeXBlfV06YCwge1xuICAgICAgICAgICAgcm9sZU1hcHBpbmc6IHsgdHlwZTogdHlwZUtleSwgdGhlbWU6IHRoZW1lS2V5LCBzdWJUaGVtZTogc3ViVGhlbWVLZXkgfSxcbiAgICAgICAgICAgIGNvdXJzZTogeyB0eXBlOiBzZWNUeXBlLCB0aGVtZTogc2VjVGhlbWUsIHN1YlRoZW1lOiBzZWNTdWJUaGVtZSB9LFxuICAgICAgICAgICAgbWF0Y2hUeXBlOiBtYXRjaFR5cGVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFN0b3JlIG1hdGNoZWQgY29tcGV0ZW5jeSBpbmZvIGZvciBsYXRlciB1c2VcbiAgICAgICAgICBsZXQgb2JqID0ge307XG4gICAgICAgICAgb2JqW3R5cGVLZXldID0gW3RoaXMuZ2V0VGhlbWVTdWJUaGVtZUtleSh0aGVtZUtleSwgc3ViVGhlbWVLZXkpXTtcbiAgICAgICAgICB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeS5wdXNoKG9iaik7XG4gICAgICAgICAgc2Vlbi5hZGQobWF0Y2hLZXkpO1xuICAgICAgICAgIG1hdGNoZWRDb21wZXRlbmNpZXMuYWRkKHRoaXMuZ2V0VGhlbWVTdWJUaGVtZUtleSh0aGVtZUtleSwgc3ViVGhlbWVLZXkpKTtcbiAgICAgICAgICBpc01hdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKGNvdW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlS2V5KSkge1xuICAgICAgICAgICAgY291bnRzW3R5cGVLZXldKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvdW50c1t0eXBlS2V5XSA9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY291bnRzLnRvdGFsKys7XG4gICAgICAgICAgYnJlYWs7IC8vIFN0b3AgbG9va2luZyBmb3IgbWF0Y2hlcyBmb3IgdGhpcyBwcmltYXJ5IGNvbXBldGVuY3lcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudHM7XG4gIH1cbiAgZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZyhjYXRlZ29yeVR5cGUpIHtcbiAgICAvLyBHZXQgYWxsIGNvbXBldGVuY2llcyBmb3IgdGhlIGdpdmVuIGNhdGVnb3J5IGZyb20gcm9sZSBtYXBwaW5nXG4gICAgbGV0IGFsbENhdGVnb3J5Q29tcGV0ZW5jaWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzW2ldWyd0eXBlJ10/LnRvTG93ZXJDYXNlKCkgPT09IGNhdGVnb3J5VHlwZT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBhbGxDYXRlZ29yeUNvbXBldGVuY2llcy5wdXNoKFxuICAgICAgICAgIHRoaXMuZ2V0VGhlbWVTdWJUaGVtZUtleShcbiAgICAgICAgICAgIHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzW2ldWyd0aGVtZSddLFxuICAgICAgICAgICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNbaV1bJ3N1Yl90aGVtZSddXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBtYXRjaGVkIGNvbXBldGVuY2llcyBmb3IgdGhpcyBjYXRlZ29yeSBmcm9tIGNvdXJzZXNcbiAgICBsZXQgbWF0Y2hlZENvbXBldGVuY2llcyA9IFtdO1xuICAgIGNvbnNvbGUubG9nKCdjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnknLCB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV1bY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICBjb25zb2xlLmxvZygnY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5W2ldJywgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV0pXG4gICAgICAgIC8vIEV4dHJhY3QgbWF0Y2hlZCB0aGVtZXMgZnJvbSBjb3Vyc2UgY29tcGV0ZW5jaWVzXG4gICAgICAgIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5W2ldW2NhdGVnb3J5VHlwZT8udG9Mb3dlckNhc2UoKV0uZm9yRWFjaCh0aGVtZSA9PiB7XG4gICAgICAgICAgaWYgKHRoZW1lKSB7XG4gICAgICAgICAgICBtYXRjaGVkQ29tcGV0ZW5jaWVzLnB1c2godGhlbWUudG9Mb3dlckNhc2UoKS50cmltKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5oYW5jZWQgbWF0Y2hpbmc6IGNoZWNrIGJvdGggdGhlbWUgYW5kIHN1YnRoZW1lIGZyb20gY291cnNlcyBhZ2FpbnN0IEZSQUMgY29tcGV0ZW5jaWVzXG4gICAgLy8gSU1QT1JUQU5UOiBVc2UgYWxsIGF2YWlsYWJsZSBjb3Vyc2VzIGZvciBjb25zaXN0ZW50IGNvdmVyYWdlIGNhbGN1bGF0aW9uXG4gICAgY29uc3QgYWxsQ291cnNlc0Zvck1hdGNoaW5nID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG5cbiAgICBhbGxDb3Vyc2VzRm9yTWF0Y2hpbmcuZm9yRWFjaChjb3Vyc2UgPT4ge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoY291cnNlICYmIGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChjb3Vyc2UgJiYgY291cnNlLmNvbXBldGVuY2llc192NiAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIGNvbXBldGVuY2llcy5mb3JFYWNoKChjb21wOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHNlY1R5cGUgPSBjb21wPy5jb21wZXRlbmN5QXJlYU5hbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBpZiAoc2VjVHlwZSA9PT0gJ2JlaGF2aW91cmFsJykgc2VjVHlwZSA9ICdiZWhhdmlvcmFsJztcblxuICAgICAgICBpZiAoc2VjVHlwZSA9PT0gY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY29uc3QgY291cnNlVGhlbWUgPSBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IGNvdXJzZVN1YlRoZW1lID0gY29tcC5jb21wZXRlbmN5U3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGFueSBGUkFDIGNvbXBldGVuY3kgbWF0Y2hlcyB0aGlzIGNvdXJzZSBjb21wZXRlbmN5XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZnJhY0NvbXAgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llc1tpXTtcbiAgICAgICAgICAgIGlmIChmcmFjQ29tcFsndHlwZSddPy50b0xvd2VyQ2FzZSgpID09PSBjYXRlZ29yeVR5cGU/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZnJhY1RoZW1lID0gZnJhY0NvbXBbJ3RoZW1lJ10/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgICAgICBjb25zdCBmcmFjU3ViVGhlbWUgPSBmcmFjQ29tcFsnc3ViX3RoZW1lJ10/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIC8vIEVuaGFuY2VkIGNyb3NzLW1hdGNoaW5nIGxvZ2ljIChzYW1lIGFzIGluIGdldE1hdGNoZWRDb21wZXRlbmN5U3RhdHMpOlxuICAgICAgICAgICAgICAvLyAxLiBDb3Vyc2UgVGhlbWUgdnMgRlJBQyBUaGVtZVxuICAgICAgICAgICAgICAvLyAyLiBDb3Vyc2UgU3ViIFRoZW1lIHZzIEZSQUMgU3ViIFRoZW1lICBcbiAgICAgICAgICAgICAgLy8gMy4gQ291cnNlIFRoZW1lIHZzIEZSQUMgU3ViIFRoZW1lXG4gICAgICAgICAgICAgIC8vIDQuIENvdXJzZSBTdWIgVGhlbWUgdnMgRlJBQyBUaGVtZVxuICAgICAgICAgICAgICBjb25zdCBjb3Vyc2VUaGVtZVRvRnJhY1RoZW1lID0gY291cnNlVGhlbWUgPT09IGZyYWNUaGVtZTtcbiAgICAgICAgICAgICAgY29uc3QgY291cnNlU3ViVGhlbWVUb0ZyYWNTdWJUaGVtZSA9IGNvdXJzZVN1YlRoZW1lID09PSBmcmFjU3ViVGhlbWU7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdXJzZVRoZW1lVG9GcmFjU3ViVGhlbWUgPSBjb3Vyc2VUaGVtZSA9PT0gZnJhY1N1YlRoZW1lO1xuICAgICAgICAgICAgICBjb25zdCBjb3Vyc2VTdWJUaGVtZVRvRnJhY1RoZW1lID0gY291cnNlU3ViVGhlbWUgPT09IGZyYWNUaGVtZTtcblxuICAgICAgICAgICAgICBpZiAoY291cnNlVGhlbWVUb0ZyYWNUaGVtZSB8fCBjb3Vyc2VTdWJUaGVtZVRvRnJhY1N1YlRoZW1lIHx8XG4gICAgICAgICAgICAgICAgY291cnNlVGhlbWVUb0ZyYWNTdWJUaGVtZSB8fCBjb3Vyc2VTdWJUaGVtZVRvRnJhY1RoZW1lKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hUeXBlID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKGNvdXJzZVRoZW1lVG9GcmFjVGhlbWUpIG1hdGNoVHlwZSA9ICdDb3Vyc2VUaGVtZS10by1GUkFDVGhlbWUnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdXJzZVN1YlRoZW1lVG9GcmFjU3ViVGhlbWUpIG1hdGNoVHlwZSA9ICdDb3Vyc2VTdWJUaGVtZS10by1GUkFDU3ViVGhlbWUnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdXJzZVRoZW1lVG9GcmFjU3ViVGhlbWUpIG1hdGNoVHlwZSA9ICdDb3Vyc2VUaGVtZS10by1GUkFDU3ViVGhlbWUnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdXJzZVN1YlRoZW1lVG9GcmFjVGhlbWUpIG1hdGNoVHlwZSA9ICdDb3Vyc2VTdWJUaGVtZS10by1GUkFDVGhlbWUnO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYOKchSBDT01QRVRFTkNZIE1BVENIIEZPVU5EIFske21hdGNoVHlwZX1dIGZvciAke2NhdGVnb3J5VHlwZX06YCwge1xuICAgICAgICAgICAgICAgICAgY291cnNlOiB7IHRoZW1lOiBjb3Vyc2VUaGVtZSwgc3ViVGhlbWU6IGNvdXJzZVN1YlRoZW1lIH0sXG4gICAgICAgICAgICAgICAgICBmcmFjOiB7IHRoZW1lOiBmcmFjVGhlbWUsIHN1YlRoZW1lOiBmcmFjU3ViVGhlbWUgfSxcbiAgICAgICAgICAgICAgICAgIG1hdGNoVHlwZTogbWF0Y2hUeXBlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBtYXRjaGVkQ29tcGV0ZW5jaWVzLnB1c2godGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KGZyYWNUaGVtZSwgZnJhY1N1YlRoZW1lKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIEZvdW5kIGEgbWF0Y2gsIG1vdmUgdG8gbmV4dCBjb3Vyc2UgY29tcGV0ZW5jeVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFJlbW92ZSBkdXBsaWNhdGVzIGZyb20gbWF0Y2hlZCBjb21wZXRlbmNpZXNcbiAgICBtYXRjaGVkQ29tcGV0ZW5jaWVzID0gWy4uLm5ldyBTZXQobWF0Y2hlZENvbXBldGVuY2llcyldO1xuXG4gICAgY29uc29sZS5sb2coYFxcbj09PSAke2NhdGVnb3J5VHlwZS50b1VwcGVyQ2FzZSgpfSBDT01QRVRFTkNZIE1BVENISU5HID09PWApO1xuICAgIGNvbnNvbGUubG9nKGAke2NhdGVnb3J5VHlwZX0gLSBBbGwgRlJBQyBjb21wZXRlbmNpZXM6YCwgYWxsQ2F0ZWdvcnlDb21wZXRlbmNpZXMpO1xuICAgIGNvbnNvbGUubG9nKGAke2NhdGVnb3J5VHlwZX0gLSBNYXRjaGVkIGZyb20gY291cnNlczpgLCBtYXRjaGVkQ29tcGV0ZW5jaWVzKTtcbiAgICBjb25zb2xlLmxvZyhgJHtjYXRlZ29yeVR5cGV9IC0gTWF0Y2ggcmF0ZTogJHttYXRjaGVkQ29tcGV0ZW5jaWVzLmxlbmd0aH0vJHthbGxDYXRlZ29yeUNvbXBldGVuY2llcy5sZW5ndGh9ICgke01hdGgucm91bmQoKG1hdGNoZWRDb21wZXRlbmNpZXMubGVuZ3RoIC8gYWxsQ2F0ZWdvcnlDb21wZXRlbmNpZXMubGVuZ3RoKSAqIDEwMCl9JSlgKTtcblxuICAgIC8vIFJldHVybiB1bm1hdGNoZWQgY29tcGV0ZW5jaWVzICh0aG9zZSBpbiByb2xlIG1hcHBpbmcgYnV0IG5vdCBjb3ZlcmVkIGJ5IGNvdXJzZXMpXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZVN0cmluZ0FycmF5cyhhbGxDYXRlZ29yeUNvbXBldGVuY2llcywgbWF0Y2hlZENvbXBldGVuY2llcyk7XG4gIH1cblxuICBjb21wYXJlU3RyaW5nQXJyYXlzKGFycjE6IHN0cmluZ1tdLCBhcnIyOiBzdHJpbmdbXSkge1xuICAgIGNvbnNvbGUubG9nKCdBbGwgY29tcGV0ZW5jaWVzIGluIGNhdGVnb3J5OicsIGFycjEpO1xuICAgIGNvbnNvbGUubG9nKCdNYXRjaGVkIGNvbXBldGVuY2llcyBmcm9tIGNvdXJzZXM6JywgYXJyMik7XG5cbiAgICAvLyBSZXR1cm4gaXRlbXMgaW4gYXJyMSB0aGF0IGFyZSBOT1QgaW4gYXJyMiAodW5tYXRjaGVkIGNvbXBldGVuY2llcylcbiAgICBjb25zdCB1bm1hdGNoZWQgPSBhcnIxLmZpbHRlcihpdGVtID0+ICFhcnIyLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICBjb25zb2xlLmxvZygnVW5tYXRjaGVkIGNvbXBldGVuY2llczonLCB1bm1hdGNoZWQpO1xuXG4gICAgcmV0dXJuIHVubWF0Y2hlZDtcbiAgfVxuXG4gIGFkZENvdXJzZShtaXNzaW5nQ29tcGV0ZW5jeT86IHN0cmluZywgY29tcGV0ZW5jeVR5cGU/OiBzdHJpbmcpIHtcbiAgICBsZXQgZGlhbG9nRGF0YSA9IHsgLi4udGhpcy5wbGFuRGF0YSB9O1xuXG4gICAgLy8gSWYgY29tcGV0ZW5jeSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZCwgYWRkIHRoZW0gdG8gdGhlIGRpYWxvZyBkYXRhXG4gICAgaWYgKG1pc3NpbmdDb21wZXRlbmN5ICYmIGNvbXBldGVuY3lUeXBlKSB7XG4gICAgICBjb25zdCB7IHRoZW1lLCBzdWJUaGVtZSB9ID0gdGhpcy5wYXJzZVRoZW1lQW5kU3ViVGhlbWUobWlzc2luZ0NvbXBldGVuY3kpO1xuXG4gICAgICBkaWFsb2dEYXRhLnByZWZpbGxDb21wZXRlbmN5ID0ge1xuICAgICAgICB0eXBlOiBjb21wZXRlbmN5VHlwZSxcbiAgICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgICBzdWJUaGVtZTogc3ViVGhlbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBZGRDb3Vyc2VDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ291cnNlIGFkZGVkIHN1Y2Nlc3NmdWxseSEgUmVmcmVzaGluZyBkYXRhLi4uJyk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCB1c2VyIGNvdXJzZXMgdG8gaW5jbHVkZSB0aGUgbmV3bHkgYWRkZWQgY291cnNlXG4gICAgICAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpO1xuXG4gICAgICAgIC8vIFJlZnJlc2ggZ2FwIGFuYWx5c2lzIHdpdGggdGhlIGxhdGVzdCBkYXRhXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlR2FwQW5hbHlzaXNBZnRlckNvdXJzZXNVcGRhdGUoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnR2FwIGFuYWx5c2lzIHJlZnJlc2hlZCBhZnRlciBjb3Vyc2UgYWRkaXRpb24nKTtcbiAgICAgICAgfSwgNTAwKTsgLy8gU21hbGwgZGVsYXkgdG8gZW5zdXJlIGRhdGEgaXMgbG9hZGVkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmaWx0ZXJPbkNvbXBldGVuY3lUaGVtZSh0aGVtZUl0ZW0pIHtcbiAgICB0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIgPSB0aGVtZUl0ZW07XG4gICAgY29uc3QgeyB0aGVtZSwgc3ViVGhlbWUgfSA9IHRoaXMucGFyc2VUaGVtZUFuZFN1YlRoZW1lKHRoZW1lSXRlbSB8fCAnJyk7XG4gICAgbGV0IHRoZW1lTmFtZSA9IHRoZW1lO1xuICAgIGxldCBzdWJUaGVtZU5hbWUgPSBzdWJUaGVtZTtcblxuICAgIGNvbnNvbGUubG9nKCdGaWx0ZXJpbmcgYnkgdGhlbWU6JywgdGhlbWVOYW1lLCAnc3ViVGhlbWU6Jywgc3ViVGhlbWVOYW1lLCAnVGFiIGluZGV4OicsIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCk7XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgY29tcGV0ZW5jeSB0eXBlIGJhc2VkIG9uIHRoZSBhY3RpdmUgdGFiXG4gICAgbGV0IGNvbXBldGVuY3lUeXBlID0gJyc7XG4gICAgaWYgKHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMSkge1xuICAgICAgY29tcGV0ZW5jeVR5cGUgPSAnYmVoYXZpb3JhbCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDIpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ2Z1bmN0aW9uYWwnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID09PSAzKSB7XG4gICAgICBjb21wZXRlbmN5VHlwZSA9ICdkb21haW4nO1xuICAgIH1cblxuICAgIC8vIEdldCBhbGwgYXZhaWxhYmxlIGNvdXJzZXMgdXNpbmcgdGhlIGhlbHBlciBtZXRob2RcbiAgICBjb25zdCBhbGxBdmFpbGFibGVDb3Vyc2VzID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG4gICAgY29uc29sZS5sb2coJ1RvdGFsIGNvdXJzZXMgdG8gZmlsdGVyIGZyb206JywgYWxsQXZhaWxhYmxlQ291cnNlcy5sZW5ndGgpO1xuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IGFsbEF2YWlsYWJsZUNvdXJzZXMuZmlsdGVyKGNvdXJzZSA9PiB7XG4gICAgICBpZiAoIWNvdXJzZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICAgIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llcztcbiAgICAgIH0gZWxzZSBpZiAoY291cnNlLmNvbXBldGVuY2llc192NiAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wZXRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEZpbHRlciBieSBjb21wZXRlbmN5IHR5cGUgYW5kIHRoZW1lL3N1YnRoZW1lXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoY29tcCA9PiB7XG4gICAgICAgIGlmICghY29tcCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIGNvbXBldGVuY3kgdHlwZSBtYXRjaGVzIGN1cnJlbnQgdGFiXG4gICAgICAgIGxldCBjb21wVHlwZSA9IGNvbXA/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNvbXBUeXBlID09PSAnYmVoYXZpb3VyYWwnKSBjb21wVHlwZSA9ICdiZWhhdmlvcmFsJzsgLy8gTm9ybWFsaXplIHNwZWxsaW5nXG5cbiAgICAgICAgaWYgKGNvbXBUeXBlICE9PSBjb21wZXRlbmN5VHlwZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIGNyb3NzLW1hdGNoaW5nIGxpa2UgZ2FwIGFuYWx5c2lzOiB0aGVtZSB2cyBzdWJ0aGVtZSBhbmQgc3VidGhlbWUgdnMgdGhlbWVcbiAgICAgICAgY29uc3QgY29tcFRoZW1lID0gY29tcD8uY29tcGV0ZW5jeVRoZW1lTmFtZT8udG9Mb3dlckNhc2UoKT8udHJpbSgpO1xuICAgICAgICBjb25zdCBjb21wU3ViVGhlbWUgPSBjb21wPy5jb21wZXRlbmN5U3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpPy50cmltKCk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFRoZW1lID0gdGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBzZWFyY2hTdWJUaGVtZSA9IHN1YlRoZW1lTmFtZT8udG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBFbmhhbmNlZCBjcm9zcy1tYXRjaGluZyBsb2dpYyBsaWtlIGdhcCBhbmFseXNpczpcbiAgICAgICAgLy8gMS4gU2VsZWN0ZWQgVGhlbWUgdnMgQ291cnNlIFRoZW1lXG4gICAgICAgIC8vIDIuIFNlbGVjdGVkIFN1YiBUaGVtZSB2cyBDb3Vyc2UgU3ViIFRoZW1lICBcbiAgICAgICAgLy8gMy4gU2VsZWN0ZWQgVGhlbWUgdnMgQ291cnNlIFN1YiBUaGVtZVxuICAgICAgICAvLyA0LiBTZWxlY3RlZCBTdWIgVGhlbWUgdnMgQ291cnNlIFRoZW1lXG4gICAgICAgIGNvbnN0IHRoZW1lVG9UaGVtZU1hdGNoID0gc2VhcmNoVGhlbWUgJiYgY29tcFRoZW1lID09PSBzZWFyY2hUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2ggPSBzZWFyY2hTdWJUaGVtZSAmJiBjb21wU3ViVGhlbWUgPT09IHNlYXJjaFN1YlRoZW1lO1xuICAgICAgICBjb25zdCB0aGVtZVRvU3ViVGhlbWVNYXRjaCA9IHNlYXJjaFRoZW1lICYmIGNvbXBTdWJUaGVtZSA9PT0gc2VhcmNoVGhlbWU7XG4gICAgICAgIGNvbnN0IHN1YlRoZW1lVG9UaGVtZU1hdGNoID0gc2VhcmNoU3ViVGhlbWUgJiYgY29tcFRoZW1lID09PSBzZWFyY2hTdWJUaGVtZTtcblxuICAgICAgICBjb25zdCBpc01hdGNoID0gdGhlbWVUb1RoZW1lTWF0Y2ggfHwgc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2ggfHwgdGhlbWVUb1N1YlRoZW1lTWF0Y2ggfHwgc3ViVGhlbWVUb1RoZW1lTWF0Y2g7XG5cbiAgICAgICAgLy8gTG9nIG1hdGNoZXMgZm9yIGRlYnVnZ2luZyAoc2ltaWxhciB0byBnYXAgYW5hbHlzaXMpXG4gICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgbGV0IG1hdGNoVHlwZSA9ICcnO1xuICAgICAgICAgIGlmICh0aGVtZVRvVGhlbWVNYXRjaCkgbWF0Y2hUeXBlID0gJ1RoZW1lLXRvLVRoZW1lJztcbiAgICAgICAgICBlbHNlIGlmIChzdWJUaGVtZVRvU3ViVGhlbWVNYXRjaCkgbWF0Y2hUeXBlID0gJ1N1YlRoZW1lLXRvLVN1YlRoZW1lJztcbiAgICAgICAgICBlbHNlIGlmICh0aGVtZVRvU3ViVGhlbWVNYXRjaCkgbWF0Y2hUeXBlID0gJ1RoZW1lLXRvLVN1YlRoZW1lJztcbiAgICAgICAgICBlbHNlIGlmIChzdWJUaGVtZVRvVGhlbWVNYXRjaCkgbWF0Y2hUeXBlID0gJ1N1YlRoZW1lLXRvLVRoZW1lJztcblxuICAgICAgICAgIGNvbnNvbGUubG9nKGDinIUgRklMVEVSIE1BVENIIEZPVU5EIFske21hdGNoVHlwZX1dOmAsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB7IHRoZW1lOiBzZWFyY2hUaGVtZSwgc3ViVGhlbWU6IHNlYXJjaFN1YlRoZW1lIH0sXG4gICAgICAgICAgICBjb3Vyc2U6IHsgdHlwZTogY29tcFR5cGUsIHRoZW1lOiBjb21wVGhlbWUsIHN1YlRoZW1lOiBjb21wU3ViVGhlbWUgfSxcbiAgICAgICAgICAgIG1hdGNoVHlwZTogbWF0Y2hUeXBlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXRjaCBpZiBhbnkgb2YgdGhlIGNyb3NzLW1hdGNoaW5nIGNvbmRpdGlvbnMgYXJlIG1ldFxuICAgICAgICByZXR1cm4gaXNNYXRjaDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ0ZpbHRlcmVkIGNvdXJzZXMgZm9yIHRoZW1lOicsIHRoZW1lTmFtZSwgJ0NvdW50OicsIHRoaXMuZmlsdGVyZENvdXJzZXMubGVuZ3RoKTtcbiAgICBjb25zb2xlLmxvZygnRmlsdGVyZWQgY291cnNlczonLCB0aGlzLmZpbHRlcmRDb3Vyc2VzLm1hcChjID0+IGMubmFtZSB8fCBjLmNvdXJzZSkpO1xuICB9XG5cbiAgY2xlYXJUaGVtZUZpbHRlcigpIHtcbiAgICB0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIgPSAnJztcbiAgICAvLyBSZXNldCB0byBjYXRlZ29yeSBmaWx0ZXJlZCBjb3Vyc2VzIGJ5IGNhbGxpbmcgdGhlIHRhYiBjaGFuZ2UgbWV0aG9kXG4gICAgdGhpcy5vbklubmVyVGFiQ2hhbmdlKHtcbiAgICAgIGluZGV4OiB0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXgsXG4gICAgICB0YWI6IHsgdGV4dExhYmVsOiB0aGlzLmlubmVyVGFiQWN0aXZlVGV4dCB9XG4gICAgfSBhcyBhbnkpO1xuICAgIGNvbnNvbGUubG9nKCdUaGVtZSBmaWx0ZXIgY2xlYXJlZCwgc2hvd2luZyBhbGwgY291cnNlcyBmb3IgY2F0ZWdvcnk6JywgdGhpcy5pbm5lclRhYkFjdGl2ZVRleHQpO1xuICB9XG5cbiAgaXNUaGVtZVNlbGVjdGVkKHRoZW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyID09PSB0aGVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY291cnNlIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRoZW1lIGZpbHRlciB3aXRoIHByZWZpbGxlZCBjb21wZXRlbmN5IGRhdGFcbiAgICovXG4gIGFkZENvdXJzZUZvclNlbGVjdGVkVGhlbWUoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gdGhlbWUgc2VsZWN0ZWQgZm9yIGFkZGluZyBjb3Vyc2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRoZW1lLCBzdWJUaGVtZSB9ID0gdGhpcy5wYXJzZVRoZW1lQW5kU3ViVGhlbWUodGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyKTtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBjb21wZXRlbmN5IHR5cGUgYmFzZWQgb24gdGhlIGFjdGl2ZSB0YWJcbiAgICAvLyBNYXAgdGhlIHRhYiBsYWJlbHMgdG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBBZGRDb3Vyc2VDb21wb25lbnRcbiAgICBsZXQgY29tcGV0ZW5jeVR5cGUgPSAnJztcbiAgICBpZiAodGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID09PSAxKSB7XG4gICAgICBjb21wZXRlbmN5VHlwZSA9ICdCZWhhdmlvcmFsJzsgLy8gVGFiIGxhYmVsIGlzIFwiYmVoYXZpb3VyYWxcIlxuICAgIH0gZWxzZSBpZiAodGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID09PSAyKSB7XG4gICAgICBjb21wZXRlbmN5VHlwZSA9ICdGdW5jdGlvbmFsJzsgLy8gVGFiIGxhYmVsIGlzIFwiZnVuY3Rpb25hbFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDMpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ0RvbWFpbic7IC8vIFRhYiBsYWJlbCBpcyBcImRvbWFpblwiXG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1RhYiBtYXBwaW5nIC0gaW5uZXJUYWJBY3RpdmVJbmRleDonLCB0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXgsXG4gICAgICAnaW5uZXJUYWJBY3RpdmVUZXh0OicsIHRoaXMuaW5uZXJUYWJBY3RpdmVUZXh0LFxuICAgICAgJ21hcHBlZCBjb21wZXRlbmN5VHlwZTonLCBjb21wZXRlbmN5VHlwZSk7XG5cbiAgICBjb25zb2xlLmxvZygnQWRkaW5nIGNvdXJzZSBmb3IgbWlzc2luZyBjb21wZXRlbmN5OicsIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlLFxuICAgICAgdGhlbWUsXG4gICAgICBzdWJUaGVtZSxcbiAgICAgIHNlbGVjdGVkVGhlbWVGaWx0ZXI6IHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlclxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGRpYWxvZyBkYXRhIHdpdGggcHJlZmlsbGVkIGNvbXBldGVuY3kgaW5mb3JtYXRpb25cbiAgICBsZXQgZGlhbG9nRGF0YSA9IHsgLi4udGhpcy5wbGFuRGF0YSB9O1xuICAgIGRpYWxvZ0RhdGEucHJlZmlsbENvbXBldGVuY3kgPSB7XG4gICAgICB0eXBlOiBjb21wZXRlbmN5VHlwZSxcbiAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgIHN1YlRoZW1lOiBzdWJUaGVtZSB8fCAnJyAvLyBJbmNsdWRlIHN1Yi10aGVtZSBpZiBhdmFpbGFibGVcbiAgICB9O1xuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBZGRDb3Vyc2VDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnODAwcHgnLFxuICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JyxcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NvdXJzZSBhZGRlZCBzdWNjZXNzZnVsbHkgZm9yIGNvbXBldGVuY3khIFJlZnJlc2hpbmcgZGF0YS4uLicpO1xuXG4gICAgICAgIC8vIFJlZnJlc2ggdXNlciBjb3Vyc2VzIHRvIGluY2x1ZGUgdGhlIG5ld2x5IGFkZGVkIGNvdXJzZVxuICAgICAgICB0aGlzLmdldFVzZXJDb3Vyc2UoKTtcblxuICAgICAgICAvLyBVcGRhdGUgZ2FwIGFuYWx5c2lzIGFmdGVyIGNvdXJzZSBhZGRpdGlvblxuICAgICAgICB0aGlzLnVwZGF0ZUdhcEFuYWx5c2lzQWZ0ZXJDb3Vyc2VzVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXREdXJhdGlvbih0aW1lOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRTZXJ2aWNlLmNvbnZlcnQodGltZSk7XG4gIH1cblxuXG4gIGdldEJlaGF2aW91cmFsTWF0Y2hlZCgpIHtcbiAgICB0aGlzLmJlaGF2aW91cmFsTWF0Y2hlZCA9IFtdXG4gICAgY29uc29sZS5sb2coJ3RoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzJywgdGhpcy5wbGFuRGF0YSlcbiAgICBjb25zb2xlLmxvZygndGhpcy5iZWhhdmlvdXJhbE5vdE1hdGNoZWQnLCB0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZClcbiAgICB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbXBldGVuY3lLZXkgPSB0aGlzLmdldFRoZW1lU3ViVGhlbWVLZXkoaXRlbT8udGhlbWUsIGl0ZW0/LnN1Yl90aGVtZSk7XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtPy50eXBlID09PSAnQmVoYXZpb3JhbCcgJiYgdGhpcy5iZWhhdmlvdXJhbE5vdE1hdGNoZWQuaW5kZXhPZihjb21wZXRlbmN5S2V5KSA8IDApIHtcbiAgICAgICAgdGhpcy5iZWhhdmlvdXJhbE1hdGNoZWQucHVzaChpdGVtKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zb2xlLmxvZygndGhpcy5iZWhhdmlvdXJhbE1hdGNoZWQtLScsIHRoaXMuYmVoYXZpb3VyYWxNYXRjaGVkKVxuICB9XG5cbiAgZ2V0RnVuY3Rpb25hbE1hdGNoZWQoKSB7XG4gICAgdGhpcy5mdW5jdGlvbmFsTWF0Y2hlZCA9IFtdXG4gICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjb21wZXRlbmN5S2V5ID0gdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KGl0ZW0/LnRoZW1lLCBpdGVtPy5zdWJfdGhlbWUpO1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbT8udHlwZSA9PT0gJ0Z1bmN0aW9uYWwnICYmIHRoaXMuZnVuY3Rpb25hbE5vdE1hdGNoZWQuaW5kZXhPZihjb21wZXRlbmN5S2V5KSA8IDApIHtcbiAgICAgICAgdGhpcy5mdW5jdGlvbmFsTWF0Y2hlZC5wdXNoKGl0ZW0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbmFsTWF0Y2hlZFxuICB9XG5cbiAgZ2V0RG9tYWluTWF0Y2hlZCgpIHtcbiAgICB0aGlzLmRvbWFpbk1hdGNoZWQgPSBbXVxuICAgIHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29tcGV0ZW5jeUtleSA9IHRoaXMuZ2V0VGhlbWVTdWJUaGVtZUtleShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKTtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0/LnR5cGUgPT09ICdEb21haW4nICYmIHRoaXMuZG9tYWluTm90TWF0Y2hlZC5pbmRleE9mKGNvbXBldGVuY3lLZXkpIDwgMCkge1xuICAgICAgICB0aGlzLmRvbWFpbk1hdGNoZWQucHVzaChpdGVtKVxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc29sZS5sb2coJ3RoaXMuZG9tYWluTWF0Y2hlZC0tJywgdGhpcy5kb21haW5NYXRjaGVkKVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaGVtZVdpdGhTdWJUaGVtZSh0aGVtZTogYW55LCBzdWJUaGVtZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkVGhlbWUgPSAodGhlbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTdWJUaGVtZSA9IChzdWJUaGVtZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG5cbiAgICBpZiAobm9ybWFsaXplZFRoZW1lICYmIG5vcm1hbGl6ZWRTdWJUaGVtZSkge1xuICAgICAgcmV0dXJuIGAke25vcm1hbGl6ZWRUaGVtZX0gLSAke25vcm1hbGl6ZWRTdWJUaGVtZX1gO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkVGhlbWUgfHwgbm9ybWFsaXplZFN1YlRoZW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaGVtZVN1YlRoZW1lS2V5KHRoZW1lOiBhbnksIHN1YlRoZW1lOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFRoZW1lV2l0aFN1YlRoZW1lKHRoZW1lLCBzdWJUaGVtZSkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVGhlbWVBbmRTdWJUaGVtZSh2YWx1ZTogc3RyaW5nKTogeyB0aGVtZTogc3RyaW5nOyBzdWJUaGVtZTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHRleHQgPSAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgcmV0dXJuIHsgdGhlbWU6ICcnLCBzdWJUaGVtZTogJycgfTtcbiAgICB9XG5cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnIC0gJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGV4dC5zcGxpdCgnIC0gJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aGVtZTogKHBhcnRzLnNoaWZ0KCkgfHwgJycpLnRyaW0oKSxcbiAgICAgICAgc3ViVGhlbWU6IHBhcnRzLmpvaW4oJyAtICcpLnRyaW0oKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnLScpKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHRleHQuc3BsaXQoJy0nKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aGVtZTogcGFydHNbMF0udHJpbSgpLFxuICAgICAgICAgIHN1YlRoZW1lOiBwYXJ0c1sxXS50cmltKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyB0aGVtZTogdGV4dCwgc3ViVGhlbWU6ICcnIH07XG4gIH1cblxuICBkb3dubG9hZFBERigpIHtcbiAgICB0aGlzLmlzUERGRG93bmxvYWQgPSB0cnVlXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBkZkNvbnRlbnQubmF0aXZlRWxlbWVudDtcblxuICAgIC8vIFdhaXQgZm9yIGltYWdlcyB0byBsb2FkXG4gICAgY29uc3QgaW1hZ2VzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTtcbiAgICBjb25zdCBwcm9taXNlcyA9IEFycmF5LmZyb20oaW1hZ2VzKS5tYXAoKGltZzogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGltZy5jb21wbGV0ZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gaW1nLm9ubG9hZCA9IHJlc29sdmUpO1xuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgbWFyZ2luOiAwLjIwLFxuICAgICAgICBmaWxlbmFtZTogJ0dhcCBBbmFseXNpcy5wZGYnLFxuICAgICAgICBpbWFnZTogeyB0eXBlOiAnanBlZycsIHF1YWxpdHk6IDAuOTggfSxcbiAgICAgICAgaHRtbDJjYW52YXM6IHtcbiAgICAgICAgICBzY2FsZTogMixcbiAgICAgICAgICB1c2VDT1JTOiB0cnVlLFxuICAgICAgICAgIHNjcm9sbFk6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIGpzUERGOiB7XG4gICAgICAgICAgdW5pdDogJ2luJyxcbiAgICAgICAgICBmb3JtYXQ6ICdhNCcsXG4gICAgICAgICAgb3JpZW50YXRpb246ICdwb3J0cmFpdCdcbiAgICAgICAgfSxcbiAgICAgICAgcGFnZWJyZWFrOiB7XG4gICAgICAgICAgbW9kZTogWydjc3MnLCAnbGVnYWN5J10sXG4gICAgICAgICAgYmVmb3JlOiAnLnBhZ2UtYnJlYWsnLFxuICAgICAgICAgIGF2b2lkOiBbJy5uby1icmVhayddXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGh0bWwycGRmKCkuZnJvbShlbGVtZW50KS5zZXQob3B0aW9ucykuc2F2ZSgpXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1BERkRvd25sb2FkID0gZmFsc2VcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LCAzMDAwKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgcmVkaXJlY3RUb1RvYyhpdGVtKSB7XG4gICAgaWYgKGl0ZW0/LnB1YmxpY19saW5rKSB7XG4gICAgICB3aW5kb3cub3BlbihpdGVtPy5wdWJsaWNfbGluaywgJ19ibGFuaycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1cmwgPSBgaHR0cHM6Ly9wb3J0YWwuaWdvdGthcm1heW9naS5nb3YuaW4vYXBwL3RvYy8ke2l0ZW0/LmlkZW50aWZpZXJ9L292ZXJ2aWV3P2BcbiAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBnYXAgYW5hbHlzaXMgc3RhdHMgYWZ0ZXIgaW5pdGlhbCBkYXRhIGxvYWRcbiAgICovXG4gIGluaXRpYWxpemVHYXBBbmFseXNpc1N0YXRzKCkge1xuICAgIC8vIFNldCBhIHNtYWxsIHRpbWVvdXQgdG8gZW5zdXJlIGFsbCBhc3luYyBvcGVyYXRpb25zIGNvbXBsZXRlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJkQ291cnNlcyAmJiB0aGlzLmZpbHRlcmRDb3Vyc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5nYXBBbmFseXNpc1N0YXRzKCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZ2FwIGFuYWx5c2lzIHN0YXRzIGFmdGVyIGNvdXJzZXMgYXJlIHVwZGF0ZWQgKGxpa2Ugc3VnZ2VzdGVkIGNvdXJzZXMgYWRkZWQpXG4gICAqL1xuICB1cGRhdGVHYXBBbmFseXNpc0FmdGVyQ291cnNlc1VwZGF0ZSgpIHtcbiAgICAvLyBEb24ndCBtb2RpZnkgb3JpZ2luYWxEYXRhIC0gaXQgc2hvdWxkIHJlbWFpbiBhcyBBSSByZWNvbW1lbmRlZCBjb3Vyc2VzIG9ubHlcbiAgICAvLyBUaGUgZ2FwIGFuYWx5c2lzIGFscmVhZHkgcHJvcGVybHkgaW5jbHVkZXMgYWxsIGNvdXJzZSB0eXBlc1xuXG4gICAgLy8gUmVjYWxjdWxhdGUgZ2FwIGFuYWx5c2lzIHN0YXRzXG4gICAgdGhpcy5nYXBBbmFseXNpc1N0YXRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnZW5lcmF0ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb25zIGJ5IGRlbGV0aW5nIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBhbmQgZ2VuZXJhdGluZyBuZXcgb25lc1xuICAgKi9cbiAgYXN5bmMgcmVnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucygpIHtcbiAgICBpZiAodGhpcy5pc1JlZ2VuZXJhdGluZykge1xuICAgICAgcmV0dXJuOyAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyByZWdlbmVyYXRpb25zXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSB0cnVlO1xuXG4gICAgICAvLyBTaG93IGNvbmZpcm1hdGlvbiBkaWFsb2dcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1hdGlvbkRpYWxvZygpO1xuXG4gICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ1N0YXJ0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiByZWdlbmVyYXRpb24uLi4nKTtcblxuICAgICAgLy8gU2V0IHJlZ2VuZXJhdGlvbiBwcm9ncmVzcyBzdGF0ZVxuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTsgLy8gSGlkZSBtYWluIGNvbnRlbnQgZHVyaW5nIHJlZ2VuZXJhdGlvblxuXG4gICAgICAvLyBTdGVwIDE6IERlbGV0ZSBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zXG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucygpO1xuXG4gICAgICAvLyBTdGVwIDI6IEdlbmVyYXRlIG5ldyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlTmV3Q291cnNlUmVjb21tZW5kYXRpb25zKCk7XG5cbiAgICAgIC8vIFN0ZXAgMzogUmVmcmVzaCB0aGUgY3VycmVudCBkYXRhXG4gICAgICB0aGlzLnJlZnJlc2hDb21wb25lbnQoKTtcblxuICAgICAgY29uc29sZS5sb2coJ0NvdXJzZSByZWNvbW1lbmRhdGlvbiByZWdlbmVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICAvLyBTaG93IHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIHJlZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnLCAnQ2xvc2UnLCB7XG4gICAgICAgIGR1cmF0aW9uOiA1MDAwLFxuICAgICAgICBwYW5lbENsYXNzOiBbJ3N1Y2Nlc3Mtc25hY2tiYXInXVxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiByZWdlbmVyYXRpb246JywgZXJyb3IpO1xuXG4gICAgICAvLyBTaG93IGVycm9yIG1lc3NhZ2VcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignRmFpbGVkIHRvIHJlZ2VuZXJhdGUgY291cnNlIHJlY29tbWVuZGF0aW9ucy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnQ2xvc2UnLCB7XG4gICAgICAgIGR1cmF0aW9uOiA1MDAwLFxuICAgICAgICBwYW5lbENsYXNzOiBbJ2Vycm9yLXNuYWNrYmFyJ11cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0b3BQcm9ncmVzc2l2ZUxvYWRpbmcoKTtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7IC8vIEVuc3VyZSBtYWluIGNvbnRlbnQgaXMgc2hvd24gYWZ0ZXIgcmVnZW5lcmF0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZyBmb3IgcmVnZW5lcmF0ZSBhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2hvd0NvbmZpcm1hdGlvbkRpYWxvZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFJlZ2VuZXJhdGVDb25maXJtYXRpb25EaWFsb2csIHtcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICdyZWdlbmVyYXRlLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQgPT09IHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHJvbGUgbWFwcGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZU1hcElkID0gdGhpcy5wbGFuRGF0YT8uaWQ7XG5cbiAgICAgIGlmICghcm9sZU1hcElkKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1JvbGUgbWFwcGluZyBJRCBub3QgZm91bmQnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHJvbGUgbWFwcGluZzonLCByb2xlTWFwSWQpO1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKHJvbGVNYXBJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgZGVsZXRlZCBzdWNjZXNzZnVsbHk6JywgcmVzcG9uc2UpO1xuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVsZXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uczonLCBlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbmV3IGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZHVyaW5nIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5ld0NvdXJzZVJlY29tbWVuZGF0aW9ucygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0aW5nIG5ldyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVjb21tZW5kZWRDb3Vyc2VGb3JSZWdlbmVyYXRpb24odGhpcy5wbGFuRGF0YS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgY291cnNlIGdlbmVyYXRpb24gc3BlY2lmaWNhbGx5IGZvciByZWdlbmVyYXRpb24gd2l0aCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAqL1xuICBwcml2YXRlIGdldFJlY29tbWVuZGVkQ291cnNlRm9yUmVnZW5lcmF0aW9uKHJvbGVfbWFwcGluZ19pZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU3RhcnQgdGhlIHByb2dyZXNzaXZlIGxvYWRpbmcgc2ltdWxhdGlvbiBmb3IgcmVnZW5lcmF0aW9uXG4gICAgICB0aGlzLnN0YXJ0UmVnZW5lcmF0aXZlUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG5cbiAgICAgIC8vIE1ha2UgdGhlIGFjdHVhbCBBUEkgY2FsbFxuICAgICAgLy8gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIC8vICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nIGFuZCBzaG93IGNvbXBsZXRpb25cbiAgICAgIC8vICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2U7IC8vIFRoaXMgd2lsbCBzdG9wIHRoZSBpbnRlcnZhbFxuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIHJlZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAvLyAgICAgLy8gQ2xlYXIgdGhlIGxvYWRpbmcgc3RhdGUgYWZ0ZXIgc2hvd2luZyBjb21wbGV0aW9uXG4gICAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgIC8vICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgIC8vICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgLy8gICAgIH0sIDIwMDApO1xuICAgICAgLy8gICB9LFxuICAgICAgLy8gICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAgICAvLyAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcblxuICAgICAgLy8gICAgIC8vIEhhbmRsZSBzcGVjaWZpYyBlcnJvciBjYXNlc1xuICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwOSB8fCBlcnJvci5lcnJvcj8uZGV0YWlsPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuICAgICAgLy8gICAgICAgLy8gQ291cnNlIHJlY29tbWVuZGF0aW9ucyBhbHJlYWR5IGV4aXN0IC0gdGhpcyBpcyBub3JtYWxcbiAgICAgIC8vICAgICAgIGNvbnNvbGUubG9nKCdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIGFscmVhZHkgZXhpc3QsIGxvYWRpbmcgZXhpc3RpbmcgZGF0YS4uLicpO1xuXG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGluZyBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgLy8gICAgICAgLy8gVHJ5IHRvIGdldCBleGlzdGluZyBkYXRhXG4gICAgICAvLyAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgLy8gICAgICAgICBuZXh0OiAoZXhpc3RpbmdSZXNwb25zZSkgPT4ge1xuICAgICAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgbG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMnKTtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgIC8vICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgICAgcmVzb2x2ZShleGlzdGluZ1Jlc3BvbnNlKTtcbiAgICAgIC8vICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgIC8vICAgICAgICAgfSxcbiAgICAgIC8vICAgICAgICAgZXJyb3I6IChsb2FkRXJyb3IpID0+IHtcbiAgICAgIC8vICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zOicsIGxvYWRFcnJvcik7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgIHJlamVjdChsb2FkRXJyb3IpO1xuICAgICAgLy8gICAgICAgICB9XG4gICAgICAvLyAgICAgICB9KTtcbiAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiByZWdlbmVyYXRpb246JywgZXJyb3IpO1xuICAgICAgLy8gICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0pO1xuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnR2VuZXJhdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgaW50ZXJ2YWwoNTAwMClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5waXBlKFxuICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGVycm9yIHRocm91Z2ggb2JzZXJ2YWJsZSBzbyBwb2xsaW5nIGxvZ2ljIGNhbiBpbnNwZWN0IGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIHRhcChyZXMgPT4gY29uc29sZS5sb2coXCJQb2xsaW5nIHJlc3VsdDpcIiwgcmVzKSksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiDirIfvuI8gU1RPUCBQT0xMSU5HIG9ubHkgd2hlbjpcbiAgICAgICAgICAgKiAtIFNVQ0NFU1Mg4oaSIHJlcy5zdGF0dXMgPT09IENPTVBMRVRFRFxuICAgICAgICAgICAqIC0gRVJST1Ig4oaSIGNvbmZsaWN0IC8gYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0YWtlV2hpbGUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiBmYWxzZTsgICAgICAgLy8gU3RvcFxuICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3I/LnN0YXR1cyA9PT0gNDA5KSByZXR1cm4gZmFsc2U7ICAgICAgICAvLyBTdG9wXG4gICAgICAgICAgICBpZiAocmVzPy5lcnJvcj8uZXJyb3I/LmRldGFpbD8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHJldHVybiBmYWxzZTsgLy8gU3RvcFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgcG9sbGluZ1xuICAgICAgICAgIH0sIHRydWUpIC8vIGluY2x1ZGUgZmluYWwgZW1pc3Npb25cbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICogIFNVQ0NFU1MgQ0FTRSAoc3RhdHVzIENPTVBMRVRFRClcbiAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgICAgICB0aGlzLnN0b3BQcm9ncmVzc2l2ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgcmVnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgfSwgMjAwMCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgICAqICBFUlJPUiBDQVNFICg0MDkgLyBhbHJlYWR5IGV4aXN0cylcbiAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgICAgIGlmIChyZXM/LmVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzLmVycm9yO1xuXG4gICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwOSB8fCBlcnJvcj8uZXJyb3I/LmRldGFpbD8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcblxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdMb2FkaW5nIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMuLi4nO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgIG5leHQ6IChleGlzdGluZ0RhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXhpc3RpbmdEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGxvYWRFcnJvciA9PiByZWplY3QobG9hZEVycm9yKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLyoqIEFueSBvdGhlciBlcnJvciDihpIgc3RvcCAmIHJlamVjdCAqL1xuICAgICAgICAgICAgICB0aGlzLnN0b3BQcm9ncmVzc2l2ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgICAqICBTVElMTCBQUk9DRVNTSU5HIChrZWVwIHBvbGxpbmcpXG4gICAgICAgICAgICAgKiAgUHJvZ3Jlc3Mvc3RhZ2UgdGV4dCBpcyBkcml2ZW4gc29sZWx5IGJ5XG4gICAgICAgICAgICAgKiAgc2ltdWxhdGVSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZVN0YWdlcygpICh0aW1lLWJhc2VkKTtcbiAgICAgICAgICAgICAqICBkbyBub3QgYWxzbyBzZXQgaXQgaGVyZSBvciB0aGUgZGlzcGxheSBmbGlja2Vyc1xuICAgICAgICAgICAgICogIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHR3byBzb3VyY2VzLlxuICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3BQcm9ncmVzc2l2ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG5cbiAgLy8gUHJvZ3Jlc3NpdmUgbG9hZGluZyBtZXRob2RzIGZvciByZWdlbmVyYXRpb25cbiAgc3RhcnRSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZUxvYWRpbmcoKSB7XG4gICAgdGhpcy5zdG9wUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG4gICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzWzBdO1xuICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICB0aGlzLnN0YWdlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnNpbXVsYXRlUmVnZW5lcmF0aXZlUHJvZ3Jlc3NpdmVTdGFnZXMoKTtcbiAgfVxuXG4gIHNpbXVsYXRlUmVnZW5lcmF0aXZlUHJvZ3Jlc3NpdmVTdGFnZXMoKSB7XG4gICAgbGV0IGN1cnJlbnRTdGFnZUluZGV4ID0gMDtcbiAgICBjb25zdCB0b3RhbER1cmF0aW9uID0gNjAwMDA7IC8vIDYwIHNlY29uZHMgZXN0aW1hdGVkIGR1cmF0aW9uXG4gICAgY29uc3Qgc3RhZ2VJbnRlcnZhbCA9IHRvdGFsRHVyYXRpb24gLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoO1xuXG4gICAgLy8gQ29tcGxldGlvbi9lcnJvci9yZXNldCBhcmUgYWxsIHNldCBleHBsaWNpdGx5IGJ5IHRoZSBjYWxsZXIgKHZpYVxuICAgIC8vIHN0b3BQcm9ncmVzc2l2ZUxvYWRpbmcoKSk7IHRoaXMgdGlja2VyIG9ubHkgZXZlciByYW1wcyB0aGUgZGlzcGxheVxuICAgIC8vIHVwIHdoaWxlIGFjdGl2ZSwgaXQgbmV2ZXIgaW5mZXJzIGNvbXBsZXRpb24gb24gaXRzIG93bi5cbiAgICB0aGlzLnByb2dyZXNzVGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5zdGFnZVN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGFnZVByb2dyZXNzID0gKGVsYXBzZWQgJSBzdGFnZUludGVydmFsKSAvIHN0YWdlSW50ZXJ2YWw7XG4gICAgICBjb25zdCBzdGFnZUluZGV4ID0gTWF0aC5taW4oTWF0aC5mbG9vcihlbGFwc2VkIC8gc3RhZ2VJbnRlcnZhbCksIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGggLSAxKTtcblxuICAgICAgLy8gVXBkYXRlIHN0YWdlIGlmIG5lZWRlZFxuICAgICAgaWYgKHN0YWdlSW5kZXggIT09IGN1cnJlbnRTdGFnZUluZGV4ICYmIHN0YWdlSW5kZXggPCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnJlbnRTdGFnZUluZGV4ID0gc3RhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyAoZWFjaCBzdGFnZSBpcyB3b3J0aCB+MTYuNjclKVxuICAgICAgY29uc3QgYmFzZVByb2dyZXNzID0gKHN0YWdlSW5kZXggLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHN0YWdlUHJvZ3Jlc3MgPSAoY3VycmVudFN0YWdlUHJvZ3Jlc3MgLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIGNvbnN0IGNvbXB1dGVkUHJvZ3Jlc3MgPSBNYXRoLm1pbihNYXRoLnJvdW5kKGJhc2VQcm9ncmVzcyArIHN0YWdlUHJvZ3Jlc3MpLCA5NSk7XG4gICAgICAvLyBPbmNlIHRoZSBsYXN0IHN0YWdlIGlzIHJlYWNoZWQsIGBlbGFwc2VkICUgc3RhZ2VJbnRlcnZhbGAga2VlcHMgY3ljbGluZ1xuICAgICAgLy8gZXZlcnkgYHN0YWdlSW50ZXJ2YWxgIG1zIGV2ZW4gdGhvdWdoIGBzdGFnZUluZGV4YCBpcyBjbGFtcGVkIC0gd2l0aG91dFxuICAgICAgLy8gdGhpcyBndWFyZCB0aGUgZGlzcGxheSB3b3VsZCBjbGltYiB0byA5NSUgdGhlbiBkcm9wIGJhY2sgZG93biBhbmRcbiAgICAgIC8vIHJlcGVhdCBmb3IgYXMgbG9uZyBhcyBnZW5lcmF0aW9uIHJ1bnMgcGFzdCB0aGUgYXNzdW1lZCA2MHMgZHVyYXRpb25cbiAgICAgIC8vIChyZWFsIGdlbmVyYXRpb24gY29tbW9ubHkgdGFrZXMgMS0yIG1pbnV0ZXMpLiBOZXZlciBsZXQgaXQgcmVncmVzcy5cbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gTWF0aC5tYXgodGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UsIGNvbXB1dGVkUHJvZ3Jlc3MpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIGNvbXBvbmVudCBkYXRhIGFmdGVyIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoQ29tcG9uZW50KCkge1xuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIGNvbXBvbmVudCBkYXRhLi4uJyk7XG5cbiAgICAvLyBSZXNldCBhbGwgZmlsdGVycyBhbmQgc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnO1xuICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSBbXTtcbiAgICB0aGlzLm9yaWdpbmFsRmlsdGVyZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy5sYXN0RW5yaWNoZWRJZGVudGlmaWVyc0tleSA9ICcnO1xuXG4gICAgLy8gUmVzZXQgdGFiIHN0YXRlc1xuICAgIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9IDA7XG4gICAgdGhpcy5vdXRlclRhYkFjdGl2ZUluZGV4ID0gMDtcblxuICAgIC8vIENhbGwgdGhlIGRhdGEgbG9hZGluZyBtZXRob2RzIGRpcmVjdGx5IHRvIGF2b2lkIHJlc2V0dGluZyBkYXRhTG9hZGVkXG4gICAgdGhpcy5sb2FkQ29tcG9uZW50RGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29tcG9uZW50IGRhdGEgKHNlcGFyYXRlZCBmcm9tIG5nT25Jbml0IGZvciByZXVzZSlcbiAgICovXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudERhdGEoKSB7XG4gICAgdGhpcy5nZXRSZWNvbW1lbmRlZENvdXJzZVdpdGhQcm9ncmVzcyh0aGlzLnBsYW5EYXRhLmlkKS50aGVuKChyZXMpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcy5pZFxuICAgICAgbGV0IGFsbENvdXJlcyA9IFtdXG4gICAgICBpZiAocmVzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICByZXM/LmZpbHRlcmVkX2NvdXJzZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtPy5yZWxldmFuY3kgPj0gNzUpIHtcbiAgICAgICAgICAgIGFsbENvdXJlcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeShhbGxDb3VyZXMpXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3koYWxsQ291cmVzKVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgICB0aGlzLmdldENvdXJzZXMoKVxuICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuXG4gICAgICAvLyBJbml0aWFsaXplIGdhcCBhbmFseXNpcyBzdGF0cyBhZnRlciBjb3Vyc2VzIGFyZSBsb2FkZWRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUdhcEFuYWx5c2lzU3RhdHMoKVxuICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKClcblxuICAgICAgLy8gTWFyayBkYXRhIGFzIGxvYWRlZCBhZnRlciBhbGwgaW5pdGlhbCBvcGVyYXRpb25zXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyByZWNvbW1lbmRlZCBjb3Vyc2VzOicsIGVycm9yKTtcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICBjb25zb2xlLmxvZygnVW5hdXRob3JpemVkIGFjY2VzcyAtIHVzZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGxvZ2luJyk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YXR1cyAhPT0gNDA5KSB7XG4gICAgICAgIC8vIERvbid0IGxvZyBlcnJvciBmb3IgNDA5IChhbHJlYWR5IGV4aXN0cykgYXMgaXQncyBoYW5kbGVkIGluIHRoZSBtZXRob2RcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgY291cnNlIHJlY29tbWVuZGF0aW9ucycpO1xuICAgICAgfVxuICAgICAgLy8gTWFyayBkYXRhIGFzIGxvYWRlZCBldmVuIGlmIHRoZXJlJ3MgYW4gZXJyb3IgdG8gc2hvdyB0aGUgZGlhbG9nIGNvbnRlbnRcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyBQcm9ncmVzc2l2ZSBsb2FkaW5nIG1ldGhvZHMgZm9yIGNvdXJzZSBnZW5lcmF0aW9uXG4gIHN0YXJ0UHJvZ3Jlc3NpdmVMb2FkaW5nKCkge1xuICAgIHRoaXMuc3RvcFByb2dyZXNzaXZlTG9hZGluZygpO1xuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1swXTtcbiAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgdGhpcy5zdGFnZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5zaW11bGF0ZVByb2dyZXNzaXZlU3RhZ2VzKCk7XG4gIH1cblxuICBzaW11bGF0ZVByb2dyZXNzaXZlU3RhZ2VzKCkge1xuICAgIGxldCBjdXJyZW50U3RhZ2VJbmRleCA9IDA7XG4gICAgY29uc3QgdG90YWxEdXJhdGlvbiA9IDYwMDAwOyAvLyA2MCBzZWNvbmRzIGVzdGltYXRlZCBkdXJhdGlvblxuICAgIGNvbnN0IHN0YWdlSW50ZXJ2YWwgPSB0b3RhbER1cmF0aW9uIC8gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aDtcblxuICAgIC8vIENvbXBsZXRpb24vZXJyb3IvcmVzZXQgYXJlIGFsbCBzZXQgZXhwbGljaXRseSBieSB0aGUgY2FsbGVyICh2aWFcbiAgICAvLyBzdG9wUHJvZ3Jlc3NpdmVMb2FkaW5nKCkpOyB0aGlzIHRpY2tlciBvbmx5IGV2ZXIgcmFtcHMgdGhlIGRpc3BsYXlcbiAgICAvLyB1cCB3aGlsZSBhY3RpdmUsIGl0IG5ldmVyIGluZmVycyBjb21wbGV0aW9uIG9uIGl0cyBvd24uXG4gICAgdGhpcy5wcm9ncmVzc1RpbWVySWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHRoaXMuc3RhZ2VTdGFydFRpbWU7XG4gICAgICBjb25zdCBjdXJyZW50U3RhZ2VQcm9ncmVzcyA9IChlbGFwc2VkICUgc3RhZ2VJbnRlcnZhbCkgLyBzdGFnZUludGVydmFsO1xuICAgICAgY29uc3Qgc3RhZ2VJbmRleCA9IE1hdGgubWluKE1hdGguZmxvb3IoZWxhcHNlZCAvIHN0YWdlSW50ZXJ2YWwpLCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoIC0gMSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBzdGFnZSBpZiBuZWVkZWRcbiAgICAgIGlmIChzdGFnZUluZGV4ICE9PSBjdXJyZW50U3RhZ2VJbmRleCAmJiBzdGFnZUluZGV4IDwgdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aCkge1xuICAgICAgICBjdXJyZW50U3RhZ2VJbmRleCA9IHN0YWdlSW5kZXg7XG4gICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1tzdGFnZUluZGV4XTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIG92ZXJhbGwgcHJvZ3Jlc3MgKGVhY2ggc3RhZ2UgaXMgd29ydGggfjE2LjY3JSlcbiAgICAgIGNvbnN0IGJhc2VQcm9ncmVzcyA9IChzdGFnZUluZGV4IC8gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aCkgKiAxMDA7XG4gICAgICBjb25zdCBzdGFnZVByb2dyZXNzID0gKGN1cnJlbnRTdGFnZVByb2dyZXNzIC8gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzLmxlbmd0aCkgKiAxMDA7XG4gICAgICBjb25zdCBjb21wdXRlZFByb2dyZXNzID0gTWF0aC5taW4oTWF0aC5yb3VuZChiYXNlUHJvZ3Jlc3MgKyBzdGFnZVByb2dyZXNzKSwgOTUpO1xuICAgICAgLy8gT25jZSB0aGUgbGFzdCBzdGFnZSBpcyByZWFjaGVkLCBgZWxhcHNlZCAlIHN0YWdlSW50ZXJ2YWxgIGtlZXBzIGN5Y2xpbmdcbiAgICAgIC8vIGV2ZXJ5IGBzdGFnZUludGVydmFsYCBtcyBldmVuIHRob3VnaCBgc3RhZ2VJbmRleGAgaXMgY2xhbXBlZCAtIHdpdGhvdXRcbiAgICAgIC8vIHRoaXMgZ3VhcmQgdGhlIGRpc3BsYXkgd291bGQgY2xpbWIgdG8gOTUlIHRoZW4gZHJvcCBiYWNrIGRvd24gYW5kXG4gICAgICAvLyByZXBlYXQgZm9yIGFzIGxvbmcgYXMgZ2VuZXJhdGlvbiBydW5zIHBhc3QgdGhlIGFzc3VtZWQgNjBzIGR1cmF0aW9uXG4gICAgICAvLyAocmVhbCBnZW5lcmF0aW9uIGNvbW1vbmx5IHRha2VzIDEtMiBtaW51dGVzKS4gTmV2ZXIgbGV0IGl0IHJlZ3Jlc3MuXG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IE1hdGgubWF4KHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlLCBjb21wdXRlZFByb2dyZXNzKTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIC8vIEVuaGFuY2VkIGNvdXJzZSBnZW5lcmF0aW9uIHdpdGggcHJvZ3Jlc3NpdmUgbG9hZGluZ1xuICBnZXRSZWNvbW1lbmRlZENvdXJzZVdpdGhQcm9ncmVzcyhyb2xlX21hcHBpbmdfaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdHZW5lcmF0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMuLi4nO1xuICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAzMDtcblxuICAgICAgdGhpcy5zdGFydFByb2dyZXNzaXZlTG9hZGluZygpO1xuXG4gICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICBjb25jYXQoXG4gICAgICAgIG9mKG51bGwpLCAgICAgICAgICAvLyBpbW1lZGlhdGUgY2FsbFxuICAgICAgICBpbnRlcnZhbCg1MDAwKSAgICAgLy8gcG9sbCBldmVyeSA1IHNlY1xuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSZWNvbW1lbmRlZENvdXJzZShyb2xlX21hcHBpbmdfaWQpXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIHRhcCgocmVzcG9uc2U6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlyc3RBcGlSZXNwb25zZSAmJiAhdGhpcy5leGlzdGluZ1JlY29tbWVuZGF0aW9uRm91bmQpIHtcbiAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNfZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgJ0ZpcnN0IHJlY29tbWVuZGF0aW9uIHJlc3BvbnNlOicsXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9KSxcblxuICAgICAgICAgIHRha2VXaGlsZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICAvLyBzdG9wIHBvbGxpbmcgaWYgZXhpc3RpbmcgcmVjb21tZW5kYXRpb25zIGZvdW5kXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdEFwaVJlc3BvbnNlPy5pc19leGlzdGluZykge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZT8uc3RhdHVzICE9PSAnQ09NUExFVEVEJztcblxuICAgICAgICAgIH0sIHRydWUpLFxuXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcblxuICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgLy8gRVhJU1RJTkcgUkVDT01NRU5EQVRJT05TXG4gICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0QXBpUmVzcG9uc2U/LmlzX2V4aXN0aW5nICYmIHRoaXMuZXhpc3RpbmdSZWNvbW1lbmRhdGlvbkZvdW5kKSB7XG5cbiAgICAgICAgICAgICAgLy8gTm90IGEgcmVhbCBjb21wbGV0aW9uIC0ganVzdCBwYXVzaW5nIGZvciB1c2VyIGlucHV0LiBTdG9wIHRoZVxuICAgICAgICAgICAgICAvLyBmYWtlLXByb2dyZXNzIHRpY2tlciBub3cgc28gaXQgY2FuJ3Qgd2FrZSB1cCBhIHNlY29uZCBsYXRlcixcbiAgICAgICAgICAgICAgLy8gc2VlIGBsb2FkaW5nYCBpcyBmYWxzZSwgYW5kIGZsYXNoIHRoZSBkaXNwbGF5IHRvIDEwMCUvXCJzdWNjZXNzXCIuXG4gICAgICAgICAgICAgIHRoaXMuc3RvcFByb2dyZXNzaXZlTG9hZGluZygpO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICAgICAgRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICdnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucycgICAgICAgICAgICAgICAgIC8vIGluZGV4IGZvciBVSSByZW1vdmFsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKHJvbGVfbWFwcGluZ19pZClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG5cbiAgICAgICAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlY29tbWVuZGVkQ291cnNlV2l0aFByb2dyZXNzKHJvbGVfbWFwcGluZ19pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBkZWxldGUgcmVjb21tZW5kYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmZpcnN0QXBpUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBDT01QTEVURURcbiAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMgPT09ICdDT01QTEVURUQnKSB7XG5cbiAgICAgICAgICAgICAgdGhpcy5zdG9wUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9XG4gICAgICAgICAgICAgICAgJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgICAgICAgICAgfSwgMjAwMCk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgICAgICAgICdSZWNvbW1lbmRhdGlvbnMgcmVhZHkhJyxcbiAgICAgICAgICAgICAgICAnWCcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLnN0b3BQcm9ncmVzc2l2ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBnZW5lcmF0ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLicsXG4gICAgICAgICAgICAgICdYJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLnJlc2V0KHtcbiAgICAgIGNvbXBldGVuY3k6IFtdLFxuICAgICAgcmF0aW5nOiBbXSxcbiAgICAgIGxhbmd1YWdlOiBbXSxcbiAgICAgIGR1cmF0aW9uOiBbXSxcbiAgICAgIHByb3ZpZGVyOiBbXVxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZmlsdGVyZWQgZHJvcGRvd24gbGlzdHNcbiAgICB0aGlzLmZpbHRlcmVkQ29tcGV0ZW5jeSA9IFsuLi50aGlzLmNvbXBldGVuY2llc1R5cGVdO1xuICAgIHRoaXMuZmlsdGVyZWRSYXRpbmdzID0gWy4uLnRoaXMucmF0aW5nc107XG4gICAgdGhpcy5maWx0ZXJlZExhbmd1YWdlcyA9IFsuLi50aGlzLmxhbmd1YWdlc107XG4gICAgdGhpcy5maWx0ZXJlZER1cmF0aW9ucyA9IFsuLi50aGlzLmR1cmF0aW9uc107XG4gICAgdGhpcy5maWx0ZXJlZFByb3ZpZGVycyA9IFsuLi50aGlzLnByb3ZpZGVyc107XG5cbiAgICAvLyBSZXNldCBjb3Vyc2UgbGlzdFxuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSBbLi4udGhpcy5mdWxsQ291cnNlTGlzdF07XG4gICAgLy8gdGhpcy5mdWxsQ291cnNlTGlzdC5mb3JFYWNoKChpdGVtKT0+e1xuICAgIC8vICAgaWYoaXRlbSAmJiBpdGVtLm9yZ2FuaXNhdGlvbiAmJiBpdGVtLm9yZ2FuaXNhdGlvbi5sZW5ndGgpIHtcbiAgICAvLyAgICAgaWYodGhpcy5maWx0ZXJlZFByb3ZpZGVycy5pbmRleE9mKGl0ZW0ub3JnYW5pc2F0aW9uWzBdKSA8IDApIHtcbiAgICAvLyAgICAgICB0aGlzLmZpbHRlcmVkUHJvdmlkZXJzLnB1c2goaXRlbS5vcmdhbmlzYXRpb25bMF0pXG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gICAgdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKClcbiAgfVxuXG4gIGZpbHRlckxpc3QodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VhcmNoID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnY29tcGV0ZW5jeSc6XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb21wZXRlbmN5ID0gdGhpcy5jb21wZXRlbmNpZXNUeXBlLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyYXRpbmcnOlxuICAgICAgICB0aGlzLmZpbHRlcmVkUmF0aW5ncyA9IHRoaXMucmF0aW5ncy5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGFuZ3VhZ2UnOlxuICAgICAgICB0aGlzLmZpbHRlcmVkTGFuZ3VhZ2VzID0gdGhpcy5sYW5ndWFnZXMuZmlsdGVyKHYgPT4gdi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2R1cmF0aW9uJzpcbiAgICAgICAgdGhpcy5maWx0ZXJlZER1cmF0aW9ucyA9IHRoaXMuZHVyYXRpb25zLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwcm92aWRlcic6XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm92aWRlcnMgPSB0aGlzLnByb3ZpZGVycy5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZUNvbXBldGVuY3kodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHYgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHYgPT09ICdhbGwnKSByZXR1cm4gJ2FsbCc7XG4gICAgaWYgKHYuaW5jbHVkZXMoJ2JlaGF2aW91cmFsJykgfHwgdi5pbmNsdWRlcygnYmVoYXZpb3JhbCcpKSByZXR1cm4gJ2JlaGF2aW9yYWwnO1xuICAgIGlmICh2LmluY2x1ZGVzKCdmdW5jdGlvbmFsJykpIHJldHVybiAnZnVuY3Rpb25hbCc7XG4gICAgaWYgKHYuaW5jbHVkZXMoJ2RvbWFpbicpKSByZXR1cm4gJ2RvbWFpbic7XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tcGV0ZW5jeSA9IFtdLFxuICAgICAgcmF0aW5nID0gW10sXG4gICAgICBsYW5ndWFnZSA9IFtdLFxuICAgICAgZHVyYXRpb24gPSBbXSxcbiAgICAgIHByb3ZpZGVyID0gW11cbiAgICB9ID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlO1xuXG4gICAgY29uc29sZS5sb2coJ3RoaXMuZnVsbENvdXJzZUxpc3QtLScsIHRoaXMuZnVsbENvdXJzZUxpc3QpXG5cbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gdGhpcy5mdWxsQ291cnNlTGlzdC5maWx0ZXIoY291cnNlID0+IHtcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBDb21wZXRlbmN5IC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IGNvdXJzZUNvbXBldGVuY2llcyA9IFtcbiAgICAgICAgLi4uKGNvdXJzZS5jb21wZXRlbmNpZXMgfHwgW10pLFxuICAgICAgICAuLi4oY291cnNlLmNvbXBldGVuY2llc192NiB8fCBbXSlcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkQ29tcGV0ZW5jaWVzID0gY29tcGV0ZW5jeVxuICAgICAgICAubWFwKChjOiBzdHJpbmcpID0+IHRoaXMubm9ybWFsaXplQ29tcGV0ZW5jeShjKSlcbiAgICAgICAgLmZpbHRlcihjID0+IGMgIT09ICcnKTtcblxuICAgICAgY29uc3QgY29tcGV0ZW5jeU1hdGNoID1cbiAgICAgICAgc2VsZWN0ZWRDb21wZXRlbmNpZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIHNlbGVjdGVkQ29tcGV0ZW5jaWVzLmluY2x1ZGVzKCdhbGwnKSB8fFxuICAgICAgICBjb3Vyc2VDb21wZXRlbmNpZXMuc29tZSgoYzogYW55KSA9PlxuICAgICAgICAgIHNlbGVjdGVkQ29tcGV0ZW5jaWVzLmluY2x1ZGVzKFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVDb21wZXRlbmN5KGMuY29tcGV0ZW5jeUFyZWFOYW1lKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBSYXRpbmcgLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgcmF0aW5nTWF0Y2ggPVxuICAgICAgICByYXRpbmcubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIHRoaXMubWF0Y2hSYXRpbmcoY291cnNlLCByYXRpbmcpO1xuXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIExhbmd1YWdlIC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IGxhbmd1YWdlTWF0Y2ggPVxuICAgICAgICBsYW5ndWFnZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgbGFuZ3VhZ2Uuc29tZSgobDogc3RyaW5nKSA9PlxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZSA9PT0gbCB8fFxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZT8uaW5jbHVkZXM/LihsKSB8fFxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZT8uWzBdPy5pbmNsdWRlcz8uKGwpXG4gICAgICAgICk7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRHVyYXRpb24gLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgZHVyYXRpb25NYXRjaCA9XG4gICAgICAgIGR1cmF0aW9uLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICB0aGlzLm1hdGNoRHVyYXRpb24oY291cnNlLmR1cmF0aW9uLCBkdXJhdGlvbik7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gUHJvdmlkZXIgLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgcHJvdmlkZXJNYXRjaCA9XG4gICAgICAgIHByb3ZpZGVyLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBwcm92aWRlci5zb21lKChwOiBzdHJpbmcpID0+XG4gICAgICAgICAgY291cnNlLm9yZ2FuaXNhdGlvbj8uaW5jbHVkZXMocClcbiAgICAgICAgKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29tcGV0ZW5jeU1hdGNoICYmXG4gICAgICAgIHJhdGluZ01hdGNoICYmXG4gICAgICAgIGxhbmd1YWdlTWF0Y2ggJiZcbiAgICAgICAgZHVyYXRpb25NYXRjaCAmJlxuICAgICAgICBwcm92aWRlck1hdGNoXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KHRoaXMuZmlsdGVyZENvdXJzZXMpO1xuICB9XG5cbiAgbWF0Y2hSYXRpbmcoY291cnNlOiBhbnksIHNlbGVjdGVkUmF0aW5nczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoIXNlbGVjdGVkUmF0aW5ncyB8fCBzZWxlY3RlZFJhdGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbm8gZmlsdGVyIHNlbGVjdGVkIOKGkiBtYXRjaCBldmVyeXRoaW5nXG4gICAgfVxuXG4gICAgbGV0IHJhdGluZyA9IG51bGw7XG5cbiAgICAvLyAx77iP4oOjIFVzZSBhdmdSYXRpbmcgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGNvdXJzZS5hdmdSYXRpbmcgIT0gbnVsbCAmJiAhaXNOYU4oY291cnNlLmF2Z1JhdGluZykpIHtcbiAgICAgIHJhdGluZyA9IE51bWJlcihjb3Vyc2UuYXZnUmF0aW5nKTtcbiAgICB9XG4gICAgLy8gMu+4j+KDoyBNYXAgcmVsZXZhbmN5IGlmIGF2Z1JhdGluZyBtaXNzaW5nXG4gICAgZWxzZSBpZiAoY291cnNlLnJlbGV2YW5jeSAhPSBudWxsICYmICFpc05hTihjb3Vyc2UucmVsZXZhbmN5KSkge1xuICAgICAgY29uc3QgcmVsID0gTnVtYmVyKGNvdXJzZS5yZWxldmFuY3kpO1xuICAgICAgaWYgKHJlbCA+PSA5MCkgcmF0aW5nID0gNC41O1xuICAgICAgZWxzZSBpZiAocmVsID49IDgwKSByYXRpbmcgPSA0LjA7XG4gICAgICBlbHNlIGlmIChyZWwgPj0gNzApIHJhdGluZyA9IDMuNTtcbiAgICAgIGVsc2UgaWYgKHJlbCA+PSA1MCkgcmF0aW5nID0gMi41O1xuICAgICAgZWxzZSByYXRpbmcgPSAxLjA7XG4gICAgfVxuXG4gICAgLy8gM++4j+KDoyBObyB1c2FibGUgcmF0aW5nIOKGkiBleGNsdWRlXG4gICAgaWYgKHJhdGluZyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gNO+4j+KDoyBNYXRjaCBzZWxlY3RlZCByYXRpbmcgcmFuZ2VzXG4gICAgcmV0dXJuIHNlbGVjdGVkUmF0aW5ncy5zb21lKHIgPT4ge1xuICAgICAgc3dpdGNoIChyKSB7XG4gICAgICAgIGNhc2UgJzQuNSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDQuNTtcbiAgICAgICAgY2FzZSAnNC4wIGFuZCBhYm92ZSc6IHJldHVybiByYXRpbmcgPj0gNC4wO1xuICAgICAgICBjYXNlICczLjUgYW5kIGFib3ZlJzogcmV0dXJuIHJhdGluZyA+PSAzLjU7XG4gICAgICAgIGNhc2UgJzIuNSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDIuNTtcbiAgICAgICAgY2FzZSAnMSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDEuMDtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBtYXRjaER1cmF0aW9uKGR1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXIgfCBzdHJpbmcsIHNlbGVjdGVkUmFuZ2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvdXJzID0gTnVtYmVyKGR1cmF0aW9uSW5TZWNvbmRzKSAvIDM2MDA7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRSYW5nZXMuc29tZShyYW5nZSA9PiB7XG4gICAgICBzd2l0Y2ggKHJhbmdlKSB7XG4gICAgICAgIGNhc2UgJzwgMSBIb3VyJzpcbiAgICAgICAgICByZXR1cm4gaG91cnMgPCAxO1xuICAgICAgICBjYXNlICcxLTUgSG91cnMnOlxuICAgICAgICAgIHJldHVybiBob3VycyA+PSAxICYmIGhvdXJzIDw9IDU7XG4gICAgICAgIGNhc2UgJzUrIEhvdXJzJzpcbiAgICAgICAgICByZXR1cm4gaG91cnMgPiA1O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8vIENvbmZpcm1hdGlvbiBEaWFsb2cgQ29tcG9uZW50XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdlbmVyYXRlLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJjb25maXJtYXRpb24tZGlhbG9nLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1oZWFkZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwid2FybmluZy1pY29uXCI+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPlJlZ2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uczwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cImRpYWxvZy1jb250ZW50XCI+XG4gICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+XG4gICAgICAgICAgVGhpcyB3aWxsIGRlbGV0ZSBhbGwgY3VycmVudCBjb3Vyc2UgcmVjb21tZW5kYXRpb25zIGFuZCBnZW5lcmF0ZSBuZXcgb25lcyBiYXNlZCBvbiB0aGUgbGF0ZXN0IHJvbGUgbWFwcGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cInN1Yi1tZXNzYWdlXCI+XG4gICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlP1xuICAgICAgICA8L3A+XG4gICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIFxuICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBjbGFzcz1cImRpYWxvZy1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIGNsYXNzPVwiY2FuY2VsLWJ0blwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25Db25maXJtKClcIiBjbGFzcz1cImNvbmZpcm0tYnRuXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICAgICAgICAgIFllcywgUmVnZW5lcmF0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmNvbmZpcm1hdGlvbi1kaWFsb2ctY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICAgIFxuICAgIC5kaWFsb2ctaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgICAgcGFkZGluZzogMjRweCAyNHB4IDE2cHggMjRweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTBlMGUwO1xuICAgIH1cbiAgICBcbiAgICAud2FybmluZy1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgY29sb3I6ICNmZjk4MDA7XG4gICAgfVxuICAgIFxuICAgIGgyIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzMzMztcbiAgICB9XG4gICAgXG4gICAgLmRpYWxvZy1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgfVxuICAgIFxuICAgIC5tYWluLW1lc3NhZ2Uge1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgY29sb3I6ICMzMzM7XG4gICAgICBtYXJnaW46IDAgMCAxMnB4IDA7XG4gICAgICBsaW5lLWhlaWdodDogMS41O1xuICAgIH1cbiAgICBcbiAgICAuc3ViLW1lc3NhZ2Uge1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgY29sb3I6ICM2NjY7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICBcbiAgICAuZGlhbG9nLWFjdGlvbnMge1xuICAgICAgcGFkZGluZzogMTZweCAyNHB4IDI0cHggMjRweDtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgfVxuICAgIFxuICAgIC5jYW5jZWwtYnRuIHtcbiAgICAgIGNvbG9yOiAjNjY2O1xuICAgIH1cbiAgICBcbiAgICAuY29uZmlybS1idG4ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIFxuICAgICAgLm1hdC1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICB3aWR0aDogMThweDtcbiAgICAgICAgaGVpZ2h0OiAxOHB4O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBSZWdlbmVyYXRlQ29uZmlybWF0aW9uRGlhbG9nIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFJlZ2VuZXJhdGVDb25maXJtYXRpb25EaWFsb2c+XG4gICkgeyB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xuICB9XG5cbiAgb25Db25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xuICB9XG5cblxufVxuIiwiPGRpdiBjbGFzcz1cInZpZXctY2JwLXBsYW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY29udGFpbmVyXCI+XG4gICAgICAgIFxuICAgICAgICA8IS0tIEluaXRpYWwgTG9hZGluZyBTY3JlZW4gKGZvciBpbml0aWFsIGxvYWQgYW5kIHJlZ2VuZXJhdGlvbikgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbml0aWFsLWxvYWRpbmctY29udGFpbmVyXCIgKm5nSWY9XCIhZGF0YUxvYWRlZCB8fCBpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0IG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYWluLW1lc3NhZ2VcIj57eyBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlIHx8IChpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA/ICdSZWdlbmVyYXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLicgOiAnTG9hZGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJykgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1kZXRhaWxzXCIgKm5nSWY9XCJwcm9ncmVzc1BlcmNlbnRhZ2UgPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCI+e3sgcHJvZ3Jlc3NQZXJjZW50YWdlIH19JSBDb21wbGV0ZTwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRpbWUtZXN0aW1hdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsLXRpbWUgY291cnNlIGdlbmVyYXRpb24gaW4gcHJvZ3Jlc3MuIFRoaXMgbWF5IHRha2UgMS0yIG1pbnV0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1haW4tY29udGVudFwiICpuZ0lmPVwiZGF0YUxvYWRlZCAmJiAhaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5TYXZlIENvdXJzZXMgKDxzcGFuPnt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8ub3JnTmFtZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZSBcIj4vIHt7cGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWV9fTwvc3Bhbj48L3NwYW4+KTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVnZW5lcmF0ZS1idG5cIiAoY2xpY2spPVwicmVnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlZ2VuZXJhdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWlzUmVnZW5lcmF0aW5nXCI+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzUmVnZW5lcmF0aW5nXCIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aXNSZWdlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5nLi4uJyA6ICdSZWdlbmVyYXRlIFJlY29tbWVuZGF0aW9ucyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgY2xvc2UtYnRuXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyIG10LTRcIj5cbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJvbk91dGVyVGFiQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8IS0tIEZpcnN0IE1haW4gVGFiIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiY291cnNlIHJlY29tbWVuZGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTmVzdGVkIFRhYnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC10YWItZ3JvdXAgKHNlbGVjdGVkVGFiQ2hhbmdlKT1cIm9uSW5uZXJUYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJhbGxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJiZWhhdmlvdXJhbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cImZ1bmN0aW9uYWxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJkb21haW5cIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+IC0tPlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cblxuICAgICAgICAgICAgICAgIDwhLS0gU2Vjb25kIE1haW4gVGFiIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiZ2FwIGFuYWx5c2lzXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHA+R2FwIGFuYWx5c2lzIGNvbnRlbnQgZ29lcyBoZXJlPC9wPiAtLT5cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIiBjbGFzcz1cImZpbHRlcnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9sZS1tYXBwaW5nLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvdXRlclRhYkFjdGl2ZUluZGV4ID09PSAwICYmIChpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAwIHx8IGlubmVyVGFiQWN0aXZlSW5kZXggPT09IDEgfHwgaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMiB8fCBpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAzIClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlci1pbXByb3ZlZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWFyY2ggQ291cnNlczwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyLWNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNlYXJjaC1pY29uXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInNpbnB1dC1jb21wYWN0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiYXBwbHlGaWx0ZXIoJGV2ZW50LnRhcmdldC52YWx1ZSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBDb3Vyc2VzXCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBDb21wZXRlbmN5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5jb21wZXRlbmN5Py5sZW5ndGggPyAnJyA6ICdDb21wZXRlbmN5JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBDb21wZXRlbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJMaXN0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdjb21wZXRlbmN5JylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZENvbXBldGVuY3lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBSYXRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5yYXRpbmc/Lmxlbmd0aCA/ICcnIDogJ1JhdGluZycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyYXRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBSZWF0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAncmF0aW5nJylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZFJhdGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXItaW1wcm92ZWQtc2VjLTIgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgTGFuZ3VhZ2U8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5sYW5ndWFnZT8ubGVuZ3RoID8gJycgOiAnTGFuZ3VhZ2UnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBMYW5ndWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckxpc3QoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgJ2xhbmd1YWdlJylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZExhbmd1YWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBEdXJhdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJGb3JtLnZhbHVlLmR1cmF0aW9uPy5sZW5ndGggPyAnJyA6ICdEdXJhdGlvbicgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJzZWxlY3Qtc2VhcmNoLXBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJhcHBseUZpbHRlcnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlYXJjaCBib3ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiA1cHg7d2lkdGg6IDkyJTttYXJnaW46IDVweDtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJMaXN0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdkdXJhdGlvbicpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWREdXJhdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgUHJvdmlkZXI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5wcm92aWRlcj8ubGVuZ3RoID8gJycgOiAnUHJvdmlkZXInIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAncHJvdmlkZXInKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmFsdWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkUHJvdmlkZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA0NXB4O21hcmdpbi1sZWZ0OiAyMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJSZXNldCBBbGwgRmlsdGVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyZWQgQ291cnNlIENvdW50IDoge3tmaWx0ZXJkQ291cnNlcz8ubGVuZ3RofX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTUgc3ViLWhlYWRpbmcgc2VsZWN0LWFsbC1jb250YWluZXJcIiAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImZhbHNlXCIgKGNoYW5nZSk9XCJzZWxlY3RBbGxDb3Vyc2VzKCRldmVudClcIj5TZWxlY3QgQWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdXJzZXM8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cC1jb21wYWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkFkZCBNb3JlIENvdXJzZXMgZnJvbSBpR09UXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdWdnZXN0TW9yZUNvdXJzZXMoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtkaXNhYmxlZF09XCJzZWxlY3RGaWx0ZXJDb3Vyc2VzPy5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdEZpbHRlckNvdXJzZXM/Lmxlbmd0aCA+IDAgPyAnYnRuLWFjdGl2ZScgOiAnYnRuLWRpc2FibGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBbdmFsdWVdPVwibW9kZSA9PT0gJ2FkZCcgPyAnU2F2ZSBDb3Vyc2VzJyA6ICdVcGRhdGUgQ291cnNlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVDb3Vyc2VzKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyLWNvbnRhaW5lciBtdC0yXCIgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci1tZXNzYWdlIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPkRpc2NsYWltZXI6PC9zdHJvbmc+IFBsZWFzZSB2ZXJpZnkgdGhlIHB1YmxpYyBjb3Vyc2UgVVJMIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIHBsYW4uXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWxpc3QtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpbm5lclRhYkFjdGl2ZUluZGV4ID4gMCA/ICdjb3Vyc2UtbGlzdC1jb250YWluZXItZmxleCc6J2NvdXJzZS1saXN0LWNvbnRhaW5lci1yaWdodC1mbGV4JyBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwID8gJ2xlZnQtcGFuZWwnOicnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Db21wZXRlbmNpZXMgaW4gQmVoYXZpb3VyYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZW1lLWZpbHRlci1jb250cm9scyBtYi0yXCIgKm5nSWY9XCJzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbGVhci1maWx0ZXItYnRuXCIgKGNsaWNrKT1cImNsZWFyVGhlbWVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj4gQ2xlYXIgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnktbGlzdC1pdGVtIGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZC10aGVtZSc6IGlzVGhlbWVTZWxlY3RlZChpdGVtKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBpbiBGdW5jdGlvbmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGVtZS1maWx0ZXItY29udHJvbHMgbWItMlwiICpuZ0lmPVwic2VsZWN0ZWRUaGVtZUZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2xlYXItZmlsdGVyLWJ0blwiIChjbGljayk9XCJjbGVhclRoZW1lRmlsdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+IENsZWFyIEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJmaWx0ZXJPbkNvbXBldGVuY3lUaGVtZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhdGVnb3J5LWxpc3QtaXRlbSBjdXJzb3ItcG9pbnRlciBtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtdGhlbWUnOiBpc1RoZW1lU2VsZWN0ZWQoaXRlbSl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Db21wZXRlbmNpZXMgaW4gRG9tYWluPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGVtZS1maWx0ZXItY29udHJvbHMgbWItMlwiICpuZ0lmPVwic2VsZWN0ZWRUaGVtZUZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2xlYXItZmlsdGVyLWJ0blwiIChjbGljayk9XCJjbGVhclRoZW1lRmlsdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+IENsZWFyIEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJmaWx0ZXJPbkNvbXBldGVuY3lUaGVtZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnktbGlzdC1pdGVtIGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLXRoZW1lJzogaXNUaGVtZVNlbGVjdGVkKGl0ZW0pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwID8gJ3JpZ2h0LXBhbmVsJzoncmlnaHQtcGFuZWwtZmxleCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gQ291cnNlIEZvdW5kIE1lc3NhZ2UgaW4gUmlnaHQgUGFuZWwgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWZvdW5kLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoID09PSAwICYmIHNlbGVjdGVkVGhlbWVGaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWNvdXJzZS1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoX29mZjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5ObyBDb3Vyc2VzIEZvdW5kPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vIGNvdXJzZXMgZm91bmQgZm9yIHRoZSBzZWxlY3RlZCB0aGVtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7c2VsZWN0ZWRUaGVtZUZpbHRlcn19PC9zdHJvbmc+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+V291bGQgeW91IGxpa2UgdG8gYWRkIGEgY291cnNlIGZvciB0aGlzIGNvbXBldGVuY3k/PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN1Z2dlc3QtY291cnNlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvdXJzZUZvclNlbGVjdGVkVGhlbWUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGRfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgQ291cnNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb3Vyc2VzIExpc3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWxpc3QtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmRDb3Vyc2VzO2xldCBpPWluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2VkLWNvdXJzZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImNoZWNrSWZDb3Vyc2VFeGlzdHMoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEZpbHRlckNvdXJzZXMoJGV2ZW50LCBpdGVtKVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvY291cnNlLnN2Z1wiPjwvc3Bhbj4mbmJzcDs8c3Bhbj5Db3Vyc2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZVwiPkFJIFJlY29tbWVuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5pc19wdWJsaWNcIj4gLSBQdWJsaWM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbT8uaXNfcHVibGljXCI+IC0gaUdPVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWl0ZW0/LnJhdGlvbmFsZVwiPk1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1Q8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8ucmF0aW9uYWxlICYmICFpdGVtPy5pc19wdWJsaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JlZW4tdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFJIFJlY29tbWVuZGVkIC0gaUdPVCA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8ucmF0aW9uYWxlICYmIGl0ZW0/LmlzX3B1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZCAtIFB1YmxpYyA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWl0ZW0/LnJhdGlvbmFsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyYXktdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1QgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj48c3Bhbj5QbGF0Zm9ybSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UHJvdmlkZXIgLSB7e2l0ZW0/Lm9yZ2FuaXNhdGlvbn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLXRpdGxlIG10LTMgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicmVkaXJlY3RUb1RvYyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5jb3Vyc2VcIj57e2l0ZW0/LmNvdXJzZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIml0ZW0/Lm5hbWVcIj57e2l0ZW0/Lm5hbWV9fSoqKio8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiIChjbGljayk9XCJyZWRpcmVjdFRvVG9jKGl0ZW0pXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOHB4XCIgd2lkdGg9XCIxOHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL3JlZGlyZWN0LnBuZ1wiIC8+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1kZXNjIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJpdGVtPy5yYXRpb25hbGVcIj57e2l0ZW0/LnJhdGlvbmFsZX19PC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uZGVzY3JpcHRpb25cIj57e2l0ZW0/LmRlc2NyaXB0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdCZWhhdmlvdXJhbCcsaSk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktc3ViLWhlYWRpbmdcIj5CZWhhdmlvdXJhbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYmVoYXZpb3VyYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnQmVoYXZpb3VyYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0XCI+IHt7IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5jb21wZXRlbmN5U3ViVGhlbWVOYW1lIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdCZWhhdmlvdXJhbCcsaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnQmVoYXZpb3VyYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdCZWhhdmlvdXJhbCcsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZW1haW5pbmdDb3VudCgnQmVoYXZpb3VyYWwnLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdGdW5jdGlvbmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3QgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZ1bmN0aW9uYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0Z1bmN0aW9uYWwnLGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93LW1vcmUtY29tcGV0ZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb21wZXRlbmNpZXMoJ0Z1bmN0aW9uYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdGdW5jdGlvbmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdGdW5jdGlvbmFsJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdJZj1cImdldENvbXBldGVuY2llc0J5VHlwZSgnRG9tYWluJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkRvbWFpbiBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZG9tYWluLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29tcCBvZiBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXMoJ0RvbWFpbicsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0RvbWFpbicsaSlcIiBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRG9tYWluJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXNFeHBhbmRlZCgnRG9tYWluJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdEb21haW4nLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVsZXZhbmN5IGFuZCBEdXJhdGlvbiBzZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtZm9vdGVyXCIgKm5nSWY9XCJpdGVtPy5yZWxldmFuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5SZWxldmFuY3k8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPnt7aXRlbT8ucmVsZXZhbmN5fX0lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3ktcGlsbC1ncmVlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5XCI+RHVyYXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtPy5kdXJhdGlvblwiPnt7Z2V0RHVyYXRpb24oaXRlbT8uZHVyYXRpb24pfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIShpdGVtPy5kdXJhdGlvbilcIj5OL0E8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEdlbmVyYWwgTm8gRGF0YSBNZXNzYWdlIChvbmx5IHdoZW4gbm8gdGhlbWUgZmlsdGVyIGlzIGFjdGl2ZSkgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHN1Yi1oZWFkaW5nXCIgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoID09PSAwICYmICFzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5ObyBEYXRhIEZvdW5kPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9sZS1tYXBwaW5nLWNvbnRhaW5lclwiICpuZ0lmPVwib3V0ZXJUYWJBY3RpdmVJbmRleCA9PT0gMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJnYXAtYW5hbHlzaXMtY29udGVudFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1wZGYgbXQtNCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJEb3dubG9hZFwiIChjbGljayk9XCJkb3dubG9hZFBERigpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImlzUERGRG93bmxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGRmLWhlYWRpbmdcIj57e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm5hbWV9fSA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZSBcIj5fe3twbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZX19X0dhcF9BbmFseXNpczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdmgtMTAwXCIgW25nQ2xhc3NdPVwiaXNQREZEb3dubG9hZCA/ICdtdC00JzonJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2lkZWJhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHAtMyBiZy1saWdodCBib3JkZXItZW5kXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTRcIj5BbmFseXplIGJ5IENhdGVnb3J5PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZW51SXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtYi0yIHRleHQtc3RhcnQgbWVudS1saXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZENhdGVnb3J5ID09PSBpdGVtLmtleVwiIChjbGljayk9XCJzZWxlY3RDYXRlZ29yeShpdGVtLmtleSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTMgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zIGdyYXktYmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxhYmVsIHN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBDb3ZlcmVkPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIj57e2NvbXBldGVuY3lDb3ZlcmVkQ291bnR9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zIGdyYXktYmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxhYmVsIHN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2FsbCdcIj5Ub3RhbCBDb21wZXRlbmNpZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+VG90YWwgQmVoYXZpb3VyYWwgQ29tcGV0ZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCdcIj5Ub3RhbCBGdW5jdGlvbmFsIENvbXBldGVuY2llc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbidcIj5Ub3RhbCBEb21haW4gQ29tcGV0ZW5jaWVzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGh9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdiZWhhdmlvcmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2JlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llc319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2Z1bmN0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RvbWFpblRvdGFsQ29tcGV0ZW5jaWVzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMyBncmVlbi1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWxcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnXCI+T3ZlcmFsbCBDb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWxcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdiZWhhdmlvcmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWhhdmlvdXJhbCBDb3ZlcmFnZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWxcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbmFsIENvdmVyYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbidcIj5Eb21haW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ292ZXJhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e292ZXJhbGxDb3ZlcmFnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YmVoYXZpb3JhbENvdmVyYWdlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmdW5jdGlvbmFsQ292ZXJhZ2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdkb21haW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZG9tYWluQ292ZXJhZ2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCBhbGwtY2F0ZWdvcnktbGlzdFwiIFtuZ1N3aXRjaF09XCJzZWxlY3RlZENhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInYWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5BbGwgQ2F0ZWdvcmllczwvaDQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNob3cgQmVoYXZpb3VyYWwgc2VjdGlvbiBvbmx5IGlmIHRoZXJlIGFyZSB1bm1hdGNoZWQgYmVoYXZpb3VyYWwgY29tcGV0ZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJiZWhhdmlvdXJhbE5vdE1hdGNoZWQgJiYgYmVoYXZpb3VyYWxOb3RNYXRjaGVkLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CZWhhdmlvdXJhbDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiZWhhdmlvdXJhbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnQmVoYXZpb3JhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Vyc2U8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IEZ1bmN0aW9uYWwgc2VjdGlvbiBvbmx5IGlmIHRoZXJlIGFyZSB1bm1hdGNoZWQgZnVuY3Rpb25hbCBjb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZ1bmN0aW9uYWxOb3RNYXRjaGVkICYmIGZ1bmN0aW9uYWxOb3RNYXRjaGVkLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5GdW5jdGlvbmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0Z1bmN0aW9uYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBEb21haW4gc2VjdGlvbiBvbmx5IGlmIHRoZXJlIGFyZSB1bm1hdGNoZWQgZG9tYWluIGNvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiICpuZ0lmPVwiZG9tYWluTm90TWF0Y2hlZCAmJiBkb21haW5Ob3RNYXRjaGVkLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Eb21haW48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtIHwgdGl0bGVjYXNlfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdEb21haW4nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBtZXNzYWdlIHdoZW4gYWxsIGNvbXBldGVuY2llcyBhcmUgY292ZXJlZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKCFiZWhhdmlvdXJhbE5vdE1hdGNoZWQgfHwgYmVoYXZpb3VyYWxOb3RNYXRjaGVkLmxlbmd0aCA9PT0gMCkgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWZ1bmN0aW9uYWxOb3RNYXRjaGVkIHx8IGZ1bmN0aW9uYWxOb3RNYXRjaGVkLmxlbmd0aCA9PT0gMCkgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWRvbWFpbk5vdE1hdGNoZWQgfHwgZG9tYWluTm90TWF0Y2hlZC5sZW5ndGggPT09IDApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1nYXBzLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInN1Y2Nlc3MtaWNvblwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+RXhjZWxsZW50ISBBbGwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFsbCByZXF1aXJlZCBjb21wZXRlbmNpZXMgaGF2ZSBiZWVuIGFkZHJlc3NlZCBieSB0aGUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3Vyc2VzLjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInYmVoYXZpb3JhbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+QmVoYXZpb3VyYWw8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJiZWhhdmlvcmFsQ292ZXJhZ2UgIT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CZWhhdmlvdXJhbDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiZWhhdmlvdXJhbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnQmVoYXZpb3JhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3IENvdXJzZSA8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJiZWhhdmlvcmFsQ292ZXJhZ2UgPT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U4ZjVlODsgYm9yZGVyOiAxcHggc29saWQgIzRjYWY1MDsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICMyZTdkMzI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn46JIEV4Y2VsbGVudCEgQWxsIGJlaGF2aW9yYWwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNvdXJzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2Z1bmN0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkZ1bmN0aW9uYWw8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJmdW5jdGlvbmFsQ292ZXJhZ2UgIT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5GdW5jdGlvbmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW19fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0Z1bmN0aW9uYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ldyBDb3Vyc2U8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJmdW5jdGlvbmFsQ292ZXJhZ2UgPT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U4ZjVlODsgYm9yZGVyOiAxcHggc29saWQgIzRjYWY1MDsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICMyZTdkMzI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn46JIEV4Y2VsbGVudCEgQWxsIGZ1bmN0aW9uYWwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNvdXJzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2RvbWFpbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+RG9tYWluPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiICpuZ0lmPVwiZG9tYWluQ292ZXJhZ2UgIT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Eb21haW48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdEb21haW4nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ldyBDb3Vyc2UgPC9zcGFuPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiICpuZ0lmPVwiZG9tYWluQ292ZXJhZ2UgPT09ICcxMDAlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U4ZjVlODsgYm9yZGVyOiAxcHggc29saWQgIzRjYWY1MDsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICMyZTdkMzI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn46JIEV4Y2VsbGVudCEgQWxsIGRvbWFpbiBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQgYnkgdGhlIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cnNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIHNlbGVjdCBhIGNhdGVnb3J5LjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gPCEtLSBDbG9zZSBtYWluLWNvbnRlbnQgZGl2IC0tPlxuXG4gICAgPC9kaXY+XG48L2Rpdj5cblxuXG48ZGl2IFtoaWRkZW5dPVwiIWlzUERGRG93bmxvYWRcIiBjbGFzcz1cImdhcC1hbmFseXNpcy1wZGYtY29udGFpbmVyXCIgI3BkZkNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImdhcC1hbmFseXNpcy1wZGYtaGVhZGVyXCI+XG4gICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9rYXJtYXlvZ2lMb2dvLW1pbi5wbmdcIiBhbHQ9XCJLYXJtYXlvZ2kgQmhhcmF0IExvZ29cIiBjbGFzcz1cImxvZ29cIiAvPlxuICAgICAgPGgxPjxzcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInNoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJ1wiPnt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWU/Lm5hbWV9fTwvc3Bhbj4gXG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknXCI+e3tzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5uYW1lfX08L3NwYW4+ICAgXG4gICAgICAgIDxzcGFuICpuZ0lmPVwicGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWUgXCI+LyB7e3BsYW5EYXRhPy5kZXNpZ25hdGlvbl9uYW1lfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj48L2gxPlxuICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPkEgZGV0YWlsZWQgYnJlYWtkb3duIG9mIGNvbXBldGVuY2llcyBHYXAgQW5hbHlzaXM8L3A+XG4gICAgIFxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zbmFwc2hvdFwiPlxuICAgICAgPGgyPkNvbXBldGVuY3kgU25hcHNob3Q8L2gyPlxuICAgICAgPGRpdiBjbGFzcz1cInNuYXBzaG90LWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZS13cmFwcGVyXCI+XG4gICAgICAgICAgPHN2ZyBjbGFzcz1cInByb2dyZXNzLXJpbmdcIiB3aWR0aD1cIjEyMFwiIGhlaWdodD1cIjEyMFwiPlxuICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInByb2dyZXNzLXJpbmctYmdcIiBjeD1cIjYwXCIgY3k9XCI2MFwiIHI9XCI1MlwiIC8+XG4gICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicHJvZ3Jlc3MtcmluZy1jaXJjbGVcIiBjeD1cIjYwXCIgY3k9XCI2MFwiIHI9XCI1MlwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2UtdGV4dFwiPnt7b3ZlcmFsbENvdmVyYWdlfX08YnIgLz48c3Bhbj5PdmVyYWxsIENvdmVyYWdlPC9zcGFuPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPCEtLSBUb3RhbCBDb21wZXRlbmNpZXMgQm94IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLWJveFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5Ub3RhbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+e3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gUHJvZ3Jlc3MgQmFycyAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHQgYmVoYXZpb3JhbFwiPkJlaGF2aW91cmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY292ZXJlZC10ZXh0XCI+e3tiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudH19IC8ge3tiZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXN9fSBDb3ZlcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1maWxsIGJlaGF2aW9yYWxcIiBbc3R5bGUud2lkdGguJV09XCIoYmVoYXZpb3JhbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyBiZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0IGZ1bmN0aW9uYWxcIj5GdW5jdGlvbmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY292ZXJlZC10ZXh0XCI+e3tmdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudH19IC8ge3tmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXN9fSBDb3ZlcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1maWxsIGZ1bmN0aW9uYWxcIiBbc3R5bGUud2lkdGguJV09XCIoZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyBmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0IGRvbWFpblwiPkRvbWFpbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdmVyZWQtdGV4dFwiPnt7ZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudH19IC8ge3tkb21haW5Ub3RhbENvbXBldGVuY2llc319IENvdmVyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGwgZG9tYWluXCIgW3N0eWxlLndpZHRoLiVdPVwiKGRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyBkb21haW5Ub3RhbENvbXBldGVuY2llcykgKiAxMDBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNsYXNzPVwiZ2FwLXNlY3Rpb24gbWItNFwiPlxuICAgICAgPGgyPkRldGFpbGVkIENvbXBldGVuY3kgQW5hbHlzaXM8L2gyPlxuICAgICAgPGRpdiBjbGFzcz1cImdhcC1ib3hcIj5cbiAgICAgICAgQnJpZGdlIFlvdXIgQ29tcGV0ZW5jaWVzIEdhcFxuICAgICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+SGVyZSBhcmUge3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aCAtIChiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCArIGZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCl9fSBrZXkgYXJlYXMgZm9yIGRldmVsb3BtZW50LjwvcD5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmcgbWItNFwiPlxuICAgICAgICA8cD5HYXAgdG8gQWRkcmVzcyA8c3BhbiAqbmdJZj1cIih0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aCAtIChiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCArIGZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCkpID4gMFwiPih7e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50KX19KTwvc3Bhbj48L3A+XG4gICAgICAgIFxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgYmVoYXZpb3JhbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTm90TWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGVcIj5cbiAgICAgICAgICAmbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGJlaGF2aW9yYWxcIj5CZWhhdmlvdXJhbDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZnVuY3Rpb25hbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICAmbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGZ1bmN0aW9uYWxcIj5GdW5jdGlvbmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jYXJkIGRvbWFpblwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRvbWFpbk5vdE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAgPCEtLSBQcm9qZWN0IE1hbmFnZW1lbnQgIC0tPlxuICAgICAgICAgICZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgZG9tYWluXCI+RG9tYWluPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTRcIj5cbiAgICAgICAgPHA+Q292ZXJlZCBDb21wZXRlbmNpZXMgPHNwYW4+KHt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGggLSAoYmVoYXZpb3VyYWxOb3RNYXRjaGVkPy5sZW5ndGggKyBmdW5jdGlvbmFsTm90TWF0Y2hlZD8ubGVuZ3RoICsgZG9tYWluTm90TWF0Y2hlZD8ubGVuZ3RoKX19KTwvc3Bhbj48L3A+ICAgICAgICBcbiAgICAgPC9kaXY+XG4gICAgIDxkaXYgY2xhc3M9XCJnYXAtc2VjdGlvbiBtYi00XCI+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JlZW4tYmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tbGFiZWwgbWItMlwiPlxuICAgICAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyFcbiAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgIFxuICAgICAgICAgICAgPHA+WW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNvdmVyZWQgPC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj57e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW91cmFsTm90TWF0Y2hlZD8ubGVuZ3RoICsgZnVuY3Rpb25hbE5vdE1hdGNoZWQ/Lmxlbmd0aCArIGRvbWFpbk5vdE1hdGNoZWQ/Lmxlbmd0aCl9fSBrZXkgY29tcGV0ZW5jaWVzLCBmb3JtaW5nIGEgc3Ryb25nIHByb2Zlc3Npb25hbCBmb3VuZGF0aW9uLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jYXJkIGJlaGF2aW9yYWxcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBiZWhhdmlvdXJhbE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtPy50aGVtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgIHt7aXRlbT8uc3ViX3RoZW1lfX0mbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGJlaGF2aW9yYWxcIj5CZWhhdmlvdXJhbDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZnVuY3Rpb25hbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZ1bmN0aW9uYWxNYXRjaGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7aXRlbT8udGhlbWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGVcIj5cbiAgICAgICAgICAgIHt7aXRlbT8uc3ViX3RoZW1lfX0mbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGZ1bmN0aW9uYWxcIj5GdW5jdGlvbmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jYXJkIGRvbWFpblwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRvbWFpbk1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtPy50aGVtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgIDwhLS0gUHJvamVjdCBNYW5hZ2VtZW50ICAtLT5cbiAgICAgICAgICB7e2l0ZW0/LnN1Yl90aGVtZX19Jm5ic3A7IOKAoiAmbmJzcDtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBkb21haW5cIj5Eb21haW48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FwLXNlY3Rpb24gbWItNFwiPlxuICAgICAgICA8aDI+UmVjb21tZW5kZWQgQ291cnNlczwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxhcHAtZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZSBbcGxhbkRhdGFdPVwicGxhbkRhdGFcIj48L2FwcC1nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlPlxuPC9kaXY+XG4gIFxuXG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZyAmJiBkYXRhTG9hZGVkICYmICFpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRlbnRcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0IG10LTNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+e3sgY3VycmVudFByb2Nlc3NpbmdTdGFnZSB8fCAnUHJlcGFyaW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiBnZW5lcmF0aW9uLi4uJyB9fTwvcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWluZGljYXRvclwiICpuZ0lmPVwicHJvZ3Jlc3NQZXJjZW50YWdlID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwicHJvZ3Jlc3MtdGV4dFwiPnt7IHByb2dyZXNzUGVyY2VudGFnZSB9fSUgQ29tcGxldGU8L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRpbWUtZXN0aW1hdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgUmVhbC10aW1lIGNvdXJzZSBnZW5lcmF0aW9uIGluIHByb2dyZXNzLiBUaGlzIG1heSB0YWtlIDEtMiBtaW51dGVzLlxuICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=