@sunbird-cb/toc 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +3 -3
  2. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +3 -3
  3. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +345 -49
  4. package/esm2022/lib/_services/widget-content.model.mjs +2 -1
  5. package/esm2022/lib/_services/widget-content.service.mjs +6 -1
  6. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +59 -19
  7. package/esm2022/lib/services/app-toc-v2.service.mjs +203 -20
  8. package/esm2022/lib/services/app-toc.service.mjs +312 -13
  9. package/esm2022/public-api.mjs +15 -1
  10. package/fesm2022/sunbird-cb-toc.mjs +926 -103
  11. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  12. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +45 -1
  13. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -1
  14. package/lib/_services/widget-content.model.d.ts +1 -0
  15. package/lib/_services/widget-content.model.d.ts.map +1 -1
  16. package/lib/_services/widget-content.service.d.ts +1 -0
  17. package/lib/_services/widget-content.service.d.ts.map +1 -1
  18. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +6 -0
  19. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -1
  20. package/lib/services/app-toc-v2.service.d.ts +8 -1
  21. package/lib/services/app-toc-v2.service.d.ts.map +1 -1
  22. package/lib/services/app-toc.service.d.ts +32 -1
  23. package/lib/services/app-toc.service.d.ts.map +1 -1
  24. package/package.json +3 -3
  25. package/public-api.d.ts +12 -0
  26. package/public-api.d.ts.map +1 -1
@@ -690,6 +690,13 @@ export class AppTocService {
690
690
  // this.mapModuleDurationAndProgress(content, content)
691
691
  this.callHirarchyProgressHashmap(content);
692
692
  this.checkModuleWiseData(content);
693
+ // Compute milestone locking AFTER progress data is populated
694
+ if (content.courseCategory === 'Learning Pathway') {
695
+ this.computeMilestoneLockingStatus();
696
+ // Ensure hashmap updates are published for change detection
697
+ this.hashmap = { ...this.hashmap };
698
+ console.log('Milestone locking computed, hashmap updated:', this.hashmap);
699
+ }
693
700
  this.contentLoader.next(false);
694
701
  }
695
702
  }
@@ -745,25 +752,60 @@ export class AppTocService {
745
752
  });
746
753
  }
747
754
  }
748
- createHirarchyProgressHashmap(hierarchyData) {
755
+ createHirarchyProgressHashmap(hierarchyData, rootCourseCategory) {
749
756
  if (hierarchyData && hierarchyData.children) {
750
757
  hierarchyData.children.forEach((child) => {
751
758
  if (child && child.children) {
752
- this.createHirarchyProgressHashmap(child);
759
+ this.createHirarchyProgressHashmap(child, rootCourseCategory);
753
760
  }
754
- let localMap = {};
755
- localMap = {
756
- parent: child.parent,
761
+ const primaryCat = child.primaryCategory;
762
+ const courseCat = (child.courseCategory || child.primaryCategory || '');
763
+ const isMilestone = primaryCat === 'Milestone' || courseCat === 'Milestone';
764
+ const isCollection = child.mimeType === NsContent.EMimeTypes.COLLECTION;
765
+ const isModule = child.primaryCategory === NsContent.EPrimaryCategory.MODULE;
766
+ const isResource = child.primaryCategory === NsContent.EPrimaryCategory.RESOURCE ||
767
+ child.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE ||
768
+ child.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT ||
769
+ child.primaryCategory === NsContent.EPrimaryCategory.COMP_ASSESSMENT;
770
+ const isLearningPathway = rootCourseCategory === 'Learning Pathway';
771
+ // Check if content is mandatory (isMandatory flag or mandatory property)
772
+ const isMandatory = child.isMandatory === true || child.mandatory === true;
773
+ let localMap = {
774
+ parent: child?.parent,
757
775
  identifier: child.identifier,
758
776
  leafNodesCount: child.leafNodesCount || null,
759
777
  leafNodes: child.leafNodes || [],
760
- completionPercentage: child.completionPercentage || child.progress,
761
- completionStatus: child.completionStatus,
778
+ completionPercentage: child.completionPercentage || child.progress || 0,
779
+ completionStatus: child.completionStatus || child.status || 0,
780
+ status: child.status || child.completionStatus || 0,
762
781
  progress: child.progress,
763
782
  primaryCategory: child.primaryCategory,
783
+ courseCategory: courseCat,
764
784
  duration: child.duration || 0,
765
785
  expectedDuration: child.expectedDuration || 0,
786
+ // Additional metadata for performance optimization
787
+ mimeType: child.mimeType,
788
+ isLocked: child.isLocked || false,
789
+ artifactUrl: child.artifactUrl || null,
790
+ name: child.name || '',
791
+ contentType: child.contentType || '',
792
+ // Pre-computed flags for Learning Pathway
793
+ isMilestone: isMilestone,
794
+ isCollection: isCollection,
795
+ isModule: isModule,
796
+ isResource: isResource,
797
+ isLearningPathway: isLearningPathway,
798
+ isMandatory: isMandatory,
799
+ // Milestone specific data
800
+ milestoneIndex: child.milestoneIndex,
801
+ completedLeafNodesCount: child.completedLeafNodesCount || 0,
802
+ // Pre-assessment flag (for milestone gating)
803
+ isPreAssessment: child.isPreAssessment || false,
766
804
  };
805
+ // Debug logging for milestones
806
+ if (isMilestone) {
807
+ console.log(`[Hashmap Build] Milestone ${child.identifier} (${child.name}): completionPercentage=${child.completionPercentage}, completionStatus=${child.completionStatus}, status=${child.status}, leafNodesCount=${child.leafNodesCount}, completedLeafNodesCount=${child.completedLeafNodesCount}`);
808
+ }
767
809
  this.hashmap[child.identifier] = localMap;
768
810
  });
769
811
  }
@@ -777,7 +819,7 @@ export class AppTocService {
777
819
  }
778
820
  let localMap = {};
779
821
  localMap = {
780
- parent: child.parent,
822
+ parent: child?.parent,
781
823
  identifier: child.identifier,
782
824
  leafNodesCount: child.leafNodesCount || null,
783
825
  leafNodes: child.leafNodes || [],
@@ -785,6 +827,7 @@ export class AppTocService {
785
827
  completionStatus: child.completionStatus,
786
828
  progress: child.progress,
787
829
  primaryCategory: child.primaryCategory,
830
+ courseCategory: child.courseCategory || child.primaryCategory || '',
788
831
  duration: child.duration || 0,
789
832
  expectedDuration: child.expectedDuration || 0,
790
833
  };
@@ -794,17 +837,30 @@ export class AppTocService {
794
837
  }
795
838
  callHirarchyProgressHashmap(hierarchyData) {
796
839
  if (hierarchyData) {
840
+ const rootCourseCategory = hierarchyData.courseCategory || hierarchyData.primaryCategory || '';
841
+ const isLearningPathway = rootCourseCategory === 'Learning Pathway';
797
842
  this.hashmap[hierarchyData.identifier] = {
798
843
  parent: hierarchyData.parent,
799
844
  identifier: hierarchyData.identifier,
800
845
  leafNodesCount: hierarchyData.leafNodesCount || null,
801
846
  leafNodes: hierarchyData.leafNodes || [],
802
- completionPercentage: hierarchyData.completionPercentage || hierarchyData.progress,
803
- completionStatus: hierarchyData.completionStatus,
847
+ completionPercentage: hierarchyData.completionPercentage || hierarchyData.progress || 0,
848
+ completionStatus: hierarchyData.completionStatus || 0,
804
849
  progress: hierarchyData.progress,
805
850
  primaryCategory: hierarchyData.primaryCategory,
806
- courseCategory: hierarchyData.courseCategory || hierarchyData.primaryCategory || '',
851
+ courseCategory: rootCourseCategory,
807
852
  expectedDuration: hierarchyData.expectedDuration || 0,
853
+ // Additional metadata
854
+ mimeType: hierarchyData.mimeType,
855
+ isLocked: hierarchyData.isLocked || false,
856
+ artifactUrl: hierarchyData.artifactUrl || null,
857
+ name: hierarchyData.name || '',
858
+ contentType: hierarchyData.contentType || '',
859
+ isMilestone: false,
860
+ isCollection: hierarchyData.mimeType === NsContent.EMimeTypes.COLLECTION,
861
+ isModule: hierarchyData.primaryCategory === NsContent.EPrimaryCategory.MODULE,
862
+ isResource: false,
863
+ isLearningPathway: isLearningPathway,
808
864
  };
809
865
  if (hierarchyData.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM &&
810
866
  hierarchyData.compatibilityLevel >= 5 && hierarchyData.contextLockingType &&
@@ -815,11 +871,254 @@ export class AppTocService {
815
871
  compatibilityLevel: hierarchyData.compatibilityLevel,
816
872
  };
817
873
  }
818
- this.createHirarchyProgressHashmap(hierarchyData);
874
+ this.createHirarchyProgressHashmap(hierarchyData, rootCourseCategory);
875
+ // NOTE: computeMilestoneLockingStatus is called AFTER progress data is populated
876
+ // in mapCompletionPercentageProgram, not here where completion data is still 0
819
877
  this.hashmap = { ...this.hashmap };
820
878
  console.log('this.hashmap--', this.hashmap);
821
879
  }
822
880
  }
881
+ /**
882
+ * Pre-compute milestone locking status for all milestones in Learning Pathway
883
+ * This avoids expensive calculations in component getters
884
+ *
885
+ * Locking Rules:
886
+ * 1. All milestones are locked by default
887
+ * 2. Milestone 1 (M1) unlocks when pre-assessment is completed
888
+ * 3. Milestone N (N > 1) unlocks when:
889
+ * - All mandatory learning items in Milestone N-1 are completed
890
+ * - The assessment of Milestone N-1 is completed
891
+ */
892
+ computeMilestoneLockingStatus() {
893
+ console.log('=== COMPUTING MILESTONE LOCKING STATUS ===');
894
+ console.log('Full hashmap:', this.hashmap);
895
+ // Get all milestone entries from hashmap sorted by their index or number
896
+ const milestoneEntries = Object.keys(this.hashmap)
897
+ .filter(key => {
898
+ const item = this.hashmap[key];
899
+ return item.isMilestone || item.primaryCategory === 'Milestone' || item.courseCategory === 'Milestone';
900
+ })
901
+ .sort((a, b) => {
902
+ // Sort by milestoneIndex if available, otherwise by number in ID
903
+ const itemA = this.hashmap[a];
904
+ const itemB = this.hashmap[b];
905
+ if (itemA.milestoneIndex !== undefined && itemB.milestoneIndex !== undefined) {
906
+ return itemA.milestoneIndex - itemB.milestoneIndex;
907
+ }
908
+ const numA = parseInt(a.replace(/\D/g, '')) || 0;
909
+ const numB = parseInt(b.replace(/\D/g, '')) || 0;
910
+ return numA - numB;
911
+ });
912
+ console.log('Milestone entries found:', milestoneEntries);
913
+ // Check if pre-assessment is completed (required to unlock M1)
914
+ const isPreAssessmentCompleted = this.checkPreAssessmentCompletion();
915
+ milestoneEntries.forEach((milestoneId, index) => {
916
+ const milestone = this.hashmap[milestoneId];
917
+ if (!milestone)
918
+ return;
919
+ // First milestone (M1) - unlocks when pre-assessment is completed
920
+ if (index === 0) {
921
+ this.hashmap[milestoneId].computedIsLocked = !isPreAssessmentCompleted;
922
+ console.log(`Milestone ${milestoneId} (M1): Pre-assessment completed: ${isPreAssessmentCompleted}, Locked: ${!isPreAssessmentCompleted}`);
923
+ return;
924
+ }
925
+ // For subsequent milestones (M2, M3, etc.), check if previous milestone is fully completed
926
+ const previousMilestoneId = milestoneEntries[index - 1];
927
+ const previousMilestone = this.hashmap[previousMilestoneId];
928
+ if (previousMilestone) {
929
+ // SIMPLIFIED APPROACH: Check if previous milestone is 100% complete
930
+ // This uses the aggregated completion percentage which is already calculated
931
+ // Use Number() to ensure proper numeric comparison
932
+ const prevCompletionPct = Number(previousMilestone.completionPercentage) || 0;
933
+ const prevCompletionStatus = Number(previousMilestone.completionStatus) || 0;
934
+ const prevStatus = Number(previousMilestone.status) || 0;
935
+ const prevCompletedLeafNodes = Number(previousMilestone.completedLeafNodesCount) || 0;
936
+ const prevLeafNodesCount = Number(previousMilestone.leafNodesCount) || 0;
937
+ const previousMilestoneComplete = prevCompletionPct >= 100 ||
938
+ prevCompletionStatus === 2 ||
939
+ prevStatus === 2 ||
940
+ (prevLeafNodesCount > 0 && prevCompletedLeafNodes >= prevLeafNodesCount);
941
+ console.log(`Milestone ${milestoneId} (M${index + 1}): Previous milestone (${previousMilestoneId}) - completionPercentage: ${prevCompletionPct}, completionStatus: ${prevCompletionStatus}, status: ${prevStatus}, completedLeafNodes: ${prevCompletedLeafNodes}/${prevLeafNodesCount}, isComplete: ${previousMilestoneComplete}`);
942
+ // If simple check doesn't show complete, fall back to detailed check
943
+ let canUnlock = previousMilestoneComplete;
944
+ if (!canUnlock) {
945
+ // Fallback: Check individual items
946
+ const isPreviousMilestoneAssessmentComplete = this.checkMilestoneAssessmentComplete(previousMilestoneId);
947
+ const isPreviousMilestoneMandatoryComplete = this.checkMilestoneMandatoryContentComplete(previousMilestoneId);
948
+ canUnlock = isPreviousMilestoneAssessmentComplete && isPreviousMilestoneMandatoryComplete;
949
+ console.log(`Milestone ${milestoneId} (M${index + 1}) - Fallback check: assessment: ${isPreviousMilestoneAssessmentComplete}, mandatory: ${isPreviousMilestoneMandatoryComplete}, canUnlock: ${canUnlock}`);
950
+ }
951
+ this.hashmap[milestoneId].computedIsLocked = !canUnlock;
952
+ console.log(`Milestone ${milestoneId} (M${index + 1}): FINAL - canUnlock: ${canUnlock}, Locked: ${!canUnlock}`);
953
+ }
954
+ else {
955
+ this.hashmap[milestoneId].computedIsLocked = true;
956
+ }
957
+ });
958
+ // Now compute parent milestone lock status for all children
959
+ Object.keys(this.hashmap).forEach(key => {
960
+ const item = this.hashmap[key];
961
+ if (item.isMilestone)
962
+ return; // Skip milestones themselves
963
+ // Traverse up to find if any ancestor milestone is locked
964
+ let currentParentId = item.parent;
965
+ let depth = 0;
966
+ const maxDepth = 5;
967
+ while (currentParentId && depth < maxDepth) {
968
+ const parentData = this.hashmap[currentParentId];
969
+ if (parentData) {
970
+ if (parentData.isMilestone && parentData.computedIsLocked) {
971
+ this.hashmap[key].isParentMilestoneLocked = true;
972
+ break;
973
+ }
974
+ currentParentId = parentData.parent;
975
+ }
976
+ else {
977
+ break;
978
+ }
979
+ depth++;
980
+ }
981
+ if (!this.hashmap[key].isParentMilestoneLocked) {
982
+ this.hashmap[key].isParentMilestoneLocked = false;
983
+ }
984
+ });
985
+ // Create new hashmap reference to trigger Angular change detection
986
+ this.hashmap = { ...this.hashmap };
987
+ console.log('=== MILESTONE LOCKING STATUS COMPUTED ===', this.hashmap);
988
+ }
989
+ /**
990
+ * Check if pre-assessment (preliminary assessment) is completed
991
+ * Pre-assessment is typically a Course Assessment at the root level of Learning Pathway (before milestones)
992
+ */
993
+ checkPreAssessmentCompletion() {
994
+ console.log('Checking pre-assessment completion...');
995
+ // Find the Learning Pathway root
996
+ let learningPathwayId = null;
997
+ for (const key of Object.keys(this.hashmap)) {
998
+ const item = this.hashmap[key];
999
+ if (item.isLearningPathway && item.courseCategory === 'Learning Pathway') {
1000
+ learningPathwayId = key;
1001
+ break;
1002
+ }
1003
+ }
1004
+ console.log('Learning Pathway root ID:', learningPathwayId);
1005
+ // PRIORITY 1: Look for items explicitly marked as pre-assessment
1006
+ for (const key of Object.keys(this.hashmap)) {
1007
+ const item = this.hashmap[key];
1008
+ if (item.isPreAssessment === true) {
1009
+ const isCompleted = item.completionStatus === 2 || item.status === 2 || item.completionPercentage >= 100 || item.progress >= 100;
1010
+ console.log(`Pre-assessment (via flag) found: ${key} (${item.name}), Status: ${item.completionStatus}, status: ${item.status}, Percentage: ${item.completionPercentage}, Completed: ${isCompleted}`);
1011
+ return isCompleted;
1012
+ }
1013
+ }
1014
+ // PRIORITY 2: Find pre-assessment in hashmap - direct child of Learning Pathway that is NOT a milestone
1015
+ // Check for first non-milestone child of Learning Pathway
1016
+ for (const key of Object.keys(this.hashmap)) {
1017
+ const item = this.hashmap[key];
1018
+ // Check if this is a direct child of the Learning Pathway
1019
+ if (item.parent !== learningPathwayId)
1020
+ continue;
1021
+ // Skip milestones
1022
+ if (item.isMilestone)
1023
+ continue;
1024
+ // This is a non-milestone direct child - it's the pre-assessment
1025
+ const isCompleted = item.completionStatus === 2 || item.status === 2 || item.completionPercentage >= 100 || item.progress >= 100;
1026
+ console.log(`Pre-assessment (first non-milestone child) found: ${key} (${item.name}), Status: ${item.completionStatus}, status: ${item.status}, Percentage: ${item.completionPercentage}, Completed: ${isCompleted}`);
1027
+ return isCompleted;
1028
+ }
1029
+ // If no pre-assessment found, consider M1 can be unlocked (no pre-assessment requirement)
1030
+ console.log('No pre-assessment found, defaulting to unlocked M1');
1031
+ return true;
1032
+ }
1033
+ /**
1034
+ * Check if a milestone's assessment is completed
1035
+ * Searches for any assessment type (Course Assessment, Final Assessment, etc.) that belongs to this milestone
1036
+ */
1037
+ checkMilestoneAssessmentComplete(milestoneId) {
1038
+ const milestone = this.hashmap[milestoneId];
1039
+ console.log(`Checking assessment for milestone ${milestoneId}:`, milestone);
1040
+ // Check all items in hashmap that are assessments and belong to this milestone
1041
+ for (const key of Object.keys(this.hashmap)) {
1042
+ const item = this.hashmap[key];
1043
+ // Check if this is an assessment type
1044
+ const isAssessmentType = item.primaryCategory === 'Course Assessment' ||
1045
+ item.primaryCategory === 'Final Assessment' ||
1046
+ item.primaryCategory === 'Practice Question Set' ||
1047
+ item.courseCategory === 'Course Assessment' ||
1048
+ item.courseCategory === 'Final Assessment' ||
1049
+ (item.name && item.name.toLowerCase().includes('assessment'));
1050
+ if (!isAssessmentType)
1051
+ continue;
1052
+ // Check if this assessment belongs to this milestone
1053
+ if (this.isChildOfMilestone(key, milestoneId)) {
1054
+ const isCompleted = item.completionStatus === 2 || item.status === 2 || item.completionPercentage >= 100 || item.progress >= 100;
1055
+ console.log(`Milestone ${milestoneId} Assessment found: ${key} (${item.name}), primaryCategory: ${item.primaryCategory}, Status: ${item.completionStatus}, status: ${item.status}, Percentage: ${item.completionPercentage}, Progress: ${item.progress}, Completed: ${isCompleted}`);
1056
+ if (isCompleted) {
1057
+ return true;
1058
+ }
1059
+ }
1060
+ }
1061
+ // If no assessment found, consider it as completed (no assessment requirement)
1062
+ console.log(`Milestone ${milestoneId}: No assessment found, defaulting to completed`);
1063
+ return true;
1064
+ }
1065
+ /**
1066
+ * Check if a milestone's mandatory content is completed
1067
+ * Only checks courses/content that are marked as isMandatory
1068
+ */
1069
+ checkMilestoneMandatoryContentComplete(milestoneId) {
1070
+ const milestone = this.hashmap[milestoneId];
1071
+ console.log(`Checking mandatory content for milestone ${milestoneId}:`, milestone);
1072
+ let mandatoryCount = 0;
1073
+ let completedMandatoryCount = 0;
1074
+ // Check all items in hashmap that are direct children of this milestone (courses)
1075
+ for (const key of Object.keys(this.hashmap)) {
1076
+ const item = this.hashmap[key];
1077
+ // Check if this item is a direct child of the milestone (course level)
1078
+ if (item.parent !== milestoneId)
1079
+ continue;
1080
+ // Skip if not a course or collection
1081
+ if (item.primaryCategory !== 'Course' && !item.isCollection)
1082
+ continue;
1083
+ // Skip assessments - they're checked separately
1084
+ const isAssessment = item.primaryCategory === 'Course Assessment' ||
1085
+ item.primaryCategory === 'Final Assessment' ||
1086
+ item.courseCategory === 'Course Assessment' ||
1087
+ (item.name && item.name.toLowerCase().includes('assessment'));
1088
+ if (isAssessment)
1089
+ continue;
1090
+ // Check if this content is mandatory
1091
+ if (item.isMandatory) {
1092
+ mandatoryCount++;
1093
+ const isCompleted = item.completionStatus === 2 || item.status === 2 || item.completionPercentage >= 100 || item.progress >= 100;
1094
+ console.log(`Mandatory course ${key} (${item.name}): Status ${item.completionStatus}, status: ${item.status}, Percentage ${item.completionPercentage}, Progress: ${item.progress}, Completed: ${isCompleted}`);
1095
+ if (isCompleted) {
1096
+ completedMandatoryCount++;
1097
+ }
1098
+ }
1099
+ }
1100
+ const allComplete = mandatoryCount === 0 || completedMandatoryCount >= mandatoryCount;
1101
+ console.log(`Milestone ${milestoneId} Mandatory: ${completedMandatoryCount}/${mandatoryCount} completed, All complete: ${allComplete}`);
1102
+ return allComplete;
1103
+ }
1104
+ /**
1105
+ * Check if a content item is a child (direct or nested) of a milestone
1106
+ */
1107
+ isChildOfMilestone(contentId, milestoneId) {
1108
+ let currentId = contentId;
1109
+ let depth = 0;
1110
+ const maxDepth = 10;
1111
+ while (currentId && depth < maxDepth) {
1112
+ const item = this.hashmap[currentId];
1113
+ if (!item)
1114
+ return false;
1115
+ if (item.parent === milestoneId)
1116
+ return true;
1117
+ currentId = item.parent;
1118
+ depth++;
1119
+ }
1120
+ return false;
1121
+ }
823
1122
  getCalculationsFromChildren(item) {
824
1123
  item['duration'] = item.children.reduce((sum, child) => {
825
1124
  return sum + Number(child.duration || 0);
@@ -998,4 +1297,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
998
1297
  providedIn: 'root'
999
1298
  }]
1000
1299
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ContentLanguageService }, { type: i3.ConfigurationsService }, { type: i4.WidgetContentService }]; } });
1001
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQWMsS0FBSyxFQUFnQixlQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVoRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFM0UsT0FBTyxFQUFFLFFBQVEsRUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRTdELDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7Ozs7O0FBRWhELHVDQUF1QztBQUN2QyxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFBO0FBQzlDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFBO0FBRXhDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFlBQVksRUFBRSxHQUFHLGFBQWEsaUNBQWlDO0lBQy9ELGVBQWUsRUFBRSxHQUFHLGlCQUFpQixrQkFBa0I7SUFDdkQsWUFBWSxFQUFFLEdBQUcsaUJBQWlCLGVBQWU7SUFDakQsaUJBQWlCLEVBQUUsdUNBQXVDO0lBQzFELGNBQWMsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLFlBQVksU0FBUyxTQUFTO0lBQ3pGLG1CQUFtQixFQUFFLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDdkUsaURBQWlELFNBQVMs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LElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN2RSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsWUFBb0IsRUFBRSxRQUFnQjtRQUMzRixtRUFBbUU7UUFDbkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQUM7WUFDeEMsU0FBUyxFQUFFLFNBQVMsSUFBSSxFQUFFO1lBQzFCLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtZQUN0QixNQUFNLEVBQUUsWUFBWSxJQUFJLEVBQUU7WUFDMUIsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFO1NBQ3pCLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsZUFBZSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQ3BGLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRTtnQkFDUCxRQUFRLEVBQUUsd0lBQXdJO2FBQ25KO1NBQ0YsQ0FBQyxDQUFDLElBQUksQ0FDTCxVQUFVLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUN4QixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzsrR0E1akNVLGFBQWE7bUhBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBEYXRhIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgRU1QVFksIFN1YnNjcmlwdGlvbiwgQmVoYXZpb3JTdWJqZWN0LCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBOc0NvbnRlbnRDb25zdGFudHMgfSBmcm9tICcuLi9fY29uc3RhbnRzL3dpZGdldC1jb250ZW50LmNvbnN0YW50cydcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyBOc0FwcFRvYywgTnNDb2hvcnRzIH0gZnJvbSAnLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXG5pbXBvcnQgeyBURmV0Y2hTdGF0dXMsIENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuLy8gVE9ETzogbW92ZSB0aGlzIGluIHNvbWUgY29tbW9uIHBsYWNlXG5jb25zdCBQUk9URUNURURfU0xBR19WOCA9ICcvYXBpcy9wcm90ZWN0ZWQvdjgnXG5jb25zdCBQUk9YWV9TTEFHX1Y4ID0gJy9hcGlzL3Byb3hpZXMvdjgnXG5cbmNvbnN0IEFQSV9FTkRfUE9JTlRTID0ge1xuICBCQVRDSF9DUkVBVEU6IGAke1BST1hZX1NMQUdfVjh9L2xlYXJuZXIvY291cnNlL3YxL2JhdGNoL2NyZWF0ZWAsXG4gIENPTlRFTlRfUEFSRU5UUzogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvcGFyZW50c2AsXG4gIENPTlRFTlRfTkVYVDogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvbmV4dGAsXG4gIENPTlRFTlRfSElTVE9SWVYyOiBgL2FwaXMvcHJveGllcy92OC9yZWFkL2NvbnRlbnQtcHJvZ3Jlc2AsXG4gIENPTlRFTlRfUEFSRU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50LyR7Y29udGVudElkfS9wYXJlbnRgLFxuICBDT05URU5UX0FVVEhfUEFSRU5UOiAoY29udGVudElkOiBzdHJpbmcsIHJvb3RPcmc6IHN0cmluZywgb3JnOiBzdHJpbmcpID0+XG4gICAgYC9hcGlzL2F1dGhBcGkvYWN0aW9uL2NvbnRlbnQvcGFyZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3Jvb3RPcmd9Jm9yZz0ke29yZ31gLFxuICBDT0hPUlRTOiAoY29ob3J0VHlwZTogTnNDb2hvcnRzLkVDb2hvcnRUeXBlcywgY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvJHtjb2hvcnRUeXBlfS8ke2NvbnRlbnRJZH1gLFxuICBFWFRFUk5BTF9DT05URU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvZXh0ZXJuYWwtYWNjZXNzLyR7Y29udGVudElkfWAsXG4gIENPSE9SVFNfR1JPVVBfVVNFUjogKGdyb3VwSWQ6IG51bWJlcikgPT4gYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvJHtncm91cElkfWAsXG4gIFJFTEFURURfUkVTT1VSQ0U6IChjb250ZW50SWQ6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZykgPT5cbiAgICBgJHtQUk9URUNURURfU0xBR19WOH0va2h1Yi9mZXRjaFJlbGF0ZWRSZXNvdXJjZXMvJHtjb250ZW50SWR9LyR7Y29udGVudFR5cGV9YCxcbiAgUE9TVF9BU1NFU1NNRU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L3VzZXIvZXZhbHVhdGUvcG9zdC1hc3Nlc3NtZW50LyR7Y29udGVudElkfWAsXG4gIEdFVF9DT05URU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPWFlfU0xBR19WOH0vYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gLFxuICBDRVJUX0RPV05MT0FEOiAoY2VydElkOiBhbnkpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzL2NvdXJzZS9iYXRjaC9jZXJ0L2Rvd25sb2FkLyR7Y2VydElkfWAsXG4gIFNFUlZFUl9EQVRFOiAnYXBpcy9wdWJsaWMvdjgvc3lzdGVtRGF0ZScsXG4gIFNIQVJFX0NPTlRFTlQ6ICcvYXBpcy9wcm94aWVzL3Y4L3VzZXIvdjEvY29udGVudC9yZWNvbW1lbmQnLFxuICBHRVRfRk9STV9CWUlEOiAoZm9ybUlkOiBzdHJpbmcpID0+IGBhcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvZ2V0Rm9ybUJ5SWQ/Zm9ybUlkPSR7Zm9ybUlkfWAsXG4gIC8vIFNVQk1JVF9GT1JNOiBgL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdGAsXG4gIFNVQk1JVF9GT1JNOiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcbiAgR0VUX0ZPUk1fQllJRF9QVUJMSUM6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHVibGljL3Y4L3B1YmxpYy9mb3Jtcy92Mi9nZXRGb3JtQnlJZD9mb3JtSWQ9JHtmb3JtSWR9YCxcbiAgU1VCTUlUX0ZPUk1fUFVCTElDOiBgYXBpcy9wdWJsaWMvdjgvcHVibGljL2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcbiAgLy8gZ2V0IGFuc3dlcnMgZm9yIGZvcm1cbiAgR0VUX0FQUExJQ0FUSU9OU19CWV9JRDogKGZvcm1JZDogc3RyaW5nLCAgY29udGV4dElkOiBzdHJpbmcpID0+YC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvZ2V0QXBwbGljYXRpb25zQnlJZD9mb3JtSWQ9JHtmb3JtSWR9JmNvbnRleHRJZD0ke2NvbnRleHRJZH1gLFxuICBBSV9SRVNPVVJDRV9WVFRfRklMRTogYCR7UFJPWFlfU0xBR19WOH0vY2hhdGJvdC92My90cmFuc2NvZGVyL3N0YXRzYCxcbiAgLy8gR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL2dldEZvcm1CeUlkP2lkPSR7Zm9ybUlkfWAsXG4gIFBSRV9FTlJPTExNRU5UX1NUQVRFX1JFQUQ6IGAvYXBpcy9wcm94aWVzL3Y4L2NvbnRlbnQvdjIvc3RhdGUvcmVhZGAsXG4gIENSRUFURV9SRVNPVVJDRTogYGFwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9jcmVhdGVgLFxuICBSRUFEX1JFU09VUkNFOiBgYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL2AsXG4gIFVQTE9BRF9GSUxFOiBgYXBpcy9wcm94aWVzL3Y4L3VwbG9hZC9hY3Rpb24vY29udGVudC92My9gLFxuICBVUERBVEVfUkVTT1VSQ0U6IGBhcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvdXBkYXRlYCxcbiAgU0VBUkNIOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc2VhcmNoYCxcbiAgU1VCTUlUX0RSQUZUX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvYXNzaWdubWVudC92MS9zdWJtaXREcmFmdGAsXG4gIFNVQk1JVF9BU1NJR05NRU5UOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc3VibWl0YCxcbiAgQVNTSUdOTUVOVF9TVEFUVVM6IGBhcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvc3VibWlzc2lvbnMvc2VhcmNoYCxcbiAgVVBMT0FEX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvc3RvcmFnZS92MS9icC9hc3NpZ25tZW50L2Fuc3dlcmAsXG4gIFJFQURfQVNTSUdOTUVOVDogYGFwaXMvcHJveGllcy92OC9zdG9yYWdlL3YxL2JwL2Fzc2lnbm1lbnQvYW5zd2VyL3JlYWQvZmlsZWAsXG4gIE5PVElGWV9BU1NJR05NRU5UX1NVQk1JU1NJT046IGBhcGlzL3Byb3hpZXMvdjgvdjEvbm90aWZ5QXNzaWdubWVudC9zdWJtaXRgLFxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NTZXJ2aWNlIHtcbiAgYW5hbHl0aWNzUmVwbGF5U3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBhbmFseXRpY3NGZXRjaFN0YXR1czogVEZldGNoU3RhdHVzID0gJ25vbmUnXG4gIGJhdGNoUmVwbGF5U3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBzZXRCYXRjaERhdGFTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpXG4gIGdldFNlbGVjdGVkQmF0Y2g6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgc2V0V0ZEYXRhU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICByZXN1bWVEYXRhOiBTdWJqZWN0PE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGEgfCBudWxsPiA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICBwcml2YXRlIHNob3dTdWJ0aXRsZU9uQmFubmVycyA9IGZhbHNlXG4gIHByaXZhdGUgY2FuU2hvd0Rlc2NyaXB0aW9uID0gZmFsc2VcbiAgcmVzdW1lRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcHJpbWFyeUNhdGVnb3J5ID0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnlcbiAgcHJpdmF0ZSB1cGRhdGVSZXZpZXdzID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSlcbiAgdXBkYXRlUmV2aWV3c09ic2VydmFibGUgPSB0aGlzLnVwZGF0ZVJldmlld3MuYXNPYnNlcnZhYmxlKClcbiAgcHVibGljIHNlcnZlckRhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKVxuICBjdXJyZW50U2VydmVyRGF0ZSA9IHRoaXMuc2VydmVyRGF0ZS5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgY29udGVudExvYWRlciA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpXG4gIGNvbnRlbnRMb2FkZXIkID0gdGhpcy5jb250ZW50TG9hZGVyLmFzT2JzZXJ2YWJsZSgpXG4gIHB1YmxpYyBnZXRQYWdlU2Nyb2xsID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKVxuICB1cGRhdGVQYWdlU2Nyb2xsID0gdGhpcy5nZXRQYWdlU2Nyb2xsLmFzT2JzZXJ2YWJsZSgpXG4gIHB1YmxpYyBoYXNobWFwOiBhbnkgPSB7fVxuICBwcml2YXRlIHRyYW5zcmlwdGlvbkRhdGFTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpOyAvLyBTdGFydCB3aXRoIG51bGxcbiAgdHJhbnNjcmlwdGlvbkRhdGEkID0gdGhpcy50cmFuc3JpcHRpb25EYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHVibGljIHRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdCQgPSB0aGlzLnRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHVibGljIHRyYW5zcmlwdGlvbklkZW50aWZpZXIgPSBuZXcgU3ViamVjdCgpOyAvLyBTdGFydCB3aXRoIG51bGxcbiAgY2hhbmdlVHJhbnNjcmlwdGlvbkxhbmd1YWdlRXZlbnQgPSBuZXcgU3ViamVjdCgpXG4gIHBsYXlUcmFuc2NyaXB0aW9uVmlkZW8gPSBuZXcgU3ViamVjdCgpXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSwgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSwgcHJpdmF0ZSB3aWRnZXRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlKSB7XG4gICAgLy8gdGhpcyByZXN1bWUgZGF0YSBzdWJzY3JpcHRpb24gaXMgZm9yIG9uIGxvYWRcbiAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnJlc3VtZURhdGEuc3Vic2NyaWJlKFxuICAgICAgKF9kYXRhUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIH0pXG4gIH1cblxuICBnZXQgc3VidGl0bGVPbkJhbm5lcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1N1YnRpdGxlT25CYW5uZXJzXG4gIH1cbiAgc2V0IHN1YnRpdGxlT25CYW5uZXJzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd1N1YnRpdGxlT25CYW5uZXJzID0gdmFsXG4gIH1cbiAgZ2V0IHNob3dEZXNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYW5TaG93RGVzY3JpcHRpb25cbiAgfVxuICBzZXQgc2hvd0Rlc2NyaXB0aW9uKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuY2FuU2hvd0Rlc2NyaXB0aW9uID0gdmFsXG4gIH1cblxuICB1cGRhdGVCYXRjaERhdGEoKSB7XG4gICAgdGhpcy5iYXRjaFJlcGxheVN1YmplY3QubmV4dCgpXG4gIH1cblxuICBzZXRCYXRjaERhdGEoZGF0YTogTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSkge1xuICAgIHRoaXMuc2V0QmF0Y2hEYXRhU3ViamVjdC5uZXh0KGRhdGEpXG4gIH1cblxuICBzZXRXRkRhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy5zZXRXRkRhdGFTdWJqZWN0Lm5leHQoZGF0YSlcbiAgfVxuXG4gIHVwZGF0ZVJlc3VtYURhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy5yZXN1bWVEYXRhLm5leHQoZGF0YSlcbiAgfVxuXG4gIGNoYW5nZVVwZGF0ZVJldmlld3Moc3RhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVJldmlld3MubmV4dChzdGF0ZSlcbiAgfVxuICBnZXRTZWxlY3RlZEJhdGNoRGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmdldFNlbGVjdGVkQmF0Y2gubmV4dChkYXRhKVxuICB9XG5cbiAgY2hhbmdlU2VydmVyRGF0ZShzdGF0ZTogYW55KSB7XG4gICAgdGhpcy5zZXJ2ZXJEYXRlLm5leHQoc3RhdGUpXG4gIH1cblxuICBtYXBTZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhOiBhbnksIHJlc3VtZURhdGFQYXNzPzogYW55KSB7XG4gICAgaWYgKHJlc3VtZURhdGFQYXNzICYmIHJlc3VtZURhdGFQYXNzLmxlbmd0aCkge1xuICAgICAgaWYgKHJlc3VtZURhdGFQYXNzICYmIHJlc3VtZURhdGFQYXNzLmxlbmd0aCAmJiBiYXRjaERhdGEuY29udGVudCAmJiBiYXRjaERhdGEuY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhLCByZXN1bWVEYXRhUGFzcylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5yZXN1bWVEYXRhLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGFSZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhUmVzdWx0ICYmIGRhdGFSZXN1bHQubGVuZ3RoICYmIGJhdGNoRGF0YS5jb250ZW50ICYmIGJhdGNoRGF0YS5jb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhLCBkYXRhUmVzdWx0KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBvbiByZXN1bWVEYXRhU3Vic2NyaXB0aW9uJylcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgfVxuICBzZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhOiBhbnksIHJlc3VtZURhdGFQYXNzOiBhbnkpIHtcbiAgICBpZiAocmVzdW1lRGF0YVBhc3MgJiYgcmVzdW1lRGF0YVBhc3MubGVuZ3RoKSB7XG4gICAgICBpZiAoYmF0Y2hEYXRhICYmIGJhdGNoRGF0YS5jb250ZW50WzBdICYmXG4gICAgICAgIGJhdGNoRGF0YS5jb250ZW50WzBdLmJhdGNoQXR0cmlidXRlcyAmJlxuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjJcbiAgICAgICkge1xuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIubWFwKChzZDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRDb250ZW50ID0gcmVzdW1lRGF0YVBhc3MuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBzZC5zZXNzaW9uSWQpXG4gICAgICAgICAgaWYgKGZvdW5kQ29udGVudCkge1xuICAgICAgICAgICAgc2QuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICAgIHNkLmNvbXBsZXRpb25TdGF0dXMgPSBmb3VuZENvbnRlbnQuc3RhdHVzXG4gICAgICAgICAgICBzZC5sYXN0Q29tcGxldGVkVGltZSA9IGZvdW5kQ29udGVudC5sYXN0Q29tcGxldGVkVGltZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2hvd1N0YXJ0QnV0dG9uKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpOiB7IHNob3c6IGJvb2xlYW47IG1zZzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHtcbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgbXNnOiAnJyxcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5hcnRpZmFjdFVybCAmJiBjb250ZW50LmFydGlmYWN0VXJsLm1hdGNoKC95b3V0dSguKT9iZS9naSkgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUuY291bnRyeSA9PT0gJ0NoaW5hJ1xuICAgICAgKSB7XG4gICAgICAgIHN0YXR1cy5zaG93ID0gZmFsc2VcbiAgICAgICAgc3RhdHVzLm1zZyA9ICd5b3V0dWJlRm9yYmlkZGVuJ1xuICAgICAgICByZXR1cm4gc3RhdHVzXG4gICAgICB9XG4gICAgICBpZiAoY29udGVudC5yZXNvdXJjZVR5cGUgIT09ICdDZXJ0aWZpY2F0aW9uJykge1xuICAgICAgICBzdGF0dXMuc2hvdyA9IHRydWVcbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpbml0RGF0YShkYXRhOiBEYXRhLCBuZWVkUmVzdW1lRGF0YTogYm9vbGVhbiA9IGZhbHNlKTogTnNBcHBUb2MuSVdzVG9jUmVzcG9uc2Uge1xuICAgIGxldCBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICAgIGxldCBlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSB8IG51bGwgPSBudWxsXG4gICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBpZiAoZGF0YS5jb250ZW50ICYmIGRhdGEuY29udGVudC5kYXRhICYmIGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnRlbnQgPSBkYXRhLmNvbnRlbnQuZGF0YVxuICAgICAgaWYgKG5lZWRSZXN1bWVEYXRhKSB7XG4gICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzdW1lRGF0YS5zdWJzY3JpYmUoXG4gICAgICAgICAgKGRhdGFSZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGFSZXN1bHQgJiYgZGF0YVJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhUmVzdWx0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igb24gcmVzdW1lRGF0YVN1YnNjcmlwdGlvbicpXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLkFQSV9GQUlMVVJFXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckNvZGUgPSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuTk9fREFUQVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudCxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9XG4gIH1cblxuICBtYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsLCBkYXRhUmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBjb250ZW50LmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IGRhdGFSZXN1bHQuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBjaGlsZC5pZGVudGlmaWVyKVxuICAgICAgICBpZiAoZm91bmRDb250ZW50KSB7XG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgZm91bmRDb250ZW50LnByb2dyZXNzXG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9IGZvdW5kQ29udGVudC5zdGF0dXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNoaWxkLCBkYXRhUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIG1hcE1vZHVsZUNvdW50KGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgMSA6IDFcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KGNoaWxkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldE1pbWVUeXBlKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCwgaWRlbnRpZmllcjogc3RyaW5nKTogTnNDb250ZW50LkVNaW1lVHlwZXMge1xuICAgIGlmIChjb250ZW50LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgfVxuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBpZiAoY29udGVudC5jaGlsZHJlblswXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIGNvbnRlbnQubWltZVR5cGVcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBiaWcgYmx1bmRlciBpbiBkYXRhXG4gICAgICAgIC8vIHRoaXMubG9nZ2VyLmxvZyhjb250ZW50LmlkZW50aWZpZXIsICdXcm9uZyBtaW1ldHlwZXMgZm9yIHJlc3VtZScpXG4gICAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgICB9XG4gICAgICBjb25zdCBmbGF0TGlzdDogYW55W10gPSBbXVxuICAgICAgY29uc3QgZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbjogYW55ID0gKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBmbGF0TGlzdC5wdXNoKGl0ZW0pXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0uY2hpbGRyZW4ubWFwKChpOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4oaSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKGNvbnRlbnQpXG4gICAgICBjb25zdCBjaGxkID0gXy5maXJzdChfLmZpbHRlcihmbGF0TGlzdCwgeyBpZGVudGlmaWVyIH0pKVxuICAgICAgcmV0dXJuIChjaGxkICYmIGNobGQubWltZVR5cGUpIHx8ICcnXG4gICAgfVxuICAgIC8vIHJldHVybiBjaGxkLm1pbWVUeXBlXG4gICAgcmV0dXJuIE5zQ29udGVudC5FTWltZVR5cGVzLlVOS05PV05cbiAgfVxuXG4gIGdldFRvY1N0cnVjdHVyZShcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgdG9jU3RydWN0dXJlOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlLFxuICApOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlIHtcbiAgICBpZiAoXG4gICAgICBjb250ZW50ICYmXG4gICAgICAhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICAvLyB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUKVxuICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlRcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTlxuICAgICAgKSkge1xuICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmNvdXJzZSArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlICs9IDFcbiAgICAgIH1cbiAgICAgIF8uZWFjaChjb250ZW50LmNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICB0b2NTdHJ1Y3R1cmUgPSB0aGlzLmdldFRvY1N0cnVjdHVyZShjaGlsZCwgdG9jU3RydWN0dXJlKVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29udGVudCAmJlxuICAgICAgKFxuICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgLy8gfHwgY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0tub3dsZWRnZSBBcnRpZmFjdCdcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKGNvbnRlbnQubWltZVR5cGUpIHtcbiAgICAgICAgLy8gY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5IQU5EU19PTjpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUuaGFuZHNPbiArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDM6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnBvZGNhc3QgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0OlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTg6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUudmlkZW8gKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSU5URVJBQ1RJT046XG4gICAgICAgIC8vICAgdG9jU3RydWN0dXJlLmludGVyYWN0aXZlVmlkZW8gKz0gMVxuICAgICAgICAvLyAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUERGOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5wZGYgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSFRNTDpcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5URVhUX1dFQjpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUud2ViUGFnZSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVk6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnN1cnZleSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5RVUlaOlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkFQUExJQ0FUSU9OX0pTT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUuYXNzZXNzbWVudCArPSAxXG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAvLyAgIHRvY1N0cnVjdHVyZS5xdWl6ICs9IDFcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5PRkZMSU5FX1NFU1NJT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub2ZmbGluZVNlc3Npb24gKz0gMVxuICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUucXVpeiArPSAxXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUFJBQ1RJQ0VfUkVTT1VSQ0U6XG4gICAgICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLnByYWN0aWNlVGVzdCArPSAxXG4gICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLmZpbmFsVGVzdCArPSAxXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuV0VCX01PRFVMRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUud2ViTW9kdWxlICs9IDFcbiAgICAgICAgLy8gICBicmVha1xuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlpJUDI6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWklQOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5pbnRlcmFjdGl2ZWNvbnRlbnQgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUueW91dHViZSArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub3RoZXIgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICByZXR1cm4gdG9jU3RydWN0dXJlXG4gICAgfVxuICAgIHJldHVybiB0b2NTdHJ1Y3R1cmVcbiAgfVxuXG4gIGZpbHRlclRvYyhcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgZmlsdGVyQ2F0ZWdvcnk6IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkgPSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTCxcbiAgKTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCB7XG4gICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgLy8gIHx8IGNvbnRlbnQuY29udGVudFR5cGUgPT09ICdLbm93bGVkZ2UgQXJ0aWZhY3QnXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJVbml0Q29udGVudChjb250ZW50LCBmaWx0ZXJDYXRlZ29yeSkgPyBjb250ZW50IDogbnVsbFxuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZENoaWxkcmVuOiBOc0NvbnRlbnQuSUNvbnRlbnRbXSA9XG4gICAgICBfLm1hcChfLmdldChjb250ZW50LCAnY2hpbGRyZW4nKSwgY2hpbGRDb250ZW50ID0+XG4gICAgICAgIHRoaXMuZmlsdGVyVG9jKGNoaWxkQ29udGVudCwgZmlsdGVyQ2F0ZWdvcnkpKVxuICAgICAgICAuZmlsdGVyKHVuaXRDb250ZW50ID0+IEJvb2xlYW4odW5pdENvbnRlbnQpKSBhcyBOc0NvbnRlbnQuSUNvbnRlbnRbXVxuICAgIGlmIChmaWx0ZXJlZENoaWxkcmVuICYmIGZpbHRlcmVkQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb250ZW50LFxuICAgICAgICBjaGlsZHJlbjogZmlsdGVyZWRDaGlsZHJlbixcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZpbHRlclVuaXRDb250ZW50KFxuICAgIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCxcbiAgICBmaWx0ZXJDYXRlZ29yeTogTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeSA9IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQUxMLFxuICApOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGZpbHRlckNhdGVnb3J5KSB7XG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuTEVBUk46XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIU5zQ29udGVudENvbnN0YW50cy5WQUxJRF9QUkFDVElDRV9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKSAmJlxuICAgICAgICAgICFOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgICApXG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0U6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfUFJBQ1RJQ0VfUkVTT1VSQ0VTLmhhcyhjb250ZW50LnJlc291cmNlVHlwZSlcbiAgICAgIGNhc2UgTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeS5BU1NFU1M6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgY2FzZSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIGZldGNoQ29udGVudEFuYWx5dGljc0NsaWVudERhdGEoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyAhPT0gJ2ZldGNoaW5nJyAmJiB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgIHRoaXMuZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZmV0Y2hpbmcnXG4gICAgY29uc3QgdXJsID0gYCR7UFJPWFlfU0xBR19WOH0vTEEvYXBpL2xhL2NvbnRlbnRhbmFseXRpY3M/Y29udGVudF9pZD0ke2NvbnRlbnRJZH0mdHlwZT1jb3Vyc2VgXG4gICAgdGhpcy5odHRwLmdldCh1cmwpLnN1YnNjcmliZShcbiAgICAgIChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KHJlc3VsdClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KG51bGwpXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hDb250ZW50QW5hbHl0aWNzRGF0YShjb250ZW50SWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZmV0Y2hpbmcnICYmIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgIT09ICdkb25lJykge1xuICAgICAgdGhpcy5nZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZClcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgIGNvbnN0IHVybCA9IGAke1BST1hZX1NMQUdfVjh9L0xBL0xBL2FwaS9Vc2Vycz9yZWZpbmVtZW50ZmlsdGVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgJ1wic291cmNlXCI6W1wiaUdvdFwiLFwiTGVhcm5pbmcgSHViXCJdJyxcbiAgICApfSQke2VuY29kZVVSSUNvbXBvbmVudChgXCJjb3Vyc2VDb2RlXCI6IFtcIiR7Y29udGVudElkfVwiXWApfWBcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQocmVzdWx0KVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQobnVsbClcbiAgICAgICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgfSxcbiAgICApXG4gIH1cblxuICBjbGVhckFuYWx5dGljc0RhdGEoKSB7XG4gICAgaWYgKHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdCkge1xuICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0LnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICBmZXRjaENvbnRlbnRQYXJlbnRzKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICAvLyByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgIC8vICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9QQVJFTlRTfS8ke2NvbnRlbnRJZH1gLFxuICAgIC8vIClcbiAgICBpZiAoY29udGVudElkKSB7IH1cbiAgICByZXR1cm4gRU1QVFlcbiAgfVxuICBmZXRjaENvbnRlbnRXaGF0c05leHQoXG4gICAgY29udGVudElkOiBzdHJpbmcsXG4gICAgY29udGVudFR5cGU/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFR9LyR7Y29udGVudElkfT9jb250ZW50VHlwZT0ke2NvbnRlbnRUeXBlfWAsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFR9LyR7Y29udGVudElkfT90cz0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hNb3JlTGlrZVRoaXNQYWlkKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ORVhUXG4gICAgICB9LyR7Y29udGVudElkfT9leGNsdXNpdmVDb250ZW50PXRydWUmdHM9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLFxuICAgIClcbiAgfVxuXG4gIGZldGNoTW9yZUxpa2VUaGlzRnJlZShjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfTkVYVFxuICAgICAgfS8ke2NvbnRlbnRJZH0/ZXhjbHVzaXZlQ29udGVudD1mYWxzZSZ0cz0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hDb250ZW50Q29ob3J0cyhcbiAgICBjb2hvcnRUeXBlOiBOc0NvaG9ydHMuRUNvaG9ydFR5cGVzLFxuICAgIGNvbnRlbnRJZDogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPE5zQ29ob3J0cy5JQ29ob3J0c0NvbnRlbnRbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29ob3J0cy5JQ29ob3J0c0NvbnRlbnRbXT4oQVBJX0VORF9QT0lOVFMuQ09IT1JUUyhjb2hvcnRUeXBlLCBjb250ZW50SWQpLCB7XG4gICAgICBoZWFkZXJzOiB7IHJvb3RPcmc6IHRoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJycsIG9yZzogdGhpcy5jb25maWdTdmMub3JnID8gdGhpcy5jb25maWdTdmMub3JnWzBdIDogJycgfSxcbiAgICB9KVxuICB9XG4gIGZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx7IGhhc0FjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyBoYXNBY2Nlc3M6IGJvb2xlYW4gfT4oQVBJX0VORF9QT0lOVFMuRVhURVJOQUxfQ09OVEVOVChjb250ZW50SWQpKVxuICB9XG4gIGZldGNoQ29ob3J0R3JvdXBVc2Vycyhncm91cElkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvaG9ydHMuSUNvaG9ydHNHcm91cFVzZXJzW10+KEFQSV9FTkRfUE9JTlRTLkNPSE9SVFNfR1JPVVBfVVNFUihncm91cElkKSlcbiAgfVxuICBmZXRjaE1vcmVMaWtlVGhpcyhjb250ZW50SWQ6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50W10+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuUkVMQVRFRF9SRVNPVVJDRShjb250ZW50SWQsIGNvbnRlbnRUeXBlKSxcbiAgICApXG4gIH1cblxuICBmZXRjaFBvc3RBc3Nlc3NtZW50U3RhdHVzKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudFtdIH0+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuUE9TVF9BU1NFU1NNRU5UKGNvbnRlbnRJZCksXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hHZXRDb250ZW50RGF0YShjb250ZW50SWQ6IHN0cmluZykge1xuICAgIGxldCB1cmwgPSAnJ1xuICAgIGNvbnN0IGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG4gICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KFxuICAgICAgICBBUElfRU5EX1BPSU5UUy5HRVRfQ09OVEVOVChjb250ZW50SWQpLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ2VkaXRNb2RlPXRydWUnKSAmJiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnX3JjJykpIHtcbiAgICAgIHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YFxuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSBgL2FwaS9jb250ZW50L3YxL3JlYWQvJHtjb250ZW50SWR9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KHVybClcblxuICB9XG5cbiAgZmV0Y2hDb250ZW50UGFyZW50KGNvbnRlbnRJZDogc3RyaW5nLCBkYXRhOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlcSwgZm9yUHJldmlldyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVzcG9uc2U+KFxuICAgICAgZm9yUHJldmlld1xuICAgICAgICA/IEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfQVVUSF9QQVJFTlQoXG4gICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgIHRoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJycsXG4gICAgICAgICAgdGhpcy5jb25maWdTdmMub3JnID8gdGhpcy5jb25maWdTdmMub3JnWzBdIDogJycsXG4gICAgICAgIClcbiAgICAgICAgOiBBUElfRU5EX1BPSU5UUy5DT05URU5UX1BBUkVOVChjb250ZW50SWQpLFxuICAgICAgZGF0YSxcbiAgICApXG4gIH1cblxuICBjcmVhdGVCYXRjaChiYXRjaERhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChcbiAgICAgIEFQSV9FTkRfUE9JTlRTLkJBVENIX0NSRUFURSxcbiAgICAgIHsgcmVxdWVzdDogYmF0Y2hEYXRhIH0sXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgbWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwsIGVucm9sbWVudExpc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBsZXQgdG90YWxDb3VudCA9IDBcbiAgICBsZXQgbGVhZm5vZGVDb3VudCA9IDBcbiAgICBsZXQgY29tcGxldGVkTGVhZk5vZGVzOiBhbnkgPSBbXVxuICAgIGxldCBmaXJzdFVuY29tcGxldGVDb3Vyc2U6IGFueSA9ICcnXG4gICAgbGV0IGlucHJvZ3Jlc3NEYXRhQ2hlY2s6IGFueSA9IFtdXG4gICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgbGVhZm5vZGVDb3VudCA9IGNvbnRlbnQubGVhZk5vZGVzQ291bnRcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICBjb25zdCBmb3VuZFBhcmVudENvbnRlbnQgPSB0aGlzLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0LCBjb2xsZWN0aW9uSWQgfHwgY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgaWYgKGZvdW5kUGFyZW50Q29udGVudCAmJiBmb3VuZFBhcmVudENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICBhd2FpdCB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvbnRlbnQpXG4gICAgICAgIHRvdGFsQ291bnQgPSBjb250ZW50LmxlYWZOb2Rlc0NvdW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIC8vIGNvbnRlbnQuY2hpbGRyZW4uZm9yRWFjaChhc3luYyAocGFyZW50Q2hpbGQsaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENoaWxkID0gY29udGVudC5jaGlsZHJlbltpXVxuICAgICAgICAgICAgaWYgKHBhcmVudENoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IHRoaXMuZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3QsIHBhcmVudENoaWxkPy5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAvLyB0b3RhbENvdW50ID0gZm91bmRDb250ZW50ICYmIGZvdW5kQ29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA/IHRvdGFsQ291bnQgKyBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgOiB0b3RhbENvdW50ICsgMFxuICAgICAgICAgICAgICAvLyBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gTWF0aC5yb3VuZCh0b3RhbENvdW50IC8gbGVhZm5vZGVDb3VudClcbiAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudCAmJiBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHRvdGFsQ291bnQgKz0gcGFyZW50Q2hpbGQubGVhZk5vZGVzQ291bnRcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRMZWFmTm9kZXMgPSBbLi4uY29tcGxldGVkTGVhZk5vZGVzLCAuLi5wYXJlbnRDaGlsZC5sZWFmTm9kZXNdXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudC5pc3N1ZWRDZXJ0aWZpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2VydGlmaWNhdGU6IGFueSA9IGZvdW5kQ29udGVudC5pc3N1ZWRDZXJ0aWZpY2F0ZXMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpKVxuICAgICAgICAgICAgICAgICAgY29uc3QgY2VydElkOiBhbnkgPSBjZXJ0aWZpY2F0ZVswXS5pZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICBwYXJlbnRDaGlsZC5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCA9IGNlcnRJZFxuICAgICAgICAgICAgICAgICAgLy8gY29uc3QgY2VydERhdGE6IGFueSA9IGF3YWl0IHRoaXMuZG93b25sb2FkQ2VydGlmaWNhdGUoY2VydElkKS50b1Byb21pc2UoKS5jYXRjaChfZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgICAgICAgIC8vIH0pXG4gICAgICAgICAgICAgICAgICAvLyBpZiAoY2VydERhdGEgJiYgY2VydERhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHBhcmVudENoaWxkLmlzc3VlZENlcnRpZmljYXRlc1NWRyA9IGNlcnREYXRhLnJlc3VsdC5wcmludFVyaVxuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmVudENoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMTAwXG4gICAgICAgICAgICAgICAgcGFyZW50Q2hpbGQuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hJZDogZm91bmRDb250ZW50LmJhdGNoLmJhdGNoSWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBmb3VuZENvbnRlbnQudXNlcklkLFxuICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRDb250ZW50LmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBmaXJzdFVuY29tcGxldGVDb3Vyc2UgPSAocGFyZW50Q2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDAgfHwgIXBhcmVudENoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZmlyc3RVbmNvbXBsZXRlQ291cnNlID8gcGFyZW50Q2hpbGQgOiBmaXJzdFVuY29tcGxldGVDb3Vyc2VcbiAgICAgICAgICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnRvUHJvbWlzZSgpLnRoZW4oKHByb2dyZXNzZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YT8ucmVzdWx0Py5jb250ZW50TGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gZGF0YS5yZXN1bHQuY29udGVudExpc3QuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnByb2dyZXNzID09PSAxMDApXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0NvbXBsZXRlZExlYWZub2Rlcyhjb21wbGV0ZWRMZWFmTm9kZXMsIGNvbXBsZXRlZENvdW50KVxuICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ291bnQgPSBjb21wbGV0ZWRMZWFmTm9kZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IFsuLi5pbnByb2dyZXNzRGF0YUNoZWNrLCAuLi5kYXRhLnJlc3VsdC5jb250ZW50TGlzdF1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnByb2dyZXNzRGF0YUNoZWNrID0gaW5wcm9ncmVzc0RhdGFDaGVjayA/IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgOiAgZGF0YS5yZXN1bHQuY29udGVudExpc3RcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VtYURhdGEoaW5wcm9ncmVzc0RhdGFDaGVjaylcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKHBhcmVudENoaWxkLCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQocGFyZW50Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gIGVsc2Uge1xuICAgICAgICAgICAgLy8gICBpZiAoY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgZm91bmRDb250ZW50ID0gZW5yb2xtZW50TGlzdCAmJiBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgLy8gICAgIGlmIChmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgLy8gICAgICAgICAgIGJhdGNoSWQ6IGZvdW5kQ29udGVudC5iYXRjaC5iYXRjaElkLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIHVzZXJJZDogZm91bmRDb250ZW50LnVzZXJJZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRDb250ZW50LmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIF0sXG4gICAgICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnRvUHJvbWlzZSgpLnRoZW4oKHByb2dyZXNzZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IGRhdGE6IGFueSAgPSBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRDb3VudCA9IGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0LmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5wcm9ncmVzcyA9PT0gMTAwKVxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMuY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMoY29tcGxldGVkTGVhZk5vZGVzLCBjb21wbGV0ZWRDb3VudClcbiAgICAgICAgICAgIC8vICAgICAgICAgICB0b3RhbENvdW50ID0gY29tcGxldGVkTGVhZk5vZGVzLmxlbmd0aFxuICAgICAgICAgICAgLy8gICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrID8gaW5wcm9ncmVzc0RhdGFDaGVjayA6ICBkYXRhLnJlc3VsdC5jb250ZW50TGlzdFxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudCwgZGF0YS5yZXN1bHQuY29udGVudExpc3QpXG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAvLyAgICAgICAgIHJldHVybiBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgIC8vICAgICAgIH0pXG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cbiAgICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFXG4gICAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVFxuICAgICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0pIHtcbiAgICAgICAgICAvLyB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICBjb25zdCBmb3VuZFBhcmVudENvbnRlbnQgPSB0aGlzLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0LCBjb2xsZWN0aW9uSWQgfHwgY29udGVudD8uaWRlbnRpZmllcilcbiAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKGNvbnRlbnQpXG4gICAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICBiYXRjaElkOiBmb3VuZFBhcmVudENvbnRlbnQ/LmJhdGNoPy5iYXRjaElkLFxuICAgICAgICAgICAgICB1c2VySWQ6IGZvdW5kUGFyZW50Q29udGVudD8udXNlcklkLFxuICAgICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRQYXJlbnRDb250ZW50Py5jb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgY29udGVudElkczogW10sXG4gICAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxKS50b1Byb21pc2UoKS50aGVuKChwcm9ncmVzc2RhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YTogYW55ID0gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gZGF0YS5yZXN1bHQuY29udGVudExpc3QuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnByb2dyZXNzID09PSAxMDApXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMoY29tcGxldGVkTGVhZk5vZGVzLCBjb21wbGV0ZWRDb3VudClcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IGNvbXBsZXRlZExlYWZOb2Rlcy5sZW5ndGhcbiAgICAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IFsuLi5pbnByb2dyZXNzRGF0YUNoZWNrLCAuLi5kYXRhLnJlc3VsdC5jb250ZW50TGlzdF1cbiAgICAgICAgICAgICAgLy8gaW5wcm9ncmVzc0RhdGFDaGVjayA9IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPyBpbnByb2dyZXNzRGF0YUNoZWNrIDogIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnByb2dyZXNzRGF0YUNoZWNrICYmIGlucHJvZ3Jlc3NEYXRhQ2hlY2subGVuZ3RoID09PSAwICYmIGZpcnN0VW5jb21wbGV0ZUNvdXJzZSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGREYXRhID0gdGhpcy53aWRnZXRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KGZpcnN0VW5jb21wbGV0ZUNvdXJzZSlcbiAgICAgICAgICBjb25zdCBjaGlsZEVucm9sbG1lbnREYXRhID0gZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PlxuICAgICAgICAgICAgZWwuY29sbGVjdGlvbklkID09PSBmaXJzdFVuY29tcGxldGVDb3Vyc2UuaWRlbnRpZmllcilcbiAgICAgICAgICBjb25zdCByZXN1bWVEYXRhID0gW3tcbiAgICAgICAgICAgIGNvbnRlbnRJZDogZmlyc3RDaGlsZERhdGEuaWRlbnRpZmllcixcbiAgICAgICAgICAgIGJhdGNoSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5iYXRjaElkLFxuICAgICAgICAgICAgY29tcGxldGVkQ291bnQ6IDEsXG4gICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogMC4wLFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICB2aWV3Q291bnQ6IDEsXG4gICAgICAgICAgICBjb3Vyc2VJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgICAgY29sbGVjdGlvbklkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuY291cnNlSWQsXG4gICAgICAgICAgICBzdGF0dXM6IDEsXG4gICAgICAgICAgfV1cbiAgICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gcmVzdW1lRGF0YVxuICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjb25zdCBwYXJlbnRDb250ZW50ID0gZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgIC8vIGlmICghcGFyZW50Q29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSkge1xuICAgICAgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGguZmxvb3IoKHRvdGFsQ291bnQgLyBsZWFmbm9kZUNvdW50KSAqIDEwMClcbiAgICAgIGNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPD0gMTAwID8gMSA6IDJcbiAgICAgIGlmIChjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgJiYgaW5wcm9ncmVzc0RhdGFDaGVjayAmJiBpbnByb2dyZXNzRGF0YUNoZWNrLmxlbmd0aCA9PT0gMCAmJiAhZmlyc3RVbmNvbXBsZXRlQ291cnNlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q2hpbGREYXRhID0gdGhpcy53aWRnZXRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KGNvbnRlbnQpXG4gICAgICAgIGNvbnN0IGNoaWxkRW5yb2xsbWVudERhdGEgPSBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+XG4gICAgICAgICAgZWwuY29sbGVjdGlvbklkID09PSBjb250ZW50LmNoaWxkcmVuWzBdLmlkZW50aWZpZXIpXG4gICAgICAgIGNvbnN0IHJlc3VtZURhdGEgPSBbe1xuICAgICAgICAgIGNvbnRlbnRJZDogZmlyc3RDaGlsZERhdGEuaWRlbnRpZmllcixcbiAgICAgICAgICBiYXRjaElkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuYmF0Y2hJZCxcbiAgICAgICAgICBjb21wbGV0ZWRDb3VudDogMSxcbiAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogMTAwLFxuICAgICAgICAgIHByb2dyZXNzOiAyLFxuICAgICAgICAgIHZpZXdDb3VudDogMSxcbiAgICAgICAgICBjb3Vyc2VJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgIHN0YXR1czogMixcbiAgICAgICAgfV1cbiAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IHJlc3VtZURhdGFcbiAgICAgICAgdGhpcy51cGRhdGVSZXN1bWFEYXRhKGlucHJvZ3Jlc3NEYXRhQ2hlY2spXG4gICAgICB9XG4gICAgICAvLyAvLyB9IGVsc2Uge1xuICAgICAgLy8gICBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gcGFyZW50Q29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgLy8gLy8gfVxuICAgICAgLy8gfSlcbiAgICAgIC8vIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhjb250ZW50LCBjb250ZW50KVxuICAgICAgdGhpcy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoY29udGVudClcbiAgICAgIHRoaXMuY2hlY2tNb2R1bGVXaXNlRGF0YShjb250ZW50KVxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgfVxuICB9XG4gIGNoZWNrQ29tcGxldGVkTGVhZm5vZGVzKGxlYWZOb2RlczogYW55LCBjb21wbGV0ZWRDb3VudDogYW55KSB7XG4gICAgaWYgKGNvbXBsZXRlZENvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbXBsZXRlZENvdW50LmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmICghbGVhZk5vZGVzLmluY2x1ZGVzKGVsZS5jb250ZW50SWQpKSB7XG4gICAgICAgICAgbGVhZk5vZGVzLnB1c2goZWxlLmNvbnRlbnRJZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBhc3luYyBnZXRQcm9ncmVzc0ZvckNoaWxkQ291cnNlKHJlcXVlc3Q6IGFueSwgY29udGVudDogYW55KSB7XG4gIC8vICBjb25zdCBkYXRhOiBhbnkgPSAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcXVlc3QpLnRvUHJvbWlzZSgpLmNhdGNoKF9lcnJvciA9PiB7fSlcbiAgLy8gICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoID4gMCkge1xuICAvLyAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgLy8gfVxuICAvLyB9XG5cbiAgZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVucm9sbWVudExpc3QgJiYgZW5yb2xtZW50TGlzdD8ubGVuZ3RoICYmIGVucm9sbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWw/LmNvbGxlY3Rpb25JZCA9PT0gaWRlbnRpZmllcilcbiAgfVxuXG4gIGFzeW5jIG1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvdXJzZTogYW55KSB7XG4gICAgaWYgKGNvdXJzZSAmJiBjb3Vyc2UuY2hpbGRyZW4pIHtcbiAgICAgIGF3YWl0IGNvdXJzZS5jaGlsZHJlbi5tYXAoYXN5bmMgKGNvdXJzZUNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKChjb3Vyc2VDaGlsZCAmJiBjb3Vyc2VDaGlsZC5jaGlsZHJlbikgfHwgY291cnNlQ2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvdXJzZUNoaWxkKVxuICAgICAgICAgIGNvdXJzZVsnbW9kdWxlQ291bnQnXSA9IGNvdXJzZVsnbW9kdWxlQ291bnQnXSA/IGNvdXJzZVsnbW9kdWxlQ291bnQnXSArIDEgOiAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291cnNlQ2hpbGRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSAxMDBcbiAgICAgICAgICBjb3Vyc2VDaGlsZFsnY29tcGxldGlvblN0YXR1cyddID0gMlxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwsIHBhcmVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgIC8vIGNvbnRlbnQuY2hpbGRyZW4ubWFwKChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpPT4ge1xuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgY29udGVudCA9IHRoaXMuZ2V0Q2FsY3VsYXRpb25zRnJvbUNoaWxkcmVuKGNvbnRlbnQpXG4gICAgICAgIC8vIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgLy8gaWYgKGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgLy8gICB0aGlzLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3MoaXRlbSwgcGFyZW50KVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhpdGVtLCBwYXJlbnQpXG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhpdGVtLCBwYXJlbnQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZUhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGhpZXJhcmNoeURhdGE6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGlmIChoaWVyYXJjaHlEYXRhICYmIGhpZXJhcmNoeURhdGEuY2hpbGRyZW4pIHtcbiAgICAgIGhpZXJhcmNoeURhdGEuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGNoaWxkKVxuICAgICAgICB9XG4gICAgICAgIGxldCBsb2NhbE1hcCA9IHt9XG4gICAgICAgIGxvY2FsTWFwID0ge1xuICAgICAgICAgIHBhcmVudDogY2hpbGQucGFyZW50LFxuICAgICAgICAgIGlkZW50aWZpZXI6IGNoaWxkLmlkZW50aWZpZXIsXG4gICAgICAgICAgbGVhZk5vZGVzQ291bnQ6IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IG51bGwsXG4gICAgICAgICAgbGVhZk5vZGVzOiBjaGlsZC5sZWFmTm9kZXMgfHwgW10sXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNoaWxkLnByb2dyZXNzLFxuICAgICAgICAgIGNvbXBsZXRpb25TdGF0dXM6IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMsXG4gICAgICAgICAgcHJvZ3Jlc3M6IGNoaWxkLnByb2dyZXNzLFxuICAgICAgICAgIHByaW1hcnlDYXRlZ29yeTogY2hpbGQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAgIGR1cmF0aW9uOiBjaGlsZC5kdXJhdGlvbiB8fCAwLFxuICAgICAgICAgIGV4cGVjdGVkRHVyYXRpb246IGNoaWxkLmV4cGVjdGVkRHVyYXRpb24gfHwgMCxcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc2htYXBbY2hpbGQuaWRlbnRpZmllcl0gPSBsb2NhbE1hcFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlUHJlQXNzZXNzbWVudEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGhpZXJhcmNoeURhdGE6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGNvbnNvbGUubG9nKCdoaWVyYXJjaHlEYXRhLS0nLCBoaWVyYXJjaHlEYXRhKVxuICAgIGlmIChoaWVyYXJjaHlEYXRhICYmIGhpZXJhcmNoeURhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzKSB7XG4gICAgICBoaWVyYXJjaHlEYXRhLnByZUVucm9sbWVudFJlc291cmNlcy5mb3JFYWNoKChjaGlsZDogTnNDb250ZW50LklDb250ZW50KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5wcmVFbnJvbG1lbnRSZXNvdXJjZXMpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVByZUFzc2Vzc21lbnRIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChjaGlsZClcbiAgICAgICAgfVxuICAgICAgICBsZXQgbG9jYWxNYXAgPSB7fVxuICAgICAgICBsb2NhbE1hcCA9IHtcbiAgICAgICAgICBwYXJlbnQ6IGNoaWxkLnBhcmVudCxcbiAgICAgICAgICBpZGVudGlmaWVyOiBjaGlsZC5pZGVudGlmaWVyLFxuICAgICAgICAgIGxlYWZOb2Rlc0NvdW50OiBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCBudWxsLFxuICAgICAgICAgIGxlYWZOb2RlczogY2hpbGQubGVhZk5vZGVzIHx8IFtdLFxuICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjaGlsZC5wcm9ncmVzcyxcbiAgICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBjaGlsZC5jb21wbGV0aW9uU3RhdHVzLFxuICAgICAgICAgIHByb2dyZXNzOiBjaGlsZC5wcm9ncmVzcyxcbiAgICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGNoaWxkLnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgICBkdXJhdGlvbjogY2hpbGQuZHVyYXRpb24gfHwgMCxcbiAgICAgICAgICBleHBlY3RlZER1cmF0aW9uOiBjaGlsZC5leHBlY3RlZER1cmF0aW9uIHx8IDAsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNobWFwW2NoaWxkLmlkZW50aWZpZXJdID0gbG9jYWxNYXBcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChoaWVyYXJjaHlEYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsKSB7XG4gICAgaWYgKGhpZXJhcmNoeURhdGEpIHtcbiAgICAgIHRoaXMuaGFzaG1hcFtoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXJdID0ge1xuICAgICAgICBwYXJlbnQ6IGhpZXJhcmNoeURhdGEucGFyZW50LFxuICAgICAgICBpZGVudGlmaWVyOiBoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXIsXG4gICAgICAgIGxlYWZOb2Rlc0NvdW50OiBoaWVyYXJjaHlEYXRhLmxlYWZOb2Rlc0NvdW50IHx8IG51bGwsXG4gICAgICAgIGxlYWZOb2RlczogaGllcmFyY2h5RGF0YS5sZWFmTm9kZXMgfHwgW10sXG4gICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBoaWVyYXJjaHlEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGhpZXJhcmNoeURhdGEucHJvZ3Jlc3MsXG4gICAgICAgIGNvbXBsZXRpb25TdGF0dXM6IGhpZXJhcmNoeURhdGEuY29tcGxldGlvblN0YXR1cyxcbiAgICAgICAgcHJvZ3Jlc3M6IGhpZXJhcmNoeURhdGEucHJvZ3Jlc3MsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIGNvdXJzZUNhdGVnb3J5OiBoaWVyYXJjaHlEYXRhLmNvdXJzZUNhdGVnb3J5IHx8IGhpZXJhcmNoeURhdGEucHJpbWFyeUNhdGVnb3J5IHx8ICcnLFxuICAgICAgICBleHBlY3RlZER1cmF0aW9uOiBoaWVyYXJjaHlEYXRhLmV4cGVjdGVkRHVyYXRpb24gfHwgMCxcbiAgICAgIH1cbiAgICAgIGlmIChoaWVyYXJjaHlEYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNICYmXG4gICAgICAgIGhpZXJhcmNoeURhdGEuY29tcGF0aWJpbGl0eUxldmVsID49IDUgJiYgaGllcmFyY2h5RGF0YS5jb250ZXh0TG9ja2luZ1R5cGUgJiZcbiAgICAgICAgaGllcmFyY2h5RGF0YS5jb250ZXh0TG9ja2luZ1R5cGUgPT09IE5zQ29udGVudC5FQ29udGV4dExvY2tpbmdUeXBlLkNPVVJTRV9BU1NFU1NNRU5UX09OTFkpIHtcbiAgICAgICAgdGhpcy5oYXNobWFwW2hpZXJhcmNoeURhdGEuaWRlbnRpZmllcl0gPSB7XG4gICAgICAgICAgLi4udGhpcy5oYXNobWFwW2hpZXJhcmNoeURhdGEuaWRlbnRpZmllcl0sXG4gICAgICAgICAgY29udGV4dExvY2tpbmdUeXBlOiBoaWVyYXJjaHlEYXRhLmNvbnRleHRMb2NraW5nVHlwZSxcbiAgICAgICAgICBjb21wYXRpYmlsaXR5TGV2ZWw6IGhpZXJhcmNoeURhdGEuY29tcGF0aWJpbGl0eUxldmVsLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNyZWF0ZUhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGhpZXJhcmNoeURhdGEpXG4gICAgICB0aGlzLmhhc2htYXAgPSB7IC4uLnRoaXMuaGFzaG1hcCB9XG4gICAgICBjb25zb2xlLmxvZygndGhpcy5oYXNobWFwLS0nLCB0aGlzLmhhc2htYXApXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FsY3VsYXRpb25zRnJvbUNoaWxkcmVuKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGl0ZW1bJ2R1cmF0aW9uJ10gPSBpdGVtLmNoaWxkcmVuLnJlZHVjZSgoc3VtLCBjaGlsZCkgPT4ge1xuICAgICAgcmV0dXJuIHN1bSArIE51bWJlcihjaGlsZC5kdXJhdGlvbiB8fCAwKVxuICAgIH0sIDApXG4gICAgY29uc3QgY29tcGxldGVkSXRlbXMgPSBfLmZpbHRlcihpdGVtLmNoaWxkcmVuLCByID0+IHIuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCByLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApXG4gICAgY29uc3QgdG90YWxDb3VudCA9IF8udG9JbnRlZ2VyKF8uZ2V0KGl0ZW0sICdsZWFmTm9kZXNDb3VudCcpKSB8fCAxXG4gICAgaXRlbVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IE51bWJlcigoKGNvbXBsZXRlZEl0ZW1zLmxlbmd0aCAvIHRvdGFsQ291bnQpICogMTAwKS50b0ZpeGVkKCkpXG4gICAgaXRlbVsnY29tcGxldGlvblN0YXR1cyddID0gKGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSA/IDIgOiAxXG4gICAgcmV0dXJuIGl0ZW1cbiAgfVxuXG4gIGZldGNoQ29udGVudEhpc3RvcnlWMihyZXE6IE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGFSZXEpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGE+IHtcbiAgICByZXEucmVxdWVzdC5maWVsZHMgPSBbJ3Byb2dyZXNzZGV0YWlscyddXG5cbiAgICBpZiAocmVxLnJlcXVlc3QuY291cnNlSWQpIHtcbiAgICAgIGNvbnN0IHJlc2x1dDogYW55ID0gdGhpcy5odHRwLnBvc3Q8TnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YT4oXG4gICAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfSElTVE9SWVYyfS8ke3JlcS5yZXF1ZXN0LmNvdXJzZUlkfWAsIHJlcVxuICAgICAgKVxuICAgICAgLy8gZGF0YS5zdWJzY3JpYmUoKHN1YnNjcmliZURhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gICAgICAgdGhpcy5wcm9ncmFtQ2hpbGRDb3Vyc2VSZXN1bWVEYXRhLm5leHQoeyByZXN1bWVEYXRhOiBzdWJzY3JpYmVEYXRhLnJlc3VsdC5jb250ZW50TGlzdCwgY291cnNlSWQ6IHJlcS5yZXF1ZXN0LmNvdXJzZUlkIH0pXG4gICAgICAvLyAgICAgfSlcbiAgICAgIHJldHVybiByZXNsdXRcbiAgICB9XG4gICAgcmV0dXJuIG9mKClcblxuICB9XG5cbiAgZG93b25sb2FkQ2VydGlmaWNhdGUoY2VydElkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBhbnkgfT4oXG4gICAgICBBUElfRU5EX1BPSU5UUy5DRVJUX0RPV05MT0FEKGNlcnRJZCksXG4gICAgKVxuICB9XG4gIGdldFNlcnZlckRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudFtdIH0+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuU0VSVkVSX0RBVEUpXG4gIH1cblxuICBnZXRGb3JtQnlJZChmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KEFQSV9FTkRfUE9JTlRTLkdFVF9GT1JNX0JZSUQoZm9ybUlkKSlcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybURhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9GT1JNLCBmb3JtRGF0YSlcbiAgfVxuXG4gIGdldEZvcm1CeUlkUHVibGljKGZvcm1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoQVBJX0VORF9QT0lOVFMuR0VUX0ZPUk1fQllJRF9QVUJMSUMoZm9ybUlkKSlcbiAgfVxuXG4gIHN1Ym1pdEZvcm1QdWJsaWMoZm9ybURhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9GT1JNX1BVQkxJQywgZm9ybURhdGEpXG4gIH1cblxuICBnZXRBcGxsaWNhdGlvbnNCeUlkKGZvcm1JZDogc3RyaW5nLCBjb250ZXh0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihBUElfRU5EX1BPSU5UUy5HRVRfQVBQTElDQVRJT05TX0JZX0lEKGZvcm1JZCwgY29udGV4dElkKSlcbiAgfVxuXG4gIHNoYXJlQ29udGVudChyZXFCb2R5OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihgJHtBUElfRU5EX1BPSU5UUy5TSEFSRV9DT05URU5UfWAsIHJlcUJvZHkpXG4gIH1cbiAgY2hlY2tNb2R1bGVXaXNlRGF0YShjb250ZW50OiBhbnkpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBjb250ZW50LmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChlbGUucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgICBsZXQgbW9kdWxlUmVzb3Vyc2VDb3VudCA9IDBcbiAgICAgICAgICBsZXQgb2ZmbGluZVJlc291cnNlQ291bnQgPSAwXG4gICAgICAgICAgZWxlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkRWxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChjaGlsZEVsZS5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTikge1xuICAgICAgICAgICAgICBtb2R1bGVSZXNvdXJzZUNvdW50ID0gbW9kdWxlUmVzb3Vyc2VDb3VudCArIDFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9mZmxpbmVSZXNvdXJzZUNvdW50ID0gb2ZmbGluZVJlc291cnNlQ291bnQgKyAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBlbGVbJ21vZHVsZVJlc291cnNlQ291bnQnXSA9IG1vZHVsZVJlc291cnNlQ291bnRcbiAgICAgICAgICBlbGVbJ29mZmxpbmVSZXNvdXJzZUNvdW50J10gPSBvZmZsaW5lUmVzb3Vyc2VDb3VudFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlbGUucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tNb2R1bGVXaXNlRGF0YShlbGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBhc3luYyBmZXRjaENvdXJzZUhlaXJhcmNoeShjb250ZW50RGF0YTogYW55KSB7XG4gICAgaWYgKGNvbnRlbnREYXRhICYmIGNvbnRlbnREYXRhLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZSBvZiBjb250ZW50RGF0YS5jaGlsZHJlbikge1xuICAgICAgICBpZiAoZWxlLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndpZGdldFN2Yy5mZXRjaENvbnRlbnQoZWxlLmlkZW50aWZpZXIpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKHN1YkVsZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoc3ViRWxlLnJlc3VsdCAmJiBzdWJFbGUucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgICAgJiYgc3ViRWxlLnJlc3VsdC5jb250ZW50LmNoaWxkcmVuICYmIHN1YkVsZS5yZXN1bHQuY29udGVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZWxlWydjaGlsZHJlbiddID0gc3ViRWxlLnJlc3VsdC5jb250ZW50LmNoaWxkcmVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFRyYW5zY3JpcHRpb25EYXRhKGRhdGE6IGFueSkge1xuICAgIC8vICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICB0aGlzLnRyYW5zcmlwdGlvbkRhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XG4gIH1cblxuICBzZXRBY3RpdmVTdWJ0aXRsZUxhbmd1YWdlKGFjdGl2ZUxhbmc6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdhY3RpdmVMYW5nLS0nLCBhY3RpdmVMYW5nKVxuICAgIHRoaXMudHJhbnNyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VEYXRhT2JqZWN0Lm5leHQoYWN0aXZlTGFuZylcbiAgfVxuXG5cblxuICBhaUdldFJlc291cmNlVnR0RmlsZShyZXNvdXJjZUlEOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGAke0FQSV9FTkRfUE9JTlRTLkFJX1JFU09VUkNFX1ZUVF9GSUxFfT9yZXNvdXJjZV9pZD0ke3Jlc291cmNlSUR9YClcbiAgfVxuXG4gIHJlYWRQcmVFbnJvbGxtZW50UmVzb3VyY2VzU3RhdGUocmVxOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChgJHtBUElfRU5EX1BPSU5UUy5QUkVfRU5ST0xMTUVOVF9TVEFURV9SRUFEfWAsIHJlcSlcbiAgfVxuXG4gIGNyZWF0ZUNvbnRlbnRWMihyZXF1ZXN0Qm9keTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNSRUFURV9SRVNPVVJDRX1gLFxuICAgICAgICByZXF1ZXN0Qm9keSxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhLnJlc3VsdC5pZGVudGlmaWVyXG4gICAgICAgIH0pLFxuICAgICAgKVxuICB9XG5cblxuICB1cGxvYWRBc3NpZ25tZW50QW5zd2VyKGNvbnRlbnRJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIGFzc2lnbm1lbnRJZDogc3RyaW5nLCBmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSlcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7QVBJX0VORF9QT0lOVFMuVVBMT0FEX0FTU0lHTk1FTlR9LyR7Y29udGVudElkfS8ke2JhdGNoSWR9LyR7YXNzaWdubWVudElkfWAsIGZvcm1EYXRhKTtcbiAgfVxuXG5cbiAgcmVhZENvbnRlbnRWMihpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuUkVBRF9SRVNPVVJDRX1yZWFkLyR7aWR9P21vZGU9ZWRpdGAsXG4gICAgKS5waXBlKFxuICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LmNvbnRlbnRcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdXBsb2FkKFxuICAgIGRhdGE6IEZvcm1EYXRhLFxuICAgIGNvbnRlbnREYXRhOiBhbnksXG4gICAgb3B0aW9ucz86IGFueSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGNvbnN0IGZpbGUgPSBkYXRhLmdldCgnY29udGVudCcpIGFzIEZpbGVcbiAgICBsZXQgZmlsZU5hbWUgPSBmaWxlLm5hbWVcbiAgICBpZiAoWydjaGFubmVsLmpzb24nXS5pbmRleE9mKGZpbGVOYW1lKSA8IDApIHtcbiAgICAgIGZpbGVOYW1lID0gdGhpcy5hcHBlbmRUb0ZpbGVuYW1lKGZpbGVOYW1lKVxuICAgIH1cbiAgICBjb25zdCBuZXdGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgbmV3Rm9ybURhdGEuYXBwZW5kKCdkYXRhJywgZmlsZSwgZmlsZU5hbWUpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5VUExPQURfRklMRX11cGxvYWQvJHtjb250ZW50RGF0YS5jb250ZW50SWR9YCxcbiAgICAgIG5ld0Zvcm1EYXRhLFxuICAgICAgb3B0aW9uc1xuICAgIClcbiAgfVxuXG4gIGFwcGVuZFRvRmlsZW5hbWUoZmlsZW5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRpbWVTdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgY29uc3QgZG90SW5kZXggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpXG4gICAgaWYgKGRvdEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZpbGVuYW1lICsgdGltZVN0YW1wXG4gICAgfVxuICAgIHJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpICsgdGltZVN0YW1wICsgZmlsZW5hbWUuc3Vic3RyaW5nKGRvdEluZGV4KVxuICB9XG5cbiAgdXBkYXRlQ29udGVudFdpdGhGZXdGaWVsZHMocmVxdWVzdEJvZHk6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoPGFueT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5VUERBVEVfUkVTT1VSQ0V9LyR7aWRlbnRpZmllcn1gLFxuICAgICAgcmVxdWVzdEJvZHksXG4gICAgKVxuICB9XG5cbiAgc2VhcmNoQXNzaWdubWVudHMocmVxdWVzdDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoQVBJX0VORF9QT0lOVFMuU0VBUkNILCByZXF1ZXN0KVxuICB9XG5cbiAgc3VibWl0RHJhZnRBc3NpZ25tZW50KHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoQVBJX0VORF9QT0lOVFMuU1VCTUlUX0RSQUZUX0FTU0lHTk1FTlQsIHJlcXVlc3QpXG4gIH1cblxuICBzdWJtaXRBc3NpZ25tZW50KHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9BU1NJR05NRU5ULCByZXF1ZXN0KVxuICB9XG5cbiAgbm90aWZ5QXNzaWdubWVudFN1Ym1pc3Npb24ocGF5bG9hZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoQVBJX0VORF9QT0lOVFMuTk9USUZZX0FTU0lHTk1FTlRfU1VCTUlTU0lPTiwgcGF5bG9hZClcbiAgfVxuXG4gIGdldEFzc2lnbm1lbnRTdGF0dXMocmVxdWVzdDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7QVBJX0VORF9QT0lOVFMuQVNTSUdOTUVOVF9TVEFUVVN9YCwgcmVxdWVzdClcbiAgfVxuXG4gIHJlYWRBc3NpZ25tZW50RmlsZShjb250ZW50SWQ6IHN0cmluZywgYmF0Y2hJZDogc3RyaW5nLCBhc3NpZ25tZW50SWQ6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgLy8gUHJvcGVybHkgZW5jb2RlIHRoZSBwYXJhbWV0ZXJzIHRvIGF2b2lkIG1hbGZvcm1lZCByZXF1ZXN0IGVycm9yc1xuICAgIGNvbnN0IGVuY29kZWRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIGNvbnRlbnRJZDogY29udGVudElkIHx8ICcnLFxuICAgICAgYmF0Y2hJZDogYmF0Y2hJZCB8fCAnJyxcbiAgICAgIGZvcm1JZDogYXNzaWdubWVudElkIHx8ICcnLFxuICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lIHx8ICcnXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHtBUElfRU5EX1BPSU5UUy5SRUFEX0FTU0lHTk1FTlR9PyR7ZW5jb2RlZFBhcmFtcy50b1N0cmluZygpfWAsIHtcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSwgYXBwbGljYXRpb24vcGRmLCBhcHBsaWNhdGlvbi9tc3dvcmQsIGFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50J1xuICAgICAgfVxuICAgIH0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG59XG4iXX0=
1300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQWMsS0FBSyxFQUFnQixlQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVoRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFM0UsT0FBTyxFQUFFLFFBQVEsRUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRTdELDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7Ozs7O0FBRWhELHVDQUF1QztBQUN2QyxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFBO0FBQzlDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFBO0FBRXhDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFlBQVksRUFBRSxHQUFHLGFBQWEsaUNBQWlDO0lBQy9ELGVBQWUsRUFBRSxHQUFHLGlCQUFpQixrQkFBa0I7SUFDdkQsWUFBWSxFQUFFLEdBQUcsaUJBQWlCLGVBQWU7SUFDakQsaUJBQWlCLEVBQUUsdUNBQXVDO0lBQzFELGNBQWMsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLFlBQVksU0FBUyxTQUFTO0lBQ3pGLG1CQUFtQixFQUFFLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDdkUsaURBQWlELFNBQVMs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J0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBEYXRhIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgRU1QVFksIFN1YnNjcmlwdGlvbiwgQmVoYXZpb3JTdWJqZWN0LCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBOc0NvbnRlbnRDb25zdGFudHMgfSBmcm9tICcuLi9fY29uc3RhbnRzL3dpZGdldC1jb250ZW50LmNvbnN0YW50cydcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyBOc0FwcFRvYywgTnNDb2hvcnRzIH0gZnJvbSAnLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXG5pbXBvcnQgeyBURmV0Y2hTdGF0dXMsIENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuLy8gVE9ETzogbW92ZSB0aGlzIGluIHNvbWUgY29tbW9uIHBsYWNlXG5jb25zdCBQUk9URUNURURfU0xBR19WOCA9ICcvYXBpcy9wcm90ZWN0ZWQvdjgnXG5jb25zdCBQUk9YWV9TTEFHX1Y4ID0gJy9hcGlzL3Byb3hpZXMvdjgnXG5cbmNvbnN0IEFQSV9FTkRfUE9JTlRTID0ge1xuICBCQVRDSF9DUkVBVEU6IGAke1BST1hZX1NMQUdfVjh9L2xlYXJuZXIvY291cnNlL3YxL2JhdGNoL2NyZWF0ZWAsXG4gIENPTlRFTlRfUEFSRU5UUzogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvcGFyZW50c2AsXG4gIENPTlRFTlRfTkVYVDogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvbmV4dGAsXG4gIENPTlRFTlRfSElTVE9SWVYyOiBgL2FwaXMvcHJveGllcy92OC9yZWFkL2NvbnRlbnQtcHJvZ3Jlc2AsXG4gIENPTlRFTlRfUEFSRU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50LyR7Y29udGVudElkfS9wYXJlbnRgLFxuICBDT05URU5UX0FVVEhfUEFSRU5UOiAoY29udGVudElkOiBzdHJpbmcsIHJvb3RPcmc6IHN0cmluZywgb3JnOiBzdHJpbmcpID0+XG4gICAgYC9hcGlzL2F1dGhBcGkvYWN0aW9uL2NvbnRlbnQvcGFyZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3Jvb3RPcmd9Jm9yZz0ke29yZ31gLFxuICBDT0hPUlRTOiAoY29ob3J0VHlwZTogTnNDb2hvcnRzLkVDb2hvcnRUeXBlcywgY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvJHtjb2hvcnRUeXBlfS8ke2NvbnRlbnRJZH1gLFxuICBFWFRFUk5BTF9DT05URU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvZXh0ZXJuYWwtYWNjZXNzLyR7Y29udGVudElkfWAsXG4gIENPSE9SVFNfR1JPVVBfVVNFUjogKGdyb3VwSWQ6IG51bWJlcikgPT4gYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvJHtncm91cElkfWAsXG4gIFJFTEFURURfUkVTT1VSQ0U6IChjb250ZW50SWQ6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZykgPT5cbiAgICBgJHtQUk9URUNURURfU0xBR19WOH0va2h1Yi9mZXRjaFJlbGF0ZWRSZXNvdXJjZXMvJHtjb250ZW50SWR9LyR7Y29udGVudFR5cGV9YCxcbiAgUE9TVF9BU1NFU1NNRU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L3VzZXIvZXZhbHVhdGUvcG9zdC1hc3Nlc3NtZW50LyR7Y29udGVudElkfWAsXG4gIEdFVF9DT05URU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPWFlfU0xBR19WOH0vYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gLFxuICBDRVJUX0RPV05MT0FEOiAoY2VydElkOiBhbnkpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzL2NvdXJzZS9iYXRjaC9jZXJ0L2Rvd25sb2FkLyR7Y2VydElkfWAsXG4gIFNFUlZFUl9EQVRFOiAnYXBpcy9wdWJsaWMvdjgvc3lzdGVtRGF0ZScsXG4gIFNIQVJFX0NPTlRFTlQ6ICcvYXBpcy9wcm94aWVzL3Y4L3VzZXIvdjEvY29udGVudC9yZWNvbW1lbmQnLFxuICBHRVRfRk9STV9CWUlEOiAoZm9ybUlkOiBzdHJpbmcpID0+IGBhcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvZ2V0Rm9ybUJ5SWQ/Zm9ybUlkPSR7Zm9ybUlkfWAsXG4gIC8vIFNVQk1JVF9GT1JNOiBgL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdGAsXG4gIFNVQk1JVF9GT1JNOiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcbiAgR0VUX0ZPUk1fQllJRF9QVUJMSUM6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHVibGljL3Y4L3B1YmxpYy9mb3Jtcy92Mi9nZXRGb3JtQnlJZD9mb3JtSWQ9JHtmb3JtSWR9YCxcbiAgU1VCTUlUX0ZPUk1fUFVCTElDOiBgYXBpcy9wdWJsaWMvdjgvcHVibGljL2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcbiAgLy8gZ2V0IGFuc3dlcnMgZm9yIGZvcm1cbiAgR0VUX0FQUExJQ0FUSU9OU19CWV9JRDogKGZvcm1JZDogc3RyaW5nLCBjb250ZXh0SWQ6IHN0cmluZykgPT4gYC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvZ2V0QXBwbGljYXRpb25zQnlJZD9mb3JtSWQ9JHtmb3JtSWR9JmNvbnRleHRJZD0ke2NvbnRleHRJZH1gLFxuICBBSV9SRVNPVVJDRV9WVFRfRklMRTogYCR7UFJPWFlfU0xBR19WOH0vY2hhdGJvdC92My90cmFuc2NvZGVyL3N0YXRzYCxcbiAgLy8gR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL2dldEZvcm1CeUlkP2lkPSR7Zm9ybUlkfWAsXG4gIFBSRV9FTlJPTExNRU5UX1NUQVRFX1JFQUQ6IGAvYXBpcy9wcm94aWVzL3Y4L2NvbnRlbnQvdjIvc3RhdGUvcmVhZGAsXG4gIENSRUFURV9SRVNPVVJDRTogYGFwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9jcmVhdGVgLFxuICBSRUFEX1JFU09VUkNFOiBgYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL2AsXG4gIFVQTE9BRF9GSUxFOiBgYXBpcy9wcm94aWVzL3Y4L3VwbG9hZC9hY3Rpb24vY29udGVudC92My9gLFxuICBVUERBVEVfUkVTT1VSQ0U6IGBhcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvdXBkYXRlYCxcbiAgU0VBUkNIOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc2VhcmNoYCxcbiAgU1VCTUlUX0RSQUZUX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvYXNzaWdubWVudC92MS9zdWJtaXREcmFmdGAsXG4gIFNVQk1JVF9BU1NJR05NRU5UOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc3VibWl0YCxcbiAgQVNTSUdOTUVOVF9TVEFUVVM6IGBhcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvc3VibWlzc2lvbnMvc2VhcmNoYCxcbiAgVVBMT0FEX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvc3RvcmFnZS92MS9icC9hc3NpZ25tZW50L2Fuc3dlcmAsXG4gIFJFQURfQVNTSUdOTUVOVDogYGFwaXMvcHJveGllcy92OC9zdG9yYWdlL3YxL2JwL2Fzc2lnbm1lbnQvYW5zd2VyL3JlYWQvZmlsZWAsXG4gIE5PVElGWV9BU1NJR05NRU5UX1NVQk1JU1NJT046IGBhcGlzL3Byb3hpZXMvdjgvdjEvbm90aWZ5QXNzaWdubWVudC9zdWJtaXRgLFxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NTZXJ2aWNlIHtcbiAgYW5hbHl0aWNzUmVwbGF5U3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBhbmFseXRpY3NGZXRjaFN0YXR1czogVEZldGNoU3RhdHVzID0gJ25vbmUnXG4gIGJhdGNoUmVwbGF5U3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBzZXRCYXRjaERhdGFTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpXG4gIGdldFNlbGVjdGVkQmF0Y2g6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgc2V0V0ZEYXRhU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICByZXN1bWVEYXRhOiBTdWJqZWN0PE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGEgfCBudWxsPiA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICBwcml2YXRlIHNob3dTdWJ0aXRsZU9uQmFubmVycyA9IGZhbHNlXG4gIHByaXZhdGUgY2FuU2hvd0Rlc2NyaXB0aW9uID0gZmFsc2VcbiAgcmVzdW1lRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcHJpbWFyeUNhdGVnb3J5ID0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnlcbiAgcHJpdmF0ZSB1cGRhdGVSZXZpZXdzID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSlcbiAgdXBkYXRlUmV2aWV3c09ic2VydmFibGUgPSB0aGlzLnVwZGF0ZVJldmlld3MuYXNPYnNlcnZhYmxlKClcbiAgcHVibGljIHNlcnZlckRhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKVxuICBjdXJyZW50U2VydmVyRGF0ZSA9IHRoaXMuc2VydmVyRGF0ZS5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgY29udGVudExvYWRlciA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpXG4gIGNvbnRlbnRMb2FkZXIkID0gdGhpcy5jb250ZW50TG9hZGVyLmFzT2JzZXJ2YWJsZSgpXG4gIHB1YmxpYyBnZXRQYWdlU2Nyb2xsID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKVxuICB1cGRhdGVQYWdlU2Nyb2xsID0gdGhpcy5nZXRQYWdlU2Nyb2xsLmFzT2JzZXJ2YWJsZSgpXG4gIHB1YmxpYyBoYXNobWFwOiBhbnkgPSB7fVxuICBwcml2YXRlIHRyYW5zcmlwdGlvbkRhdGFTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpOyAvLyBTdGFydCB3aXRoIG51bGxcbiAgdHJhbnNjcmlwdGlvbkRhdGEkID0gdGhpcy50cmFuc3JpcHRpb25EYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHVibGljIHRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdCQgPSB0aGlzLnRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHVibGljIHRyYW5zcmlwdGlvbklkZW50aWZpZXIgPSBuZXcgU3ViamVjdCgpOyAvLyBTdGFydCB3aXRoIG51bGxcbiAgY2hhbmdlVHJhbnNjcmlwdGlvbkxhbmd1YWdlRXZlbnQgPSBuZXcgU3ViamVjdCgpXG4gIHBsYXlUcmFuc2NyaXB0aW9uVmlkZW8gPSBuZXcgU3ViamVjdCgpXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSwgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSwgcHJpdmF0ZSB3aWRnZXRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlKSB7XG4gICAgLy8gdGhpcyByZXN1bWUgZGF0YSBzdWJzY3JpcHRpb24gaXMgZm9yIG9uIGxvYWRcbiAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnJlc3VtZURhdGEuc3Vic2NyaWJlKFxuICAgICAgKF9kYXRhUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIH0pXG4gIH1cblxuICBnZXQgc3VidGl0bGVPbkJhbm5lcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1N1YnRpdGxlT25CYW5uZXJzXG4gIH1cbiAgc2V0IHN1YnRpdGxlT25CYW5uZXJzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd1N1YnRpdGxlT25CYW5uZXJzID0gdmFsXG4gIH1cbiAgZ2V0IHNob3dEZXNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYW5TaG93RGVzY3JpcHRpb25cbiAgfVxuICBzZXQgc2hvd0Rlc2NyaXB0aW9uKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuY2FuU2hvd0Rlc2NyaXB0aW9uID0gdmFsXG4gIH1cblxuICB1cGRhdGVCYXRjaERhdGEoKSB7XG4gICAgdGhpcy5iYXRjaFJlcGxheVN1YmplY3QubmV4dCgpXG4gIH1cblxuICBzZXRCYXRjaERhdGEoZGF0YTogTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSkge1xuICAgIHRoaXMuc2V0QmF0Y2hEYXRhU3ViamVjdC5uZXh0KGRhdGEpXG4gIH1cblxuICBzZXRXRkRhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy5zZXRXRkRhdGFTdWJqZWN0Lm5leHQoZGF0YSlcbiAgfVxuXG4gIHVwZGF0ZVJlc3VtYURhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy5yZXN1bWVEYXRhLm5leHQoZGF0YSlcbiAgfVxuXG4gIGNoYW5nZVVwZGF0ZVJldmlld3Moc3RhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVJldmlld3MubmV4dChzdGF0ZSlcbiAgfVxuICBnZXRTZWxlY3RlZEJhdGNoRGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmdldFNlbGVjdGVkQmF0Y2gubmV4dChkYXRhKVxuICB9XG5cbiAgY2hhbmdlU2VydmVyRGF0ZShzdGF0ZTogYW55KSB7XG4gICAgdGhpcy5zZXJ2ZXJEYXRlLm5leHQoc3RhdGUpXG4gIH1cblxuICBtYXBTZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhOiBhbnksIHJlc3VtZURhdGFQYXNzPzogYW55KSB7XG4gICAgaWYgKHJlc3VtZURhdGFQYXNzICYmIHJlc3VtZURhdGFQYXNzLmxlbmd0aCkge1xuICAgICAgaWYgKHJlc3VtZURhdGFQYXNzICYmIHJlc3VtZURhdGFQYXNzLmxlbmd0aCAmJiBiYXRjaERhdGEuY29udGVudCAmJiBiYXRjaERhdGEuY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhLCByZXN1bWVEYXRhUGFzcylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5yZXN1bWVEYXRhLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGFSZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhUmVzdWx0ICYmIGRhdGFSZXN1bHQubGVuZ3RoICYmIGJhdGNoRGF0YS5jb250ZW50ICYmIGJhdGNoRGF0YS5jb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhLCBkYXRhUmVzdWx0KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBvbiByZXN1bWVEYXRhU3Vic2NyaXB0aW9uJylcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgfVxuICBzZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhOiBhbnksIHJlc3VtZURhdGFQYXNzOiBhbnkpIHtcbiAgICBpZiAocmVzdW1lRGF0YVBhc3MgJiYgcmVzdW1lRGF0YVBhc3MubGVuZ3RoKSB7XG4gICAgICBpZiAoYmF0Y2hEYXRhICYmIGJhdGNoRGF0YS5jb250ZW50WzBdICYmXG4gICAgICAgIGJhdGNoRGF0YS5jb250ZW50WzBdLmJhdGNoQXR0cmlidXRlcyAmJlxuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjJcbiAgICAgICkge1xuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIubWFwKChzZDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRDb250ZW50ID0gcmVzdW1lRGF0YVBhc3MuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBzZC5zZXNzaW9uSWQpXG4gICAgICAgICAgaWYgKGZvdW5kQ29udGVudCkge1xuICAgICAgICAgICAgc2QuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICAgIHNkLmNvbXBsZXRpb25TdGF0dXMgPSBmb3VuZENvbnRlbnQuc3RhdHVzXG4gICAgICAgICAgICBzZC5sYXN0Q29tcGxldGVkVGltZSA9IGZvdW5kQ29udGVudC5sYXN0Q29tcGxldGVkVGltZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2hvd1N0YXJ0QnV0dG9uKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpOiB7IHNob3c6IGJvb2xlYW47IG1zZzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHtcbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgbXNnOiAnJyxcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5hcnRpZmFjdFVybCAmJiBjb250ZW50LmFydGlmYWN0VXJsLm1hdGNoKC95b3V0dSguKT9iZS9naSkgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUuY291bnRyeSA9PT0gJ0NoaW5hJ1xuICAgICAgKSB7XG4gICAgICAgIHN0YXR1cy5zaG93ID0gZmFsc2VcbiAgICAgICAgc3RhdHVzLm1zZyA9ICd5b3V0dWJlRm9yYmlkZGVuJ1xuICAgICAgICByZXR1cm4gc3RhdHVzXG4gICAgICB9XG4gICAgICBpZiAoY29udGVudC5yZXNvdXJjZVR5cGUgIT09ICdDZXJ0aWZpY2F0aW9uJykge1xuICAgICAgICBzdGF0dXMuc2hvdyA9IHRydWVcbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpbml0RGF0YShkYXRhOiBEYXRhLCBuZWVkUmVzdW1lRGF0YTogYm9vbGVhbiA9IGZhbHNlKTogTnNBcHBUb2MuSVdzVG9jUmVzcG9uc2Uge1xuICAgIGxldCBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICAgIGxldCBlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSB8IG51bGwgPSBudWxsXG4gICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBpZiAoZGF0YS5jb250ZW50ICYmIGRhdGEuY29udGVudC5kYXRhICYmIGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnRlbnQgPSBkYXRhLmNvbnRlbnQuZGF0YVxuICAgICAgaWYgKG5lZWRSZXN1bWVEYXRhKSB7XG4gICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzdW1lRGF0YS5zdWJzY3JpYmUoXG4gICAgICAgICAgKGRhdGFSZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGFSZXN1bHQgJiYgZGF0YVJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhUmVzdWx0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igb24gcmVzdW1lRGF0YVN1YnNjcmlwdGlvbicpXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLkFQSV9GQUlMVVJFXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckNvZGUgPSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuTk9fREFUQVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudCxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9XG4gIH1cblxuICBtYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsLCBkYXRhUmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBjb250ZW50LmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IGRhdGFSZXN1bHQuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBjaGlsZC5pZGVudGlmaWVyKVxuICAgICAgICBpZiAoZm91bmRDb250ZW50KSB7XG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgZm91bmRDb250ZW50LnByb2dyZXNzXG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9IGZvdW5kQ29udGVudC5zdGF0dXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNoaWxkLCBkYXRhUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIG1hcE1vZHVsZUNvdW50KGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgMSA6IDFcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KGNoaWxkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldE1pbWVUeXBlKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCwgaWRlbnRpZmllcjogc3RyaW5nKTogTnNDb250ZW50LkVNaW1lVHlwZXMge1xuICAgIGlmIChjb250ZW50LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgfVxuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBpZiAoY29udGVudC5jaGlsZHJlblswXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIGNvbnRlbnQubWltZVR5cGVcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBiaWcgYmx1bmRlciBpbiBkYXRhXG4gICAgICAgIC8vIHRoaXMubG9nZ2VyLmxvZyhjb250ZW50LmlkZW50aWZpZXIsICdXcm9uZyBtaW1ldHlwZXMgZm9yIHJlc3VtZScpXG4gICAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgICB9XG4gICAgICBjb25zdCBmbGF0TGlzdDogYW55W10gPSBbXVxuICAgICAgY29uc3QgZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbjogYW55ID0gKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBmbGF0TGlzdC5wdXNoKGl0ZW0pXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0uY2hpbGRyZW4ubWFwKChpOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4oaSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKGNvbnRlbnQpXG4gICAgICBjb25zdCBjaGxkID0gXy5maXJzdChfLmZpbHRlcihmbGF0TGlzdCwgeyBpZGVudGlmaWVyIH0pKVxuICAgICAgcmV0dXJuIChjaGxkICYmIGNobGQubWltZVR5cGUpIHx8ICcnXG4gICAgfVxuICAgIC8vIHJldHVybiBjaGxkLm1pbWVUeXBlXG4gICAgcmV0dXJuIE5zQ29udGVudC5FTWltZVR5cGVzLlVOS05PV05cbiAgfVxuXG4gIGdldFRvY1N0cnVjdHVyZShcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgdG9jU3RydWN0dXJlOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlLFxuICApOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlIHtcbiAgICBpZiAoXG4gICAgICBjb250ZW50ICYmXG4gICAgICAhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICAvLyB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUKVxuICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlRcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTlxuICAgICAgKSkge1xuICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmNvdXJzZSArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlICs9IDFcbiAgICAgIH1cbiAgICAgIF8uZWFjaChjb250ZW50LmNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICB0b2NTdHJ1Y3R1cmUgPSB0aGlzLmdldFRvY1N0cnVjdHVyZShjaGlsZCwgdG9jU3RydWN0dXJlKVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29udGVudCAmJlxuICAgICAgKFxuICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgLy8gfHwgY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0tub3dsZWRnZSBBcnRpZmFjdCdcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKGNvbnRlbnQubWltZVR5cGUpIHtcbiAgICAgICAgLy8gY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5IQU5EU19PTjpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUuaGFuZHNPbiArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDM6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnBvZGNhc3QgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0OlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTg6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUudmlkZW8gKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSU5URVJBQ1RJT046XG4gICAgICAgIC8vICAgdG9jU3RydWN0dXJlLmludGVyYWN0aXZlVmlkZW8gKz0gMVxuICAgICAgICAvLyAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUERGOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5wZGYgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSFRNTDpcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5URVhUX1dFQjpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUud2ViUGFnZSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVk6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnN1cnZleSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5RVUlaOlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkFQUExJQ0FUSU9OX0pTT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUuYXNzZXNzbWVudCArPSAxXG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAvLyAgIHRvY1N0cnVjdHVyZS5xdWl6ICs9IDFcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5PRkZMSU5FX1NFU1NJT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub2ZmbGluZVNlc3Npb24gKz0gMVxuICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUucXVpeiArPSAxXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUFJBQ1RJQ0VfUkVTT1VSQ0U6XG4gICAgICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLnByYWN0aWNlVGVzdCArPSAxXG4gICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLmZpbmFsVGVzdCArPSAxXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuV0VCX01PRFVMRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUud2ViTW9kdWxlICs9IDFcbiAgICAgICAgLy8gICBicmVha1xuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlpJUDI6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWklQOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5pbnRlcmFjdGl2ZWNvbnRlbnQgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUueW91dHViZSArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub3RoZXIgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICByZXR1cm4gdG9jU3RydWN0dXJlXG4gICAgfVxuICAgIHJldHVybiB0b2NTdHJ1Y3R1cmVcbiAgfVxuXG4gIGZpbHRlclRvYyhcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgZmlsdGVyQ2F0ZWdvcnk6IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkgPSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTCxcbiAgKTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCB7XG4gICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgLy8gIHx8IGNvbnRlbnQuY29udGVudFR5cGUgPT09ICdLbm93bGVkZ2UgQXJ0aWZhY3QnXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJVbml0Q29udGVudChjb250ZW50LCBmaWx0ZXJDYXRlZ29yeSkgPyBjb250ZW50IDogbnVsbFxuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZENoaWxkcmVuOiBOc0NvbnRlbnQuSUNvbnRlbnRbXSA9XG4gICAgICBfLm1hcChfLmdldChjb250ZW50LCAnY2hpbGRyZW4nKSwgY2hpbGRDb250ZW50ID0+XG4gICAgICAgIHRoaXMuZmlsdGVyVG9jKGNoaWxkQ29udGVudCwgZmlsdGVyQ2F0ZWdvcnkpKVxuICAgICAgICAuZmlsdGVyKHVuaXRDb250ZW50ID0+IEJvb2xlYW4odW5pdENvbnRlbnQpKSBhcyBOc0NvbnRlbnQuSUNvbnRlbnRbXVxuICAgIGlmIChmaWx0ZXJlZENoaWxkcmVuICYmIGZpbHRlcmVkQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb250ZW50LFxuICAgICAgICBjaGlsZHJlbjogZmlsdGVyZWRDaGlsZHJlbixcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZpbHRlclVuaXRDb250ZW50KFxuICAgIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCxcbiAgICBmaWx0ZXJDYXRlZ29yeTogTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeSA9IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQUxMLFxuICApOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGZpbHRlckNhdGVnb3J5KSB7XG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuTEVBUk46XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIU5zQ29udGVudENvbnN0YW50cy5WQUxJRF9QUkFDVElDRV9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKSAmJlxuICAgICAgICAgICFOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgICApXG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0U6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfUFJBQ1RJQ0VfUkVTT1VSQ0VTLmhhcyhjb250ZW50LnJlc291cmNlVHlwZSlcbiAgICAgIGNhc2UgTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeS5BU1NFU1M6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgY2FzZSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIGZldGNoQ29udGVudEFuYWx5dGljc0NsaWVudERhdGEoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyAhPT0gJ2ZldGNoaW5nJyAmJiB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgIHRoaXMuZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZmV0Y2hpbmcnXG4gICAgY29uc3QgdXJsID0gYCR7UFJPWFlfU0xBR19WOH0vTEEvYXBpL2xhL2NvbnRlbnRhbmFseXRpY3M/Y29udGVudF9pZD0ke2NvbnRlbnRJZH0mdHlwZT1jb3Vyc2VgXG4gICAgdGhpcy5odHRwLmdldCh1cmwpLnN1YnNjcmliZShcbiAgICAgIChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KHJlc3VsdClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KG51bGwpXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hDb250ZW50QW5hbHl0aWNzRGF0YShjb250ZW50SWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZmV0Y2hpbmcnICYmIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgIT09ICdkb25lJykge1xuICAgICAgdGhpcy5nZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZClcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgIGNvbnN0IHVybCA9IGAke1BST1hZX1NMQUdfVjh9L0xBL0xBL2FwaS9Vc2Vycz9yZWZpbmVtZW50ZmlsdGVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgJ1wic291cmNlXCI6W1wiaUdvdFwiLFwiTGVhcm5pbmcgSHViXCJdJyxcbiAgICApfSQke2VuY29kZVVSSUNvbXBvbmVudChgXCJjb3Vyc2VDb2RlXCI6IFtcIiR7Y29udGVudElkfVwiXWApfWBcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQocmVzdWx0KVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQobnVsbClcbiAgICAgICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgfSxcbiAgICApXG4gIH1cblxuICBjbGVhckFuYWx5dGljc0RhdGEoKSB7XG4gICAgaWYgKHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdCkge1xuICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0LnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICBmZXRjaENvbnRlbnRQYXJlbnRzKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICAvLyByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgIC8vICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9QQVJFTlRTfS8ke2NvbnRlbnRJZH1gLFxuICAgIC8vIClcbiAgICBpZiAoY29udGVudElkKSB7IH1cbiAgICByZXR1cm4gRU1QVFlcbiAgfVxuICBmZXRjaENvbnRlbnRXaGF0c05leHQoXG4gICAgY29udGVudElkOiBzdHJpbmcsXG4gICAgY29udGVudFR5cGU/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFR9LyR7Y29udGVudElkfT9jb250ZW50VHlwZT0ke2NvbnRlbnRUeXBlfWAsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFR9LyR7Y29udGVudElkfT90cz0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hNb3JlTGlrZVRoaXNQYWlkKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ORVhUXG4gICAgICB9LyR7Y29udGVudElkfT9leGNsdXNpdmVDb250ZW50PXRydWUmdHM9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLFxuICAgIClcbiAgfVxuXG4gIGZldGNoTW9yZUxpa2VUaGlzRnJlZShjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfTkVYVFxuICAgICAgfS8ke2NvbnRlbnRJZH0/ZXhjbHVzaXZlQ29udGVudD1mYWxzZSZ0cz0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hDb250ZW50Q29ob3J0cyhcbiAgICBjb2hvcnRUeXBlOiBOc0NvaG9ydHMuRUNvaG9ydFR5cGVzLFxuICAgIGNvbnRlbnRJZDogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPE5zQ29ob3J0cy5JQ29ob3J0c0NvbnRlbnRbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29ob3J0cy5JQ29ob3J0c0NvbnRlbnRbXT4oQVBJX0VORF9QT0lOVFMuQ09IT1JUUyhjb2hvcnRUeXBlLCBjb250ZW50SWQpLCB7XG4gICAgICBoZWFkZXJzOiB7IHJvb3RPcmc6IHRoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJycsIG9yZzogdGhpcy5jb25maWdTdmMub3JnID8gdGhpcy5jb25maWdTdmMub3JnWzBdIDogJycgfSxcbiAgICB9KVxuICB9XG4gIGZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx7IGhhc0FjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyBoYXNBY2Nlc3M6IGJvb2xlYW4gfT4oQVBJX0VORF9QT0lOVFMuRVhURVJOQUxfQ09OVEVOVChjb250ZW50SWQpKVxuICB9XG4gIGZldGNoQ29ob3J0R3JvdXBVc2Vycyhncm91cElkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvaG9ydHMuSUNvaG9ydHNHcm91cFVzZXJzW10+KEFQSV9FTkRfUE9JTlRTLkNPSE9SVFNfR1JPVVBfVVNFUihncm91cElkKSlcbiAgfVxuICBmZXRjaE1vcmVMaWtlVGhpcyhjb250ZW50SWQ6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50W10+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuUkVMQVRFRF9SRVNPVVJDRShjb250ZW50SWQsIGNvbnRlbnRUeXBlKSxcbiAgICApXG4gIH1cblxuICBmZXRjaFBvc3RBc3Nlc3NtZW50U3RhdHVzKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudFtdIH0+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuUE9TVF9BU1NFU1NNRU5UKGNvbnRlbnRJZCksXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hHZXRDb250ZW50RGF0YShjb250ZW50SWQ6IHN0cmluZykge1xuICAgIGxldCB1cmwgPSAnJ1xuICAgIGNvbnN0IGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG4gICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KFxuICAgICAgICBBUElfRU5EX1BPSU5UUy5HRVRfQ09OVEVOVChjb250ZW50SWQpLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ2VkaXRNb2RlPXRydWUnKSAmJiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnX3JjJykpIHtcbiAgICAgIHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YFxuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSBgL2FwaS9jb250ZW50L3YxL3JlYWQvJHtjb250ZW50SWR9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KHVybClcblxuICB9XG5cbiAgZmV0Y2hDb250ZW50UGFyZW50KGNvbnRlbnRJZDogc3RyaW5nLCBkYXRhOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlcSwgZm9yUHJldmlldyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVzcG9uc2U+KFxuICAgICAgZm9yUHJldmlld1xuICAgICAgICA/IEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfQVVUSF9QQVJFTlQoXG4gICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgIHRoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJycsXG4gICAgICAgICAgdGhpcy5jb25maWdTdmMub3JnID8gdGhpcy5jb25maWdTdmMub3JnWzBdIDogJycsXG4gICAgICAgIClcbiAgICAgICAgOiBBUElfRU5EX1BPSU5UUy5DT05URU5UX1BBUkVOVChjb250ZW50SWQpLFxuICAgICAgZGF0YSxcbiAgICApXG4gIH1cblxuICBjcmVhdGVCYXRjaChiYXRjaERhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChcbiAgICAgIEFQSV9FTkRfUE9JTlRTLkJBVENIX0NSRUFURSxcbiAgICAgIHsgcmVxdWVzdDogYmF0Y2hEYXRhIH0sXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgbWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwsIGVucm9sbWVudExpc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBsZXQgdG90YWxDb3VudCA9IDBcbiAgICBsZXQgbGVhZm5vZGVDb3VudCA9IDBcbiAgICBsZXQgY29tcGxldGVkTGVhZk5vZGVzOiBhbnkgPSBbXVxuICAgIGxldCBmaXJzdFVuY29tcGxldGVDb3Vyc2U6IGFueSA9ICcnXG4gICAgbGV0IGlucHJvZ3Jlc3NEYXRhQ2hlY2s6IGFueSA9IFtdXG4gICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgbGVhZm5vZGVDb3VudCA9IGNvbnRlbnQubGVhZk5vZGVzQ291bnRcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICBjb25zdCBmb3VuZFBhcmVudENvbnRlbnQgPSB0aGlzLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0LCBjb2xsZWN0aW9uSWQgfHwgY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgaWYgKGZvdW5kUGFyZW50Q29udGVudCAmJiBmb3VuZFBhcmVudENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICBhd2FpdCB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvbnRlbnQpXG4gICAgICAgIHRvdGFsQ291bnQgPSBjb250ZW50LmxlYWZOb2Rlc0NvdW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIC8vIGNvbnRlbnQuY2hpbGRyZW4uZm9yRWFjaChhc3luYyAocGFyZW50Q2hpbGQsaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENoaWxkID0gY29udGVudC5jaGlsZHJlbltpXVxuICAgICAgICAgICAgaWYgKHBhcmVudENoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IHRoaXMuZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3QsIHBhcmVudENoaWxkPy5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAvLyB0b3RhbENvdW50ID0gZm91bmRDb250ZW50ICYmIGZvdW5kQ29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA/IHRvdGFsQ291bnQgKyBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgOiB0b3RhbENvdW50ICsgMFxuICAgICAgICAgICAgICAvLyBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gTWF0aC5yb3VuZCh0b3RhbENvdW50IC8gbGVhZm5vZGVDb3VudClcbiAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudCAmJiBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHRvdGFsQ291bnQgKz0gcGFyZW50Q2hpbGQubGVhZk5vZGVzQ291bnRcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRMZWFmTm9kZXMgPSBbLi4uY29tcGxldGVkTGVhZk5vZGVzLCAuLi5wYXJlbnRDaGlsZC5sZWFmTm9kZXNdXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudC5pc3N1ZWRDZXJ0aWZpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2VydGlmaWNhdGU6IGFueSA9IGZvdW5kQ29udGVudC5pc3N1ZWRDZXJ0aWZpY2F0ZXMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpKVxuICAgICAgICAgICAgICAgICAgY29uc3QgY2VydElkOiBhbnkgPSBjZXJ0aWZpY2F0ZVswXS5pZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICBwYXJlbnRDaGlsZC5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCA9IGNlcnRJZFxuICAgICAgICAgICAgICAgICAgLy8gY29uc3QgY2VydERhdGE6IGFueSA9IGF3YWl0IHRoaXMuZG93b25sb2FkQ2VydGlmaWNhdGUoY2VydElkKS50b1Byb21pc2UoKS5jYXRjaChfZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgICAgICAgIC8vIH0pXG4gICAgICAgICAgICAgICAgICAvLyBpZiAoY2VydERhdGEgJiYgY2VydERhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHBhcmVudENoaWxkLmlzc3VlZENlcnRpZmljYXRlc1NWRyA9IGNlcnREYXRhLnJlc3VsdC5wcmludFVyaVxuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmVudENoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMTAwXG4gICAgICAgICAgICAgICAgcGFyZW50Q2hpbGQuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hJZDogZm91bmRDb250ZW50LmJhdGNoLmJhdGNoSWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBmb3VuZENvbnRlbnQudXNlcklkLFxuICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRDb250ZW50LmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBmaXJzdFVuY29tcGxldGVDb3Vyc2UgPSAocGFyZW50Q2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDAgfHwgIXBhcmVudENoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZmlyc3RVbmNvbXBsZXRlQ291cnNlID8gcGFyZW50Q2hpbGQgOiBmaXJzdFVuY29tcGxldGVDb3Vyc2VcbiAgICAgICAgICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnRvUHJvbWlzZSgpLnRoZW4oKHByb2dyZXNzZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YT8ucmVzdWx0Py5jb250ZW50TGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gZGF0YS5yZXN1bHQuY29udGVudExpc3QuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnByb2dyZXNzID09PSAxMDApXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0NvbXBsZXRlZExlYWZub2Rlcyhjb21wbGV0ZWRMZWFmTm9kZXMsIGNvbXBsZXRlZENvdW50KVxuICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ291bnQgPSBjb21wbGV0ZWRMZWFmTm9kZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IFsuLi5pbnByb2dyZXNzRGF0YUNoZWNrLCAuLi5kYXRhLnJlc3VsdC5jb250ZW50TGlzdF1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnByb2dyZXNzRGF0YUNoZWNrID0gaW5wcm9ncmVzc0RhdGFDaGVjayA/IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgOiAgZGF0YS5yZXN1bHQuY29udGVudExpc3RcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VtYURhdGEoaW5wcm9ncmVzc0RhdGFDaGVjaylcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKHBhcmVudENoaWxkLCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQocGFyZW50Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gIGVsc2Uge1xuICAgICAgICAgICAgLy8gICBpZiAoY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgZm91bmRDb250ZW50ID0gZW5yb2xtZW50TGlzdCAmJiBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgLy8gICAgIGlmIChmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgLy8gICAgICAgICAgIGJhdGNoSWQ6IGZvdW5kQ29udGVudC5iYXRjaC5iYXRjaElkLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIHVzZXJJZDogZm91bmRDb250ZW50LnVzZXJJZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRDb250ZW50LmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIF0sXG4gICAgICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnRvUHJvbWlzZSgpLnRoZW4oKHByb2dyZXNzZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IGRhdGE6IGFueSAgPSBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRDb3VudCA9IGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0LmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5wcm9ncmVzcyA9PT0gMTAwKVxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMuY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMoY29tcGxldGVkTGVhZk5vZGVzLCBjb21wbGV0ZWRDb3VudClcbiAgICAgICAgICAgIC8vICAgICAgICAgICB0b3RhbENvdW50ID0gY29tcGxldGVkTGVhZk5vZGVzLmxlbmd0aFxuICAgICAgICAgICAgLy8gICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrID8gaW5wcm9ncmVzc0RhdGFDaGVjayA6ICBkYXRhLnJlc3VsdC5jb250ZW50TGlzdFxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudCwgZGF0YS5yZXN1bHQuY29udGVudExpc3QpXG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAvLyAgICAgICAgIHJldHVybiBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgIC8vICAgICAgIH0pXG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cbiAgICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFXG4gICAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVFxuICAgICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0pIHtcbiAgICAgICAgICAvLyB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICBjb25zdCBmb3VuZFBhcmVudENvbnRlbnQgPSB0aGlzLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0LCBjb2xsZWN0aW9uSWQgfHwgY29udGVudD8uaWRlbnRpZmllcilcbiAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKGNvbnRlbnQpXG4gICAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICBiYXRjaElkOiBmb3VuZFBhcmVudENvbnRlbnQ/LmJhdGNoPy5iYXRjaElkLFxuICAgICAgICAgICAgICB1c2VySWQ6IGZvdW5kUGFyZW50Q29udGVudD8udXNlcklkLFxuICAgICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRQYXJlbnRDb250ZW50Py5jb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgY29udGVudElkczogW10sXG4gICAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxKS50b1Byb21pc2UoKS50aGVuKChwcm9ncmVzc2RhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YTogYW55ID0gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gZGF0YS5yZXN1bHQuY29udGVudExpc3QuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnByb2dyZXNzID09PSAxMDApXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMoY29tcGxldGVkTGVhZk5vZGVzLCBjb21wbGV0ZWRDb3VudClcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IGNvbXBsZXRlZExlYWZOb2Rlcy5sZW5ndGhcbiAgICAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IFsuLi5pbnByb2dyZXNzRGF0YUNoZWNrLCAuLi5kYXRhLnJlc3VsdC5jb250ZW50TGlzdF1cbiAgICAgICAgICAgICAgLy8gaW5wcm9ncmVzc0RhdGFDaGVjayA9IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPyBpbnByb2dyZXNzRGF0YUNoZWNrIDogIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnByb2dyZXNzRGF0YUNoZWNrICYmIGlucHJvZ3Jlc3NEYXRhQ2hlY2subGVuZ3RoID09PSAwICYmIGZpcnN0VW5jb21wbGV0ZUNvdXJzZSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGREYXRhID0gdGhpcy53aWRnZXRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KGZpcnN0VW5jb21wbGV0ZUNvdXJzZSlcbiAgICAgICAgICBjb25zdCBjaGlsZEVucm9sbG1lbnREYXRhID0gZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PlxuICAgICAgICAgICAgZWwuY29sbGVjdGlvbklkID09PSBmaXJzdFVuY29tcGxldGVDb3Vyc2UuaWRlbnRpZmllcilcbiAgICAgICAgICBjb25zdCByZXN1bWVEYXRhID0gW3tcbiAgICAgICAgICAgIGNvbnRlbnRJZDogZmlyc3RDaGlsZERhdGEuaWRlbnRpZmllcixcbiAgICAgICAgICAgIGJhdGNoSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5iYXRjaElkLFxuICAgICAgICAgICAgY29tcGxldGVkQ291bnQ6IDEsXG4gICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogMC4wLFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICB2aWV3Q291bnQ6IDEsXG4gICAgICAgICAgICBjb3Vyc2VJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgICAgY29sbGVjdGlvbklkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuY291cnNlSWQsXG4gICAgICAgICAgICBzdGF0dXM6IDEsXG4gICAgICAgICAgfV1cbiAgICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gcmVzdW1lRGF0YVxuICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjb25zdCBwYXJlbnRDb250ZW50ID0gZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgIC8vIGlmICghcGFyZW50Q29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSkge1xuICAgICAgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGguZmxvb3IoKHRvdGFsQ291bnQgLyBsZWFmbm9kZUNvdW50KSAqIDEwMClcbiAgICAgIGNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPD0gMTAwID8gMSA6IDJcbiAgICAgIGlmIChjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgJiYgaW5wcm9ncmVzc0RhdGFDaGVjayAmJiBpbnByb2dyZXNzRGF0YUNoZWNrLmxlbmd0aCA9PT0gMCAmJiAhZmlyc3RVbmNvbXBsZXRlQ291cnNlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q2hpbGREYXRhID0gdGhpcy53aWRnZXRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KGNvbnRlbnQpXG4gICAgICAgIGNvbnN0IGNoaWxkRW5yb2xsbWVudERhdGEgPSBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+XG4gICAgICAgICAgZWwuY29sbGVjdGlvbklkID09PSBjb250ZW50LmNoaWxkcmVuWzBdLmlkZW50aWZpZXIpXG4gICAgICAgIGNvbnN0IHJlc3VtZURhdGEgPSBbe1xuICAgICAgICAgIGNvbnRlbnRJZDogZmlyc3RDaGlsZERhdGEuaWRlbnRpZmllcixcbiAgICAgICAgICBiYXRjaElkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuYmF0Y2hJZCxcbiAgICAgICAgICBjb21wbGV0ZWRDb3VudDogMSxcbiAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogMTAwLFxuICAgICAgICAgIHByb2dyZXNzOiAyLFxuICAgICAgICAgIHZpZXdDb3VudDogMSxcbiAgICAgICAgICBjb3Vyc2VJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgIHN0YXR1czogMixcbiAgICAgICAgfV1cbiAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IHJlc3VtZURhdGFcbiAgICAgICAgdGhpcy51cGRhdGVSZXN1bWFEYXRhKGlucHJvZ3Jlc3NEYXRhQ2hlY2spXG4gICAgICB9XG4gICAgICAvLyAvLyB9IGVsc2Uge1xuICAgICAgLy8gICBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gcGFyZW50Q29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgLy8gLy8gfVxuICAgICAgLy8gfSlcbiAgICAgIC8vIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhjb250ZW50LCBjb250ZW50KVxuICAgICAgdGhpcy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoY29udGVudClcbiAgICAgIHRoaXMuY2hlY2tNb2R1bGVXaXNlRGF0YShjb250ZW50KVxuICAgICAgLy8gQ29tcHV0ZSBtaWxlc3RvbmUgbG9ja2luZyBBRlRFUiBwcm9ncmVzcyBkYXRhIGlzIHBvcHVsYXRlZFxuICAgICAgaWYgKGNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgICB0aGlzLmNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzKClcbiAgICAgICAgLy8gRW5zdXJlIGhhc2htYXAgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuaGFzaG1hcCA9IHsgLi4udGhpcy5oYXNobWFwIH1cbiAgICAgICAgY29uc29sZS5sb2coJ01pbGVzdG9uZSBsb2NraW5nIGNvbXB1dGVkLCBoYXNobWFwIHVwZGF0ZWQ6JywgdGhpcy5oYXNobWFwKVxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgfVxuICB9XG4gIGNoZWNrQ29tcGxldGVkTGVhZm5vZGVzKGxlYWZOb2RlczogYW55LCBjb21wbGV0ZWRDb3VudDogYW55KSB7XG4gICAgaWYgKGNvbXBsZXRlZENvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbXBsZXRlZENvdW50LmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmICghbGVhZk5vZGVzLmluY2x1ZGVzKGVsZS5jb250ZW50SWQpKSB7XG4gICAgICAgICAgbGVhZk5vZGVzLnB1c2goZWxlLmNvbnRlbnRJZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBhc3luYyBnZXRQcm9ncmVzc0ZvckNoaWxkQ291cnNlKHJlcXVlc3Q6IGFueSwgY29udGVudDogYW55KSB7XG4gIC8vICBjb25zdCBkYXRhOiBhbnkgPSAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcXVlc3QpLnRvUHJvbWlzZSgpLmNhdGNoKF9lcnJvciA9PiB7fSlcbiAgLy8gICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoID4gMCkge1xuICAvLyAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgLy8gfVxuICAvLyB9XG5cbiAgZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVucm9sbWVudExpc3QgJiYgZW5yb2xtZW50TGlzdD8ubGVuZ3RoICYmIGVucm9sbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWw/LmNvbGxlY3Rpb25JZCA9PT0gaWRlbnRpZmllcilcbiAgfVxuXG4gIGFzeW5jIG1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvdXJzZTogYW55KSB7XG4gICAgaWYgKGNvdXJzZSAmJiBjb3Vyc2UuY2hpbGRyZW4pIHtcbiAgICAgIGF3YWl0IGNvdXJzZS5jaGlsZHJlbi5tYXAoYXN5bmMgKGNvdXJzZUNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKChjb3Vyc2VDaGlsZCAmJiBjb3Vyc2VDaGlsZC5jaGlsZHJlbikgfHwgY291cnNlQ2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvdXJzZUNoaWxkKVxuICAgICAgICAgIGNvdXJzZVsnbW9kdWxlQ291bnQnXSA9IGNvdXJzZVsnbW9kdWxlQ291bnQnXSA/IGNvdXJzZVsnbW9kdWxlQ291bnQnXSArIDEgOiAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291cnNlQ2hpbGRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSAxMDBcbiAgICAgICAgICBjb3Vyc2VDaGlsZFsnY29tcGxldGlvblN0YXR1cyddID0gMlxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwsIHBhcmVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgIC8vIGNvbnRlbnQuY2hpbGRyZW4ubWFwKChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpPT4ge1xuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgY29udGVudCA9IHRoaXMuZ2V0Q2FsY3VsYXRpb25zRnJvbUNoaWxkcmVuKGNvbnRlbnQpXG4gICAgICAgIC8vIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgLy8gaWYgKGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgLy8gICB0aGlzLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3MoaXRlbSwgcGFyZW50KVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhpdGVtLCBwYXJlbnQpXG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhpdGVtLCBwYXJlbnQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZUhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGhpZXJhcmNoeURhdGE6IE5zQ29udGVudC5JQ29udGVudCwgcm9vdENvdXJzZUNhdGVnb3J5Pzogc3RyaW5nKSB7XG4gICAgaWYgKGhpZXJhcmNoeURhdGEgJiYgaGllcmFyY2h5RGF0YS5jaGlsZHJlbikge1xuICAgICAgaGllcmFyY2h5RGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogTnNDb250ZW50LklDb250ZW50KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAgIHRoaXMuY3JlYXRlSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoY2hpbGQsIHJvb3RDb3Vyc2VDYXRlZ29yeSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmltYXJ5Q2F0ID0gY2hpbGQucHJpbWFyeUNhdGVnb3J5IGFzIHN0cmluZ1xuICAgICAgICBjb25zdCBjb3Vyc2VDYXQgPSAoY2hpbGQuY291cnNlQ2F0ZWdvcnkgfHwgY2hpbGQucHJpbWFyeUNhdGVnb3J5IHx8ICcnKSBhcyBzdHJpbmdcbiAgICAgICAgY29uc3QgaXNNaWxlc3RvbmUgPSBwcmltYXJ5Q2F0ID09PSAnTWlsZXN0b25lJyB8fCBjb3Vyc2VDYXQgPT09ICdNaWxlc3RvbmUnXG4gICAgICAgIGNvbnN0IGlzQ29sbGVjdGlvbiA9IGNoaWxkLm1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5DT0xMRUNUSU9OXG4gICAgICAgIGNvbnN0IGlzTW9kdWxlID0gY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEVcbiAgICAgICAgY29uc3QgaXNSZXNvdXJjZSA9IGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0UgfHxcbiAgICAgICAgICBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFIHx8XG4gICAgICAgICAgY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlRcbiAgICAgICAgY29uc3QgaXNMZWFybmluZ1BhdGh3YXkgPSByb290Q291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5J1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGNvbnRlbnQgaXMgbWFuZGF0b3J5IChpc01hbmRhdG9yeSBmbGFnIG9yIG1hbmRhdG9yeSBwcm9wZXJ0eSlcbiAgICAgICAgY29uc3QgaXNNYW5kYXRvcnkgPSBjaGlsZC5pc01hbmRhdG9yeSA9PT0gdHJ1ZSB8fCAoY2hpbGQgYXMgYW55KS5tYW5kYXRvcnkgPT09IHRydWVcblxuICAgICAgICBsZXQgbG9jYWxNYXA6IGFueSA9IHtcbiAgICAgICAgICBwYXJlbnQ6IGNoaWxkPy5wYXJlbnQsXG4gICAgICAgICAgaWRlbnRpZmllcjogY2hpbGQuaWRlbnRpZmllcixcbiAgICAgICAgICBsZWFmTm9kZXNDb3VudDogY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgbnVsbCxcbiAgICAgICAgICBsZWFmTm9kZXM6IGNoaWxkLmxlYWZOb2RlcyB8fCBbXSxcbiAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY2hpbGQucHJvZ3Jlc3MgfHwgMCxcbiAgICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBjaGlsZC5jb21wbGV0aW9uU3RhdHVzIHx8IGNoaWxkLnN0YXR1cyB8fCAwLFxuICAgICAgICAgIHN0YXR1czogY2hpbGQuc3RhdHVzIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgfHwgMCxcbiAgICAgICAgICBwcm9ncmVzczogY2hpbGQucHJvZ3Jlc3MsXG4gICAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgICAgY291cnNlQ2F0ZWdvcnk6IGNvdXJzZUNhdCxcbiAgICAgICAgICBkdXJhdGlvbjogY2hpbGQuZHVyYXRpb24gfHwgMCxcbiAgICAgICAgICBleHBlY3RlZER1cmF0aW9uOiBjaGlsZC5leHBlY3RlZER1cmF0aW9uIHx8IDAsXG4gICAgICAgICAgLy8gQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gICAgICAgICAgbWltZVR5cGU6IGNoaWxkLm1pbWVUeXBlLFxuICAgICAgICAgIGlzTG9ja2VkOiBjaGlsZC5pc0xvY2tlZCB8fCBmYWxzZSxcbiAgICAgICAgICBhcnRpZmFjdFVybDogY2hpbGQuYXJ0aWZhY3RVcmwgfHwgbnVsbCxcbiAgICAgICAgICBuYW1lOiBjaGlsZC5uYW1lIHx8ICcnLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiBjaGlsZC5jb250ZW50VHlwZSB8fCAnJyxcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZWQgZmxhZ3MgZm9yIExlYXJuaW5nIFBhdGh3YXlcbiAgICAgICAgICBpc01pbGVzdG9uZTogaXNNaWxlc3RvbmUsXG4gICAgICAgICAgaXNDb2xsZWN0aW9uOiBpc0NvbGxlY3Rpb24sXG4gICAgICAgICAgaXNNb2R1bGU6IGlzTW9kdWxlLFxuICAgICAgICAgIGlzUmVzb3VyY2U6IGlzUmVzb3VyY2UsXG4gICAgICAgICAgaXNMZWFybmluZ1BhdGh3YXk6IGlzTGVhcm5pbmdQYXRod2F5LFxuICAgICAgICAgIGlzTWFuZGF0b3J5OiBpc01hbmRhdG9yeSxcbiAgICAgICAgICAvLyBNaWxlc3RvbmUgc3BlY2lmaWMgZGF0YVxuICAgICAgICAgIG1pbGVzdG9uZUluZGV4OiAoY2hpbGQgYXMgYW55KS5taWxlc3RvbmVJbmRleCxcbiAgICAgICAgICBjb21wbGV0ZWRMZWFmTm9kZXNDb3VudDogKGNoaWxkIGFzIGFueSkuY29tcGxldGVkTGVhZk5vZGVzQ291bnQgfHwgMCxcbiAgICAgICAgICAvLyBQcmUtYXNzZXNzbWVudCBmbGFnIChmb3IgbWlsZXN0b25lIGdhdGluZylcbiAgICAgICAgICBpc1ByZUFzc2Vzc21lbnQ6IChjaGlsZCBhcyBhbnkpLmlzUHJlQXNzZXNzbWVudCB8fCBmYWxzZSxcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlYnVnIGxvZ2dpbmcgZm9yIG1pbGVzdG9uZXNcbiAgICAgICAgaWYgKGlzTWlsZXN0b25lKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtIYXNobWFwIEJ1aWxkXSBNaWxlc3RvbmUgJHtjaGlsZC5pZGVudGlmaWVyfSAoJHtjaGlsZC5uYW1lfSk6IGNvbXBsZXRpb25QZXJjZW50YWdlPSR7Y2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2V9LCBjb21wbGV0aW9uU3RhdHVzPSR7Y2hpbGQuY29tcGxldGlvblN0YXR1c30sIHN0YXR1cz0ke2NoaWxkLnN0YXR1c30sIGxlYWZOb2Rlc0NvdW50PSR7Y2hpbGQubGVhZk5vZGVzQ291bnR9LCBjb21wbGV0ZWRMZWFmTm9kZXNDb3VudD0keyhjaGlsZCBhcyBhbnkpLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50fWApXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhc2htYXBbY2hpbGQuaWRlbnRpZmllcl0gPSBsb2NhbE1hcFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlUHJlQXNzZXNzbWVudEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGhpZXJhcmNoeURhdGE6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGNvbnNvbGUubG9nKCdoaWVyYXJjaHlEYXRhLS0nLCBoaWVyYXJjaHlEYXRhKVxuICAgIGlmIChoaWVyYXJjaHlEYXRhICYmIGhpZXJhcmNoeURhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzKSB7XG4gICAgICBoaWVyYXJjaHlEYXRhLnByZUVucm9sbWVudFJlc291cmNlcy5mb3JFYWNoKChjaGlsZDogTnNDb250ZW50LklDb250ZW50KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZCAmJiBjaGlsZC5wcmVFbnJvbG1lbnRSZXNvdXJjZXMpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVByZUFzc2Vzc21lbnRIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChjaGlsZClcbiAgICAgICAgfVxuICAgICAgICBsZXQgbG9jYWxNYXAgPSB7fVxuICAgICAgICBsb2NhbE1hcCA9IHtcbiAgICAgICAgICBwYXJlbnQ6IGNoaWxkPy5wYXJlbnQsXG4gICAgICAgICAgaWRlbnRpZmllcjogY2hpbGQuaWRlbnRpZmllcixcbiAgICAgICAgICBsZWFmTm9kZXNDb3VudDogY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgbnVsbCxcbiAgICAgICAgICBsZWFmTm9kZXM6IGNoaWxkLmxlYWZOb2RlcyB8fCBbXSxcbiAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY2hpbGQucHJvZ3Jlc3MsXG4gICAgICAgICAgY29tcGxldGlvblN0YXR1czogY2hpbGQuY29tcGxldGlvblN0YXR1cyxcbiAgICAgICAgICBwcm9ncmVzczogY2hpbGQucHJvZ3Jlc3MsXG4gICAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgICAgY291cnNlQ2F0ZWdvcnk6IGNoaWxkLmNvdXJzZUNhdGVnb3J5IHx8IGNoaWxkLnByaW1hcnlDYXRlZ29yeSB8fCAnJyxcbiAgICAgICAgICBkdXJhdGlvbjogY2hpbGQuZHVyYXRpb24gfHwgMCxcbiAgICAgICAgICBleHBlY3RlZER1cmF0aW9uOiBjaGlsZC5leHBlY3RlZER1cmF0aW9uIHx8IDAsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNobWFwW2NoaWxkLmlkZW50aWZpZXJdID0gbG9jYWxNYXBcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChoaWVyYXJjaHlEYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsKSB7XG4gICAgaWYgKGhpZXJhcmNoeURhdGEpIHtcbiAgICAgIGNvbnN0IHJvb3RDb3Vyc2VDYXRlZ29yeSA9IGhpZXJhcmNoeURhdGEuY291cnNlQ2F0ZWdvcnkgfHwgaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgfHwgJydcbiAgICAgIGNvbnN0IGlzTGVhcm5pbmdQYXRod2F5ID0gcm9vdENvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheSdcblxuICAgICAgdGhpcy5oYXNobWFwW2hpZXJhcmNoeURhdGEuaWRlbnRpZmllcl0gPSB7XG4gICAgICAgIHBhcmVudDogaGllcmFyY2h5RGF0YS5wYXJlbnQsXG4gICAgICAgIGlkZW50aWZpZXI6IGhpZXJhcmNoeURhdGEuaWRlbnRpZmllcixcbiAgICAgICAgbGVhZk5vZGVzQ291bnQ6IGhpZXJhcmNoeURhdGEubGVhZk5vZGVzQ291bnQgfHwgbnVsbCxcbiAgICAgICAgbGVhZk5vZGVzOiBoaWVyYXJjaHlEYXRhLmxlYWZOb2RlcyB8fCBbXSxcbiAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGhpZXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgaGllcmFyY2h5RGF0YS5wcm9ncmVzcyB8fCAwLFxuICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBoaWVyYXJjaHlEYXRhLmNvbXBsZXRpb25TdGF0dXMgfHwgMCxcbiAgICAgICAgcHJvZ3Jlc3M6IGhpZXJhcmNoeURhdGEucHJvZ3Jlc3MsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIGNvdXJzZUNhdGVnb3J5OiByb290Q291cnNlQ2F0ZWdvcnksXG4gICAgICAgIGV4cGVjdGVkRHVyYXRpb246IGhpZXJhcmNoeURhdGEuZXhwZWN0ZWREdXJhdGlvbiB8fCAwLFxuICAgICAgICAvLyBBZGRpdGlvbmFsIG1ldGFkYXRhXG4gICAgICAgIG1pbWVUeXBlOiBoaWVyYXJjaHlEYXRhLm1pbWVUeXBlLFxuICAgICAgICBpc0xvY2tlZDogaGllcmFyY2h5RGF0YS5pc0xvY2tlZCB8fCBmYWxzZSxcbiAgICAgICAgYXJ0aWZhY3RVcmw6IGhpZXJhcmNoeURhdGEuYXJ0aWZhY3RVcmwgfHwgbnVsbCxcbiAgICAgICAgbmFtZTogaGllcmFyY2h5RGF0YS5uYW1lIHx8ICcnLFxuICAgICAgICBjb250ZW50VHlwZTogaGllcmFyY2h5RGF0YS5jb250ZW50VHlwZSB8fCAnJyxcbiAgICAgICAgaXNNaWxlc3RvbmU6IGZhbHNlLFxuICAgICAgICBpc0NvbGxlY3Rpb246IGhpZXJhcmNoeURhdGEubWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLkNPTExFQ1RJT04sXG4gICAgICAgIGlzTW9kdWxlOiBoaWVyYXJjaHlEYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFLFxuICAgICAgICBpc1Jlc291cmNlOiBmYWxzZSxcbiAgICAgICAgaXNMZWFybmluZ1BhdGh3YXk6IGlzTGVhcm5pbmdQYXRod2F5LFxuICAgICAgfVxuICAgICAgaWYgKGhpZXJhcmNoeURhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiZcbiAgICAgICAgaGllcmFyY2h5RGF0YS5jb21wYXRpYmlsaXR5TGV2ZWwgPj0gNSAmJiBoaWVyYXJjaHlEYXRhLmNvbnRleHRMb2NraW5nVHlwZSAmJlxuICAgICAgICBoaWVyYXJjaHlEYXRhLmNvbnRleHRMb2NraW5nVHlwZSA9PT0gTnNDb250ZW50LkVDb250ZXh0TG9ja2luZ1R5cGUuQ09VUlNFX0FTU0VTU01FTlRfT05MWSkge1xuICAgICAgICB0aGlzLmhhc2htYXBbaGllcmFyY2h5RGF0YS5pZGVudGlmaWVyXSA9IHtcbiAgICAgICAgICAuLi50aGlzLmhhc2htYXBbaGllcmFyY2h5RGF0YS5pZGVudGlmaWVyXSxcbiAgICAgICAgICBjb250ZXh0TG9ja2luZ1R5cGU6IGhpZXJhcmNoeURhdGEuY29udGV4dExvY2tpbmdUeXBlLFxuICAgICAgICAgIGNvbXBhdGliaWxpdHlMZXZlbDogaGllcmFyY2h5RGF0YS5jb21wYXRpYmlsaXR5TGV2ZWwsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY3JlYXRlSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoaGllcmFyY2h5RGF0YSwgcm9vdENvdXJzZUNhdGVnb3J5KVxuICAgICAgLy8gTk9URTogY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXMgaXMgY2FsbGVkIEFGVEVSIHByb2dyZXNzIGRhdGEgaXMgcG9wdWxhdGVkXG4gICAgICAvLyBpbiBtYXBDb21wbGV0aW9uUGVyY2VudGFnZVByb2dyYW0sIG5vdCBoZXJlIHdoZXJlIGNvbXBsZXRpb24gZGF0YSBpcyBzdGlsbCAwXG4gICAgICB0aGlzLmhhc2htYXAgPSB7IC4uLnRoaXMuaGFzaG1hcCB9XG4gICAgICBjb25zb2xlLmxvZygndGhpcy5oYXNobWFwLS0nLCB0aGlzLmhhc2htYXApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZS1jb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nIHN0YXR1cyBmb3IgYWxsIG1pbGVzdG9uZXMgaW4gTGVhcm5pbmcgUGF0aHdheVxuICAgKiBUaGlzIGF2b2lkcyBleHBlbnNpdmUgY2FsY3VsYXRpb25zIGluIGNvbXBvbmVudCBnZXR0ZXJzXG4gICAqIFxuICAgKiBMb2NraW5nIFJ1bGVzOlxuICAgKiAxLiBBbGwgbWlsZXN0b25lcyBhcmUgbG9ja2VkIGJ5IGRlZmF1bHRcbiAgICogMi4gTWlsZXN0b25lIDEgKE0xKSB1bmxvY2tzIHdoZW4gcHJlLWFzc2Vzc21lbnQgaXMgY29tcGxldGVkXG4gICAqIDMuIE1pbGVzdG9uZSBOIChOID4gMSkgdW5sb2NrcyB3aGVuOlxuICAgKiAgICAtIEFsbCBtYW5kYXRvcnkgbGVhcm5pbmcgaXRlbXMgaW4gTWlsZXN0b25lIE4tMSBhcmUgY29tcGxldGVkXG4gICAqICAgIC0gVGhlIGFzc2Vzc21lbnQgb2YgTWlsZXN0b25lIE4tMSBpcyBjb21wbGV0ZWRcbiAgICovXG4gIHB1YmxpYyBjb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cygpIHtcbiAgICBjb25zb2xlLmxvZygnPT09IENPTVBVVElORyBNSUxFU1RPTkUgTE9DS0lORyBTVEFUVVMgPT09JylcbiAgICBjb25zb2xlLmxvZygnRnVsbCBoYXNobWFwOicsIHRoaXMuaGFzaG1hcClcblxuICAgIC8vIEdldCBhbGwgbWlsZXN0b25lIGVudHJpZXMgZnJvbSBoYXNobWFwIHNvcnRlZCBieSB0aGVpciBpbmRleCBvciBudW1iZXJcbiAgICBjb25zdCBtaWxlc3RvbmVFbnRyaWVzID0gT2JqZWN0LmtleXModGhpcy5oYXNobWFwKVxuICAgICAgLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNNaWxlc3RvbmUgfHwgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnIHx8IGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnXG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gU29ydCBieSBtaWxlc3RvbmVJbmRleCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBieSBudW1iZXIgaW4gSURcbiAgICAgICAgY29uc3QgaXRlbUEgPSB0aGlzLmhhc2htYXBbYV1cbiAgICAgICAgY29uc3QgaXRlbUIgPSB0aGlzLmhhc2htYXBbYl1cbiAgICAgICAgaWYgKGl0ZW1BLm1pbGVzdG9uZUluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlbUIubWlsZXN0b25lSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBpdGVtQS5taWxlc3RvbmVJbmRleCAtIGl0ZW1CLm1pbGVzdG9uZUluZGV4XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnVtQSA9IHBhcnNlSW50KGEucmVwbGFjZSgvXFxEL2csICcnKSkgfHwgMFxuICAgICAgICBjb25zdCBudW1CID0gcGFyc2VJbnQoYi5yZXBsYWNlKC9cXEQvZywgJycpKSB8fCAwXG4gICAgICAgIHJldHVybiBudW1BIC0gbnVtQlxuICAgICAgfSlcblxuICAgIGNvbnNvbGUubG9nKCdNaWxlc3RvbmUgZW50cmllcyBmb3VuZDonLCBtaWxlc3RvbmVFbnRyaWVzKVxuXG4gICAgLy8gQ2hlY2sgaWYgcHJlLWFzc2Vzc21lbnQgaXMgY29tcGxldGVkIChyZXF1aXJlZCB0byB1bmxvY2sgTTEpXG4gICAgY29uc3QgaXNQcmVBc3Nlc3NtZW50Q29tcGxldGVkID0gdGhpcy5jaGVja1ByZUFzc2Vzc21lbnRDb21wbGV0aW9uKClcblxuICAgIG1pbGVzdG9uZUVudHJpZXMuZm9yRWFjaCgobWlsZXN0b25lSWQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtaWxlc3RvbmUgPSB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdXG4gICAgICBpZiAoIW1pbGVzdG9uZSkgcmV0dXJuXG5cbiAgICAgIC8vIEZpcnN0IG1pbGVzdG9uZSAoTTEpIC0gdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF0uY29tcHV0ZWRJc0xvY2tlZCA9ICFpc1ByZUFzc2Vzc21lbnRDb21wbGV0ZWRcbiAgICAgICAgY29uc29sZS5sb2coYE1pbGVzdG9uZSAke21pbGVzdG9uZUlkfSAoTTEpOiBQcmUtYXNzZXNzbWVudCBjb21wbGV0ZWQ6ICR7aXNQcmVBc3Nlc3NtZW50Q29tcGxldGVkfSwgTG9ja2VkOiAkeyFpc1ByZUFzc2Vzc21lbnRDb21wbGV0ZWR9YClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBzdWJzZXF1ZW50IG1pbGVzdG9uZXMgKE0yLCBNMywgZXRjLiksIGNoZWNrIGlmIHByZXZpb3VzIG1pbGVzdG9uZSBpcyBmdWxseSBjb21wbGV0ZWRcbiAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lSWQgPSBtaWxlc3RvbmVFbnRyaWVzW2luZGV4IC0gMV1cbiAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lID0gdGhpcy5oYXNobWFwW3ByZXZpb3VzTWlsZXN0b25lSWRdXG5cbiAgICAgIGlmIChwcmV2aW91c01pbGVzdG9uZSkge1xuICAgICAgICAvLyBTSU1QTElGSUVEIEFQUFJPQUNIOiBDaGVjayBpZiBwcmV2aW91cyBtaWxlc3RvbmUgaXMgMTAwJSBjb21wbGV0ZVxuICAgICAgICAvLyBUaGlzIHVzZXMgdGhlIGFnZ3JlZ2F0ZWQgY29tcGxldGlvbiBwZXJjZW50YWdlIHdoaWNoIGlzIGFscmVhZHkgY2FsY3VsYXRlZFxuICAgICAgICAvLyBVc2UgTnVtYmVyKCkgdG8gZW5zdXJlIHByb3BlciBudW1lcmljIGNvbXBhcmlzb25cbiAgICAgICAgY29uc3QgcHJldkNvbXBsZXRpb25QY3QgPSBOdW1iZXIocHJldmlvdXNNaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UpIHx8IDBcbiAgICAgICAgY29uc3QgcHJldkNvbXBsZXRpb25TdGF0dXMgPSBOdW1iZXIocHJldmlvdXNNaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cykgfHwgMFxuICAgICAgICBjb25zdCBwcmV2U3RhdHVzID0gTnVtYmVyKHByZXZpb3VzTWlsZXN0b25lLnN0YXR1cykgfHwgMFxuICAgICAgICBjb25zdCBwcmV2Q29tcGxldGVkTGVhZk5vZGVzID0gTnVtYmVyKHByZXZpb3VzTWlsZXN0b25lLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50KSB8fCAwXG4gICAgICAgIGNvbnN0IHByZXZMZWFmTm9kZXNDb3VudCA9IE51bWJlcihwcmV2aW91c01pbGVzdG9uZS5sZWFmTm9kZXNDb3VudCkgfHwgMFxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lQ29tcGxldGUgPVxuICAgICAgICAgIHByZXZDb21wbGV0aW9uUGN0ID49IDEwMCB8fFxuICAgICAgICAgIHByZXZDb21wbGV0aW9uU3RhdHVzID09PSAyIHx8XG4gICAgICAgICAgcHJldlN0YXR1cyA9PT0gMiB8fFxuICAgICAgICAgIChwcmV2TGVhZk5vZGVzQ291bnQgPiAwICYmIHByZXZDb21wbGV0ZWRMZWFmTm9kZXMgPj0gcHJldkxlYWZOb2Rlc0NvdW50KVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBNaWxlc3RvbmUgJHttaWxlc3RvbmVJZH0gKE0ke2luZGV4ICsgMX0pOiBQcmV2aW91cyBtaWxlc3RvbmUgKCR7cHJldmlvdXNNaWxlc3RvbmVJZH0pIC0gY29tcGxldGlvblBlcmNlbnRhZ2U6ICR7cHJldkNvbXBsZXRpb25QY3R9LCBjb21wbGV0aW9uU3RhdHVzOiAke3ByZXZDb21wbGV0aW9uU3RhdHVzfSwgc3RhdHVzOiAke3ByZXZTdGF0dXN9LCBjb21wbGV0ZWRMZWFmTm9kZXM6ICR7cHJldkNvbXBsZXRlZExlYWZOb2Rlc30vJHtwcmV2TGVhZk5vZGVzQ291bnR9LCBpc0NvbXBsZXRlOiAke3ByZXZpb3VzTWlsZXN0b25lQ29tcGxldGV9YClcblxuICAgICAgICAvLyBJZiBzaW1wbGUgY2hlY2sgZG9lc24ndCBzaG93IGNvbXBsZXRlLCBmYWxsIGJhY2sgdG8gZGV0YWlsZWQgY2hlY2tcbiAgICAgICAgbGV0IGNhblVubG9jayA9IHByZXZpb3VzTWlsZXN0b25lQ29tcGxldGVcblxuICAgICAgICBpZiAoIWNhblVubG9jaykge1xuICAgICAgICAgIC8vIEZhbGxiYWNrOiBDaGVjayBpbmRpdmlkdWFsIGl0ZW1zXG4gICAgICAgICAgY29uc3QgaXNQcmV2aW91c01pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0ZSA9IHRoaXMuY2hlY2tNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUocHJldmlvdXNNaWxlc3RvbmVJZClcbiAgICAgICAgICBjb25zdCBpc1ByZXZpb3VzTWlsZXN0b25lTWFuZGF0b3J5Q29tcGxldGUgPSB0aGlzLmNoZWNrTWlsZXN0b25lTWFuZGF0b3J5Q29udGVudENvbXBsZXRlKHByZXZpb3VzTWlsZXN0b25lSWQpXG4gICAgICAgICAgY2FuVW5sb2NrID0gaXNQcmV2aW91c01pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0ZSAmJiBpc1ByZXZpb3VzTWlsZXN0b25lTWFuZGF0b3J5Q29tcGxldGVcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTWlsZXN0b25lICR7bWlsZXN0b25lSWR9IChNJHtpbmRleCArIDF9KSAtIEZhbGxiYWNrIGNoZWNrOiBhc3Nlc3NtZW50OiAke2lzUHJldmlvdXNNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGV9LCBtYW5kYXRvcnk6ICR7aXNQcmV2aW91c01pbGVzdG9uZU1hbmRhdG9yeUNvbXBsZXRlfSwgY2FuVW5sb2NrOiAke2NhblVubG9ja31gKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXS5jb21wdXRlZElzTG9ja2VkID0gIWNhblVubG9ja1xuICAgICAgICBjb25zb2xlLmxvZyhgTWlsZXN0b25lICR7bWlsZXN0b25lSWR9IChNJHtpbmRleCArIDF9KTogRklOQUwgLSBjYW5VbmxvY2s6ICR7Y2FuVW5sb2NrfSwgTG9ja2VkOiAkeyFjYW5VbmxvY2t9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF0uY29tcHV0ZWRJc0xvY2tlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gTm93IGNvbXB1dGUgcGFyZW50IG1pbGVzdG9uZSBsb2NrIHN0YXR1cyBmb3IgYWxsIGNoaWxkcmVuXG4gICAgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgIGlmIChpdGVtLmlzTWlsZXN0b25lKSByZXR1cm4gLy8gU2tpcCBtaWxlc3RvbmVzIHRoZW1zZWx2ZXNcblxuICAgICAgLy8gVHJhdmVyc2UgdXAgdG8gZmluZCBpZiBhbnkgYW5jZXN0b3IgbWlsZXN0b25lIGlzIGxvY2tlZFxuICAgICAgbGV0IGN1cnJlbnRQYXJlbnRJZCA9IGl0ZW0ucGFyZW50XG4gICAgICBsZXQgZGVwdGggPSAwXG4gICAgICBjb25zdCBtYXhEZXB0aCA9IDVcblxuICAgICAgd2hpbGUgKGN1cnJlbnRQYXJlbnRJZCAmJiBkZXB0aCA8IG1heERlcHRoKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSB0aGlzLmhhc2htYXBbY3VycmVudFBhcmVudElkXVxuICAgICAgICBpZiAocGFyZW50RGF0YSkge1xuICAgICAgICAgIGlmIChwYXJlbnREYXRhLmlzTWlsZXN0b25lICYmIHBhcmVudERhdGEuY29tcHV0ZWRJc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5oYXNobWFwW2tleV0uaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQgPSB0cnVlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGFyZW50SWQgPSBwYXJlbnREYXRhLnBhcmVudFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVwdGgrK1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmhhc2htYXBba2V5XS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCkge1xuICAgICAgICB0aGlzLmhhc2htYXBba2V5XS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIENyZWF0ZSBuZXcgaGFzaG1hcCByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICB0aGlzLmhhc2htYXAgPSB7IC4uLnRoaXMuaGFzaG1hcCB9XG4gICAgY29uc29sZS5sb2coJz09PSBNSUxFU1RPTkUgTE9DS0lORyBTVEFUVVMgQ09NUFVURUQgPT09JywgdGhpcy5oYXNobWFwKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHByZS1hc3Nlc3NtZW50IChwcmVsaW1pbmFyeSBhc3Nlc3NtZW50KSBpcyBjb21wbGV0ZWRcbiAgICogUHJlLWFzc2Vzc21lbnQgaXMgdHlwaWNhbGx5IGEgQ291cnNlIEFzc2Vzc21lbnQgYXQgdGhlIHJvb3QgbGV2ZWwgb2YgTGVhcm5pbmcgUGF0aHdheSAoYmVmb3JlIG1pbGVzdG9uZXMpXG4gICAqL1xuICBwcml2YXRlIGNoZWNrUHJlQXNzZXNzbWVudENvbXBsZXRpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc29sZS5sb2coJ0NoZWNraW5nIHByZS1hc3Nlc3NtZW50IGNvbXBsZXRpb24uLi4nKVxuXG4gICAgLy8gRmluZCB0aGUgTGVhcm5pbmcgUGF0aHdheSByb290XG4gICAgbGV0IGxlYXJuaW5nUGF0aHdheUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuICAgICAgaWYgKGl0ZW0uaXNMZWFybmluZ1BhdGh3YXkgJiYgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknKSB7XG4gICAgICAgIGxlYXJuaW5nUGF0aHdheUlkID0ga2V5XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ0xlYXJuaW5nIFBhdGh3YXkgcm9vdCBJRDonLCBsZWFybmluZ1BhdGh3YXlJZClcblxuICAgIC8vIFBSSU9SSVRZIDE6IExvb2sgZm9yIGl0ZW1zIGV4cGxpY2l0bHkgbWFya2VkIGFzIHByZS1hc3Nlc3NtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICBpZiAoaXRlbS5pc1ByZUFzc2Vzc21lbnQgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5zdGF0dXMgPT09IDIgfHwgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgfHwgaXRlbS5wcm9ncmVzcyA+PSAxMDBcbiAgICAgICAgY29uc29sZS5sb2coYFByZS1hc3Nlc3NtZW50ICh2aWEgZmxhZykgZm91bmQ6ICR7a2V5fSAoJHtpdGVtLm5hbWV9KSwgU3RhdHVzOiAke2l0ZW0uY29tcGxldGlvblN0YXR1c30sIHN0YXR1czogJHtpdGVtLnN0YXR1c30sIFBlcmNlbnRhZ2U6ICR7aXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZX0sIENvbXBsZXRlZDogJHtpc0NvbXBsZXRlZH1gKVxuICAgICAgICByZXR1cm4gaXNDb21wbGV0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQUklPUklUWSAyOiBGaW5kIHByZS1hc3Nlc3NtZW50IGluIGhhc2htYXAgLSBkaXJlY3QgY2hpbGQgb2YgTGVhcm5pbmcgUGF0aHdheSB0aGF0IGlzIE5PVCBhIG1pbGVzdG9uZVxuICAgIC8vIENoZWNrIGZvciBmaXJzdCBub24tbWlsZXN0b25lIGNoaWxkIG9mIExlYXJuaW5nIFBhdGh3YXlcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgTGVhcm5pbmcgUGF0aHdheVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ICE9PSBsZWFybmluZ1BhdGh3YXlJZCkgY29udGludWVcblxuICAgICAgLy8gU2tpcCBtaWxlc3RvbmVzXG4gICAgICBpZiAoaXRlbS5pc01pbGVzdG9uZSkgY29udGludWVcblxuICAgICAgLy8gVGhpcyBpcyBhIG5vbi1taWxlc3RvbmUgZGlyZWN0IGNoaWxkIC0gaXQncyB0aGUgcHJlLWFzc2Vzc21lbnRcbiAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gaXRlbS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGl0ZW0uc3RhdHVzID09PSAyIHx8IGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwIHx8IGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwXG4gICAgICBjb25zb2xlLmxvZyhgUHJlLWFzc2Vzc21lbnQgKGZpcnN0IG5vbi1taWxlc3RvbmUgY2hpbGQpIGZvdW5kOiAke2tleX0gKCR7aXRlbS5uYW1lfSksIFN0YXR1czogJHtpdGVtLmNvbXBsZXRpb25TdGF0dXN9LCBzdGF0dXM6ICR7aXRlbS5zdGF0dXN9LCBQZXJjZW50YWdlOiAke2l0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2V9LCBDb21wbGV0ZWQ6ICR7aXNDb21wbGV0ZWR9YClcbiAgICAgIHJldHVybiBpc0NvbXBsZXRlZFxuICAgIH1cblxuICAgIC8vIElmIG5vIHByZS1hc3Nlc3NtZW50IGZvdW5kLCBjb25zaWRlciBNMSBjYW4gYmUgdW5sb2NrZWQgKG5vIHByZS1hc3Nlc3NtZW50IHJlcXVpcmVtZW50KVxuICAgIGNvbnNvbGUubG9nKCdObyBwcmUtYXNzZXNzbWVudCBmb3VuZCwgZGVmYXVsdGluZyB0byB1bmxvY2tlZCBNMScpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1pbGVzdG9uZSdzIGFzc2Vzc21lbnQgaXMgY29tcGxldGVkXG4gICAqIFNlYXJjaGVzIGZvciBhbnkgYXNzZXNzbWVudCB0eXBlIChDb3Vyc2UgQXNzZXNzbWVudCwgRmluYWwgQXNzZXNzbWVudCwgZXRjLikgdGhhdCBiZWxvbmdzIHRvIHRoaXMgbWlsZXN0b25lXG4gICAqL1xuICBwcml2YXRlIGNoZWNrTWlsZXN0b25lQXNzZXNzbWVudENvbXBsZXRlKG1pbGVzdG9uZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBtaWxlc3RvbmUgPSB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nIGFzc2Vzc21lbnQgZm9yIG1pbGVzdG9uZSAke21pbGVzdG9uZUlkfTpgLCBtaWxlc3RvbmUpXG5cbiAgICAvLyBDaGVjayBhbGwgaXRlbXMgaW4gaGFzaG1hcCB0aGF0IGFyZSBhc3Nlc3NtZW50cyBhbmQgYmVsb25nIHRvIHRoaXMgbWlsZXN0b25lXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYXNzZXNzbWVudCB0eXBlXG4gICAgICBjb25zdCBpc0Fzc2Vzc21lbnRUeXBlID1cbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdGaW5hbCBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ1ByYWN0aWNlIFF1ZXN0aW9uIFNldCcgfHxcbiAgICAgICAgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnRmluYWwgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgKGl0ZW0ubmFtZSAmJiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYXNzZXNzbWVudCcpKVxuXG4gICAgICBpZiAoIWlzQXNzZXNzbWVudFR5cGUpIGNvbnRpbnVlXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgYXNzZXNzbWVudCBiZWxvbmdzIHRvIHRoaXMgbWlsZXN0b25lXG4gICAgICBpZiAodGhpcy5pc0NoaWxkT2ZNaWxlc3RvbmUoa2V5LCBtaWxlc3RvbmVJZCkpIHtcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5zdGF0dXMgPT09IDIgfHwgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgfHwgaXRlbS5wcm9ncmVzcyA+PSAxMDBcbiAgICAgICAgY29uc29sZS5sb2coYE1pbGVzdG9uZSAke21pbGVzdG9uZUlkfSBBc3Nlc3NtZW50IGZvdW5kOiAke2tleX0gKCR7aXRlbS5uYW1lfSksIHByaW1hcnlDYXRlZ29yeTogJHtpdGVtLnByaW1hcnlDYXRlZ29yeX0sIFN0YXR1czogJHtpdGVtLmNvbXBsZXRpb25TdGF0dXN9LCBzdGF0dXM6ICR7aXRlbS5zdGF0dXN9LCBQZXJjZW50YWdlOiAke2l0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2V9LCBQcm9ncmVzczogJHtpdGVtLnByb2dyZXNzfSwgQ29tcGxldGVkOiAke2lzQ29tcGxldGVkfWApXG4gICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyBhc3Nlc3NtZW50IGZvdW5kLCBjb25zaWRlciBpdCBhcyBjb21wbGV0ZWQgKG5vIGFzc2Vzc21lbnQgcmVxdWlyZW1lbnQpXG4gICAgY29uc29sZS5sb2coYE1pbGVzdG9uZSAke21pbGVzdG9uZUlkfTogTm8gYXNzZXNzbWVudCBmb3VuZCwgZGVmYXVsdGluZyB0byBjb21wbGV0ZWRgKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtaWxlc3RvbmUncyBtYW5kYXRvcnkgY29udGVudCBpcyBjb21wbGV0ZWRcbiAgICogT25seSBjaGVja3MgY291cnNlcy9jb250ZW50IHRoYXQgYXJlIG1hcmtlZCBhcyBpc01hbmRhdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja01pbGVzdG9uZU1hbmRhdG9yeUNvbnRlbnRDb21wbGV0ZShtaWxlc3RvbmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWlsZXN0b25lID0gdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXVxuICAgIGNvbnNvbGUubG9nKGBDaGVja2luZyBtYW5kYXRvcnkgY29udGVudCBmb3IgbWlsZXN0b25lICR7bWlsZXN0b25lSWR9OmAsIG1pbGVzdG9uZSlcblxuICAgIGxldCBtYW5kYXRvcnlDb3VudCA9IDBcbiAgICBsZXQgY29tcGxldGVkTWFuZGF0b3J5Q291bnQgPSAwXG5cbiAgICAvLyBDaGVjayBhbGwgaXRlbXMgaW4gaGFzaG1hcCB0aGF0IGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhpcyBtaWxlc3RvbmUgKGNvdXJzZXMpXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgbWlsZXN0b25lIChjb3Vyc2UgbGV2ZWwpXG4gICAgICBpZiAoaXRlbS5wYXJlbnQgIT09IG1pbGVzdG9uZUlkKSBjb250aW51ZVxuXG4gICAgICAvLyBTa2lwIGlmIG5vdCBhIGNvdXJzZSBvciBjb2xsZWN0aW9uXG4gICAgICBpZiAoaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgIT09ICdDb3Vyc2UnICYmICFpdGVtLmlzQ29sbGVjdGlvbikgY29udGludWVcblxuICAgICAgLy8gU2tpcCBhc3Nlc3NtZW50cyAtIHRoZXkncmUgY2hlY2tlZCBzZXBhcmF0ZWx5XG4gICAgICBjb25zdCBpc0Fzc2Vzc21lbnQgPVxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0ZpbmFsIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgKGl0ZW0ubmFtZSAmJiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYXNzZXNzbWVudCcpKVxuICAgICAgaWYgKGlzQXNzZXNzbWVudCkgY29udGludWVcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb250ZW50IGlzIG1hbmRhdG9yeVxuICAgICAgaWYgKGl0ZW0uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgbWFuZGF0b3J5Q291bnQrK1xuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBpdGVtLnN0YXR1cyA9PT0gMiB8fCBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCB8fCBpdGVtLnByb2dyZXNzID49IDEwMFxuICAgICAgICBjb25zb2xlLmxvZyhgTWFuZGF0b3J5IGNvdXJzZSAke2tleX0gKCR7aXRlbS5uYW1lfSk6IFN0YXR1cyAke2l0ZW0uY29tcGxldGlvblN0YXR1c30sIHN0YXR1czogJHtpdGVtLnN0YXR1c30sIFBlcmNlbnRhZ2UgJHtpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlfSwgUHJvZ3Jlc3M6ICR7aXRlbS5wcm9ncmVzc30sIENvbXBsZXRlZDogJHtpc0NvbXBsZXRlZH1gKVxuICAgICAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCsrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxDb21wbGV0ZSA9IG1hbmRhdG9yeUNvdW50ID09PSAwIHx8IGNvbXBsZXRlZE1hbmRhdG9yeUNvdW50ID49IG1hbmRhdG9yeUNvdW50XG4gICAgY29uc29sZS5sb2coYE1pbGVzdG9uZSAke21pbGVzdG9uZUlkfSBNYW5kYXRvcnk6ICR7Y29tcGxldGVkTWFuZGF0b3J5Q291bnR9LyR7bWFuZGF0b3J5Q291bnR9IGNvbXBsZXRlZCwgQWxsIGNvbXBsZXRlOiAke2FsbENvbXBsZXRlfWApXG4gICAgcmV0dXJuIGFsbENvbXBsZXRlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBjb250ZW50IGl0ZW0gaXMgYSBjaGlsZCAoZGlyZWN0IG9yIG5lc3RlZCkgb2YgYSBtaWxlc3RvbmVcbiAgICovXG4gIHByaXZhdGUgaXNDaGlsZE9mTWlsZXN0b25lKGNvbnRlbnRJZDogc3RyaW5nLCBtaWxlc3RvbmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGN1cnJlbnRJZCA9IGNvbnRlbnRJZFxuICAgIGxldCBkZXB0aCA9IDBcbiAgICBjb25zdCBtYXhEZXB0aCA9IDEwXG5cbiAgICB3aGlsZSAoY3VycmVudElkICYmIGRlcHRoIDwgbWF4RGVwdGgpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBbY3VycmVudElkXVxuICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChpdGVtLnBhcmVudCA9PT0gbWlsZXN0b25lSWQpIHJldHVybiB0cnVlXG4gICAgICBjdXJyZW50SWQgPSBpdGVtLnBhcmVudFxuICAgICAgZGVwdGgrK1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldENhbGN1bGF0aW9uc0Zyb21DaGlsZHJlbihpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpIHtcbiAgICBpdGVtWydkdXJhdGlvbiddID0gaXRlbS5jaGlsZHJlbi5yZWR1Y2UoKHN1bSwgY2hpbGQpID0+IHtcbiAgICAgIHJldHVybiBzdW0gKyBOdW1iZXIoY2hpbGQuZHVyYXRpb24gfHwgMClcbiAgICB9LCAwKVxuICAgIGNvbnN0IGNvbXBsZXRlZEl0ZW1zID0gXy5maWx0ZXIoaXRlbS5jaGlsZHJlbiwgciA9PiByLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgci5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKVxuICAgIGNvbnN0IHRvdGFsQ291bnQgPSBfLnRvSW50ZWdlcihfLmdldChpdGVtLCAnbGVhZk5vZGVzQ291bnQnKSkgfHwgMVxuICAgIGl0ZW1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBOdW1iZXIoKChjb21wbGV0ZWRJdGVtcy5sZW5ndGggLyB0b3RhbENvdW50KSAqIDEwMCkudG9GaXhlZCgpKVxuICAgIGl0ZW1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IChpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkgPyAyIDogMVxuICAgIHJldHVybiBpdGVtXG4gIH1cblxuICBmZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhUmVxKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhPiB7XG4gICAgcmVxLnJlcXVlc3QuZmllbGRzID0gWydwcm9ncmVzc2RldGFpbHMnXVxuXG4gICAgaWYgKHJlcS5yZXF1ZXN0LmNvdXJzZUlkKSB7XG4gICAgICBjb25zdCByZXNsdXQ6IGFueSA9IHRoaXMuaHR0cC5wb3N0PE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGE+KFxuICAgICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX0hJU1RPUllWMn0vJHtyZXEucmVxdWVzdC5jb3Vyc2VJZH1gLCByZXFcbiAgICAgIClcbiAgICAgIC8vIGRhdGEuc3Vic2NyaWJlKChzdWJzY3JpYmVEYXRhOiBhbnkpID0+IHtcbiAgICAgIC8vICAgICAgIHRoaXMucHJvZ3JhbUNoaWxkQ291cnNlUmVzdW1lRGF0YS5uZXh0KHsgcmVzdW1lRGF0YTogc3Vic2NyaWJlRGF0YS5yZXN1bHQuY29udGVudExpc3QsIGNvdXJzZUlkOiByZXEucmVxdWVzdC5jb3Vyc2VJZCB9KVxuICAgICAgLy8gICAgIH0pXG4gICAgICByZXR1cm4gcmVzbHV0XG4gICAgfVxuICAgIHJldHVybiBvZigpXG5cbiAgfVxuXG4gIGRvd29ubG9hZENlcnRpZmljYXRlKGNlcnRJZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuQ0VSVF9ET1dOTE9BRChjZXJ0SWQpLFxuICAgIClcbiAgfVxuICBnZXRTZXJ2ZXJEYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBOc0FwcFRvYy5JUG9zdEFzc2Vzc21lbnRbXSB9PihcbiAgICAgIEFQSV9FTkRfUE9JTlRTLlNFUlZFUl9EQVRFKVxuICB9XG5cbiAgZ2V0Rm9ybUJ5SWQoZm9ybUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChBUElfRU5EX1BPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihBUElfRU5EX1BPSU5UUy5TVUJNSVRfRk9STSwgZm9ybURhdGEpXG4gIH1cblxuICBnZXRGb3JtQnlJZFB1YmxpYyhmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KEFQSV9FTkRfUE9JTlRTLkdFVF9GT1JNX0JZSURfUFVCTElDKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtUHVibGljKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihBUElfRU5EX1BPSU5UUy5TVUJNSVRfRk9STV9QVUJMSUMsIGZvcm1EYXRhKVxuICB9XG5cbiAgZ2V0QXBsbGljYXRpb25zQnlJZChmb3JtSWQ6IHN0cmluZywgY29udGV4dElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oQVBJX0VORF9QT0lOVFMuR0VUX0FQUExJQ0FUSU9OU19CWV9JRChmb3JtSWQsIGNvbnRleHRJZCkpXG4gIH1cblxuICBzaGFyZUNvbnRlbnQocmVxQm9keTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7QVBJX0VORF9QT0lOVFMuU0hBUkVfQ09OVEVOVH1gLCByZXFCb2R5KVxuICB9XG4gIGNoZWNrTW9kdWxlV2lzZURhdGEoY29udGVudDogYW55KSB7XG4gICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgY29udGVudC5jaGlsZHJlbi5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgICAgbGV0IG1vZHVsZVJlc291cnNlQ291bnQgPSAwXG4gICAgICAgICAgbGV0IG9mZmxpbmVSZXNvdXJzZUNvdW50ID0gMFxuICAgICAgICAgIGVsZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZEVsZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGRFbGUucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pIHtcbiAgICAgICAgICAgICAgbW9kdWxlUmVzb3Vyc2VDb3VudCA9IG1vZHVsZVJlc291cnNlQ291bnQgKyAxXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvZmZsaW5lUmVzb3Vyc2VDb3VudCA9IG9mZmxpbmVSZXNvdXJzZUNvdW50ICsgMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgZWxlWydtb2R1bGVSZXNvdXJzZUNvdW50J10gPSBtb2R1bGVSZXNvdXJzZUNvdW50XG4gICAgICAgICAgZWxlWydvZmZsaW5lUmVzb3Vyc2VDb3VudCddID0gb2ZmbGluZVJlc291cnNlQ291bnRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZWxlLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrTW9kdWxlV2lzZURhdGEoZWxlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgYXN5bmMgZmV0Y2hDb3Vyc2VIZWlyYXJjaHkoY29udGVudERhdGE6IGFueSkge1xuICAgIGlmIChjb250ZW50RGF0YSAmJiBjb250ZW50RGF0YS5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBlbGUgb2YgY29udGVudERhdGEuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGVsZS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy53aWRnZXRTdmMuZmV0Y2hDb250ZW50KGVsZS5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChzdWJFbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHN1YkVsZS5yZXN1bHQgJiYgc3ViRWxlLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgICAgICYmIHN1YkVsZS5yZXN1bHQuY29udGVudC5jaGlsZHJlbiAmJiBzdWJFbGUucmVzdWx0LmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGVsZVsnY2hpbGRyZW4nXSA9IHN1YkVsZS5yZXN1bHQuY29udGVudC5jaGlsZHJlblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRUcmFuc2NyaXB0aW9uRGF0YShkYXRhOiBhbnkpIHtcbiAgICAvLyAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgdGhpcy50cmFuc3JpcHRpb25EYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xuICB9XG5cbiAgc2V0QWN0aXZlU3VidGl0bGVMYW5ndWFnZShhY3RpdmVMYW5nOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnYWN0aXZlTGFuZy0tJywgYWN0aXZlTGFuZylcbiAgICB0aGlzLnRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdC5uZXh0KGFjdGl2ZUxhbmcpXG4gIH1cblxuXG5cbiAgYWlHZXRSZXNvdXJjZVZ0dEZpbGUocmVzb3VyY2VJRDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHtBUElfRU5EX1BPSU5UUy5BSV9SRVNPVVJDRV9WVFRfRklMRX0/cmVzb3VyY2VfaWQ9JHtyZXNvdXJjZUlEfWApXG4gIH1cblxuICByZWFkUHJlRW5yb2xsbWVudFJlc291cmNlc1N0YXRlKHJlcTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoYCR7QVBJX0VORF9QT0lOVFMuUFJFX0VOUk9MTE1FTlRfU1RBVEVfUkVBRH1gLCByZXEpXG4gIH1cblxuICBjcmVhdGVDb250ZW50VjIocmVxdWVzdEJvZHk6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KFxuICAgICAgICBgJHtBUElfRU5EX1BPSU5UUy5DUkVBVEVfUkVTT1VSQ0V9YCxcbiAgICAgICAgcmVxdWVzdEJvZHksXG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuaWRlbnRpZmllclxuICAgICAgICB9KSxcbiAgICAgIClcbiAgfVxuXG5cbiAgdXBsb2FkQXNzaWdubWVudEFuc3dlcihjb250ZW50SWQ6IHN0cmluZywgYmF0Y2hJZDogc3RyaW5nLCBhc3NpZ25tZW50SWQ6IHN0cmluZywgZmlsZTogRmlsZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke0FQSV9FTkRfUE9JTlRTLlVQTE9BRF9BU1NJR05NRU5UfS8ke2NvbnRlbnRJZH0vJHtiYXRjaElkfS8ke2Fzc2lnbm1lbnRJZH1gLCBmb3JtRGF0YSk7XG4gIH1cblxuXG4gIHJlYWRDb250ZW50VjIoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLlJFQURfUkVTT1VSQ0V9cmVhZC8ke2lkfT9tb2RlPWVkaXRgLFxuICAgICkucGlwZShcbiAgICAgIG1hcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBkYXRhLnJlc3VsdC5jb250ZW50XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHVwbG9hZChcbiAgICBkYXRhOiBGb3JtRGF0YSxcbiAgICBjb250ZW50RGF0YTogYW55LFxuICAgIG9wdGlvbnM/OiBhbnksXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBjb25zdCBmaWxlID0gZGF0YS5nZXQoJ2NvbnRlbnQnKSBhcyBGaWxlXG4gICAgbGV0IGZpbGVOYW1lID0gZmlsZS5uYW1lXG4gICAgaWYgKFsnY2hhbm5lbC5qc29uJ10uaW5kZXhPZihmaWxlTmFtZSkgPCAwKSB7XG4gICAgICBmaWxlTmFtZSA9IHRoaXMuYXBwZW5kVG9GaWxlbmFtZShmaWxlTmFtZSlcbiAgICB9XG4gICAgY29uc3QgbmV3Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIG5ld0Zvcm1EYXRhLmFwcGVuZCgnZGF0YScsIGZpbGUsIGZpbGVOYW1lKVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuVVBMT0FEX0ZJTEV9dXBsb2FkLyR7Y29udGVudERhdGEuY29udGVudElkfWAsXG4gICAgICBuZXdGb3JtRGF0YSxcbiAgICAgIG9wdGlvbnNcbiAgICApXG4gIH1cblxuICBhcHBlbmRUb0ZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIGNvbnN0IGRvdEluZGV4ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKVxuICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmaWxlbmFtZSArIHRpbWVTdGFtcFxuICAgIH1cbiAgICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGRvdEluZGV4KSArIHRpbWVTdGFtcCArIGZpbGVuYW1lLnN1YnN0cmluZyhkb3RJbmRleClcbiAgfVxuXG4gIHVwZGF0ZUNvbnRlbnRXaXRoRmV3RmllbGRzKHJlcXVlc3RCb2R5OiBhbnksIGlkZW50aWZpZXI6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxhbnk+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuVVBEQVRFX1JFU09VUkNFfS8ke2lkZW50aWZpZXJ9YCxcbiAgICAgIHJlcXVlc3RCb2R5LFxuICAgIClcbiAgfVxuXG4gIHNlYXJjaEFzc2lnbm1lbnRzKHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KEFQSV9FTkRfUE9JTlRTLlNFQVJDSCwgcmVxdWVzdClcbiAgfVxuXG4gIHN1Ym1pdERyYWZ0QXNzaWdubWVudChyZXF1ZXN0OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9EUkFGVF9BU1NJR05NRU5ULCByZXF1ZXN0KVxuICB9XG5cbiAgc3VibWl0QXNzaWdubWVudChyZXF1ZXN0OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChBUElfRU5EX1BPSU5UUy5TVUJNSVRfQVNTSUdOTUVOVCwgcmVxdWVzdClcbiAgfVxuXG4gIG5vdGlmeUFzc2lnbm1lbnRTdWJtaXNzaW9uKHBheWxvYWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KEFQSV9FTkRfUE9JTlRTLk5PVElGWV9BU1NJR05NRU5UX1NVQk1JU1NJT04sIHBheWxvYWQpXG4gIH1cblxuICBnZXRBc3NpZ25tZW50U3RhdHVzKHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke0FQSV9FTkRfUE9JTlRTLkFTU0lHTk1FTlRfU1RBVFVTfWAsIHJlcXVlc3QpXG4gIH1cblxuICByZWFkQXNzaWdubWVudEZpbGUoY29udGVudElkOiBzdHJpbmcsIGJhdGNoSWQ6IHN0cmluZywgYXNzaWdubWVudElkOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIC8vIFByb3Blcmx5IGVuY29kZSB0aGUgcGFyYW1ldGVycyB0byBhdm9pZCBtYWxmb3JtZWQgcmVxdWVzdCBlcnJvcnNcbiAgICBjb25zdCBlbmNvZGVkUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICBjb250ZW50SWQ6IGNvbnRlbnRJZCB8fCAnJyxcbiAgICAgIGJhdGNoSWQ6IGJhdGNoSWQgfHwgJycsXG4gICAgICBmb3JtSWQ6IGFzc2lnbm1lbnRJZCB8fCAnJyxcbiAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSB8fCAnJ1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7QVBJX0VORF9QT0lOVFMuUkVBRF9BU1NJR05NRU5UfT8ke2VuY29kZWRQYXJhbXMudG9TdHJpbmcoKX1gLCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0sIGFwcGxpY2F0aW9uL3BkZiwgYXBwbGljYXRpb24vbXN3b3JkLCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCdcbiAgICAgIH1cbiAgICB9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxufVxuIl19