@natec/mef-dev-ui-kit 0.0.1

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 (144) hide show
  1. package/README.md +24 -0
  2. package/esm2020/lib/markup-kit/card/card/card.component.mjs +37 -0
  3. package/esm2020/lib/markup-kit/card/card-long/card-long.component.mjs +46 -0
  4. package/esm2020/lib/markup-kit/card/card-long/cart-type-colors.enum.mjs +7 -0
  5. package/esm2020/lib/markup-kit/card/card-simple/card-simple.component.mjs +23 -0
  6. package/esm2020/lib/markup-kit/card/card.module.mjs +45 -0
  7. package/esm2020/lib/markup-kit/card/index.mjs +5 -0
  8. package/esm2020/lib/markup-kit/collapse/collapse/collapse.component.mjs +87 -0
  9. package/esm2020/lib/markup-kit/collapse/collapse-set/collapse-set.component.mjs +54 -0
  10. package/esm2020/lib/markup-kit/collapse/collapse.module.mjs +25 -0
  11. package/esm2020/lib/markup-kit/collapse/index.mjs +4 -0
  12. package/esm2020/lib/markup-kit/modals/fill/fill.component.mjs +52 -0
  13. package/esm2020/lib/markup-kit/modals/index.mjs +7 -0
  14. package/esm2020/lib/markup-kit/modals/markup-kit.module.mjs +49 -0
  15. package/esm2020/lib/markup-kit/modals/modal-size.enum.mjs +2 -0
  16. package/esm2020/lib/markup-kit/modals/right-filter/right-filter.component.mjs +28 -0
  17. package/esm2020/lib/markup-kit/modals/slide-right/slide-right.component.mjs +55 -0
  18. package/esm2020/lib/markup-kit/modals/slide-up/slide-up.component.mjs +55 -0
  19. package/esm2020/lib/markup-kit/page-layouts/central-page/central-page.component.mjs +25 -0
  20. package/esm2020/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.mjs +14 -0
  21. package/esm2020/lib/markup-kit/page-layouts/index.mjs +7 -0
  22. package/esm2020/lib/markup-kit/page-layouts/manage-page/manage-page.component.mjs +25 -0
  23. package/esm2020/lib/markup-kit/page-layouts/page-layouts.module.mjs +49 -0
  24. package/esm2020/lib/markup-kit/page-layouts/profile/profile.component.mjs +49 -0
  25. package/esm2020/lib/markup-kit/page-layouts/table-page/table-page.component.mjs +18 -0
  26. package/esm2020/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.mjs +40 -0
  27. package/esm2020/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.mjs +29 -0
  28. package/esm2020/lib/markup-kit/utils/filtered-field/filtered-field.module.mjs +31 -0
  29. package/esm2020/lib/markup-kit/utils/filtered-field/filtered-field.service.mjs +30 -0
  30. package/esm2020/lib/markup-kit/utils/filtered-field/filtred-item.model.mjs +9 -0
  31. package/esm2020/lib/markup-kit/utils/filtered-field/index.mjs +5 -0
  32. package/esm2020/lib/markup-kit/utils/help-block/help-block.component.mjs +44 -0
  33. package/esm2020/lib/markup-kit/utils/help-block/hepl-block.module.mjs +30 -0
  34. package/esm2020/lib/markup-kit/utils/help-block/index.mjs +3 -0
  35. package/esm2020/lib/markup-kit/utils/loader/index.mjs +5 -0
  36. package/esm2020/lib/markup-kit/utils/loader/loader/loader.component.mjs +27 -0
  37. package/esm2020/lib/markup-kit/utils/loader/loader.module.mjs +58 -0
  38. package/esm2020/lib/markup-kit/utils/loader/loader.service.mjs +50 -0
  39. package/esm2020/lib/markup-kit/utils/loader/request-event.enum.mjs +7 -0
  40. package/esm2020/lib/pg-components/card/card.components.mjs +253 -0
  41. package/esm2020/lib/pg-components/card/card.module.mjs +25 -0
  42. package/esm2020/lib/pg-components/card/index.mjs +3 -0
  43. package/esm2020/lib/pg-components/progress/index.mjs +4 -0
  44. package/esm2020/lib/pg-components/progress/progress.component.mjs +39 -0
  45. package/esm2020/lib/pg-components/progress/progress.config.mjs +14 -0
  46. package/esm2020/lib/pg-components/progress/progress.module.mjs +22 -0
  47. package/esm2020/lib/pg-components/select/index.mjs +5 -0
  48. package/esm2020/lib/pg-components/select/option.component.mjs +60 -0
  49. package/esm2020/lib/pg-components/select/option.pipe.mjs +42 -0
  50. package/esm2020/lib/pg-components/select/select.component.mjs +762 -0
  51. package/esm2020/lib/pg-components/select/select.module.mjs +22 -0
  52. package/esm2020/lib/pg-components/spec-flow-test/index.mjs +3 -0
  53. package/esm2020/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.mjs +24 -0
  54. package/esm2020/lib/pg-components/spec-flow-test/spec-flow-test.module.mjs +27 -0
  55. package/esm2020/lib/pg-components/switch/index.mjs +3 -0
  56. package/esm2020/lib/pg-components/switch/switch.component.mjs +130 -0
  57. package/esm2020/lib/pg-components/switch/switch.module.mjs +18 -0
  58. package/esm2020/lib/pg-components/tabs/index.mjs +8 -0
  59. package/esm2020/lib/pg-components/tabs/tab-body.component.mjs +22 -0
  60. package/esm2020/lib/pg-components/tabs/tab-label.directive.mjs +44 -0
  61. package/esm2020/lib/pg-components/tabs/tab.component.mjs +66 -0
  62. package/esm2020/lib/pg-components/tabs/tabs-ink-bar.directive.mjs +78 -0
  63. package/esm2020/lib/pg-components/tabs/tabs-nav.component.mjs +335 -0
  64. package/esm2020/lib/pg-components/tabs/tabs.module.mjs +24 -0
  65. package/esm2020/lib/pg-components/tabs/tabset.component.mjs +260 -0
  66. package/esm2020/lib/pg-components/util/convert.mjs +4 -0
  67. package/esm2020/lib/pg-components/util/request-animation.mjs +26 -0
  68. package/esm2020/mef-dev-ui-kit.mjs +5 -0
  69. package/esm2020/public-api.mjs +16 -0
  70. package/fesm2015/mef-dev-ui-kit.mjs +3190 -0
  71. package/fesm2015/mef-dev-ui-kit.mjs.map +1 -0
  72. package/fesm2020/mef-dev-ui-kit.mjs +3183 -0
  73. package/fesm2020/mef-dev-ui-kit.mjs.map +1 -0
  74. package/lib/markup-kit/card/card/card.component.d.ts +17 -0
  75. package/lib/markup-kit/card/card-long/card-long.component.d.ts +21 -0
  76. package/lib/markup-kit/card/card-long/cart-type-colors.enum.d.ts +5 -0
  77. package/lib/markup-kit/card/card-simple/card-simple.component.d.ts +10 -0
  78. package/lib/markup-kit/card/card.module.d.ts +18 -0
  79. package/lib/markup-kit/card/index.d.ts +4 -0
  80. package/lib/markup-kit/collapse/collapse/collapse.component.d.ts +19 -0
  81. package/lib/markup-kit/collapse/collapse-set/collapse-set.component.d.ts +18 -0
  82. package/lib/markup-kit/collapse/collapse.module.d.ts +14 -0
  83. package/lib/markup-kit/collapse/index.d.ts +3 -0
  84. package/lib/markup-kit/modals/fill/fill.component.d.ts +17 -0
  85. package/lib/markup-kit/modals/index.d.ts +6 -0
  86. package/lib/markup-kit/modals/markup-kit.module.d.ts +14 -0
  87. package/lib/markup-kit/modals/modal-size.enum.d.ts +5 -0
  88. package/lib/markup-kit/modals/right-filter/right-filter.component.d.ts +13 -0
  89. package/lib/markup-kit/modals/slide-right/slide-right.component.d.ts +19 -0
  90. package/lib/markup-kit/modals/slide-up/slide-up.component.d.ts +19 -0
  91. package/lib/markup-kit/page-layouts/central-page/central-page.component.d.ts +11 -0
  92. package/lib/markup-kit/page-layouts/central-page-row/central-page-row.component.d.ts +8 -0
  93. package/lib/markup-kit/page-layouts/index.d.ts +6 -0
  94. package/lib/markup-kit/page-layouts/manage-page/manage-page.component.d.ts +11 -0
  95. package/lib/markup-kit/page-layouts/page-layouts.module.d.ts +14 -0
  96. package/lib/markup-kit/page-layouts/profile/profile.component.d.ts +27 -0
  97. package/lib/markup-kit/page-layouts/table-page/table-page.component.d.ts +9 -0
  98. package/lib/markup-kit/utils/filtered-field/filtered-field-container/filtered-field-container.component.d.ts +14 -0
  99. package/lib/markup-kit/utils/filtered-field/filtered-field-item/filtered-field-item.component.d.ts +14 -0
  100. package/lib/markup-kit/utils/filtered-field/filtered-field.module.d.ts +9 -0
  101. package/lib/markup-kit/utils/filtered-field/filtered-field.service.d.ts +14 -0
  102. package/lib/markup-kit/utils/filtered-field/filtred-item.model.d.ts +7 -0
  103. package/lib/markup-kit/utils/filtered-field/index.d.ts +4 -0
  104. package/lib/markup-kit/utils/help-block/help-block.component.d.ts +10 -0
  105. package/lib/markup-kit/utils/help-block/hepl-block.module.d.ts +10 -0
  106. package/lib/markup-kit/utils/help-block/index.d.ts +2 -0
  107. package/lib/markup-kit/utils/loader/index.d.ts +4 -0
  108. package/lib/markup-kit/utils/loader/loader/loader.component.d.ts +12 -0
  109. package/lib/markup-kit/utils/loader/loader.module.d.ts +9 -0
  110. package/lib/markup-kit/utils/loader/loader.service.d.ts +15 -0
  111. package/lib/markup-kit/utils/loader/request-event.enum.d.ts +5 -0
  112. package/lib/pg-components/card/card.components.d.ts +60 -0
  113. package/lib/pg-components/card/card.module.d.ts +12 -0
  114. package/lib/pg-components/card/index.d.ts +2 -0
  115. package/lib/pg-components/progress/index.d.ts +3 -0
  116. package/lib/pg-components/progress/progress.component.d.ts +15 -0
  117. package/lib/pg-components/progress/progress.config.d.ts +7 -0
  118. package/lib/pg-components/progress/progress.module.d.ts +10 -0
  119. package/lib/pg-components/select/index.d.ts +4 -0
  120. package/lib/pg-components/select/option.component.d.ts +21 -0
  121. package/lib/pg-components/select/option.pipe.d.ts +8 -0
  122. package/lib/pg-components/select/select.component.d.ts +135 -0
  123. package/lib/pg-components/select/select.module.d.ts +12 -0
  124. package/lib/pg-components/spec-flow-test/index.d.ts +2 -0
  125. package/lib/pg-components/spec-flow-test/spec-flow-test/spec-flow-test.component.d.ts +22 -0
  126. package/lib/pg-components/spec-flow-test/spec-flow-test.module.d.ts +10 -0
  127. package/lib/pg-components/switch/index.d.ts +2 -0
  128. package/lib/pg-components/switch/switch.component.d.ts +29 -0
  129. package/lib/pg-components/switch/switch.module.d.ts +8 -0
  130. package/lib/pg-components/tabs/index.d.ts +7 -0
  131. package/lib/pg-components/tabs/tab-body.component.d.ts +7 -0
  132. package/lib/pg-components/tabs/tab-label.directive.d.ts +15 -0
  133. package/lib/pg-components/tabs/tab.component.d.ts +22 -0
  134. package/lib/pg-components/tabs/tabs-ink-bar.directive.d.ts +23 -0
  135. package/lib/pg-components/tabs/tabs-nav.component.d.ts +79 -0
  136. package/lib/pg-components/tabs/tabs.module.d.ts +14 -0
  137. package/lib/pg-components/tabs/tabset.component.d.ts +67 -0
  138. package/lib/pg-components/util/convert.d.ts +1 -0
  139. package/lib/pg-components/util/request-animation.d.ts +1 -0
  140. package/mef-dev-ui-kit.d.ts +5 -0
  141. package/package.json +44 -0
  142. package/public-api.d.ts +14 -0
  143. package/src/lib/styles/designe-colors.scss +68 -0
  144. package/src/lib/styles/fonts.scss +90 -0
@@ -0,0 +1,762 @@
1
+ /**
2
+ * complex but work well
3
+ * TODO: rebuild latter
4
+ */
5
+ import { DOWN_ARROW, ENTER, TAB } from "@angular/cdk/keycodes";
6
+ import { CdkConnectedOverlay } from "@angular/cdk/overlay";
7
+ import { forwardRef, Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation } from "@angular/core";
8
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
9
+ import { OptionPipe } from "./option.pipe";
10
+ import { toBoolean } from '../util/convert';
11
+ import { animate, state, style, transition, trigger } from "@angular/animations";
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/cdk/overlay";
14
+ import * as i2 from "@angular/common";
15
+ import * as i3 from "@angular/forms";
16
+ export class pgSelectComponent {
17
+ constructor(_elementRef, _renderer, cDRef) {
18
+ this._elementRef = _elementRef;
19
+ this._renderer = _renderer;
20
+ this.cDRef = cDRef;
21
+ this._allowClear = false;
22
+ this._disabled = false;
23
+ this._isTags = false;
24
+ this._isMultiple = false;
25
+ this._keepUnListOptions = false;
26
+ this._showSearch = false;
27
+ this._isOpen = false;
28
+ this._prefixCls = "pg-select";
29
+ this._classList = [];
30
+ this._dropDownPrefixCls = `${this._prefixCls}-dropdown`;
31
+ this._selectionPrefixCls = `${this._prefixCls}-selection`;
32
+ this._placeholder = "placeholder";
33
+ this._notFoundContent = "No Content";
34
+ this._searchText = "";
35
+ this._triggerWidth = 0;
36
+ this._selectedOptions = new Set();
37
+ this._options = [];
38
+ this._cacheOptions = [];
39
+ this._filterOptions = [];
40
+ this._tagsOptions = [];
41
+ this._isMultiInit = false;
42
+ this._dropDownPosition = "bottom";
43
+ this._composing = false;
44
+ // ngModel Access
45
+ this.onChange = () => null;
46
+ this.onTouched = () => null;
47
+ this.SearchChange = new EventEmitter();
48
+ this.change = new EventEmitter();
49
+ this.OpenChange = new EventEmitter();
50
+ this.ScrollToBottom = new EventEmitter();
51
+ this.Filter = true;
52
+ this.MaxMultiple = Infinity;
53
+ this.FirstDefault = false;
54
+ /** new -option insert or new tags insert */
55
+ // @ts-ignore
56
+ this.addOption = option => {
57
+ this._options.push(option);
58
+ if (!this._isTags) {
59
+ if (option.Value) {
60
+ this.updateSelectedOption(this._value);
61
+ }
62
+ else {
63
+ this.forceUpdateSelectedOption(this._value);
64
+ }
65
+ }
66
+ };
67
+ /** cancel select multiple option */ // @ts-ignore
68
+ this.unSelectMultipleOption = (option, $event, emitChange = true) => {
69
+ this._operatingMultipleOption = option;
70
+ this._selectedOptions.delete(option);
71
+ if (emitChange) {
72
+ this.emitMultipleOptions();
73
+ }
74
+ // 对Tag进行特殊处理
75
+ if (this._isTags &&
76
+ this._options.indexOf(option) !== -1 &&
77
+ this._tagsOptions.indexOf(option) !== -1) {
78
+ this.removeOption(option);
79
+ this._tagsOptions.splice(this._tagsOptions.indexOf(option), 1);
80
+ }
81
+ if ($event) {
82
+ $event.preventDefault();
83
+ $event.stopPropagation();
84
+ }
85
+ };
86
+ this._el = this._elementRef.nativeElement;
87
+ }
88
+ set AllowClear(value) {
89
+ this._allowClear = toBoolean(value);
90
+ }
91
+ get AllowClear() {
92
+ return this._allowClear;
93
+ }
94
+ set KeepUnListOptions(value) {
95
+ this._keepUnListOptions = toBoolean(value);
96
+ }
97
+ get KeepUnListOptions() {
98
+ return this._keepUnListOptions;
99
+ }
100
+ set Mode(value) {
101
+ this._mode = value;
102
+ if (this._mode === "multiple") {
103
+ this.Multiple = true;
104
+ }
105
+ else if (this._mode === "tags") {
106
+ this.Tags = true;
107
+ }
108
+ else if (this._mode === "combobox") {
109
+ this.ShowSearch = true;
110
+ }
111
+ }
112
+ set Multiple(value) {
113
+ this._isMultiple = toBoolean(value);
114
+ if (this._isMultiple) {
115
+ this.ShowSearch = true;
116
+ }
117
+ }
118
+ get Multiple() {
119
+ return this._isMultiple;
120
+ }
121
+ set PlaceHolder(value) {
122
+ this._placeholder = value;
123
+ }
124
+ get PlaceHolder() {
125
+ return this._placeholder;
126
+ }
127
+ set NotFoundContent(value) {
128
+ this._notFoundContent = value;
129
+ }
130
+ get NotFoundContent() {
131
+ return this._notFoundContent;
132
+ }
133
+ set Size(value) {
134
+ // @ts-ignore
135
+ this._size = { large: "lg", small: "sm" }[value];
136
+ this.setClassMap();
137
+ }
138
+ get Size() {
139
+ return this._size;
140
+ }
141
+ set ShowSearch(value) {
142
+ this._showSearch = toBoolean(value);
143
+ }
144
+ get ShowSearch() {
145
+ return this._showSearch;
146
+ }
147
+ set Tags(value) {
148
+ const isTags = toBoolean(value);
149
+ this._isTags = isTags;
150
+ this.Multiple = isTags;
151
+ }
152
+ get Tags() {
153
+ return this._isTags;
154
+ }
155
+ set Disabled(value) {
156
+ this._disabled = toBoolean(value);
157
+ this.closeDropDown();
158
+ this.setClassMap();
159
+ }
160
+ get Disabled() {
161
+ return this._disabled;
162
+ }
163
+ set Open(value) {
164
+ const isOpen = toBoolean(value);
165
+ if (this._isOpen === isOpen) {
166
+ return;
167
+ }
168
+ if (isOpen) {
169
+ this.scrollToActive();
170
+ this._setTriggerWidth();
171
+ }
172
+ this._isOpen = isOpen;
173
+ this.OpenChange.emit(this._isOpen);
174
+ this.setClassMap();
175
+ if (this._isOpen) {
176
+ setTimeout(() => {
177
+ this.checkDropDownScroll();
178
+ });
179
+ }
180
+ }
181
+ get Open() {
182
+ return this._isOpen;
183
+ }
184
+ /** -option remove or tags remove */
185
+ removeOption(option) {
186
+ this._options.splice(this._options.indexOf(option), 1);
187
+ if (!this._isTags) {
188
+ this.forceUpdateSelectedOption(this._value);
189
+ }
190
+ }
191
+ /** dropdown position changed */
192
+ onPositionChange(position) {
193
+ this._dropDownPosition = position.connectionPair.originY;
194
+ }
195
+ compositionStart() {
196
+ this._composing = true;
197
+ }
198
+ compositionEnd() {
199
+ this._composing = false;
200
+ }
201
+ /** clear single selected option */
202
+ clearSelect($event) {
203
+ if ($event) {
204
+ $event.preventDefault();
205
+ $event.stopPropagation();
206
+ } // @ts-ignore
207
+ this._selectedOption = null; // @ts-ignore
208
+ this.Value = null; // @ts-ignore
209
+ this.onChange(null);
210
+ }
211
+ /** click dropdown option by user */
212
+ clickOption(option, $event) {
213
+ if (!option) {
214
+ return;
215
+ }
216
+ this.chooseOption(option, true, $event);
217
+ this.clearSearchText();
218
+ if (!this._isMultiple) {
219
+ this.Open = false;
220
+ }
221
+ }
222
+ /** choose option */
223
+ chooseOption(option, isUserClick = false, $event) {
224
+ if ($event) {
225
+ $event.preventDefault();
226
+ $event.stopPropagation();
227
+ }
228
+ this._activeFilterOption = option;
229
+ if (option && !option.Disabled) {
230
+ if (!this.Multiple) {
231
+ this._selectedOption = option;
232
+ this._value = option.Value;
233
+ if (isUserClick) {
234
+ this.change.next(this._value);
235
+ this.onChange(option.Value);
236
+ }
237
+ }
238
+ else {
239
+ if (isUserClick) {
240
+ this.isInSet(this._selectedOptions, option)
241
+ ? this.unSelectMultipleOption(option)
242
+ : this.selectMultipleOption(option);
243
+ }
244
+ }
245
+ }
246
+ }
247
+ updateWidth(element, text) {
248
+ if (text) {
249
+ /** wait for scroll width change */ // @ts-ignore
250
+ setTimeout(_ => {
251
+ this._renderer.setStyle(element, "width", `${element.scrollWidth}px`);
252
+ });
253
+ }
254
+ else {
255
+ this._renderer.removeStyle(element, "width");
256
+ }
257
+ }
258
+ /** determine if option in set */
259
+ isInSet(set, option) {
260
+ return Array.from(set).find((data) => data.Value === option.Value);
261
+ }
262
+ /** select multiple option */
263
+ selectMultipleOption(option, $event) {
264
+ /** if tags do push to tag option */
265
+ if (this._isTags &&
266
+ this._options.indexOf(option) === -1 &&
267
+ this._tagsOptions.indexOf(option) === -1) {
268
+ this.addOption(option);
269
+ this._tagsOptions.push(option);
270
+ }
271
+ this._operatingMultipleOption = option;
272
+ if (this._selectedOptions.size < this.MaxMultiple) {
273
+ this._selectedOptions.add(option);
274
+ }
275
+ this.emitMultipleOptions();
276
+ if ($event) {
277
+ $event.preventDefault();
278
+ $event.stopPropagation();
279
+ }
280
+ }
281
+ /** emit multiple options */
282
+ emitMultipleOptions() {
283
+ if (this._isMultiInit) {
284
+ return;
285
+ }
286
+ const arrayOptions = Array.from(this._selectedOptions);
287
+ this._value = arrayOptions.map(item => item.Value);
288
+ this.onChange(this._value);
289
+ }
290
+ /** update selected option when add remove option etc */
291
+ updateSelectedOption(currentModelValue, triggerByNgModel = false) {
292
+ if (currentModelValue == null) {
293
+ return;
294
+ }
295
+ if (this.Multiple) {
296
+ const selectedOptions = this._options.filter(item => {
297
+ return item != null && currentModelValue.indexOf(item.Value) !== -1;
298
+ });
299
+ if ((this.KeepUnListOptions || this.Tags) && !triggerByNgModel) {
300
+ const _selectedOptions = Array.from(this._selectedOptions);
301
+ selectedOptions.forEach(option => {
302
+ const _exist = _selectedOptions.some(item => item._value === option._value);
303
+ if (!_exist) {
304
+ this._selectedOptions.add(option);
305
+ }
306
+ });
307
+ }
308
+ else {
309
+ this._selectedOptions = new Set();
310
+ selectedOptions.forEach(option => {
311
+ this._selectedOptions.add(option);
312
+ });
313
+ }
314
+ }
315
+ else {
316
+ const selectedOption = this._options.filter(item => {
317
+ return item != null && item.Value === currentModelValue;
318
+ });
319
+ this.chooseOption(selectedOption[0]);
320
+ }
321
+ }
322
+ forceUpdateSelectedOption(value) {
323
+ /** trigger dirty check */ // @ts-ignore
324
+ setTimeout(_ => {
325
+ this.updateSelectedOption(value);
326
+ });
327
+ }
328
+ get Value() {
329
+ return this._value;
330
+ }
331
+ set Value(value) {
332
+ this._updateValue(value);
333
+ }
334
+ clearAllSelectedOption(emitChange = true) {
335
+ this._selectedOptions.forEach(item => {
336
+ this.unSelectMultipleOption(item, null, emitChange);
337
+ });
338
+ }
339
+ handleKeyEnterEvent(event) {
340
+ /** when composing end */
341
+ if (!this._composing && this._isOpen) {
342
+ event.preventDefault();
343
+ event.stopPropagation();
344
+ this.updateFilterOption(false);
345
+ this.clickOption(this._activeFilterOption);
346
+ }
347
+ }
348
+ handleKeyBackspaceEvent(event) {
349
+ if (!this._searchText && !this._composing && this._isMultiple) {
350
+ event.preventDefault();
351
+ const lastOption = Array.from(this._selectedOptions).pop();
352
+ this.unSelectMultipleOption(lastOption);
353
+ }
354
+ }
355
+ handleKeyDownEvent($event) {
356
+ if (this._isOpen) {
357
+ $event.preventDefault();
358
+ $event.stopPropagation();
359
+ this._activeFilterOption = this.nextOption(this._activeFilterOption, this._filterOptions.filter(w => !w.Disabled));
360
+ this.scrollToActive();
361
+ }
362
+ }
363
+ handleKeyUpEvent($event) {
364
+ if (this._isOpen) {
365
+ $event.preventDefault();
366
+ $event.stopPropagation();
367
+ this._activeFilterOption = this.preOption(this._activeFilterOption, this._filterOptions.filter(w => !w.Disabled));
368
+ this.scrollToActive();
369
+ }
370
+ }
371
+ preOption(option, options) {
372
+ return options[options.indexOf(option) - 1] || options[options.length - 1];
373
+ }
374
+ nextOption(option, options) {
375
+ return options[options.indexOf(option) + 1] || options[0];
376
+ }
377
+ clearSearchText() {
378
+ this._searchText = "";
379
+ this.updateFilterOption();
380
+ }
381
+ updateFilterOption(updateActiveFilter = true) {
382
+ if (this.Filter) {
383
+ this._filterOptions = new OptionPipe().transform(this._options, {
384
+ searchText: this._searchText,
385
+ tags: this._isTags,
386
+ notFoundContent: this._isTags
387
+ ? this._searchText
388
+ : this._notFoundContent,
389
+ disabled: !this._isTags,
390
+ value: this._isTags ? this._searchText : "disabled"
391
+ });
392
+ }
393
+ else {
394
+ this._filterOptions = this._options;
395
+ }
396
+ /** TODO: cause pre & next key selection not work */
397
+ if (updateActiveFilter && !this._selectedOption) {
398
+ this._activeFilterOption = this._filterOptions[0];
399
+ }
400
+ }
401
+ onSearchChange(searchValue) {
402
+ this.SearchChange.emit(searchValue);
403
+ }
404
+ onClick(e) {
405
+ e.preventDefault();
406
+ if (!this._disabled) {
407
+ this.Open = !this.Open;
408
+ if (this.ShowSearch) {
409
+ /** wait for search display */ // @ts-ignore
410
+ setTimeout(_ => {
411
+ this.searchInputElementRef.nativeElement.focus();
412
+ });
413
+ }
414
+ }
415
+ }
416
+ onKeyDown(e) {
417
+ const keyCode = e.keyCode;
418
+ if (keyCode === TAB && this.Open) {
419
+ this.Open = false;
420
+ return;
421
+ }
422
+ if ((keyCode !== DOWN_ARROW && keyCode !== ENTER) || this.Open) {
423
+ return;
424
+ }
425
+ e.preventDefault();
426
+ if (!this._disabled) {
427
+ this.Open = true;
428
+ if (this.ShowSearch) {
429
+ /** wait for search display */ // @ts-ignore
430
+ setTimeout(_ => {
431
+ this.searchInputElementRef.nativeElement.focus();
432
+ });
433
+ }
434
+ }
435
+ }
436
+ closeDropDown() {
437
+ if (!this.Open) {
438
+ return;
439
+ }
440
+ this.onTouched();
441
+ if (this.Multiple) {
442
+ this._renderer.removeStyle(this.searchInputElementRef.nativeElement, "width");
443
+ }
444
+ this.clearSearchText();
445
+ this.Open = false;
446
+ }
447
+ setClassMap() {
448
+ this._classList.forEach(_className => {
449
+ this._renderer.removeClass(this._el, _className);
450
+ }); // @ts-ignore
451
+ this._classList = [
452
+ this._prefixCls,
453
+ this._mode === "combobox" && `${this._prefixCls}-combobox`,
454
+ !this._disabled && `${this._prefixCls}-enabled`,
455
+ this._disabled && `${this._prefixCls}-disabled`,
456
+ this._isOpen && `${this._prefixCls}-open`,
457
+ this._showSearch && `${this._prefixCls}-show-search`,
458
+ this._size && `${this._prefixCls}-${this._size}`
459
+ ].filter(item => {
460
+ return !!item;
461
+ });
462
+ this._classList.forEach(_className => {
463
+ this._renderer.addClass(this._el, _className);
464
+ });
465
+ this._selectionClassMap = {
466
+ [this._selectionPrefixCls]: true,
467
+ [`${this._selectionPrefixCls}--single`]: !this.Multiple,
468
+ [`${this._selectionPrefixCls}--multiple`]: this.Multiple
469
+ };
470
+ }
471
+ setDropDownClassMap() {
472
+ this._dropDownClassMap = {
473
+ [this._dropDownPrefixCls]: true,
474
+ ["component-select"]: this._mode === "combobox",
475
+ [`${this._dropDownPrefixCls}--single`]: !this.Multiple,
476
+ [`${this._dropDownPrefixCls}--multiple`]: this.Multiple,
477
+ [`${this._dropDownPrefixCls}-placement-bottomLeft`]: this._dropDownPosition === "bottom",
478
+ [`${this._dropDownPrefixCls}-placement-topLeft`]: this._dropDownPosition === "top"
479
+ };
480
+ }
481
+ scrollToActive() {
482
+ /** wait for dropdown display */ // @ts-ignore
483
+ setTimeout(_ => {
484
+ if (this._activeFilterOption && this._activeFilterOption.Value) {
485
+ const index = this._filterOptions.findIndex(option => option.Value === this._activeFilterOption.Value);
486
+ try {
487
+ const scrollPane = this.dropdownUl.nativeElement.children[index];
488
+ // TODO: scrollIntoViewIfNeeded is not a standard API, why doing so?
489
+ /* tslint:disable-next-line:no-any */
490
+ scrollPane.scrollIntoViewIfNeeded(false);
491
+ }
492
+ catch (e) { }
493
+ }
494
+ });
495
+ }
496
+ flushComponentState() {
497
+ this.updateFilterOption();
498
+ if (!this.Multiple) {
499
+ this.updateSelectedOption(this._value);
500
+ }
501
+ else {
502
+ if (this._value) {
503
+ this.updateSelectedOption(this._value);
504
+ }
505
+ }
506
+ }
507
+ _setTriggerWidth() {
508
+ this._triggerWidth = this._getTriggerRect().width;
509
+ /** should remove after after https://github.com/angular/material2/pull/8765 merged **/
510
+ if (this._cdkOverlay && this._cdkOverlay.overlayRef) {
511
+ this._cdkOverlay.overlayRef.updateSize({
512
+ width: this._triggerWidth
513
+ });
514
+ }
515
+ }
516
+ _getTriggerRect() {
517
+ return this.trigger.nativeElement.getBoundingClientRect();
518
+ }
519
+ writeValue(value) {
520
+ this._updateValue(value, false);
521
+ }
522
+ registerOnChange(fn) {
523
+ this.onChange = fn;
524
+ }
525
+ registerOnTouched(fn) {
526
+ this.onTouched = fn;
527
+ }
528
+ setDisabledState(isDisabled) {
529
+ this.Disabled = isDisabled;
530
+ }
531
+ dropDownScroll(ul) {
532
+ if (ul && ul.scrollHeight - ul.scrollTop === ul.clientHeight) {
533
+ this.ScrollToBottom.emit(true);
534
+ }
535
+ }
536
+ checkDropDownScroll() {
537
+ if (this.dropdownUl &&
538
+ this.dropdownUl.nativeElement.scrollHeight ===
539
+ this.dropdownUl.nativeElement.clientHeight) {
540
+ this.ScrollToBottom.emit(true);
541
+ }
542
+ }
543
+ ngAfterContentInit() {
544
+ if (this._value != null) {
545
+ this.flushComponentState();
546
+ }
547
+ }
548
+ ngOnInit() {
549
+ this.updateFilterOption();
550
+ this.setClassMap();
551
+ this.setDropDownClassMap();
552
+ }
553
+ ngAfterContentChecked() {
554
+ if (this._cacheOptions !== this._options) {
555
+ /** update filter option after every content check cycle */
556
+ this.updateFilterOption();
557
+ this._cacheOptions = this._options;
558
+ }
559
+ else {
560
+ this.updateFilterOption(false);
561
+ }
562
+ if (this.FirstDefault) {
563
+ if (!this._value && this._options) {
564
+ if (this._options[0] !== undefined && this._options[0].Value) {
565
+ this.chooseOption(this._options[0], false);
566
+ setTimeout(() => {
567
+ this.onChange(this._options[0].Value);
568
+ });
569
+ }
570
+ }
571
+ }
572
+ }
573
+ _updateValue(value, emitChange = true) {
574
+ if (this._value === value) {
575
+ return;
576
+ }
577
+ if (value == null && this.Multiple) {
578
+ this._value = [];
579
+ }
580
+ else {
581
+ this._value = value;
582
+ }
583
+ if (!this.Multiple) {
584
+ if (value == null) { // @ts-ignore
585
+ this._selectedOption = null;
586
+ }
587
+ else {
588
+ this.updateSelectedOption(value);
589
+ }
590
+ }
591
+ else {
592
+ if (value) {
593
+ if (value.length === 0) {
594
+ this.clearAllSelectedOption(emitChange);
595
+ }
596
+ else {
597
+ this.updateSelectedOption(value, true);
598
+ }
599
+ }
600
+ else if (value == null) {
601
+ this.clearAllSelectedOption(emitChange);
602
+ }
603
+ }
604
+ }
605
+ }
606
+ pgSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: pgSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
607
+ pgSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: pgSelectComponent, selector: "pg-select", inputs: { Filter: "Filter", MaxMultiple: "MaxMultiple", FirstDefault: "FirstDefault", AllowClear: "AllowClear", KeepUnListOptions: "KeepUnListOptions", Mode: "Mode", Multiple: "Multiple", PlaceHolder: "PlaceHolder", NotFoundContent: "NotFoundContent", Size: "Size", ShowSearch: "ShowSearch", Tags: "Tags", Disabled: "Disabled", Open: "Open" }, outputs: { SearchChange: "SearchChange", change: "change", OpenChange: "OpenChange", ScrollToBottom: "ScrollToBottom" }, host: { listeners: { "click": "onClick($event)", "keydown": "onKeyDown($event)" } }, providers: [
608
+ {
609
+ provide: NG_VALUE_ACCESSOR,
610
+ useExisting: forwardRef(() => pgSelectComponent),
611
+ multi: true
612
+ }
613
+ ], viewQueries: [{ propertyName: "searchInputElementRef", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "dropdownUl", first: true, predicate: ["dropdownUl"], descendants: true }, { propertyName: "_cdkOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true }], ngImport: i0, template: "<div tabindex=\"0\" #trigger cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" [ngClass]=\"_selectionClassMap\"\r\n (keydown.Enter)=\"handleKeyEnterEvent($event)\" (keydown.Backspace)=\"handleKeyBackspaceEvent($event)\"\r\n (keydown.ArrowUp)=\"handleKeyUpEvent($event)\" (keydown.ArrowDown)=\"handleKeyDownEvent($event)\">\r\n <div class=\"pg-select-selection__rendered\" *ngIf=\"!ShowSearch\">\r\n <div class=\"pg-select-selection__placeholder\">\r\n <ng-template [ngIf]=\"!_selectedOption\">\r\n {{ PlaceHolder }}\r\n </ng-template>\r\n </div>\r\n <div class=\"pg-select-selection-selected-value\">\r\n {{ _selectedOption?.Label }}\r\n </div>\r\n </div>\r\n <div class=\"pg-select-selection__rendered\" *ngIf=\"ShowSearch\">\r\n <div [hidden]=\"_searchText||(!Open&&_selectedOption)||_selectedOptions.size\"\r\n class=\"pg-select-selection__placeholder\">\r\n <ng-template [ngIf]=\"(!_composing)&&_selectedOption\">\r\n {{ _selectedOption.Label }}\r\n </ng-template>\r\n <ng-template [ngIf]=\"(!_composing)&&(!_selectedOption)\">\r\n {{ PlaceHolder }}\r\n </ng-template>\r\n </div>\r\n <ul *ngIf=\"Multiple\">\r\n <li *ngFor=\"let option of _selectedOptions\" [@tagAnimation] [attr.title]=\"option?.Label || option?.Value\"\r\n class=\"pg-select-selection__choice\" style=\"-webkit-user-select: none;\">\r\n <span class=\"pg-select-selection__choice__remove\" (click)=\"unSelectMultipleOption(option,$event)\"></span>\r\n <div class=\"pg-select-selection__choice__content\">{{ option?.Label }}</div>\r\n </li>\r\n <li class=\"pg-select-search pg-select-search--inline\">\r\n <div class=\"pg-select-search__field__wrap\">\r\n <input class=\"pg-select-search__field\" (compositionstart)=\"compositionStart()\"\r\n (compositionend)=\"compositionEnd();updateWidth(searchInput,_searchText);\" [(ngModel)]=\"_searchText\"\r\n (ngModelChange)=\"updateFilterOption();onSearchChange($event);\"\r\n (keydown)=\"updateWidth(searchInput,_searchText)\" (input)=\"updateWidth(searchInput,_searchText)\"\r\n (blur)=\"onTouched()\" #searchInput>\r\n <span class=\"pg-select-search__field__mirror\"></span></div>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"!Multiple\" class=\"pg-select-selection-selected-value\" [hidden]=\"!(_selectedOption?.Label)||Open\">\r\n {{ _selectedOption?.Label }}\r\n </div>\r\n <div *ngIf=\"!Multiple\" [hidden]=\"!Open\" class=\"pg-select-search pg-select-search--inline\">\r\n <div class=\"pg-select-search__field__wrap\">\r\n <input class=\"pg-select-search__field\" (blur)=\"onTouched()\" (compositionstart)=\"compositionStart()\"\r\n (compositionend)=\"compositionEnd()\" [(ngModel)]=\"_searchText\"\r\n (ngModelChange)=\"updateFilterOption();onSearchChange($event);\" #searchInput>\r\n <span class=\"pg-select-search__field__mirror\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <span (click)=\"onTouched();clearSelect($event)\" class=\"pg-select-selection__clear\" style=\"-webkit-user-select: none;\"\r\n *ngIf=\"_selectedOption?.Label&&AllowClear&&!Multiple\">\r\n </span>\r\n <span class=\"pg-select-arrow\"><b></b></span>\r\n</div>\r\n<ng-template cdkConnectedOverlay cdkConnectedOverlayHasBackdrop [cdkConnectedOverlayOrigin]=\"origin\"\r\n (backdropClick)=\"closeDropDown()\" (detach)=\"closeDropDown();\" (positionChange)=\"onPositionChange($event)\"\r\n [cdkConnectedOverlayWidth]=\"_triggerWidth\" [cdkConnectedOverlayOpen]=\"_isOpen\">\r\n <div [ngClass]=\"_dropDownClassMap\" [@dropDownAnimation]=\"_dropDownPosition\">\r\n <div style=\"overflow: auto;\">\r\n <ul class=\"pg-select-dropdown-menu pg-select-dropdown-menu-vertical pg-select-dropdown-menu-root\" #dropdownUl\r\n (scroll)=\"dropDownScroll(dropdownUl)\">\r\n <li *ngFor=\"let option of _filterOptions\" [class.pg-select-dropdown-menu-item-disabled]=\"option.Disabled\"\r\n [class.pg-select-dropdown-menu-item-active]=\"option.Value == _activeFilterOption?.Value\"\r\n [class.pg-select-dropdown-menu-item-selected]=\"(option.Value==(_selectedOption?.Value))||(isInSet(_selectedOptions,option))\"\r\n class=\"pg-select-dropdown-menu-item\" (click)=\"clickOption(option,$event)\">\r\n <ng-template *ngIf=\"option.OptionTemplate\" [ngTemplateOutlet]=\"option.OptionTemplate\">\r\n </ng-template>\r\n <ng-template [ngIf]=\"!option.OptionTemplate\">\r\n {{ option.Label }}\r\n </ng-template>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n</ng-template>", directives: [{ type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], animations: [trigger('dropDownAnimation', [
614
+ state('bottom', style({
615
+ opacity: 1,
616
+ transform: 'scaleY(1)',
617
+ transformOrigin: '0% 0%'
618
+ })),
619
+ transition('void => bottom', [
620
+ style({
621
+ opacity: 0,
622
+ transform: 'scaleY(0)',
623
+ transformOrigin: '0% 0%'
624
+ }),
625
+ animate('150ms cubic-bezier(0.25, 0.8, 0.25, 1)')
626
+ ]),
627
+ state('top', style({
628
+ opacity: 1,
629
+ transform: 'scaleY(1)',
630
+ transformOrigin: '0% 100%'
631
+ })),
632
+ transition('void => top', [
633
+ style({
634
+ opacity: 0,
635
+ transform: 'scaleY(0)',
636
+ transformOrigin: '0% 100%'
637
+ }),
638
+ animate('150ms cubic-bezier(0.25, 0.8, 0.25, 1)')
639
+ ]),
640
+ transition('* => void', [
641
+ animate('250ms 100ms linear', style({ opacity: 0 }))
642
+ ])
643
+ ]),
644
+ trigger('tagAnimation', [
645
+ state('*', style({ opacity: 1, transform: 'scale(1)' })),
646
+ transition('void => *', [
647
+ style({ opacity: 0, transform: 'scale(0)' }),
648
+ animate('150ms linear')
649
+ ]),
650
+ state('void', style({ opacity: 0, transform: 'scale(0)' })),
651
+ transition('* => void', [
652
+ style({ opacity: 1, transform: 'scale(1)' }),
653
+ animate('150ms linear')
654
+ ])
655
+ ])], encapsulation: i0.ViewEncapsulation.None });
656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: pgSelectComponent, decorators: [{
657
+ type: Component,
658
+ args: [{ selector: "pg-select", encapsulation: ViewEncapsulation.None, providers: [
659
+ {
660
+ provide: NG_VALUE_ACCESSOR,
661
+ useExisting: forwardRef(() => pgSelectComponent),
662
+ multi: true
663
+ }
664
+ ], animations: [trigger('dropDownAnimation', [
665
+ state('bottom', style({
666
+ opacity: 1,
667
+ transform: 'scaleY(1)',
668
+ transformOrigin: '0% 0%'
669
+ })),
670
+ transition('void => bottom', [
671
+ style({
672
+ opacity: 0,
673
+ transform: 'scaleY(0)',
674
+ transformOrigin: '0% 0%'
675
+ }),
676
+ animate('150ms cubic-bezier(0.25, 0.8, 0.25, 1)')
677
+ ]),
678
+ state('top', style({
679
+ opacity: 1,
680
+ transform: 'scaleY(1)',
681
+ transformOrigin: '0% 100%'
682
+ })),
683
+ transition('void => top', [
684
+ style({
685
+ opacity: 0,
686
+ transform: 'scaleY(0)',
687
+ transformOrigin: '0% 100%'
688
+ }),
689
+ animate('150ms cubic-bezier(0.25, 0.8, 0.25, 1)')
690
+ ]),
691
+ transition('* => void', [
692
+ animate('250ms 100ms linear', style({ opacity: 0 }))
693
+ ])
694
+ ]),
695
+ trigger('tagAnimation', [
696
+ state('*', style({ opacity: 1, transform: 'scale(1)' })),
697
+ transition('void => *', [
698
+ style({ opacity: 0, transform: 'scale(0)' }),
699
+ animate('150ms linear')
700
+ ]),
701
+ state('void', style({ opacity: 0, transform: 'scale(0)' })),
702
+ transition('* => void', [
703
+ style({ opacity: 1, transform: 'scale(1)' }),
704
+ animate('150ms linear')
705
+ ])
706
+ ])], template: "<div tabindex=\"0\" #trigger cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" [ngClass]=\"_selectionClassMap\"\r\n (keydown.Enter)=\"handleKeyEnterEvent($event)\" (keydown.Backspace)=\"handleKeyBackspaceEvent($event)\"\r\n (keydown.ArrowUp)=\"handleKeyUpEvent($event)\" (keydown.ArrowDown)=\"handleKeyDownEvent($event)\">\r\n <div class=\"pg-select-selection__rendered\" *ngIf=\"!ShowSearch\">\r\n <div class=\"pg-select-selection__placeholder\">\r\n <ng-template [ngIf]=\"!_selectedOption\">\r\n {{ PlaceHolder }}\r\n </ng-template>\r\n </div>\r\n <div class=\"pg-select-selection-selected-value\">\r\n {{ _selectedOption?.Label }}\r\n </div>\r\n </div>\r\n <div class=\"pg-select-selection__rendered\" *ngIf=\"ShowSearch\">\r\n <div [hidden]=\"_searchText||(!Open&&_selectedOption)||_selectedOptions.size\"\r\n class=\"pg-select-selection__placeholder\">\r\n <ng-template [ngIf]=\"(!_composing)&&_selectedOption\">\r\n {{ _selectedOption.Label }}\r\n </ng-template>\r\n <ng-template [ngIf]=\"(!_composing)&&(!_selectedOption)\">\r\n {{ PlaceHolder }}\r\n </ng-template>\r\n </div>\r\n <ul *ngIf=\"Multiple\">\r\n <li *ngFor=\"let option of _selectedOptions\" [@tagAnimation] [attr.title]=\"option?.Label || option?.Value\"\r\n class=\"pg-select-selection__choice\" style=\"-webkit-user-select: none;\">\r\n <span class=\"pg-select-selection__choice__remove\" (click)=\"unSelectMultipleOption(option,$event)\"></span>\r\n <div class=\"pg-select-selection__choice__content\">{{ option?.Label }}</div>\r\n </li>\r\n <li class=\"pg-select-search pg-select-search--inline\">\r\n <div class=\"pg-select-search__field__wrap\">\r\n <input class=\"pg-select-search__field\" (compositionstart)=\"compositionStart()\"\r\n (compositionend)=\"compositionEnd();updateWidth(searchInput,_searchText);\" [(ngModel)]=\"_searchText\"\r\n (ngModelChange)=\"updateFilterOption();onSearchChange($event);\"\r\n (keydown)=\"updateWidth(searchInput,_searchText)\" (input)=\"updateWidth(searchInput,_searchText)\"\r\n (blur)=\"onTouched()\" #searchInput>\r\n <span class=\"pg-select-search__field__mirror\"></span></div>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"!Multiple\" class=\"pg-select-selection-selected-value\" [hidden]=\"!(_selectedOption?.Label)||Open\">\r\n {{ _selectedOption?.Label }}\r\n </div>\r\n <div *ngIf=\"!Multiple\" [hidden]=\"!Open\" class=\"pg-select-search pg-select-search--inline\">\r\n <div class=\"pg-select-search__field__wrap\">\r\n <input class=\"pg-select-search__field\" (blur)=\"onTouched()\" (compositionstart)=\"compositionStart()\"\r\n (compositionend)=\"compositionEnd()\" [(ngModel)]=\"_searchText\"\r\n (ngModelChange)=\"updateFilterOption();onSearchChange($event);\" #searchInput>\r\n <span class=\"pg-select-search__field__mirror\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <span (click)=\"onTouched();clearSelect($event)\" class=\"pg-select-selection__clear\" style=\"-webkit-user-select: none;\"\r\n *ngIf=\"_selectedOption?.Label&&AllowClear&&!Multiple\">\r\n </span>\r\n <span class=\"pg-select-arrow\"><b></b></span>\r\n</div>\r\n<ng-template cdkConnectedOverlay cdkConnectedOverlayHasBackdrop [cdkConnectedOverlayOrigin]=\"origin\"\r\n (backdropClick)=\"closeDropDown()\" (detach)=\"closeDropDown();\" (positionChange)=\"onPositionChange($event)\"\r\n [cdkConnectedOverlayWidth]=\"_triggerWidth\" [cdkConnectedOverlayOpen]=\"_isOpen\">\r\n <div [ngClass]=\"_dropDownClassMap\" [@dropDownAnimation]=\"_dropDownPosition\">\r\n <div style=\"overflow: auto;\">\r\n <ul class=\"pg-select-dropdown-menu pg-select-dropdown-menu-vertical pg-select-dropdown-menu-root\" #dropdownUl\r\n (scroll)=\"dropDownScroll(dropdownUl)\">\r\n <li *ngFor=\"let option of _filterOptions\" [class.pg-select-dropdown-menu-item-disabled]=\"option.Disabled\"\r\n [class.pg-select-dropdown-menu-item-active]=\"option.Value == _activeFilterOption?.Value\"\r\n [class.pg-select-dropdown-menu-item-selected]=\"(option.Value==(_selectedOption?.Value))||(isInSet(_selectedOptions,option))\"\r\n class=\"pg-select-dropdown-menu-item\" (click)=\"clickOption(option,$event)\">\r\n <ng-template *ngIf=\"option.OptionTemplate\" [ngTemplateOutlet]=\"option.OptionTemplate\">\r\n </ng-template>\r\n <ng-template [ngIf]=\"!option.OptionTemplate\">\r\n {{ option.Label }}\r\n </ng-template>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n</ng-template>" }]
707
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { searchInputElementRef: [{
708
+ type: ViewChild,
709
+ args: ["searchInput"]
710
+ }], trigger: [{
711
+ type: ViewChild,
712
+ args: ["trigger"]
713
+ }], dropdownUl: [{
714
+ type: ViewChild,
715
+ args: ["dropdownUl"]
716
+ }], SearchChange: [{
717
+ type: Output
718
+ }], change: [{
719
+ type: Output
720
+ }], OpenChange: [{
721
+ type: Output
722
+ }], ScrollToBottom: [{
723
+ type: Output
724
+ }], Filter: [{
725
+ type: Input
726
+ }], MaxMultiple: [{
727
+ type: Input
728
+ }], FirstDefault: [{
729
+ type: Input
730
+ }], _cdkOverlay: [{
731
+ type: ViewChild,
732
+ args: [CdkConnectedOverlay]
733
+ }], AllowClear: [{
734
+ type: Input
735
+ }], KeepUnListOptions: [{
736
+ type: Input
737
+ }], Mode: [{
738
+ type: Input
739
+ }], Multiple: [{
740
+ type: Input
741
+ }], PlaceHolder: [{
742
+ type: Input
743
+ }], NotFoundContent: [{
744
+ type: Input
745
+ }], Size: [{
746
+ type: Input
747
+ }], ShowSearch: [{
748
+ type: Input
749
+ }], Tags: [{
750
+ type: Input
751
+ }], Disabled: [{
752
+ type: Input
753
+ }], Open: [{
754
+ type: Input
755
+ }], onClick: [{
756
+ type: HostListener,
757
+ args: ["click", ["$event"]]
758
+ }], onKeyDown: [{
759
+ type: HostListener,
760
+ args: ["keydown", ["$event"]]
761
+ }] } });
762
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZi1kZXYtdWktdG9vbC1raXQvc3JjL2xpYi9wZy1jb21wb25lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVmLWRldi11aS10b29sLWtpdC9zcmMvbGliL3BnLWNvbXBvbmVudHMvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsbUJBQW1CLEVBRXBCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLFVBQVUsRUFHVixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsRUFFbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7O0FBeURqRixNQUFNLE9BQU8saUJBQWlCO0lBMG9CNUIsWUFDVSxXQUF1QixFQUN2QixTQUFvQixFQUNwQixLQUF3QjtRQUZ4QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBdm9CMUIsZ0JB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ZW50IjpbIi8qKlxyXG4gKiBjb21wbGV4IGJ1dCB3b3JrIHdlbGxcclxuICogVE9ETzogcmVidWlsZCBsYXR0ZXJcclxuICovXHJcbmltcG9ydCB7IERPV05fQVJST1csIEVOVEVSLCBUQUIgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2tleWNvZGVzXCI7XHJcbmltcG9ydCB7XHJcbiAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcclxuICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2VcclxufSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcclxuaW1wb3J0IHtcclxuICBmb3J3YXJkUmVmLFxyXG4gIEFmdGVyQ29udGVudENoZWNrZWQsXHJcbiAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBDaGFuZ2VEZXRlY3RvclJlZlxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBwZ09wdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuL29wdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgT3B0aW9uUGlwZSB9IGZyb20gXCIuL29wdGlvbi5waXBlXCI7XHJcbmltcG9ydCB7IHRvQm9vbGVhbiB9IGZyb20gJy4uL3V0aWwvY29udmVydCc7XHJcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gXCJAYW5ndWxhci9hbmltYXRpb25zXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJwZy1zZWxlY3RcIixcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gcGdTZWxlY3RDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF0sXHJcbiAgYW5pbWF0aW9uczogW3RyaWdnZXIoJ2Ryb3BEb3duQW5pbWF0aW9uJywgW1xyXG4gICAgc3RhdGUoJ2JvdHRvbScsIHN0eWxlKHtcclxuICAgICAgb3BhY2l0eSAgICAgICAgOiAxLFxyXG4gICAgICB0cmFuc2Zvcm0gICAgICA6ICdzY2FsZVkoMSknLFxyXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJSdcclxuICAgIH0pKSxcclxuICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gYm90dG9tJywgW1xyXG4gICAgICBzdHlsZSh7XHJcbiAgICAgICAgb3BhY2l0eSAgICAgICAgOiAwLFxyXG4gICAgICAgIHRyYW5zZm9ybSAgICAgIDogJ3NjYWxlWSgwKScsXHJcbiAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnXHJcbiAgICAgIH0pLFxyXG4gICAgICBhbmltYXRlKCcxNTBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKScpXHJcbiAgICBdKSxcclxuICAgIHN0YXRlKCd0b3AnLCBzdHlsZSh7XHJcbiAgICAgIG9wYWNpdHkgICAgICAgIDogMSxcclxuICAgICAgdHJhbnNmb3JtICAgICAgOiAnc2NhbGVZKDEpJyxcclxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJSdcclxuICAgIH0pKSxcclxuICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gdG9wJywgW1xyXG4gICAgICBzdHlsZSh7XHJcbiAgICAgICAgb3BhY2l0eSAgICAgICAgOiAwLFxyXG4gICAgICAgIHRyYW5zZm9ybSAgICAgIDogJ3NjYWxlWSgwKScsXHJcbiAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJSdcclxuICAgICAgfSksXHJcbiAgICAgIGFuaW1hdGUoJzE1MG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpJylcclxuICAgIF0pLFxyXG4gICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW1xyXG4gICAgICBhbmltYXRlKCcyNTBtcyAxMDBtcyBsaW5lYXInLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpXHJcbiAgICBdKVxyXG4gIF0pLFxyXG4gIFxyXG4gIHRyaWdnZXIoJ3RhZ0FuaW1hdGlvbicsIFtcclxuICAgIHN0YXRlKCcqJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICdzY2FsZSgxKScgfSkpLFxyXG4gICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW1xyXG4gICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDApJyB9KSxcclxuICAgICAgYW5pbWF0ZSgnMTUwbXMgbGluZWFyJylcclxuICAgIF0pLFxyXG4gICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDApJyB9KSksXHJcbiAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbXHJcbiAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pLFxyXG4gICAgICBhbmltYXRlKCcxNTBtcyBsaW5lYXInKVxyXG4gICAgXSldKV0sXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9zZWxlY3QuY29tcG9uZW50Lmh0bWxcIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgcGdTZWxlY3RDb21wb25lbnRcclxuICBpbXBsZW1lbnRzXHJcbiAgICBPbkluaXQsXHJcbiAgICBBZnRlckNvbnRlbnRJbml0LFxyXG4gICAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcclxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwcml2YXRlIF9hbGxvd0NsZWFyID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1RhZ3MgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc011bHRpcGxlID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfa2VlcFVuTGlzdE9wdGlvbnMgPSBmYWxzZTtcclxuICBwcml2YXRlIF9zaG93U2VhcmNoID0gZmFsc2U7XHJcbiAgX2VsOiBIVE1MRWxlbWVudDtcclxuICBfaXNPcGVuID0gZmFsc2U7XHJcbiAgX3ByZWZpeENscyA9IFwicGctc2VsZWN0XCI7XHJcbiAgX2NsYXNzTGlzdDogc3RyaW5nW10gPSBbXTtcclxuICBfZHJvcERvd25DbGFzc01hcDogYW55O1xyXG4gIF9kcm9wRG93blByZWZpeENscyA9IGAke3RoaXMuX3ByZWZpeENsc30tZHJvcGRvd25gO1xyXG4gIF9zZWxlY3Rpb25DbGFzc01hcDogYW55O1xyXG4gIF9zZWxlY3Rpb25QcmVmaXhDbHMgPSBgJHt0aGlzLl9wcmVmaXhDbHN9LXNlbGVjdGlvbmA7XHJcbiAgX3NpemU6IHN0cmluZztcclxuICBfdmFsdWU6IHN0cmluZ1tdIHwgc3RyaW5nO1xyXG4gIF9wbGFjZWhvbGRlciA9IFwicGxhY2Vob2xkZXJcIjtcclxuICBfbm90Rm91bmRDb250ZW50ID0gXCJObyBDb250ZW50XCI7XHJcbiAgX3NlYXJjaFRleHQgPSBcIlwiO1xyXG4gIF90cmlnZ2VyV2lkdGggPSAwO1xyXG4gIF9zZWxlY3RlZE9wdGlvbjogcGdPcHRpb25Db21wb25lbnQ7XHJcbiAgX29wZXJhdGluZ011bHRpcGxlT3B0aW9uOiBwZ09wdGlvbkNvbXBvbmVudDtcclxuICBfc2VsZWN0ZWRPcHRpb25zOiBTZXQ8cGdPcHRpb25Db21wb25lbnQ+ID0gbmV3IFNldCgpO1xyXG4gIF9vcHRpb25zOiBwZ09wdGlvbkNvbXBvbmVudFtdID0gW107XHJcbiAgX2NhY2hlT3B0aW9uczogcGdPcHRpb25Db21wb25lbnRbXSA9IFtdO1xyXG4gIF9maWx0ZXJPcHRpb25zOiBwZ09wdGlvbkNvbXBvbmVudFtdID0gW107XHJcbiAgX3RhZ3NPcHRpb25zOiBwZ09wdGlvbkNvbXBvbmVudFtdID0gW107XHJcbiAgX2FjdGl2ZUZpbHRlck9wdGlvbjogcGdPcHRpb25Db21wb25lbnQ7XHJcbiAgX2lzTXVsdGlJbml0ID0gZmFsc2U7XHJcbiAgX2Ryb3BEb3duUG9zaXRpb246IFwidG9wXCIgfCBcImNlbnRlclwiIHwgXCJib3R0b21cIiA9IFwiYm90dG9tXCI7XHJcbiAgX2NvbXBvc2luZyA9IGZhbHNlO1xyXG4gIF9tb2RlOiBhbnk7XHJcbiAgLy8gbmdNb2RlbCBBY2Nlc3NcclxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4gdm9pZCA9ICgpID0+IG51bGw7XHJcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcclxuICBAVmlld0NoaWxkKFwic2VhcmNoSW5wdXRcIikgc2VhcmNoSW5wdXRFbGVtZW50UmVmOiBhbnk7XHJcbiAgQFZpZXdDaGlsZChcInRyaWdnZXJcIikgdHJpZ2dlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKFwiZHJvcGRvd25VbFwiKSBkcm9wZG93blVsOiBFbGVtZW50UmVmO1xyXG4gIEBPdXRwdXQoKSBTZWFyY2hDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBPcGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIFNjcm9sbFRvQm90dG9tOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQElucHV0KCkgRmlsdGVyID0gdHJ1ZTtcclxuICBASW5wdXQoKSBNYXhNdWx0aXBsZSA9IEluZmluaXR5O1xyXG4gIEBJbnB1dCgpIEZpcnN0RGVmYXVsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoQ2RrQ29ubmVjdGVkT3ZlcmxheSkgX2Nka092ZXJsYXk6IENka0Nvbm5lY3RlZE92ZXJsYXk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IEFsbG93Q2xlYXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FsbG93Q2xlYXIgPSB0b0Jvb2xlYW4odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IEFsbG93Q2xlYXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDbGVhcjtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IEtlZXBVbkxpc3RPcHRpb25zKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9rZWVwVW5MaXN0T3B0aW9ucyA9IHRvQm9vbGVhbih2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgS2VlcFVuTGlzdE9wdGlvbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fa2VlcFVuTGlzdE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBNb2RlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX21vZGUgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLl9tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcclxuICAgICAgdGhpcy5NdWx0aXBsZSA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21vZGUgPT09IFwidGFnc1wiKSB7XHJcbiAgICAgIHRoaXMuVGFncyA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21vZGUgPT09IFwiY29tYm9ib3hcIikge1xyXG4gICAgICB0aGlzLlNob3dTZWFyY2ggPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgTXVsdGlwbGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzTXVsdGlwbGUgPSB0b0Jvb2xlYW4odmFsdWUpO1xyXG4gICAgaWYgKHRoaXMuX2lzTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5TaG93U2VhcmNoID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBNdWx0aXBsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc011bHRpcGxlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgUGxhY2VIb2xkZXIodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBQbGFjZUhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgTm90Rm91bmRDb250ZW50KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX25vdEZvdW5kQ29udGVudCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IE5vdEZvdW5kQ29udGVudCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX25vdEZvdW5kQ29udGVudDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IFNpemUodmFsdWU6IHN0cmluZykge1xyXG4gICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIHRoaXMuX3NpemUgPSB7IGxhcmdlOiBcImxnXCIsIHNtYWxsOiBcInNtXCIgfVt2YWx1ZV07XHJcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgU2l6ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBTaG93U2VhcmNoKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93U2VhcmNoID0gdG9Cb29sZWFuKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBTaG93U2VhcmNoKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3dTZWFyY2g7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBUYWdzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBpc1RhZ3MgPSB0b0Jvb2xlYW4odmFsdWUpO1xyXG4gICAgdGhpcy5faXNUYWdzID0gaXNUYWdzO1xyXG4gICAgdGhpcy5NdWx0aXBsZSA9IGlzVGFncztcclxuICB9XHJcblxyXG4gIGdldCBUYWdzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzVGFncztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IERpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHRvQm9vbGVhbih2YWx1ZSk7XHJcbiAgICB0aGlzLmNsb3NlRHJvcERvd24oKTtcclxuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcclxuICB9XHJcblxyXG4gIGdldCBEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IE9wZW4odmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGlzT3BlbiA9IHRvQm9vbGVhbih2YWx1ZSk7XHJcbiAgICBpZiAodGhpcy5faXNPcGVuID09PSBpc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzT3Blbikge1xyXG4gICAgICB0aGlzLnNjcm9sbFRvQWN0aXZlKCk7XHJcbiAgICAgIHRoaXMuX3NldFRyaWdnZXJXaWR0aCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNPcGVuID0gaXNPcGVuO1xyXG4gICAgdGhpcy5PcGVuQ2hhbmdlLmVtaXQodGhpcy5faXNPcGVuKTtcclxuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcclxuICAgIGlmICh0aGlzLl9pc09wZW4pIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Ryb3BEb3duU2Nyb2xsKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IE9wZW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xyXG4gIH1cclxuXHJcbiAgLyoqIG5ldyAtb3B0aW9uIGluc2VydCBvciBuZXcgdGFncyBpbnNlcnQgKi9cclxuICAgLy8gQHRzLWlnbm9yZVxyXG4gIGFkZE9wdGlvbiA9IG9wdGlvbiA9PiB7XHJcbiAgICB0aGlzLl9vcHRpb25zLnB1c2gob3B0aW9uKTtcclxuICAgIGlmICghdGhpcy5faXNUYWdzKSB7XHJcbiAgICAgIGlmIChvcHRpb24uVmFsdWUpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkT3B0aW9uKHRoaXMuX3ZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlU2VsZWN0ZWRPcHRpb24odGhpcy5fdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLyoqIC1vcHRpb24gcmVtb3ZlIG9yIHRhZ3MgcmVtb3ZlICovXHJcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbjogcGdPcHRpb25Db21wb25lbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX29wdGlvbnMuc3BsaWNlKHRoaXMuX29wdGlvbnMuaW5kZXhPZihvcHRpb24pLCAxKTtcclxuICAgIGlmICghdGhpcy5faXNUYWdzKSB7XHJcbiAgICAgIHRoaXMuZm9yY2VVcGRhdGVTZWxlY3RlZE9wdGlvbih0aGlzLl92YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogZHJvcGRvd24gcG9zaXRpb24gY2hhbmdlZCAqL1xyXG4gIG9uUG9zaXRpb25DaGFuZ2UocG9zaXRpb246IENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fZHJvcERvd25Qb3NpdGlvbiA9IHBvc2l0aW9uLmNvbm5lY3Rpb25QYWlyLm9yaWdpblk7XHJcbiAgfVxyXG5cclxuICBjb21wb3NpdGlvblN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcG9zaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNvbXBvc2l0aW9uRW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY29tcG9zaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogY2xlYXIgc2luZ2xlIHNlbGVjdGVkIG9wdGlvbiAqL1xyXG4gIGNsZWFyU2VsZWN0KCRldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICgkZXZlbnQpIHtcclxuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH0gLy8gQHRzLWlnbm9yZVxyXG4gICAgdGhpcy5fc2VsZWN0ZWRPcHRpb24gPSBudWxsOyAvLyBAdHMtaWdub3JlXHJcbiAgICB0aGlzLlZhbHVlID0gbnVsbDsgLy8gQHRzLWlnbm9yZVxyXG4gICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKiBjbGljayBkcm9wZG93biBvcHRpb24gYnkgdXNlciAqL1xyXG4gIGNsaWNrT3B0aW9uKG9wdGlvbjogcGdPcHRpb25Db21wb25lbnQsICRldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghb3B0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY2hvb3NlT3B0aW9uKG9wdGlvbiwgdHJ1ZSwgJGV2ZW50KTtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XHJcbiAgICBpZiAoIXRoaXMuX2lzTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5PcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogY2hvb3NlIG9wdGlvbiAqL1xyXG4gIGNob29zZU9wdGlvbihcclxuICAgIG9wdGlvbjogcGdPcHRpb25Db21wb25lbnQsXHJcbiAgICBpc1VzZXJDbGljazogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgJGV2ZW50PzogTW91c2VFdmVudFxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCRldmVudCkge1xyXG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVyT3B0aW9uID0gb3B0aW9uO1xyXG4gICAgaWYgKG9wdGlvbiAmJiAhb3B0aW9uLkRpc2FibGVkKSB7XHJcbiAgICAgIGlmICghdGhpcy5NdWx0aXBsZSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9uID0gb3B0aW9uO1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9uLlZhbHVlO1xyXG4gICAgICAgIGlmIChpc1VzZXJDbGljaykge1xyXG4gICAgICAgICAgdGhpcy5jaGFuZ2UubmV4dCh0aGlzLl92YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG9wdGlvbi5WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChpc1VzZXJDbGljaykge1xyXG4gICAgICAgICAgdGhpcy5pc0luU2V0KHRoaXMuX3NlbGVjdGVkT3B0aW9ucywgb3B0aW9uKVxyXG4gICAgICAgICAgICA/IHRoaXMudW5TZWxlY3RNdWx0aXBsZU9wdGlvbihvcHRpb24pXHJcbiAgICAgICAgICAgIDogdGhpcy5zZWxlY3RNdWx0aXBsZU9wdGlvbihvcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlV2lkdGgoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCwgdGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGV4dCkge1xyXG4gICAgICAvKiogd2FpdCBmb3Igc2Nyb2xsIHdpZHRoIGNoYW5nZSAqLyAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHNldFRpbWVvdXQoXyA9PiB7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgXCJ3aWR0aFwiLCBgJHtlbGVtZW50LnNjcm9sbFdpZHRofXB4YCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWxlbWVudCwgXCJ3aWR0aFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBkZXRlcm1pbmUgaWYgb3B0aW9uIGluIHNldCAqL1xyXG4gIGlzSW5TZXQoXHJcbiAgICBzZXQ6IFNldDxwZ09wdGlvbkNvbXBvbmVudD4sXHJcbiAgICBvcHRpb246IHBnT3B0aW9uQ29tcG9uZW50XHJcbiAgKTogcGdPcHRpb25Db21wb25lbnQgeyAvLyBAdHMtaWdub3JlXHJcbiAgICByZXR1cm4gKEFycmF5LmZyb20oc2V0KSBhcyBwZ09wdGlvbkNvbXBvbmVudFtdKS5maW5kKFxyXG4gICAgICAoZGF0YTogcGdPcHRpb25Db21wb25lbnQpID0+IGRhdGEuVmFsdWUgPT09IG9wdGlvbi5WYWx1ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBjYW5jZWwgc2VsZWN0IG11bHRpcGxlIG9wdGlvbiAqLyAvLyBAdHMtaWdub3JlXHJcbiAgdW5TZWxlY3RNdWx0aXBsZU9wdGlvbiA9IChvcHRpb24sICRldmVudD8sIGVtaXRDaGFuZ2UgPSB0cnVlKSA9PiB7XHJcbiAgICB0aGlzLl9vcGVyYXRpbmdNdWx0aXBsZU9wdGlvbiA9IG9wdGlvbjtcclxuICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5kZWxldGUob3B0aW9uKTtcclxuICAgIGlmIChlbWl0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuZW1pdE11bHRpcGxlT3B0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWvuVRhZ+i/m+ihjOeJueauiuWkhOeQhlxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9pc1RhZ3MgJiZcclxuICAgICAgdGhpcy5fb3B0aW9ucy5pbmRleE9mKG9wdGlvbikgIT09IC0xICYmXHJcbiAgICAgIHRoaXMuX3RhZ3NPcHRpb25zLmluZGV4T2Yob3B0aW9uKSAhPT0gLTFcclxuICAgICkge1xyXG4gICAgICB0aGlzLnJlbW92ZU9wdGlvbihvcHRpb24pO1xyXG4gICAgICB0aGlzLl90YWdzT3B0aW9ucy5zcGxpY2UodGhpcy5fdGFnc09wdGlvbnMuaW5kZXhPZihvcHRpb24pLCAxKTtcclxuICAgIH1cclxuICAgIGlmICgkZXZlbnQpIHtcclxuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvKiogc2VsZWN0IG11bHRpcGxlIG9wdGlvbiAqL1xyXG4gIHNlbGVjdE11bHRpcGxlT3B0aW9uKG9wdGlvbjogcGdPcHRpb25Db21wb25lbnQsICRldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIC8qKiBpZiB0YWdzIGRvIHB1c2ggdG8gdGFnIG9wdGlvbiAqL1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9pc1RhZ3MgJiZcclxuICAgICAgdGhpcy5fb3B0aW9ucy5pbmRleE9mKG9wdGlvbikgPT09IC0xICYmXHJcbiAgICAgIHRoaXMuX3RhZ3NPcHRpb25zLmluZGV4T2Yob3B0aW9uKSA9PT0gLTFcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFkZE9wdGlvbihvcHRpb24pO1xyXG4gICAgICB0aGlzLl90YWdzT3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVyYXRpbmdNdWx0aXBsZU9wdGlvbiA9IG9wdGlvbjtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE9wdGlvbnMuc2l6ZSA8IHRoaXMuTWF4TXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRPcHRpb25zLmFkZChvcHRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0TXVsdGlwbGVPcHRpb25zKCk7XHJcblxyXG4gICAgaWYgKCRldmVudCkge1xyXG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIGVtaXQgbXVsdGlwbGUgb3B0aW9ucyAqL1xyXG4gIGVtaXRNdWx0aXBsZU9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNNdWx0aUluaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXJyYXlPcHRpb25zID0gQXJyYXkuZnJvbSh0aGlzLl9zZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgdGhpcy5fdmFsdWUgPSBhcnJheU9wdGlvbnMubWFwKGl0ZW0gPT4gaXRlbS5WYWx1ZSk7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiB1cGRhdGUgc2VsZWN0ZWQgb3B0aW9uIHdoZW4gYWRkIHJlbW92ZSBvcHRpb24gZXRjICovXHJcbiAgdXBkYXRlU2VsZWN0ZWRPcHRpb24oXHJcbiAgICBjdXJyZW50TW9kZWxWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sXHJcbiAgICB0cmlnZ2VyQnlOZ01vZGVsOiBib29sZWFuID0gZmFsc2VcclxuICApOiB2b2lkIHtcclxuICAgIGlmIChjdXJyZW50TW9kZWxWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLk11bHRpcGxlKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHRoaXMuX29wdGlvbnMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICAgIHJldHVybiBpdGVtICE9IG51bGwgJiYgY3VycmVudE1vZGVsVmFsdWUuaW5kZXhPZihpdGVtLlZhbHVlKSAhPT0gLTE7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoKHRoaXMuS2VlcFVuTGlzdE9wdGlvbnMgfHwgdGhpcy5UYWdzKSAmJiAhdHJpZ2dlckJ5TmdNb2RlbCkge1xyXG4gICAgICAgIGNvbnN0IF9zZWxlY3RlZE9wdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuX3NlbGVjdGVkT3B0aW9ucyk7XHJcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICAgIGNvbnN0IF9leGlzdCA9IF9zZWxlY3RlZE9wdGlvbnMuc29tZShcclxuICAgICAgICAgICAgaXRlbSA9PiBpdGVtLl92YWx1ZSA9PT0gb3B0aW9uLl92YWx1ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmICghX2V4aXN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5hZGQob3B0aW9uKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZE9wdGlvbnMgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9ucy5hZGQob3B0aW9uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLl9vcHRpb25zLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgICByZXR1cm4gaXRlbSAhPSBudWxsICYmIGl0ZW0uVmFsdWUgPT09IGN1cnJlbnRNb2RlbFZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jaG9vc2VPcHRpb24oc2VsZWN0ZWRPcHRpb25bMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9yY2VVcGRhdGVTZWxlY3RlZE9wdGlvbih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIC8qKiB0cmlnZ2VyIGRpcnR5IGNoZWNrICovIC8vIEB0cy1pZ25vcmVcclxuICAgIHNldFRpbWVvdXQoXyA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRPcHRpb24odmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgVmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IFZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5fdXBkYXRlVmFsdWUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJBbGxTZWxlY3RlZE9wdGlvbihlbWl0Q2hhbmdlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRPcHRpb25zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIHRoaXMudW5TZWxlY3RNdWx0aXBsZU9wdGlvbihpdGVtLCBudWxsLCBlbWl0Q2hhbmdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlS2V5RW50ZXJFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLyoqIHdoZW4gY29tcG9zaW5nIGVuZCAqL1xyXG4gICAgaWYgKCF0aGlzLl9jb21wb3NpbmcgJiYgdGhpcy5faXNPcGVuKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlck9wdGlvbihmYWxzZSk7XHJcbiAgICAgIHRoaXMuY2xpY2tPcHRpb24odGhpcy5fYWN0aXZlRmlsdGVyT3B0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUtleUJhY2tzcGFjZUV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX3NlYXJjaFRleHQgJiYgIXRoaXMuX2NvbXBvc2luZyAmJiB0aGlzLl9pc011bHRpcGxlKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGNvbnN0IGxhc3RPcHRpb24gPSBBcnJheS5mcm9tKHRoaXMuX3NlbGVjdGVkT3B0aW9ucykucG9wKCk7XHJcbiAgICAgIHRoaXMudW5TZWxlY3RNdWx0aXBsZU9wdGlvbihsYXN0T3B0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUtleURvd25FdmVudCgkZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pc09wZW4pIHtcclxuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5fYWN0aXZlRmlsdGVyT3B0aW9uID0gdGhpcy5uZXh0T3B0aW9uKFxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlck9wdGlvbixcclxuICAgICAgICB0aGlzLl9maWx0ZXJPcHRpb25zLmZpbHRlcih3ID0+ICF3LkRpc2FibGVkKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnNjcm9sbFRvQWN0aXZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVLZXlVcEV2ZW50KCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzT3Blbikge1xyXG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB0aGlzLl9hY3RpdmVGaWx0ZXJPcHRpb24gPSB0aGlzLnByZU9wdGlvbihcclxuICAgICAgICB0aGlzLl9hY3RpdmVGaWx0ZXJPcHRpb24sXHJcbiAgICAgICAgdGhpcy5fZmlsdGVyT3B0aW9ucy5maWx0ZXIodyA9PiAhdy5EaXNhYmxlZClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zY3JvbGxUb0FjdGl2ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJlT3B0aW9uKFxyXG4gICAgb3B0aW9uOiBwZ09wdGlvbkNvbXBvbmVudCxcclxuICAgIG9wdGlvbnM6IHBnT3B0aW9uQ29tcG9uZW50W11cclxuICApOiBwZ09wdGlvbkNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gb3B0aW9uc1tvcHRpb25zLmluZGV4T2Yob3B0aW9uKSAtIDFdIHx8IG9wdGlvbnNbb3B0aW9ucy5sZW5ndGggLSAxXTtcclxuICB9XHJcblxyXG4gIG5leHRPcHRpb24oXHJcbiAgICBvcHRpb246IHBnT3B0aW9uQ29tcG9uZW50LFxyXG4gICAgb3B0aW9uczogcGdPcHRpb25Db21wb25lbnRbXVxyXG4gICk6IHBnT3B0aW9uQ29tcG9uZW50IHtcclxuICAgIHJldHVybiBvcHRpb25zW29wdGlvbnMuaW5kZXhPZihvcHRpb24pICsgMV0gfHwgb3B0aW9uc1swXTtcclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoVGV4dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NlYXJjaFRleHQgPSBcIlwiO1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJPcHRpb24oKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUZpbHRlck9wdGlvbih1cGRhdGVBY3RpdmVGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5GaWx0ZXIpIHtcclxuICAgICAgdGhpcy5fZmlsdGVyT3B0aW9ucyA9IG5ldyBPcHRpb25QaXBlKCkudHJhbnNmb3JtKHRoaXMuX29wdGlvbnMsIHtcclxuICAgICAgICBzZWFyY2hUZXh0OiB0aGlzLl9zZWFyY2hUZXh0LFxyXG4gICAgICAgIHRhZ3M6IHRoaXMuX2lzVGFncyxcclxuICAgICAgICBub3RGb3VuZENvbnRlbnQ6IHRoaXMuX2lzVGFnc1xyXG4gICAgICAgICAgPyB0aGlzLl9zZWFyY2hUZXh0XHJcbiAgICAgICAgICA6IHRoaXMuX25vdEZvdW5kQ29udGVudCxcclxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuX2lzVGFncyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5faXNUYWdzID8gdGhpcy5fc2VhcmNoVGV4dCA6IFwiZGlzYWJsZWRcIlxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2ZpbHRlck9wdGlvbnMgPSB0aGlzLl9vcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUT0RPOiBjYXVzZSBwcmUgJiBuZXh0IGtleSBzZWxlY3Rpb24gbm90IHdvcmsgKi9cclxuICAgIGlmICh1cGRhdGVBY3RpdmVGaWx0ZXIgJiYgIXRoaXMuX3NlbGVjdGVkT3B0aW9uKSB7XHJcbiAgICAgIHRoaXMuX2FjdGl2ZUZpbHRlck9wdGlvbiA9IHRoaXMuX2ZpbHRlck9wdGlvbnNbMF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaENoYW5nZShzZWFyY2hWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLlNlYXJjaENoYW5nZS5lbWl0KHNlYXJjaFZhbHVlKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgb25DbGljayhlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuT3BlbiA9ICF0aGlzLk9wZW47XHJcbiAgICAgIGlmICh0aGlzLlNob3dTZWFyY2gpIHtcclxuICAgICAgICAvKiogd2FpdCBmb3Igc2VhcmNoIGRpc3BsYXkgKi8gLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHNldFRpbWVvdXQoXyA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJrZXlkb3duXCIsIFtcIiRldmVudFwiXSlcclxuICBvbktleURvd24oZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5Q29kZSA9IGUua2V5Q29kZTtcclxuICAgIGlmIChrZXlDb2RlID09PSBUQUIgJiYgdGhpcy5PcGVuKSB7XHJcbiAgICAgIHRoaXMuT3BlbiA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoKGtleUNvZGUgIT09IERPV05fQVJST1cgJiYga2V5Q29kZSAhPT0gRU5URVIpIHx8IHRoaXMuT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuT3BlbiA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLlNob3dTZWFyY2gpIHtcclxuICAgICAgICAvKiogd2FpdCBmb3Igc2VhcmNoIGRpc3BsYXkgKi8gLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHNldFRpbWVvdXQoXyA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlRHJvcERvd24oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgaWYgKHRoaXMuTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUoXHJcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcclxuICAgICAgICBcIndpZHRoXCJcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XHJcbiAgICB0aGlzLk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNldENsYXNzTWFwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2xhc3NMaXN0LmZvckVhY2goX2NsYXNzTmFtZSA9PiB7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2VsLCBfY2xhc3NOYW1lKTtcclxuICAgIH0pOyAvLyBAdHMtaWdub3JlXHJcbiAgICB0aGlzLl9jbGFzc0xpc3QgPSBbXHJcbiAgICAgIHRoaXMuX3ByZWZpeENscyxcclxuICAgICAgdGhpcy5fbW9kZSA9PT0gXCJjb21ib2JveFwiICYmIGAke3RoaXMuX3ByZWZpeENsc30tY29tYm9ib3hgLFxyXG4gICAgICAhdGhpcy5fZGlzYWJsZWQgJiYgYCR7dGhpcy5fcHJlZml4Q2xzfS1lbmFibGVkYCxcclxuICAgICAgdGhpcy5fZGlzYWJsZWQgJiYgYCR7dGhpcy5fcHJlZml4Q2xzfS1kaXNhYmxlZGAsXHJcbiAgICAgIHRoaXMuX2lzT3BlbiAmJiBgJHt0aGlzLl9wcmVmaXhDbHN9LW9wZW5gLFxyXG4gICAgICB0aGlzLl9zaG93U2VhcmNoICYmIGAke3RoaXMuX3ByZWZpeENsc30tc2hvdy1zZWFyY2hgLFxyXG4gICAgICB0aGlzLl9zaXplICYmIGAke3RoaXMuX3ByZWZpeENsc30tJHt0aGlzLl9zaXplfWBcclxuICAgIF0uZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICByZXR1cm4gISFpdGVtO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9jbGFzc0xpc3QuZm9yRWFjaChfY2xhc3NOYW1lID0+IHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWwsIF9jbGFzc05hbWUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25DbGFzc01hcCA9IHtcclxuICAgICAgW3RoaXMuX3NlbGVjdGlvblByZWZpeENsc106IHRydWUsXHJcbiAgICAgIFtgJHt0aGlzLl9zZWxlY3Rpb25QcmVmaXhDbHN9LS1zaW5nbGVgXTogIXRoaXMuTXVsdGlwbGUsXHJcbiAgICAgIFtgJHt0aGlzLl9zZWxlY3Rpb25QcmVmaXhDbHN9LS1tdWx0aXBsZWBdOiB0aGlzLk11bHRpcGxlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc2V0RHJvcERvd25DbGFzc01hcCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Ryb3BEb3duQ2xhc3NNYXAgPSB7XHJcbiAgICAgIFt0aGlzLl9kcm9wRG93blByZWZpeENsc106IHRydWUsXHJcbiAgICAgIFtcImNvbXBvbmVudC1zZWxlY3RcIl06IHRoaXMuX21vZGUgPT09IFwiY29tYm9ib3hcIixcclxuICAgICAgW2Ake3RoaXMuX2Ryb3BEb3duUHJlZml4Q2xzfS0tc2luZ2xlYF06ICF0aGlzLk11bHRpcGxlLFxyXG4gICAgICBbYCR7dGhpcy5fZHJvcERvd25QcmVmaXhDbHN9LS1tdWx0aXBsZWBdOiB0aGlzLk11bHRpcGxlLFxyXG4gICAgICBbYCR7dGhpcy5fZHJvcERvd25QcmVmaXhDbHN9LXBsYWNlbWVudC1ib3R0b21MZWZ0YF06XHJcbiAgICAgICAgdGhpcy5fZHJvcERvd25Qb3NpdGlvbiA9PT0gXCJib3R0b21cIixcclxuICAgICAgW2Ake3RoaXMuX2Ryb3BEb3duUHJlZml4Q2xzfS1wbGFjZW1lbnQtdG9wTGVmdGBdOlxyXG4gICAgICAgIHRoaXMuX2Ryb3BEb3duUG9zaXRpb24gPT09IFwidG9wXCJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzY3JvbGxUb0FjdGl2ZSgpOiB2b2lkIHtcclxuICAgIC8qKiB3YWl0IGZvciBkcm9wZG93biBkaXNwbGF5ICovIC8vIEB0cy1pZ25vcmVcclxuICAgIHNldFRpbWVvdXQoXyA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl9hY3RpdmVGaWx0ZXJPcHRpb24gJiYgdGhpcy5fYWN0aXZlRmlsdGVyT3B0aW9uLlZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9maWx0ZXJPcHRpb25zLmZpbmRJbmRleChcclxuICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24uVmFsdWUgPT09IHRoaXMuX2FjdGl2ZUZpbHRlck9wdGlvbi5WYWx1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHNjcm9sbFBhbmUgPSB0aGlzLmRyb3Bkb3duVWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbltcclxuICAgICAgICAgICAgaW5kZXhcclxuICAgICAgICAgIF0gYXMgSFRNTExJRWxlbWVudDtcclxuICAgICAgICAgIC8vIFRPRE86IHNjcm9sbEludG9WaWV3SWZOZWVkZWQgaXMgbm90IGEgc3RhbmRhcmQgQVBJLCB3aHkgZG9pbmcgc28/XHJcbiAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXHJcbiAgICAgICAgICAoc2Nyb2xsUGFuZSBhcyBhbnkpLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoZmFsc2UpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZmx1c2hDb21wb25lbnRTdGF0ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyT3B0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZE9wdGlvbih0aGlzLl92YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fdmFsdWUpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkT3B0aW9uKHRoaXMuX3ZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX3NldFRyaWdnZXJXaWR0aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXJXaWR0aCA9IHRoaXMuX2dldFRyaWdnZXJSZWN0KCkud2lkdGg7XHJcbiAgICAvKiogc2hvdWxkIHJlbW92ZSBhZnRlciBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9tYXRlcmlhbDIvcHVsbC84NzY1IG1lcmdlZCAqKi9cclxuICAgIGlmICh0aGlzLl9jZGtPdmVybGF5ICYmIHRoaXMuX2Nka092ZXJsYXkub3ZlcmxheVJlZikge1xyXG4gICAgICB0aGlzLl9jZGtPdmVybGF5Lm92ZXJsYXlSZWYudXBkYXRlU2l6ZSh7XHJcbiAgICAgICAgd2lkdGg6IHRoaXMuX3RyaWdnZXJXaWR0aFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9nZXRUcmlnZ2VyUmVjdCgpOiBDbGllbnRSZWN0IHtcclxuICAgIHJldHVybiB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICB0aGlzLl91cGRhdGVWYWx1ZSh2YWx1ZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgZHJvcERvd25TY3JvbGwodWw6IEhUTUxVTGlzdEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGlmICh1bCAmJiB1bC5zY3JvbGxIZWlnaHQgLSB1bC5zY3JvbGxUb3AgPT09IHVsLmNsaWVudEhlaWdodCkge1xyXG4gICAgICB0aGlzLlNjcm9sbFRvQm90dG9tLmVtaXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0Ryb3BEb3duU2Nyb2xsKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmRyb3Bkb3duVWwgJiZcclxuICAgICAgdGhpcy5kcm9wZG93blVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID09PVxyXG4gICAgICAgIHRoaXMuZHJvcGRvd25VbC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuU2Nyb2xsVG9Cb3R0b20uZW1pdCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIGNEUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgdGhpcy5fZWwgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmZsdXNoQ29tcG9uZW50U3RhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJPcHRpb24oKTtcclxuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcclxuICAgIHRoaXMuc2V0RHJvcERvd25DbGFzc01hcCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2NhY2hlT3B0aW9ucyAhPT0gdGhpcy5fb3B0aW9ucykge1xyXG4gICAgICAvKiogdXBkYXRlIGZpbHRlciBvcHRpb24gYWZ0ZXIgZXZlcnkgY29udGVudCBjaGVjayBjeWNsZSAqL1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlck9wdGlvbigpO1xyXG4gICAgICB0aGlzLl9jYWNoZU9wdGlvbnMgPSB0aGlzLl9vcHRpb25zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJPcHRpb24oZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLkZpcnN0RGVmYXVsdCkge1xyXG4gICAgICBpZiAoIXRoaXMuX3ZhbHVlICYmIHRoaXMuX29wdGlvbnMpIHtcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9uc1swXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX29wdGlvbnNbMF0uVmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMuY2hvb3NlT3B0aW9uKHRoaXMuX29wdGlvbnNbMF0sIGZhbHNlKTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX29wdGlvbnNbMF0uVmFsdWUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVWYWx1ZShcclxuICAgIHZhbHVlOiBzdHJpbmdbXSB8IHN0cmluZyxcclxuICAgIGVtaXRDaGFuZ2U6IGJvb2xlYW4gPSB0cnVlXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdmFsdWUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIHRoaXMuTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkT3B0aW9uID0gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkT3B0aW9uKHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5jbGVhckFsbFNlbGVjdGVkT3B0aW9uKGVtaXRDaGFuZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkT3B0aW9uKHZhbHVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJBbGxTZWxlY3RlZE9wdGlvbihlbWl0Q2hhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IHRhYmluZGV4PVwiMFwiICN0cmlnZ2VyIGNka092ZXJsYXlPcmlnaW4gI29yaWdpbj1cImNka092ZXJsYXlPcmlnaW5cIiBbbmdDbGFzc109XCJfc2VsZWN0aW9uQ2xhc3NNYXBcIlxyXG4gIChrZXlkb3duLkVudGVyKT1cImhhbmRsZUtleUVudGVyRXZlbnQoJGV2ZW50KVwiIChrZXlkb3duLkJhY2tzcGFjZSk9XCJoYW5kbGVLZXlCYWNrc3BhY2VFdmVudCgkZXZlbnQpXCJcclxuICAoa2V5ZG93bi5BcnJvd1VwKT1cImhhbmRsZUtleVVwRXZlbnQoJGV2ZW50KVwiIChrZXlkb3duLkFycm93RG93bik9XCJoYW5kbGVLZXlEb3duRXZlbnQoJGV2ZW50KVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJwZy1zZWxlY3Qtc2VsZWN0aW9uX19yZW5kZXJlZFwiICpuZ0lmPVwiIVNob3dTZWFyY2hcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwZy1zZWxlY3Qtc2VsZWN0aW9uX19wbGFjZWhvbGRlclwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIV9zZWxlY3RlZE9wdGlvblwiPlxyXG4gICAgICAgIHt7IFBsYWNlSG9sZGVyIH19XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJwZy1zZWxlY3Qtc2VsZWN0aW9uLXNlbGVjdGVkLXZhbHVlXCI+XHJcbiAgICAgIHt7IF9zZWxlY3RlZE9wdGlvbj8uTGFiZWwgfX1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJwZy1zZWxlY3Qtc2VsZWN0aW9uX19yZW5kZXJlZFwiICpuZ0lmPVwiU2hvd1NlYXJjaFwiPlxyXG4gICAgPGRpdiBbaGlkZGVuXT1cIl9zZWFyY2hUZXh0fHwoIU9wZW4mJl9zZWxlY3RlZE9wdGlvbil8fF9zZWxlY3RlZE9wdGlvbnMuc2l6ZVwiXHJcbiAgICAgIGNsYXNzPVwicGctc2VsZWN0LXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIighX2NvbXBvc2luZykmJl9zZWxlY3RlZE9wdGlvblwiPlxyXG4gICAgICAgIHt7IF9zZWxlY3RlZE9wdGlvbi5MYWJlbCB9fVxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiKCFfY29tcG9zaW5nKSYmKCFfc2VsZWN0ZWRPcHRpb24pXCI+XHJcbiAgICAgICAge3sgUGxhY2VIb2xkZXIgfX1cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPHVsICpuZ0lmPVwiTXVsdGlwbGVcIj5cclxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgX3NlbGVjdGVkT3B0aW9uc1wiIFtAdGFnQW5pbWF0aW9uXSBbYXR0ci50aXRsZV09XCJvcHRpb24/LkxhYmVsIHx8IG9wdGlvbj8uVmFsdWVcIlxyXG4gICAgICAgIGNsYXNzPVwicGctc2VsZWN0LXNlbGVjdGlvbl9fY2hvaWNlXCIgc3R5bGU9XCItd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGctc2VsZWN0LXNlbGVjdGlvbl9fY2hvaWNlX19yZW1vdmVcIiAoY2xpY2spPVwidW5TZWxlY3RNdWx0aXBsZU9wdGlvbihvcHRpb24sJGV2ZW50KVwiPjwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGctc2VsZWN0LXNlbGVjdGlvbl9fY2hvaWNlX19jb250ZW50XCI+e3sgb3B0aW9uPy5MYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2xpPlxyXG4gICAgICA8bGkgY2xhc3M9XCJwZy1zZWxlY3Qtc2VhcmNoIHBnLXNlbGVjdC1zZWFyY2gtLWlubGluZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwZy1zZWxlY3Qtc2VhcmNoX19maWVsZF9fd3JhcFwiPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwicGctc2VsZWN0LXNlYXJjaF9fZmllbGRcIiAoY29tcG9zaXRpb25zdGFydCk9XCJjb21wb3NpdGlvblN0YXJ0KClcIlxyXG4gICAgICAgICAgICAoY29tcG9zaXRpb25lbmQpPVwiY29tcG9zaXRpb25FbmQoKTt1cGRhdGVXaWR0aChzZWFyY2hJbnB1dCxfc2VhcmNoVGV4dCk7XCIgWyhuZ01vZGVsKV09XCJfc2VhcmNoVGV4dFwiXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpbHRlck9wdGlvbigpO29uU2VhcmNoQ2hhbmdlKCRldmVudCk7XCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwidXBkYXRlV2lkdGgoc2VhcmNoSW5wdXQsX3NlYXJjaFRleHQpXCIgKGlucHV0KT1cInVwZGF0ZVdpZHRoKHNlYXJjaElucHV0LF9zZWFyY2hUZXh0KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uVG91Y2hlZCgpXCIgI3NlYXJjaElucHV0PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZy1zZWxlY3Qtc2VhcmNoX19maWVsZF9fbWlycm9yXCI+PC9zcGFuPjwvZGl2PlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICAgIDxkaXYgKm5nSWY9XCIhTXVsdGlwbGVcIiBjbGFzcz1cInBnLXNlbGVjdC1zZWxlY3Rpb24tc2VsZWN0ZWQtdmFsdWVcIiBbaGlkZGVuXT1cIiEoX3NlbGVjdGVkT3B0aW9uPy5MYWJlbCl8fE9wZW5cIj5cclxuICAgICAge3sgX3NlbGVjdGVkT3B0aW9uPy5MYWJlbCB9fVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIU11bHRpcGxlXCIgW2hpZGRlbl09XCIhT3BlblwiIGNsYXNzPVwicGctc2VsZWN0LXNlYXJjaCBwZy1zZWxlY3Qtc2VhcmNoLS1pbmxpbmVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBnLXNlbGVjdC1zZWFyY2hfX2ZpZWxkX193cmFwXCI+XHJcbiAgICAgICAgPGlucHV0IGNsYXNzPVwicGctc2VsZWN0LXNlYXJjaF9fZmllbGRcIiAoYmx1cik9XCJvblRvdWNoZWQoKVwiIChjb21wb3NpdGlvbnN0YXJ0KT1cImNvbXBvc2l0aW9uU3RhcnQoKVwiXHJcbiAgICAgICAgICAoY29tcG9zaXRpb25lbmQpPVwiY29tcG9zaXRpb25FbmQoKVwiIFsobmdNb2RlbCldPVwiX3NlYXJjaFRleHRcIlxyXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlRmlsdGVyT3B0aW9uKCk7b25TZWFyY2hDaGFuZ2UoJGV2ZW50KTtcIiAjc2VhcmNoSW5wdXQ+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwZy1zZWxlY3Qtc2VhcmNoX19maWVsZF9fbWlycm9yXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxzcGFuIChjbGljayk9XCJvblRvdWNoZWQoKTtjbGVhclNlbGVjdCgkZXZlbnQpXCIgY2xhc3M9XCJwZy1zZWxlY3Qtc2VsZWN0aW9uX19jbGVhclwiIHN0eWxlPVwiLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcIlxyXG4gICAgKm5nSWY9XCJfc2VsZWN0ZWRPcHRpb24/LkxhYmVsJiZBbGxvd0NsZWFyJiYhTXVsdGlwbGVcIj5cclxuICA8L3NwYW4+XHJcbiAgPHNwYW4gY2xhc3M9XCJwZy1zZWxlY3QtYXJyb3dcIj48Yj48L2I+PC9zcGFuPlxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlIGNka0Nvbm5lY3RlZE92ZXJsYXkgY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cIm9yaWdpblwiXHJcbiAgKGJhY2tkcm9wQ2xpY2spPVwiY2xvc2VEcm9wRG93bigpXCIgKGRldGFjaCk9XCJjbG9zZURyb3BEb3duKCk7XCIgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aF09XCJfdHJpZ2dlcldpZHRoXCIgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cIl9pc09wZW5cIj5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cIl9kcm9wRG93bkNsYXNzTWFwXCIgW0Bkcm9wRG93bkFuaW1hdGlvbl09XCJfZHJvcERvd25Qb3NpdGlvblwiPlxyXG4gICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvO1wiPlxyXG4gICAgICA8dWwgY2xhc3M9XCJwZy1zZWxlY3QtZHJvcGRvd24tbWVudSBwZy1zZWxlY3QtZHJvcGRvd24tbWVudS12ZXJ0aWNhbCBwZy1zZWxlY3QtZHJvcGRvd24tbWVudS1yb290XCIgI2Ryb3Bkb3duVWxcclxuICAgICAgICAoc2Nyb2xsKT1cImRyb3BEb3duU2Nyb2xsKGRyb3Bkb3duVWwpXCI+XHJcbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgX2ZpbHRlck9wdGlvbnNcIiBbY2xhc3MucGctc2VsZWN0LWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZF09XCJvcHRpb24uRGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2NsYXNzLnBnLXNlbGVjdC1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlXT1cIm9wdGlvbi5WYWx1ZSA9PSBfYWN0aXZlRmlsdGVyT3B0aW9uPy5WYWx1ZVwiXHJcbiAgICAgICAgICBbY2xhc3MucGctc2VsZWN0LWRyb3Bkb3duLW1lbnUtaXRlbS1zZWxlY3RlZF09XCIob3B0aW9uLlZhbHVlPT0oX3NlbGVjdGVkT3B0aW9uPy5WYWx1ZSkpfHwoaXNJblNldChfc2VsZWN0ZWRPcHRpb25zLG9wdGlvbikpXCJcclxuICAgICAgICAgIGNsYXNzPVwicGctc2VsZWN0LWRyb3Bkb3duLW1lbnUtaXRlbVwiIChjbGljayk9XCJjbGlja09wdGlvbihvcHRpb24sJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwib3B0aW9uLk9wdGlvblRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uLk9wdGlvblRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFvcHRpb24uT3B0aW9uVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAge3sgb3B0aW9uLkxhYmVsIH19XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgIDwvdWw+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=