ngx-render-material-forms 2.5.19 → 2.5.21

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 (157) hide show
  1. package/esm2020/lib/FormioControl.mjs +36 -0
  2. package/esm2020/lib/components/Base.mjs +32 -0
  3. package/esm2020/lib/components/MaterialComponent.mjs +145 -0
  4. package/esm2020/lib/components/MaterialNestedComponent.mjs +38 -0
  5. package/esm2020/lib/components/Webform.mjs +18 -0
  6. package/esm2020/lib/components/add-on-products/add-on-products.component.mjs +842 -0
  7. package/esm2020/lib/components/button/button.component.mjs +102 -0
  8. package/esm2020/lib/components/calendar/calendar.component.mjs +129 -0
  9. package/esm2020/lib/components/checkbox/checkbox.component.mjs +54 -0
  10. package/esm2020/lib/components/columns/columns.component.mjs +69 -0
  11. package/esm2020/lib/components/common.service.mjs +256 -0
  12. package/esm2020/lib/components/confirmation-dialog/confirmation-dialog.component.mjs +25 -0
  13. package/esm2020/lib/components/container/container.component.mjs +25 -0
  14. package/{esm2022 → esm2020}/lib/components/content/content.component.mjs +18 -18
  15. package/esm2020/lib/components/currency/currency.component.mjs +43 -0
  16. package/esm2020/lib/components/datagrid/datagrid.component.mjs +707 -0
  17. package/esm2020/lib/components/date/date.component.mjs +363 -0
  18. package/{esm2022 → esm2020}/lib/components/day/day.component.mjs +75 -75
  19. package/esm2020/lib/components/editgrid/editgrid.component.mjs +243 -0
  20. package/esm2020/lib/components/email/email.component.mjs +30 -0
  21. package/esm2020/lib/components/fieldset/fieldset.component.mjs +50 -0
  22. package/esm2020/lib/components/formio-form-field/formio-form-field.component.mjs +57 -0
  23. package/esm2020/lib/components/formio.wizard.mjs +88 -0
  24. package/{esm2022 → esm2020}/lib/components/hidden/hidden.component.mjs +20 -20
  25. package/esm2020/lib/components/html/html.component.mjs +29 -0
  26. package/esm2020/lib/components/index.mjs +125 -0
  27. package/{esm2022 → esm2020}/lib/components/label/label.component.mjs +17 -17
  28. package/esm2020/lib/components/number/number.component.mjs +67 -0
  29. package/esm2020/lib/components/panel/panel.component.mjs +57 -0
  30. package/esm2020/lib/components/password/password.component.mjs +30 -0
  31. package/esm2020/lib/components/phonenumber/phonenumber.component.mjs +30 -0
  32. package/esm2020/lib/components/radio/radio.component.mjs +96 -0
  33. package/esm2020/lib/components/select/select.component.mjs +593 -0
  34. package/esm2020/lib/components/selectboxes/selectboxes.component.mjs +102 -0
  35. package/esm2020/lib/components/signature/signature.component.mjs +103 -0
  36. package/esm2020/lib/components/survey/survey.component.mjs +167 -0
  37. package/esm2020/lib/components/table/table.component.mjs +97 -0
  38. package/esm2020/lib/components/tabs/tabs.component.mjs +43 -0
  39. package/esm2020/lib/components/tags/tags.component.mjs +117 -0
  40. package/esm2020/lib/components/textarea/textarea.component.mjs +98 -0
  41. package/esm2020/lib/components/textfield/textfield.component.mjs +124 -0
  42. package/esm2020/lib/components/time/time.component.mjs +206 -0
  43. package/esm2020/lib/components/url/url.component.mjs +30 -0
  44. package/esm2020/lib/components/well/well.component.mjs +43 -0
  45. package/{esm2022 → esm2020}/lib/const/ButtonsThemes.mjs +16 -16
  46. package/{esm2022 → esm2020}/lib/const/LabelPositions.mjs +9 -9
  47. package/esm2020/lib/directives/mask.directive.mjs +65 -0
  48. package/esm2020/lib/formio.component.mjs +80 -0
  49. package/{esm2022 → esm2020}/lib/ngx-render-material-forms.component.mjs +15 -15
  50. package/esm2020/lib/ngx-render-material-forms.module.mjs +378 -0
  51. package/{esm2022 → esm2020}/lib/ngx-render-material-forms.service.mjs +14 -14
  52. package/{esm2022 → esm2020}/lib/renderer.mjs +12 -12
  53. package/{esm2022 → esm2020}/ngx-render-material-forms.js +4 -4
  54. package/{esm2022 → esm2020}/public-api.mjs +6 -6
  55. package/fesm2015/ngx-render-material-forms.js +5888 -0
  56. package/fesm2015/ngx-render-material-forms.mjs.map +1 -0
  57. package/{fesm2022 → fesm2020}/ngx-render-material-forms.js +4360 -4320
  58. package/fesm2020/ngx-render-material-forms.mjs.map +1 -0
  59. package/index.d.ts +5 -5
  60. package/lib/FormioControl.d.ts +7 -7
  61. package/lib/components/Base.d.ts +2 -2
  62. package/lib/components/MaterialComponent.d.ts +30 -30
  63. package/lib/components/MaterialNestedComponent.d.ts +13 -13
  64. package/lib/components/Webform.d.ts +1 -1
  65. package/lib/components/add-on-products/add-on-products.component.d.ts +142 -142
  66. package/lib/components/button/button.component.d.ts +30 -30
  67. package/lib/components/calendar/calendar.component.d.ts +34 -34
  68. package/lib/components/checkbox/checkbox.component.d.ts +9 -9
  69. package/lib/components/columns/columns.component.d.ts +12 -12
  70. package/lib/components/common.service.d.ts +86 -86
  71. package/lib/components/confirmation-dialog/confirmation-dialog.component.d.ts +11 -11
  72. package/lib/components/container/container.component.d.ts +8 -8
  73. package/lib/components/content/content.component.d.ts +8 -8
  74. package/lib/components/currency/currency.component.d.ts +10 -10
  75. package/lib/components/datagrid/datagrid.component.d.ts +81 -81
  76. package/lib/components/date/date.component.d.ts +45 -43
  77. package/lib/components/day/day.component.d.ts +16 -16
  78. package/lib/components/editgrid/editgrid.component.d.ts +50 -50
  79. package/lib/components/email/email.component.d.ts +9 -9
  80. package/lib/components/fieldset/fieldset.component.d.ts +8 -8
  81. package/lib/components/formio-form-field/formio-form-field.component.d.ts +18 -18
  82. package/lib/components/formio.wizard.d.ts +19 -19
  83. package/lib/components/hidden/hidden.component.d.ts +8 -8
  84. package/lib/components/html/html.component.d.ts +11 -11
  85. package/lib/components/index.d.ts +2 -2
  86. package/lib/components/label/label.component.d.ts +6 -6
  87. package/lib/components/number/number.component.d.ts +18 -25
  88. package/lib/components/panel/panel.component.d.ts +8 -8
  89. package/lib/components/password/password.component.d.ts +9 -9
  90. package/lib/components/phonenumber/phonenumber.component.d.ts +9 -9
  91. package/lib/components/radio/radio.component.d.ts +12 -12
  92. package/lib/components/select/select.component.d.ts +77 -77
  93. package/lib/components/selectboxes/selectboxes.component.d.ts +15 -15
  94. package/lib/components/signature/signature.component.d.ts +12 -12
  95. package/lib/components/survey/survey.component.d.ts +14 -14
  96. package/lib/components/table/table.component.d.ts +12 -12
  97. package/lib/components/tabs/tabs.component.d.ts +9 -9
  98. package/lib/components/tags/tags.component.d.ts +15 -15
  99. package/lib/components/textarea/textarea.component.d.ts +13 -13
  100. package/lib/components/textfield/textfield.component.d.ts +18 -18
  101. package/lib/components/time/time.component.d.ts +27 -27
  102. package/lib/components/url/url.component.d.ts +9 -9
  103. package/lib/components/well/well.component.d.ts +8 -8
  104. package/lib/const/ButtonsThemes.d.ts +14 -14
  105. package/lib/const/LabelPositions.d.ts +8 -8
  106. package/lib/directives/mask.directive.d.ts +17 -17
  107. package/lib/formio.component.d.ts +15 -15
  108. package/lib/ngx-render-material-forms.component.d.ts +8 -8
  109. package/lib/ngx-render-material-forms.module.d.ts +112 -110
  110. package/lib/ngx-render-material-forms.service.d.ts +6 -6
  111. package/lib/renderer.d.ts +8 -8
  112. package/package.json +11 -5
  113. package/public-api.d.ts +3 -3
  114. package/esm2022/lib/FormioControl.mjs +0 -36
  115. package/esm2022/lib/components/Base.mjs +0 -32
  116. package/esm2022/lib/components/MaterialComponent.mjs +0 -148
  117. package/esm2022/lib/components/MaterialNestedComponent.mjs +0 -38
  118. package/esm2022/lib/components/Webform.mjs +0 -18
  119. package/esm2022/lib/components/add-on-products/add-on-products.component.mjs +0 -841
  120. package/esm2022/lib/components/button/button.component.mjs +0 -101
  121. package/esm2022/lib/components/calendar/calendar.component.mjs +0 -127
  122. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -53
  123. package/esm2022/lib/components/columns/columns.component.mjs +0 -58
  124. package/esm2022/lib/components/common.service.mjs +0 -255
  125. package/esm2022/lib/components/confirmation-dialog/confirmation-dialog.component.mjs +0 -24
  126. package/esm2022/lib/components/container/container.component.mjs +0 -24
  127. package/esm2022/lib/components/currency/currency.component.mjs +0 -41
  128. package/esm2022/lib/components/datagrid/datagrid.component.mjs +0 -693
  129. package/esm2022/lib/components/date/date.component.mjs +0 -354
  130. package/esm2022/lib/components/editgrid/editgrid.component.mjs +0 -243
  131. package/esm2022/lib/components/email/email.component.mjs +0 -28
  132. package/esm2022/lib/components/fieldset/fieldset.component.mjs +0 -49
  133. package/esm2022/lib/components/formio-form-field/formio-form-field.component.mjs +0 -56
  134. package/esm2022/lib/components/formio.wizard.mjs +0 -88
  135. package/esm2022/lib/components/html/html.component.mjs +0 -29
  136. package/esm2022/lib/components/index.mjs +0 -125
  137. package/esm2022/lib/components/number/number.component.mjs +0 -114
  138. package/esm2022/lib/components/panel/panel.component.mjs +0 -56
  139. package/esm2022/lib/components/password/password.component.mjs +0 -28
  140. package/esm2022/lib/components/phonenumber/phonenumber.component.mjs +0 -28
  141. package/esm2022/lib/components/radio/radio.component.mjs +0 -93
  142. package/esm2022/lib/components/select/select.component.mjs +0 -592
  143. package/esm2022/lib/components/selectboxes/selectboxes.component.mjs +0 -99
  144. package/esm2022/lib/components/signature/signature.component.mjs +0 -99
  145. package/esm2022/lib/components/survey/survey.component.mjs +0 -166
  146. package/esm2022/lib/components/table/table.component.mjs +0 -96
  147. package/esm2022/lib/components/tabs/tabs.component.mjs +0 -42
  148. package/esm2022/lib/components/tags/tags.component.mjs +0 -114
  149. package/esm2022/lib/components/textarea/textarea.component.mjs +0 -94
  150. package/esm2022/lib/components/textfield/textfield.component.mjs +0 -122
  151. package/esm2022/lib/components/time/time.component.mjs +0 -205
  152. package/esm2022/lib/components/url/url.component.mjs +0 -28
  153. package/esm2022/lib/components/well/well.component.mjs +0 -41
  154. package/esm2022/lib/directives/mask.directive.mjs +0 -65
  155. package/esm2022/lib/formio.component.mjs +0 -77
  156. package/esm2022/lib/ngx-render-material-forms.module.mjs +0 -332
  157. package/fesm2022/ngx-render-material-forms.mjs.map +0 -1
@@ -0,0 +1,593 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import { MaterialComponent } from '../MaterialComponent';
3
+ import SelectComponent from 'formiojs/components/select/Select.js';
4
+ import _ from 'lodash';
5
+ import { FormControl } from '@angular/forms';
6
+ import { Subject } from 'rxjs';
7
+ import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';
8
+ import { HttpHeaders } from '@angular/common/http';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common/http";
11
+ import * as i2 from "../common.service";
12
+ import * as i3 from "@angular/common";
13
+ import * as i4 from "@angular/forms";
14
+ import * as i5 from "@angular/material/form-field";
15
+ import * as i6 from "@angular/material/select";
16
+ import * as i7 from "@angular/material/core";
17
+ import * as i8 from "@angular/material/icon";
18
+ import * as i9 from "@angular/flex-layout/flex";
19
+ import * as i10 from "ngx-mat-select-search";
20
+ import * as i11 from "../formio-form-field/formio-form-field.component";
21
+ import * as i12 from "../label/label.component";
22
+ export class MaterialSelectComponent extends MaterialComponent {
23
+ constructor(element, ref, http, commonService) {
24
+ super(element, ref);
25
+ this.element = element;
26
+ this.ref = ref;
27
+ this.http = http;
28
+ this.commonService = commonService;
29
+ this.websiteMultiCtrl = new FormControl();
30
+ this.websiteMultiFilterCtrl = new FormControl();
31
+ this._onDestroy = new Subject();
32
+ // Variables to track pagination
33
+ this.pageNumber = 1;
34
+ this.pageSize = 20;
35
+ this.totalPages = 0;
36
+ this.searchQuery = '';
37
+ this.productsloadingFlag = false;
38
+ this.searching = false;
39
+ this.productList = [];
40
+ this.selectedValue = '';
41
+ this.searchItem = "";
42
+ // Variable to hold the reference to the current panel element
43
+ this.currentPanelElement = null;
44
+ this.openCounter = 1;
45
+ this.firstDropdownItems = [];
46
+ this.secondDropdownItems = [];
47
+ this.storeValue = [];
48
+ this.storeDependentItems = [];
49
+ this.executionFlag = false;
50
+ this.apiCounter = 0;
51
+ }
52
+ onInputChange(event) {
53
+ if (this.instance.component.key.toLowerCase() === 'vendorproductid' && event.target.value === '') {
54
+ this.onClearAll();
55
+ }
56
+ }
57
+ clearProducts() {
58
+ if (this.instance.component.key.toLowerCase() === 'vendorproductid') {
59
+ this.onClearAll();
60
+ this.searchItem = "";
61
+ }
62
+ }
63
+ registerPanelScrollEvent(selectElem) {
64
+ if (selectElem && selectElem?.panel) {
65
+ // const panelElement = selectElem.panel.nativeElement;
66
+ this.currentPanelElement = selectElem.panel.nativeElement;
67
+ this.currentPanelElement.addEventListener('scroll', this.onScroll.bind(this));
68
+ }
69
+ }
70
+ addCustomClass(key) {
71
+ return 'walkme_select_' + key;
72
+ }
73
+ onScroll(event) {
74
+ if (this.instance.component.key.toLowerCase() === 'vendorproductid') {
75
+ const scrollElement = event.target;
76
+ if (!scrollElement)
77
+ return; // Ensure scrollElement is not undefined
78
+ const trackHeight = scrollElement.scrollHeight - scrollElement.offsetHeight;
79
+ if (isNaN(trackHeight) || trackHeight <= 0)
80
+ return; // Check if trackHeight is valid
81
+ if (this.openCounter < 2) {
82
+ const retrievedObject = JSON.parse(localStorage.getItem('storageObject'));
83
+ this.totalPages = Number(retrievedObject?.totalPages);
84
+ this.productsloadingFlag = true;
85
+ this.productList = retrievedObject?.dataSource;
86
+ }
87
+ if (this.productsloadingFlag && Math.floor(scrollElement?.scrollTop / trackHeight * 100) > 50) {
88
+ this.productsloadingFlag = false;
89
+ this.openCounter = this.openCounter + 1;
90
+ if (this.pageNumber < this.totalPages) {
91
+ this.pageNumber = this.pageNumber + 1;
92
+ this.searching = true;
93
+ this.loadData(this.pageNumber, this.pageSize, this.searchQuery);
94
+ }
95
+ else {
96
+ this.productsloadingFlag = true;
97
+ this.searching = false;
98
+ }
99
+ }
100
+ }
101
+ }
102
+ // Function to get value by key from the array
103
+ getValueByKey(data, key) {
104
+ if (!data || data.length === 0) {
105
+ return null; // Return null if data is empty or undefined
106
+ }
107
+ const item = data.find(kv => kv.key.toLowerCase() === key.toLowerCase());
108
+ return item ? item.value : null;
109
+ }
110
+ loadData(pageNumber, pageSize, searchQuery) {
111
+ const paramsData = JSON.parse(localStorage.getItem('productPickerParams'));
112
+ const includeDescription = this.getValueByKey(paramsData, 'includeDescription');
113
+ const vendorId = this.getValueByKey(paramsData, 'vendorId');
114
+ const onlyActive = this.getValueByKey(paramsData, 'onlyActive');
115
+ const includeCountry = this.getValueByKey(paramsData, 'filterProductBasedOnCustomerCountry');
116
+ const programId = this.getValueByKey(paramsData, "programId");
117
+ var currentUser = JSON.parse(localStorage.getItem('currentUser'));
118
+ let headers;
119
+ if (currentUser && currentUser.Tokens && currentUser.Tokens.AccessToken) {
120
+ var accessToken = currentUser.Tokens.AccessToken;
121
+ headers = new HttpHeaders({
122
+ 'Content-Type': 'application/json',
123
+ 'Authorization': 'Bearer ' + accessToken
124
+ });
125
+ }
126
+ else {
127
+ console.error('User not authenticated or tokens missing.');
128
+ }
129
+ const envendorId = this.commonService.scrumble(vendorId);
130
+ const enpageNumber = this.commonService.scrumble(pageNumber);
131
+ const enpageSize = this.commonService.scrumble(pageSize);
132
+ const ensearchQuery = this.commonService.scrumble(searchQuery);
133
+ const encodeIncludeCountry = this.commonService.scrumble(includeCountry);
134
+ let enactive = this.commonService.scrumble(onlyActive);
135
+ const enprogramId = this.commonService.scrumble(programId);
136
+ //Check if enactive is undefined, null, or blank
137
+ if (enactive === undefined || enactive === null || enactive === '') {
138
+ enactive = this.commonService.scrumble(true); // Set default value to true
139
+ }
140
+ // Scrumble and handle the includeDescription parameter
141
+ let endescription = this.commonService.scrumble(includeDescription);
142
+ if (!endescription) {
143
+ endescription = this.commonService.scrumble(false); // Set to 'false' if undefined, null, or blank
144
+ }
145
+ const baseUrlMapping = {
146
+ 'bG9jYWxob3N0': 'http://localhost:58504',
147
+ 'bGluY29sbi52YXJ0b3BpYS5jb20=': 'https://lincoln-api.vartopia.com',
148
+ 'c3RhZ2UudmFydG9waWEuY29t': 'https://stage-api.vartopia.com',
149
+ 'bXkudmFydG9waWEuY29t': 'https://reagan-api.vartopia.com',
150
+ 'amFja3Nvbi52YXJ0b3BpYS5jb20=': 'https://jackson-api.vartopia.com',
151
+ 'dWF0LnZhcnRvcGlhLmNvbQ==': 'https://uat-api.vartopia.com'
152
+ };
153
+ // Get the current hostname
154
+ const hostname = window.location.hostname;
155
+ const baseApiUrl = baseUrlMapping[btoa(hostname)] || null;
156
+ let url = `${baseApiUrl}/api/VendorFormBuilder/GetVendorProducts?vendorId=${envendorId}&pageNumber=${enpageNumber}&pageSize=${enpageSize}&search=${ensearchQuery}&onlyActive=${enactive}&includeDescription=${endescription}`;
157
+ if (enprogramId && programId) {
158
+ url += `&programId=${enprogramId}`;
159
+ }
160
+ // Only add includeCountryId if it has a valid value
161
+ if (encodeIncludeCountry !== null && encodeIncludeCountry !== undefined && this.isFilterProductBasedOnCustomerCountryValid(this.instance.component.data)) {
162
+ url += `&filterProductBasedOnCustomerCountry=${encodeIncludeCountry}`;
163
+ }
164
+ this.http.get(url, { headers }).subscribe(response => {
165
+ if (response && response.code === 200) {
166
+ if (this.instance.component.key.toLowerCase() === 'vendorproductid') {
167
+ this.totalPages = response?.data?.totalPages;
168
+ const data = response.data.dataSource;
169
+ this.filteredOptionsLength = data.length;
170
+ if (this.productList.length > 0) {
171
+ data.map(item => {
172
+ return item;
173
+ }).forEach(i => this.productList.push(i));
174
+ }
175
+ else {
176
+ this.productList = data;
177
+ }
178
+ // Update filteredOptions with transformedData
179
+ var allProductList = this.transformResponseData(this.productList);
180
+ this.filteredOptions = Promise.resolve(allProductList);
181
+ this.searching = false;
182
+ this.productsloadingFlag = true;
183
+ setTimeout(() => {
184
+ const ele = this.selectElem?.panel?.nativeElement;
185
+ if (ele) {
186
+ const trackHeight = ele.scrollHeight - ele.offsetHeight;
187
+ const middlePosition = trackHeight / 2 - 50;
188
+ ele.scrollTo({ top: middlePosition, behavior: 'auto' });
189
+ }
190
+ else {
191
+ console.log('Panel element is not available yet.');
192
+ }
193
+ }, 250);
194
+ }
195
+ }
196
+ });
197
+ }
198
+ // Utility function to transform response data
199
+ transformResponseData(data) {
200
+ // Check if data is not null, undefined, and is an array with elements
201
+ if (data && Array.isArray(data) && data.length > 0) {
202
+ return data.map(item => ({
203
+ label: item.text,
204
+ value: item.value,
205
+ date: item.date
206
+ }));
207
+ }
208
+ else {
209
+ // Return an empty array if data is null, undefined, or empty
210
+ return [];
211
+ }
212
+ }
213
+ filterWebsiteMulti() {
214
+ if (!this.selectOptions) {
215
+ return;
216
+ }
217
+ let search = this.websiteMultiFilterCtrl.value;
218
+ search = search.toLowerCase();
219
+ this.filteredOptions = this.selectOptions.then((options) => {
220
+ const filtered = options.filter((option) => option.label.replace(/<\/?span[^>]*>/g, "").toLowerCase().indexOf(search) !== -1);
221
+ this.filteredOptionsLength = filtered.length;
222
+ return filtered;
223
+ });
224
+ }
225
+ ngOnDestroy() {
226
+ this._onDestroy.next('');
227
+ this._onDestroy.complete();
228
+ if (this.currentPanelElement) {
229
+ this.currentPanelElement.removeEventListener('scroll', this.onScroll.bind(this));
230
+ }
231
+ }
232
+ /*End*/
233
+ setInstance(instance) {
234
+ super.setInstance(instance);
235
+ this.instance.triggerUpdate();
236
+ }
237
+ onClearAll() {
238
+ if (this.instance.component.key.toLowerCase() === 'vendorproductid') {
239
+ this.pageNumber = 1;
240
+ this.pageSize = 20;
241
+ this.searchQuery = '';
242
+ this.searching = false;
243
+ this.productList = [];
244
+ this.selectedValue = '';
245
+ this.loadData(this.pageNumber, this.pageSize, this.searchQuery);
246
+ }
247
+ }
248
+ updateSecondDropdown(value) {
249
+ const paramsData = JSON.parse(localStorage.getItem('cascadingDropdownsParamsone'));
250
+ const vendorId = this.getValueByKey(paramsData, 'vendorId');
251
+ const dealId = this.getValueByKey(paramsData, 'dealId');
252
+ const isEdit = this.getValueByKey(paramsData, 'isEdit');
253
+ let finalParams;
254
+ this.instance?.parent?.components?.length && this.instance.parent.components.forEach(items => {
255
+ if (this.checkVendorRefItems(items)) {
256
+ const apiEndPoint = items?.component?.selectValues;
257
+ if (apiEndPoint != '') {
258
+ var parameters = [
259
+ {
260
+ "key": "userId",
261
+ "value": JSON.parse(localStorage.getItem('currentUser')).UserId
262
+ },
263
+ {
264
+ "key": "vendorId",
265
+ "value": vendorId
266
+ },
267
+ {
268
+ "key": "loginUserId",
269
+ "value": JSON.parse(localStorage.getItem('currentUser')).UserId
270
+ },
271
+ {
272
+ "key": "country",
273
+ "value": typeof value === 'string' ? value.trim() : ''
274
+ },
275
+ {
276
+ "key": "dataValue",
277
+ "value": typeof value === 'string' ? value.trim() : ''
278
+ },
279
+ {
280
+ "key": "dealId",
281
+ "value": dealId
282
+ },
283
+ {
284
+ "key": "isEdit",
285
+ "value": isEdit
286
+ },
287
+ {
288
+ "key": "referenceListName",
289
+ "value": items?.component?.key
290
+ },
291
+ {
292
+ "key": "referenceListFieldName",
293
+ "value": this.instance?.component?.key
294
+ }
295
+ ];
296
+ finalParams = parameters?.filter(f1 => items?.component?.data?.headers.some(f2 => f1.key === f2.key));
297
+ if (Array.isArray(finalParams)) {
298
+ const index = finalParams.findIndex(param => param.key === 'dataValue');
299
+ if (index !== -1) {
300
+ // If the object exists, update its value
301
+ finalParams[index].value = value;
302
+ }
303
+ else {
304
+ // If the object doesn't exist, add it to the array
305
+ finalParams.push({ key: 'dataValue', value: value });
306
+ }
307
+ this.commonService.initializeApiPath(apiEndPoint, finalParams).subscribe(response => {
308
+ if (response && response.code === 200) {
309
+ this.secondDropdownItems = response.data;
310
+ this.commonService.setDropdownItems(this.secondDropdownItems);
311
+ }
312
+ });
313
+ }
314
+ }
315
+ }
316
+ });
317
+ }
318
+ ngAfterViewInit() {
319
+ if (this.element && this.element.nativeElement && this.instance) {
320
+ // Add custom classes to elements.
321
+ if (this.instance.component.customClass) {
322
+ this.element.nativeElement.classList.add(this.instance.component.customClass);
323
+ }
324
+ }
325
+ this.selectElem.openedChange.subscribe(async (isOpen) => {
326
+ let i = 0;
327
+ if (isOpen) {
328
+ const newProductPickerFlag = this.instance?.component?.attributes;
329
+ let checkInvokeFromLibrary = this.commonService.checkIsAttributeTrue(newProductPickerFlag, "invokeFromLibrary");
330
+ const firstLevel = (this.getVendorRefList(this.instance) && checkInvokeFromLibrary);
331
+ if (firstLevel) {
332
+ this.selectElem.valueChange.subscribe(res => {
333
+ this.commonService.setDropDownFlag(true);
334
+ if (i === 0) {
335
+ this.updateSecondDropdown(res);
336
+ }
337
+ i++;
338
+ });
339
+ }
340
+ if (this.checkVendorRefItems(this.instance) && checkInvokeFromLibrary) {
341
+ this.storeDependentItems = [];
342
+ this.secondDropdownItems = this.commonService.getDropdownItems();
343
+ if (this.secondDropdownItems?.length) {
344
+ this.secondDropdownItems.forEach((renderElement, index, array) => {
345
+ this.storeDependentItems.push({ label: renderElement['text'], value: this.commonService.onlyNumbers(renderElement['value']) ? renderElement['value'] + ' ' : renderElement['value'] });
346
+ });
347
+ }
348
+ if (!this.commonService.getDropDownFlag()) {
349
+ this.storeDependentItems = this.instance.component.data.values;
350
+ }
351
+ this.filteredOptions = Promise.resolve(this.storeDependentItems);
352
+ this.selectOptions = Promise.resolve(this.storeDependentItems);
353
+ this.selectOptions.then(result => {
354
+ this.filteredOptionsLength = result.length;
355
+ });
356
+ }
357
+ }
358
+ });
359
+ if (this.instance.component.key.toLowerCase() === 'vendorproductid') {
360
+ this.selectElem.openedChange.subscribe((isOpen) => {
361
+ if (isOpen) {
362
+ this.pageNumber = 1;
363
+ this.pageSize = 20;
364
+ if (this.searchQuery?.length > 0) {
365
+ if (this.searchItem?.length > 0) {
366
+ this.websiteMultiFilterCtrl.setValue(this.searchItem);
367
+ this.ref.detectChanges();
368
+ }
369
+ }
370
+ // this.searchQuery = '';
371
+ this.searching = false;
372
+ //this.loadData(this.pageNumber, this.pageSize, this.searchQuery);
373
+ this.registerPanelScrollEvent(this.selectElem);
374
+ }
375
+ else {
376
+ this.removePanelScrollEvent();
377
+ this.searching = false;
378
+ // this.selectedValue = this.getValue();
379
+ // if (this.selectedValue?.toString().length == 0) {
380
+ // this.productList = [];
381
+ // this.pageNumber = 1;
382
+ // this.pageSize = 20;
383
+ // this.searchQuery = '';
384
+ // this.loadData(this.pageNumber, this.pageSize, this.searchQuery);
385
+ // }
386
+ }
387
+ });
388
+ }
389
+ }
390
+ removePanelScrollEvent() {
391
+ // Remove the scroll event listener
392
+ if (this.currentPanelElement) {
393
+ this.currentPanelElement.removeEventListener('scroll', this.onScroll.bind(this));
394
+ this.currentPanelElement = null;
395
+ }
396
+ }
397
+ ngOnInit() {
398
+ /*new logic */
399
+ if (this.instance.component.key.toLowerCase() === 'vendorproductid') {
400
+ this.websiteMultiFilterCtrl.valueChanges
401
+ .pipe(debounceTime(1000), // Time in milliseconds between key events
402
+ // tap(() => this.searching = true),
403
+ distinctUntilChanged(), takeUntil(this._onDestroy))
404
+ .subscribe((searchQuery) => {
405
+ if (searchQuery != '') {
406
+ this.pageNumber = 1;
407
+ this.pageSize = 20;
408
+ this.productList = [];
409
+ this.searching = true;
410
+ this.searchQuery = searchQuery;
411
+ this.searchItem = searchQuery;
412
+ this.loadData(this.pageNumber, this.pageSize, searchQuery);
413
+ }
414
+ });
415
+ }
416
+ else {
417
+ this.websiteMultiFilterCtrl.valueChanges
418
+ .pipe(takeUntil(this._onDestroy))
419
+ .subscribe(() => {
420
+ this.filterWebsiteMulti();
421
+ });
422
+ }
423
+ /*End */
424
+ this.selectOptions = new Promise((resolve) => {
425
+ this.selectOptionsResolve = resolve;
426
+ });
427
+ this.selectOptions.then((options) => {
428
+ this.filteredOptionsLength = options.length;
429
+ });
430
+ this.filteredOptions = this.selectOptions;
431
+ }
432
+ onSelectionChange(event, submitData, attributes) {
433
+ }
434
+ checkVendorRefItems(instance) {
435
+ const selectValues = instance.component['selectValues'];
436
+ const dataUrl = instance.component['data']?.url;
437
+ const isSelectValuesValid = selectValues != null && selectValues !== '' && selectValues !== undefined;
438
+ const isDataUrlInvalid = dataUrl == null || dataUrl === '' || dataUrl === undefined;
439
+ return isSelectValuesValid && isDataUrlInvalid;
440
+ }
441
+ getVendorRefList(instance) {
442
+ const dataUrl = instance.component['data']?.url;
443
+ const isSelectValuesValid = dataUrl != null && dataUrl !== '' && dataUrl !== undefined;
444
+ return isSelectValuesValid;
445
+ }
446
+ isError() {
447
+ if (this.instance.error) {
448
+ this.control.setErrors(this.instance.component.validate);
449
+ return true;
450
+ }
451
+ else {
452
+ return false;
453
+ }
454
+ }
455
+ getErrorMessage() {
456
+ if (this.instance.error && this.instance.error.messages) {
457
+ const { messages } = this.instance.error;
458
+ if (messages.length) {
459
+ for (const msg of messages) {
460
+ if (msg.context) {
461
+ if (this.instance && this.instance.parent && this.instance.parent._data) {
462
+ if (this.instance.parent._data.submit) {
463
+ this.control.markAllAsTouched();
464
+ }
465
+ }
466
+ return this.instance.error ? this.instance.error.message : '';
467
+ }
468
+ }
469
+ }
470
+ }
471
+ }
472
+ compareObjects(o1, o2) {
473
+ return _.isEqual(o1, o2);
474
+ }
475
+ isFilterProductBasedOnCustomerCountryValid(data) {
476
+ if (data && data.headers && Array.isArray(data.headers)) {
477
+ const header = data.headers.find(h => h.key === 'filterProductBasedOnCustomerCountry');
478
+ if (header &&
479
+ header.value !== null &&
480
+ header.value !== undefined &&
481
+ header.value.trim() !== "" &&
482
+ header.value.trim().toLowerCase() === "true") {
483
+ return true;
484
+ }
485
+ }
486
+ return false;
487
+ }
488
+ }
489
+ MaterialSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MaterialSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i2.CommonService }], target: i0.ɵɵFactoryTarget.Component });
490
+ MaterialSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: MaterialSelectComponent, selector: "mat-formio-select", viewQueries: [{ propertyName: "multiSelect", first: true, predicate: ["multiSelect"], descendants: true, static: true }, { propertyName: "selectElem", first: true, predicate: ["productSelect"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
491
+ <mat-formio-form-field [instance]="instance" [componentTemplate]="componentTemplate"></mat-formio-form-field>
492
+ <ng-template #componentTemplate let-hasLabel>
493
+ <mat-form-field fxFill>
494
+
495
+ <mat-label *ngIf="hasLabel">
496
+ <span [instance]="instance" matFormioLabel></span>
497
+ </mat-label>
498
+
499
+ <span *ngIf="instance.component.prefix" matPrefix>
500
+ {{ instance.component.prefix }}&nbsp;
501
+ </span>
502
+ <mat-select
503
+ [multiple]="instance.component.multiple"
504
+ [formControl]="control"
505
+ [placeholder]="instance.component.placeholder"
506
+ (selectionChange)="onChange()"
507
+ [compareWith]="compareObjects"
508
+ #productSelect
509
+ [panelClass]="addCustomClass(instance.component.key)"
510
+ >
511
+ <mat-option>
512
+ <ngx-mat-select-search [searching]="instance.component.key.toLowerCase() === 'vendorproductid' ? searching : false" (input)="onInputChange($event)" placeholderLabel="Type to search" [formControl]="websiteMultiFilterCtrl">
513
+ <mat-icon ngxMatSelectSearchClear (click)="clearProducts()">close</mat-icon>
514
+ </ngx-mat-select-search>
515
+ </mat-option>
516
+
517
+ <mat-option *ngFor="let option of filteredOptions | async" [value]="option.value" class="virtual-full-view">
518
+ <span [innerHTML]="option.label"></span>
519
+ </mat-option>
520
+ <mat-option *ngIf="!filteredOptionsLength" disabled>
521
+ <span>Nothing was found</span>
522
+ </mat-option>
523
+ </mat-select>
524
+
525
+ <span *ngIf="instance.component.suffix" matSuffix>
526
+ {{ instance.component.suffix }}
527
+ </span>
528
+ <mat-error *ngIf="isError()" >{{ getErrorMessage() }}</mat-error>
529
+ </mat-form-field>
530
+ </ng-template>
531
+ `, isInline: true, styles: [".example-viewport{height:200px}.product-picker{overflow-x:hidden}.virtual-full-view{height:auto!important;white-space:normal!important;line-height:1.4!important;text-overflow:initial!important;min-height:48px!important;overflow:visible!important;overflow:initial!important;padding-top:10px!important;padding-bottom:10px!important}::ng-deep .product-picker .cdk-virtual-scroll-content-wrapper{width:100%!important}.virtual-full-view .mat-pseudo-checkbox{align-self:top!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "component", type: i10.MatSelectSearchComponent, selector: "ngx-mat-select-search", inputs: ["placeholderLabel", "type", "closeIcon", "closeSvgIcon", "noEntriesFoundLabel", "indexAndLengthScreenReaderText", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toogleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti"], outputs: ["toggleAll"] }, { kind: "directive", type: i10.MatSelectSearchClearDirective, selector: "[ngxMatSelectSearchClear]" }, { kind: "component", type: i11.FormioFormFieldComponent, selector: "mat-formio-form-field", inputs: ["labelTemplate", "renderTopLabel", "showDescription", "renderElementOnly", "instance", "componentTemplate"] }, { kind: "component", type: i12.LabelComponent, selector: "span[matFormioLabel]", inputs: ["instance"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
532
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: MaterialSelectComponent, decorators: [{
533
+ type: Component,
534
+ args: [{ selector: 'mat-formio-select', template: `
535
+ <mat-formio-form-field [instance]="instance" [componentTemplate]="componentTemplate"></mat-formio-form-field>
536
+ <ng-template #componentTemplate let-hasLabel>
537
+ <mat-form-field fxFill>
538
+
539
+ <mat-label *ngIf="hasLabel">
540
+ <span [instance]="instance" matFormioLabel></span>
541
+ </mat-label>
542
+
543
+ <span *ngIf="instance.component.prefix" matPrefix>
544
+ {{ instance.component.prefix }}&nbsp;
545
+ </span>
546
+ <mat-select
547
+ [multiple]="instance.component.multiple"
548
+ [formControl]="control"
549
+ [placeholder]="instance.component.placeholder"
550
+ (selectionChange)="onChange()"
551
+ [compareWith]="compareObjects"
552
+ #productSelect
553
+ [panelClass]="addCustomClass(instance.component.key)"
554
+ >
555
+ <mat-option>
556
+ <ngx-mat-select-search [searching]="instance.component.key.toLowerCase() === 'vendorproductid' ? searching : false" (input)="onInputChange($event)" placeholderLabel="Type to search" [formControl]="websiteMultiFilterCtrl">
557
+ <mat-icon ngxMatSelectSearchClear (click)="clearProducts()">close</mat-icon>
558
+ </ngx-mat-select-search>
559
+ </mat-option>
560
+
561
+ <mat-option *ngFor="let option of filteredOptions | async" [value]="option.value" class="virtual-full-view">
562
+ <span [innerHTML]="option.label"></span>
563
+ </mat-option>
564
+ <mat-option *ngIf="!filteredOptionsLength" disabled>
565
+ <span>Nothing was found</span>
566
+ </mat-option>
567
+ </mat-select>
568
+
569
+ <span *ngIf="instance.component.suffix" matSuffix>
570
+ {{ instance.component.suffix }}
571
+ </span>
572
+ <mat-error *ngIf="isError()" >{{ getErrorMessage() }}</mat-error>
573
+ </mat-form-field>
574
+ </ng-template>
575
+ `, styles: [".example-viewport{height:200px}.product-picker{overflow-x:hidden}.virtual-full-view{height:auto!important;white-space:normal!important;line-height:1.4!important;text-overflow:initial!important;min-height:48px!important;overflow:visible!important;overflow:initial!important;padding-top:10px!important;padding-bottom:10px!important}::ng-deep .product-picker .cdk-virtual-scroll-content-wrapper{width:100%!important}.virtual-full-view .mat-pseudo-checkbox{align-self:top!important}\n"] }]
576
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i2.CommonService }]; }, propDecorators: { multiSelect: [{
577
+ type: ViewChild,
578
+ args: ['multiSelect', { static: true }]
579
+ }], selectElem: [{
580
+ type: ViewChild,
581
+ args: ['productSelect']
582
+ }] } });
583
+ SelectComponent.MaterialComponent = MaterialSelectComponent;
584
+ // Make sure we detect changes when new items make their way into the select dropdown.
585
+ const setItems = SelectComponent.prototype.setItems;
586
+ SelectComponent.prototype.setItems = function (...args) {
587
+ setItems.call(this, ...args);
588
+ if (this.materialComponent && this.materialComponent.selectOptionsResolve) {
589
+ this.materialComponent.selectOptionsResolve(this.selectOptions);
590
+ }
591
+ };
592
+ export { SelectComponent };
593
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZW5kZXItbWF0ZXJpYWwtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUE0QyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakksT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxlQUFlLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQVUsU0FBUyxFQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQTRFL0QsTUFBTSxPQUFPLHVCQUF3QixTQUFRLGlCQUFpQjtJQThCNUQsWUFBbUIsT0FBbUIsRUFBUyxHQUFzQixFQUFTLElBQWdCLEVBQVMsYUFBNEI7UUFDakksS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQURILFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFTLFNBQUksR0FBSixJQUFJLENBQVk7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXpCNUgscUJBQWdCLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEQsMkJBQXNCLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFFckQsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFF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QUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQzVDO2dCQUNBLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7b0hBamdCVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qix3U0F4RXhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDVDsyRkErQlUsdUJBQXVCO2tCQTFFbkMsU0FBUzsrQkFDRSxtQkFBbUIsWUFDbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUNUO3NMQXNDMkMsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVkLFVBQVU7c0JBQXJDLFNBQVM7dUJBQUMsZUFBZTs7QUEyZjVCLGVBQWUsQ0FBQyxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztBQUU1RCxzRkFBc0Y7QUFDdEYsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDcEQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLElBQUk7SUFDcEQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUU7UUFDekUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUNqRTtBQUNILENBQUMsQ0FBQztBQUVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgT25Jbml0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbENvbXBvbmVudCB9IGZyb20gJy4uL01hdGVyaWFsQ29tcG9uZW50JztcclxuaW1wb3J0IFNlbGVjdENvbXBvbmVudCBmcm9tICdmb3JtaW9qcy9jb21wb25lbnRzL3NlbGVjdC9TZWxlY3QuanMnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi5zZXJ2aWNlJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdtYXQtZm9ybWlvLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxtYXQtZm9ybWlvLWZvcm0tZmllbGQgW2luc3RhbmNlXT1cImluc3RhbmNlXCIgW2NvbXBvbmVudFRlbXBsYXRlXT1cImNvbXBvbmVudFRlbXBsYXRlXCI+PC9tYXQtZm9ybWlvLWZvcm0tZmllbGQ+XHJcbiAgICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudFRlbXBsYXRlIGxldC1oYXNMYWJlbD5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmlsbD5cclxuXHJcbiAgICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImhhc0xhYmVsXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5zdGFuY2VdPVwiaW5zdGFuY2VcIiBtYXRGb3JtaW9MYWJlbD48L3NwYW4+XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcblxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW5zdGFuY2UuY29tcG9uZW50LnByZWZpeFwiIG1hdFByZWZpeD5cclxuICAgICAgICAgIHt7IGluc3RhbmNlLmNvbXBvbmVudC5wcmVmaXggfX0mbmJzcDtcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJpbnN0YW5jZS5jb21wb25lbnQubXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImluc3RhbmNlLmNvbXBvbmVudC5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2hhbmdlKClcIlxyXG4gICAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVPYmplY3RzXCJcclxuICAgICAgICAgICAgICAgICNwcm9kdWN0U2VsZWN0XHJcbiAgICAgICAgICAgICAgICBbcGFuZWxDbGFzc109XCJhZGRDdXN0b21DbGFzcyhpbnN0YW5jZS5jb21wb25lbnQua2V5KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uPlxyXG4gICAgICAgIDxuZ3gtbWF0LXNlbGVjdC1zZWFyY2ggW3NlYXJjaGluZ109XCJpbnN0YW5jZS5jb21wb25lbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd2ZW5kb3Jwcm9kdWN0aWQnID8gc2VhcmNoaW5nIDogZmFsc2VcIiAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXJMYWJlbD1cIlR5cGUgdG8gc2VhcmNoXCIgW2Zvcm1Db250cm9sXT1cIndlYnNpdGVNdWx0aUZpbHRlckN0cmxcIj4gXHJcbiAgICAgICAgPG1hdC1pY29uIG5neE1hdFNlbGVjdFNlYXJjaENsZWFyIChjbGljayk9XCJjbGVhclByb2R1Y3RzKClcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9uZ3gtbWF0LXNlbGVjdC1zZWFyY2g+XHJcbiAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJ2aXJ0dWFsLWZ1bGwtdmlld1wiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcHRpb24ubGFiZWxcIj48L3NwYW4+XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPiAgIFxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCIhZmlsdGVyZWRPcHRpb25zTGVuZ3RoXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgIDxzcGFuPk5vdGhpbmcgd2FzIGZvdW5kPC9zcGFuPlxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuXHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpbnN0YW5jZS5jb21wb25lbnQuc3VmZml4XCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAge3sgaW5zdGFuY2UuY29tcG9uZW50LnN1ZmZpeCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0Vycm9yKClcIiA+e3sgZ2V0RXJyb3JNZXNzYWdlKCkgfX08L21hdC1lcnJvcj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgLmV4YW1wbGUtdmlld3BvcnQge1xyXG4gICAgaGVpZ2h0OiAyMDBweDtcclxuICB9XHJcbiAgXHJcbiAgLnByb2R1Y3QtcGlja2VyIHtcclxuICAgIG92ZXJmbG93LXg6IGhpZGRlbjsgLyogRGlzYWJsZSBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG4gIH1cclxuXHJcbiAgLnZpcnR1YWwtZnVsbC12aWV3IHtcclxuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbCAhaW1wb3J0YW50O1xyXG4gICAgbGluZS1oZWlnaHQ6IDEuNCAhaW1wb3J0YW50O1xyXG4gICAgdGV4dC1vdmVyZmxvdzogaW5pdGlhbCAhaW1wb3J0YW50O1xyXG4gICAgbWluLWhlaWdodDogNDhweCAhaW1wb3J0YW50O1xyXG4gICAgb3ZlcmZsb3c6IGluaXRpYWwgIWltcG9ydGFudDtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgOjpuZy1kZWVwIC5wcm9kdWN0LXBpY2tlciAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlciB7XHJcbiAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAudmlydHVhbC1mdWxsLXZpZXcgLm1hdC1wc2V1ZG8tY2hlY2tib3gge1xyXG4gICAgYWxpZ24tc2VsZjogdG9wICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuYF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsU2VsZWN0Q29tcG9uZW50IGV4dGVuZHMgTWF0ZXJpYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgc2VsZWN0T3B0aW9uczogUHJvbWlzZTxhbnlbXT47XHJcbiAgZmlsdGVyZWRPcHRpb25zOiBQcm9taXNlPGFueVtdPjtcclxuICBmaWx0ZXJlZE9wdGlvbnNMZW5ndGg6IG51bWJlcjtcclxuICBzZWxlY3RPcHRpb25zUmVzb2x2ZTogYW55O1xyXG4gIHB1YmxpYyB3ZWJzaXRlTXVsdGlDdHJsOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIHB1YmxpYyB3ZWJzaXRlTXVsdGlGaWx0ZXJDdHJsOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIEBWaWV3Q2hpbGQoJ211bHRpU2VsZWN0JywgeyBzdGF0aWM6IHRydWUgfSkgbXVsdGlTZWxlY3Q6IE1hdFNlbGVjdDtcclxuICBwcm90ZWN0ZWQgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgQFZpZXdDaGlsZCgncHJvZHVjdFNlbGVjdCcpIHNlbGVjdEVsZW06IE1hdFNlbGVjdDtcclxuICAvLyBWYXJpYWJsZXMgdG8gdHJhY2sgcGFnaW5hdGlvblxyXG4gIHBhZ2VOdW1iZXIgPSAxO1xyXG4gIHBhZ2VTaXplID0gMjA7XHJcbiAgdG90YWxQYWdlcyA9IDA7XHJcbiAgc2VhcmNoUXVlcnkgPSAnJztcclxuICBwcm9kdWN0c2xvYWRpbmdGbGFnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlYXJjaGluZyA9IGZhbHNlO1xyXG4gIHByb2R1Y3RMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkVmFsdWU6IGFueSA9ICcnO1xyXG4gIHNlYXJjaEl0ZW0gPSBcIlwiO1xyXG4gIC8vIFZhcmlhYmxlIHRvIGhvbGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBwYW5lbCBlbGVtZW50XHJcbiAgcHJpdmF0ZSBjdXJyZW50UGFuZWxFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIG9wZW5Db3VudGVyOiBudW1iZXIgPSAxXHJcbiAgZmlyc3REcm9wZG93bkl0ZW1zOiBhbnkgPSBbXTtcclxuICBzZWNvbmREcm9wZG93bkl0ZW1zOiBhbnkgPSBbXTtcclxuICBzdG9yZVZhbHVlOiBhbnkgPSBbXVxyXG4gIHN0b3JlRGVwZW5kZW50SXRlbXM6IGFueSA9IFtdO1xyXG4gIGV4ZWN1dGlvbkZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGFwaUNvdW50ZXI6IG51bWJlciA9IDA7XHJcbiAgY2hlY2tBdHRyaWJ1dGU6IGFueTtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZiwgcHVibGljIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50LCBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudCwgcmVmKTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UuY29tcG9uZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAndmVuZG9ycHJvZHVjdGlkJyAmJiBldmVudC50YXJnZXQudmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIHRoaXMub25DbGVhckFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJQcm9kdWN0cygpIHtcclxuICAgIGlmICh0aGlzLmluc3RhbmNlLmNvbXBvbmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3ZlbmRvcnByb2R1Y3RpZCcpIHtcclxuICAgICAgdGhpcy5vbkNsZWFyQWxsKCk7XHJcbiAgICAgIHRoaXMuc2VhcmNoSXRlbSA9IFwiXCI7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJQYW5lbFNjcm9sbEV2ZW50KHNlbGVjdEVsZW06IE1hdFNlbGVjdCkge1xyXG4gICAgaWYgKHNlbGVjdEVsZW0gJiYgc2VsZWN0RWxlbT8ucGFuZWwpIHtcclxuICAgICAgLy8gY29uc3QgcGFuZWxFbGVtZW50ID0gc2VsZWN0RWxlbS5wYW5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYW5lbEVsZW1lbnQgPSBzZWxlY3RFbGVtLnBhbmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhbmVsRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQ3VzdG9tQ2xhc3Moa2V5KSB7XHJcbiAgICByZXR1cm4gJ3dhbGttZV9zZWxlY3RfJyArIGtleTtcclxuICB9XHJcblxyXG4gIG9uU2Nyb2xsKGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZS5jb21wb25lbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd2ZW5kb3Jwcm9kdWN0aWQnKSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgIGlmICghc2Nyb2xsRWxlbWVudCkgcmV0dXJuOyAvLyBFbnN1cmUgc2Nyb2xsRWxlbWVudCBpcyBub3QgdW5kZWZpbmVkXHJcbiAgICAgIGNvbnN0IHRyYWNrSGVpZ2h0ID0gc2Nyb2xsRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBzY3JvbGxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgaWYgKGlzTmFOKHRyYWNrSGVpZ2h0KSB8fCB0cmFja0hlaWdodCA8PSAwKSByZXR1cm47IC8vIENoZWNrIGlmIHRyYWNrSGVpZ2h0IGlzIHZhbGlkXHJcbiAgICAgIGlmICh0aGlzLm9wZW5Db3VudGVyIDwgMikge1xyXG4gICAgICAgIGNvbnN0IHJldHJpZXZlZE9iamVjdCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0b3JhZ2VPYmplY3QnKSk7XHJcbiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gTnVtYmVyKHJldHJpZXZlZE9iamVjdD8udG90YWxQYWdlcyk7XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c2xvYWRpbmdGbGFnID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnByb2R1Y3RMaXN0ID0gcmV0cmlldmVkT2JqZWN0Py5kYXRhU291cmNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnByb2R1Y3RzbG9hZGluZ0ZsYWcgJiYgTWF0aC5mbG9vcihzY3JvbGxFbGVtZW50Py5zY3JvbGxUb3AgLyB0cmFja0hlaWdodCAqIDEwMCkgPiA1MCkge1xyXG4gICAgICAgIHRoaXMucHJvZHVjdHNsb2FkaW5nRmxhZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub3BlbkNvdW50ZXIgPSB0aGlzLm9wZW5Db3VudGVyICsgMTtcclxuICAgICAgICBpZiAodGhpcy5wYWdlTnVtYmVyIDwgdGhpcy50b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgPSB0aGlzLnBhZ2VOdW1iZXIgKyAxO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLnBhZ2VOdW1iZXIsIHRoaXMucGFnZVNpemUsIHRoaXMuc2VhcmNoUXVlcnkpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucHJvZHVjdHNsb2FkaW5nRmxhZyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRnVuY3Rpb24gdG8gZ2V0IHZhbHVlIGJ5IGtleSBmcm9tIHRoZSBhcnJheVxyXG4gIGdldFZhbHVlQnlLZXkoZGF0YSwga2V5KSB7XHJcbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIG51bGw7IC8vIFJldHVybiBudWxsIGlmIGRhdGEgaXMgZW1wdHkgb3IgdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtID0gZGF0YS5maW5kKGt2ID0+IGt2LmtleS50b0xvd2VyQ2FzZSgpID09PSBrZXkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udmFsdWUgOiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIGxvYWREYXRhKHBhZ2VOdW1iZXIsIHBhZ2VTaXplLCBzZWFyY2hRdWVyeSkge1xyXG4gICAgY29uc3QgcGFyYW1zRGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Byb2R1Y3RQaWNrZXJQYXJhbXMnKSk7XHJcbiAgICBjb25zdCBpbmNsdWRlRGVzY3JpcHRpb24gPSB0aGlzLmdldFZhbHVlQnlLZXkocGFyYW1zRGF0YSwgJ2luY2x1ZGVEZXNjcmlwdGlvbicpO1xyXG4gICAgY29uc3QgdmVuZG9ySWQgPSB0aGlzLmdldFZhbHVlQnlLZXkocGFyYW1zRGF0YSwgJ3ZlbmRvcklkJyk7XHJcbiAgICBjb25zdCBvbmx5QWN0aXZlID0gdGhpcy5nZXRWYWx1ZUJ5S2V5KHBhcmFtc0RhdGEsICdvbmx5QWN0aXZlJyk7XHJcbiAgICBjb25zdCBpbmNsdWRlQ291bnRyeSA9IHRoaXMuZ2V0VmFsdWVCeUtleShwYXJhbXNEYXRhLCAnZmlsdGVyUHJvZHVjdEJhc2VkT25DdXN0b21lckNvdW50cnknKTtcclxuICAgIGNvbnN0IHByb2dyYW1JZCA9IHRoaXMuZ2V0VmFsdWVCeUtleShwYXJhbXNEYXRhLCBcInByb2dyYW1JZFwiKTtcclxuICAgIHZhciBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRVc2VyJykpO1xyXG4gICAgbGV0IGhlYWRlcnM7XHJcbiAgICBpZiAoY3VycmVudFVzZXIgJiYgY3VycmVudFVzZXIuVG9rZW5zICYmIGN1cnJlbnRVc2VyLlRva2Vucy5BY2Nlc3NUb2tlbikge1xyXG4gICAgICB2YXIgYWNjZXNzVG9rZW4gPSBjdXJyZW50VXNlci5Ub2tlbnMuQWNjZXNzVG9rZW47XHJcbiAgICAgIGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiAnQmVhcmVyICcgKyBhY2Nlc3NUb2tlblxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VzZXIgbm90IGF1dGhlbnRpY2F0ZWQgb3IgdG9rZW5zIG1pc3NpbmcuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZW52ZW5kb3JJZCA9IHRoaXMuY29tbW9uU2VydmljZS5zY3J1bWJsZSh2ZW5kb3JJZClcclxuICAgIGNvbnN0IGVucGFnZU51bWJlciA9IHRoaXMuY29tbW9uU2VydmljZS5zY3J1bWJsZShwYWdlTnVtYmVyKVxyXG4gICAgY29uc3QgZW5wYWdlU2l6ZSA9IHRoaXMuY29tbW9uU2VydmljZS5zY3J1bWJsZShwYWdlU2l6ZSk7XHJcbiAgICBjb25zdCBlbnNlYXJjaFF1ZXJ5ID0gdGhpcy5jb21tb25TZXJ2aWNlLnNjcnVtYmxlKHNlYXJjaFF1ZXJ5KTtcclxuICAgIGNvbnN0IGVuY29kZUluY2x1ZGVDb3VudHJ5ID0gdGhpcy5jb21tb25TZXJ2aWNlLnNjcnVtYmxlKGluY2x1ZGVDb3VudHJ5KTtcclxuICAgIGxldCBlbmFjdGl2ZSA9IHRoaXMuY29tbW9uU2VydmljZS5zY3J1bWJsZShvbmx5QWN0aXZlKTtcclxuICAgIGNvbnN0IGVucHJvZ3JhbUlkID0gdGhpcy5jb21tb25TZXJ2aWNlLnNjcnVtYmxlKHByb2dyYW1JZCk7XHJcbiAgICAvL0NoZWNrIGlmIGVuYWN0aXZlIGlzIHVuZGVmaW5lZCwgbnVsbCwgb3IgYmxhbmtcclxuICAgIGlmIChlbmFjdGl2ZSA9PT0gdW5kZWZpbmVkIHx8IGVuYWN0aXZlID09PSBudWxsIHx8IGVuYWN0aXZlID09PSAnJykge1xyXG4gICAgICBlbmFjdGl2ZSA9IHRoaXMuY29tbW9uU2VydmljZS5zY3J1bWJsZSh0cnVlKTsgLy8gU2V0IGRlZmF1bHQgdmFsdWUgdG8gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNjcnVtYmxlIGFuZCBoYW5kbGUgdGhlIGluY2x1ZGVEZXNjcmlwdGlvbiBwYXJhbWV0ZXJcclxuICAgIGxldCBlbmRlc2NyaXB0aW9uID0gdGhpcy5jb21tb25TZXJ2aWNlLnNjcnVtYmxlKGluY2x1ZGVEZXNjcmlwdGlvbik7XHJcbiAgICBpZiAoIWVuZGVzY3JpcHRpb24pIHtcclxuICAgICAgZW5kZXNjcmlwdGlvbiA9IHRoaXMuY29tbW9uU2VydmljZS5zY3J1bWJsZShmYWxzZSk7ICAvLyBTZXQgdG8gJ2ZhbHNlJyBpZiB1bmRlZmluZWQsIG51bGwsIG9yIGJsYW5rXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmFzZVVybE1hcHBpbmcgPSB7XHJcbiAgICAgICdiRzlqWVd4b2IzTjAnOiAnaHR0cDovL2xvY2FsaG9zdDo1ODUwNCcsXHJcbiAgICAgICdiR2x1WTI5c2JpNTJZWEowYjNCcFlTNWpiMjA9JzogJ2h0dHBzOi8vbGluY29sbi1hcGkudmFydG9waWEuY29tJyxcclxuICAgICAgJ2MzUmhaMlV1ZG1GeWRHOXdhV0V1WTI5dCc6ICdodHRwczovL3N0YWdlLWFwaS52YXJ0b3BpYS5jb20nLFxyXG4gICAgICAnYlhrdWRtRnlkRzl3YVdFdVkyOXQnOiAnaHR0cHM6Ly9yZWFnYW4tYXBpLnZhcnRvcGlhLmNvbScsXHJcbiAgICAgICdhbUZqYTNOdmJpNTJZWEowYjNCcFlTNWpiMjA9JzogJ2h0dHBzOi8vamFja3Nvbi1hcGkudmFydG9waWEuY29tJyxcclxuICAgICAgJ2RXRjBMblpoY25SdmNHbGhMbU52YlE9PSc6ICdodHRwczovL3VhdC1hcGkudmFydG9waWEuY29tJ1xyXG4gICAgfTtcclxuICAgIC8vIEdldCB0aGUgY3VycmVudCBob3N0bmFtZVxyXG4gICAgY29uc3QgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XHJcbiAgICBjb25zdCBiYXNlQXBpVXJsID0gYmFzZVVybE1hcHBpbmdbYnRvYShob3N0bmFtZSldIHx8IG51bGw7XHJcbiAgICBpbnRlcmZhY2UgVmVuZG9yUHJvZHVjdHNSZXNwb25zZSB7XHJcbiAgICAgIGNvZGU6IG51bWJlcjtcclxuICAgICAgZGF0YTogYW55O1xyXG4gICAgICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgICAgIHN0YXR1c0NvZGU6IG51bWJlcjtcclxuICAgIH1cclxuICAgIGxldCB1cmwgPSBgJHtiYXNlQXBpVXJsfS9hcGkvVmVuZG9yRm9ybUJ1aWxkZXIvR2V0VmVuZG9yUHJvZHVjdHM/dmVuZG9ySWQ9JHtlbnZlbmRvcklkfSZwYWdlTnVtYmVyPSR7ZW5wYWdlTnVtYmVyfSZwYWdlU2l6ZT0ke2VucGFnZVNpemV9JnNlYXJjaD0ke2Vuc2VhcmNoUXVlcnl9Jm9ubHlBY3RpdmU9JHtlbmFjdGl2ZX0maW5jbHVkZURlc2NyaXB0aW9uPSR7ZW5kZXNjcmlwdGlvbn1gO1xyXG4gICAgaWYgKGVucHJvZ3JhbUlkICYmIHByb2dyYW1JZCkge1xyXG4gICAgICB1cmwgKz0gYCZwcm9ncmFtSWQ9JHtlbnByb2dyYW1JZH1gO1xyXG4gICAgfVxyXG4gICAgLy8gT25seSBhZGQgaW5jbHVkZUNvdW50cnlJZCBpZiBpdCBoYXMgYSB2YWxpZCB2YWx1ZVxyXG4gICAgaWYgKGVuY29kZUluY2x1ZGVDb3VudHJ5ICE9PSBudWxsICYmIGVuY29kZUluY2x1ZGVDb3VudHJ5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc0ZpbHRlclByb2R1Y3RCYXNlZE9uQ3VzdG9tZXJDb3VudHJ5VmFsaWQodGhpcy5pbnN0YW5jZS5jb21wb25lbnQuZGF0YSkpIHtcclxuICAgICAgdXJsICs9IGAmZmlsdGVyUHJvZHVjdEJhc2VkT25DdXN0b21lckNvdW50cnk9JHtlbmNvZGVJbmNsdWRlQ291bnRyeX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8VmVuZG9yUHJvZHVjdHNSZXNwb25zZT4odXJsLCB7IGhlYWRlcnMgfSkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlLmNvbXBvbmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3ZlbmRvcnByb2R1Y3RpZCcpIHtcclxuICAgICAgICAgIHRoaXMudG90YWxQYWdlcyA9IHJlc3BvbnNlPy5kYXRhPy50b3RhbFBhZ2VzO1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGEuZGF0YVNvdXJjZTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zTGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBpZiAodGhpcy5wcm9kdWN0TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGRhdGEubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtXHJcbiAgICAgICAgICAgIH0pLmZvckVhY2goaSA9PiB0aGlzLnByb2R1Y3RMaXN0LnB1c2goaSkpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RMaXN0ID0gZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXJlZE9wdGlvbnMgd2l0aCB0cmFuc2Zvcm1lZERhdGFcclxuICAgICAgICAgIHZhciBhbGxQcm9kdWN0TGlzdCA9IHRoaXMudHJhbnNmb3JtUmVzcG9uc2VEYXRhKHRoaXMucHJvZHVjdExpc3QpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBQcm9taXNlLnJlc29sdmUoYWxsUHJvZHVjdExpc3QpO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucHJvZHVjdHNsb2FkaW5nRmxhZyA9IHRydWU7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWxlID0gdGhpcy5zZWxlY3RFbGVtPy5wYW5lbD8ubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGVsZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRyYWNrSGVpZ2h0ID0gZWxlLnNjcm9sbEhlaWdodCAtIGVsZS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgICBjb25zdCBtaWRkbGVQb3NpdGlvbiA9IHRyYWNrSGVpZ2h0IC8gMiAtIDUwO1xyXG4gICAgICAgICAgICAgIGVsZS5zY3JvbGxUbyh7IHRvcDogbWlkZGxlUG9zaXRpb24sIGJlaGF2aW9yOiAnYXV0bycgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1BhbmVsIGVsZW1lbnQgaXMgbm90IGF2YWlsYWJsZSB5ZXQuJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9LCAyNTApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gVXRpbGl0eSBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxyXG4gIHRyYW5zZm9ybVJlc3BvbnNlRGF0YShkYXRhOiBBcnJheTx7IHRleHQ6IGFueSwgdmFsdWU6IGFueSwgZGF0ZTogYW55IH0+IHwgbnVsbCB8IHVuZGVmaW5lZCk6IEFycmF5PHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IG51bWJlciwgZGF0ZTogc3RyaW5nIH0+IHtcclxuICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgbm90IG51bGwsIHVuZGVmaW5lZCwgYW5kIGlzIGFuIGFycmF5IHdpdGggZWxlbWVudHNcclxuICAgIGlmIChkYXRhICYmIEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBkYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgICAgICAgbGFiZWw6IGl0ZW0udGV4dCxcclxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcclxuICAgICAgICBkYXRlOiBpdGVtLmRhdGVcclxuICAgICAgfSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIGRhdGEgaXMgbnVsbCwgdW5kZWZpbmVkLCBvciBlbXB0eVxyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGZpbHRlcldlYnNpdGVNdWx0aSgpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RPcHRpb25zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBzZWFyY2ggPSB0aGlzLndlYnNpdGVNdWx0aUZpbHRlckN0cmwudmFsdWU7XHJcbiAgICBzZWFyY2ggPSBzZWFyY2gudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5zZWxlY3RPcHRpb25zLnRoZW4oKG9wdGlvbnMpID0+IHtcclxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ubGFiZWwucmVwbGFjZSgvPFxcLz9zcGFuW14+XSo+L2csIFwiXCIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2gpICE9PSAtMSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zTGVuZ3RoID0gZmlsdGVyZWQubGVuZ3RoO1xyXG4gICAgICByZXR1cm4gZmlsdGVyZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCcnKTtcclxuICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFBhbmVsRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYW5lbEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vblNjcm9sbC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKkVuZCovXHJcbiAgc2V0SW5zdGFuY2UoaW5zdGFuY2U6IGFueSkge1xyXG4gICAgc3VwZXIuc2V0SW5zdGFuY2UoaW5zdGFuY2UpO1xyXG4gICAgdGhpcy5pbnN0YW5jZS50cmlnZ2VyVXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyQWxsKCkge1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UuY29tcG9uZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAndmVuZG9ycHJvZHVjdGlkJykge1xyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMjA7XHJcbiAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcclxuICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5wcm9kdWN0TGlzdCA9IFtdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSAnJztcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLnBhZ2VOdW1iZXIsIHRoaXMucGFnZVNpemUsIHRoaXMuc2VhcmNoUXVlcnkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2Vjb25kRHJvcGRvd24odmFsdWU6IGFueSkge1xyXG4gICAgY29uc3QgcGFyYW1zRGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Nhc2NhZGluZ0Ryb3Bkb3duc1BhcmFtc29uZScpKTtcclxuICAgIGNvbnN0IHZlbmRvcklkID0gdGhpcy5nZXRWYWx1ZUJ5S2V5KHBhcmFtc0RhdGEsICd2ZW5kb3JJZCcpO1xyXG4gICAgY29uc3QgZGVhbElkID0gdGhpcy5nZXRWYWx1ZUJ5S2V5KHBhcmFtc0RhdGEsICdkZWFsSWQnKTtcclxuICAgIGNvbnN0IGlzRWRpdCA9IHRoaXMuZ2V0VmFsdWVCeUtleShwYXJhbXNEYXRhLCAnaXNFZGl0Jyk7XHJcbiAgICBsZXQgZmluYWxQYXJhbXM7XHJcbiAgICB0aGlzLmluc3RhbmNlPy5wYXJlbnQ/LmNvbXBvbmVudHM/Lmxlbmd0aCAmJiB0aGlzLmluc3RhbmNlLnBhcmVudC5jb21wb25lbnRzLmZvckVhY2goaXRlbXMgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jaGVja1ZlbmRvclJlZkl0ZW1zKGl0ZW1zKSkge1xyXG4gICAgICAgIGNvbnN0IGFwaUVuZFBvaW50ID0gaXRlbXM/LmNvbXBvbmVudD8uc2VsZWN0VmFsdWVzO1xyXG4gICAgICAgIGlmIChhcGlFbmRQb2ludCAhPSAnJykge1xyXG4gICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcImtleVwiOiBcInVzZXJJZFwiLFxyXG4gICAgICAgICAgICAgIFwidmFsdWVcIjogSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudFVzZXInKSkuVXNlcklkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcImtleVwiOiBcInZlbmRvcklkXCIsXHJcbiAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiB2ZW5kb3JJZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJrZXlcIjogXCJsb2dpblVzZXJJZFwiLFxyXG4gICAgICAgICAgICAgIFwidmFsdWVcIjogSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudFVzZXInKSkuVXNlcklkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcImtleVwiOiBcImNvdW50cnlcIixcclxuICAgICAgICAgICAgICBcInZhbHVlXCI6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiAnJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJrZXlcIjogXCJkYXRhVmFsdWVcIixcclxuICAgICAgICAgICAgICBcInZhbHVlXCI6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiAnJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJrZXlcIjogXCJkZWFsSWRcIixcclxuICAgICAgICAgICAgICBcInZhbHVlXCI6IGRlYWxJZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJrZXlcIjogXCJpc0VkaXRcIixcclxuICAgICAgICAgICAgICBcInZhbHVlXCI6IGlzRWRpdFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgXCJrZXlcIjogXCJyZWZlcmVuY2VMaXN0TmFtZVwiLFxyXG4gICAgICAgICAgICAgIFwidmFsdWVcIjogaXRlbXM/LmNvbXBvbmVudD8ua2V5XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcImtleVwiOiBcInJlZmVyZW5jZUxpc3RGaWVsZE5hbWVcIixcclxuICAgICAgICAgICAgICBcInZhbHVlXCI6IHRoaXMuaW5zdGFuY2U/LmNvbXBvbmVudD8ua2V5XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICAgIGZpbmFsUGFyYW1zID0gcGFyYW1ldGVycz8uZmlsdGVyKGYxID0+IGl0ZW1zPy5jb21wb25lbnQ/LmRhdGE/LmhlYWRlcnMuc29tZShmMiA9PiBmMS5rZXkgPT09IGYyLmtleSkpO1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmluYWxQYXJhbXMpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmluYWxQYXJhbXMuZmluZEluZGV4KHBhcmFtID0+IHBhcmFtLmtleSA9PT0gJ2RhdGFWYWx1ZScpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBleGlzdHMsIHVwZGF0ZSBpdHMgdmFsdWVcclxuICAgICAgICAgICAgICBmaW5hbFBhcmFtc1tpbmRleF0udmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGRvZXNuJ3QgZXhpc3QsIGFkZCBpdCB0byB0aGUgYXJyYXlcclxuICAgICAgICAgICAgICBmaW5hbFBhcmFtcy5wdXNoKHsga2V5OiAnZGF0YVZhbHVlJywgdmFsdWU6IHZhbHVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5pbml0aWFsaXplQXBpUGF0aChhcGlFbmRQb2ludCwgZmluYWxQYXJhbXMpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWNvbmREcm9wZG93bkl0ZW1zID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5zZXREcm9wZG93bkl0ZW1zKHRoaXMuc2Vjb25kRHJvcGRvd25JdGVtcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiB0aGlzLmluc3RhbmNlKSB7XHJcbiAgICAgIC8vIEFkZCBjdXN0b20gY2xhc3NlcyB0byBlbGVtZW50cy5cclxuICAgICAgaWYgKHRoaXMuaW5zdGFuY2UuY29tcG9uZW50LmN1c3RvbUNsYXNzKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmluc3RhbmNlLmNvbXBvbmVudC5jdXN0b21DbGFzcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0RWxlbS5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKGFzeW5jIChpc09wZW46IGJvb2xlYW4pID0+IHtcclxuICAgICAgbGV0IGkgPSAwXHJcbiAgICAgIGlmIChpc09wZW4pIHtcclxuICAgICAgICBjb25zdCBuZXdQcm9kdWN0UGlja2VyRmxhZyA9IHRoaXMuaW5zdGFuY2U/LmNvbXBvbmVudD8uYXR0cmlidXRlcztcclxuICAgICAgICBsZXQgY2hlY2tJbnZva2VGcm9tTGlicmFyeSA9IHRoaXMuY29tbW9uU2VydmljZS5jaGVja0lzQXR0cmlidXRlVHJ1ZShuZXdQcm9kdWN0UGlja2VyRmxhZywgXCJpbnZva2VGcm9tTGlicmFyeVwiKVxyXG4gICAgICAgIGNvbnN0IGZpcnN0TGV2ZWwgPSAodGhpcy5nZXRWZW5kb3JSZWZMaXN0KHRoaXMuaW5zdGFuY2UpICYmIGNoZWNrSW52b2tlRnJvbUxpYnJhcnkpO1xyXG4gICAgICAgIGlmIChmaXJzdExldmVsKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdEVsZW0udmFsdWVDaGFuZ2Uuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5zZXREcm9wRG93bkZsYWcodHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWNvbmREcm9wZG93bihyZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGkrK1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrVmVuZG9yUmVmSXRlbXModGhpcy5pbnN0YW5jZSkgJiYgY2hlY2tJbnZva2VGcm9tTGlicmFyeSkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZURlcGVuZGVudEl0ZW1zID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlY29uZERyb3Bkb3duSXRlbXMgPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0RHJvcGRvd25JdGVtcygpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2Vjb25kRHJvcGRvd25JdGVtcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kRHJvcGRvd25JdGVtcy5mb3JFYWNoKChyZW5kZXJFbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnN0b3JlRGVwZW5kZW50SXRlbXMucHVzaCh7IGxhYmVsOiByZW5kZXJFbGVtZW50Wyd0ZXh0J10sIHZhbHVlOiB0aGlzLmNvbW1vblNlcnZpY2Uub25seU51bWJlcnMocmVuZGVyRWxlbWVudFsndmFsdWUnXSkgPyByZW5kZXJFbGVtZW50Wyd2YWx1ZSddICsgJyAnIDogcmVuZGVyRWxlbWVudFsndmFsdWUnXSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29tbW9uU2VydmljZS5nZXREcm9wRG93bkZsYWcoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlRGVwZW5kZW50SXRlbXMgPSB0aGlzLmluc3RhbmNlLmNvbXBvbmVudC5kYXRhLnZhbHVlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc3RvcmVEZXBlbmRlbnRJdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdE9wdGlvbnMgPSBQcm9taXNlLnJlc29sdmUodGhpcy5zdG9yZURlcGVuZGVudEl0ZW1zKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0T3B0aW9ucy50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zTGVuZ3RoID0gcmVzdWx0Lmxlbmd0aFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZS5jb21wb25lbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd2ZW5kb3Jwcm9kdWN0aWQnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0RWxlbS5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKChpc09wZW46IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoaXNPcGVuKSB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnk/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSXRlbT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMud2Vic2l0ZU11bHRpRmlsdGVyQ3RybC5zZXRWYWx1ZSh0aGlzLnNlYXJjaEl0ZW0pO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIC8vdGhpcy5sb2FkRGF0YSh0aGlzLnBhZ2VOdW1iZXIsIHRoaXMucGFnZVNpemUsIHRoaXMuc2VhcmNoUXVlcnkpO1xyXG4gICAgICAgICAgdGhpcy5yZWdpc3RlclBhbmVsU2Nyb2xsRXZlbnQodGhpcy5zZWxlY3RFbGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVQYW5lbFNjcm9sbEV2ZW50KCk7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgLy8gaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZT8udG9TdHJpbmcoKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgLy8gICB0aGlzLnByb2R1Y3RMaXN0ID0gW107XHJcbiAgICAgICAgICAvLyAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgICAvLyAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgICAgIC8vICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xyXG4gICAgICAgICAgLy8gICB0aGlzLmxvYWREYXRhKHRoaXMucGFnZU51bWJlciwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5zZWFyY2hRdWVyeSk7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVBhbmVsU2Nyb2xsRXZlbnQoKSB7XHJcbiAgICAvLyBSZW1vdmUgdGhlIHNjcm9sbCBldmVudCBsaXN0ZW5lclxyXG4gICAgaWYgKHRoaXMuY3VycmVudFBhbmVsRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYW5lbEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5vblNjcm9sbC5iaW5kKHRoaXMpKTtcclxuICAgICAgdGhpcy5jdXJyZW50UGFuZWxFbGVtZW50ID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvKm5ldyBsb2dpYyAqL1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UuY29tcG9uZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAndmVuZG9ycHJvZHVjdGlkJykge1xyXG4gICAgICB0aGlzLndlYnNpdGVNdWx0aUZpbHRlckN0cmwudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwMCksIC8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4ga2V5IGV2ZW50c1xyXG4gICAgICAgICAgLy8gIHRhcCgoKSA9PiB0aGlzLnNlYXJjaGluZyA9IHRydWUpLFxyXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHNlYXJjaFF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2VhcmNoUXVlcnkgIT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0TGlzdCA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSBzZWFyY2hRdWVyeTtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJdGVtID0gc2VhcmNoUXVlcnlcclxuICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLnBhZ2VOdW1iZXIsIHRoaXMucGFnZVNpemUsIHNlYXJjaFF1ZXJ5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud2Vic2l0ZU11bHRpRmlsdGVyQ3RybC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJXZWJzaXRlTXVsdGkoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qRW5kICovXHJcbiAgICB0aGlzLnNlbGVjdE9wdGlvbnMgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbnNSZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZWxlY3RPcHRpb25zLnRoZW4oKG9wdGlvbnMpID0+IHtcclxuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNMZW5ndGggPSBvcHRpb25zLmxlbmd0aDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5zZWxlY3RPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IGFueSwgc3VibWl0RGF0YTogYW55LCBhdHRyaWJ1dGVzOiBhbnkpIHtcclxuXHJcbiAgfVxyXG5cclxuICBjaGVja1ZlbmRvclJlZkl0ZW1zKGluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBzZWxlY3RWYWx1ZXMgPSBpbnN0YW5jZS5jb21wb25lbnRbJ3NlbGVjdFZhbHVlcyddO1xyXG4gICAgY29uc3QgZGF0YVVybCA9IGluc3RhbmNlLmNvbXBvbmVudFsnZGF0YSddPy51cmw7XHJcbiAgICBjb25zdCBpc1NlbGVjdFZhbHVlc1ZhbGlkID0gc2VsZWN0VmFsdWVzICE9IG51bGwgJiYgc2VsZWN0VmFsdWVzICE9PSAnJyAmJiBzZWxlY3RWYWx1ZXMgIT09IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGlzRGF0YVVybEludmFsaWQgPSBkYXRhVXJsID09IG51bGwgfHwgZGF0YVVybCA9PT0gJycgfHwgZGF0YVVybCA9PT0gdW5kZWZpbmVkO1xyXG4gICAgcmV0dXJuIGlzU2VsZWN0VmFsdWVzVmFsaWQgJiYgaXNEYXRhVXJsSW52YWxpZDtcclxuICB9XHJcblxyXG4gIGdldFZlbmRvclJlZkxpc3QoaW5zdGFuY2UpIHtcclxuICAgIGNvbnN0IGRhdGFVcmwgPSBpbnN0YW5jZS5jb21wb25lbnRbJ2RhdGEnXT8udXJsO1xyXG4gICAgY29uc3QgaXNTZWxlY3RWYWx1ZXNWYWxpZCA9IGRhdGFVcmwgIT0gbnVsbCAmJiBkYXRhVXJsICE9PSAnJyAmJiBkYXRhVXJsICE9PSB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gaXNTZWxlY3RWYWx1ZXNWYWxpZDtcclxuICB9XHJcblxyXG4gIGlzRXJyb3IoKSB7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZS5lcnJvcikge1xyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHRoaXMuaW5zdGFuY2UuY29tcG9uZW50LnZhbGlkYXRlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JNZXNzYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UuZXJyb3IgJiYgdGhpcy5pbnN0YW5jZS5lcnJvci5tZXNzYWdlcykge1xyXG4gICAgICBjb25zdCB7IG1lc3NhZ2VzIH0gPSB0aGlzLmluc3RhbmNlLmVycm9yO1xyXG4gICAgICBpZiAobWVzc2FnZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtc2cgb2YgbWVzc2FnZXMpIHtcclxuICAgICAgICAgIGlmIChtc2cuY29udGV4dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLmluc3RhbmNlLnBhcmVudCAmJiB0aGlzLmluc3RhbmNlLnBhcmVudC5fZGF0YSkge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlLnBhcmVudC5fZGF0YS5zdWJtaXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLmVycm9yID8gdGhpcy5pbnN0YW5jZS5lcnJvci5tZXNzYWdlIDogJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wYXJlT2JqZWN0cyhvMTogYW55LCBvMjogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gXy5pc0VxdWFsKG8xLCBvMik7XHJcbiAgfVxyXG5cclxuICBpc0ZpbHRlclByb2R1Y3RCYXNlZE9uQ3VzdG9tZXJDb3VudHJ5VmFsaWQoZGF0YSkge1xyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5oZWFkZXJzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5oZWFkZXJzKSkge1xyXG4gICAgICBjb25zdCBoZWFkZXIgPSBkYXRhLmhlYWRlcnMuZmluZChoID0+IGgua2V5ID09PSAnZmlsdGVyUHJvZHVjdEJhc2VkT25DdXN0b21lckNvdW50cnknKTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGhlYWRlciAmJlxyXG4gICAgICAgIGhlYWRlci52YWx1ZSAhPT0gbnVsbCAmJlxyXG4gICAgICAgIGhlYWRlci52YWx1ZSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgaGVhZGVyLnZhbHVlLnRyaW0oKSAhPT0gXCJcIiAmJlxyXG4gICAgICAgIGhlYWRlci52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG59XHJcblNlbGVjdENvbXBvbmVudC5NYXRlcmlhbENvbXBvbmVudCA9IE1hdGVyaWFsU2VsZWN0Q29tcG9uZW50O1xyXG5cclxuLy8gTWFrZSBzdXJlIHdlIGRldGVjdCBjaGFuZ2VzIHdoZW4gbmV3IGl0ZW1zIG1ha2UgdGhlaXIgd2F5IGludG8gdGhlIHNlbGVjdCBkcm9wZG93bi5cclxuY29uc3Qgc2V0SXRlbXMgPSBTZWxlY3RDb21wb25lbnQucHJvdG90eXBlLnNldEl0ZW1zO1xyXG5TZWxlY3RDb21wb25lbnQucHJvdG90eXBlLnNldEl0ZW1zID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcclxuICBzZXRJdGVtcy5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xyXG4gIGlmICh0aGlzLm1hdGVyaWFsQ29tcG9uZW50ICYmIHRoaXMubWF0ZXJpYWxDb21wb25lbnQuc2VsZWN0T3B0aW9uc1Jlc29sdmUpIHtcclxuICAgIHRoaXMubWF0ZXJpYWxDb21wb25lbnQuc2VsZWN0T3B0aW9uc1Jlc29sdmUodGhpcy5zZWxlY3RPcHRpb25zKTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgeyBTZWxlY3RDb21wb25lbnQgfTsiXX0=