@bnsights/bbsf-controls 1.0.194-beta.9 → 1.2.0

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 (159) hide show
  1. package/README.md +7 -0
  2. package/fesm2022/bnsights-bbsf-controls.mjs +375 -345
  3. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -1
  4. package/lib/Shared/Models/DropdownOptions.d.ts +3 -0
  5. package/lib/Shared/Models/RepeaterOptions.d.ts +2 -0
  6. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +0 -1
  7. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +0 -1
  8. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +1 -1
  9. package/lib/controls/Repeater/repeater/repeater.component.d.ts +7 -0
  10. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +7 -0
  11. package/lib/modules/bbsf-editors.module.d.ts +6 -7
  12. package/package.json +33 -36
  13. package/src/lib/assets/Style.scss +2 -0
  14. package/src/lib/assets/ace-builds/ace.js +1 -1
  15. package/src/lib/assets/ace-builds/mode-markdown.js +1 -1
  16. package/esm2022/bnsights-bbsf-controls.mjs +0 -5
  17. package/esm2022/lib/Shared/Components/app-base-component.mjs +0 -226
  18. package/esm2022/lib/Shared/Components/ng-tag-input.mjs +0 -336
  19. package/esm2022/lib/Shared/Directives/appPreventDoubleClick.directive.mjs +0 -39
  20. package/esm2022/lib/Shared/Directives/template-name.directive.mjs +0 -19
  21. package/esm2022/lib/Shared/Enums/CalendarView.mjs +0 -8
  22. package/esm2022/lib/Shared/Enums/ControlLayout.mjs +0 -6
  23. package/esm2022/lib/Shared/Enums/Countries.mjs +0 -247
  24. package/esm2022/lib/Shared/Enums/Enums.mjs +0 -36
  25. package/esm2022/lib/Shared/Enums/FileType.mjs +0 -29
  26. package/esm2022/lib/Shared/Enums/FilterType.mjs +0 -11
  27. package/esm2022/lib/Shared/Enums/FontSize.mjs +0 -7
  28. package/esm2022/lib/Shared/Enums/ForceDirection.mjs +0 -6
  29. package/esm2022/lib/Shared/Enums/IconPosition.mjs +0 -6
  30. package/esm2022/lib/Shared/Enums/ImageType.mjs +0 -10
  31. package/esm2022/lib/Shared/Enums/InputType.mjs +0 -10
  32. package/esm2022/lib/Shared/Enums/Insert.mjs +0 -9
  33. package/esm2022/lib/Shared/Enums/LanguageMode.mjs +0 -11
  34. package/esm2022/lib/Shared/Enums/LanguageValidation.mjs +0 -6
  35. package/esm2022/lib/Shared/Enums/Markdown.mjs +0 -20
  36. package/esm2022/lib/Shared/Enums/Misc.mjs +0 -7
  37. package/esm2022/lib/Shared/Enums/PagingActionMode.mjs +0 -6
  38. package/esm2022/lib/Shared/Enums/Para.mjs +0 -9
  39. package/esm2022/lib/Shared/Enums/PickerType.mjs +0 -7
  40. package/esm2022/lib/Shared/Enums/SelectMode.mjs +0 -6
  41. package/esm2022/lib/Shared/Enums/StartView.mjs +0 -7
  42. package/esm2022/lib/Shared/Enums/Style.mjs +0 -8
  43. package/esm2022/lib/Shared/Enums/StyleConfirmationMode.mjs +0 -7
  44. package/esm2022/lib/Shared/Enums/TagInputView.mjs +0 -7
  45. package/esm2022/lib/Shared/Enums/ToolbarButtons.mjs +0 -33
  46. package/esm2022/lib/Shared/Enums/map-enums.mjs +0 -15
  47. package/esm2022/lib/Shared/Enums/menu-list-enum.mjs +0 -6
  48. package/esm2022/lib/Shared/Models/Attribute.mjs +0 -3
  49. package/esm2022/lib/Shared/Models/AutocompleteDTO.mjs +0 -8
  50. package/esm2022/lib/Shared/Models/AutocompleteOptions.mjs +0 -39
  51. package/esm2022/lib/Shared/Models/CalendarDTO.mjs +0 -3
  52. package/esm2022/lib/Shared/Models/CalendarEventDTO.mjs +0 -3
  53. package/esm2022/lib/Shared/Models/CalendarOptions.mjs +0 -19
  54. package/esm2022/lib/Shared/Models/CancelDTO.mjs +0 -7
  55. package/esm2022/lib/Shared/Models/CaptchaStyle.mjs +0 -3
  56. package/esm2022/lib/Shared/Models/CheckBoxOptions.mjs +0 -11
  57. package/esm2022/lib/Shared/Models/ConfirmationModalOptions.mjs +0 -39
  58. package/esm2022/lib/Shared/Models/ControlOptionsBase.mjs +0 -17
  59. package/esm2022/lib/Shared/Models/CustomValidation.mjs +0 -14
  60. package/esm2022/lib/Shared/Models/DatePickerOptions.mjs +0 -40
  61. package/esm2022/lib/Shared/Models/DropdownListItem.mjs +0 -3
  62. package/esm2022/lib/Shared/Models/DropdownOptions.mjs +0 -38
  63. package/esm2022/lib/Shared/Models/EditPersonalImage.mjs +0 -7
  64. package/esm2022/lib/Shared/Models/EnglishArabicDTO.mjs +0 -10
  65. package/esm2022/lib/Shared/Models/FileDTO.mjs +0 -24
  66. package/esm2022/lib/Shared/Models/FileOptions.mjs +0 -15
  67. package/esm2022/lib/Shared/Models/FileUploadModel.mjs +0 -3
  68. package/esm2022/lib/Shared/Models/FileUploadOptions.mjs +0 -13
  69. package/esm2022/lib/Shared/Models/FilterItem.mjs +0 -8
  70. package/esm2022/lib/Shared/Models/FormOptions.mjs +0 -32
  71. package/esm2022/lib/Shared/Models/HtmlEditorOptions.mjs +0 -12
  72. package/esm2022/lib/Shared/Models/ImageUploadOptions.mjs +0 -14
  73. package/esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs +0 -12
  74. package/esm2022/lib/Shared/Models/MapAutocompleteDTO.mjs +0 -6
  75. package/esm2022/lib/Shared/Models/MarkdownEditorOptions.mjs +0 -24
  76. package/esm2022/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +0 -9
  77. package/esm2022/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +0 -9
  78. package/esm2022/lib/Shared/Models/MultiLingualTextBoxOptions.mjs +0 -17
  79. package/esm2022/lib/Shared/Models/MultilingualControlOptionsBase.mjs +0 -21
  80. package/esm2022/lib/Shared/Models/MultipleFileUploadModel.mjs +0 -9
  81. package/esm2022/lib/Shared/Models/PagingDTO.mjs +0 -13
  82. package/esm2022/lib/Shared/Models/PagingOptions.mjs +0 -49
  83. package/esm2022/lib/Shared/Models/PagingPayload.mjs +0 -3
  84. package/esm2022/lib/Shared/Models/PhoneOptions.mjs +0 -16
  85. package/esm2022/lib/Shared/Models/ProfileImageUploadOptions.mjs +0 -11
  86. package/esm2022/lib/Shared/Models/ProfilePictureDTO.mjs +0 -3
  87. package/esm2022/lib/Shared/Models/RadioButtonItem.mjs +0 -3
  88. package/esm2022/lib/Shared/Models/RadioButtonOptions.mjs +0 -7
  89. package/esm2022/lib/Shared/Models/RangeNumber.mjs +0 -3
  90. package/esm2022/lib/Shared/Models/Recaptcha.mjs +0 -6
  91. package/esm2022/lib/Shared/Models/RecaptchaOptions.mjs +0 -22
  92. package/esm2022/lib/Shared/Models/RepeaterField.mjs +0 -3
  93. package/esm2022/lib/Shared/Models/RepeaterOptions.mjs +0 -14
  94. package/esm2022/lib/Shared/Models/SaveDTO.mjs +0 -7
  95. package/esm2022/lib/Shared/Models/TagsInputDTO.mjs +0 -3
  96. package/esm2022/lib/Shared/Models/TagsInputOptions.mjs +0 -56
  97. package/esm2022/lib/Shared/Models/TextAreaOptions.mjs +0 -19
  98. package/esm2022/lib/Shared/Models/TextBoxOptions.mjs +0 -27
  99. package/esm2022/lib/Shared/Models/ToggleSlideOptions.mjs +0 -9
  100. package/esm2022/lib/Shared/Models/UploadPersonalImage.mjs +0 -7
  101. package/esm2022/lib/Shared/Models/bread-crumb.mjs +0 -8
  102. package/esm2022/lib/Shared/Models/control-filter-Item.mjs +0 -6
  103. package/esm2022/lib/Shared/Models/filter-options.mjs +0 -9
  104. package/esm2022/lib/Shared/Models/index.mjs +0 -58
  105. package/esm2022/lib/Shared/Models/page-header-options.mjs +0 -78
  106. package/esm2022/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +0 -22
  107. package/esm2022/lib/Shared/Pipes/bbsf-date.pipe.mjs +0 -22
  108. package/esm2022/lib/Shared/config/environment.mjs +0 -12
  109. package/esm2022/lib/Shared/default_intl.mjs +0 -29
  110. package/esm2022/lib/Shared/services/ControlUtility.mjs +0 -162
  111. package/esm2022/lib/Shared/services/GlobalSettings.service.mjs +0 -30
  112. package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
  113. package/esm2022/lib/Shared/services/file-upload.service.mjs +0 -29
  114. package/esm2022/lib/Shared/services/index.mjs +0 -7
  115. package/esm2022/lib/Shared/services/render-component-service.service.mjs +0 -32
  116. package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +0 -125
  117. package/esm2022/lib/Shared/utils/date-formatter.mjs +0 -48
  118. package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -299
  119. package/esm2022/lib/controls/Calendar/Calendar.component.mjs +0 -179
  120. package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +0 -121
  121. package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +0 -143
  122. package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -240
  123. package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +0 -296
  124. package/esm2022/lib/controls/FileUpload/FileUpload.component.mjs +0 -741
  125. package/esm2022/lib/controls/Form/Form.component.mjs +0 -117
  126. package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -185
  127. package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -360
  128. package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -502
  129. package/esm2022/lib/controls/MarkdownEditor/markdown-editor.component.mjs +0 -243
  130. package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -456
  131. package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -441
  132. package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -500
  133. package/esm2022/lib/controls/Paging/JwPagination.component.mjs +0 -160
  134. package/esm2022/lib/controls/Paging/Paging.component.mjs +0 -626
  135. package/esm2022/lib/controls/Phone/Phone.component.mjs +0 -134
  136. package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -390
  137. package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +0 -113
  138. package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +0 -134
  139. package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +0 -135
  140. package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +0 -1291
  141. package/esm2022/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +0 -22
  142. package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +0 -118
  143. package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +0 -308
  144. package/esm2022/lib/controls/TextArea/TextArea.component.mjs +0 -581
  145. package/esm2022/lib/controls/TextBox/TextBox.component.mjs +0 -357
  146. package/esm2022/lib/controls/Toggleslide/Toggleslide.component.mjs +0 -96
  147. package/esm2022/lib/controls/bbsf-controls.module.mjs +0 -92
  148. package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +0 -42
  149. package/esm2022/lib/modules/bbsf-core.module.mjs +0 -210
  150. package/esm2022/lib/modules/bbsf-datetime.module.mjs +0 -90
  151. package/esm2022/lib/modules/bbsf-dropdown.module.mjs +0 -57
  152. package/esm2022/lib/modules/bbsf-editors.module.mjs +0 -97
  153. package/esm2022/lib/modules/bbsf-forms-basic.module.mjs +0 -79
  154. package/esm2022/lib/modules/bbsf-multilingual.module.mjs +0 -60
  155. package/esm2022/lib/modules/bbsf-phone.module.mjs +0 -57
  156. package/esm2022/lib/modules/bbsf-specialized.module.mjs +0 -160
  157. package/esm2022/lib/modules/bbsf-uploads.module.mjs +0 -106
  158. package/esm2022/lib/modules/bbsf-utility.module.mjs +0 -103
  159. package/esm2022/public-api.mjs +0 -169
@@ -1,125 +0,0 @@
1
- import { Injectable, Optional } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/forms";
4
- import * as i2 from "@bnsights/bbsf-utilities/ui";
5
- export class ErrorMassageValidation {
6
- static { this.controlContainerStatic = null; }
7
- constructor(controlContainer, utilityService) {
8
- this.controlContainer = controlContainer;
9
- this.utilityService = utilityService;
10
- this.url = 'CheckEmailValidation';
11
- ErrorMassageValidation.controlContainerStatic = this.controlContainer;
12
- }
13
- static showerror(FormControlName) {
14
- let form = ErrorMassageValidation.controlContainerStatic.control;
15
- let control = form.get(FormControlName);
16
- control.setErrors({ minlength: true });
17
- control.markAsTouched();
18
- }
19
- getErrorMassageValidation(error) {
20
- let result = '';
21
- switch (error.key) {
22
- case 'required':
23
- result = this.utilityService.getResourceValue('RequiredValidationKey');
24
- break;
25
- case 'email':
26
- result = this.utilityService.getResourceValue('EmailValidationKey');
27
- break;
28
- case 'EmailValidationKey':
29
- result = this.utilityService.getResourceValue('EmailValidationKey');
30
- break;
31
- case 'URLValidationKey':
32
- result = this.utilityService.getResourceValue('urlValidationError');
33
- break;
34
- case 'pattern':
35
- result = this.utilityService.getResourceValue('NumberValidationKey');
36
- break;
37
- case 'maxlength':
38
- result = `${this.utilityService.getResourceValue('MaxLenghtValidationKey')} ${error.value.requiredLength}`;
39
- break;
40
- case 'minlength':
41
- result = `${this.utilityService.getResourceValue('MinLenghtValidationKey')} ${error.value.requiredLength}`;
42
- break;
43
- case 'min':
44
- result = `${this.utilityService.getResourceValue('MinValueValidationKey')} ${error.value.min}`;
45
- break;
46
- case 'max':
47
- result = `${this.utilityService.getResourceValue('MaxValueValidationKey')} ${error.value.max}`;
48
- break;
49
- case 'IntegerNumberValidationKey':
50
- result = this.utilityService.getResourceValue('IntegerNumberValidationKey');
51
- break;
52
- case 'PositiveNumberValidationKey':
53
- result = this.utilityService.getResourceValue('PositiveNumberValidationKey');
54
- break;
55
- case 'validatePhoneNumber':
56
- result = this.utilityService.getResourceValue('PhoneNumberValidationKey');
57
- break;
58
- case 'mask':
59
- result = `${this.utilityService.getResourceValue('MaskValidationKey')} ${error.value.requiredMask}`;
60
- break;
61
- case 'passwordComplexityHasNumber':
62
- result = this.utilityService.getResourceValue('PasswordComplexityHasNumber');
63
- break;
64
- case 'ArabicLetterOnly':
65
- result = this.utilityService.getResourceValue('ArabicLetterOnly');
66
- break;
67
- case 'EnglishLetterOnly':
68
- result = this.utilityService.getResourceValue('EnglishLetterOnly');
69
- break;
70
- case 'ArabicIsRequiredAndOnly50CharactersEnglish':
71
- result = this.utilityService.getResourceValue('VAL_ArabicIsRequiredAndOnly50CharactersEnglish');
72
- break;
73
- case 'passwordComplexityHasCapitalLetter':
74
- result = this.utilityService.getResourceValue('PasswordComplexityHasCapitalLetter');
75
- break;
76
- case 'passwordComplexityHasSmallLetter':
77
- result = this.utilityService.getResourceValue('PasswordComplexityHasSmallLetter');
78
- break;
79
- case 'passwordComplexityHasSpecialLetter':
80
- result = this.utilityService.getResourceValue('PasswordComplexityHasSpecialLetter');
81
- break;
82
- case 'MaxWordCountValidationKey':
83
- result = `${this.utilityService.getResourceValue('MaxWordCountValidationKey')} ${error.value}`;
84
- break;
85
- case 'NewSelectionValidationKey':
86
- result = this.utilityService.getResourceValue('NewSelectionValidationKey');
87
- break;
88
- case 'MaxFileCountValidationKey':
89
- result = `${this.utilityService.getResourceValue('MaxFileCountValidationKey')} ${error.value}`;
90
- break;
91
- case 'MinFileCountValidationKey':
92
- result = `${this.utilityService.getResourceValue('MinFileCountValidationKey')} ${error.value}`;
93
- break;
94
- case 'MaxSizeForAllFilesInMB':
95
- result = `${this.utilityService.getResourceValue('MaxSizeForAllFilesInMB')} ${error.value}`;
96
- break;
97
- case 'FileMaxSizeInMB':
98
- result = `${this.utilityService.getResourceValue('FileMaxSizeInMB')} ${error.value}`;
99
- break;
100
- case 'ToolTipTypeError':
101
- result = `${this.utilityService.getResourceValue('ToolTipTypeError')} ${error.value}`;
102
- break;
103
- case 'InvalidEndDate':
104
- result = this.utilityService.getResourceValue('InvalidEndDate');
105
- break;
106
- case 'InvalidStartDate':
107
- result = this.utilityService.getResourceValue('InvalidStartDate');
108
- break;
109
- case 'DuplicateFileError':
110
- result = error.value;
111
- break;
112
- default:
113
- break;
114
- }
115
- return result;
116
- }
117
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorMassageValidation, deps: [{ token: i1.ControlContainer, optional: true }, { token: i2.UtilityService }], target: i0.ɵɵFactoryTarget.Injectable }); }
118
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorMassageValidation }); }
119
- }
120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorMassageValidation, decorators: [{
121
- type: Injectable
122
- }], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
123
- type: Optional
124
- }] }, { type: i2.UtilityService }] });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbkVycm9yTWFzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL1NoYXJlZC9zZXJ2aWNlcy92YWxpZGF0aW9uRXJyb3JNYXNzYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFLckQsTUFBTSxPQUFPLHNCQUFzQjthQUMxQiwyQkFBc0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTtJQUVyQyxZQUNzQixnQkFBa0MsRUFDOUMsY0FBOEI7UUFEbEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUM5QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFJeEMsUUFBRyxHQUFHLHNCQUFzQixDQUFDO1FBRjNCLHNCQUFzQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUN4RSxDQUFDO0lBR0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUF1QjtRQUN0QyxJQUFJLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFvQixDQUFDO1FBQzlFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFnQixDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQVU7UUFDbEMsSUFBSSxNQUFNLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNqQixLQUFLLFVBQVU7Z0JBQ2IsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVC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S0FBSyxFQUFFLENBQUM7Z0JBQ3JGLE1BQU07WUFDUixLQUFLLGtCQUFrQjtnQkFDckIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEYsTUFBTTtZQUNSLEtBQUssZ0JBQWdCO2dCQUNuQixNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNO1lBQ1IsS0FBSyxrQkFBa0I7Z0JBQ3JCLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ2xFLE1BQU07WUFDUixLQUFLLG9CQUFvQjtnQkFDdkIsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLE1BQU07WUFDUjtnQkFDRSxNQUFNO1NBQ1Q7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOytHQW5IVSxzQkFBc0I7bUhBQXRCLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVTs7MEJBS04sUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzL3VpJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEVycm9yTWFzc2FnZVZhbGlkYXRpb24ge1xyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyU3RhdGljID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcbiAgICBwcml2YXRlIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZVxyXG4gICkge1xyXG4gICAgRXJyb3JNYXNzYWdlVmFsaWRhdGlvbi5jb250cm9sQ29udGFpbmVyU3RhdGljID0gdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gIH1cclxuICB1cmwgPSAnQ2hlY2tFbWFpbFZhbGlkYXRpb24nO1xyXG5cclxuICBzdGF0aWMgc2hvd2Vycm9yKEZvcm1Db250cm9sTmFtZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZm9ybSA9IEVycm9yTWFzc2FnZVZhbGlkYXRpb24uY29udHJvbENvbnRhaW5lclN0YXRpYy5jb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgIGxldCBjb250cm9sID0gZm9ybS5nZXQoRm9ybUNvbnRyb2xOYW1lKSBhcyBGb3JtQ29udHJvbDtcclxuICAgIGNvbnRyb2wuc2V0RXJyb3JzKHsgbWlubGVuZ3RoOiB0cnVlIH0pO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1hc3NhZ2VWYWxpZGF0aW9uKGVycm9yOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gJyc7XHJcbiAgICBzd2l0Y2ggKGVycm9yLmtleSkge1xyXG4gICAgICBjYXNlICdyZXF1aXJlZCc6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdSZXF1aXJlZFZhbGlkYXRpb25LZXknKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZW1haWwnOlxyXG4gICAgICAgIHJlc3VsdCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnRW1haWxWYWxpZGF0aW9uS2V5Jyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0VtYWlsVmFsaWRhdGlvbktleSc6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdFbWFpbFZhbGlkYXRpb25LZXknKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnVVJMVmFsaWRhdGlvbktleSc6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCd1cmxWYWxpZGF0aW9uRXJyb3InKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncGF0dGVybic6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdOdW1iZXJWYWxpZGF0aW9uS2V5Jyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21heGxlbmd0aCc6XHJcbiAgICAgICAgcmVzdWx0ID0gYCR7dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdNYXhMZW5naHRWYWxpZGF0aW9uS2V5Jyl9ICR7ZXJyb3IudmFsdWUucmVxdWlyZWRMZW5ndGh9YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbWlubGVuZ3RoJzpcclxuICAgICAgICByZXN1bHQgPSBgJHt0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ01pbkxlbmdodFZhbGlkYXRpb25LZXknKX0gJHtlcnJvci52YWx1ZS5yZXF1aXJlZExlbmd0aH1gO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdtaW4nOlxyXG4gICAgICAgIHJlc3VsdCA9IGAke3RoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTWluVmFsdWVWYWxpZGF0aW9uS2V5Jyl9ICR7ZXJyb3IudmFsdWUubWlufWA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21heCc6XHJcbiAgICAgICAgcmVzdWx0ID0gYCR7dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdNYXhWYWx1ZVZhbGlkYXRpb25LZXknKX0gJHtlcnJvci52YWx1ZS5tYXh9YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSW50ZWdlck51bWJlclZhbGlkYXRpb25LZXknOlxyXG4gICAgICAgIHJlc3VsdCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnSW50ZWdlck51bWJlclZhbGlkYXRpb25LZXknKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnUG9zaXRpdmVOdW1iZXJWYWxpZGF0aW9uS2V5JzpcclxuICAgICAgICByZXN1bHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1Bvc2l0aXZlTnVtYmVyVmFsaWRhdGlvbktleScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICd2YWxpZGF0ZVBob25lTnVtYmVyJzpcclxuICAgICAgICByZXN1bHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1Bob25lTnVtYmVyVmFsaWRhdGlvbktleScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdtYXNrJzpcclxuICAgICAgICByZXN1bHQgPSBgJHt0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ01hc2tWYWxpZGF0aW9uS2V5Jyl9ICR7ZXJyb3IudmFsdWUucmVxdWlyZWRNYXNrfWA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3Bhc3N3b3JkQ29tcGxleGl0eUhhc051bWJlcic6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdQYXNzd29yZENvbXBsZXhpdHlIYXNOdW1iZXInKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJhYmljTGV0dGVyT25seSc6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdBcmFiaWNMZXR0ZXJPbmx5Jyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0VuZ2xpc2hMZXR0ZXJPbmx5JzpcclxuICAgICAgICByZXN1bHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0VuZ2xpc2hMZXR0ZXJPbmx5Jyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0FyYWJpY0lzUmVxdWlyZWRBbmRPbmx5NTBDaGFyYWN0ZXJzRW5nbGlzaCc6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdWQUxfQXJhYmljSXNSZXF1aXJlZEFuZE9ubHk1MENoYXJhY3RlcnNFbmdsaXNoJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3Bhc3N3b3JkQ29tcGxleGl0eUhhc0NhcGl0YWxMZXR0ZXInOlxyXG4gICAgICAgIHJlc3VsdCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnUGFzc3dvcmRDb21wbGV4aXR5SGFzQ2FwaXRhbExldHRlcicpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwYXNzd29yZENvbXBsZXhpdHlIYXNTbWFsbExldHRlcic6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdQYXNzd29yZENvbXBsZXhpdHlIYXNTbWFsbExldHRlcicpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwYXNzd29yZENvbXBsZXhpdHlIYXNTcGVjaWFsTGV0dGVyJzpcclxuICAgICAgICByZXN1bHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1Bhc3N3b3JkQ29tcGxleGl0eUhhc1NwZWNpYWxMZXR0ZXInKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnTWF4V29yZENvdW50VmFsaWRhdGlvbktleSc6XHJcbiAgICAgICAgcmVzdWx0ID0gYCR7dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdNYXhXb3JkQ291bnRWYWxpZGF0aW9uS2V5Jyl9ICR7ZXJyb3IudmFsdWV9YDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnTmV3U2VsZWN0aW9uVmFsaWRhdGlvbktleSc6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdOZXdTZWxlY3Rpb25WYWxpZGF0aW9uS2V5Jyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ01heEZpbGVDb3VudFZhbGlkYXRpb25LZXknOlxyXG4gICAgICAgIHJlc3VsdCA9IGAke3RoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTWF4RmlsZUNvdW50VmFsaWRhdGlvbktleScpfSAke2Vycm9yLnZhbHVlfWA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ01pbkZpbGVDb3VudFZhbGlkYXRpb25LZXknOlxyXG4gICAgICAgIHJlc3VsdCA9IGAke3RoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTWluRmlsZUNvdW50VmFsaWRhdGlvbktleScpfSAke2Vycm9yLnZhbHVlfWA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ01heFNpemVGb3JBbGxGaWxlc0luTUInOlxyXG4gICAgICAgIHJlc3VsdCA9IGAke3RoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTWF4U2l6ZUZvckFsbEZpbGVzSW5NQicpfSAke2Vycm9yLnZhbHVlfWA7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0ZpbGVNYXhTaXplSW5NQic6XHJcbiAgICAgICAgcmVzdWx0ID0gYCR7dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdGaWxlTWF4U2l6ZUluTUInKX0gJHtlcnJvci52YWx1ZX1gO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdUb29sVGlwVHlwZUVycm9yJzpcclxuICAgICAgICByZXN1bHQgPSBgJHt0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1Rvb2xUaXBUeXBlRXJyb3InKX0gJHtlcnJvci52YWx1ZX1gO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdJbnZhbGlkRW5kRGF0ZSc6XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdJbnZhbGlkRW5kRGF0ZScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdJbnZhbGlkU3RhcnREYXRlJzpcclxuICAgICAgICByZXN1bHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0ludmFsaWRTdGFydERhdGUnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnRHVwbGljYXRlRmlsZUVycm9yJzpcclxuICAgICAgICByZXN1bHQgPSBlcnJvci52YWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,48 +0,0 @@
1
- /**
2
- * Lightweight date formatting utility
3
- * Replaces moment.js for simple date formatting operations
4
- */
5
- export class DateFormatter {
6
- /**
7
- * Format date to ISO string with milliseconds
8
- * Output: YYYY-MM-DDTHH:mm:ss.SSS
9
- * @param date - Date object or string
10
- * @returns Formatted date string
11
- * @example
12
- * DateFormatter.toISOWithMillis(new Date()) // '2024-10-27T10:30:45.123'
13
- */
14
- static toISOWithMillis(date) {
15
- const d = new Date(date);
16
- if (isNaN(d.getTime())) {
17
- console.error('Invalid date provided to DateFormatter.toISOWithMillis:', date);
18
- return '';
19
- }
20
- const year = d.getFullYear();
21
- const month = String(d.getMonth() + 1).padStart(2, '0');
22
- const day = String(d.getDate()).padStart(2, '0');
23
- const hours = String(d.getHours()).padStart(2, '0');
24
- const minutes = String(d.getMinutes()).padStart(2, '0');
25
- const seconds = String(d.getSeconds()).padStart(2, '0');
26
- const millis = String(d.getMilliseconds()).padStart(3, '0');
27
- return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${millis}`;
28
- }
29
- /**
30
- * Format date to DD-MM-YYYY
31
- * @param date - Date object or string
32
- * @returns Formatted date string
33
- * @example
34
- * DateFormatter.toDDMMYYYY(new Date()) // '27-10-2024'
35
- */
36
- static toDDMMYYYY(date) {
37
- const d = new Date(date);
38
- if (isNaN(d.getTime())) {
39
- console.error('Invalid date provided to DateFormatter.toDDMMYYYY:', date);
40
- return '';
41
- }
42
- const day = String(d.getDate()).padStart(2, '0');
43
- const month = String(d.getMonth() + 1).padStart(2, '0');
44
- const year = d.getFullYear();
45
- return `${day}-${month}-${year}`;
46
- }
47
- }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvU2hhcmVkL3V0aWxzL2RhdGUtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBRXRCOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQW1CO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMseURBQXlELEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0UsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFNUQsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO0lBQzlFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQW1CO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0RBQW9ELEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUUsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFN0IsT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7SUFDckMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIExpZ2h0d2VpZ2h0IGRhdGUgZm9ybWF0dGluZyB1dGlsaXR5XHJcbiAqIFJlcGxhY2VzIG1vbWVudC5qcyBmb3Igc2ltcGxlIGRhdGUgZm9ybWF0dGluZyBvcGVyYXRpb25zXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0ZUZvcm1hdHRlciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JtYXQgZGF0ZSB0byBJU08gc3RyaW5nIHdpdGggbWlsbGlzZWNvbmRzXHJcbiAgICAgKiBPdXRwdXQ6IFlZWVktTU0tRERUSEg6bW06c3MuU1NTXHJcbiAgICAgKiBAcGFyYW0gZGF0ZSAtIERhdGUgb2JqZWN0IG9yIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgRm9ybWF0dGVkIGRhdGUgc3RyaW5nXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogRGF0ZUZvcm1hdHRlci50b0lTT1dpdGhNaWxsaXMobmV3IERhdGUoKSkgLy8gJzIwMjQtMTAtMjdUMTA6MzA6NDUuMTIzJ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdG9JU09XaXRoTWlsbGlzKGRhdGU6IERhdGUgfCBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcclxuXHJcbiAgICAgICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGRhdGUgcHJvdmlkZWQgdG8gRGF0ZUZvcm1hdHRlci50b0lTT1dpdGhNaWxsaXM6JywgZGF0ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHllYXIgPSBkLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgICAgY29uc3QgaG91cnMgPSBTdHJpbmcoZC5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBTdHJpbmcoZC5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgICAgY29uc3Qgc2Vjb25kcyA9IFN0cmluZyhkLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICBjb25zdCBtaWxsaXMgPSBTdHJpbmcoZC5nZXRNaWxsaXNlY29uZHMoKSkucGFkU3RhcnQoMywgJzAnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fVQke2hvdXJzfToke21pbnV0ZXN9OiR7c2Vjb25kc30uJHttaWxsaXN9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvcm1hdCBkYXRlIHRvIERELU1NLVlZWVlcclxuICAgICAqIEBwYXJhbSBkYXRlIC0gRGF0ZSBvYmplY3Qgb3Igc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgZGF0ZSBzdHJpbmdcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBEYXRlRm9ybWF0dGVyLnRvRERNTVlZWVkobmV3IERhdGUoKSkgLy8gJzI3LTEwLTIwMjQnXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0b0RETU1ZWVlZKGRhdGU6IERhdGUgfCBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcclxuXHJcbiAgICAgICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGRhdGUgcHJvdmlkZWQgdG8gRGF0ZUZvcm1hdHRlci50b0RETU1ZWVlZOicsIGRhdGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkYXkgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICBjb25zdCB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gYCR7ZGF5fS0ke21vbnRofS0ke3llYXJ9YDtcclxuICAgIH1cclxufVxyXG5cclxuIl19
@@ -1,299 +0,0 @@
1
- import { Component, Input, Optional, Output, EventEmitter, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { HttpHeaders, HttpParams } from '@angular/common/http';
5
- import { TypeaheadModule } from 'ngx-bootstrap/typeahead';
6
- import { AutocompleteLibModule } from 'angular-ng-autocomplete';
7
- import { noop, Observable, of } from 'rxjs';
8
- import { map, switchMap, tap } from 'rxjs/operators';
9
- import { RequestOptionsModel } from '@bnsights/bbsf-utilities/http';
10
- import { AutocompleteDTO } from '../../Shared/Models/AutocompleteDTO';
11
- import { CustomValidation } from '../../Shared/Models/CustomValidation';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/common/http";
14
- import * as i2 from "../../Shared/services/validationErrorMassage.service";
15
- import * as i3 from "@bnsights/bbsf-utilities/http";
16
- import * as i4 from "../../Shared/services/ControlUtility";
17
- import * as i5 from "@angular/forms";
18
- import * as i6 from "@bnsights/bbsf-utilities/ui";
19
- import * as i7 from "../../Shared/services/GlobalSettings.service";
20
- import * as i8 from "@angular/common";
21
- import * as i9 from "angular-ng-autocomplete";
22
- export class AutocompleteTextBoxComponent {
23
- static { this.controlContainerstatic = null; }
24
- // tslint:disable-next-line: max-line-length
25
- constructor(http, ErrorHandler, requestHandlerService, controlUtility, controlContainer, autoCompleteTextBoxControlHost, utilityService, controlValidationService, globalSettings) {
26
- this.http = http;
27
- this.ErrorHandler = ErrorHandler;
28
- this.requestHandlerService = requestHandlerService;
29
- this.controlUtility = controlUtility;
30
- this.controlContainer = controlContainer;
31
- this.autoCompleteTextBoxControlHost = autoCompleteTextBoxControlHost;
32
- this.utilityService = utilityService;
33
- this.controlValidationService = controlValidationService;
34
- this.globalSettings = globalSettings;
35
- this.OnChange = new EventEmitter();
36
- this.keyword = 'value';
37
- this.Search = '';
38
- this.Key = '';
39
- this.api = 'http';
40
- this.Value = 'value';
41
- this.newSelectionValidationKey = '';
42
- this.markAllAsTouched = false;
43
- this.validationRules = [];
44
- this.validationRulesasync = [];
45
- this.dataList = [];
46
- this.SelectedValue = "";
47
- this.avatarImage = "./src/assets/images/userimg.png";
48
- this.newSelectionValidation = new CustomValidation();
49
- this.loadValidator = () => {
50
- this.newSelectionValidation.functionBody = (control) => {
51
- if ((control.value && typeof control.value === "string"))
52
- return { customerError: true };
53
- return null;
54
- };
55
- this.newSelectionValidation.massage = this.utilityService.getResourceValue("NewSelectionValidationKey");
56
- };
57
- this.resetError = () => {
58
- this.controlValidationService.removeGlobalError();
59
- };
60
- this.getErrorValidation = (ErrorList) => {
61
- if (this.markAllAsTouched && this.group.invalid) {
62
- this.showGlobalError();
63
- this.markAllAsTouched = false;
64
- }
65
- if (!this.options.allowNewSelection && !this.options.customValidation.includes(this.newSelectionValidation))
66
- this.options.customValidation.push(this.newSelectionValidation);
67
- return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
68
- };
69
- // onFocused(e) {
70
- // // do something
71
- // }
72
- // onBlur(Value) {
73
- // if (this.options.AllowNewSelection == true) {
74
- // if (typeof (Value) == 'object') {
75
- // this.autoCompleteTextBoxControl.setValue(Value);
76
- // this.autoCompleteTextBoxControl.updateValueAndValidity()
77
- // }
78
- // else {
79
- // let AutocompleteModel = new AutocompleteDTO();
80
- // AutocompleteModel.value = Value;
81
- // let model = new TypeaheadMatch(AutocompleteModel,Value);
82
- // this.autoCompleteTextBoxControl.setValue(model);
83
- // this.autoCompleteTextBoxControl.updateValueAndValidity()
84
- // }
85
- // }
86
- // else {
87
- // if (this.autoCompleteTextBoxControl.value == Value) {
88
- // this.autoCompleteTextBoxControl.setErrors({ NewSelectionValidationKey: this.NewSelectionValidationKey });
89
- // this.autoCompleteTextBoxControl.markAsTouched();
90
- // this.autoCompleteTextBoxControl.invalid;
91
- // return;
92
- // }
93
- // }
94
- // }
95
- // handleResultSelected(result) {
96
- // this.autoCompleteTextBoxControl.setValue(result);
97
- // this.autoCompleteTextBoxControl.updateValueAndValidity()
98
- // this.OnChange.emit(this.autoCompleteTextBoxControl.value)
99
- // this.Search = this.autoCompleteTextBoxControl.value.value
100
- // }
101
- //External Method
102
- this.removeRequiredValidation = () => {
103
- this.controlUtility.removeRequiredValidation(this.autoCompleteTextBoxControl, this.validationRules, this.options);
104
- };
105
- //External Method
106
- this.addRequiredValidation = () => {
107
- this.controlUtility.addRequiredValidation(this.autoCompleteTextBoxControl, this.validationRules, this.options);
108
- };
109
- //External Method
110
- this.removeCustomValidation = (customValidation) => {
111
- this.controlUtility.removeCustomValidation(this.autoCompleteTextBoxControl, this.validationRules, customValidation);
112
- };
113
- //External Method
114
- this.addCustomValidation = (customValidation) => {
115
- this.controlUtility.addCustomValidation(this.autoCompleteTextBoxControl, this.validationRules, customValidation);
116
- };
117
- //External Method
118
- this.isValid = () => {
119
- this.controlUtility.isValid(this.autoCompleteTextBoxControl);
120
- };
121
- AutocompleteTextBoxComponent.controlContainerstatic = this.controlContainer;
122
- }
123
- ngOnInit() {
124
- if (this.options.name)
125
- this.name = this.options.name;
126
- if (this.options.isReadonly && !this.options.value)
127
- this.options.value = this.utilityService.getResourceValue('NA');
128
- if (this.options.forceDirection)
129
- this.textDir = this.options.forceDirection == 2 ? 'rtl' : 'ltr';
130
- else
131
- this.textDir = localStorage.getItem('language') == 'ar' ? 'rtl' : 'ltr';
132
- this.controlValidationService.isCreatedBefor = false;
133
- this.group.addControl(this.name, new FormControl(''));
134
- this.autoCompleteTextBoxControl = this.group.controls[this.name]; // new FormControl('',validationRules);
135
- if (!this.options.viewType)
136
- this.options.viewType = this.globalSettings.viewType;
137
- if (this.options.labelKey != null && this.options.labelKey != "")
138
- this.options.labelValue = this.utilityService.getResourceValue(this.options.labelKey);
139
- // this.autoCompleteTextBoxControl.setValue(this.options.Value);
140
- if (this.options.isRequired) {
141
- this.validationRules.push(Validators.required);
142
- }
143
- if (!this.options.allowNewSelection) {
144
- this.loadValidator();
145
- this.options.customValidation.push(this.newSelectionValidation);
146
- }
147
- if (this.options.customValidation.length > 0) {
148
- let Validations = this.options.customValidation;
149
- for (let index = 0; index < Validations.length; index++) {
150
- const Validation = Validations[index];
151
- this.validationRules.push(Validation.functionBody);
152
- }
153
- }
154
- this.autoCompleteTextBoxControl.setValidators(this.validationRules);
155
- this.autoCompleteTextBoxControl.setAsyncValidators(this.validationRulesasync);
156
- if (this.options.isDisabled) {
157
- this.autoCompleteTextBoxControl.disable();
158
- }
159
- if (this.options.selectedValue != undefined && this.options.selectedValue != null) {
160
- this.SelectedValue = this.options.selectedValue;
161
- }
162
- this.autoCompleteTextBoxControlHost.ngSubmit.subscribe((value) => {
163
- this.group.markAllAsTouched();
164
- this.markAllAsTouched = true;
165
- });
166
- const httpOptions = {
167
- headers: new HttpHeaders({
168
- 'Content-Type': 'application/json',
169
- 'Authorization': this.options.validationToken
170
- }),
171
- };
172
- this.suggestions$ = new Observable((observer) => {
173
- observer.next(this.Search);
174
- }).pipe(switchMap((query) => {
175
- if (query) {
176
- let params = new HttpParams();
177
- params = params.append(this.options.queryParam, query);
178
- if (this.options.extraFilterParamName && this.options.extraFilter)
179
- params = params.append(this.options.extraFilterParamName, (typeof this.options.extraFilter === "string") ? this.options.extraFilter : this.options.extraFilter());
180
- let requestOptionsModel = new RequestOptionsModel();
181
- requestOptionsModel.disableBlockUI = true;
182
- requestOptionsModel.disableSuccessNotification = true;
183
- // using github public api to get users by name
184
- return this.requestHandlerService.get(this.options.actionURL, params, null, requestOptionsModel)
185
- .pipe(map((data) => data || []), tap(() => noop, err => {
186
- // in case of http error
187
- this.errorMessage = err && err.message || 'Something goes wrong';
188
- }));
189
- }
190
- return of([]);
191
- }));
192
- }
193
- ngAfterViewInit() {
194
- this.controlUtility.setAttributeForControl(this.options);
195
- }
196
- showGlobalError() {
197
- this.controlUtility.showGlobalError();
198
- }
199
- copyInputMessage(inputElement) {
200
- this.controlUtility.CopyInputMessage(inputElement);
201
- }
202
- selectEvent(item) {
203
- if (this.options.allowNewSelection == true) {
204
- if (typeof item == 'object') {
205
- this.autoCompleteTextBoxControl.setValue(item);
206
- this.autoCompleteTextBoxControl.updateValueAndValidity();
207
- }
208
- else {
209
- let AutocompleteModel = new AutocompleteDTO();
210
- AutocompleteModel.value = item;
211
- this.autoCompleteTextBoxControl.setValue(AutocompleteModel);
212
- this.autoCompleteTextBoxControl.updateValueAndValidity();
213
- }
214
- }
215
- else {
216
- if (this.autoCompleteTextBoxControl.value == item.value) {
217
- this.autoCompleteTextBoxControl.setErrors({
218
- errorMassage: this.utilityService.getResourceValue('NewSelectionValidationKey')
219
- });
220
- this.autoCompleteTextBoxControl.markAsTouched();
221
- this.autoCompleteTextBoxControl.invalid;
222
- return;
223
- }
224
- else {
225
- this.autoCompleteTextBoxControl.setValue(item);
226
- this.autoCompleteTextBoxControl.updateValueAndValidity();
227
- let originalValue = this.autoCompleteTextBoxControl.value;
228
- if (this.options.patchFunction &&
229
- this.options.patchPath &&
230
- this.group.get(this.name).valid) {
231
- this.controlUtility.patchControlValue(originalValue, this.options.patchFunction, this.options.patchPath);
232
- }
233
- }
234
- }
235
- // move this line here to emit value no matter is from database or not
236
- this.OnChange.emit(this.autoCompleteTextBoxControl.value);
237
- //Use this line to enable two way binding.
238
- this.options.value = this.autoCompleteTextBoxControl.value;
239
- }
240
- async onChangeSearch(search) {
241
- if (this.options.maxLength && search.length > this.options.maxLength) {
242
- const formControl = this.autoCompleteTextBoxControl;
243
- formControl.setErrors({ errorMassage: this.utilityService.getResourceValue("MaxLenghtValidationKey") + " " + this.options.maxLength });
244
- formControl.markAsTouched();
245
- return;
246
- }
247
- this.Search = search;
248
- this.SelectedValue = "";
249
- await this.suggestions$.subscribe((result) => {
250
- if ((result == null || result.length == 0 || result.length == 0) && this.options.allowNewSelection == true) {
251
- this.dataList = [
252
- {
253
- key: 0,
254
- value: this.Search
255
- }
256
- ];
257
- }
258
- else {
259
- this.dataList = result;
260
- }
261
- });
262
- }
263
- onInputCleared() {
264
- this.autoCompleteTextBoxControl.setValue(null);
265
- this.OnChange.emit(null);
266
- this.autoCompleteTextBoxControl.updateValueAndValidity();
267
- }
268
- checkIsAutocomplateInFilter() {
269
- if (this.DropdownTemplateVariable) {
270
- this.DropdownTemplateVariable.toggle();
271
- this.DropdownTemplateVariable.toggle();
272
- }
273
- }
274
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AutocompleteTextBoxComponent, deps: [{ token: i1.HttpClient }, { token: i2.ErrorMassageValidation }, { token: i3.RequestHandlerService }, { token: i4.ControlUtility }, { token: i5.ControlContainer, optional: true }, { token: i5.FormGroupDirective }, { token: i6.UtilityService }, { token: i6.ControlValidationService }, { token: i7.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
275
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AutocompleteTextBoxComponent, isStandalone: true, selector: "BBSF-AutocompleteTextBox", inputs: { group: "group", name: "name", options: "options", DropdownTemplateVariable: "DropdownTemplateVariable" }, outputs: { OnChange: "OnChange" }, ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-autocomplete-textbox\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!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\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Input container-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <!--input-->\r\n <ng-autocomplete class=\"form-control {{options.extraClasses}}\" *ngIf=\"!options.allowNewSelection\"\r\n [data]=\"dataList\" [initialValue]=\"SelectedValue\" [searchKeyword]=\"keyword\" placeholder=\"{{options.placeholder}}\"\r\n (selected)='selectEvent($event)' (inputChanged)='onChangeSearch($event)' \r\n [itemTemplate]=\"options.customTemplate?options.customTemplate:itemTemplate\" [dir]=\"textDir\" \r\n formControlName=\"{{name}}\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"autoCompleteTextBoxControl.invalid && autoCompleteTextBoxControl.touched\"\r\n (inputCleared)=\"onInputCleared()\" (closed)=\"checkIsAutocomplateInFilter()\">\r\n </ng-autocomplete>\r\n\r\n <ng-autocomplete class=\"form-control {{options.extraClasses}}\" *ngIf=\"options.allowNewSelection\" [data]=\"dataList\"\r\n [initialValue]=\"SelectedValue\" [searchKeyword]=\"keyword\" placeholder=\"{{options.placeholder}}\"\r\n (selected)='selectEvent($event)' (inputChanged)='onChangeSearch($event)' \r\n [itemTemplate]=\"options.customTemplate?options.customTemplate:itemTemplate\" [dir]=\"textDir\"\r\n (inputCleared)=\"onInputCleared()\" formControlName=\"{{name}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n (closed)=\"checkIsAutocomplateInFilter()\"\r\n [class.is-invalid]=\"autoCompleteTextBoxControl.invalid && autoCompleteTextBoxControl.touched\">\r\n </ng-autocomplete>\r\n\r\n <ng-template #itemTemplate let-item>\r\n <img *ngIf=\"options.itemWithImage\" src=\"{{(item.image?item.image:avatarImage)}}\" />\r\n <a [innerHTML]=\"item.value\"></a>\r\n </ng-template>\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly\"><span class=\"readonly-view\">{{autoCompleteTextBoxControl.value.value}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- labelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(autoCompleteTextBoxControl.invalid && autoCompleteTextBoxControl.touched)\">\r\n {{getErrorValidation(autoCompleteTextBoxControl.errors|keyvalue)}}\r\n </div>\r\n </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", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i8.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TypeaheadModule }, { kind: "ngmodule", type: AutocompleteLibModule }, { kind: "component", type: i9.AutocompleteComponent, selector: "ng-autocomplete", inputs: ["data", "searchKeyword", "placeholder", "heading", "initialValue", "historyIdentifier", "historyHeading", "historyListMaxNumber", "notFoundText", "isLoading", "debounceTime", "disabled", "minQueryLength", "focusFirst", "customFilter", "selectedValueRender", "itemTemplate", "notFoundTemplate"], outputs: ["selected", "inputChanged", "inputFocused", "inputCleared", "opened", "closed", "scrolledToEnd"] }] }); }
276
- }
277
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AutocompleteTextBoxComponent, decorators: [{
278
- type: Component,
279
- args: [{ selector: 'BBSF-AutocompleteTextBox', standalone: true, imports: [
280
- CommonModule,
281
- FormsModule,
282
- ReactiveFormsModule,
283
- TypeaheadModule,
284
- AutocompleteLibModule
285
- ], schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA], template: "<div class=\"form-group bbsf-control bbsf-autocomplete-textbox\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!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\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Input container-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.isReadonly\">\r\n <!--input-->\r\n <ng-autocomplete class=\"form-control {{options.extraClasses}}\" *ngIf=\"!options.allowNewSelection\"\r\n [data]=\"dataList\" [initialValue]=\"SelectedValue\" [searchKeyword]=\"keyword\" placeholder=\"{{options.placeholder}}\"\r\n (selected)='selectEvent($event)' (inputChanged)='onChangeSearch($event)' \r\n [itemTemplate]=\"options.customTemplate?options.customTemplate:itemTemplate\" [dir]=\"textDir\" \r\n formControlName=\"{{name}}\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"autoCompleteTextBoxControl.invalid && autoCompleteTextBoxControl.touched\"\r\n (inputCleared)=\"onInputCleared()\" (closed)=\"checkIsAutocomplateInFilter()\">\r\n </ng-autocomplete>\r\n\r\n <ng-autocomplete class=\"form-control {{options.extraClasses}}\" *ngIf=\"options.allowNewSelection\" [data]=\"dataList\"\r\n [initialValue]=\"SelectedValue\" [searchKeyword]=\"keyword\" placeholder=\"{{options.placeholder}}\"\r\n (selected)='selectEvent($event)' (inputChanged)='onChangeSearch($event)' \r\n [itemTemplate]=\"options.customTemplate?options.customTemplate:itemTemplate\" [dir]=\"textDir\"\r\n (inputCleared)=\"onInputCleared()\" formControlName=\"{{name}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n (closed)=\"checkIsAutocomplateInFilter()\"\r\n [class.is-invalid]=\"autoCompleteTextBoxControl.invalid && autoCompleteTextBoxControl.touched\">\r\n </ng-autocomplete>\r\n\r\n <ng-template #itemTemplate let-item>\r\n <img *ngIf=\"options.itemWithImage\" src=\"{{(item.image?item.image:avatarImage)}}\" />\r\n <a [innerHTML]=\"item.value\"></a>\r\n </ng-template>\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly\"><span class=\"readonly-view\">{{autoCompleteTextBoxControl.value.value}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- labelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\">{{options.labelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(autoCompleteTextBoxControl.invalid && autoCompleteTextBoxControl.touched)\">\r\n {{getErrorValidation(autoCompleteTextBoxControl.errors|keyvalue)}}\r\n </div>\r\n </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" }]
286
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.ErrorMassageValidation }, { type: i3.RequestHandlerService }, { type: i4.ControlUtility }, { type: i5.ControlContainer, decorators: [{
287
- type: Optional
288
- }] }, { type: i5.FormGroupDirective }, { type: i6.UtilityService }, { type: i6.ControlValidationService }, { type: i7.GlobalSettings }], propDecorators: { group: [{
289
- type: Input
290
- }], name: [{
291
- type: Input
292
- }], options: [{
293
- type: Input
294
- }], DropdownTemplateVariable: [{
295
- type: Input
296
- }], OnChange: [{
297
- type: Output
298
- }] } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXV0b2NvbXBsZXRlVGV4dEJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvY29udHJvbHMvQXV0b2NvbXBsZXRlVGV4dEJveC9BdXRvY29tcGxldGVUZXh0Qm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9BdXRvY29tcGxldGVUZXh0Qm94L0F1dG9jb21wbGV0ZVRleHRCb3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQVcsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkosT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFtRyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1TCxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBWSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUF5QixtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSzNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxx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QyxzQkFBc0IsRUFBRSxDQUFDO0lBQzNELENBQUM7SUFxRUQsMkJBQTJCO1FBQ3pCLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDeEM7SUFDSCxDQUFDOytHQXJUVSw0QkFBNEI7bUdBQTVCLDRCQUE0QiwyT0MvQnpDLCtuR0FtREEsMkNENUJJLFlBQVksMlJBQ1osV0FBVyxrU0FDWCxtQkFBbUIsK1VBQ25CLGVBQWUsOEJBQ2YscUJBQXFCOzs0RkFJWiw0QkFBNEI7a0JBZHhDLFNBQVM7K0JBRUUsMEJBQTBCLGNBRXhCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLHFCQUFxQjtxQkFDdEIsV0FDUSxDQUFDLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDOzswQkFRUixRQUFROzJLQUsxQyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRG9DaGVjaywgT3B0aW9uYWwsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBBdHRyaWJ1dGUsIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5PX0VSUk9SU19TQ0hFTUEgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIEZvcm1Hcm91cCwgQWJzdHJhY3RDb250cm9sLCBDb250cm9sQ29udGFpbmVyLCBGb3JtR3JvdXBEaXJlY3RpdmUsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IFR5cGVhaGVhZE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdHlwZWFoZWFkJztcclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlTGliTW9kdWxlIH0gZnJvbSAnYW5ndWxhci1uZy1hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBub29wLCBPYnNlcnZhYmxlLCBPYnNlcnZlciwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVxdWVzdEhhbmRsZXJTZXJ2aWNlLCBSZXF1ZXN0T3B0aW9uc01vZGVsIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzL2h0dHAnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzL3VpJztcclxuaW1wb3J0IHsgRXJyb3JNYXNzYWdlVmFsaWRhdGlvbiB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy92YWxpZGF0aW9uRXJyb3JNYXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb250cm9sVXRpbGl0eSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9Db250cm9sVXRpbGl0eSc7XHJcbmltcG9ydCB7IEF1dG9jb21wbGV0ZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0F1dG9jb21wbGV0ZU9wdGlvbnMnO1xyXG5pbXBvcnQgeyBBdXRvY29tcGxldGVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0F1dG9jb21wbGV0ZURUTyc7XHJcbmltcG9ydCB7IEdsb2JhbFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0dsb2JhbFNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21WYWxpZGF0aW9uIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9DdXN0b21WYWxpZGF0aW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdCQlNGLUF1dG9jb21wbGV0ZVRleHRCb3gnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9BdXRvY29tcGxldGVUZXh0Qm94LmNvbXBvbmVudC5odG1sJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIFR5cGVhaGVhZE1vZHVsZSxcclxuICAgIEF1dG9jb21wbGV0ZUxpYk1vZHVsZVxyXG4gIF0sXHJcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5PX0VSUk9SU19TQ0hFTUFdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRvY29tcGxldGVUZXh0Qm94Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcblxyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyc3RhdGljID0gbnVsbDtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBFcnJvckhhbmRsZXI6IEVycm9yTWFzc2FnZVZhbGlkYXRpb24sIHByaXZhdGUgcmVxdWVzdEhhbmRsZXJTZXJ2aWNlOiBSZXF1ZXN0SGFuZGxlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbnRyb2xVdGlsaXR5OiBDb250cm9sVXRpbGl0eSwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBjb250cm9sQ29udGFpbmVyOlxyXG4gICAgICBDb250cm9sQ29udGFpbmVyLCBwdWJsaWMgYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsIHByaXZhdGUgdXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSwgcHJpdmF0ZSBnbG9iYWxTZXR0aW5nczogR2xvYmFsU2V0dGluZ3MpIHtcclxuICAgIEF1dG9jb21wbGV0ZVRleHRCb3hDb21wb25lbnQuY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICB9XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgb3B0aW9uczogQXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICBASW5wdXQoKSBEcm9wZG93blRlbXBsYXRlVmFyaWFibGU6IGFueTtcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAga2V5d29yZDogc3RyaW5nID0gJ3ZhbHVlJztcclxuICBhdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIFNlYXJjaDogc3RyaW5nID0gJyc7XHJcbiAgS2V5OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgYXBpOiBzdHJpbmcgPSAnaHR0cCc7XHJcbiAgVmFsdWU6IHN0cmluZyA9ICd2YWx1ZSc7XHJcbiAgbmV3U2VsZWN0aW9uVmFsaWRhdGlvbktleTogc3RyaW5nID0gJyc7XHJcbiAgbWFya0FsbEFzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcbiAgZGF0YVNvdXJjZTogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIHN1Z2dlc3Rpb25zJDogT2JzZXJ2YWJsZTxhbnlbXT47XHJcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgZGF0YUxpc3Q6IGFueVtdID0gW107XHJcbiAgU2VsZWN0ZWRWYWx1ZTogc3RyaW5nID0gXCJcIjtcclxuICBhdmF0YXJJbWFnZTogc3RyaW5nID0gXCIuL3NyYy9hc3NldHMvaW1hZ2VzL3VzZXJpbWcucG5nXCI7XHJcbiAgdGV4dERpcjtcclxuICBuZXdTZWxlY3Rpb25WYWxpZGF0aW9uOiBDdXN0b21WYWxpZGF0aW9uID0gbmV3IEN1c3RvbVZhbGlkYXRpb24oKTtcclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZSlcclxuICAgICAgdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVhZG9ubHkgJiYgIXRoaXMub3B0aW9ucy52YWx1ZSlcclxuICAgICAgdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdOQScpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZm9yY2VEaXJlY3Rpb24pXHJcbiAgICAgIHRoaXMudGV4dERpciA9IHRoaXMub3B0aW9ucy5mb3JjZURpcmVjdGlvbiA9PSAyID8gJ3J0bCcgOiAnbHRyJztcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy50ZXh0RGlyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJykgPT0gJ2FyJyA/ICdydGwnIDogJ2x0cic7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5pc0NyZWF0ZWRCZWZvciA9IGZhbHNlO1xyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMubmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sID0gdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm5hbWVdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudmlld1R5cGUpXHJcbiAgICAgIHRoaXMub3B0aW9ucy52aWV3VHlwZSA9IHRoaXMuZ2xvYmFsU2V0dGluZ3Mudmlld1R5cGU7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSBcIlwiKVxyXG4gICAgICB0aGlzLm9wdGlvbnMubGFiZWxWYWx1ZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSh0aGlzLm9wdGlvbnMubGFiZWxLZXkpO1xyXG5cclxuICAgIC8vIHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wuc2V0VmFsdWUodGhpcy5vcHRpb25zLlZhbHVlKTtcclxuXHJcblxyXG5cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93TmV3U2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMubG9hZFZhbGlkYXRvcigpO1xyXG4gICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbi5wdXNoKHRoaXMubmV3U2VsZWN0aW9uVmFsaWRhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLmN1c3RvbVZhbGlkYXRpb247XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXNhc3luYyk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlY3RlZFZhbHVlICE9IHVuZGVmaW5lZCAmJiB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuU2VsZWN0ZWRWYWx1ZSA9IHRoaXMub3B0aW9ucy5zZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2xIb3N0Lm5nU3VibWl0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5ncm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Ub2tlblxyXG4gICAgICB9KSxcclxuICAgIH07XHJcblxyXG5cclxuXHJcblxyXG4gICAgdGhpcy5zdWdnZXN0aW9ucyQgPSBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPHN0cmluZz4pID0+IHtcclxuICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLlNlYXJjaCk7XHJcbiAgICB9KS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHF1ZXJ5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAocXVlcnkpIHtcclxuICAgICAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCh0aGlzLm9wdGlvbnMucXVlcnlQYXJhbSwgcXVlcnkpO1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRyYUZpbHRlclBhcmFtTmFtZSAmJiB0aGlzLm9wdGlvbnMuZXh0cmFGaWx0ZXIpXHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQodGhpcy5vcHRpb25zLmV4dHJhRmlsdGVyUGFyYW1OYW1lLCAodHlwZW9mIHRoaXMub3B0aW9ucy5leHRyYUZpbHRlciA9PT0gXCJzdHJpbmdcIikgPyB0aGlzLm9wdGlvbnMuZXh0cmFGaWx0ZXIgOiB0aGlzLm9wdGlvbnMuZXh0cmFGaWx0ZXIoKSk7XHJcbiAgICAgICAgICBsZXQgcmVxdWVzdE9wdGlvbnNNb2RlbCA9IG5ldyBSZXF1ZXN0T3B0aW9uc01vZGVsKCk7XHJcbiAgICAgICAgICByZXF1ZXN0T3B0aW9uc01vZGVsLmRpc2FibGVCbG9ja1VJID0gdHJ1ZTtcclxuICAgICAgICAgIHJlcXVlc3RPcHRpb25zTW9kZWwuZGlzYWJsZVN1Y2Nlc3NOb3RpZmljYXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgLy8gdXNpbmcgZ2l0aHViIHB1YmxpYyBhcGkgdG8gZ2V0IHVzZXJzIGJ5IG5hbWVcclxuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RIYW5kbGVyU2VydmljZS5nZXQodGhpcy5vcHRpb25zLmFjdGlvblVSTCwgcGFyYW1zLCBudWxsLCByZXF1ZXN0T3B0aW9uc01vZGVsKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICBtYXAoKGRhdGEpID0+IGRhdGEgYXMgQXR0cmlidXRlW10gfHwgW10pLFxyXG4gICAgICAgICAgICAgIHRhcCgoKSA9PiBub29wLCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBodHRwIGVycm9yXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSB8fCAnU29tZXRoaW5nIGdvZXMgd3JvbmcnO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGxvYWRWYWxpZGF0b3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLm5ld1NlbGVjdGlvblZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5ID0gKGNvbnRyb2wpID0+IHtcclxuICAgICAgaWYgKChjb250cm9sLnZhbHVlICYmIHR5cGVvZiBjb250cm9sLnZhbHVlID09PSBcInN0cmluZ1wiKSlcclxuICAgICAgICByZXR1cm4geyBjdXN0b21lckVycm9yOiB0cnVlIH07XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICAgIHRoaXMubmV3U2VsZWN0aW9uVmFsaWRhdGlvbi5tYXNzYWdlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTmV3U2VsZWN0aW9uVmFsaWRhdGlvbktleVwiKTtcclxuICB9O1xyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnNldEF0dHJpYnV0ZUZvckNvbnRyb2wodGhpcy5vcHRpb25zKTtcclxuICB9XHJcbiAgcmVzZXRFcnJvciA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLnJlbW92ZUdsb2JhbEVycm9yKCk7XHJcbiAgfTtcclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKTtcclxuICB9XHJcblxyXG5cclxuICBnZXRFcnJvclZhbGlkYXRpb24gPSAoRXJyb3JMaXN0KSA9PiB7XHJcblxyXG4gICAgaWYgKHRoaXMubWFya0FsbEFzVG91Y2hlZCAmJiB0aGlzLmdyb3VwLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93R2xvYmFsRXJyb3IoKTtcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd05ld1NlbGVjdGlvbiAmJiAhdGhpcy5vcHRpb25zLmN1c3RvbVZhbGlkYXRpb24uaW5jbHVkZXModGhpcy5uZXdTZWxlY3Rpb25WYWxpZGF0aW9uKSlcclxuICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVZhbGlkYXRpb24ucHVzaCh0aGlzLm5ld1NlbGVjdGlvblZhbGlkYXRpb24pO1xyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbFV0aWxpdHkuZ2V0RXJyb3JWYWxpZGF0aW9uTWFzc2FnZShFcnJvckxpc3QsIHRoaXMuZ3JvdXAsIHRoaXMub3B0aW9ucyk7XHJcbiAgfTtcclxuXHJcbiAgY29weUlucHV0TWVzc2FnZShpbnB1dEVsZW1lbnQpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQ29weUlucHV0TWVzc2FnZShpbnB1dEVsZW1lbnQpO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdEV2ZW50KGl0ZW0pIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dOZXdTZWxlY3Rpb24gPT0gdHJ1ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gJ29iamVjdCcpIHtcclxuICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnNldFZhbHVlKGl0ZW0pO1xyXG4gICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBBdXRvY29tcGxldGVNb2RlbCA9IG5ldyBBdXRvY29tcGxldGVEVE8oKTtcclxuICAgICAgICBBdXRvY29tcGxldGVNb2RlbC52YWx1ZSA9IGl0ZW07XHJcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5zZXRWYWx1ZShBdXRvY29tcGxldGVNb2RlbCk7XHJcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnZhbHVlID09IGl0ZW0udmFsdWUpIHtcclxuICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICBlcnJvck1hc3NhZ2U6IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTmV3U2VsZWN0aW9uVmFsaWRhdGlvbktleScpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5pbnZhbGlkO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnNldFZhbHVlKGl0ZW0pO1xyXG4gICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIGxldCBvcmlnaW5hbFZhbHVlID0gdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC52YWx1ZTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucGF0Y2hGdW5jdGlvbiAmJlxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoUGF0aCAmJlxyXG4gICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5uYW1lKS52YWxpZFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXRjaENvbnRyb2xWYWx1ZShcclxuICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZSxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoRnVuY3Rpb24sXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYXRjaFBhdGhcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBtb3ZlIHRoaXMgbGluZSBoZXJlIHRvIGVtaXQgdmFsdWUgbm8gbWF0dGVyIGlzIGZyb20gZGF0YWJhc2Ugb3Igbm90XHJcbiAgICB0aGlzLk9uQ2hhbmdlLmVtaXQodGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC52YWx1ZSk7XHJcbiAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudmFsdWU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNoYW5nZVNlYXJjaChzZWFyY2g6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tYXhMZW5ndGggJiYgc2VhcmNoLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXhMZW5ndGgpIHtcclxuICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sO1xyXG4gICAgICBmb3JtQ29udHJvbC5zZXRFcnJvcnMoeyBlcnJvck1hc3NhZ2U6IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIk1heExlbmdodFZhbGlkYXRpb25LZXlcIikgKyBcIiBcIiArIHRoaXMub3B0aW9ucy5tYXhMZW5ndGggfSk7XHJcbiAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5TZWFyY2ggPSBzZWFyY2g7XHJcbiAgICB0aGlzLlNlbGVjdGVkVmFsdWUgPSBcIlwiO1xyXG4gICAgYXdhaXQgdGhpcy5zdWdnZXN0aW9ucyQuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDAgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSAmJiB0aGlzLm9wdGlvbnMuYWxsb3dOZXdTZWxlY3Rpb24gPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YUxpc3QgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleTogMCxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuU2VhcmNoXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmRhdGFMaXN0ID0gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXRDbGVhcmVkKCkge1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuICAvLyBvbkZvY3VzZWQoZSkge1xyXG4gIC8vICAgLy8gZG8gc29tZXRoaW5nXHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgLy8gb25CbHVyKFZhbHVlKSB7XHJcbiAgLy8gICBpZiAodGhpcy5vcHRpb25zLkFsbG93TmV3U2VsZWN0aW9uID09IHRydWUpIHtcclxuXHJcbiAgLy8gICAgIGlmICh0eXBlb2YgKFZhbHVlKSA9PSAnb2JqZWN0Jykge1xyXG4gIC8vICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wuc2V0VmFsdWUoVmFsdWUpO1xyXG4gIC8vICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXHJcblxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGVsc2Uge1xyXG4gIC8vICAgICAgIGxldCBBdXRvY29tcGxldGVNb2RlbCA9IG5ldyBBdXRvY29tcGxldGVEVE8oKTtcclxuICAvLyAgICAgICBBdXRvY29tcGxldGVNb2RlbC52YWx1ZSA9IFZhbHVlO1xyXG4gIC8vICAgICAgIGxldCBtb2RlbCA9IG5ldyBUeXBlYWhlYWRNYXRjaChBdXRvY29tcGxldGVNb2RlbCxWYWx1ZSk7XHJcbiAgLy8gICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5zZXRWYWx1ZShtb2RlbCk7XHJcbiAgLy8gICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcclxuXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBlbHNlIHtcclxuXHJcbiAgLy8gICAgIGlmICh0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnZhbHVlID09IFZhbHVlKSB7XHJcbiAgLy8gICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5zZXRFcnJvcnMoeyBOZXdTZWxlY3Rpb25WYWxpZGF0aW9uS2V5OiB0aGlzLk5ld1NlbGVjdGlvblZhbGlkYXRpb25LZXkgfSk7XHJcbiAgLy8gICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgLy8gICAgICAgdGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5pbnZhbGlkO1xyXG4gIC8vICAgICAgIHJldHVybjtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICB9XHJcblxyXG5cclxuICAvLyBoYW5kbGVSZXN1bHRTZWxlY3RlZChyZXN1bHQpIHtcclxuXHJcbiAgLy8gICB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgLy8gICB0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxyXG4gIC8vICAgdGhpcy5PbkNoYW5nZS5lbWl0KHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudmFsdWUpXHJcbiAgLy8gICB0aGlzLlNlYXJjaCA9IHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudmFsdWUudmFsdWVcclxuXHJcblxyXG5cclxuICAvLyB9XHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgcmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5yZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH07XHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgcmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChjdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnJlbW92ZUN1c3RvbVZhbGlkYXRpb24odGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIGN1c3RvbVZhbGlkYXRpb24pO1xyXG4gIH07XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBhZGRDdXN0b21WYWxpZGF0aW9uID0gKGN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkQ3VzdG9tVmFsaWRhdGlvbih0aGlzLmF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgY3VzdG9tVmFsaWRhdGlvbik7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGlzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmlzVmFsaWQodGhpcy5hdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbCk7XHJcbiAgfTtcclxuXHJcbiAgY2hlY2tJc0F1dG9jb21wbGF0ZUluRmlsdGVyKCkge1xyXG4gICAgaWYgKHRoaXMuRHJvcGRvd25UZW1wbGF0ZVZhcmlhYmxlKSB7XHJcbiAgICAgIHRoaXMuRHJvcGRvd25UZW1wbGF0ZVZhcmlhYmxlLnRvZ2dsZSgpO1xyXG4gICAgICB0aGlzLkRyb3Bkb3duVGVtcGxhdGVWYXJpYWJsZS50b2dnbGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYmJzZi1jb250cm9sIGJic2YtYXV0b2NvbXBsZXRlLXRleHRib3hcIiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XHJcbiAgPGRpdiBbbmdDbGFzc109XCIob3B0aW9ucy52aWV3VHlwZT09MSk/J2Jic2YtdmVydGljYWwnOidiYnNmLWhvcml6b250YWwnXCI+XHJcbiAgICA8IS0tbGFiZWwtLT5cclxuICAgIDxsYWJlbCAqbmdJZj1cIiFvcHRpb25zLmhpZGVMYWJlbFwiIGNsYXNzPVwiYmJzZi1sYWJlbCB7e29wdGlvbnMubGFiZWxFeHRyYUNsYXNzZXN9fVwiPlxyXG4gICAgICB7e29wdGlvbnMubGFiZWxWYWx1ZX19XHJcbiAgICAgIDwhLS1Bc3Rlcmlzay0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIigob3B0aW9ucy5zaG93QXN0ZXJpc2smJm9wdGlvbnMuaXNSZXF1aXJlZCl8fChvcHRpb25zLmlzUmVxdWlyZWQpKSYmIW9wdGlvbnMuaXNSZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPCEtLUlucHV0IGNvbnRhaW5lci0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCIhb3B0aW9ucy5pc1JlYWRvbmx5XCI+XHJcbiAgICAgIDwhLS1pbnB1dC0tPlxyXG4gICAgICA8bmctYXV0b2NvbXBsZXRlIGNsYXNzPVwiZm9ybS1jb250cm9sICB7e29wdGlvbnMuZXh0cmFDbGFzc2VzfX1cIiAqbmdJZj1cIiFvcHRpb25zLmFsbG93TmV3U2VsZWN0aW9uXCJcclxuICAgICAgICBbZGF0YV09XCJkYXRhTGlzdFwiIFtpbml0aWFsVmFsdWVdPVwiU2VsZWN0ZWRWYWx1ZVwiIFtzZWFyY2hLZXl3b3JkXT1cImtleXdvcmRcIiBwbGFjZWhvbGRlcj1cInt7b3B0aW9ucy5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAoc2VsZWN0ZWQpPSdzZWxlY3RFdmVudCgkZXZlbnQpJyAoaW5wdXRDaGFuZ2VkKT0nb25DaGFuZ2VTZWFyY2goJGV2ZW50KScgXHJcbiAgICAgICAgW2l0ZW1UZW1wbGF0ZV09XCJvcHRpb25zLmN1c3RvbVRlbXBsYXRlP29wdGlvbnMuY3VzdG9tVGVtcGxhdGU6aXRlbVRlbXBsYXRlXCIgW2Rpcl09XCJ0ZXh0RGlyXCIgXHJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tuYW1lfX1cIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIiBhcmlhLWludmFsaWQ9XCJ0cnVlXCJcclxuICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJhdXRvQ29tcGxldGVUZXh0Qm94Q29udHJvbC5pbnZhbGlkICYmIGF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnRvdWNoZWRcIlxyXG4gICAgICAgIChpbnB1dENsZWFyZWQpPVwib25JbnB1dENsZWFyZWQoKVwiIChjbG9zZWQpPVwiY2hlY2tJc0F1dG9jb21wbGF0ZUluRmlsdGVyKClcIj5cclxuICAgICAgPC9uZy1hdXRvY29tcGxldGU+XHJcblxyXG4gICAgICA8bmctYXV0b2NvbXBsZXRlIGNsYXNzPVwiZm9ybS1jb250cm9sIHt7b3B0aW9ucy5leHRyYUNsYXNzZXN9fVwiICpuZ0lmPVwib3B0aW9ucy5hbGxvd05ld1NlbGVjdGlvblwiIFtkYXRhXT1cImRhdGFMaXN0XCJcclxuICAgICAgICBbaW5pdGlhbFZhbHVlXT1cIlNlbGVjdGVkVmFsdWVcIiBbc2VhcmNoS2V5d29yZF09XCJrZXl3b3JkXCIgcGxhY2Vob2xkZXI9XCJ7e29wdGlvbnMucGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgKHNlbGVjdGVkKT0nc2VsZWN0RXZlbnQoJGV2ZW50KScgKGlucHV0Q2hhbmdlZCk9J29uQ2hhbmdlU2VhcmNoKCRldmVudCknIFxyXG4gICAgICAgIFtpdGVtVGVtcGxhdGVdPVwib3B0aW9ucy5jdXN0b21UZW1wbGF0ZT9vcHRpb25zLmN1c3RvbVRlbXBsYXRlOml0ZW1UZW1wbGF0ZVwiIFtkaXJdPVwidGV4dERpclwiXHJcbiAgICAgICAgKGlucHV0Q2xlYXJlZCk9XCJvbklucHV0Q2xlYXJlZCgpXCIgZm9ybUNvbnRyb2xOYW1lPVwie3tuYW1lfX1cIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIlxyXG4gICAgICAgIGFyaWEtaW52YWxpZD1cInRydWVcIlxyXG4gICAgICAgIChjbG9zZWQpPVwiY2hlY2tJc0F1dG9jb21wbGF0ZUluRmlsdGVyKClcIlxyXG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLmludmFsaWQgJiYgYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICA8L25nLWF1dG9jb21wbGV0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjaXRlbVRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgIDxpbWcgKm5nSWY9XCJvcHRpb25zLml0ZW1XaXRoSW1hZ2VcIiBzcmM9XCJ7eyhpdGVtLmltYWdlP2l0ZW0uaW1hZ2U6YXZhdGFySW1hZ2UpfX1cIiAvPlxyXG4gICAgICAgIDxhIFtpbm5lckhUTUxdPVwiaXRlbS52YWx1ZVwiPjwvYT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSByZWFkb25seSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLmlzUmVhZG9ubHlcIj48c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZpZXdcIj57e2F1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLnZhbHVlLnZhbHVlfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIj5cclxuICAgIDwhLS0gbGFiZWxEZXNjcmlwdGlvbi0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtY29udHJvbC1kZXNjXCIgKm5nSWY9XCJvcHRpb25zLmxhYmVsRGVzY3JpcHRpb24hPW51bGxcIj57e29wdGlvbnMubGFiZWxEZXNjcmlwdGlvbn19PC9kaXY+XHJcbiAgICA8IS0tIHJlcXVpcmVkVGV4dC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvblwiICpuZ0lmPVwiKGF1dG9Db21wbGV0ZVRleHRCb3hDb250cm9sLmludmFsaWQgJiYgYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24oYXV0b0NvbXBsZXRlVGV4dEJveENvbnRyb2wuZXJyb3JzfGtleXZhbHVlKX19XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2ICpuZ0lmPVwiKGdyb3VwLnZhbGlkJiZncm91cC5kaXJ0eSYmZ3JvdXAudG91Y2hlZCApfHwoZ3JvdXAudW50b3VjaGVkJiZncm91cC5pbnZhbGlkJiZncm91cC5kaXJ0eSlcIj5cclxuICAgIHt7cmVzZXRFcnJvcigpfX0gPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=