@skyux/lookup 5.7.2 → 6.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/documentation.json +2 -2
  2. package/esm2020/index.mjs +32 -0
  3. package/esm2020/lib/modules/autocomplete/autocomplete-adapter.service.mjs +61 -0
  4. package/esm2020/lib/modules/autocomplete/autocomplete-default-search-function.mjs +39 -0
  5. package/esm2020/lib/modules/autocomplete/autocomplete-input.directive.mjs +221 -0
  6. package/esm2020/lib/modules/autocomplete/autocomplete-search-async-disabled.pipe.mjs +19 -0
  7. package/esm2020/lib/modules/autocomplete/autocomplete.component.mjs +739 -0
  8. package/esm2020/lib/modules/autocomplete/autocomplete.module.mjs +65 -0
  9. package/esm2020/lib/modules/autocomplete/types/autocomplete-default-search-function-options.mjs +2 -0
  10. package/esm2020/lib/modules/autocomplete/types/autocomplete-input-text-change.mjs +2 -0
  11. package/esm2020/lib/modules/autocomplete/types/autocomplete-message-type.mjs +15 -0
  12. package/esm2020/lib/modules/autocomplete/types/autocomplete-message.mjs +2 -0
  13. package/esm2020/lib/modules/autocomplete/types/autocomplete-search-async-args.mjs +2 -0
  14. package/esm2020/lib/modules/autocomplete/types/autocomplete-search-async-function.mjs +2 -0
  15. package/esm2020/lib/modules/autocomplete/types/autocomplete-search-async-result-display-type.mjs +2 -0
  16. package/esm2020/lib/modules/autocomplete/types/autocomplete-search-async-result.mjs +2 -0
  17. package/esm2020/lib/modules/autocomplete/types/autocomplete-search-function-filter.mjs +2 -0
  18. package/esm2020/lib/modules/autocomplete/types/autocomplete-search-function-response.mjs +2 -0
  19. package/esm2020/lib/modules/autocomplete/types/autocomplete-search-function.mjs +2 -0
  20. package/esm2020/lib/modules/autocomplete/types/autocomplete-selection-change.mjs +2 -0
  21. package/esm2020/lib/modules/autocomplete/types/autocomplete-show-more-args.mjs +2 -0
  22. package/esm2020/lib/modules/country-field/country-field.component.mjs +397 -0
  23. package/esm2020/lib/modules/country-field/country-field.module.mjs +49 -0
  24. package/esm2020/lib/modules/country-field/types/country.mjs +2 -0
  25. package/esm2020/lib/modules/lookup/lookup-adapter.service.mjs +21 -0
  26. package/esm2020/lib/modules/lookup/lookup-autocomplete-adapter.mjs +78 -0
  27. package/esm2020/lib/modules/lookup/lookup-item-selected.pipe.mjs +16 -0
  28. package/esm2020/lib/modules/lookup/lookup-show-more-async-modal.component.mjs +181 -0
  29. package/esm2020/lib/modules/lookup/lookup-show-more-modal.component.mjs +249 -0
  30. package/esm2020/lib/modules/lookup/lookup.component.mjs +601 -0
  31. package/esm2020/lib/modules/lookup/lookup.module.mjs +90 -0
  32. package/esm2020/lib/modules/lookup/types/lookup-add-click-callback-args.mjs +2 -0
  33. package/esm2020/lib/modules/lookup/types/lookup-add-click-event-args.mjs +2 -0
  34. package/esm2020/lib/modules/lookup/types/lookup-select-mode-type.mjs +2 -0
  35. package/esm2020/lib/modules/lookup/types/lookup-select-mode.mjs +16 -0
  36. package/esm2020/lib/modules/lookup/types/lookup-show-more-config.mjs +2 -0
  37. package/esm2020/lib/modules/lookup/types/lookup-show-more-custom-picker-context.mjs +7 -0
  38. package/esm2020/lib/modules/lookup/types/lookup-show-more-custom-picker.mjs +2 -0
  39. package/esm2020/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.mjs +7 -0
  40. package/esm2020/lib/modules/lookup/types/lookup-show-more-native-picker-config.mjs +2 -0
  41. package/esm2020/lib/modules/lookup/types/lookup-show-more-native-picker-context.mjs +7 -0
  42. package/esm2020/lib/modules/search/search-adapter.service.mjs +45 -0
  43. package/esm2020/lib/modules/search/search.component.mjs +253 -0
  44. package/esm2020/lib/modules/search/search.module.mjs +46 -0
  45. package/esm2020/lib/modules/shared/sky-lookup-resources.module.mjs +72 -0
  46. package/esm2020/lib/modules/shared/sky-lookup-string-utils.mjs +8 -0
  47. package/esm2020/skyux-lookup.mjs +5 -0
  48. package/esm2020/testing/country-field/country-field-fixture.mjs +114 -0
  49. package/esm2020/testing/country-field/country-field-testing.module.mjs +15 -0
  50. package/esm2020/testing/public-api.mjs +5 -0
  51. package/esm2020/testing/search/search-fixture.mjs +57 -0
  52. package/esm2020/testing/search/search-testing.module.mjs +15 -0
  53. package/esm2020/testing/skyux-lookup-testing.mjs +5 -0
  54. package/fesm2015/{skyux-lookup-testing.js → skyux-lookup-testing.mjs} +9 -9
  55. package/fesm2015/skyux-lookup-testing.mjs.map +1 -0
  56. package/fesm2015/skyux-lookup.mjs +3153 -0
  57. package/fesm2015/skyux-lookup.mjs.map +1 -0
  58. package/fesm2020/skyux-lookup-testing.mjs +203 -0
  59. package/fesm2020/skyux-lookup-testing.mjs.map +1 -0
  60. package/fesm2020/skyux-lookup.mjs +3144 -0
  61. package/fesm2020/skyux-lookup.mjs.map +1 -0
  62. package/package.json +45 -21
  63. package/testing/package.json +5 -5
  64. package/bundles/skyux-lookup-testing.umd.js +0 -620
  65. package/bundles/skyux-lookup.umd.js +0 -3793
  66. package/esm2015/index.js +0 -32
  67. package/esm2015/index.js.map +0 -1
  68. package/esm2015/lib/modules/autocomplete/autocomplete-adapter.service.js +0 -61
  69. package/esm2015/lib/modules/autocomplete/autocomplete-adapter.service.js.map +0 -1
  70. package/esm2015/lib/modules/autocomplete/autocomplete-default-search-function.js +0 -39
  71. package/esm2015/lib/modules/autocomplete/autocomplete-default-search-function.js.map +0 -1
  72. package/esm2015/lib/modules/autocomplete/autocomplete-input.directive.js +0 -221
  73. package/esm2015/lib/modules/autocomplete/autocomplete-input.directive.js.map +0 -1
  74. package/esm2015/lib/modules/autocomplete/autocomplete-search-async-disabled.pipe.js +0 -19
  75. package/esm2015/lib/modules/autocomplete/autocomplete-search-async-disabled.pipe.js.map +0 -1
  76. package/esm2015/lib/modules/autocomplete/autocomplete.component.js +0 -745
  77. package/esm2015/lib/modules/autocomplete/autocomplete.component.js.map +0 -1
  78. package/esm2015/lib/modules/autocomplete/autocomplete.module.js +0 -65
  79. package/esm2015/lib/modules/autocomplete/autocomplete.module.js.map +0 -1
  80. package/esm2015/lib/modules/autocomplete/types/autocomplete-default-search-function-options.js +0 -2
  81. package/esm2015/lib/modules/autocomplete/types/autocomplete-default-search-function-options.js.map +0 -1
  82. package/esm2015/lib/modules/autocomplete/types/autocomplete-input-text-change.js +0 -2
  83. package/esm2015/lib/modules/autocomplete/types/autocomplete-input-text-change.js.map +0 -1
  84. package/esm2015/lib/modules/autocomplete/types/autocomplete-message-type.js +0 -15
  85. package/esm2015/lib/modules/autocomplete/types/autocomplete-message-type.js.map +0 -1
  86. package/esm2015/lib/modules/autocomplete/types/autocomplete-message.js +0 -2
  87. package/esm2015/lib/modules/autocomplete/types/autocomplete-message.js.map +0 -1
  88. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-args.js +0 -2
  89. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-args.js.map +0 -1
  90. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-function.js +0 -2
  91. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-function.js.map +0 -1
  92. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result-display-type.js +0 -2
  93. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result-display-type.js.map +0 -1
  94. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result.js +0 -2
  95. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-async-result.js.map +0 -1
  96. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-filter.js +0 -2
  97. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-filter.js.map +0 -1
  98. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-response.js +0 -2
  99. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function-response.js.map +0 -1
  100. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function.js +0 -2
  101. package/esm2015/lib/modules/autocomplete/types/autocomplete-search-function.js.map +0 -1
  102. package/esm2015/lib/modules/autocomplete/types/autocomplete-selection-change.js +0 -2
  103. package/esm2015/lib/modules/autocomplete/types/autocomplete-selection-change.js.map +0 -1
  104. package/esm2015/lib/modules/autocomplete/types/autocomplete-show-more-args.js +0 -2
  105. package/esm2015/lib/modules/autocomplete/types/autocomplete-show-more-args.js.map +0 -1
  106. package/esm2015/lib/modules/country-field/country-field.component.js +0 -404
  107. package/esm2015/lib/modules/country-field/country-field.component.js.map +0 -1
  108. package/esm2015/lib/modules/country-field/country-field.module.js +0 -49
  109. package/esm2015/lib/modules/country-field/country-field.module.js.map +0 -1
  110. package/esm2015/lib/modules/country-field/types/country.js +0 -2
  111. package/esm2015/lib/modules/country-field/types/country.js.map +0 -1
  112. package/esm2015/lib/modules/lookup/lookup-adapter.service.js +0 -21
  113. package/esm2015/lib/modules/lookup/lookup-adapter.service.js.map +0 -1
  114. package/esm2015/lib/modules/lookup/lookup-autocomplete-adapter.js +0 -78
  115. package/esm2015/lib/modules/lookup/lookup-autocomplete-adapter.js.map +0 -1
  116. package/esm2015/lib/modules/lookup/lookup-item-selected.pipe.js +0 -16
  117. package/esm2015/lib/modules/lookup/lookup-item-selected.pipe.js.map +0 -1
  118. package/esm2015/lib/modules/lookup/lookup-show-more-async-modal.component.js +0 -186
  119. package/esm2015/lib/modules/lookup/lookup-show-more-async-modal.component.js.map +0 -1
  120. package/esm2015/lib/modules/lookup/lookup-show-more-modal.component.js +0 -258
  121. package/esm2015/lib/modules/lookup/lookup-show-more-modal.component.js.map +0 -1
  122. package/esm2015/lib/modules/lookup/lookup.component.js +0 -610
  123. package/esm2015/lib/modules/lookup/lookup.component.js.map +0 -1
  124. package/esm2015/lib/modules/lookup/lookup.module.js +0 -94
  125. package/esm2015/lib/modules/lookup/lookup.module.js.map +0 -1
  126. package/esm2015/lib/modules/lookup/types/lookup-add-click-callback-args.js +0 -2
  127. package/esm2015/lib/modules/lookup/types/lookup-add-click-callback-args.js.map +0 -1
  128. package/esm2015/lib/modules/lookup/types/lookup-add-click-event-args.js +0 -2
  129. package/esm2015/lib/modules/lookup/types/lookup-add-click-event-args.js.map +0 -1
  130. package/esm2015/lib/modules/lookup/types/lookup-select-mode-type.js +0 -2
  131. package/esm2015/lib/modules/lookup/types/lookup-select-mode-type.js.map +0 -1
  132. package/esm2015/lib/modules/lookup/types/lookup-select-mode.js +0 -16
  133. package/esm2015/lib/modules/lookup/types/lookup-select-mode.js.map +0 -1
  134. package/esm2015/lib/modules/lookup/types/lookup-show-more-config.js +0 -2
  135. package/esm2015/lib/modules/lookup/types/lookup-show-more-config.js.map +0 -1
  136. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker-context.js +0 -7
  137. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker-context.js.map +0 -1
  138. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker.js +0 -2
  139. package/esm2015/lib/modules/lookup/types/lookup-show-more-custom-picker.js.map +0 -1
  140. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.js +0 -7
  141. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-async-context.js.map +0 -1
  142. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-config.js +0 -2
  143. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-config.js.map +0 -1
  144. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-context.js +0 -7
  145. package/esm2015/lib/modules/lookup/types/lookup-show-more-native-picker-context.js.map +0 -1
  146. package/esm2015/lib/modules/search/search-adapter.service.js +0 -45
  147. package/esm2015/lib/modules/search/search-adapter.service.js.map +0 -1
  148. package/esm2015/lib/modules/search/search.component.js +0 -260
  149. package/esm2015/lib/modules/search/search.component.js.map +0 -1
  150. package/esm2015/lib/modules/search/search.module.js +0 -46
  151. package/esm2015/lib/modules/search/search.module.js.map +0 -1
  152. package/esm2015/lib/modules/shared/sky-lookup-resources.module.js +0 -72
  153. package/esm2015/lib/modules/shared/sky-lookup-resources.module.js.map +0 -1
  154. package/esm2015/lib/modules/shared/sky-lookup-string-utils.js +0 -8
  155. package/esm2015/lib/modules/shared/sky-lookup-string-utils.js.map +0 -1
  156. package/esm2015/skyux-lookup.js +0 -5
  157. package/esm2015/skyux-lookup.js.map +0 -1
  158. package/esm2015/testing/country-field/country-field-fixture.js +0 -123
  159. package/esm2015/testing/country-field/country-field-fixture.js.map +0 -1
  160. package/esm2015/testing/country-field/country-field-testing.module.js +0 -15
  161. package/esm2015/testing/country-field/country-field-testing.module.js.map +0 -1
  162. package/esm2015/testing/public-api.js +0 -5
  163. package/esm2015/testing/public-api.js.map +0 -1
  164. package/esm2015/testing/search/search-fixture.js +0 -57
  165. package/esm2015/testing/search/search-fixture.js.map +0 -1
  166. package/esm2015/testing/search/search-testing.module.js +0 -15
  167. package/esm2015/testing/search/search-testing.module.js.map +0 -1
  168. package/esm2015/testing/skyux-lookup-testing.js +0 -5
  169. package/esm2015/testing/skyux-lookup-testing.js.map +0 -1
  170. package/fesm2015/skyux-lookup-testing.js.map +0 -1
  171. package/fesm2015/skyux-lookup.js +0 -3191
  172. package/fesm2015/skyux-lookup.js.map +0 -1
@@ -0,0 +1,249 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, } from '@angular/core';
2
+ import { SkyModalInstance } from '@skyux/modals';
3
+ import { Subject } from 'rxjs';
4
+ import { SkyLookupShowMoreNativePickerContext } from './types/lookup-show-more-native-picker-context';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@skyux/modals";
7
+ import * as i2 from "./types/lookup-show-more-native-picker-context";
8
+ import * as i3 from "@skyux/layout";
9
+ import * as i4 from "../search/search.component";
10
+ import * as i5 from "@skyux/indicators";
11
+ import * as i6 from "@skyux/forms";
12
+ import * as i7 from "@skyux/lists";
13
+ import * as i8 from "@angular/common";
14
+ import * as i9 from "@skyux/core";
15
+ import * as i10 from "@skyux/theme";
16
+ import * as i11 from "@skyux/i18n";
17
+ /**
18
+ * @internal
19
+ * Internal component to implement the native picker.
20
+ */
21
+ export class SkyLookupShowMoreModalComponent {
22
+ constructor(modalInstance, context, changeDetector) {
23
+ this.modalInstance = modalInstance;
24
+ this.context = context;
25
+ this.changeDetector = changeDetector;
26
+ /**
27
+ * @internal
28
+ * Fires when users select the button to add new options to the list.
29
+ */
30
+ this.addClick = new Subject();
31
+ this.dataManagerConfig = {
32
+ sortOptions: [
33
+ {
34
+ id: 'az',
35
+ label: 'Alphabetical (A - Z)',
36
+ descending: false,
37
+ propertyName: 'name',
38
+ },
39
+ {
40
+ id: 'za',
41
+ label: 'Alphabetical (Z - A)',
42
+ descending: true,
43
+ propertyName: 'name',
44
+ },
45
+ ],
46
+ };
47
+ this.displayedItems = [];
48
+ this.itemsHaveMore = false;
49
+ this.onlyShowSelected = false;
50
+ this.selectedItems = [];
51
+ this.itemIndex = 0;
52
+ this.ngUnsubscribe = new Subject();
53
+ }
54
+ ngAfterViewInit() {
55
+ this.searchText = this.context.initialSearch;
56
+ this.addItems();
57
+ }
58
+ ngOnDestroy() {
59
+ this.ngUnsubscribe.next();
60
+ this.ngUnsubscribe.complete();
61
+ }
62
+ addButtonClicked() {
63
+ this.addClick.next();
64
+ }
65
+ addItems() {
66
+ if (!this.items || this.items.length === 0) {
67
+ const selectedItems = this.selectedItems.slice();
68
+ this.items = this.context.items
69
+ ? this.context.items.map((item) => {
70
+ return {
71
+ value: item,
72
+ selected: false,
73
+ };
74
+ })
75
+ : [];
76
+ this.items.forEach((item) => {
77
+ const isInitialValue = this.context.initialValue === item.value;
78
+ const initialIsArray = Array.isArray(this.context.initialValue);
79
+ const initialValueContainsItem = this.context.initialValue.findIndex((initialItem) => initialItem === item.value) >= 0;
80
+ if (isInitialValue || (initialIsArray && initialValueContainsItem)) {
81
+ item.selected = true;
82
+ const itemIndex = this.items.indexOf(item);
83
+ if (selectedItems.findIndex((selectedItem) => selectedItem.index === itemIndex) < 0) {
84
+ selectedItems.push({ index: itemIndex, itemData: item.value });
85
+ }
86
+ }
87
+ });
88
+ this.selectedItems = selectedItems;
89
+ this.updateDataState();
90
+ this.changeDetector.markForCheck();
91
+ }
92
+ this.itemIndex = this.itemIndex + 10;
93
+ this.searchItems(this.items).then((searchedItems) => {
94
+ this.displayedItems = searchedItems.slice(0, this.itemIndex);
95
+ if (this.itemIndex > searchedItems.length) {
96
+ this.itemsHaveMore = false;
97
+ }
98
+ else {
99
+ this.itemsHaveMore = true;
100
+ }
101
+ this.changeDetector.markForCheck();
102
+ });
103
+ }
104
+ clearAll() {
105
+ this.displayedItems.forEach((item) => {
106
+ if (item.selected) {
107
+ item.selected = false;
108
+ }
109
+ });
110
+ this.selectedItems = [];
111
+ this.updateDataState();
112
+ this.changeDetector.markForCheck();
113
+ }
114
+ itemClick(selectedItem) {
115
+ if (this.context.selectMode === 'single') {
116
+ this.onItemSelect(!selectedItem.selected, selectedItem);
117
+ }
118
+ }
119
+ onItemSelect(newSelectState, itemToSelect) {
120
+ if (this.context.selectMode === 'single') {
121
+ /* Sanity check - single select mode should only alow for a `true` select state */
122
+ /* istanbul ignore else */
123
+ if (newSelectState) {
124
+ itemToSelect.selected = true;
125
+ this.items.forEach((item) => {
126
+ if (item.value !== itemToSelect.value) {
127
+ item.selected = false;
128
+ }
129
+ });
130
+ this.displayedItems.forEach((item) => {
131
+ if (item.value !== itemToSelect.value) {
132
+ item.selected = false;
133
+ }
134
+ });
135
+ const itemIndex = this.items.findIndex((item) => item.value === itemToSelect.value);
136
+ this.selectedItems = [
137
+ { index: itemIndex, itemData: this.items[itemIndex].value },
138
+ ];
139
+ }
140
+ }
141
+ else {
142
+ const selectedItems = this.selectedItems;
143
+ const allItemsIndex = this.items.findIndex((item) => item.value === itemToSelect.value);
144
+ const selectedItemsIndex = selectedItems.findIndex((selectedItem) => selectedItem.index === allItemsIndex);
145
+ if (newSelectState && selectedItemsIndex === -1) {
146
+ selectedItems.push({
147
+ index: allItemsIndex,
148
+ itemData: this.items[allItemsIndex].value,
149
+ });
150
+ }
151
+ else if (!newSelectState && selectedItemsIndex !== -1) {
152
+ selectedItems.splice(selectedItemsIndex, 1);
153
+ }
154
+ this.selectedItems = selectedItems;
155
+ }
156
+ this.updateDataState();
157
+ this.changeDetector.markForCheck();
158
+ }
159
+ searchApplied(searchText) {
160
+ /* istanbul ignore else */
161
+ if (this.searchText !== searchText) {
162
+ this.itemIndex = 10;
163
+ }
164
+ this.searchText = searchText;
165
+ this.updateDataState();
166
+ }
167
+ searchItems(items) {
168
+ const searchText = this.searchText;
169
+ if (searchText) {
170
+ const resultValues = this.context.search(searchText, items.map((item) => {
171
+ return item.value;
172
+ }));
173
+ if (resultValues instanceof Array) {
174
+ const result = items.filter((item) => resultValues.indexOf(item.value) >= 0);
175
+ return Promise.resolve(result);
176
+ }
177
+ else {
178
+ return resultValues.then((values) => {
179
+ const result = items.filter((item) => values.indexOf(item.value) >= 0);
180
+ return Promise.resolve(result);
181
+ });
182
+ }
183
+ }
184
+ else {
185
+ return Promise.resolve(items);
186
+ }
187
+ }
188
+ selectAll() {
189
+ const selectedItems = this.selectedItems;
190
+ this.displayedItems.forEach((item) => {
191
+ if (!item.selected) {
192
+ item.selected = true;
193
+ const index = this.items.indexOf(item);
194
+ /* Sanity check */
195
+ /* istanbul ignore else */
196
+ if (selectedItems.findIndex((selectedItem) => selectedItem.index === index) < 0) {
197
+ selectedItems.push({
198
+ index: index,
199
+ itemData: this.items[index].value,
200
+ });
201
+ }
202
+ }
203
+ });
204
+ this.selectedItems = selectedItems;
205
+ this.updateDataState();
206
+ this.changeDetector.markForCheck();
207
+ }
208
+ updateDataState() {
209
+ const selectedItems = this.selectedItems;
210
+ this.items.forEach((item, index) => {
211
+ item.selected =
212
+ selectedItems.findIndex((selectedItem) => selectedItem.index === index) !== -1;
213
+ });
214
+ this.searchItems(this.items).then((searchedItems) => {
215
+ if (this.onlyShowSelected) {
216
+ searchedItems = searchedItems.filter((item) => item.selected);
217
+ }
218
+ this.displayedItems = searchedItems.slice(0, this.itemIndex);
219
+ if (this.itemIndex > searchedItems.length) {
220
+ this.itemsHaveMore = false;
221
+ }
222
+ else {
223
+ this.itemsHaveMore = true;
224
+ }
225
+ this.changeDetector.markForCheck();
226
+ });
227
+ }
228
+ updateItemData(data) {
229
+ this.context.items = data;
230
+ this.items = undefined;
231
+ this.itemIndex = 10;
232
+ this.selectedItems.forEach((selectedItem) => {
233
+ this.context.items.forEach((item, index) => {
234
+ if (selectedItem.itemData === item) {
235
+ selectedItem.index = index;
236
+ }
237
+ });
238
+ });
239
+ this.addItems();
240
+ this.changeDetector.markForCheck();
241
+ }
242
+ }
243
+ SkyLookupShowMoreModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyLookupShowMoreModalComponent, deps: [{ token: i1.SkyModalInstance }, { token: i2.SkyLookupShowMoreNativePickerContext }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
244
+ SkyLookupShowMoreModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyLookupShowMoreModalComponent, selector: "skyux-lookup-show-more-modal", ngImport: i0, template: "<sky-modal>\n <sky-modal-header>\n <ng-container *ngIf=\"context.userConfig?.title; else defaultTitle\">\n {{ context.userConfig.title }}\n </ng-container>\n </sky-modal-header>\n <sky-modal-content>\n <div\n [skyViewkeeper]=\"[\n '.sky-lookup-show-more-modal-toolbar',\n '.sky-lookup-show-more-modal-muiltiselect-toolbar'\n ]\"\n >\n <sky-toolbar class=\"sky-lookup-show-more-modal-toolbar\">\n <sky-toolbar-section>\n <sky-toolbar-item>\n <sky-search\n [debounceTime]=\"250\"\n [searchText]=\"searchText\"\n (searchApply)=\"searchApplied($event)\"\n >\n </sky-search>\n </sky-toolbar-item>\n <sky-toolbar-view-actions>\n <button\n *ngIf=\"context.showAddButton\"\n type=\"button\"\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-add\"\n (click)=\"addButtonClicked()\"\n >\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"add\"\n iconType=\"skyux\"\n ></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_lookup_show_more_add' | skyLibResources }}\n </button>\n </sky-toolbar-view-actions>\n </sky-toolbar-section>\n </sky-toolbar>\n <sky-toolbar\n *ngIf=\"context.selectMode === 'multiple'\"\n class=\"sky-lookup-show-more-modal-muiltiselect-toolbar\"\n >\n <sky-toolbar-section>\n <sky-toolbar-item>\n <button\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-select-all-btn\"\n type=\"button\"\n (click)=\"selectAll()\"\n >\n {{\n 'skyux_lookup_show_more_select_all_button_title'\n | skyLibResources\n }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-item>\n <button\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-clear-all-btn\"\n type=\"button\"\n (click)=\"clearAll()\"\n >\n {{\n 'skyux_lookup_show_more_clear_all_button_title'\n | skyLibResources\n }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-view-actions>\n <sky-checkbox\n [(checked)]=\"onlyShowSelected\"\n (change)=\"updateDataState()\"\n >\n <sky-checkbox-label>\n {{\n 'skyux_lookup_show_more_show_selected_option_title'\n | skyLibResources\n }}\n </sky-checkbox-label>\n </sky-checkbox>\n </sky-toolbar-view-actions>\n </sky-toolbar-section>\n </sky-toolbar>\n </div>\n <div\n *ngIf=\"displayedItems.length === 0\"\n class=\"sky-font-deemphasized sky-lookup-show-more-no-results\"\n >\n {{ 'skyux_lookup_show_more_no_results' | skyLibResources }}\n </div>\n <sky-repeater class=\"sky-lookup-show-more-repeater\" expandMode=\"none\">\n <sky-repeater-item\n *ngFor=\"let item of displayedItems\"\n [selectable]=\"context.selectMode === 'multiple'\"\n [(isSelected)]=\"item.selected\"\n (click)=\"itemClick(item)\"\n (keyup.enter)=\"itemClick(item)\"\n (isSelectedChange)=\"onItemSelect($event, item)\"\n >\n <sky-repeater-item-content>\n <ng-container\n *ngTemplateOutlet=\"\n context.userConfig?.itemTemplate\n ? context.userConfig?.itemTemplate\n : defaultItemTemplate;\n context: { item: item.value }\n \"\n >\n </ng-container>\n </sky-repeater-item-content>\n </sky-repeater-item>\n </sky-repeater>\n <sky-infinite-scroll [enabled]=\"itemsHaveMore\" (scrollEnd)=\"addItems()\">\n </sky-infinite-scroll>\n </sky-modal-content>\n <sky-modal-footer>\n <button\n class=\"sky-btn sky-btn-primary sky-margin-inline-compact sky-lookup-show-more-modal-save\"\n type=\"button\"\n (click)=\"modalInstance.save(selectedItems)\"\n >\n {{ 'skyux_lookup_show_more_select' | skyLibResources }}\n </button>\n <button\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-close\"\n type=\"button\"\n (click)=\"modalInstance.close()\"\n >\n {{ 'skyux_lookup_show_more_cancel' | skyLibResources }}\n </button>\n </sky-modal-footer>\n</sky-modal>\n\n<ng-template let-item=\"item\" #defaultItemTemplate>\n {{ item[context.descriptorProperty] }}\n</ng-template>\n\n<ng-template #defaultTitle>\n <ng-container *ngIf=\"context.selectMode === 'single'\">\n {{ 'skyux_lookup_show_more_modal_title_single' | skyLibResources }}\n </ng-container>\n <ng-container *ngIf=\"context.selectMode === 'multiple'\">\n {{ 'skyux_lookup_show_more_modal_title_multiple' | skyLibResources }}\n </ng-container>\n</ng-template>\n", styles: [".sky-lookup-show-more-no-results{padding:20px 0}:host-context(.sky-theme-modern) .sky-lookup-show-more-no-results{padding:30px 0}.sky-theme-modern .sky-lookup-show-more-no-results{padding:30px 0}\n"], components: [{ type: i1.λ5, selector: "sky-modal", inputs: ["ariaRole", "tiledBody"] }, { type: i1.λ4, selector: "sky-modal-header" }, { type: i1.λ2, selector: "sky-modal-content" }, { type: i3.λ37, selector: "sky-toolbar" }, { type: i3.λ38, selector: "sky-toolbar-section" }, { type: i3.λ39, selector: "sky-toolbar-item" }, { type: i4.SkySearchComponent, selector: "sky-search", inputs: ["searchText", "expandMode", "debounceTime", "disabled", "placeholderText"], outputs: ["searchApply", "searchChange", "searchClear"] }, { type: i3.λ40, selector: "sky-toolbar-view-actions" }, { type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "required"], outputs: ["change", "checkedChange", "disabledChange"] }, { type: i6.λ4, selector: "sky-checkbox-label" }, { type: i7.λ11, selector: "sky-repeater", inputs: ["activeIndex", "ariaLabel", "reorderable", "expandMode"], outputs: ["activeIndexChange", "orderChange"] }, { type: i7.λ10, selector: "sky-repeater-item", inputs: ["itemName", "inlineFormConfig", "inlineFormTemplate", "isExpanded", "isSelected", "reorderable", "selectable", "showInlineForm", "tag"], outputs: ["collapse", "expand", "inlineFormClose", "isSelectedChange"] }, { type: i7.λ8, selector: "sky-repeater-item-content" }, { type: i7.λ6, selector: "sky-infinite-scroll", inputs: ["enabled", "loading"], outputs: ["scrollEnd"] }, { type: i1.λ3, selector: "sky-modal-footer" }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.λ3, selector: "[skyViewkeeper]", inputs: ["skyViewkeeper"] }, { type: i10.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "skyLibResources": i11.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyLookupShowMoreModalComponent, decorators: [{
246
+ type: Component,
247
+ args: [{ selector: 'skyux-lookup-show-more-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<sky-modal>\n <sky-modal-header>\n <ng-container *ngIf=\"context.userConfig?.title; else defaultTitle\">\n {{ context.userConfig.title }}\n </ng-container>\n </sky-modal-header>\n <sky-modal-content>\n <div\n [skyViewkeeper]=\"[\n '.sky-lookup-show-more-modal-toolbar',\n '.sky-lookup-show-more-modal-muiltiselect-toolbar'\n ]\"\n >\n <sky-toolbar class=\"sky-lookup-show-more-modal-toolbar\">\n <sky-toolbar-section>\n <sky-toolbar-item>\n <sky-search\n [debounceTime]=\"250\"\n [searchText]=\"searchText\"\n (searchApply)=\"searchApplied($event)\"\n >\n </sky-search>\n </sky-toolbar-item>\n <sky-toolbar-view-actions>\n <button\n *ngIf=\"context.showAddButton\"\n type=\"button\"\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-add\"\n (click)=\"addButtonClicked()\"\n >\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"add\"\n iconType=\"skyux\"\n ></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_lookup_show_more_add' | skyLibResources }}\n </button>\n </sky-toolbar-view-actions>\n </sky-toolbar-section>\n </sky-toolbar>\n <sky-toolbar\n *ngIf=\"context.selectMode === 'multiple'\"\n class=\"sky-lookup-show-more-modal-muiltiselect-toolbar\"\n >\n <sky-toolbar-section>\n <sky-toolbar-item>\n <button\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-select-all-btn\"\n type=\"button\"\n (click)=\"selectAll()\"\n >\n {{\n 'skyux_lookup_show_more_select_all_button_title'\n | skyLibResources\n }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-item>\n <button\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-clear-all-btn\"\n type=\"button\"\n (click)=\"clearAll()\"\n >\n {{\n 'skyux_lookup_show_more_clear_all_button_title'\n | skyLibResources\n }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-view-actions>\n <sky-checkbox\n [(checked)]=\"onlyShowSelected\"\n (change)=\"updateDataState()\"\n >\n <sky-checkbox-label>\n {{\n 'skyux_lookup_show_more_show_selected_option_title'\n | skyLibResources\n }}\n </sky-checkbox-label>\n </sky-checkbox>\n </sky-toolbar-view-actions>\n </sky-toolbar-section>\n </sky-toolbar>\n </div>\n <div\n *ngIf=\"displayedItems.length === 0\"\n class=\"sky-font-deemphasized sky-lookup-show-more-no-results\"\n >\n {{ 'skyux_lookup_show_more_no_results' | skyLibResources }}\n </div>\n <sky-repeater class=\"sky-lookup-show-more-repeater\" expandMode=\"none\">\n <sky-repeater-item\n *ngFor=\"let item of displayedItems\"\n [selectable]=\"context.selectMode === 'multiple'\"\n [(isSelected)]=\"item.selected\"\n (click)=\"itemClick(item)\"\n (keyup.enter)=\"itemClick(item)\"\n (isSelectedChange)=\"onItemSelect($event, item)\"\n >\n <sky-repeater-item-content>\n <ng-container\n *ngTemplateOutlet=\"\n context.userConfig?.itemTemplate\n ? context.userConfig?.itemTemplate\n : defaultItemTemplate;\n context: { item: item.value }\n \"\n >\n </ng-container>\n </sky-repeater-item-content>\n </sky-repeater-item>\n </sky-repeater>\n <sky-infinite-scroll [enabled]=\"itemsHaveMore\" (scrollEnd)=\"addItems()\">\n </sky-infinite-scroll>\n </sky-modal-content>\n <sky-modal-footer>\n <button\n class=\"sky-btn sky-btn-primary sky-margin-inline-compact sky-lookup-show-more-modal-save\"\n type=\"button\"\n (click)=\"modalInstance.save(selectedItems)\"\n >\n {{ 'skyux_lookup_show_more_select' | skyLibResources }}\n </button>\n <button\n class=\"sky-btn sky-btn-link sky-lookup-show-more-modal-close\"\n type=\"button\"\n (click)=\"modalInstance.close()\"\n >\n {{ 'skyux_lookup_show_more_cancel' | skyLibResources }}\n </button>\n </sky-modal-footer>\n</sky-modal>\n\n<ng-template let-item=\"item\" #defaultItemTemplate>\n {{ item[context.descriptorProperty] }}\n</ng-template>\n\n<ng-template #defaultTitle>\n <ng-container *ngIf=\"context.selectMode === 'single'\">\n {{ 'skyux_lookup_show_more_modal_title_single' | skyLibResources }}\n </ng-container>\n <ng-container *ngIf=\"context.selectMode === 'multiple'\">\n {{ 'skyux_lookup_show_more_modal_title_multiple' | skyLibResources }}\n </ng-container>\n</ng-template>\n", styles: [".sky-lookup-show-more-no-results{padding:20px 0}:host-context(.sky-theme-modern) .sky-lookup-show-more-no-results{padding:30px 0}.sky-theme-modern .sky-lookup-show-more-no-results{padding:30px 0}\n"] }]
248
+ }], ctorParameters: function () { return [{ type: i1.SkyModalInstance }, { type: i2.SkyLookupShowMoreNativePickerContext }, { type: i0.ChangeDetectorRef }]; } });
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLXNob3ctbW9yZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbG9va3VwL3NyYy9saWIvbW9kdWxlcy9sb29rdXAvbG9va3VwLXNob3ctbW9yZS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbG9va3VwL3NyYy9saWIvbW9kdWxlcy9sb29rdXAvbG9va3VwLXNob3ctbW9yZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7Ozs7Ozs7Ozs7QUFFdEc7OztHQUdHO0FBV0gsTUFBTSxPQUFPLCtCQUErQjtJQXFDMUMsWUFDUyxhQUErQixFQUMvQixPQUE2QyxFQUM1QyxjQUFpQztRQUZsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0M7UUFDNUMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBckMzQzs7O1dBR0c7UUFDSSxhQUFRLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFJeEMsc0JBQWlCLEdBQUc7WUFDekIsV0FBVyxFQUFFO2dCQUNYO29CQUNFLEVBQUUsRUFBRSxJQUFJO29CQUNSLEtBQUssRUFBRSxzQkFBc0I7b0JBQzdCLFVBQVUsRUFBRSxLQUFLO29CQUNqQixZQUFZLEVBQUUsTUFBTTtpQkFDckI7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFF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QyxNQUFNLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzVCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1lBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBVztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLEVBQUU7Z0JBQ3RELElBQUksWUFBWSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7b0JBQ2xDLFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2lCQUM1QjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDOzs0SEEvUlUsK0JBQStCO2dIQUEvQiwrQkFBK0Isb0VDM0I1Qywwa0tBbUpBOzJGRHhIYSwrQkFBK0I7a0JBVjNDLFNBQVM7K0JBS0UsOEJBQThCLG1CQUd2Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTa3lNb2RhbEluc3RhbmNlIH0gZnJvbSAnQHNreXV4L21vZGFscyc7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2t5TG9va3VwU2hvd01vcmVOYXRpdmVQaWNrZXJDb250ZXh0IH0gZnJvbSAnLi90eXBlcy9sb29rdXAtc2hvdy1tb3JlLW5hdGl2ZS1waWNrZXItY29udGV4dCc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBJbnRlcm5hbCBjb21wb25lbnQgdG8gaW1wbGVtZW50IHRoZSBuYXRpdmUgcGlja2VyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gU3VwcHJlc3MgdGhpcyBlcnJvciByYXRoZXIgdGhhbiBmaXggdGhlIHNlbGVjdG9yIHNpbmNlIGNvbnN1bWVycyB3aXRoIHVuaXQgdGVzdHNcbiAgLy8gbWF5IGJlIGxvb2tpbmcgZm9yIGFuIGVsZW1lbnQgd2l0aCB0aGlzIHNlbGVjdG9yLiBXZSBjYW4gY2hhbmdlIGl0IGluIHRoZSBuZXh0IG1ham9yXG4gIC8vIHZlcnNpb24gb2YgU0tZIFVYLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ3NreXV4LWxvb2t1cC1zaG93LW1vcmUtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9va3VwLXNob3ctbW9yZS1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xvb2t1cC1zaG93LW1vcmUtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUxvb2t1cFNob3dNb3JlTW9kYWxDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCB0aGUgYnV0dG9uIHRvIGFkZCBuZXcgb3B0aW9ucyB0byB0aGUgbGlzdC5cbiAgICovXG4gIHB1YmxpYyBhZGRDbGljazogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGl0ZW1zOiBhbnlbXTtcblxuICBwdWJsaWMgZGF0YU1hbmFnZXJDb25maWcgPSB7XG4gICAgc29ydE9wdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdheicsXG4gICAgICAgIGxhYmVsOiAnQWxwaGFiZXRpY2FsIChBIC0gWiknLFxuICAgICAgICBkZXNjZW5kaW5nOiBmYWxzZSxcbiAgICAgICAgcHJvcGVydHlOYW1lOiAnbmFtZScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ3phJyxcbiAgICAgICAgbGFiZWw6ICdBbHBoYWJldGljYWwgKFogLSBBKScsXG4gICAgICAgIGRlc2NlbmRpbmc6IHRydWUsXG4gICAgICAgIHByb3BlcnR5TmFtZTogJ25hbWUnLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xuXG4gIHB1YmxpYyBkaXNwbGF5ZWRJdGVtczogYW55W10gPSBbXTtcbiAgcHVibGljIGl0ZW1zSGF2ZU1vcmUgPSBmYWxzZTtcbiAgcHVibGljIG9ubHlTaG93U2VsZWN0ZWQgPSBmYWxzZTtcbiAgcHVibGljIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgcHVibGljIHNlbGVjdGVkSXRlbXM6IHsgaW5kZXg6IG51bWJlcjsgaXRlbURhdGE6IGFueSB9W10gPSBbXTtcblxuICBwcml2YXRlIGl0ZW1JbmRleCA9IDA7XG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1vZGFsSW5zdGFuY2U6IFNreU1vZGFsSW5zdGFuY2UsXG4gICAgcHVibGljIGNvbnRleHQ6IFNreUxvb2t1cFNob3dNb3JlTmF0aXZlUGlja2VyQ29udGV4dCxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLmNvbnRleHQuaW5pdGlhbFNlYXJjaDtcbiAgICB0aGlzLmFkZEl0ZW1zKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRCdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ2xpY2submV4dCgpO1xuICB9XG5cbiAgcHVibGljIGFkZEl0ZW1zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pdGVtcyB8fCB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtczogYW55W10gPSB0aGlzLnNlbGVjdGVkSXRlbXMuc2xpY2UoKTtcblxuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuY29udGV4dC5pdGVtc1xuICAgICAgICA/IHRoaXMuY29udGV4dC5pdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgIDogW107XG5cbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBpc0luaXRpYWxWYWx1ZTogYm9vbGVhbiA9XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmluaXRpYWxWYWx1ZSA9PT0gaXRlbS52YWx1ZTtcblxuICAgICAgICBjb25zdCBpbml0aWFsSXNBcnJheTogYm9vbGVhbiA9IEFycmF5LmlzQXJyYXkoXG4gICAgICAgICAgdGhpcy5jb250ZXh0LmluaXRpYWxWYWx1ZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWVDb250YWluc0l0ZW06IGJvb2xlYW4gPVxuICAgICAgICAgIHRoaXMuY29udGV4dC5pbml0aWFsVmFsdWUuZmluZEluZGV4KFxuICAgICAgICAgICAgKGluaXRpYWxJdGVtOiBhbnkpID0+IGluaXRpYWxJdGVtID09PSBpdGVtLnZhbHVlXG4gICAgICAgICAgKSA+PSAwO1xuXG4gICAgICAgIGlmIChpc0luaXRpYWxWYWx1ZSB8fCAoaW5pdGlhbElzQXJyYXkgJiYgaW5pdGlhbFZhbHVlQ29udGFpbnNJdGVtKSkge1xuICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgKHNlbGVjdGVkSXRlbSkgPT4gc2VsZWN0ZWRJdGVtLmluZGV4ID09PSBpdGVtSW5kZXhcbiAgICAgICAgICAgICkgPCAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnB1c2goeyBpbmRleDogaXRlbUluZGV4LCBpdGVtRGF0YTogaXRlbS52YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBzZWxlY3RlZEl0ZW1zO1xuICAgICAgdGhpcy51cGRhdGVEYXRhU3RhdGUoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pdGVtSW5kZXggPSB0aGlzLml0ZW1JbmRleCArIDEwO1xuICAgIHRoaXMuc2VhcmNoSXRlbXModGhpcy5pdGVtcykudGhlbigoc2VhcmNoZWRJdGVtcykgPT4ge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRJdGVtcyA9IHNlYXJjaGVkSXRlbXMuc2xpY2UoMCwgdGhpcy5pdGVtSW5kZXgpO1xuXG4gICAgICBpZiAodGhpcy5pdGVtSW5kZXggPiBzZWFyY2hlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLml0ZW1zSGF2ZU1vcmUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXRlbXNIYXZlTW9yZSA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgIHRoaXMudXBkYXRlRGF0YVN0YXRlKCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBpdGVtQ2xpY2soc2VsZWN0ZWRJdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0LnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICB0aGlzLm9uSXRlbVNlbGVjdCghc2VsZWN0ZWRJdGVtLnNlbGVjdGVkLCBzZWxlY3RlZEl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkl0ZW1TZWxlY3QobmV3U2VsZWN0U3RhdGU6IGJvb2xlYW4sIGl0ZW1Ub1NlbGVjdDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dC5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgLyogU2FuaXR5IGNoZWNrIC0gc2luZ2xlIHNlbGVjdCBtb2RlIHNob3VsZCBvbmx5IGFsb3cgZm9yIGEgYHRydWVgIHNlbGVjdCBzdGF0ZSAqL1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChuZXdTZWxlY3RTdGF0ZSkge1xuICAgICAgICBpdGVtVG9TZWxlY3Quc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS52YWx1ZSAhPT0gaXRlbVRvU2VsZWN0LnZhbHVlKSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0udmFsdWUgIT09IGl0ZW1Ub1NlbGVjdC52YWx1ZSkge1xuICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuaXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBpdGVtVG9TZWxlY3QudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW1xuICAgICAgICAgIHsgaW5kZXg6IGl0ZW1JbmRleCwgaXRlbURhdGE6IHRoaXMuaXRlbXNbaXRlbUluZGV4XS52YWx1ZSB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zOiB7IGluZGV4OiBudW1iZXI7IGl0ZW1EYXRhOiBhbnkgfVtdID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zO1xuICAgICAgY29uc3QgYWxsSXRlbXNJbmRleCA9IHRoaXMuaXRlbXMuZmluZEluZGV4KFxuICAgICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gaXRlbVRvU2VsZWN0LnZhbHVlXG4gICAgICApO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtc0luZGV4ID0gc2VsZWN0ZWRJdGVtcy5maW5kSW5kZXgoXG4gICAgICAgIChzZWxlY3RlZEl0ZW0pID0+IHNlbGVjdGVkSXRlbS5pbmRleCA9PT0gYWxsSXRlbXNJbmRleFxuICAgICAgKTtcblxuICAgICAgaWYgKG5ld1NlbGVjdFN0YXRlICYmIHNlbGVjdGVkSXRlbXNJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtcy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogYWxsSXRlbXNJbmRleCxcbiAgICAgICAgICBpdGVtRGF0YTogdGhpcy5pdGVtc1thbGxJdGVtc0luZGV4XS52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFuZXdTZWxlY3RTdGF0ZSAmJiBzZWxlY3RlZEl0ZW1zSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbXMuc3BsaWNlKHNlbGVjdGVkSXRlbXNJbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkSXRlbXM7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRGF0YVN0YXRlKCk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2hBcHBsaWVkKHNlYXJjaFRleHQ6IHN0cmluZykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCAhPT0gc2VhcmNoVGV4dCkge1xuICAgICAgdGhpcy5pdGVtSW5kZXggPSAxMDtcbiAgICB9XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICB0aGlzLnVwZGF0ZURhdGFTdGF0ZSgpO1xuICB9XG5cbiAgcHVibGljIHNlYXJjaEl0ZW1zKGl0ZW1zOiBhbnlbXSk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hUZXh0O1xuXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9IHRoaXMuY29udGV4dC5zZWFyY2goXG4gICAgICAgIHNlYXJjaFRleHQsXG4gICAgICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdFZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAoaXRlbSkgPT4gcmVzdWx0VmFsdWVzLmluZGV4T2YoaXRlbS52YWx1ZSkgPj0gMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0VmFsdWVzLnRoZW4oKHZhbHVlcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiB2YWx1ZXMuaW5kZXhPZihpdGVtLnZhbHVlKSA+PSAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXM6IHsgaW5kZXg6IG51bWJlcjsgaXRlbURhdGE6IGFueSB9W10gPVxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRJdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmICghaXRlbS5zZWxlY3RlZCkge1xuICAgICAgICBpdGVtLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcblxuICAgICAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkSXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgICAgKHNlbGVjdGVkSXRlbSkgPT4gc2VsZWN0ZWRJdGVtLmluZGV4ID09PSBpbmRleFxuICAgICAgICAgICkgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaCh7XG4gICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICBpdGVtRGF0YTogdGhpcy5pdGVtc1tpbmRleF0udmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkSXRlbXM7XG4gICAgdGhpcy51cGRhdGVEYXRhU3RhdGUoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZURhdGFTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zOiB7IGluZGV4OiBudW1iZXI7IGl0ZW1EYXRhOiBhbnkgfVtdID1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcztcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaXRlbS5zZWxlY3RlZCA9XG4gICAgICAgIHNlbGVjdGVkSXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChzZWxlY3RlZEl0ZW0pID0+IHNlbGVjdGVkSXRlbS5pbmRleCA9PT0gaW5kZXhcbiAgICAgICAgKSAhPT0gLTE7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlYXJjaEl0ZW1zKHRoaXMuaXRlbXMpLnRoZW4oKHNlYXJjaGVkSXRlbXMpID0+IHtcbiAgICAgIGlmICh0aGlzLm9ubHlTaG93U2VsZWN0ZWQpIHtcbiAgICAgICAgc2VhcmNoZWRJdGVtcyA9IHNlYXJjaGVkSXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzcGxheWVkSXRlbXMgPSBzZWFyY2hlZEl0ZW1zLnNsaWNlKDAsIHRoaXMuaXRlbUluZGV4KTtcblxuICAgICAgaWYgKHRoaXMuaXRlbUluZGV4ID4gc2VhcmNoZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pdGVtc0hhdmVNb3JlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1zSGF2ZU1vcmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUl0ZW1EYXRhKGRhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0Lml0ZW1zID0gZGF0YTtcbiAgICB0aGlzLml0ZW1zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXRlbUluZGV4ID0gMTA7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZvckVhY2goKHNlbGVjdGVkSXRlbSkgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0Lml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtLml0ZW1EYXRhID09PSBpdGVtKSB7XG4gICAgICAgICAgc2VsZWN0ZWRJdGVtLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRJdGVtcygpO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPHNreS1tb2RhbD5cbiAgPHNreS1tb2RhbC1oZWFkZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRleHQudXNlckNvbmZpZz8udGl0bGU7IGVsc2UgZGVmYXVsdFRpdGxlXCI+XG4gICAgICB7eyBjb250ZXh0LnVzZXJDb25maWcudGl0bGUgfX1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9za3ktbW9kYWwtaGVhZGVyPlxuICA8c2t5LW1vZGFsLWNvbnRlbnQ+XG4gICAgPGRpdlxuICAgICAgW3NreVZpZXdrZWVwZXJdPVwiW1xuICAgICAgICAnLnNreS1sb29rdXAtc2hvdy1tb3JlLW1vZGFsLXRvb2xiYXInLFxuICAgICAgICAnLnNreS1sb29rdXAtc2hvdy1tb3JlLW1vZGFsLW11aWx0aXNlbGVjdC10b29sYmFyJ1xuICAgICAgXVwiXG4gICAgPlxuICAgICAgPHNreS10b29sYmFyIGNsYXNzPVwic2t5LWxvb2t1cC1zaG93LW1vcmUtbW9kYWwtdG9vbGJhclwiPlxuICAgICAgICA8c2t5LXRvb2xiYXItc2VjdGlvbj5cbiAgICAgICAgICA8c2t5LXRvb2xiYXItaXRlbT5cbiAgICAgICAgICAgIDxza3ktc2VhcmNoXG4gICAgICAgICAgICAgIFtkZWJvdW5jZVRpbWVdPVwiMjUwXCJcbiAgICAgICAgICAgICAgW3NlYXJjaFRleHRdPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgIChzZWFyY2hBcHBseSk9XCJzZWFyY2hBcHBsaWVkKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9za3ktc2VhcmNoPlxuICAgICAgICAgIDwvc2t5LXRvb2xiYXItaXRlbT5cbiAgICAgICAgICA8c2t5LXRvb2xiYXItdmlldy1hY3Rpb25zPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImNvbnRleHQuc2hvd0FkZEJ1dHRvblwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1saW5rIHNreS1sb29rdXAtc2hvdy1tb3JlLW1vZGFsLWFkZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGRCdXR0b25DbGlja2VkKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c2t5LWljb25cbiAgICAgICAgICAgICAgICAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICAgICAgICBpY29uVHlwZT1cInNreXV4XCJcbiAgICAgICAgICAgICAgPjwvc2t5LWljb24+XG4gICAgICAgICAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidkZWZhdWx0J1wiIGljb249XCJwbHVzLWNpcmNsZVwiPjwvc2t5LWljb24+XG4gICAgICAgICAgICAgIHt7ICdza3l1eF9sb29rdXBfc2hvd19tb3JlX2FkZCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvc2t5LXRvb2xiYXItdmlldy1hY3Rpb25zPlxuICAgICAgICA8L3NreS10b29sYmFyLXNlY3Rpb24+XG4gICAgICA8L3NreS10b29sYmFyPlxuICAgICAgPHNreS10b29sYmFyXG4gICAgICAgICpuZ0lmPVwiY29udGV4dC5zZWxlY3RNb2RlID09PSAnbXVsdGlwbGUnXCJcbiAgICAgICAgY2xhc3M9XCJza3ktbG9va3VwLXNob3ctbW9yZS1tb2RhbC1tdWlsdGlzZWxlY3QtdG9vbGJhclwiXG4gICAgICA+XG4gICAgICAgIDxza3ktdG9vbGJhci1zZWN0aW9uPlxuICAgICAgICAgIDxza3ktdG9vbGJhci1pdGVtPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1saW5rIHNreS1sb29rdXAtc2hvdy1tb3JlLW1vZGFsLXNlbGVjdC1hbGwtYnRuXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgJ3NreXV4X2xvb2t1cF9zaG93X21vcmVfc2VsZWN0X2FsbF9idXR0b25fdGl0bGUnXG4gICAgICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlc1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9za3ktdG9vbGJhci1pdGVtPlxuICAgICAgICAgIDxza3ktdG9vbGJhci1pdGVtPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1saW5rIHNreS1sb29rdXAtc2hvdy1tb3JlLW1vZGFsLWNsZWFyLWFsbC1idG5cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICdza3l1eF9sb29rdXBfc2hvd19tb3JlX2NsZWFyX2FsbF9idXR0b25fdGl0bGUnXG4gICAgICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlc1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9za3ktdG9vbGJhci1pdGVtPlxuICAgICAgICAgIDxza3ktdG9vbGJhci12aWV3LWFjdGlvbnM+XG4gICAgICAgICAgICA8c2t5LWNoZWNrYm94XG4gICAgICAgICAgICAgIFsoY2hlY2tlZCldPVwib25seVNob3dTZWxlY3RlZFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlRGF0YVN0YXRlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c2t5LWNoZWNrYm94LWxhYmVsPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAnc2t5dXhfbG9va3VwX3Nob3dfbW9yZV9zaG93X3NlbGVjdGVkX29wdGlvbl90aXRsZSdcbiAgICAgICAgICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L3NreS1jaGVja2JveC1sYWJlbD5cbiAgICAgICAgICAgIDwvc2t5LWNoZWNrYm94PlxuICAgICAgICAgIDwvc2t5LXRvb2xiYXItdmlldy1hY3Rpb25zPlxuICAgICAgICA8L3NreS10b29sYmFyLXNlY3Rpb24+XG4gICAgICA8L3NreS10b29sYmFyPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiZGlzcGxheWVkSXRlbXMubGVuZ3RoID09PSAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWZvbnQtZGVlbXBoYXNpemVkIHNreS1sb29rdXAtc2hvdy1tb3JlLW5vLXJlc3VsdHNcIlxuICAgID5cbiAgICAgIHt7ICdza3l1eF9sb29rdXBfc2hvd19tb3JlX25vX3Jlc3VsdHMnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgPC9kaXY+XG4gICAgPHNreS1yZXBlYXRlciBjbGFzcz1cInNreS1sb29rdXAtc2hvdy1tb3JlLXJlcGVhdGVyXCIgZXhwYW5kTW9kZT1cIm5vbmVcIj5cbiAgICAgIDxza3ktcmVwZWF0ZXItaXRlbVxuICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkaXNwbGF5ZWRJdGVtc1wiXG4gICAgICAgIFtzZWxlY3RhYmxlXT1cImNvbnRleHQuc2VsZWN0TW9kZSA9PT0gJ211bHRpcGxlJ1wiXG4gICAgICAgIFsoaXNTZWxlY3RlZCldPVwiaXRlbS5zZWxlY3RlZFwiXG4gICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2soaXRlbSlcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaXRlbUNsaWNrKGl0ZW0pXCJcbiAgICAgICAgKGlzU2VsZWN0ZWRDaGFuZ2UpPVwib25JdGVtU2VsZWN0KCRldmVudCwgaXRlbSlcIlxuICAgICAgPlxuICAgICAgICA8c2t5LXJlcGVhdGVyLWl0ZW0tY29udGVudD5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBjb250ZXh0LnVzZXJDb25maWc/Lml0ZW1UZW1wbGF0ZVxuICAgICAgICAgICAgICAgID8gY29udGV4dC51c2VyQ29uZmlnPy5pdGVtVGVtcGxhdGVcbiAgICAgICAgICAgICAgICA6IGRlZmF1bHRJdGVtVGVtcGxhdGU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgaXRlbTogaXRlbS52YWx1ZSB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9za3ktcmVwZWF0ZXItaXRlbS1jb250ZW50PlxuICAgICAgPC9za3ktcmVwZWF0ZXItaXRlbT5cbiAgICA8L3NreS1yZXBlYXRlcj5cbiAgICA8c2t5LWluZmluaXRlLXNjcm9sbCBbZW5hYmxlZF09XCJpdGVtc0hhdmVNb3JlXCIgKHNjcm9sbEVuZCk9XCJhZGRJdGVtcygpXCI+XG4gICAgPC9za3ktaW5maW5pdGUtc2Nyb2xsPlxuICA8L3NreS1tb2RhbC1jb250ZW50PlxuICA8c2t5LW1vZGFsLWZvb3Rlcj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1wcmltYXJ5IHNreS1tYXJnaW4taW5saW5lLWNvbXBhY3Qgc2t5LWxvb2t1cC1zaG93LW1vcmUtbW9kYWwtc2F2ZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJtb2RhbEluc3RhbmNlLnNhdmUoc2VsZWN0ZWRJdGVtcylcIlxuICAgID5cbiAgICAgIHt7ICdza3l1eF9sb29rdXBfc2hvd19tb3JlX3NlbGVjdCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1saW5rIHNreS1sb29rdXAtc2hvdy1tb3JlLW1vZGFsLWNsb3NlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cIm1vZGFsSW5zdGFuY2UuY2xvc2UoKVwiXG4gICAgPlxuICAgICAge3sgJ3NreXV4X2xvb2t1cF9zaG93X21vcmVfY2FuY2VsJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgIDwvYnV0dG9uPlxuICA8L3NreS1tb2RhbC1mb290ZXI+XG48L3NreS1tb2RhbD5cblxuPG5nLXRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiICNkZWZhdWx0SXRlbVRlbXBsYXRlPlxuICB7eyBpdGVtW2NvbnRleHQuZGVzY3JpcHRvclByb3BlcnR5XSB9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGl0bGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZXh0LnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnXCI+XG4gICAge3sgJ3NreXV4X2xvb2t1cF9zaG93X21vcmVfbW9kYWxfdGl0bGVfc2luZ2xlJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRleHQuc2VsZWN0TW9kZSA9PT0gJ211bHRpcGxlJ1wiPlxuICAgIHt7ICdza3l1eF9sb29rdXBfc2hvd19tb3JlX21vZGFsX3RpdGxlX211bHRpcGxlJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=