@bnsights/bbsf-controls 1.0.111 → 1.0.112

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 (149) hide show
  1. package/README.md +4 -0
  2. package/esm2022/lib/Shared/Components/app-base-component.mjs +7 -7
  3. package/esm2022/lib/Shared/Enums/StartView.mjs +1 -1
  4. package/esm2022/lib/Shared/Enums/map-enums.mjs +7 -7
  5. package/esm2022/lib/Shared/Models/AutocompleteOptions.mjs +9 -9
  6. package/esm2022/lib/Shared/Models/CalendarOptions.mjs +7 -7
  7. package/esm2022/lib/Shared/Models/CheckBoxOptions.mjs +3 -3
  8. package/esm2022/lib/Shared/Models/ConfirmationModalOptions.mjs +16 -16
  9. package/esm2022/lib/Shared/Models/ControlOptionsBase.mjs +5 -5
  10. package/esm2022/lib/Shared/Models/DatePickerOptions.mjs +24 -0
  11. package/esm2022/lib/Shared/Models/DropdownOptions.mjs +6 -6
  12. package/esm2022/lib/Shared/Models/EnglishArabicDTO.mjs +3 -3
  13. package/esm2022/lib/Shared/Models/FileUploadModel.mjs +1 -1
  14. package/esm2022/lib/Shared/Models/FileUploadOptions.mjs +3 -3
  15. package/esm2022/lib/Shared/Models/FormOptions.mjs +13 -13
  16. package/esm2022/lib/Shared/Models/HtmlEditorOptions.mjs +3 -3
  17. package/esm2022/lib/Shared/Models/ImageUploadOptions.mjs +4 -4
  18. package/esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs +1 -3
  19. package/esm2022/lib/Shared/Models/MapAutocompleteDTO.mjs +2 -2
  20. package/esm2022/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +2 -2
  21. package/esm2022/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +2 -2
  22. package/esm2022/lib/Shared/Models/{MultilingualTextBoxOptions.mjs → MultiLingualTextBoxOptions.mjs} +5 -5
  23. package/esm2022/lib/Shared/Models/MultilingualControlOptionsBase.mjs +6 -6
  24. package/esm2022/lib/Shared/Models/MultipleFileUploadModel.mjs +5 -5
  25. package/esm2022/lib/Shared/Models/PagingOptions.mjs +22 -22
  26. package/esm2022/lib/Shared/Models/PhoneOptions.mjs +4 -4
  27. package/esm2022/lib/Shared/Models/ProfileImageUploadOptions.mjs +3 -3
  28. package/esm2022/lib/Shared/Models/ProfilePictureDTO.mjs +1 -1
  29. package/esm2022/lib/Shared/Models/RadioButtonItem.mjs +1 -1
  30. package/esm2022/lib/Shared/Models/RadioButtonOptions.mjs +1 -1
  31. package/esm2022/lib/Shared/Models/RangeNumber.mjs +1 -1
  32. package/esm2022/lib/Shared/Models/Recaptcha.mjs +2 -2
  33. package/esm2022/lib/Shared/Models/RecaptchaOptions.mjs +9 -9
  34. package/esm2022/lib/Shared/Models/RepeaterField.mjs +1 -1
  35. package/esm2022/lib/Shared/Models/RepeaterOptions.mjs +9 -9
  36. package/esm2022/lib/Shared/Models/TagsInputDTO.mjs +1 -1
  37. package/esm2022/lib/Shared/Models/TagsInputOptions.mjs +19 -19
  38. package/esm2022/lib/Shared/Models/TextAreaOptions.mjs +1 -1
  39. package/esm2022/lib/Shared/Models/TextBoxOptions.mjs +9 -9
  40. package/esm2022/lib/Shared/Models/{ToggleslideOptions.mjs → ToggleSlideOptions.mjs} +2 -2
  41. package/esm2022/lib/Shared/Models/filter-options.mjs +5 -5
  42. package/esm2022/lib/Shared/Models/page-header-options.mjs +32 -32
  43. package/esm2022/lib/Shared/services/ControlUtility.mjs +37 -37
  44. package/esm2022/lib/Shared/services/GlobalSettings.service.mjs +9 -9
  45. package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +81 -81
  46. package/esm2022/lib/controls/Calendar/Calendar.component.mjs +40 -40
  47. package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +35 -35
  48. package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +30 -30
  49. package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +90 -97
  50. package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +74 -74
  51. package/esm2022/lib/controls/FileUplaod/FileUplaod.component.mjs +155 -155
  52. package/esm2022/lib/controls/Form/Form.component.mjs +24 -24
  53. package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +55 -55
  54. package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +113 -113
  55. package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +62 -66
  56. package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +163 -163
  57. package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +193 -193
  58. package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +210 -210
  59. package/esm2022/lib/controls/Paging/Paging.component.mjs +85 -85
  60. package/esm2022/lib/controls/Phone/Phone.component.mjs +42 -42
  61. package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +112 -112
  62. package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +38 -38
  63. package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +46 -46
  64. package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +12 -12
  65. package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +556 -556
  66. package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +15 -15
  67. package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +100 -100
  68. package/esm2022/lib/controls/TextArea/TextArea.component.mjs +71 -71
  69. package/esm2022/lib/controls/TextBox/TextBox.component.mjs +116 -116
  70. package/esm2022/lib/controls/Toggleslide/Toggleslide.component.mjs +90 -0
  71. package/esm2022/lib/controls/bbsf-controls.module.mjs +2 -2
  72. package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +4 -4
  73. package/esm2022/public-api.mjs +7 -7
  74. package/fesm2022/bnsights-bbsf-controls.mjs +2801 -2813
  75. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -1
  76. package/lib/Shared/Enums/map-enums.d.ts +1 -1
  77. package/lib/Shared/Models/AutocompleteOptions.d.ts +20 -20
  78. package/lib/Shared/Models/CalendarOptions.d.ts +10 -10
  79. package/lib/Shared/Models/CheckBoxOptions.d.ts +2 -2
  80. package/lib/Shared/Models/ConfirmationModalOptions.d.ts +14 -14
  81. package/lib/Shared/Models/ControlOptionsBase.d.ts +17 -17
  82. package/lib/Shared/Models/{datePickerOptions.d.ts → DatePickerOptions.d.ts} +12 -13
  83. package/lib/Shared/Models/DropdownOptions.d.ts +15 -15
  84. package/lib/Shared/Models/EnglishArabicDTO.d.ts +2 -2
  85. package/lib/Shared/Models/FileUploadModel.d.ts +1 -1
  86. package/lib/Shared/Models/FileUploadOptions.d.ts +8 -8
  87. package/lib/Shared/Models/FormOptions.d.ts +11 -11
  88. package/lib/Shared/Models/HtmlEditorOptions.d.ts +11 -11
  89. package/lib/Shared/Models/ImageUploadOptions.d.ts +9 -9
  90. package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +1 -2
  91. package/lib/Shared/Models/MapAutocompleteDTO.d.ts +5 -5
  92. package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +7 -7
  93. package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +5 -5
  94. package/lib/Shared/Models/{MultilingualTextBoxOptions.d.ts → MultiLingualTextBoxOptions.d.ts} +6 -6
  95. package/lib/Shared/Models/MultilingualControlOptionsBase.d.ts +34 -34
  96. package/lib/Shared/Models/MultipleFileUploadModel.d.ts +4 -4
  97. package/lib/Shared/Models/PagingOptions.d.ts +25 -25
  98. package/lib/Shared/Models/PhoneOptions.d.ts +9 -9
  99. package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +10 -10
  100. package/lib/Shared/Models/ProfilePictureDTO.d.ts +9 -9
  101. package/lib/Shared/Models/RadioButtonItem.d.ts +2 -2
  102. package/lib/Shared/Models/RadioButtonOptions.d.ts +2 -2
  103. package/lib/Shared/Models/RangeNumber.d.ts +2 -2
  104. package/lib/Shared/Models/Recaptcha.d.ts +4 -4
  105. package/lib/Shared/Models/RecaptchaOptions.d.ts +10 -10
  106. package/lib/Shared/Models/RepeaterField.d.ts +4 -4
  107. package/lib/Shared/Models/RepeaterOptions.d.ts +16 -16
  108. package/lib/Shared/Models/TagsInputDTO.d.ts +4 -4
  109. package/lib/Shared/Models/TagsInputOptions.d.ts +29 -29
  110. package/lib/Shared/Models/TextAreaOptions.d.ts +11 -11
  111. package/lib/Shared/Models/TextBoxOptions.d.ts +18 -18
  112. package/lib/Shared/Models/{ToggleslideOptions.d.ts → ToggleSlideOptions.d.ts} +3 -3
  113. package/lib/Shared/Models/filter-options.d.ts +4 -4
  114. package/lib/Shared/Models/page-header-options.d.ts +43 -43
  115. package/lib/Shared/services/ControlUtility.d.ts +8 -8
  116. package/lib/Shared/services/GlobalSettings.service.d.ts +8 -8
  117. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +11 -11
  118. package/lib/controls/Calendar/Calendar.component.d.ts +7 -7
  119. package/lib/controls/CheckBox/CheckBox.component.d.ts +10 -10
  120. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +20 -24
  121. package/lib/controls/DropdownList/DropdownList.component.d.ts +13 -13
  122. package/lib/controls/FileUplaod/FileUplaod.component.d.ts +11 -11
  123. package/lib/controls/Form/Form.component.d.ts +2 -2
  124. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +12 -12
  125. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +16 -16
  126. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +6 -9
  127. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +25 -25
  128. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +24 -24
  129. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +32 -32
  130. package/lib/controls/Paging/Paging.component.d.ts +9 -9
  131. package/lib/controls/Phone/Phone.component.d.ts +12 -12
  132. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +18 -18
  133. package/lib/controls/RadioButton/RadioButton.component.d.ts +11 -11
  134. package/lib/controls/Recaptcha/Recaptcha.component.d.ts +10 -10
  135. package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +5 -5
  136. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +1 -1
  137. package/lib/controls/TagsInput/TagsInput.component.d.ts +17 -17
  138. package/lib/controls/TextArea/TextArea.component.d.ts +14 -14
  139. package/lib/controls/TextBox/TextBox.component.d.ts +25 -25
  140. package/lib/controls/Toggleslide/{toggleslide.component.d.ts → Toggleslide.component.d.ts} +10 -10
  141. package/lib/controls/bbsf-controls.module.d.ts +1 -1
  142. package/package.json +3 -2
  143. package/public-api.d.ts +4 -4
  144. package/src/lib/assets/images/marker-pin.svg +4 -4
  145. package/esm2022/bnsights-test-test-controls.mjs +0 -5
  146. package/esm2022/lib/Shared/Models/datePickerOptions.mjs +0 -23
  147. package/esm2022/lib/controls/Toggleslide/toggleslide.component.mjs +0 -90
  148. package/fesm2022/bnsights-test-test-controls.mjs +0 -9164
  149. package/fesm2022/bnsights-test-test-controls.mjs.map +0 -1
@@ -14,21 +14,21 @@ import * as i8 from "ngx-dropzone";
14
14
  import * as i9 from "ngx-intl-tel-input";
15
15
  export class ProfileImageUploaderComponent {
16
16
  static { this.controlContainerstatic = null; }
17
- constructor(zone, controlUtility, controlContainer, ProfileImageUploaderControlHost, UtilityService, controlValidationService, globalSettings) {
17
+ constructor(zone, controlUtility, controlContainer, profileImageUploaderControlHost, utilityService, controlValidationService, globalSettings) {
18
18
  this.zone = zone;
19
19
  this.controlUtility = controlUtility;
20
20
  this.controlContainer = controlContainer;
21
- this.ProfileImageUploaderControlHost = ProfileImageUploaderControlHost;
22
- this.UtilityService = UtilityService;
21
+ this.profileImageUploaderControlHost = profileImageUploaderControlHost;
22
+ this.utilityService = utilityService;
23
23
  this.controlValidationService = controlValidationService;
24
24
  this.globalSettings = globalSettings;
25
25
  this.files = [];
26
- this.ImageSource = './src/assets/images/user.svg';
27
- this.OnChange = new EventEmitter();
28
- this.ValidationMessage = '';
29
- this.AcceptedType = '';
30
- this.AcceptedTypeArray = [];
31
- this.ToolTipTypeArray = [];
26
+ this.imageSource = './src/assets/images/user.svg';
27
+ this.onChange = new EventEmitter();
28
+ this.validationMessage = '';
29
+ this.acceptedType = '';
30
+ this.acceptedTypeArray = [];
31
+ this.toolTipTypeArray = [];
32
32
  this.markAllAsTouched = false;
33
33
  this.imgUrl = null;
34
34
  this.config = null;
@@ -41,24 +41,24 @@ export class ProfileImageUploaderComponent {
41
41
  this.controlValidationService.removeGlobalError();
42
42
  };
43
43
  //External Method
44
- this.RemoveRequiredValidation = () => {
45
- this.controlUtility.RemoveRequiredValidation(this.ProfileImageUploadFormControl, this.validationRules, this.options);
44
+ this.removeRequiredValidation = () => {
45
+ this.controlUtility.removeRequiredValidation(this.profileImageUploadFormControl, this.validationRules, this.options);
46
46
  };
47
47
  //External Method
48
- this.AddRequiredValidation = () => {
49
- this.controlUtility.AddRequiredValidation(this.ProfileImageUploadFormControl, this.validationRules, this.options);
48
+ this.addRequiredValidation = () => {
49
+ this.controlUtility.addRequiredValidation(this.profileImageUploadFormControl, this.validationRules, this.options);
50
50
  };
51
51
  //External Method
52
- this.RemoveCustomValidation = (CustomValidation) => {
53
- this.controlUtility.RemoveCustomValidation(this.ProfileImageUploadFormControl, this.validationRules, CustomValidation);
52
+ this.removeCustomValidation = (customValidation) => {
53
+ this.controlUtility.removeCustomValidation(this.profileImageUploadFormControl, this.validationRules, customValidation);
54
54
  };
55
55
  //External Method
56
- this.AddCustomValidation = (CustomValidation) => {
57
- this.controlUtility.AddCustomValidation(this.ProfileImageUploadFormControl, this.validationRules, CustomValidation);
56
+ this.addCustomValidation = (customValidation) => {
57
+ this.controlUtility.addCustomValidation(this.profileImageUploadFormControl, this.validationRules, customValidation);
58
58
  };
59
59
  //External Method
60
- this.IsValid = () => {
61
- this.controlUtility.IsValid(this.ProfileImageUploadFormControl);
60
+ this.isValid = () => {
61
+ this.controlUtility.isValid(this.profileImageUploadFormControl);
62
62
  };
63
63
  ProfileImageUploaderComponent.controlContainerstatic =
64
64
  this.controlContainer;
@@ -66,15 +66,15 @@ export class ProfileImageUploaderComponent {
66
66
  disableMultipart: false, // 'DisableMultipart' must be 'true' for formatDataFunction to be called.
67
67
  });
68
68
  this.hasAnotherDropZoneOver = false;
69
- this.ProfilePictureDTO = new ProfilePictureDTO();
69
+ this.profilePictureDTO = new ProfilePictureDTO();
70
70
  }
71
71
  ngOnInit() {
72
72
  this.controlValidationService.isCreatedBefor = false;
73
- if (!this.options.ViewType)
74
- this.options.ViewType = this.globalSettings.ViewType;
75
- if (this.options.DefaultImageSrc != null &&
76
- this.options.DefaultImageSrc != '')
77
- this.ImageSource = this.options.DefaultImageSrc;
73
+ if (!this.options.viewType)
74
+ this.options.viewType = this.globalSettings.viewType;
75
+ if (this.options.defaultImageSrc != null &&
76
+ this.options.defaultImageSrc != '')
77
+ this.imageSource = this.options.defaultImageSrc;
78
78
  this.config = {
79
79
  aspectRatio: 200 / 200,
80
80
  dragMode: 'move',
@@ -90,74 +90,74 @@ export class ProfileImageUploaderComponent {
90
90
  cropBoxResizable: false,
91
91
  autoCrop: true,
92
92
  };
93
- if (this.options.ImageUploadAcceptsTypes != null) {
94
- this.options.ImageUploadAcceptsTypes;
93
+ if (this.options.imageUploadAcceptsTypes != null) {
94
+ this.options.imageUploadAcceptsTypes;
95
95
  }
96
- if (this.options.Value != null) {
97
- let imgURL = this.options.Value['fileURL'];
96
+ if (this.options.value != null) {
97
+ let imgURL = this.options.value['fileURL'];
98
98
  if (imgURL != '' && imgURL != undefined && imgURL != null)
99
- this.ImageSource = imgURL;
100
- let element = this.options.Value;
101
- this.FileLikeObject = {
102
- name: element.FileName
99
+ this.imageSource = imgURL;
100
+ let element = this.options.value;
101
+ this.fileLikeObject = {
102
+ name: element.fileName,
103
103
  };
104
- this.uploader.addToQueue([this.FileLikeObject]);
104
+ this.uploader.addToQueue([this.fileLikeObject]);
105
105
  }
106
- if (this.options.LabelKey != null && this.options.LabelKey != '')
107
- this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
108
- if (this.options.ImageUploadAcceptsTypes != null &&
109
- this.options.ImageUploadAcceptsTypes.length > 0) {
110
- for (let index = 0; index < this.options.ImageUploadAcceptsTypes.length; index++) {
111
- const Type = this.options.ImageUploadAcceptsTypes[index];
112
- this.AcceptedType =
113
- this.AcceptedType.toUpperCase() + Type.toUpperCase();
106
+ if (this.options.labelKey != null && this.options.labelKey != '')
107
+ this.options.labelValue = this.utilityService.getResourceValue(this.options.labelKey);
108
+ if (this.options.imageUploadAcceptsTypes != null &&
109
+ this.options.imageUploadAcceptsTypes.length > 0) {
110
+ for (let index = 0; index < this.options.imageUploadAcceptsTypes.length; index++) {
111
+ const Type = this.options.imageUploadAcceptsTypes[index];
112
+ this.acceptedType =
113
+ this.acceptedType.toUpperCase() + Type.toUpperCase();
114
114
  }
115
- this.AcceptedTypeArray = this.AcceptedType.split(',');
116
- for (let index = 0; index < this.AcceptedTypeArray.length; index++) {
117
- const element = this.AcceptedTypeArray[index];
115
+ this.acceptedTypeArray = this.acceptedType.split(',');
116
+ for (let index = 0; index < this.acceptedTypeArray.length; index++) {
117
+ const element = this.acceptedTypeArray[index];
118
118
  const TypeToolTipe = element.split('/')[1];
119
- this.ToolTipTypeArray.push(TypeToolTipe.toUpperCase());
119
+ this.toolTipTypeArray.push(TypeToolTipe.toUpperCase());
120
120
  }
121
- this.ValidationMessage =
122
- this.ValidationMessage +
123
- this.UtilityService.getResourceValue('AllowedTypes') +
124
- ` (${this.ToolTipTypeArray}) `;
121
+ this.validationMessage =
122
+ this.validationMessage +
123
+ this.utilityService.getResourceValue('AllowedTypes') +
124
+ ` (${this.toolTipTypeArray}) `;
125
125
  }
126
- if (this.options.FileMaxSizeInMB > 0) {
127
- this.ValidationMessage =
128
- this.ValidationMessage +
129
- ` <br /> ${this.UtilityService.getResourceValue('FileMaxSizeInMB')} ${this.options.FileMaxSizeInMB}`;
126
+ if (this.options.fileMaxSizeInMB > 0) {
127
+ this.validationMessage =
128
+ this.validationMessage +
129
+ ` <br /> ${this.utilityService.getResourceValue('FileMaxSizeInMB')} ${this.options.fileMaxSizeInMB}`;
130
130
  }
131
- if (this.options.ImageUploadAcceptsTypes != null &&
132
- this.options.ImageUploadAcceptsTypes.length > 0) {
131
+ if (this.options.imageUploadAcceptsTypes != null &&
132
+ this.options.imageUploadAcceptsTypes.length > 0) {
133
133
  }
134
- this.group.addControl(this.options.Name, new FormControl(''));
135
- this.ProfileImageUploadFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
136
- if (this.options.CustomValidation.length > 0) {
137
- let Validations = this.options.CustomValidation;
134
+ this.group.addControl(this.options.name, new FormControl(''));
135
+ this.profileImageUploadFormControl = this.group.controls[this.options.name]; // new FormControl('',validationRules);
136
+ if (this.options.customValidation.length > 0) {
137
+ let Validations = this.options.customValidation;
138
138
  for (let index = 0; index < Validations.length; index++) {
139
139
  const Validation = Validations[index];
140
140
  this.validationRules.push(Validation.functionBody);
141
141
  }
142
142
  }
143
- if (this.options.IsRequired) {
143
+ if (this.options.isRequired) {
144
144
  this.validationRules.push(Validators.required);
145
145
  }
146
- this.ProfileImageUploadFormControl.setValidators(this.validationRules);
147
- this.ProfileImageUploadFormControl.setAsyncValidators(this.validationRulesasync);
148
- if (this.options.IsDisabled) {
149
- this.ProfileImageUploadFormControl.disable();
146
+ this.profileImageUploadFormControl.setValidators(this.validationRules);
147
+ this.profileImageUploadFormControl.setAsyncValidators(this.validationRulesasync);
148
+ if (this.options.isDisabled) {
149
+ this.profileImageUploadFormControl.disable();
150
150
  }
151
- this.ProfileImageUploaderControlHost.ngSubmit.subscribe((value) => {
151
+ this.profileImageUploaderControlHost.ngSubmit.subscribe((value) => {
152
152
  this.group.markAllAsTouched();
153
153
  this.markAllAsTouched = true;
154
154
  });
155
155
  }
156
156
  ngAfterViewInit() {
157
- if (this.options.AttributeList != null) {
158
- var element = document.getElementById(this.options.Name);
159
- for (let index = 0; index < this.options.AttributeList.length; index++) {
160
- element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
157
+ if (this.options.attributeList != null) {
158
+ var element = document.getElementById(this.options.name);
159
+ for (let index = 0; index < this.options.attributeList.length; index++) {
160
+ element.setAttribute(this.options.attributeList[index].Key, this.options.attributeList[index].value);
161
161
  }
162
162
  }
163
163
  }
@@ -178,23 +178,23 @@ export class ProfileImageUploaderComponent {
178
178
  onFileChange(event) {
179
179
  if (event.rejectedFiles.length > 0) {
180
180
  const file = event.rejectedFiles[0];
181
- const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
181
+ const maxFileSize = this.options.fileMaxSizeInMB * 1000 * 1000;
182
182
  const fileType = file.type;
183
183
  if (file.size > maxFileSize) {
184
- const formControl = this.ProfileImageUploadFormControl;
184
+ const formControl = this.profileImageUploadFormControl;
185
185
  formControl.setErrors({
186
- FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
186
+ FileMaxSizeInMB: this.options.fileMaxSizeInMB + 'M',
187
187
  });
188
188
  formControl.markAsTouched();
189
189
  this.uploader.queue = [];
190
190
  return;
191
191
  }
192
- if (this.options.ImageUploadAcceptsTypes != null &&
193
- this.options.ImageUploadAcceptsTypes.length > 0 &&
194
- !(this.AcceptedTypeArray.includes(fileType.toUpperCase()) ||
195
- this.AcceptedTypeArray.includes(fileType.toLowerCase()))) {
196
- const formControl = this.ProfileImageUploadFormControl;
197
- formControl.setErrors({ ToolTipTypeError: this.ToolTipTypeArray });
192
+ if (this.options.imageUploadAcceptsTypes != null &&
193
+ this.options.imageUploadAcceptsTypes.length > 0 &&
194
+ !(this.acceptedTypeArray.includes(fileType.toUpperCase()) ||
195
+ this.acceptedTypeArray.includes(fileType.toLowerCase()))) {
196
+ const formControl = this.profileImageUploadFormControl;
197
+ formControl.setErrors({ ToolTipTypeError: this.toolTipTypeArray });
198
198
  formControl.markAsTouched();
199
199
  this.uploader.queue = [];
200
200
  return;
@@ -204,14 +204,14 @@ export class ProfileImageUploaderComponent {
204
204
  for (let index = 0; index < event.addedFiles.length; index++) {
205
205
  const file = event.addedFiles[0];
206
206
  this.EventFile = file;
207
- const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
207
+ const maxFileSize = this.options.fileMaxSizeInMB * 1000 * 1000;
208
208
  if (file) {
209
- const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
209
+ const maxFileSize = this.options.fileMaxSizeInMB * 1000 * 1000;
210
210
  const fileType = file.type;
211
211
  if (file.size > maxFileSize) {
212
- const formControl = this.ProfileImageUploadFormControl;
212
+ const formControl = this.profileImageUploadFormControl;
213
213
  formControl.setErrors({
214
- FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
214
+ FileMaxSizeInMB: this.options.fileMaxSizeInMB + 'M',
215
215
  });
216
216
  formControl.markAsTouched();
217
217
  this.uploader.queue = [];
@@ -223,34 +223,34 @@ export class ProfileImageUploaderComponent {
223
223
  reader.onload = () => {
224
224
  this.imageUrl = reader.result.toString();
225
225
  this.openModal(true);
226
- let originalValue = this.group.get(this.options.Name).value;
227
- if (this.options.PatchFunction &&
228
- this.options.PatchPath &&
229
- this.group.get(this.options.Name).valid) {
230
- this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
226
+ let originalValue = this.group.get(this.options.name).value;
227
+ if (this.options.patchFunction &&
228
+ this.options.patchPath &&
229
+ this.group.get(this.options.name).valid) {
230
+ this.controlUtility.patchControlValue(originalValue, this.options.patchFunction, this.options.patchPath);
231
231
  }
232
232
  //Use this line to enable two way binding.
233
- this.options.Value = originalValue;
234
- this.OnChange.emit(originalValue);
233
+ this.options.value = originalValue;
234
+ this.onChange.emit(originalValue);
235
235
  };
236
236
  }
237
237
  }
238
238
  }
239
239
  removeFromControlValue(event) {
240
- let ItemList = this.group.get(this.options.Name).value;
240
+ let ItemList = this.group.get(this.options.name).value;
241
241
  this.files.splice(this.files.indexOf(event), 1);
242
242
  ItemList = [];
243
- if (this.files.length == 0 && this.options.IsRequired) {
244
- this.ProfileImageUploadFormControl.markAsTouched();
245
- this.ProfileImageUploadFormControl.setErrors(Validators.required);
246
- this.ProfileImageUploadFormControl.invalid;
243
+ if (this.files.length == 0 && this.options.isRequired) {
244
+ this.profileImageUploadFormControl.markAsTouched();
245
+ this.profileImageUploadFormControl.setErrors(Validators.required);
246
+ this.profileImageUploadFormControl.invalid;
247
247
  }
248
- this.group.get(this.options.Name).setValue(ItemList);
249
- this.OnChange.emit(this.group.get(this.options.Name).value);
250
- this.options.Value = this.group.get(this.options.Name).value;
248
+ this.group.get(this.options.name).setValue(ItemList);
249
+ this.onChange.emit(this.group.get(this.options.name).value);
250
+ this.options.value = this.group.get(this.options.name).value;
251
251
  }
252
252
  cropImage() {
253
- this.ProfilePictureDTO.FileName = this.EventFile.name;
253
+ this.profilePictureDTO.fileName = this.EventFile.name;
254
254
  let Cropper = this.angularCropper.cropper;
255
255
  let profilePicturCropper = Cropper.getCroppedCanvas({
256
256
  width: 400,
@@ -305,8 +305,8 @@ export class ProfileImageUploaderComponent {
305
305
  FileBase64: reader.result.toString().split(',')[1],
306
306
  FileSizeInMB: BlobFile.size / 1000 / 1000,
307
307
  };
308
- this.ProfilePictureDTO.profilePicture = FileObject;
309
- this.ProfilePictureDTO.MediumPicture =
308
+ this.profilePictureDTO.profilePicture = FileObject;
309
+ this.profilePictureDTO.mediumPicture =
310
310
  FileObject.FileName + ',' + FileObject.FileBase64;
311
311
  this.files.push(BlobFile);
312
312
  break;
@@ -317,8 +317,8 @@ export class ProfileImageUploaderComponent {
317
317
  FileBase64: reader.result.toString().split(',')[1],
318
318
  FileSizeInMB: BlobFile.size / 1000 / 1000,
319
319
  };
320
- this.ProfilePictureDTO.AvatarPicture = FileObject;
321
- this.ProfilePictureDTO.SmallPicture =
320
+ this.profilePictureDTO.avatarPicture = FileObject;
321
+ this.profilePictureDTO.smallPicture =
322
322
  FileObject.FileName + ',' + FileObject.FileBase64;
323
323
  break;
324
324
  case 'OriginalPictureCropper':
@@ -328,16 +328,16 @@ export class ProfileImageUploaderComponent {
328
328
  FileBase64: reader.result.toString().split(',')[1],
329
329
  FileSizeInMB: BlobFile.size / 1000 / 1000,
330
330
  };
331
- this.ProfilePictureDTO.OriginalPicture = FileObject;
332
- this.ProfilePictureDTO.Original =
331
+ this.profilePictureDTO.originalPicture = FileObject;
332
+ this.profilePictureDTO.original =
333
333
  FileObject.FileName + ',' + FileObject.FileBase64;
334
- this.group.get(this.options.Name).setValue(this.ProfilePictureDTO);
335
- this.OnChange.emit(this.group.get(this.options.Name).value);
334
+ this.group.get(this.options.name).setValue(this.profilePictureDTO);
335
+ this.onChange.emit(this.group.get(this.options.name).value);
336
336
  break;
337
337
  default:
338
338
  break;
339
339
  }
340
- this.options.Value = this.ProfilePictureDTO;
340
+ this.options.value = this.profilePictureDTO;
341
341
  };
342
342
  }
343
343
  rotateImage(degree) {
@@ -353,11 +353,11 @@ export class ProfileImageUploaderComponent {
353
353
  this.mdlSampleIsOpen = open;
354
354
  }
355
355
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ProfileImageUploaderComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
356
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: ProfileImageUploaderComponent, selector: "BBSF-ProfileImageUploader", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\" ngx-dropzone\r\n [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\" (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\" id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\" ngx-dropzone [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\" [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div #element>\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ProfileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "directive", type: i9.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }] }); }
356
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: ProfileImageUploaderComponent, selector: "BBSF-ProfileImageUploader", inputs: { group: "group", options: "options" }, outputs: { onChange: "onChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.allowDropZone&&!options.isReadonly\" class=\"bbsf-input-container {{options.extraClasses}}\" ngx-dropzone\r\n [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\" (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.name}}\" id=\"{{options.name}}\"\r\n [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.allowDropZone&&!options.isReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"imageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.extraClasses}}\" ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.name}}\"\r\n id=\"{{options.name}}\" [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.isReadonly\">\r\n <div #element>\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(profileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{utilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{utilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "directive", type: i9.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }] }); }
357
357
  }
358
358
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ProfileImageUploaderComponent, decorators: [{
359
359
  type: Component,
360
- args: [{ selector: 'BBSF-ProfileImageUploader', template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\" ngx-dropzone\r\n [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\" (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.Name}}\" id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\" ngx-dropzone [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.Name}}\"\r\n id=\"{{options.Name}}\" [class.is-invalid]=\"ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div #element>\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(ProfileImageUploadFormControl.invalid && ProfileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ProfileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
360
+ args: [{ selector: 'BBSF-ProfileImageUploader', template: "<div class=\"form-group bbsf-control bbsf-profile-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.allowDropZone&&!options.isReadonly\" class=\"bbsf-input-container {{options.extraClasses}}\" ngx-dropzone\r\n [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\" (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n ngDefaultControl formControlName=\"{{options.name}}\" id=\"{{options.name}}\"\r\n [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.allowDropZone&&!options.isReadonly\" style=\"width:fit-content\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"imageSource\" class=\"profile-upload-img\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.extraClasses}}\" ngx-dropzone [disabled]=\"options.isDisabled\" [accept]=\"acceptedType\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.name}}\"\r\n id=\"{{options.name}}\" [class.is-invalid]=\"profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.isReadonly\">\r\n <div #element>\r\n <img [src]=\"imageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(profileImageUploadFormControl.invalid && profileImageUploadFormControl.touched)\">\r\n {{getErrorValidation(profileImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{utilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom in\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip=\"Zoom out\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip=\"Move right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip=\"Move up\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip=\"Move down\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate left\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip=\"Rotate right\">\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{utilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
361
361
  }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.ControlUtility }, { type: i2.ControlContainer, decorators: [{
362
362
  type: Optional
363
363
  }] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }], propDecorators: { fileInput: [{
@@ -367,10 +367,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
367
367
  type: Input
368
368
  }], options: [{
369
369
  type: Input
370
- }], OnChange: [{
370
+ }], onChange: [{
371
371
  type: Output
372
372
  }], angularCropper: [{
373
373
  type: ViewChild,
374
374
  args: ['angularCropper', { static: false }]
375
375
  }] } });
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZmlsZUltYWdlVXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL1Byb2ZpbGVJbWFnZVVwbG9hZGVyL1Byb2ZpbGVJbWFnZVVwbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9Qcm9maWxlSW1hZ2VVcGxvYWRlci9Qcm9maWxlSW1hZ2VVcGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFDWCxVQUFVLEdBS1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUF1QyxNQUFNLGlCQUFpQixDQUFDO0FBSXBGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7OztBQVkxRSxNQUFNLE9BQU8sNkJBQTZCO2FBQ2pDLDJCQUFzQixHQUFHLElBQUksQUFBUCxDQUFRO0lBZ0NyQyxZQUNVLElBQVksRUFDWixjQUE4QixFQUNsQixnQkFBa0MsRUFDL0MsK0JBQW1ELEVBQ25ELGNBQThCLEVBQzdCLHdCQUFrRCxFQUNsRCxjQUE4QjtRQU45QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDL0Msb0NBQStCLEdBQS9CLCtCQUErQixDQUFvQjtRQUNuRCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDN0IsNkJBQXdCLEdBQXhCLHdCQUF3QixD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QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxTQUFTLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFhO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7OEdBNVlVLDZCQUE2QjtrR0FBN0IsNkJBQTZCLCtWQ3BDMUMsZ21RQTJJTTs7MkZEdkdPLDZCQUE2QjtrQkFKekMsU0FBUzsrQkFDRSwyQkFBMkI7OzBCQXVDbEMsUUFBUTsyS0FqQ2dDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJaEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQWNBLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIE5nWm9uZSxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Db250cm9sLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBDb250cm9sQ29udGFpbmVyLFxyXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyLCBGaWxlTGlrZU9iamVjdCwgRmlsZVVwbG9hZGVyT3B0aW9ucyB9IGZyb20gJ25nMi1maWxlLXVwbG9hZCc7XHJcbmltcG9ydCB7IEZpbGVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVEVE8nO1xyXG5pbXBvcnQgeyBDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhci1jcm9wcGVyanMnO1xyXG5pbXBvcnQgeyBQcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9Qcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zJztcclxuaW1wb3J0IHsgUHJvZmlsZVBpY3R1cmVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL1Byb2ZpbGVQaWN0dXJlRFRPJztcclxuaW1wb3J0IHtcclxuICBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgVXRpbGl0eVNlcnZpY2UsXHJcbn0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvR2xvYmFsU2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1Qcm9maWxlSW1hZ2VVcGxvYWRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL1Byb2ZpbGVJbWFnZVVwbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2ZpbGVJbWFnZVVwbG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBzdGF0aWMgY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IG51bGw7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcbiAgZmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gIEltYWdlU291cmNlOiBzdHJpbmcgPSAnLi9zcmMvYXNzZXRzL2ltYWdlcy91c2VyLnN2Zyc7XHJcbiAgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBQcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBQcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIFZhbGlkYXRpb25NZXNzYWdlID0gJyc7XHJcbiAgdXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBoYXNBbm90aGVyRHJvcFpvbmVPdmVyOiBib29sZWFuO1xyXG4gIEFjY2VwdGVkVHlwZTogc3RyaW5nID0gJyc7XHJcbiAgQWNjZXB0ZWRUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgVG9vbFRpcFR5cGVBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBGaWxlTGlrZU9iamVjdDogRmlsZUxpa2VPYmplY3Q7XHJcbiAgUHJvZmlsZVBpY3R1cmVEVE86IFByb2ZpbGVQaWN0dXJlRFRPO1xyXG4gIGNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYW5ndWxhckNyb3BwZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBwdWJsaWMgYW5ndWxhckNyb3BwZXI6IENyb3BwZXJDb21wb25lbnQ7XHJcbiAgaW1nVXJsID0gbnVsbDtcclxuICBjb25maWcgPSBudWxsO1xyXG4gIGltYWdlVXJsID0gJyc7XHJcbiAgaW1nd1VybCA9ICcnO1xyXG4gIEV2ZW50RmlsZTogYW55O1xyXG4gIG1kbFNhbXBsZUlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIGNvbnRyb2xVdGlsaXR5OiBDb250cm9sVXRpbGl0eSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBQcm9maWxlSW1hZ2VVcGxvYWRlckNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgICBwdWJsaWMgVXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZ2xvYmFsU2V0dGluZ3M6IEdsb2JhbFNldHRpbmdzXHJcbiAgKSB7XHJcbiAgICBQcm9maWxlSW1hZ2VVcGxvYWRlckNvbXBvbmVudC5jb250cm9sQ29udGFpbmVyc3RhdGljID1cclxuICAgICAgdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gICAgdGhpcy51cGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoPEZpbGVVcGxvYWRlck9wdGlvbnM+e1xyXG4gICAgICBkaXNhYmxlTXVsdGlwYXJ0OiBmYWxzZSwgLy8gJ0Rpc2FibGVNdWx0aXBhcnQnIG11c3QgYmUgJ3RydWUnIGZvciBmb3JtYXREYXRhRnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmhhc0Fub3RoZXJEcm9wWm9uZU92ZXIgPSBmYWxzZTtcclxuICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8gPSBuZXcgUHJvZmlsZVBpY3R1cmVEVE8oKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuaXNDcmVhdGVkQmVmb3IgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5WaWV3VHlwZSlcclxuICAgICAgdGhpcy5vcHRpb25zLlZpZXdUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5WaWV3VHlwZTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5EZWZhdWx0SW1hZ2VTcmMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuRGVmYXVsdEltYWdlU3JjICE9ICcnXHJcbiAgICApXHJcbiAgICAgIHRoaXMuSW1hZ2VTb3VyY2UgPSB0aGlzLm9wdGlvbnMuRGVmYXVsdEltYWdlU3JjO1xyXG5cclxuICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICBhc3BlY3RSYXRpbzogMjAwIC8gMjAwLFxyXG4gICAgICBkcmFnTW9kZTogJ21vdmUnLFxyXG4gICAgICBiYWNrZ3JvdW5kOiB0cnVlLFxyXG4gICAgICBtb3ZhYmxlOiB0cnVlLFxyXG4gICAgICByb3RhdGFibGU6IHRydWUsXHJcbiAgICAgIHNjYWxhYmxlOiB0cnVlLFxyXG4gICAgICB6b29tYWJsZTogdHJ1ZSxcclxuICAgICAgdmlld01vZGU6IDEsXHJcbiAgICAgIGNoZWNrSW1hZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICBjaGVja0Nyb3NzT3JpZ2luOiBmYWxzZSxcclxuICAgICAgY3JvcEJveFJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgIGF1dG9Dcm9wOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5WYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBpbWdVUkwgPSB0aGlzLm9wdGlvbnMuVmFsdWVbJ2ZpbGVVUkwnXTtcclxuICAgICAgaWYgKGltZ1VSTCAhPSAnJyAmJiBpbWdVUkwgIT0gdW5kZWZpbmVkICYmIGltZ1VSTCAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuSW1hZ2VTb3VyY2UgPSBpbWdVUkw7XHJcblxyXG4gICAgICBsZXQgZWxlbWVudCA9IHRoaXMub3B0aW9ucy5WYWx1ZTtcclxuICAgICAgdGhpcy5GaWxlTGlrZU9iamVjdCA9IDxGaWxlTGlrZU9iamVjdD57XHJcbiAgICAgICAgbmFtZTogZWxlbWVudC5GaWxlTmFtZVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW3RoaXMuRmlsZUxpa2VPYmplY3QgYXMgYW55XSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSAnJylcclxuICAgICAgdGhpcy5vcHRpb25zLkxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLkxhYmVsS2V5XHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBpbmRleCA8IHRoaXMub3B0aW9ucy5JbWFnZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGg7XHJcbiAgICAgICAgaW5kZXgrK1xyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBUeXBlID0gdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzW2luZGV4XTtcclxuICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZSA9XHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZS50b1VwcGVyQ2FzZSgpICsgVHlwZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkgPSB0aGlzLkFjY2VwdGVkVHlwZS5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5BY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5BY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgY29uc3QgVHlwZVRvb2xUaXBlID0gZWxlbWVudC5zcGxpdCgnLycpWzFdO1xyXG4gICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKFR5cGVUb29sVGlwZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0FsbG93ZWRUeXBlcycpICtcclxuICAgICAgICBgICgke3RoaXMuVG9vbFRpcFR5cGVBcnJheX0pIGA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiA+IDApIHtcclxuICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSArXHJcbiAgICAgICAgYCA8YnIgLz4gJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0ZpbGVNYXhTaXplSW5NQicpfSAke3RoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUJcclxuICAgICAgICB9YDtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXNhc3luY1xyXG4gICAgKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZGVyQ29udHJvbEhvc3QubmdTdWJtaXQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0W2luZGV4XS5LZXksXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0udmFsdWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93SW1hZ2VVcGxvYWRlcihlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgbGV0IGlucHV0ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgJ2lucHV0W3R5cGU9ZmlsZV0nXHJcbiAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaW5wdXQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5yZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH07XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvclZhbGlkYXRpb24oRXJyb3JMaXN0KSB7XHJcbiAgICBpZiAodGhpcy5tYXJrQWxsQXNUb3VjaGVkICYmIHRoaXMuZ3JvdXAuaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnNob3dHbG9iYWxFcnJvcigpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKFxyXG4gICAgICBFcnJvckxpc3QsXHJcbiAgICAgIHRoaXMuZ3JvdXAsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uRmlsZUNoYW5nZShldmVudCkge1xyXG4gICAgaWYgKGV2ZW50LnJlamVjdGVkRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlID0gZXZlbnQucmVqZWN0ZWRGaWxlc1swXTtcclxuICAgICAgY29uc3QgbWF4RmlsZVNpemUgPSB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICogMTAwMCAqIDEwMDA7XHJcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xyXG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgIEZpbGVNYXhTaXplSW5NQjogdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiArICdNJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLkltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMuSW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICEoXHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvVXBwZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgICB0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgVG9vbFRpcFR5cGVFcnJvcjogdGhpcy5Ub29sVGlwVHlwZUFycmF5IH0pO1xyXG4gICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgRmlsZXNBcnJheSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5hZGRlZEZpbGVzWzBdO1xyXG4gICAgICB0aGlzLkV2ZW50RmlsZSA9IGZpbGU7XHJcbiAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICAgIGNvbnN0IGZpbGVUeXBlID0gZmlsZS50eXBlO1xyXG4gICAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhGaWxlU2l6ZSkge1xyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgICAgRmlsZU1heFNpemVJbk1COiB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICsgJ00nLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIGxldCBGaWxlT2JqZWN0ID0gZmlsZTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChGaWxlT2JqZWN0KTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pbWFnZVVybCA9IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICAgIHRoaXMub3Blbk1vZGFsKHRydWUpO1xyXG4gICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkudmFsdWU7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uICYmXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaFBhdGggJiZcclxuICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbGlkXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXRjaENvbnRyb2xWYWx1ZShcclxuICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5QYXRjaFBhdGhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLlZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcclxuICAgICAgICAgIHRoaXMuT25DaGFuZ2UuZW1pdChvcmlnaW5hbFZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZUZyb21Db250cm9sVmFsdWUoZXZlbnQpIHtcclxuICAgIGxldCBJdGVtTGlzdCA9IHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS52YWx1ZTtcclxuICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihldmVudCksIDEpO1xyXG4gICAgSXRlbUxpc3QgPSBbXTtcclxuICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA9PSAwICYmIHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEVycm9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnNldFZhbHVlKEl0ZW1MaXN0KTtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdCh0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkudmFsdWUpO1xyXG4gICAgdGhpcy5vcHRpb25zLlZhbHVlID0gdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlO1xyXG4gIH1cclxuICBjcm9wSW1hZ2UoKSB7XHJcbiAgICB0aGlzLlByb2ZpbGVQaWN0dXJlRFRPLkZpbGVOYW1lID0gdGhpcy5FdmVudEZpbGUubmFtZTtcclxuICAgIGxldCBDcm9wcGVyID0gdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyO1xyXG4gICAgbGV0IHByb2ZpbGVQaWN0dXJDcm9wcGVyID0gQ3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IDQwMCxcclxuICAgICAgaGVpZ2h0OiA0MDAsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgfSk7XHJcbiAgICBsZXQgQXZhdGFyUGljdHVyZUNyb3BwZXIgPSBDcm9wcGVyLmdldENyb3BwZWRDYW52YXMoe1xyXG4gICAgICB3aWR0aDogMTAwLFxyXG4gICAgICBoZWlnaHQ6IDEwMCxcclxuICAgICAgaW1hZ2VTbW9vdGhpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgICAgaW1hZ2VTbW9vdGhpbmdRdWFsaXR5OiAnaGlnaCcsXHJcbiAgICB9KTtcclxuICAgIGxldCBPcmlnaW5hbFBpY3R1cmVDcm9wcGVyID0gQ3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IDcwMCxcclxuICAgICAgaGVpZ2h0OiA3MDAsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgfSk7XHJcbiAgICBwcm9maWxlUGljdHVyQ3JvcHBlci50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCAncHJvZmlsZVBpY3R1ckNyb3BwZXInKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIEF2YXRhclBpY3R1cmVDcm9wcGVyLnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmdldFByb2ZpbGVJbWFnZUJsb2JGaWxlKGJsb2IsICdBdmF0YXJQaWN0dXJlQ3JvcHBlcicpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgT3JpZ2luYWxQaWN0dXJlQ3JvcHBlci50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCAnT3JpZ2luYWxQaWN0dXJlQ3JvcHBlcicpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmlsZXMgPSBbXTtcclxuXHJcbiAgICB0aGlzLm9wZW5Nb2RhbChmYWxzZSk7XHJcbiAgfVxyXG4gIGdldFByb2ZpbGVJbWFnZUJsb2JGaWxlKGJsb2IsIHR5cGUpIHtcclxuICAgIGxldCBGaWxlc0FycmF5ID0gW107XHJcbiAgICBsZXQgQmxvYkZpbGU7XHJcbiAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIEJsb2JGaWxlID0gYmxvYjtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKEJsb2JGaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGxldCBGaWxlT2JqZWN0OiBGaWxlRFRPO1xyXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlICdwcm9maWxlUGljdHVyQ3JvcHBlcic6XHJcbiAgICAgICAgICBCbG9iRmlsZS5uYW1lID0gdGhpcy5FdmVudEZpbGUubmFtZSArICdNZWRpdW1QaWN0dXJlJztcclxuICAgICAgICAgIEZpbGVPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIEZpbGVOYW1lOiB0aGlzLkV2ZW50RmlsZS5uYW1lICsgJ01lZGl1bVBpY3R1cmUnLFxyXG4gICAgICAgICAgICBGaWxlVHlwZTogdGhpcy5FdmVudEZpbGUudHlwZSxcclxuICAgICAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgIEZpbGVTaXplSW5NQjogQmxvYkZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8ucHJvZmlsZVBpY3R1cmUgPSBGaWxlT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5NZWRpdW1QaWN0dXJlID1cclxuICAgICAgICAgICAgRmlsZU9iamVjdC5GaWxlTmFtZSArICcsJyArIEZpbGVPYmplY3QuRmlsZUJhc2U2NDtcclxuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChCbG9iRmlsZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdBdmF0YXJQaWN0dXJlQ3JvcHBlcic6XHJcbiAgICAgICAgICBGaWxlT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogdGhpcy5FdmVudEZpbGUubmFtZSArICdTbWFsbFBpY3R1cmUnLFxyXG4gICAgICAgICAgICBGaWxlVHlwZTogdGhpcy5FdmVudEZpbGUudHlwZSxcclxuICAgICAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgIEZpbGVTaXplSW5NQjogQmxvYkZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuUHJvZmlsZVBpY3R1cmVEVE8uQXZhdGFyUGljdHVyZSA9IEZpbGVPYmplY3Q7XHJcbiAgICAgICAgICB0aGlzLlByb2ZpbGVQaWN0dXJlRFRPLlNtYWxsUGljdHVyZSA9XHJcbiAgICAgICAgICAgIEZpbGVPYmplY3QuRmlsZU5hbWUgKyAnLCcgKyBGaWxlT2JqZWN0LkZpbGVCYXNlNjQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnT3JpZ2luYWxQaWN0dXJlQ3JvcHBlcic6XHJcbiAgICAgICAgICBGaWxlT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogdGhpcy5FdmVudEZpbGUubmFtZSArICdPcmlnaW5hbCcsXHJcbiAgICAgICAgICAgIEZpbGVUeXBlOiB0aGlzLkV2ZW50RmlsZS50eXBlLFxyXG4gICAgICAgICAgICBGaWxlQmFzZTY0OiByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSxcclxuICAgICAgICAgICAgRmlsZVNpemVJbk1COiBCbG9iRmlsZS5zaXplIC8gMTAwMCAvIDEwMDAsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5PcmlnaW5hbFBpY3R1cmUgPSBGaWxlT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5Qcm9maWxlUGljdHVyZURUTy5PcmlnaW5hbCA9XHJcbiAgICAgICAgICAgIEZpbGVPYmplY3QuRmlsZU5hbWUgKyAnLCcgKyBGaWxlT2JqZWN0LkZpbGVCYXNlNjQ7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUodGhpcy5Qcm9maWxlUGljdHVyZURUTyk7XHJcbiAgICAgICAgICB0aGlzLk9uQ2hhbmdlLmVtaXQodGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IHRoaXMuUHJvZmlsZVBpY3R1cmVEVE87XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcm90YXRlSW1hZ2UoZGVncmVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5yb3RhdGUoZGVncmVlKTtcclxuICB9XHJcbiAgbW92ZUltYWdlKG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIubW92ZShvZmZzZXRYLCBvZmZzZXRZKTtcclxuICB9XHJcbiAgem9vbUltYWdlKHJhdGlvOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKHJhdGlvKTtcclxuICB9XHJcblxyXG4gIG9wZW5Nb2RhbChvcGVuOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLm1kbFNhbXBsZUlzT3BlbiA9IG9wZW47XHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIFJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLFxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcyxcclxuICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZFJlcXVpcmVkVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZUN1c3RvbVZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMuUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICBDdXN0b21WYWxpZGF0aW9uXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkQ3VzdG9tVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIEN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIElzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LklzVmFsaWQodGhpcy5Qcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCk7XHJcbiAgfTtcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBiYnNmLWNvbnRyb2wgYmJzZi1wcm9maWxlLWltYWdlLXVwbG9hZFwiIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cIihvcHRpb25zLlZpZXdUeXBlPT0xKT8nYmJzZi12ZXJ0aWNhbCc6J2Jic2YtaG9yaXpvbnRhbCdcIj5cclxuICAgIDwhLS1sYWJlbC0tPlxyXG4gICAgPGxhYmVsIFtoaWRkZW5dPVwib3B0aW9ucy5IaWRlTGFiZWxcIiBjbGFzcz1cImJic2YtbGFiZWwge3tvcHRpb25zLkxhYmVsRXh0cmFDbGFzc2VzfX1cIj5cclxuICAgICAge3tvcHRpb25zLkxhYmVsVmFsdWV9fVxyXG4gICAgICA8IS0tQXN0ZXJpc2stLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIoKG9wdGlvbnMuU2hvd0FzdGVyaXNrJiZvcHRpb25zLklzUmVxdWlyZWQpfHwob3B0aW9ucy5Jc1JlcXVpcmVkKSkmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8IS0tQWxsb3cgZHJvcFpvbmUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLkFsbG93RHJvcFpvbmUmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyIHt7b3B0aW9ucy5FeHRyYUNsYXNzZXN9fVwiIG5neC1kcm9wem9uZVxyXG4gICAgICBbZGlzYWJsZWRdPVwib3B0aW9ucy5Jc0Rpc2FibGVkXCIgW2FjY2VwdF09XCJBY2NlcHRlZFR5cGVcIiAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCIgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCIgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXHJcbiAgICAgIG5nRGVmYXVsdENvbnRyb2wgZm9ybUNvbnRyb2xOYW1lPVwie3tvcHRpb25zLk5hbWV9fVwiIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cIlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWxhYmVsIGNsYXNzPVwiZHJvcHpvbmUtbGFiZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ZnLWFuZC12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7XCI+XHJcbiAgICAgICAgICAgIDxwYXRoIG9wYWNpdHk9XCIwLjNcIlxyXG4gICAgICAgICAgICAgIGQ9XCJNNSAxNkMzLjMgMTYgMiAxNC43IDIgMTNDMiAxMS4zIDMuMyAxMCA1IDEwSDUuMUM1IDkuNyA1IDkuMyA1IDlDNSA2LjIgNy4yIDQgMTAgNEMxMS45IDQgMTMuNSA1IDE0LjMgNi41QzE0LjggNi4yIDE1LjQgNiAxNiA2QzE3LjcgNiAxOSA3LjMgMTkgOUMxOSA5LjQgMTguOSA5LjcgMTguOCAxMEMxOC45IDEwIDE4LjkgMTAgMTkgMTBDMjAuNyAxMCAyMiAxMS4zIDIyIDEzQzIyIDE0LjcgMjAuNyAxNiAxOSAxNkg1Wk04IDEzLjZIMTZMMTIuNyAxMC4zQzEyLjMgOS44OTk5OSAxMS43IDkuODk5OTkgMTEuMyAxMC4zTDggMTMuNlpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHlsZT1cImZpbGw6ICNhMWExYTE7XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDEzLjZWMTlDMTEgMTkuNiAxMS40IDIwIDEyIDIwQzEyLjYgMjAgMTMgMTkuNiAxMyAxOVYxMy42SDExWlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHlsZT1cImZpbGw6ICM5ODk4OTg7XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8IS0tVmFsaWRhdGlvbiB0ZXh0LS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZ1wiICpuZ0lmPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIiBbaW5uZXJIVE1MXT1cIlZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmd4LWRyb3B6b25lLWxhYmVsPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXcgY2xhc3M9XCJkcm9wem9uZS1wcmV2aWV3XCIgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNcIiBbZmlsZV09XCJmXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwicmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShmKVwiXHJcbiAgICAgICAgbmdQcm9qZWN0QXM9XCJuZ3gtZHJvcHpvbmUtcHJldmlld1wiPlxyXG4gICAgICA8L25neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tTm90IGFsbG93ZWQgZHJvcFpvbmUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCIhb3B0aW9ucy5BbGxvd0Ryb3Bab25lJiYhb3B0aW9ucy5Jc1JlYWRvbmx5XCIgc3R5bGU9XCJ3aWR0aDpmaXQtY29udGVudFwiPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiZmlsZXMubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgPGRpdiAjZWxlbWVudCAoY2xpY2spPVwic2hvd0ltYWdlVXBsb2FkZXIoZWxlbWVudClcIj5cclxuICAgICAgICAgIDxpbWcgW3NyY109XCJJbWFnZVNvdXJjZVwiIGNsYXNzPVwicHJvZmlsZS11cGxvYWQtaW1nXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUge3tvcHRpb25zLkV4dHJhQ2xhc3Nlc319XCIgbmd4LWRyb3B6b25lIFtkaXNhYmxlZF09XCJvcHRpb25zLklzRGlzYWJsZWRcIiBbYWNjZXB0XT1cIkFjY2VwdGVkVHlwZVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJlbWFpbC1lcnJvclwiIGFyaWEtaW52YWxpZD1cInRydWVcIiBuZ0RlZmF1bHRDb250cm9sIGZvcm1Db250cm9sTmFtZT1cInt7b3B0aW9ucy5OYW1lfX1cIlxyXG4gICAgICAgIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiIFtjbGFzcy5pcy1pbnZhbGlkXT1cIlByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3ICpuZ0Zvcj1cImxldCBmIG9mIGZpbGVzXCIgW2ZpbGVdPVwiZlwiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmVkKT1cInJlbW92ZUZyb21Db250cm9sVmFsdWUoZilcIlxyXG4gICAgICAgIG5nUHJvamVjdEFzPVwibmd4LWRyb3B6b25lLXByZXZpZXdcIj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldz5cclxuICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZ1wiICpuZ0lmPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIiBbaW5uZXJIVE1MXT1cIlZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiZmlsZXMubGVuZ3RoPT0wJiZvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgICAgPGRpdiAjZWxlbWVudD5cclxuICAgICAgICA8aW1nIFtzcmNdPVwiSW1hZ2VTb3VyY2VcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmd4LWRyb3B6b25lLWxhYmVsPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJzdWJ0ZXh0LWNvbnRhaW5lclwiICpuZ0lmPVwiIW9wdGlvbnMuSXNSZWFkb25seVwiPlxyXG4gICAgPCEtLSByZXF1aXJlZCB0ZXh0LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uXCIgKm5nSWY9XCIoUHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBQcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC50b3VjaGVkKVwiPlxyXG4gICAgICB7e2dldEVycm9yVmFsaWRhdGlvbihQcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5lcnJvcnN8a2V5dmFsdWUpfX1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gTGFiZWxEZXNjcmlwdGlvbi0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtY29udHJvbC1kZXNjXCIgKm5nSWY9XCJvcHRpb25zLkxhYmVsRGVzY3JpcHRpb24hPW51bGxcIj57e29wdGlvbnMuTGFiZWxEZXNjcmlwdGlvbn19PC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiKGdyb3VwLnZhbGlkJiZncm91cC5kaXJ0eSYmZ3JvdXAudG91Y2hlZCApfHwoZ3JvdXAudW50b3VjaGVkJiZncm91cC5pbnZhbGlkJiZncm91cC5kaXJ0eSkgXCI+e3tyZXNldEVycm9yKCl9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gaW1hZ2UgY3JvcHBlciBtb2RhbC0tPlxyXG4gIDxkaXYgaWQ9XCJtZGxTYW1wbGVcIiBjbGFzcz1cIm1vZGFsIGJic2YtY3JvcHBlci1tb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiBtZGxTYW1wbGVJc09wZW4gPyAnYmxvY2snIDogJ25vbmUnLCAnb3BhY2l0eSc6IDF9XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5cclxuICAgICAgICAgICAge3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ3JvcEltYWdlXCIpfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cIm9wZW5Nb2RhbChmYWxzZSlcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImltYWdlVXJsXCI+XHJcbiAgICAgICAgICAgIDxhbmd1bGFyLWNyb3BwZXIgI2FuZ3VsYXJDcm9wcGVyIFtjcm9wcGVyT3B0aW9uc109XCJjb25maWdcIiBbaW1hZ2VVcmxdPVwiaW1hZ2VVcmxcIj5cclxuICAgICAgICAgICAgPC9hbmd1bGFyLWNyb3BwZXI+XHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWd3VXJsXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyb3BwZXItYnRuc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInpvb21JbWFnZSgwLjEpXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiWm9vbSBpblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1zZWFyY2gtcGx1c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiem9vbUltYWdlKC0wLjEpXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiWm9vbSBvdXRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2VhcmNoLW1pbnVzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtb3ZlSW1hZ2UoLTEwLDApXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiTW92ZSBsZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LWxlZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vdmVJbWFnZSgxMCwwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIk1vdmUgcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYXJyb3ctcmlnaHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vdmVJbWFnZSgwLC0xMClcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJNb3ZlIHVwXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LXVwXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJtb3ZlSW1hZ2UoMCwxMClcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJNb3ZlIGRvd25cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicm90YXRlSW1hZ2UoLTQ1KVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIlJvdGF0ZSBsZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXVuZG8tYWx0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyb3RhdGVJbWFnZSg0NSlcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJSb3RhdGUgcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcmVkby1hbHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiYnRuQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0XCIgKGNsaWNrKT1cIm9wZW5Nb2RhbChmYWxzZSlcIj5cclxuICAgICAgICAgICAge3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY3JvcEltYWdlKClcIiBpZD1cImJ0bk9LXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1icmFuZFwiPlxyXG4gICAgICAgICAgICB7e1V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDcm9wXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZmlsZUltYWdlVXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL1Byb2ZpbGVJbWFnZVVwbG9hZGVyL1Byb2ZpbGVJbWFnZVVwbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9Qcm9maWxlSW1hZ2VVcGxvYWRlci9Qcm9maWxlSW1hZ2VVcGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFDWCxVQUFVLEdBS1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUF1QyxNQUFNLGlCQUFpQixDQUFDO0FBSXBGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7OztBQVkxRSxNQUFNLE9BQU8sNkJBQTZCO2FBQ2pDLDJCQUFzQixHQUFHLElBQUksQUFBUCxDQUFRO0lBZ0NyQyxZQUNVLElBQVksRUFDWixjQUE4QixFQUNsQixnQkFBa0MsRUFDL0MsK0JBQW1ELEVBQ25ELGNBQThCLEVBQzdCLHdCQUFrRCxFQUNsRCxjQUE4QjtRQU45QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDL0Msb0NBQStCLEdBQS9CLCtCQUErQixDQUFvQjtRQUNuRCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDN0IsNkJBQXdCLEdBQXhCLHdCQUF3QixD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QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxTQUFTLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFhO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7OEdBNVlVLDZCQUE2QjtrR0FBN0IsNkJBQTZCLCtWQ3BDMUMsMG1RQTRJTTs7MkZEeEdPLDZCQUE2QjtrQkFKekMsU0FBUzsrQkFDRSwyQkFBMkI7OzBCQXVDbEMsUUFBUTsyS0FqQ2dDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJaEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQWNBLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIE5nWm9uZSxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Db250cm9sLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBDb250cm9sQ29udGFpbmVyLFxyXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyLCBGaWxlTGlrZU9iamVjdCwgRmlsZVVwbG9hZGVyT3B0aW9ucyB9IGZyb20gJ25nMi1maWxlLXVwbG9hZCc7XHJcbmltcG9ydCB7IEZpbGVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVEVE8nO1xyXG5pbXBvcnQgeyBDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhci1jcm9wcGVyanMnO1xyXG5pbXBvcnQgeyBQcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9Qcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zJztcclxuaW1wb3J0IHsgUHJvZmlsZVBpY3R1cmVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL1Byb2ZpbGVQaWN0dXJlRFRPJztcclxuaW1wb3J0IHtcclxuICBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgVXRpbGl0eVNlcnZpY2UsXHJcbn0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvR2xvYmFsU2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1Qcm9maWxlSW1hZ2VVcGxvYWRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL1Byb2ZpbGVJbWFnZVVwbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2ZpbGVJbWFnZVVwbG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBzdGF0aWMgY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IG51bGw7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcbiAgZmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gIGltYWdlU291cmNlOiBzdHJpbmcgPSAnLi9zcmMvYXNzZXRzL2ltYWdlcy91c2VyLnN2Zyc7XHJcbiAgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBQcm9maWxlSW1hZ2VVcGxvYWRPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBwcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIHZhbGlkYXRpb25NZXNzYWdlID0gJyc7XHJcbiAgdXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBoYXNBbm90aGVyRHJvcFpvbmVPdmVyOiBib29sZWFuO1xyXG4gIGFjY2VwdGVkVHlwZTogc3RyaW5nID0gJyc7XHJcbiAgYWNjZXB0ZWRUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgdG9vbFRpcFR5cGVBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBmaWxlTGlrZU9iamVjdDogRmlsZUxpa2VPYmplY3Q7XHJcbiAgcHJvZmlsZVBpY3R1cmVEVE86IFByb2ZpbGVQaWN0dXJlRFRPO1xyXG4gIGNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYW5ndWxhckNyb3BwZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBwdWJsaWMgYW5ndWxhckNyb3BwZXI6IENyb3BwZXJDb21wb25lbnQ7XHJcbiAgaW1nVXJsID0gbnVsbDtcclxuICBjb25maWcgPSBudWxsO1xyXG4gIGltYWdlVXJsID0gJyc7XHJcbiAgaW1nd1VybCA9ICcnO1xyXG4gIEV2ZW50RmlsZTogYW55O1xyXG4gIG1kbFNhbXBsZUlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIGNvbnRyb2xVdGlsaXR5OiBDb250cm9sVXRpbGl0eSxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBwcm9maWxlSW1hZ2VVcGxvYWRlckNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgICBwdWJsaWMgdXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZ2xvYmFsU2V0dGluZ3M6IEdsb2JhbFNldHRpbmdzXHJcbiAgKSB7XHJcbiAgICBQcm9maWxlSW1hZ2VVcGxvYWRlckNvbXBvbmVudC5jb250cm9sQ29udGFpbmVyc3RhdGljID1cclxuICAgICAgdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gICAgdGhpcy51cGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoPEZpbGVVcGxvYWRlck9wdGlvbnM+e1xyXG4gICAgICBkaXNhYmxlTXVsdGlwYXJ0OiBmYWxzZSwgLy8gJ0Rpc2FibGVNdWx0aXBhcnQnIG11c3QgYmUgJ3RydWUnIGZvciBmb3JtYXREYXRhRnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmhhc0Fub3RoZXJEcm9wWm9uZU92ZXIgPSBmYWxzZTtcclxuICAgIHRoaXMucHJvZmlsZVBpY3R1cmVEVE8gPSBuZXcgUHJvZmlsZVBpY3R1cmVEVE8oKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuaXNDcmVhdGVkQmVmb3IgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy52aWV3VHlwZSlcclxuICAgICAgdGhpcy5vcHRpb25zLnZpZXdUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy52aWV3VHlwZTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5kZWZhdWx0SW1hZ2VTcmMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuZGVmYXVsdEltYWdlU3JjICE9ICcnXHJcbiAgICApXHJcbiAgICAgIHRoaXMuaW1hZ2VTb3VyY2UgPSB0aGlzLm9wdGlvbnMuZGVmYXVsdEltYWdlU3JjO1xyXG5cclxuICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICBhc3BlY3RSYXRpbzogMjAwIC8gMjAwLFxyXG4gICAgICBkcmFnTW9kZTogJ21vdmUnLFxyXG4gICAgICBiYWNrZ3JvdW5kOiB0cnVlLFxyXG4gICAgICBtb3ZhYmxlOiB0cnVlLFxyXG4gICAgICByb3RhdGFibGU6IHRydWUsXHJcbiAgICAgIHNjYWxhYmxlOiB0cnVlLFxyXG4gICAgICB6b29tYWJsZTogdHJ1ZSxcclxuICAgICAgdmlld01vZGU6IDEsXHJcbiAgICAgIGNoZWNrSW1hZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICBjaGVja0Nyb3NzT3JpZ2luOiBmYWxzZSxcclxuICAgICAgY3JvcEJveFJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgIGF1dG9Dcm9wOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmltYWdlVXBsb2FkQWNjZXB0c1R5cGVzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy52YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBpbWdVUkwgPSB0aGlzLm9wdGlvbnMudmFsdWVbJ2ZpbGVVUkwnXTtcclxuICAgICAgaWYgKGltZ1VSTCAhPSAnJyAmJiBpbWdVUkwgIT0gdW5kZWZpbmVkICYmIGltZ1VSTCAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuaW1hZ2VTb3VyY2UgPSBpbWdVUkw7XHJcblxyXG4gICAgICBsZXQgZWxlbWVudCA9IHRoaXMub3B0aW9ucy52YWx1ZTtcclxuICAgICAgdGhpcy5maWxlTGlrZU9iamVjdCA9IDxGaWxlTGlrZU9iamVjdD57XHJcbiAgICAgICAgbmFtZTogZWxlbWVudC5maWxlTmFtZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy51cGxvYWRlci5hZGRUb1F1ZXVlKFt0aGlzLmZpbGVMaWtlT2JqZWN0IGFzIGFueV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubGFiZWxLZXkgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMubGFiZWxLZXkgIT0gJycpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5sYWJlbFZhbHVlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbEtleVxyXG4gICAgICApO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLmltYWdlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLmltYWdlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBmb3IgKFxyXG4gICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgaW5kZXggPCB0aGlzLm9wdGlvbnMuaW1hZ2VVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoO1xyXG4gICAgICAgIGluZGV4KytcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgVHlwZSA9IHRoaXMub3B0aW9ucy5pbWFnZVVwbG9hZEFjY2VwdHNUeXBlc1tpbmRleF07XHJcbiAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGUgPVxyXG4gICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGUudG9VcHBlckNhc2UoKSArIFR5cGUudG9VcHBlckNhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFjY2VwdGVkVHlwZUFycmF5ID0gdGhpcy5hY2NlcHRlZFR5cGUuc3BsaXQoJywnKTtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYWNjZXB0ZWRUeXBlQXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuYWNjZXB0ZWRUeXBlQXJyYXlbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IFR5cGVUb29sVGlwZSA9IGVsZW1lbnQuc3BsaXQoJy8nKVsxXTtcclxuICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaChUeXBlVG9vbFRpcGUudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSArXHJcbiAgICAgICAgdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdBbGxvd2VkVHlwZXMnKSArXHJcbiAgICAgICAgYCAoJHt0aGlzLnRvb2xUaXBUeXBlQXJyYXl9KSBgO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgPiAwKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPVxyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgK1xyXG4gICAgICAgIGAgPGJyIC8+ICR7dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdGaWxlTWF4U2l6ZUluTUInKX0gJHt0aGlzLm9wdGlvbnMuZmlsZU1heFNpemVJbk1CXHJcbiAgICAgICAgfWA7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pbWFnZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pbWFnZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMubmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLnByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sID0gdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMubmFtZV07IC8vICBuZXcgRm9ybUNvbnRyb2woJycsdmFsaWRhdGlvblJ1bGVzKTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbVZhbGlkYXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgVmFsaWRhdGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbjtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IFZhbGlkYXRpb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IFZhbGlkYXRpb24gPSBWYWxpZGF0aW9uc1tpbmRleF07XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0aW9uLmZ1bmN0aW9uQm9keSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5wcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnMoXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzYXN5bmNcclxuICAgICk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5wcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9maWxlSW1hZ2VVcGxvYWRlckNvbnRyb2xIb3N0Lm5nU3VibWl0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5ncm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25zLm5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlTGlzdFtpbmRleF0uS2V5LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3RbaW5kZXhdLnZhbHVlXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd0ltYWdlVXBsb2FkZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGxldCBpbnB1dCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICdpbnB1dFt0eXBlPWZpbGVdJ1xyXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICByZXNldEVycm9yID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UucmVtb3ZlR2xvYmFsRXJyb3IoKTtcclxuICB9O1xyXG5cclxuICBzaG93R2xvYmFsRXJyb3IoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnNob3dHbG9iYWxFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JWYWxpZGF0aW9uKEVycm9yTGlzdCkge1xyXG4gICAgaWYgKHRoaXMubWFya0FsbEFzVG91Y2hlZCAmJiB0aGlzLmdyb3VwLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93R2xvYmFsRXJyb3IoKTtcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbFV0aWxpdHkuZ2V0RXJyb3JWYWxpZGF0aW9uTWFzc2FnZShcclxuICAgICAgRXJyb3JMaXN0LFxyXG4gICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5yZWplY3RlZEZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LnJlamVjdGVkRmlsZXNbMF07XHJcbiAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLmZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGZpbGUudHlwZTtcclxuICAgICAgaWYgKGZpbGUuc2l6ZSA+IG1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLnByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICBGaWxlTWF4U2l6ZUluTUI6IHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgKyAnTScsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMudXBsb2FkZXIucXVldWUgPSBbXTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5pbWFnZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsICYmXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmltYWdlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAhKFxyXG4gICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVBcnJheS5pbmNsdWRlcyhmaWxlVHlwZS50b1VwcGVyQ2FzZSgpKSB8fFxyXG4gICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVBcnJheS5pbmNsdWRlcyhmaWxlVHlwZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLnByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7IFRvb2xUaXBUeXBlRXJyb3I6IHRoaXMudG9vbFRpcFR5cGVBcnJheSB9KTtcclxuICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IEZpbGVzQXJyYXkgPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBldmVudC5hZGRlZEZpbGVzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBmaWxlID0gZXZlbnQuYWRkZWRGaWxlc1swXTtcclxuICAgICAgdGhpcy5FdmVudEZpbGUgPSBmaWxlO1xyXG4gICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuICAgICAgICBjb25zdCBmaWxlVHlwZSA9IGZpbGUudHlwZTtcclxuICAgICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5wcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbDtcclxuICAgICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICAgIEZpbGVNYXhTaXplSW5NQjogdGhpcy5vcHRpb25zLmZpbGVNYXhTaXplSW5NQiArICdNJyxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICBsZXQgRmlsZU9iamVjdCA9IGZpbGU7XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoRmlsZU9iamVjdCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VVcmwgPSByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbCh0cnVlKTtcclxuICAgICAgICAgIGxldCBvcmlnaW5hbFZhbHVlID0gdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnZhbHVlO1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiAmJlxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0Y2hQYXRoICYmXHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS52YWxpZFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0Y2hDb250cm9sVmFsdWUoXHJcbiAgICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZSxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbixcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0Y2hQYXRoXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IG9yaWdpbmFsVmFsdWU7XHJcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQob3JpZ2luYWxWYWx1ZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZW1vdmVGcm9tQ29udHJvbFZhbHVlKGV2ZW50KSB7XHJcbiAgICBsZXQgSXRlbUxpc3QgPSB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMubmFtZSkudmFsdWU7XHJcbiAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZXZlbnQpLCAxKTtcclxuICAgIEl0ZW1MaXN0ID0gW107XHJcbiAgICBpZiAodGhpcy5maWxlcy5sZW5ndGggPT0gMCAmJiB0aGlzLm9wdGlvbnMuaXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgdGhpcy5wcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5zZXRFcnJvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIHRoaXMucHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZDtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS5zZXRWYWx1ZShJdGVtTGlzdCk7XHJcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnZhbHVlKTtcclxuICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS52YWx1ZTtcclxuICB9XHJcbiAgY3JvcEltYWdlKCkge1xyXG4gICAgdGhpcy5wcm9maWxlUGljdHVyZURUTy5maWxlTmFtZSA9IHRoaXMuRXZlbnRGaWxlLm5hbWU7XHJcbiAgICBsZXQgQ3JvcHBlciA9IHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlcjtcclxuICAgIGxldCBwcm9maWxlUGljdHVyQ3JvcHBlciA9IENyb3BwZXIuZ2V0Q3JvcHBlZENhbnZhcyh7XHJcbiAgICAgIHdpZHRoOiA0MDAsXHJcbiAgICAgIGhlaWdodDogNDAwLFxyXG4gICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBpbWFnZVNtb290aGluZ1F1YWxpdHk6ICdoaWdoJyxcclxuICAgIH0pO1xyXG4gICAgbGV0IEF2YXRhclBpY3R1cmVDcm9wcGVyID0gQ3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IDEwMCxcclxuICAgICAgaGVpZ2h0OiAxMDAsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgfSk7XHJcbiAgICBsZXQgT3JpZ2luYWxQaWN0dXJlQ3JvcHBlciA9IENyb3BwZXIuZ2V0Q3JvcHBlZENhbnZhcyh7XHJcbiAgICAgIHdpZHRoOiA3MDAsXHJcbiAgICAgIGhlaWdodDogNzAwLFxyXG4gICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBpbWFnZVNtb290aGluZ1F1YWxpdHk6ICdoaWdoJyxcclxuICAgIH0pO1xyXG4gICAgcHJvZmlsZVBpY3R1ckNyb3BwZXIudG9CbG9iKChibG9iKSA9PiB7XHJcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2V0UHJvZmlsZUltYWdlQmxvYkZpbGUoYmxvYiwgJ3Byb2ZpbGVQaWN0dXJDcm9wcGVyJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBBdmF0YXJQaWN0dXJlQ3JvcHBlci50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCAnQXZhdGFyUGljdHVyZUNyb3BwZXInKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIE9yaWdpbmFsUGljdHVyZUNyb3BwZXIudG9CbG9iKChibG9iKSA9PiB7XHJcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2V0UHJvZmlsZUltYWdlQmxvYkZpbGUoYmxvYiwgJ09yaWdpbmFsUGljdHVyZUNyb3BwZXInKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpbGVzID0gW107XHJcblxyXG4gICAgdGhpcy5vcGVuTW9kYWwoZmFsc2UpO1xyXG4gIH1cclxuICBnZXRQcm9maWxlSW1hZ2VCbG9iRmlsZShibG9iLCB0eXBlKSB7XHJcbiAgICBsZXQgRmlsZXNBcnJheSA9IFtdO1xyXG4gICAgbGV0IEJsb2JGaWxlO1xyXG4gICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICBCbG9iRmlsZSA9IGJsb2I7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChCbG9iRmlsZSk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBsZXQgRmlsZU9iamVjdDogRmlsZURUTztcclxuICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAncHJvZmlsZVBpY3R1ckNyb3BwZXInOlxyXG4gICAgICAgICAgQmxvYkZpbGUubmFtZSA9IHRoaXMuRXZlbnRGaWxlLm5hbWUgKyAnTWVkaXVtUGljdHVyZSc7XHJcbiAgICAgICAgICBGaWxlT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICBGaWxlTmFtZTogdGhpcy5FdmVudEZpbGUubmFtZSArICdNZWRpdW1QaWN0dXJlJyxcclxuICAgICAgICAgICAgRmlsZVR5cGU6IHRoaXMuRXZlbnRGaWxlLnR5cGUsXHJcbiAgICAgICAgICAgIEZpbGVCYXNlNjQ6IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdLFxyXG4gICAgICAgICAgICBGaWxlU2l6ZUluTUI6IEJsb2JGaWxlLnNpemUgLyAxMDAwIC8gMTAwMCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnByb2ZpbGVQaWN0dXJlRFRPLnByb2ZpbGVQaWN0dXJlID0gRmlsZU9iamVjdDtcclxuICAgICAgICAgIHRoaXMucHJvZmlsZVBpY3R1cmVEVE8ubWVkaXVtUGljdHVyZSA9XHJcbiAgICAgICAgICAgIEZpbGVPYmplY3QuRmlsZU5hbWUgKyAnLCcgKyBGaWxlT2JqZWN0LkZpbGVCYXNlNjQ7XHJcbiAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goQmxvYkZpbGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnQXZhdGFyUGljdHVyZUNyb3BwZXInOlxyXG4gICAgICAgICAgRmlsZU9iamVjdCA9IHtcclxuICAgICAgICAgICAgRmlsZU5hbWU6IHRoaXMuRXZlbnRGaWxlLm5hbWUgKyAnU21hbGxQaWN0dXJlJyxcclxuICAgICAgICAgICAgRmlsZVR5cGU6IHRoaXMuRXZlbnRGaWxlLnR5cGUsXHJcbiAgICAgICAgICAgIEZpbGVCYXNlNjQ6IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdLFxyXG4gICAgICAgICAgICBGaWxlU2l6ZUluTUI6IEJsb2JGaWxlLnNpemUgLyAxMDAwIC8gMTAwMCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnByb2ZpbGVQaWN0dXJlRFRPLmF2YXRhclBpY3R1cmUgPSBGaWxlT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5wcm9maWxlUGljdHVyZURUTy5zbWFsbFBpY3R1cmUgPVxyXG4gICAgICAgICAgICBGaWxlT2JqZWN0LkZpbGVOYW1lICsgJywnICsgRmlsZU9iamVjdC5GaWxlQmFzZTY0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ09yaWdpbmFsUGljdHVyZUNyb3BwZXInOlxyXG4gICAgICAgICAgRmlsZU9iamVjdCA9IHtcclxuICAgICAgICAgICAgRmlsZU5hbWU6IHRoaXMuRXZlbnRGaWxlLm5hbWUgKyAnT3JpZ2luYWwnLFxyXG4gICAgICAgICAgICBGaWxlVHlwZTogdGhpcy5FdmVudEZpbGUudHlwZSxcclxuICAgICAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgIEZpbGVTaXplSW5NQjogQmxvYkZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMucHJvZmlsZVBpY3R1cmVEVE8ub3JpZ2luYWxQaWN0dXJlID0gRmlsZU9iamVjdDtcclxuICAgICAgICAgIHRoaXMucHJvZmlsZVBpY3R1cmVEVE8ub3JpZ2luYWwgPVxyXG4gICAgICAgICAgICBGaWxlT2JqZWN0LkZpbGVOYW1lICsgJywnICsgRmlsZU9iamVjdC5GaWxlQmFzZTY0O1xyXG4gICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnNldFZhbHVlKHRoaXMucHJvZmlsZVBpY3R1cmVEVE8pO1xyXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLnByb2ZpbGVQaWN0dXJlRFRPO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZUltYWdlKGRlZ3JlZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIucm90YXRlKGRlZ3JlZSk7XHJcbiAgfVxyXG4gIG1vdmVJbWFnZShvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlcikge1xyXG4gICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLm1vdmUob2Zmc2V0WCwgb2Zmc2V0WSk7XHJcbiAgfVxyXG4gIHpvb21JbWFnZShyYXRpbzogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuem9vbShyYXRpbyk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwob3BlbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5tZGxTYW1wbGVJc09wZW4gPSBvcGVuO1xyXG4gIH1cclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICByZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5wcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgYWRkUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5hZGRSZXF1aXJlZFZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMucHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIHJlbW92ZUN1c3RvbVZhbGlkYXRpb24gPSAoY3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5yZW1vdmVDdXN0b21WYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLnByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLFxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcyxcclxuICAgICAgY3VzdG9tVmFsaWRhdGlvblxyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgYWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChjdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmFkZEN1c3RvbVZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMucHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICBjdXN0b21WYWxpZGF0aW9uXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBpc1ZhbGlkID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5pc1ZhbGlkKHRoaXMucHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wpO1xyXG4gIH07XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYmJzZi1jb250cm9sIGJic2YtcHJvZmlsZS1pbWFnZS11cGxvYWRcIiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XHJcbiAgPGRpdiBbbmdDbGFzc109XCIob3B0aW9ucy52aWV3VHlwZT09MSk/J2Jic2YtdmVydGljYWwnOidiYnNmLWhvcml6b250YWwnXCI+XHJcbiAgICA8IS0tbGFiZWwtLT5cclxuICAgIDxsYWJlbCBbaGlkZGVuXT1cIm9wdGlvbnMuaGlkZUxhYmVsXCIgY2xhc3M9XCJiYnNmLWxhYmVsIHt7b3B0aW9ucy5sYWJlbEV4dHJhQ2xhc3Nlc319XCI+XHJcbiAgICAgIHt7b3B0aW9ucy5sYWJlbFZhbHVlfX1cclxuICAgICAgPCEtLUFzdGVyaXNrLS0+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiKChvcHRpb25zLnNob3dBc3RlcmlzayYmb3B0aW9ucy5pc1JlcXVpcmVkKXx8KG9wdGlvbnMuaXNSZXF1aXJlZCkpJiYhb3B0aW9ucy5pc1JlYWRvbmx5XCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPCEtLUFsbG93IGRyb3Bab25lLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5hbGxvd0Ryb3Bab25lJiYhb3B0aW9ucy5pc1JlYWRvbmx5XCIgY2xhc3M9XCJiYnNmLWlucHV0LWNvbnRhaW5lciB7e29wdGlvbnMuZXh0cmFDbGFzc2VzfX1cIiBuZ3gtZHJvcHpvbmVcclxuICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbnMuaXNEaXNhYmxlZFwiIFthY2NlcHRdPVwiYWNjZXB0ZWRUeXBlXCIgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJlbWFpbC1lcnJvclwiIGFyaWEtaW52YWxpZD1cInRydWVcIlxyXG4gICAgICBuZ0RlZmF1bHRDb250cm9sIGZvcm1Db250cm9sTmFtZT1cInt7b3B0aW9ucy5uYW1lfX1cIiBpZD1cInt7b3B0aW9ucy5uYW1lfX1cIlxyXG4gICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJwcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkICYmIHByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnRvdWNoZWRcIj5cclxuICAgICAgPG5neC1kcm9wem9uZS1sYWJlbCBjbGFzcz1cImRyb3B6b25lLWxhYmVsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN2Zy1hbmQtdmFsaWRhdGlvblwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4O1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBvcGFjaXR5PVwiMC4zXCJcclxuICAgICAgICAgICAgICBkPVwiTTUgMTZDMy4zIDE2IDIgMTQuNyAyIDEzQzIgMTEuMyAzLjMgMTAgNSAxMEg1LjFDNSA5LjcgNSA5LjMgNSA5QzUgNi4yIDcuMiA0IDEwIDRDMTEuOSA0IDEzLjUgNSAxNC4zIDYuNUMxNC44IDYuMiAxNS40IDYgMTYgNkMxNy43IDYgMTkgNy4zIDE5IDlDMTkgOS40IDE4LjkgOS43IDE4LjggMTBDMTguOSAxMCAxOC45IDEwIDE5IDEwQzIwLjcgMTAgMjIgMTEuMyAyMiAxM0MyMiAxNC43IDIwLjcgMTYgMTkgMTZINVpNOCAxMy42SDE2TDEyLjcgMTAuM0MxMi4zIDkuODk5OTkgMTEuNyA5Ljg5OTk5IDExLjMgMTAuM0w4IDEzLjZaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjYTFhMWExO1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMSAxMy42VjE5QzExIDE5LjYgMTEuNCAyMCAxMiAyMEMxMi42IDIwIDEzIDE5LjYgMTMgMTlWMTMuNkgxMVpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjOTg5ODk4O1wiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2dcIiAqbmdJZj1cInZhbGlkYXRpb25NZXNzYWdlXCIgW2lubmVySFRNTF09XCJ2YWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cclxuICAgICAgPG5neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3IGNsYXNzPVwiZHJvcHpvbmUtcHJldmlld1wiICpuZ0Zvcj1cImxldCBmIG9mIGZpbGVzXCIgW2ZpbGVdPVwiZlwiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmVkKT1cInJlbW92ZUZyb21Db250cm9sVmFsdWUoZilcIlxyXG4gICAgICAgIG5nUHJvamVjdEFzPVwibmd4LWRyb3B6b25lLXByZXZpZXdcIj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldz5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLU5vdCBhbGxvd2VkIGRyb3Bab25lLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIW9wdGlvbnMuYWxsb3dEcm9wWm9uZSYmIW9wdGlvbnMuaXNSZWFkb25seVwiIHN0eWxlPVwid2lkdGg6Zml0LWNvbnRlbnRcIj5cclxuICAgICAgPG5neC1kcm9wem9uZS1sYWJlbCAqbmdJZj1cImZpbGVzLmxlbmd0aD09MFwiPlxyXG4gICAgICAgIDxkaXYgI2VsZW1lbnQgKGNsaWNrKT1cInNob3dJbWFnZVVwbG9hZGVyKGVsZW1lbnQpXCI+XHJcbiAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VTb3VyY2VcIiBjbGFzcz1cInByb2ZpbGUtdXBsb2FkLWltZ1wiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmd4LWRyb3B6b25lLWxhYmVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1ub25lIHt7b3B0aW9ucy5leHRyYUNsYXNzZXN9fVwiIG5neC1kcm9wem9uZSBbZGlzYWJsZWRdPVwib3B0aW9ucy5pc0Rpc2FibGVkXCIgW2FjY2VwdF09XCJhY2NlcHRlZFR5cGVcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIiBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgbmdEZWZhdWx0Q29udHJvbCBmb3JtQ29udHJvbE5hbWU9XCJ7e29wdGlvbnMubmFtZX19XCJcclxuICAgICAgICBpZD1cInt7b3B0aW9ucy5uYW1lfX1cIiBbY2xhc3MuaXMtaW52YWxpZF09XCJwcm9maWxlSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkICYmIHByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLnRvdWNoZWRcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldyAqbmdGb3I9XCJsZXQgZiBvZiBmaWxlc1wiIFtmaWxlXT1cImZcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlZCk9XCJyZW1vdmVGcm9tQ29udHJvbFZhbHVlKGYpXCJcclxuICAgICAgICBuZ1Byb2plY3RBcz1cIm5neC1kcm9wem9uZS1wcmV2aWV3XCI+XHJcbiAgICAgIDwvbmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXc+XHJcbiAgICAgIDwhLS1WYWxpZGF0aW9uIHRleHQtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2dcIiAqbmdJZj1cInZhbGlkYXRpb25NZXNzYWdlXCIgW2lubmVySFRNTF09XCJ2YWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5neC1kcm9wem9uZS1sYWJlbCAqbmdJZj1cImZpbGVzLmxlbmd0aD09MCYmb3B0aW9ucy5pc1JlYWRvbmx5XCI+XHJcbiAgICAgIDxkaXYgI2VsZW1lbnQ+XHJcbiAgICAgICAgPGltZyBbc3JjXT1cImltYWdlU291cmNlXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIj5cclxuICAgIDwhLS0gcmVxdWlyZWQgdGV4dC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvblwiICpuZ0lmPVwiKHByb2ZpbGVJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgcHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24ocHJvZmlsZUltYWdlVXBsb2FkRm9ybUNvbnRyb2wuZXJyb3JzfGtleXZhbHVlKX19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIExhYmVsRGVzY3JpcHRpb24tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiICpuZ0lmPVwib3B0aW9ucy5sYWJlbERlc2NyaXB0aW9uIT1udWxsXCI+e3tvcHRpb25zLmxhYmVsRGVzY3JpcHRpb259fTwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpIFwiPlxyXG4gICAgICB7e3Jlc2V0RXJyb3IoKX19PC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLSBpbWFnZSBjcm9wcGVyIG1vZGFsLS0+XHJcbiAgPGRpdiBpZD1cIm1kbFNhbXBsZVwiIGNsYXNzPVwibW9kYWwgYmJzZi1jcm9wcGVyLW1vZGFsXCIgcm9sZT1cImRpYWxvZ1wiIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6IG1kbFNhbXBsZUlzT3BlbiA/ICdibG9jaycgOiAnbm9uZScsICdvcGFjaXR5JzogMX1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxyXG4gICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDcm9wSW1hZ2VcIil9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwib3Blbk1vZGFsKGZhbHNlKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW1hZ2VVcmxcIj5cclxuICAgICAgICAgICAgPGFuZ3VsYXItY3JvcHBlciAjYW5ndWxhckNyb3BwZXIgW2Nyb3BwZXJPcHRpb25zXT1cImNvbmZpZ1wiIFtpbWFnZVVybF09XCJpbWFnZVVybFwiPlxyXG4gICAgICAgICAgICA8L2FuZ3VsYXItY3JvcHBlcj5cclxuICAgICAgICAgICAgPGltZyBbc3JjXT1cImltZ3dVcmxcIiAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3JvcHBlci1idG5zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiem9vbUltYWdlKDAuMSlcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJab29tIGluXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXNlYXJjaC1wbHVzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ6b29tSW1hZ2UoLTAuMSlcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJab29tIG91dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1zZWFyY2gtbWludXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vdmVJbWFnZSgtMTAsMClcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9XCJNb3ZlIGxlZnRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYXJyb3ctbGVmdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKDEwLDApXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiTW92ZSByaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy1yaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKDAsLTEwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIk1vdmUgdXBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vdmVJbWFnZSgwLDEwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIk1vdmUgZG93blwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyb3RhdGVJbWFnZSgtNDUpXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPVwiUm90YXRlIGxlZnRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdW5kby1hbHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJvdGF0ZUltYWdlKDQ1KVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD1cIlJvdGF0ZSByaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1yZWRvLWFsdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCIgYWxpZ249XCJyaWdodFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJidG5DbG9zZVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiAoY2xpY2spPVwib3Blbk1vZGFsKGZhbHNlKVwiPlxyXG4gICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDYW5jZWxMYWJlbFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjcm9wSW1hZ2UoKVwiIGlkPVwiYnRuT0tcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWJyYW5kXCI+XHJcbiAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNyb3BcIil9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==