@rangertechnologies/ngnxt 2.1.78 → 2.1.80

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 (116) hide show
  1. package/README.md +27 -30
  2. package/esm2022/lib/ar.i18n.mjs +29 -29
  3. package/esm2022/lib/components/custom-button/custom-button.component.mjs +39 -39
  4. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +366 -366
  5. package/esm2022/lib/components/custom-date/custom-date.component.mjs +47 -47
  6. package/esm2022/lib/components/custom-date-picker/custom-date-picker.component.mjs +48 -48
  7. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +219 -219
  8. package/esm2022/lib/components/custom-image/custom-image.component.mjs +34 -34
  9. package/esm2022/lib/components/custom-input/custom-input.component.mjs +93 -93
  10. package/esm2022/lib/components/custom-label/custom-label.component.mjs +21 -21
  11. package/esm2022/lib/components/custom-model/custom-model.component.mjs +48 -48
  12. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +115 -115
  13. package/esm2022/lib/components/custom-rich-text/custom-rich-text.component.mjs +156 -0
  14. package/esm2022/lib/components/custom-table/custom-table.component.mjs +169 -169
  15. package/esm2022/lib/components/custom-text-area/custom-text-area.component.mjs +65 -65
  16. package/esm2022/lib/components/custom-time/custom-time.component.mjs +61 -61
  17. package/esm2022/lib/components/dependent-table/dependent-table.component.mjs +42 -42
  18. package/esm2022/lib/components/dropdown-with-flag/dropdown-with-flag.component.mjs +39 -39
  19. package/esm2022/lib/components/file-upload/file-upload.component.mjs +233 -233
  20. package/esm2022/lib/components/file-view/file-view.component.mjs +46 -46
  21. package/esm2022/lib/components/loader/loader.component.mjs +23 -23
  22. package/esm2022/lib/components/pick-location/pick-location.component.mjs +188 -188
  23. package/esm2022/lib/components/search-box/search-box.component.mjs +130 -130
  24. package/esm2022/lib/components/table-appendix/table-appendix.component.mjs +123 -123
  25. package/esm2022/lib/directives/componenthost/componenthost.directive.mjs +19 -19
  26. package/esm2022/lib/en.i18n.mjs +29 -29
  27. package/esm2022/lib/i18n-config.service.mjs +4 -4
  28. package/esm2022/lib/i18n.component.mjs +47 -47
  29. package/esm2022/lib/i18n.module.mjs +38 -38
  30. package/esm2022/lib/i18n.pipe.mjs +25 -25
  31. package/esm2022/lib/i18n.service.mjs +56 -56
  32. package/esm2022/lib/interfaces/actionMeta.mjs +2 -2
  33. package/esm2022/lib/interfaces/apimeta.mjs +2 -2
  34. package/esm2022/lib/interfaces/dependencyMeta.mjs +2 -2
  35. package/esm2022/lib/model/bookletWrapper.mjs +9 -9
  36. package/esm2022/lib/model/changeWrapper.mjs +11 -11
  37. package/esm2022/lib/model/errorWrapper.mjs +6 -6
  38. package/esm2022/lib/model/tableWrapper.mjs +20 -20
  39. package/esm2022/lib/nxt-app.component.mjs +22 -22
  40. package/esm2022/lib/nxt-app.module.mjs +364 -352
  41. package/esm2022/lib/nxt-app.service.mjs +14 -14
  42. package/esm2022/lib/pages/booklet/booklet.component.mjs +540 -541
  43. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +428 -407
  44. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +2387 -2373
  45. package/esm2022/lib/pages/summary-page/summary-page.component.mjs +76 -76
  46. package/esm2022/lib/pipe/get-value.pipe.mjs +50 -50
  47. package/esm2022/lib/sample.mjs +3715 -3431
  48. package/esm2022/lib/services/change.service.mjs +53 -53
  49. package/esm2022/lib/services/data.service.mjs +80 -80
  50. package/esm2022/lib/services/salesforce.service.mjs +46 -46
  51. package/esm2022/lib/services/shared.service.mjs +100 -100
  52. package/esm2022/lib/services/storage.service.mjs +44 -44
  53. package/esm2022/lib/tam.i18n.mjs +29 -29
  54. package/esm2022/lib/wrapper.mjs +175 -175
  55. package/esm2022/public-api.mjs +15 -15
  56. package/esm2022/rangertechnologies-ngnxt.mjs +4 -4
  57. package/fesm2022/rangertechnologies-ngnxt.mjs +10306 -9830
  58. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  59. package/index.d.ts +5 -5
  60. package/lib/ar.i18n.d.ts +24 -24
  61. package/lib/components/custom-button/custom-button.component.d.ts +16 -16
  62. package/lib/components/custom-calendar/custom-calendar.component.d.ts +65 -65
  63. package/lib/components/custom-date/custom-date.component.d.ts +18 -18
  64. package/lib/components/custom-date-picker/custom-date-picker.component.d.ts +19 -19
  65. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +39 -39
  66. package/lib/components/custom-image/custom-image.component.d.ts +13 -13
  67. package/lib/components/custom-input/custom-input.component.d.ts +31 -31
  68. package/lib/components/custom-label/custom-label.component.d.ts +10 -10
  69. package/lib/components/custom-model/custom-model.component.d.ts +19 -19
  70. package/lib/components/custom-radio/custom-radio.component.d.ts +33 -33
  71. package/lib/components/custom-rich-text/custom-rich-text.component.d.ts +29 -0
  72. package/lib/components/custom-table/custom-table.component.d.ts +43 -43
  73. package/lib/components/custom-text-area/custom-text-area.component.d.ts +22 -22
  74. package/lib/components/custom-time/custom-time.component.d.ts +18 -18
  75. package/lib/components/dependent-table/dependent-table.component.d.ts +15 -15
  76. package/lib/components/dropdown-with-flag/dropdown-with-flag.component.d.ts +16 -16
  77. package/lib/components/file-upload/file-upload.component.d.ts +42 -42
  78. package/lib/components/file-view/file-view.component.d.ts +16 -16
  79. package/lib/components/loader/loader.component.d.ts +11 -11
  80. package/lib/components/pick-location/pick-location.component.d.ts +42 -42
  81. package/lib/components/search-box/search-box.component.d.ts +40 -40
  82. package/lib/components/table-appendix/table-appendix.component.d.ts +30 -30
  83. package/lib/directives/componenthost/componenthost.directive.d.ts +8 -8
  84. package/lib/en.i18n.d.ts +24 -24
  85. package/lib/i18n-config.service.d.ts +2 -2
  86. package/lib/i18n.component.d.ts +11 -11
  87. package/lib/i18n.module.d.ts +9 -9
  88. package/lib/i18n.pipe.d.ts +10 -10
  89. package/lib/i18n.service.d.ts +14 -14
  90. package/lib/interfaces/actionMeta.d.ts +5 -5
  91. package/lib/interfaces/apimeta.d.ts +14 -14
  92. package/lib/interfaces/dependencyMeta.d.ts +8 -8
  93. package/lib/model/bookletWrapper.d.ts +5 -5
  94. package/lib/model/changeWrapper.d.ts +10 -10
  95. package/lib/model/errorWrapper.d.ts +5 -5
  96. package/lib/model/tableWrapper.d.ts +18 -18
  97. package/lib/nxt-app.component.d.ts +8 -8
  98. package/lib/nxt-app.module.d.ts +47 -46
  99. package/lib/nxt-app.service.d.ts +6 -6
  100. package/lib/pages/booklet/booklet.component.d.ts +68 -68
  101. package/lib/pages/questionbook/questionbook.component.d.ts +66 -66
  102. package/lib/pages/questionnaire/questionnaire.component.d.ts +220 -218
  103. package/lib/pages/summary-page/summary-page.component.d.ts +20 -20
  104. package/lib/pipe/get-value.pipe.d.ts +7 -7
  105. package/lib/sample.d.ts +11 -10
  106. package/lib/services/change.service.d.ts +22 -22
  107. package/lib/services/data.service.d.ts +13 -13
  108. package/lib/services/salesforce.service.d.ts +11 -11
  109. package/lib/services/shared.service.d.ts +15 -15
  110. package/lib/services/storage.service.d.ts +13 -13
  111. package/lib/tam.i18n.d.ts +24 -24
  112. package/lib/wrapper.d.ts +203 -203
  113. package/package.json +3 -3
  114. package/public-api.d.ts +10 -10
  115. package/rangertechnologies-ngnxt-2.1.80.tgz +0 -0
  116. package/rangertechnologies-ngnxt-2.1.78.tgz +0 -0
@@ -1,130 +1,130 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild, } from "@angular/core";
2
- import { ChangeWrapper } from "../../model/changeWrapper";
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../services/salesforce.service";
5
- import * as i2 from "../../services/data.service";
6
- import * as i3 from "@angular/router";
7
- import * as i4 from "../../i18n.service";
8
- import * as i5 from "@angular/common";
9
- import * as i6 from "@angular/forms";
10
- import * as i7 from "../../pipe/get-value.pipe";
11
- export class SearchBoxComponent {
12
- sfService;
13
- dataService;
14
- route;
15
- i18nService;
16
- placeHolderText;
17
- auto;
18
- question;
19
- apiMeta;
20
- id;
21
- readOnly = false; // VD 12Jun24 - readonly change
22
- searchValueChange = new EventEmitter();
23
- apiObj;
24
- SearchItem;
25
- filterName; // VD 20Aug default filter value as input
26
- finalResults = [];
27
- searchKeyWord = '';
28
- newResult;
29
- showResult = false;
30
- noResult = false;
31
- showSuggestion = true;
32
- el;
33
- serv = 'api';
34
- tkn = '';
35
- constructor(sfService, dataService, route, el, i18nService) {
36
- this.sfService = sfService;
37
- this.dataService = dataService;
38
- this.route = route;
39
- this.i18nService = i18nService;
40
- }
41
- ngOnInit() {
42
- // VD 03May- search changes
43
- if (this.apiMeta) {
44
- let apiObj = JSON.parse(this.apiMeta);
45
- this.SearchItem = apiObj.field;
46
- }
47
- }
48
- clearList() {
49
- setTimeout(() => {
50
- this.finalResults = [];
51
- }, 1000);
52
- }
53
- getSourceDataLocal(event) {
54
- if (event.target.value.length > 2) {
55
- this.showSuggestion = true;
56
- this.finalResults = [];
57
- this.searchKeyWord = event.target.value;
58
- this.showResult = false;
59
- this.getSourceData(event.target.value);
60
- }
61
- else {
62
- this.showSuggestion = false;
63
- this.finalResults = [];
64
- this.noResult = false;
65
- }
66
- }
67
- // VD 03May- search changes
68
- // VD 31NOV24 null check
69
- getSourceData = (keyword) => {
70
- if (this.apiMeta) {
71
- let apiObj = JSON.parse(this.apiMeta);
72
- this.dataService.apiResponse(apiObj.endpoint).subscribe((apiResponse) => {
73
- let response;
74
- if (apiObj.variable) {
75
- // VD 22May24 - handling multiple child objects
76
- response = this.dataService.getValue(apiResponse, apiObj.variable);
77
- }
78
- else {
79
- response = apiResponse;
80
- }
81
- let field = apiObj.field;
82
- let results = [];
83
- for (let i = 0; i < response.length; i++) { // VD NOV23 - updated the search keys
84
- // VD 26JUN24 - handling multiple objects
85
- const objValue = this.dataService.getValue(response[i], field);
86
- if (objValue?.toLowerCase().includes(keyword?.toLowerCase())) {
87
- console.log('pushing ' + objValue);
88
- results.push(response[i]);
89
- }
90
- }
91
- this.noResult = !(results.length > 1);
92
- this.finalResults = results;
93
- });
94
- }
95
- };
96
- clickItem(event) {
97
- // console.log('inside clickItem of ' + event.target.value);
98
- let apiObj = JSON.parse(this.apiMeta);
99
- this.filterName = event[apiObj.field];
100
- let change = new ChangeWrapper(); // ChangeWrapper = JSON.parse('{}');
101
- change.fromQuestionId = this.id;
102
- change.valueObj = event;
103
- change.field = apiObj.field;
104
- this.searchValueChange.emit(change);
105
- }
106
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SearchBoxComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.ActivatedRoute }, { token: i0.ElementRef }, { token: i4.I18nService }], target: i0.ɵɵFactoryTarget.Component });
107
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SearchBoxComponent, selector: "lib-search-box", inputs: { placeHolderText: "placeHolderText", question: "question", apiMeta: "apiMeta", id: "id", readOnly: "readOnly", filterName: "filterName" }, outputs: { searchValueChange: "searchValueChange" }, viewQueries: [{ propertyName: "auto", first: true, predicate: ["auto"], descendants: true }], ngImport: i0, template: "<!-- // VD 12Jun24 - readonly change-->\r\n<div id=\"autocomplete-input\"> <!-- SKS5NOV25 search icon -->\r\n <input #auto id=\"searchbox-style\"\r\n (blur)=\"clearList()\" \r\n [(ngModel)]=\"filterName\" \r\n type=\"text\" \r\n name=\"name\" \r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolderText\" \r\n style=\"margin: 0 !important; padding-right: 30px;\" \r\n class=\"searchInput she-line-input form-control\" \r\n (focusin)=\"getSourceDataLocal($event)\" \r\n (input)=\"getSourceDataLocal($event)\">\r\n <div id=\"selectList\" style=\"position: absolute;position: absolute;background: white;z-index: 2;\">\r\n <div *ngIf=\"finalResults.length > 0 && showSuggestion\" \r\n style=\"max-height: 100vh;border: 1px solid #d2d4d6;overflow: scroll;\" \r\n class=\"suggestions-container\">\r\n <!-- HA 20DEC23 Uncommented the logic -->\r\n <!-- VD 03May- search changes -->\r\n <div *ngFor=\"let item of finalResults\" (click)='clickItem(item)' class=\"hoover\">\r\n <!-- VD 26Jun24 - id condition removed -->\r\n <div class=\"grid-x align-middle\" style=\"padding: 1rem\">\r\n <div *ngIf=\"item.thumbnail\" class=\"cell shrink\" style=\"width: 60px; margin-right: 1.6rem;\">\r\n <img [src]=\"item.thumbnail\" style=\"width: 60px;\" alt=\"\">\r\n </div>\r\n <div class=\"cell auto\" style=\"text-align: left; padding-left: 20px;\">\r\n <!--// VD 26JUN24 - pipe changes -->\r\n <h4 >{{ '' | getValue: item : SearchItem }}</h4>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- HA 20DEC23 For Commented this for future purpose -->\r\n <!-- <table class=\"table table-striped table-bordered\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'firstName' | i18n:i18nService.currentLanguage }}</th>\r\n <th>{{ 'lastName' | i18n:i18nService.currentLanguage }}</th>\r\n <th>{{ 'division' | i18n:i18nService.currentLanguage }}</th>\r\n <th>{{ 'numberPlate' | i18n:i18nService.currentLanguage }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of finalResults\" (click)='clickItem(item)'>\r\n <td>{{ item.firstName }}</td>\r\n <td>{{ item.lastName }}</td>\r\n <td>{{ item.division }}</td>\r\n <td>{{ item.numberPlate }}</td>\r\n </tr>\r\n </tbody>\r\n </table> -->\r\n </div>\r\n</div>\r\n", styles: ["#searchbox-style{background-image:url('data:image/svg+xml;utf8,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\"/><path d=\"M20 20L17 17\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>');background-position:right 5px center;background-repeat:no-repeat;background-size:24px;padding-right:35px}\n"], dependencies: [{ 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: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i7.GetValuePipe, name: "getValue" }] });
108
- }
109
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SearchBoxComponent, decorators: [{
110
- type: Component,
111
- args: [{ selector: 'lib-search-box', template: "<!-- // VD 12Jun24 - readonly change-->\r\n<div id=\"autocomplete-input\"> <!-- SKS5NOV25 search icon -->\r\n <input #auto id=\"searchbox-style\"\r\n (blur)=\"clearList()\" \r\n [(ngModel)]=\"filterName\" \r\n type=\"text\" \r\n name=\"name\" \r\n [readOnly]=\"readOnly\"\r\n [placeholder]=\"placeHolderText\" \r\n style=\"margin: 0 !important; padding-right: 30px;\" \r\n class=\"searchInput she-line-input form-control\" \r\n (focusin)=\"getSourceDataLocal($event)\" \r\n (input)=\"getSourceDataLocal($event)\">\r\n <div id=\"selectList\" style=\"position: absolute;position: absolute;background: white;z-index: 2;\">\r\n <div *ngIf=\"finalResults.length > 0 && showSuggestion\" \r\n style=\"max-height: 100vh;border: 1px solid #d2d4d6;overflow: scroll;\" \r\n class=\"suggestions-container\">\r\n <!-- HA 20DEC23 Uncommented the logic -->\r\n <!-- VD 03May- search changes -->\r\n <div *ngFor=\"let item of finalResults\" (click)='clickItem(item)' class=\"hoover\">\r\n <!-- VD 26Jun24 - id condition removed -->\r\n <div class=\"grid-x align-middle\" style=\"padding: 1rem\">\r\n <div *ngIf=\"item.thumbnail\" class=\"cell shrink\" style=\"width: 60px; margin-right: 1.6rem;\">\r\n <img [src]=\"item.thumbnail\" style=\"width: 60px;\" alt=\"\">\r\n </div>\r\n <div class=\"cell auto\" style=\"text-align: left; padding-left: 20px;\">\r\n <!--// VD 26JUN24 - pipe changes -->\r\n <h4 >{{ '' | getValue: item : SearchItem }}</h4>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- HA 20DEC23 For Commented this for future purpose -->\r\n <!-- <table class=\"table table-striped table-bordered\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'firstName' | i18n:i18nService.currentLanguage }}</th>\r\n <th>{{ 'lastName' | i18n:i18nService.currentLanguage }}</th>\r\n <th>{{ 'division' | i18n:i18nService.currentLanguage }}</th>\r\n <th>{{ 'numberPlate' | i18n:i18nService.currentLanguage }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of finalResults\" (click)='clickItem(item)'>\r\n <td>{{ item.firstName }}</td>\r\n <td>{{ item.lastName }}</td>\r\n <td>{{ item.division }}</td>\r\n <td>{{ item.numberPlate }}</td>\r\n </tr>\r\n </tbody>\r\n </table> -->\r\n </div>\r\n</div>\r\n", styles: ["#searchbox-style{background-image:url('data:image/svg+xml;utf8,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\"/><path d=\"M20 20L17 17\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>');background-position:right 5px center;background-repeat:no-repeat;background-size:24px;padding-right:35px}\n"] }]
112
- }], ctorParameters: function () { return [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.ActivatedRoute }, { type: i0.ElementRef }, { type: i4.I18nService }]; }, propDecorators: { placeHolderText: [{
113
- type: Input
114
- }], auto: [{
115
- type: ViewChild,
116
- args: ['auto']
117
- }], question: [{
118
- type: Input
119
- }], apiMeta: [{
120
- type: Input
121
- }], id: [{
122
- type: Input
123
- }], readOnly: [{
124
- type: Input
125
- }], searchValueChange: [{
126
- type: Output
127
- }], filterName: [{
128
- type: Input
129
- }] } });
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvc2VhcmNoLWJveC9zZWFyY2gtYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBSVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBU3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7O0FBUzFELE1BQU0sT0FBTyxrQkFBa0I7SUF3Qm5CO0lBQ0E7SUFDQTtJQUVHO0lBM0JKLGVBQWUsQ0FBUztJQUNkLElBQUksQ0FBQztJQUVmLFFBQVEsQ0FBQztJQUNULE9BQU8sQ0FBUztJQUNoQixFQUFFLENBQVM7SUFDWCxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsK0JBQStCO0lBQ2hELGlCQUFpQixHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUM1RixNQUFNLENBQUs7SUFDWCxVQUFVLENBQU07SUFFUixVQUFVLENBQVMsQ0FBQyx5Q0FBeUM7SUFDL0QsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixhQUFhLEdBQVcsRUFBRSxDQUFDO0lBQzNCLFNBQVMsQ0FBTTtJQUNmLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLEVBQUUsQ0FBYztJQUNoQixJQUFJLEdBQVcsS0FBSyxDQUFDO0lBQ3JCLEdBQUcsR0FBVyxFQUFFLENBQUM7SUFFekIsWUFDVSxTQUE0QixFQUM1QixXQUF3QixFQUN4QixLQUFxQixFQUM3QixFQUFjLEVBQ0gsV0FBd0I7UUFKM0IsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFFbEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7SUFDakMsQ0FBQztJQUVMLFFBQVE7UUFDViw0QkFBNEI7UUFDeEIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFDO1lBQ2QsSUFBSSxNQUFNLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxVQUFVLENBQUMsR0FBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQUs7UUFDdEIsSUFBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUMsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxHQUFDLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjtJQUNILENBQUM7SUFDRCwyQkFBMkI7SUFDM0Isd0JBQXdCO0lBQ2pCLGFBQWEsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFO1FBQ3pDLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLE1BQU0sR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ3RFLElBQUksUUFBUSxDQUFDO2dCQUNiLElBQUcsTUFBTSxDQUFDLFFBQVEsRUFBQztvQkFDakIsK0NBQStDO29CQUM5QyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDcEU7cUJBQUk7b0JBQ0gsUUFBUSxHQUFHLFdBQVcsQ0FBQztpQkFDeEI7Z0JBQ0gsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDekIsSUFBSSxPQUFPLEdBQUMsRUFBRSxDQUFDO2dCQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUscUNBQXFDO29CQUNoRix5Q0FBeUM7b0JBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUQsSUFBRyxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO3dCQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQzt3QkFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDM0I7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUE7U0FDSDtJQUNELENBQUMsQ0FBQTtJQUVNLFNBQVMsQ0FBQyxLQUFLO1FBQ3BCLDREQUE0RDtRQUM1RCxJQUFJLE1BQU0sR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLG9DQUFvQztRQUN0RSxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDeEIsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQzt1R0FoR1Usa0JBQWtCOzJGQUFsQixrQkFBa0IsNlZDN0IvQiw2cUZBb0RBOzsyRkR2QmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGdCQUFnQjtrTkFLakIsZUFBZTtzQkFBdkIsS0FBSztnQkFDYSxJQUFJO3NCQUF0QixTQUFTO3VCQUFDLE1BQU07Z0JBRVIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksaUJBQWlCO3NCQUExQixNQUFNO2dCQUlFLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2FsZXNmb3JjZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2FsZXNmb3JjZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbi8vIFZEIDIzSkFOMjQgcmVtb3ZlZCBodHRwQ2xpZW50IGltcG9ydCB1c2VkIHNlcnZpY2UgZmlsZSBmb3IgY2FsbG91dFxyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEl0ZW1zTGlzdCB9IGZyb20gXCJAbmctc2VsZWN0L25nLXNlbGVjdC9saWIvaXRlbXMtbGlzdFwiO1xyXG5pbXBvcnQgeyBDb25zb2xlU2VydmljZSB9IGZyb20gXCJAbmctc2VsZWN0L25nLXNlbGVjdC9saWIvY29uc29sZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFQSU1ldGEgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9hcGltZXRhXCI7XHJcbmltcG9ydCB7IENoYW5nZVdyYXBwZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWwvY2hhbmdlV3JhcHBlclwiO1xyXG4vLyBIQSAxOURFQzIzIGltcG9ydGVkIHRyYW5zbGF0aW9uIHNlcnZpY2VcclxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vaTE4bi5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zZWFyY2gtYm94JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWJveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2VhcmNoLWJveC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlYXJjaEJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgcGxhY2VIb2xkZXJUZXh0OiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZCgnYXV0bycpIGF1dG87XHJcblxyXG4gIEBJbnB1dCgpIHF1ZXN0aW9uO1xyXG4gIEBJbnB1dCgpIGFwaU1ldGE6IHN0cmluZztcclxuICBASW5wdXQoKSBpZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7IC8vIFZEIDEySnVuMjQgLSByZWFkb25seSBjaGFuZ2VcclxuICBAT3V0cHV0KCkgc2VhcmNoVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlV3JhcHBlcj4oKTtcclxuICAgYXBpT2JqOmFueTtcclxuICAgU2VhcmNoSXRlbTogYW55O1xyXG5cclxuICBASW5wdXQoKSBmaWx0ZXJOYW1lOiBzdHJpbmc7IC8vIFZEIDIwQXVnIGRlZmF1bHQgZmlsdGVyIHZhbHVlIGFzIGlucHV0XHJcbiAgcHVibGljIGZpbmFsUmVzdWx0czogYW55W10gPSBbXTtcclxuICBwdWJsaWMgc2VhcmNoS2V5V29yZDogc3RyaW5nID0gJyc7XHJcbiAgcHVibGljIG5ld1Jlc3VsdDogYW55O1xyXG4gIHB1YmxpYyBzaG93UmVzdWx0ID0gZmFsc2U7XHJcbiAgcHVibGljIG5vUmVzdWx0ID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dTdWdnZXN0aW9uID0gdHJ1ZTtcclxuICBwcml2YXRlIGVsOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHNlcnY6IHN0cmluZyA9ICdhcGknO1xyXG4gIHByaXZhdGUgdGtuOiBzdHJpbmcgPSAnJztcclxuICBcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc2ZTZXJ2aWNlOiBTYWxlc2ZvcmNlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwdWJsaWMgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbi8vICBWRCAwM01heS0gc2VhcmNoIGNoYW5nZXNcclxuICAgIGlmKHRoaXMuYXBpTWV0YSl7XHJcbiAgICAgIGxldCBhcGlPYmo6IEFQSU1ldGEgPSBKU09OLnBhcnNlKHRoaXMuYXBpTWV0YSk7XHJcbiAgICAgIHRoaXMuU2VhcmNoSXRlbSA9IGFwaU9iai5maWVsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyTGlzdCgpe1xyXG4gICAgc2V0VGltZW91dCgoKT0+IHtcclxuICAgICAgdGhpcy5maW5hbFJlc3VsdHMgPSBbXTtcclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U291cmNlRGF0YUxvY2FsKGV2ZW50KSB7IC8vdG8gZ2V0IHJlc3VsdHMgbGlzdCBmcm9tIGJhY2tlbmQgQVBJIHdoZW5ldmVyIGtleSBpcyB1cCBhZnRlciB0aGUgZW50ZXJpbmcgYXRsZWFzdCBvbmUga2V5XHJcbiAgICBpZihldmVudC50YXJnZXQudmFsdWUubGVuZ3RoID4gMil7XHJcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb249dHJ1ZTtcclxuICAgICAgdGhpcy5maW5hbFJlc3VsdHM9W107XHJcbiAgICAgIHRoaXMuc2VhcmNoS2V5V29yZCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgdGhpcy5zaG93UmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ2V0U291cmNlRGF0YShldmVudC50YXJnZXQudmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbj1mYWxzZTtcclxuICAgICAgdGhpcy5maW5hbFJlc3VsdHMgPSBbXTtcclxuICAgICAgdGhpcy5ub1Jlc3VsdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyBWRCAwM01heS0gc2VhcmNoIGNoYW5nZXNcclxuICAvLyBWRCAzMU5PVjI0IG51bGwgY2hlY2tcclxuICBwdWJsaWMgZ2V0U291cmNlRGF0YSA9IChrZXl3b3JkOiBzdHJpbmcpID0+IHtcclxuICAgIGlmKHRoaXMuYXBpTWV0YSkge1xyXG4gICAgIGxldCBhcGlPYmo6IEFQSU1ldGEgPSBKU09OLnBhcnNlKHRoaXMuYXBpTWV0YSk7XHJcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpUmVzcG9uc2UoYXBpT2JqLmVuZHBvaW50KS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgIGlmKGFwaU9iai52YXJpYWJsZSl7XHJcbiAgICAgICAgICAvLyBWRCAyMk1heTI0IC0gaGFuZGxpbmcgbXVsdGlwbGUgY2hpbGQgb2JqZWN0c1xyXG4gICAgICAgICAgIHJlc3BvbnNlID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShhcGlSZXNwb25zZSxhcGlPYmoudmFyaWFibGUpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgcmVzcG9uc2UgPSBhcGlSZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgIGxldCBmaWVsZCA9IGFwaU9iai5maWVsZDtcclxuICAgICAgbGV0IHJlc3VsdHM9W107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2UubGVuZ3RoOyBpKyspIHsgLy8gVkQgTk9WMjMgLSB1cGRhdGVkIHRoZSBzZWFyY2gga2V5c1xyXG4gICAgICAgLy8gVkQgMjZKVU4yNCAtIGhhbmRsaW5nIG11bHRpcGxlIG9iamVjdHNcclxuICAgICAgICBjb25zdCBvYmpWYWx1ZSA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUocmVzcG9uc2VbaV0sZmllbGQpO1xyXG4gICAgICAgIGlmKG9ialZhbHVlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGtleXdvcmQ/LnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygncHVzaGluZyAnICsgb2JqVmFsdWUpO1xyXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3BvbnNlW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ub1Jlc3VsdCA9ICEocmVzdWx0cy5sZW5ndGggPiAxKTtcclxuICAgICAgdGhpcy5maW5hbFJlc3VsdHMgPSByZXN1bHRzO1xyXG4gICAgfSlcclxuICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xpY2tJdGVtKGV2ZW50KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnaW5zaWRlIGNsaWNrSXRlbSBvZiAnICsgZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuICAgIGxldCBhcGlPYmo6IEFQSU1ldGEgPSBKU09OLnBhcnNlKHRoaXMuYXBpTWV0YSk7XHJcbiAgICB0aGlzLmZpbHRlck5hbWUgPSBldmVudFthcGlPYmouZmllbGRdO1xyXG4gICAgbGV0IGNoYW5nZSA9IG5ldyBDaGFuZ2VXcmFwcGVyKCk7IC8vIENoYW5nZVdyYXBwZXIgPSBKU09OLnBhcnNlKCd7fScpO1xyXG4gICAgY2hhbmdlLmZyb21RdWVzdGlvbklkID0gdGhpcy5pZDtcclxuICAgIGNoYW5nZS52YWx1ZU9iaiA9IGV2ZW50O1xyXG4gICAgY2hhbmdlLmZpZWxkID0gYXBpT2JqLmZpZWxkO1xyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KGNoYW5nZSk7XHJcbiAgfVxyXG4gIC8qXHJcbiAgcHVibGljIGdldFNvdXJjZURhdGEgPSAoa2V5d29yZDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZih0aGlzLnNlcnYgPT0gXCJhcGlcIikge1xyXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLmdldEFQSURhdGEoXHJcbiAgICAgICAgdGhpcy50a24sXHJcbiAgICAgICAgW1wiUXVlc3Rpb25Cb29rXCIsIFwicmVhZFwiLCB1dWlkXSxcclxuICAgICAgICB0aGlzLnN1Y2Nlc3NTb3VyY2VEYXRhLFxyXG4gICAgICAgIHRoaXMuZmFpbHVyZVNvdXJjZURhdGFcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2ZTZXJ2aWNlLnJlbW90ZUFjdGlvbihcclxuICAgICAgICBcIk54dENvbnRyb2xsZXIucHJvY2Vzc1wiLFxyXG4gICAgICAgIFtcIlF1ZXN0aW9uQm9va1wiLCBcInJlYWRcIiwgdXVpZF0sXHJcbiAgICAgICAgdGhpcy5zdWNjZXNzU291cmNlRGF0YSxcclxuICAgICAgICB0aGlzLmZhaWx1cmVTb3VyY2VEYXRhXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3VjY2Vzc1NvdXJjZURhdGEgPSAocmVzcG9uc2UpID0+IHtcclxuICAgIGxldCByZXN1bHRzPVtdO1xyXG4gICAgcmVzdWx0cz1yZXNwb25zZS5yZXN1bHRzO1xyXG4gICAgcmVzdWx0cy5wdXNoKHt1dWlkOiBudWxsLCBuYW1lOiBcIlwifSk7XHJcbiAgICB0aGlzLm5vUmVzdWx0ID0gIShyZXN1bHRzLmxlbmd0aCA+IDEpO1xyXG4gICAgdGhpcy5maW5hbFJlc3VsdHMgPSByZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZhaWx1cmVTb3VyY2VEYXRhID0gKHJlc3BvbnNlKSA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVycm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBBUElcIik7XHJcbiAgfVxyXG4gICovXHJcbn1cclxuIiwiPCEtLSAvLyBWRCAxMkp1bjI0IC0gcmVhZG9ubHkgY2hhbmdlLS0+XHJcbjxkaXYgaWQ9XCJhdXRvY29tcGxldGUtaW5wdXRcIj4gPCEtLSBTS1M1Tk9WMjUgc2VhcmNoIGljb24gLS0+XHJcbiAgICA8aW5wdXQgI2F1dG8gaWQ9XCJzZWFyY2hib3gtc3R5bGVcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJjbGVhckxpc3QoKVwiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlck5hbWVcIiBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgbmFtZT1cIm5hbWVcIiBcclxuICAgICAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyVGV4dFwiIFxyXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogMCAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAzMHB4O1wiIFxyXG4gICAgICAgICAgICBjbGFzcz1cInNlYXJjaElucHV0IHNoZS1saW5lLWlucHV0IGZvcm0tY29udHJvbFwiIFxyXG4gICAgICAgICAgICAoZm9jdXNpbik9XCJnZXRTb3VyY2VEYXRhTG9jYWwoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAoaW5wdXQpPVwiZ2V0U291cmNlRGF0YUxvY2FsKCRldmVudClcIj5cclxuICAgIDxkaXYgaWQ9XCJzZWxlY3RMaXN0XCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7cG9zaXRpb246IGFic29sdXRlO2JhY2tncm91bmQ6IHdoaXRlO3otaW5kZXg6IDI7XCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiZmluYWxSZXN1bHRzLmxlbmd0aCA+IDAgJiYgc2hvd1N1Z2dlc3Rpb25cIiBcclxuICAgICAgICBzdHlsZT1cIm1heC1oZWlnaHQ6IDEwMHZoO2JvcmRlcjogMXB4IHNvbGlkICNkMmQ0ZDY7b3ZlcmZsb3c6IHNjcm9sbDtcIiBcclxuICAgICAgICBjbGFzcz1cInN1Z2dlc3Rpb25zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDwhLS0gSEEgMjBERUMyMyBVbmNvbW1lbnRlZCB0aGUgbG9naWMgLS0+XHJcbiAgICAgICAgIDwhLS0gVkQgMDNNYXktIHNlYXJjaCBjaGFuZ2VzIC0tPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmluYWxSZXN1bHRzXCIgKGNsaWNrKT0nY2xpY2tJdGVtKGl0ZW0pJyBjbGFzcz1cImhvb3ZlclwiPlxyXG4gICAgICAgICAgPCEtLSBWRCAyNkp1bjI0IC0gaWQgY29uZGl0aW9uIHJlbW92ZWQgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLXggYWxpZ24tbWlkZGxlXCIgc3R5bGU9XCJwYWRkaW5nOiAxcmVtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50aHVtYm5haWxcIiBjbGFzcz1cImNlbGwgc2hyaW5rXCIgc3R5bGU9XCJ3aWR0aDogNjBweDsgbWFyZ2luLXJpZ2h0OiAxLjZyZW07XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIml0ZW0udGh1bWJuYWlsXCIgc3R5bGU9XCJ3aWR0aDogNjBweDtcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbGwgYXV0b1wiIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZy1sZWZ0OiAyMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tLy8gVkQgMjZKVU4yNCAtIHBpcGUgY2hhbmdlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8aDQgPnt7ICcnIHwgZ2V0VmFsdWU6IGl0ZW0gOiBTZWFyY2hJdGVtICB9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBIQSAyMERFQzIzIEZvciBDb21tZW50ZWQgdGhpcyBmb3IgZnV0dXJlIHB1cnBvc2UgLS0+XHJcbiAgICAgICAgPCEtLSA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2ZpcnN0TmFtZScgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2xhc3ROYW1lJyB8IGkxOG46aTE4blNlcnZpY2UuY3VycmVudExhbmd1YWdlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD57eyAnZGl2aXNpb24nIHwgaTE4bjppMThuU2VydmljZS5jdXJyZW50TGFuZ3VhZ2UgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdudW1iZXJQbGF0ZScgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaW5hbFJlc3VsdHNcIiAoY2xpY2spPSdjbGlja0l0ZW0oaXRlbSknPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IGl0ZW0uZmlyc3ROYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLmxhc3ROYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLmRpdmlzaW9uIH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLm51bWJlclBsYXRlIH19PC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgPC90YWJsZT4gLS0+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
1
+ import { Component, Input, Output, EventEmitter, ViewChild, } from "@angular/core";
2
+ import { ChangeWrapper } from "../../model/changeWrapper";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/salesforce.service";
5
+ import * as i2 from "../../services/data.service";
6
+ import * as i3 from "@angular/router";
7
+ import * as i4 from "../../i18n.service";
8
+ import * as i5 from "@angular/common";
9
+ import * as i6 from "@angular/forms";
10
+ import * as i7 from "../../pipe/get-value.pipe";
11
+ export class SearchBoxComponent {
12
+ sfService;
13
+ dataService;
14
+ route;
15
+ i18nService;
16
+ placeHolderText;
17
+ auto;
18
+ question;
19
+ apiMeta;
20
+ id;
21
+ readOnly = false; // VD 12Jun24 - readonly change
22
+ searchValueChange = new EventEmitter();
23
+ apiObj;
24
+ SearchItem;
25
+ filterName; // VD 20Aug default filter value as input
26
+ finalResults = [];
27
+ searchKeyWord = '';
28
+ newResult;
29
+ showResult = false;
30
+ noResult = false;
31
+ showSuggestion = true;
32
+ el;
33
+ serv = 'api';
34
+ tkn = '';
35
+ constructor(sfService, dataService, route, el, i18nService) {
36
+ this.sfService = sfService;
37
+ this.dataService = dataService;
38
+ this.route = route;
39
+ this.i18nService = i18nService;
40
+ }
41
+ ngOnInit() {
42
+ // VD 03May- search changes
43
+ if (this.apiMeta) {
44
+ let apiObj = JSON.parse(this.apiMeta);
45
+ this.SearchItem = apiObj.field;
46
+ }
47
+ }
48
+ clearList() {
49
+ setTimeout(() => {
50
+ this.finalResults = [];
51
+ }, 1000);
52
+ }
53
+ getSourceDataLocal(event) {
54
+ if (event.target.value.length > 2) {
55
+ this.showSuggestion = true;
56
+ this.finalResults = [];
57
+ this.searchKeyWord = event.target.value;
58
+ this.showResult = false;
59
+ this.getSourceData(event.target.value);
60
+ }
61
+ else {
62
+ this.showSuggestion = false;
63
+ this.finalResults = [];
64
+ this.noResult = false;
65
+ }
66
+ }
67
+ // VD 03May- search changes
68
+ // VD 31NOV24 null check
69
+ getSourceData = (keyword) => {
70
+ if (this.apiMeta) {
71
+ let apiObj = JSON.parse(this.apiMeta);
72
+ this.dataService.apiResponse(apiObj.endpoint).subscribe((apiResponse) => {
73
+ let response;
74
+ if (apiObj.variable) {
75
+ // VD 22May24 - handling multiple child objects
76
+ response = this.dataService.getValue(apiResponse, apiObj.variable);
77
+ }
78
+ else {
79
+ response = apiResponse;
80
+ }
81
+ let field = apiObj.field;
82
+ let results = [];
83
+ for (let i = 0; i < response.length; i++) { // VD NOV23 - updated the search keys
84
+ // VD 26JUN24 - handling multiple objects
85
+ const objValue = this.dataService.getValue(response[i], field);
86
+ if (objValue?.toLowerCase().includes(keyword?.toLowerCase())) {
87
+ console.log('pushing ' + objValue);
88
+ results.push(response[i]);
89
+ }
90
+ }
91
+ this.noResult = !(results.length > 1);
92
+ this.finalResults = results;
93
+ });
94
+ }
95
+ };
96
+ clickItem(event) {
97
+ // console.log('inside clickItem of ' + event.target.value);
98
+ let apiObj = JSON.parse(this.apiMeta);
99
+ this.filterName = event[apiObj.field];
100
+ let change = new ChangeWrapper(); // ChangeWrapper = JSON.parse('{}');
101
+ change.fromQuestionId = this.id;
102
+ change.valueObj = event;
103
+ change.field = apiObj.field;
104
+ this.searchValueChange.emit(change);
105
+ }
106
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchBoxComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.ActivatedRoute }, { token: i0.ElementRef }, { token: i4.I18nService }], target: i0.ɵɵFactoryTarget.Component });
107
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SearchBoxComponent, selector: "lib-search-box", inputs: { placeHolderText: "placeHolderText", question: "question", apiMeta: "apiMeta", id: "id", readOnly: "readOnly", filterName: "filterName" }, outputs: { searchValueChange: "searchValueChange" }, viewQueries: [{ propertyName: "auto", first: true, predicate: ["auto"], descendants: true }], ngImport: i0, template: "<!-- // VD 12Jun24 - readonly change-->\n<div id=\"autocomplete-input\"> <!-- SKS5NOV25 search icon -->\n <input #auto id=\"searchbox-style\"\n (blur)=\"clearList()\" \n [(ngModel)]=\"filterName\" \n type=\"text\" \n name=\"name\" \n [readOnly]=\"readOnly\"\n [placeholder]=\"placeHolderText\" \n style=\"margin: 0 !important; padding-right: 30px;\" \n class=\"searchInput she-line-input form-control\" \n (focusin)=\"getSourceDataLocal($event)\" \n (input)=\"getSourceDataLocal($event)\">\n <div id=\"selectList\" style=\"position: absolute;position: absolute;background: white;z-index: 2;\">\n <div *ngIf=\"finalResults.length > 0 && showSuggestion\" \n style=\"max-height: 100vh;border: 1px solid #d2d4d6;overflow: scroll;\" \n class=\"suggestions-container\">\n <!-- HA 20DEC23 Uncommented the logic -->\n <!-- VD 03May- search changes -->\n <div *ngFor=\"let item of finalResults\" (click)='clickItem(item)' class=\"hoover\">\n <!-- VD 26Jun24 - id condition removed -->\n <div class=\"grid-x align-middle\" style=\"padding: 1rem\">\n <div *ngIf=\"item.thumbnail\" class=\"cell shrink\" style=\"width: 60px; margin-right: 1.6rem;\">\n <img [src]=\"item.thumbnail\" style=\"width: 60px;\" alt=\"\">\n </div>\n <div class=\"cell auto\" style=\"text-align: left; padding-left: 20px;\">\n <!--// VD 26JUN24 - pipe changes -->\n <h4 >{{ '' | getValue: item : SearchItem }}</h4>\n </div>\n </div>\n </div>\n <!-- HA 20DEC23 For Commented this for future purpose -->\n <!-- <table class=\"table table-striped table-bordered\">\n <thead>\n <tr>\n <th>{{ 'firstName' | i18n:i18nService.currentLanguage }}</th>\n <th>{{ 'lastName' | i18n:i18nService.currentLanguage }}</th>\n <th>{{ 'division' | i18n:i18nService.currentLanguage }}</th>\n <th>{{ 'numberPlate' | i18n:i18nService.currentLanguage }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of finalResults\" (click)='clickItem(item)'>\n <td>{{ item.firstName }}</td>\n <td>{{ item.lastName }}</td>\n <td>{{ item.division }}</td>\n <td>{{ item.numberPlate }}</td>\n </tr>\n </tbody>\n </table> -->\n </div>\n</div>\n", styles: ["#searchbox-style{background-image:url('data:image/svg+xml;utf8,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\"/><path d=\"M20 20L17 17\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>');background-position:right 5px center;background-repeat:no-repeat;background-size:24px;padding-right:35px}\n"], dependencies: [{ 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: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i7.GetValuePipe, name: "getValue" }] });
108
+ }
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchBoxComponent, decorators: [{
110
+ type: Component,
111
+ args: [{ selector: 'lib-search-box', template: "<!-- // VD 12Jun24 - readonly change-->\n<div id=\"autocomplete-input\"> <!-- SKS5NOV25 search icon -->\n <input #auto id=\"searchbox-style\"\n (blur)=\"clearList()\" \n [(ngModel)]=\"filterName\" \n type=\"text\" \n name=\"name\" \n [readOnly]=\"readOnly\"\n [placeholder]=\"placeHolderText\" \n style=\"margin: 0 !important; padding-right: 30px;\" \n class=\"searchInput she-line-input form-control\" \n (focusin)=\"getSourceDataLocal($event)\" \n (input)=\"getSourceDataLocal($event)\">\n <div id=\"selectList\" style=\"position: absolute;position: absolute;background: white;z-index: 2;\">\n <div *ngIf=\"finalResults.length > 0 && showSuggestion\" \n style=\"max-height: 100vh;border: 1px solid #d2d4d6;overflow: scroll;\" \n class=\"suggestions-container\">\n <!-- HA 20DEC23 Uncommented the logic -->\n <!-- VD 03May- search changes -->\n <div *ngFor=\"let item of finalResults\" (click)='clickItem(item)' class=\"hoover\">\n <!-- VD 26Jun24 - id condition removed -->\n <div class=\"grid-x align-middle\" style=\"padding: 1rem\">\n <div *ngIf=\"item.thumbnail\" class=\"cell shrink\" style=\"width: 60px; margin-right: 1.6rem;\">\n <img [src]=\"item.thumbnail\" style=\"width: 60px;\" alt=\"\">\n </div>\n <div class=\"cell auto\" style=\"text-align: left; padding-left: 20px;\">\n <!--// VD 26JUN24 - pipe changes -->\n <h4 >{{ '' | getValue: item : SearchItem }}</h4>\n </div>\n </div>\n </div>\n <!-- HA 20DEC23 For Commented this for future purpose -->\n <!-- <table class=\"table table-striped table-bordered\">\n <thead>\n <tr>\n <th>{{ 'firstName' | i18n:i18nService.currentLanguage }}</th>\n <th>{{ 'lastName' | i18n:i18nService.currentLanguage }}</th>\n <th>{{ 'division' | i18n:i18nService.currentLanguage }}</th>\n <th>{{ 'numberPlate' | i18n:i18nService.currentLanguage }}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of finalResults\" (click)='clickItem(item)'>\n <td>{{ item.firstName }}</td>\n <td>{{ item.lastName }}</td>\n <td>{{ item.division }}</td>\n <td>{{ item.numberPlate }}</td>\n </tr>\n </tbody>\n </table> -->\n </div>\n</div>\n", styles: ["#searchbox-style{background-image:url('data:image/svg+xml;utf8,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\"/><path d=\"M20 20L17 17\" stroke=\"%23434555\" stroke-opacity=\"0.65\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>');background-position:right 5px center;background-repeat:no-repeat;background-size:24px;padding-right:35px}\n"] }]
112
+ }], ctorParameters: () => [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.ActivatedRoute }, { type: i0.ElementRef }, { type: i4.I18nService }], propDecorators: { placeHolderText: [{
113
+ type: Input
114
+ }], auto: [{
115
+ type: ViewChild,
116
+ args: ['auto']
117
+ }], question: [{
118
+ type: Input
119
+ }], apiMeta: [{
120
+ type: Input
121
+ }], id: [{
122
+ type: Input
123
+ }], readOnly: [{
124
+ type: Input
125
+ }], searchValueChange: [{
126
+ type: Output
127
+ }], filterName: [{
128
+ type: Input
129
+ }] } });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvc2VhcmNoLWJveC9zZWFyY2gtYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBSVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBU3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7O0FBUzFELE1BQU0sT0FBTyxrQkFBa0I7SUF3Qm5CO0lBQ0E7SUFDQTtJQUVHO0lBM0JKLGVBQWUsQ0FBUztJQUNkLElBQUksQ0FBQztJQUVmLFFBQVEsQ0FBQztJQUNULE9BQU8sQ0FBUztJQUNoQixFQUFFLENBQVM7SUFDWCxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsK0JBQStCO0lBQ2hELGlCQUFpQixHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUM1RixNQUFNLENBQUs7SUFDWCxVQUFVLENBQU07SUFFUixVQUFVLENBQVMsQ0FBQyx5Q0FBeUM7SUFDL0QsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixhQUFhLEdBQVcsRUFBRSxDQUFDO0lBQzNCLFNBQVMsQ0FBTTtJQUNmLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLEVBQUUsQ0FBYztJQUNoQixJQUFJLEdBQVcsS0FBSyxDQUFDO0lBQ3JCLEdBQUcsR0FBVyxFQUFFLENBQUM7SUFFekIsWUFDVSxTQUE0QixF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QU07Z0JBSUUsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FsZXNmb3JjZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2FsZXNmb3JjZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuLy8gVkQgMjNKQU4yNCByZW1vdmVkIGh0dHBDbGllbnQgaW1wb3J0IHVzZWQgc2VydmljZSBmaWxlIGZvciBjYWxsb3V0XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJdGVtc0xpc3QgfSBmcm9tIFwiQG5nLXNlbGVjdC9uZy1zZWxlY3QvbGliL2l0ZW1zLWxpc3RcIjtcbmltcG9ydCB7IENvbnNvbGVTZXJ2aWNlIH0gZnJvbSBcIkBuZy1zZWxlY3Qvbmctc2VsZWN0L2xpYi9jb25zb2xlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEFQSU1ldGEgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9hcGltZXRhXCI7XG5pbXBvcnQgeyBDaGFuZ2VXcmFwcGVyIH0gZnJvbSBcIi4uLy4uL21vZGVsL2NoYW5nZVdyYXBwZXJcIjtcbi8vIEhBIDE5REVDMjMgaW1wb3J0ZWQgdHJhbnNsYXRpb24gc2VydmljZVxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vaTE4bi5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1zZWFyY2gtYm94JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1ib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWFyY2gtYm94LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hCb3hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwbGFjZUhvbGRlclRleHQ6IHN0cmluZztcbiAgQFZpZXdDaGlsZCgnYXV0bycpIGF1dG87XG5cbiAgQElucHV0KCkgcXVlc3Rpb247XG4gIEBJbnB1dCgpIGFwaU1ldGE6IHN0cmluZztcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTsgLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZVxuICBAT3V0cHV0KCkgc2VhcmNoVmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlV3JhcHBlcj4oKTtcbiAgIGFwaU9iajphbnk7XG4gICBTZWFyY2hJdGVtOiBhbnk7XG5cbiAgQElucHV0KCkgZmlsdGVyTmFtZTogc3RyaW5nOyAvLyBWRCAyMEF1ZyBkZWZhdWx0IGZpbHRlciB2YWx1ZSBhcyBpbnB1dFxuICBwdWJsaWMgZmluYWxSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgc2VhcmNoS2V5V29yZDogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBuZXdSZXN1bHQ6IGFueTtcbiAgcHVibGljIHNob3dSZXN1bHQgPSBmYWxzZTtcbiAgcHVibGljIG5vUmVzdWx0ID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93U3VnZ2VzdGlvbiA9IHRydWU7XG4gIHByaXZhdGUgZWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHNlcnY6IHN0cmluZyA9ICdhcGknO1xuICBwcml2YXRlIHRrbjogc3RyaW5nID0gJyc7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNmU2VydmljZTogU2FsZXNmb3JjZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIHB1YmxpYyBpMThuU2VydmljZTogSTE4blNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbi8vICBWRCAwM01heS0gc2VhcmNoIGNoYW5nZXNcbiAgICBpZih0aGlzLmFwaU1ldGEpe1xuICAgICAgbGV0IGFwaU9iajogQVBJTWV0YSA9IEpTT04ucGFyc2UodGhpcy5hcGlNZXRhKTtcbiAgICAgIHRoaXMuU2VhcmNoSXRlbSA9IGFwaU9iai5maWVsZDtcbiAgICB9XG4gIH1cblxuICBjbGVhckxpc3QoKXtcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgdGhpcy5maW5hbFJlc3VsdHMgPSBbXTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIGdldFNvdXJjZURhdGFMb2NhbChldmVudCkgeyAvL3RvIGdldCByZXN1bHRzIGxpc3QgZnJvbSBiYWNrZW5kIEFQSSB3aGVuZXZlciBrZXkgaXMgdXAgYWZ0ZXIgdGhlIGVudGVyaW5nIGF0bGVhc3Qgb25lIGtleVxuICAgIGlmKGV2ZW50LnRhcmdldC52YWx1ZS5sZW5ndGggPiAyKXtcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb249dHJ1ZTtcbiAgICAgIHRoaXMuZmluYWxSZXN1bHRzPVtdO1xuICAgICAgdGhpcy5zZWFyY2hLZXlXb3JkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgdGhpcy5zaG93UmVzdWx0ID0gZmFsc2U7XG4gICAgICB0aGlzLmdldFNvdXJjZURhdGEoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbj1mYWxzZTtcbiAgICAgIHRoaXMuZmluYWxSZXN1bHRzID0gW107XG4gICAgICB0aGlzLm5vUmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8vIFZEIDAzTWF5LSBzZWFyY2ggY2hhbmdlc1xuICAvLyBWRCAzMU5PVjI0IG51bGwgY2hlY2tcbiAgcHVibGljIGdldFNvdXJjZURhdGEgPSAoa2V5d29yZDogc3RyaW5nKSA9PiB7XG4gICAgaWYodGhpcy5hcGlNZXRhKSB7XG4gICAgIGxldCBhcGlPYmo6IEFQSU1ldGEgPSBKU09OLnBhcnNlKHRoaXMuYXBpTWV0YSk7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLmFwaVJlc3BvbnNlKGFwaU9iai5lbmRwb2ludCkuc3Vic2NyaWJlKChhcGlSZXNwb25zZSkgPT4ge1xuICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgIGlmKGFwaU9iai52YXJpYWJsZSl7XG4gICAgICAgICAgLy8gVkQgMjJNYXkyNCAtIGhhbmRsaW5nIG11bHRpcGxlIGNoaWxkIG9iamVjdHNcbiAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKGFwaVJlc3BvbnNlLGFwaU9iai52YXJpYWJsZSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgIHJlc3BvbnNlID0gYXBpUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIGxldCBmaWVsZCA9IGFwaU9iai5maWVsZDtcbiAgICAgIGxldCByZXN1bHRzPVtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykgeyAvLyBWRCBOT1YyMyAtIHVwZGF0ZWQgdGhlIHNlYXJjaCBrZXlzXG4gICAgICAgLy8gVkQgMjZKVU4yNCAtIGhhbmRsaW5nIG11bHRpcGxlIG9iamVjdHNcbiAgICAgICAgY29uc3Qgb2JqVmFsdWUgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKHJlc3BvbnNlW2ldLGZpZWxkKTtcbiAgICAgICAgaWYob2JqVmFsdWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoa2V5d29yZD8udG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygncHVzaGluZyAnICsgb2JqVmFsdWUpO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChyZXNwb25zZVtpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubm9SZXN1bHQgPSAhKHJlc3VsdHMubGVuZ3RoID4gMSk7XG4gICAgICB0aGlzLmZpbmFsUmVzdWx0cyA9IHJlc3VsdHM7XG4gICAgfSlcbiAgfVxuICB9XG5cbiAgcHVibGljIGNsaWNrSXRlbShldmVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgY2xpY2tJdGVtIG9mICcgKyBldmVudC50YXJnZXQudmFsdWUpO1xuICAgIGxldCBhcGlPYmo6IEFQSU1ldGEgPSBKU09OLnBhcnNlKHRoaXMuYXBpTWV0YSk7XG4gICAgdGhpcy5maWx0ZXJOYW1lID0gZXZlbnRbYXBpT2JqLmZpZWxkXTtcbiAgICBsZXQgY2hhbmdlID0gbmV3IENoYW5nZVdyYXBwZXIoKTsgLy8gQ2hhbmdlV3JhcHBlciA9IEpTT04ucGFyc2UoJ3t9Jyk7XG4gICAgY2hhbmdlLmZyb21RdWVzdGlvbklkID0gdGhpcy5pZDtcbiAgICBjaGFuZ2UudmFsdWVPYmogPSBldmVudDtcbiAgICBjaGFuZ2UuZmllbGQgPSBhcGlPYmouZmllbGQ7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KGNoYW5nZSk7XG4gIH1cbiAgLypcbiAgcHVibGljIGdldFNvdXJjZURhdGEgPSAoa2V5d29yZDogc3RyaW5nKSA9PiB7XG4gICAgaWYodGhpcy5zZXJ2ID09IFwiYXBpXCIpIHtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuZ2V0QVBJRGF0YShcbiAgICAgICAgdGhpcy50a24sXG4gICAgICAgIFtcIlF1ZXN0aW9uQm9va1wiLCBcInJlYWRcIiwgdXVpZF0sXG4gICAgICAgIHRoaXMuc3VjY2Vzc1NvdXJjZURhdGEsXG4gICAgICAgIHRoaXMuZmFpbHVyZVNvdXJjZURhdGFcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2ZTZXJ2aWNlLnJlbW90ZUFjdGlvbihcbiAgICAgICAgXCJOeHRDb250cm9sbGVyLnByb2Nlc3NcIixcbiAgICAgICAgW1wiUXVlc3Rpb25Cb29rXCIsIFwicmVhZFwiLCB1dWlkXSxcbiAgICAgICAgdGhpcy5zdWNjZXNzU291cmNlRGF0YSxcbiAgICAgICAgdGhpcy5mYWlsdXJlU291cmNlRGF0YVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3VjY2Vzc1NvdXJjZURhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBsZXQgcmVzdWx0cz1bXTtcbiAgICByZXN1bHRzPXJlc3BvbnNlLnJlc3VsdHM7XG4gICAgcmVzdWx0cy5wdXNoKHt1dWlkOiBudWxsLCBuYW1lOiBcIlwifSk7XG4gICAgdGhpcy5ub1Jlc3VsdCA9ICEocmVzdWx0cy5sZW5ndGggPiAxKTtcbiAgICB0aGlzLmZpbmFsUmVzdWx0cyA9IHJlc3VsdHM7XG4gIH1cblxuICBwdWJsaWMgZmFpbHVyZVNvdXJjZURhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBjb25zb2xlLmxvZyhcIkVycm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBBUElcIik7XG4gIH1cbiAgKi9cbn1cbiIsIjwhLS0gLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZS0tPlxuPGRpdiBpZD1cImF1dG9jb21wbGV0ZS1pbnB1dFwiPiA8IS0tIFNLUzVOT1YyNSBzZWFyY2ggaWNvbiAtLT5cbiAgICA8aW5wdXQgI2F1dG8gaWQ9XCJzZWFyY2hib3gtc3R5bGVcIlxuICAgICAgICAgICAgKGJsdXIpPVwiY2xlYXJMaXN0KClcIiBcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyTmFtZVwiIFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcbiAgICAgICAgICAgIG5hbWU9XCJuYW1lXCIgXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyVGV4dFwiIFxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW46IDAgIWltcG9ydGFudDsgcGFkZGluZy1yaWdodDogMzBweDtcIiBcbiAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoSW5wdXQgc2hlLWxpbmUtaW5wdXQgZm9ybS1jb250cm9sXCIgXG4gICAgICAgICAgICAoZm9jdXNpbik9XCJnZXRTb3VyY2VEYXRhTG9jYWwoJGV2ZW50KVwiIFxuICAgICAgICAgICAgKGlucHV0KT1cImdldFNvdXJjZURhdGFMb2NhbCgkZXZlbnQpXCI+XG4gICAgPGRpdiBpZD1cInNlbGVjdExpc3RcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtwb3NpdGlvbjogYWJzb2x1dGU7YmFja2dyb3VuZDogd2hpdGU7ei1pbmRleDogMjtcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZmluYWxSZXN1bHRzLmxlbmd0aCA+IDAgJiYgc2hvd1N1Z2dlc3Rpb25cIiBcbiAgICAgICAgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxMDB2aDtib3JkZXI6IDFweCBzb2xpZCAjZDJkNGQ2O292ZXJmbG93OiBzY3JvbGw7XCIgXG4gICAgICAgIGNsYXNzPVwic3VnZ2VzdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDwhLS0gSEEgMjBERUMyMyBVbmNvbW1lbnRlZCB0aGUgbG9naWMgLS0+XG4gICAgICAgICA8IS0tIFZEIDAzTWF5LSBzZWFyY2ggY2hhbmdlcyAtLT5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaW5hbFJlc3VsdHNcIiAoY2xpY2spPSdjbGlja0l0ZW0oaXRlbSknIGNsYXNzPVwiaG9vdmVyXCI+XG4gICAgICAgICAgPCEtLSBWRCAyNkp1bjI0IC0gaWQgY29uZGl0aW9uIHJlbW92ZWQgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC14IGFsaWduLW1pZGRsZVwiIHN0eWxlPVwicGFkZGluZzogMXJlbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnRodW1ibmFpbFwiIGNsYXNzPVwiY2VsbCBzaHJpbmtcIiBzdHlsZT1cIndpZHRoOiA2MHB4OyBtYXJnaW4tcmlnaHQ6IDEuNnJlbTtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIml0ZW0udGh1bWJuYWlsXCIgc3R5bGU9XCJ3aWR0aDogNjBweDtcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VsbCBhdXRvXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nLWxlZnQ6IDIwcHg7XCI+XG4gICAgICAgICAgICAgICAgICA8IS0tLy8gVkQgMjZKVU4yNCAtIHBpcGUgY2hhbmdlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGg0ID57eyAnJyB8IGdldFZhbHVlOiBpdGVtIDogU2VhcmNoSXRlbSAgfX08L2g0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEhBIDIwREVDMjMgRm9yIENvbW1lbnRlZCB0aGlzIGZvciBmdXR1cmUgcHVycG9zZSAtLT5cbiAgICAgICAgPCEtLSA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWJvcmRlcmVkXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2ZpcnN0TmFtZScgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdsYXN0TmFtZScgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdkaXZpc2lvbicgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPnt7ICdudW1iZXJQbGF0ZScgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fTwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmluYWxSZXN1bHRzXCIgKGNsaWNrKT0nY2xpY2tJdGVtKGl0ZW0pJz5cbiAgICAgICAgICAgICAgICA8dGQ+e3sgaXRlbS5maXJzdE5hbWUgfX08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLmxhc3ROYW1lIH19PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+e3sgaXRlbS5kaXZpc2lvbiB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkPnt7IGl0ZW0ubnVtYmVyUGxhdGUgfX08L3RkPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPiAtLT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19