structra-ui 0.1.15 → 0.1.17

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 (149) hide show
  1. package/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
  2. package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
  3. package/esm2022/app/_utils/estados-br.data.mjs +37 -0
  4. package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
  5. package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
  6. package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +97 -0
  7. package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
  8. package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
  9. package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
  10. package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
  11. package/esm2022/app/app-shell/index.mjs +19 -0
  12. package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
  13. package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
  14. package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
  15. package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
  16. package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
  17. package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
  18. package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
  19. package/esm2022/app/buttons/index.mjs +2 -0
  20. package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
  21. package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
  22. package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
  23. package/esm2022/app/data-display/_models/index.mjs +2 -0
  24. package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
  25. package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
  26. package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
  27. package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
  28. package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
  29. package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
  30. package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
  31. package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
  32. package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
  33. package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
  34. package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
  35. package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
  36. package/esm2022/app/data-display/index.mjs +19 -0
  37. package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
  38. package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
  39. package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
  40. package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
  41. package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
  42. package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
  43. package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +22 -0
  44. package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
  45. package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +200 -0
  46. package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
  47. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
  48. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
  49. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +47 -0
  50. package/esm2022/app/dialogs/index.mjs +12 -0
  51. package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
  52. package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
  53. package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +38 -0
  54. package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
  55. package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
  56. package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
  57. package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
  58. package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
  59. package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
  60. package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
  61. package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
  62. package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
  63. package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
  64. package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
  65. package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
  66. package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
  67. package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
  68. package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
  69. package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
  70. package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
  71. package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
  72. package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
  73. package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
  74. package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
  75. package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
  76. package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
  77. package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
  78. package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
  79. package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
  80. package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
  81. package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
  82. package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
  83. package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
  84. package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
  85. package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
  86. package/esm2022/app/fields/input-fields/index.mjs +22 -0
  87. package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
  88. package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
  89. package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
  90. package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
  91. package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
  92. package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
  93. package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
  94. package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
  95. package/esm2022/app/form-layout/_models/index.mjs +2 -0
  96. package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
  97. package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
  98. package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
  99. package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
  100. package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
  101. package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
  102. package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
  103. package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
  104. package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
  105. package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
  106. package/esm2022/app/form-layout/index.mjs +14 -0
  107. package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
  108. package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +343 -0
  109. package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
  110. package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
  111. package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
  112. package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
  113. package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
  114. package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
  115. package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
  116. package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
  117. package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
  118. package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
  119. package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
  120. package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
  121. package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
  122. package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
  123. package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
  124. package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
  125. package/esm2022/app/menus/drawer/drawer.component.mjs +142 -0
  126. package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
  127. package/esm2022/app/menus/index.mjs +11 -0
  128. package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
  129. package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
  130. package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
  131. package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
  132. package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
  133. package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
  134. package/esm2022/app/overlay/index.mjs +21 -0
  135. package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
  136. package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
  137. package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
  138. package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
  139. package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
  140. package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
  141. package/esm2022/app/theme/app-theme.service.mjs +49 -0
  142. package/esm2022/app/theme/index.mjs +2 -0
  143. package/esm2022/structra-public-api.mjs +18 -0
  144. package/esm2022/structra-ui.mjs +5 -0
  145. package/esm2022/structra-version.mjs +3 -0
  146. package/fesm2022/structra-ui.mjs +8971 -0
  147. package/fesm2022/structra-ui.mjs.map +1 -0
  148. package/index.d.ts +5 -0
  149. package/package.json +15 -6
@@ -0,0 +1,520 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, forwardRef, inject, numberAttribute, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { BaseFieldComponent } from '../../input-fields/_base/base-field.component';
4
+ import { DropdownOptionFieldBase } from '../_base/dropdown-option-field.base';
5
+ import { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';
6
+ import { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';
7
+ import { SkeletonListComponent } from '../../../loading/skeleton-loading';
8
+ import * as i0 from "@angular/core";
9
+ var DropdownSearchOpenMode;
10
+ (function (DropdownSearchOpenMode) {
11
+ DropdownSearchOpenMode["Default"] = "default";
12
+ DropdownSearchOpenMode["KeepInput"] = "keepInput";
13
+ })(DropdownSearchOpenMode || (DropdownSearchOpenMode = {}));
14
+ export class DropdownSearchFieldComponent extends DropdownOptionFieldBase {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.hostRef = inject((ElementRef));
18
+ this.pageSize = 5;
19
+ this.hasMore = false;
20
+ this.loadingMore = false;
21
+ /**
22
+ * Após parar de digitar, dispara a mesma pesquisa que Enter (`pageRequested` com `query`).
23
+ * `0` desativa (só Enter pesquisa).
24
+ */
25
+ this.searchDebounceMs = 350;
26
+ this.pageRequested = new EventEmitter();
27
+ this.searchQuery = '';
28
+ this.committedQuery = '';
29
+ this.panelOpen = false;
30
+ this.panelOverlayWidth = 0;
31
+ this.scrollLoadTimer = null;
32
+ this.searchDebounceTimer = null;
33
+ }
34
+ get hostInvalidClass() {
35
+ return this.uiInvalid;
36
+ }
37
+ afterWriteValue(value) {
38
+ this.searchQuery =
39
+ value == null ? '' : (this.findOptionByValue(value)?.label ?? '');
40
+ this.committedQuery = '';
41
+ this.syncActiveIndexFromValue(value);
42
+ this.cdr.markForCheck();
43
+ }
44
+ get displayValue() {
45
+ const opt = this.findOptionByValue(this.internalValue);
46
+ return opt?.label ?? '';
47
+ }
48
+ get optionsListId() {
49
+ return `${this.controlId}-search-list`;
50
+ }
51
+ /**
52
+ * Com valor selecionado e painel fechado, o texto é só exibição do rótulo;
53
+ * edição só com o painel aberto (pesquisa).
54
+ */
55
+ get isLockedSelectionDisplay() {
56
+ return (!this.disabled &&
57
+ !this.readonly &&
58
+ this.filledUi &&
59
+ !this.panelOpen);
60
+ }
61
+ /** `readonly` nativo: prop do campo ou bloqueio de exibição da seleção. */
62
+ get isNativeInputReadonly() {
63
+ if (this.disabled) {
64
+ return false;
65
+ }
66
+ return this.readonly || this.isLockedSelectionDisplay;
67
+ }
68
+ ngOnChanges(changes) {
69
+ super.ngOnChanges(changes);
70
+ if (!this.panelOpen || this.loadingMore) {
71
+ return;
72
+ }
73
+ if (changes['loadingMore'] || changes['options']) {
74
+ setTimeout(() => this.tryEmitIfShortList(), 0);
75
+ }
76
+ }
77
+ ngOnDestroy() {
78
+ if (this.scrollLoadTimer != null) {
79
+ clearTimeout(this.scrollLoadTimer);
80
+ }
81
+ this.clearSearchDebounce();
82
+ }
83
+ onDropdownOpenChange(next, openMode = DropdownSearchOpenMode.Default) {
84
+ if (!next) {
85
+ if (!this.panelOpen) {
86
+ return;
87
+ }
88
+ this.panelOpen = false;
89
+ this.clearSearchDebounce();
90
+ if (this.scrollLoadTimer != null) {
91
+ clearTimeout(this.scrollLoadTimer);
92
+ this.scrollLoadTimer = null;
93
+ }
94
+ setTimeout(() => this.focusMainInputIfFocusLost(), 0);
95
+ this.cdr.markForCheck();
96
+ return;
97
+ }
98
+ if (openMode === DropdownSearchOpenMode.Default) {
99
+ // Não limpar o texto quando já há seleção (comportamento alinhado ao select).
100
+ this.committedQuery = '';
101
+ if (this.filledUi) {
102
+ const opt = this.findOptionByValue(this.internalValue);
103
+ this.searchQuery = opt?.label ?? '';
104
+ }
105
+ else {
106
+ this.searchQuery = '';
107
+ }
108
+ }
109
+ else {
110
+ this.committedQuery = this.searchQuery.trim();
111
+ }
112
+ this.panelOpen = true;
113
+ this.syncActiveIndexFromValue(this.internalValue);
114
+ const w = this.hostRef.nativeElement.getBoundingClientRect().width;
115
+ this.panelOverlayWidth = Math.max(0, Math.ceil(w));
116
+ if (!this.loadingMore) {
117
+ this.pageRequested.emit({
118
+ page: 0,
119
+ pageSize: this.pageSize,
120
+ query: this.committedQuery,
121
+ });
122
+ }
123
+ setTimeout(() => this.tryEmitIfShortList(), 0);
124
+ setTimeout(() => this.tryEmitIfShortList(), 80);
125
+ setTimeout(() => {
126
+ document.getElementById(this.controlId)?.focus();
127
+ }, 0);
128
+ this.cdr.markForCheck();
129
+ }
130
+ onMainInput(ev) {
131
+ if (this.isNativeInputReadonly) {
132
+ return;
133
+ }
134
+ const el = ev.target;
135
+ this.searchQuery = el.value;
136
+ this.scheduleDebouncedSearch();
137
+ this.cdr.markForCheck();
138
+ }
139
+ onMainKeydown(ev) {
140
+ if (this.disabled || this.readonly) {
141
+ return;
142
+ }
143
+ if (ev.key === 'Delete' || ev.key === 'Backspace') {
144
+ if (this.panelOpen) {
145
+ return;
146
+ }
147
+ if (this.filledUi) {
148
+ ev.preventDefault();
149
+ ev.stopPropagation();
150
+ this.onClear();
151
+ }
152
+ return;
153
+ }
154
+ if (ev.key === 'Escape' && this.panelOpen) {
155
+ ev.preventDefault();
156
+ this.onDropdownOpenChange(false);
157
+ return;
158
+ }
159
+ if (this.panelOpen && this.listOptions.length > 0) {
160
+ switch (ev.key) {
161
+ case 'ArrowDown':
162
+ ev.preventDefault();
163
+ this.activeIndex = this.stepActive(1);
164
+ this.cdr.markForCheck();
165
+ return;
166
+ case 'ArrowUp':
167
+ ev.preventDefault();
168
+ this.activeIndex = this.stepActive(-1);
169
+ this.cdr.markForCheck();
170
+ return;
171
+ case 'Home':
172
+ ev.preventDefault();
173
+ this.activeIndex = this.firstEnabledIndex();
174
+ this.cdr.markForCheck();
175
+ return;
176
+ case 'End':
177
+ ev.preventDefault();
178
+ this.activeIndex = this.lastEnabledIndex();
179
+ this.cdr.markForCheck();
180
+ return;
181
+ default:
182
+ break;
183
+ }
184
+ }
185
+ if (ev.key === 'Enter') {
186
+ ev.preventDefault();
187
+ ev.stopPropagation();
188
+ if (!this.panelOpen) {
189
+ if (this.searchQuery.trim() === '' ||
190
+ this.isLockedSelectionDisplay) {
191
+ this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);
192
+ }
193
+ else {
194
+ this.runSearch();
195
+ }
196
+ return;
197
+ }
198
+ const q = this.searchQuery.trim();
199
+ const dirty = q !== this.committedQuery;
200
+ if (dirty) {
201
+ // Lista pedida com query vazia mas o input mostra o rótulo da seleção — não é pesquisa nova.
202
+ if (this.isDisplayingSelectedLabelWithUnfilteredList()) {
203
+ if (this.listOptions.length > 0) {
204
+ this.commitActiveOption();
205
+ }
206
+ return;
207
+ }
208
+ this.runSearch();
209
+ return;
210
+ }
211
+ if (this.listOptions.length > 0) {
212
+ this.commitActiveOption();
213
+ }
214
+ return;
215
+ }
216
+ }
217
+ /**
218
+ * Ao reabrir, `committedQuery` é '' (lista sem filtro) e o texto do input é o rótulo do valor —
219
+ * `q !== committedQuery` seria true sem o usuário ter pesquisado; Enter deve confirmar opção.
220
+ */
221
+ isDisplayingSelectedLabelWithUnfilteredList() {
222
+ if (!this.filledUi || this.committedQuery !== '') {
223
+ return false;
224
+ }
225
+ const label = this.findOptionByValue(this.internalValue)?.label?.trim();
226
+ if (label == null || label.length === 0) {
227
+ return false;
228
+ }
229
+ return this.searchQuery.trim() === label;
230
+ }
231
+ onMainBlur(ev) {
232
+ const triggerRoot = this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;
233
+ scheduleCloseDropdownPanelOnTriggerBlur({
234
+ triggerRoot,
235
+ isPanelOpen: () => this.panelOpen,
236
+ closePanel: () => this.onDropdownOpenChange(false),
237
+ notifyTouched: () => this.notifyTouched(),
238
+ blurRelatedTarget: ev?.relatedTarget ?? null,
239
+ afterBlur: () => this.clearOrphanSearchTextAfterBlur(),
240
+ });
241
+ }
242
+ /**
243
+ * Sem valor no modelo: remove texto livre deixado no input (ex.: pesquisa sem escolha válida).
244
+ * Não altera o `FormControl` — mantém-se `null`/vazio e o estado inválido (ex.: obrigatório) continua visível.
245
+ */
246
+ clearOrphanSearchTextAfterBlur() {
247
+ if (this.disabled || this.readonly) {
248
+ return;
249
+ }
250
+ const v = this.internalValue;
251
+ if (v != null && v !== '') {
252
+ return;
253
+ }
254
+ if (this.searchQuery.trim() === '') {
255
+ return;
256
+ }
257
+ this.searchQuery = '';
258
+ this.committedQuery = '';
259
+ this.cdr.markForCheck();
260
+ }
261
+ /** Escape com foco no limpar/prefixo do `base-field` (fora do input da origem). */
262
+ onDropdownHostEscape(ev) {
263
+ if (!this.panelOpen || ev.key !== 'Escape') {
264
+ return;
265
+ }
266
+ ev.preventDefault();
267
+ this.onDropdownOpenChange(false);
268
+ }
269
+ onTriggerKeydown(ev) {
270
+ if (this.disabled || this.readonly) {
271
+ return;
272
+ }
273
+ if ((ev.key === 'Delete' || ev.key === 'Backspace') &&
274
+ this.filledUi &&
275
+ !this.panelOpen) {
276
+ ev.preventDefault();
277
+ this.onClear();
278
+ return;
279
+ }
280
+ if (this.panelOpen) {
281
+ return;
282
+ }
283
+ if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {
284
+ ev.preventDefault();
285
+ this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);
286
+ }
287
+ }
288
+ /** Enter/Espaço com foco na linha da opção (tabindex). */
289
+ onOptionRowKeydown(ev, opt) {
290
+ if (opt.disabled || this.disabled || this.readonly) {
291
+ return;
292
+ }
293
+ if (ev.key !== 'Enter' && ev.key !== ' ') {
294
+ return;
295
+ }
296
+ ev.preventDefault();
297
+ ev.stopPropagation();
298
+ this.selectOption(opt);
299
+ }
300
+ /** Foco na lista (ex.: Tab): Delete/Backspace limpam a seleção. */
301
+ onSearchListKeydown(ev) {
302
+ if (ev.key === 'Escape') {
303
+ ev.preventDefault();
304
+ this.onDropdownOpenChange(false);
305
+ return;
306
+ }
307
+ if (ev.key !== 'Delete' && ev.key !== 'Backspace') {
308
+ return;
309
+ }
310
+ if (this.disabled || this.readonly || !this.filledUi) {
311
+ return;
312
+ }
313
+ ev.preventDefault();
314
+ ev.stopPropagation();
315
+ this.onClear();
316
+ }
317
+ focusMainInputIfFocusLost() {
318
+ const a = document.activeElement;
319
+ if (a === document.body || a === document.documentElement || a == null) {
320
+ document.getElementById(this.controlId)?.focus({ preventScroll: true });
321
+ }
322
+ }
323
+ scheduleDebouncedSearch() {
324
+ if (this.searchDebounceMs <= 0) {
325
+ return;
326
+ }
327
+ if (this.searchDebounceTimer != null) {
328
+ clearTimeout(this.searchDebounceTimer);
329
+ }
330
+ this.searchDebounceTimer = setTimeout(() => {
331
+ this.searchDebounceTimer = null;
332
+ this.applyDebouncedSearch();
333
+ }, this.searchDebounceMs);
334
+ }
335
+ clearSearchDebounce() {
336
+ if (this.searchDebounceTimer != null) {
337
+ clearTimeout(this.searchDebounceTimer);
338
+ this.searchDebounceTimer = null;
339
+ }
340
+ }
341
+ /**
342
+ * Alinha-se ao Enter: só dispara se `query` mudou em relação a `committedQuery`;
343
+ * com painel fechado, só se houver texto pesquisável (como Enter sem abrir vazio).
344
+ */
345
+ applyDebouncedSearch() {
346
+ if (this.disabled || this.readonly || this.isNativeInputReadonly) {
347
+ return;
348
+ }
349
+ const q = this.searchQuery.trim();
350
+ if (q === this.committedQuery) {
351
+ return;
352
+ }
353
+ if (!this.panelOpen) {
354
+ if (q === '' || this.isLockedSelectionDisplay) {
355
+ return;
356
+ }
357
+ this.runSearch();
358
+ return;
359
+ }
360
+ if (this.isDisplayingSelectedLabelWithUnfilteredList()) {
361
+ return;
362
+ }
363
+ this.runSearch();
364
+ }
365
+ runSearch() {
366
+ this.clearSearchDebounce();
367
+ if (this.disabled || this.readonly) {
368
+ return;
369
+ }
370
+ if (!this.panelOpen) {
371
+ this.onDropdownOpenChange(true, DropdownSearchOpenMode.KeepInput);
372
+ return;
373
+ }
374
+ const q = this.searchQuery.trim();
375
+ this.committedQuery = q;
376
+ this.pageRequested.emit({
377
+ page: 0,
378
+ pageSize: this.pageSize,
379
+ query: q,
380
+ });
381
+ this.cdr.markForCheck();
382
+ }
383
+ onOptionsListScroll(ev) {
384
+ if (this.loadingMore || !this.hasMore) {
385
+ return;
386
+ }
387
+ const el = ev.target;
388
+ if (this.options.length === 0) {
389
+ return;
390
+ }
391
+ if (this.scrollLoadTimer != null) {
392
+ clearTimeout(this.scrollLoadTimer);
393
+ }
394
+ this.scrollLoadTimer = setTimeout(() => {
395
+ this.scrollLoadTimer = null;
396
+ if (el.scrollHeight <= el.clientHeight + 8) {
397
+ if (this.hasMore && !this.loadingMore && this.options.length > 0) {
398
+ this.emitNextPageRequest();
399
+ }
400
+ return;
401
+ }
402
+ const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 64;
403
+ if (!nearBottom) {
404
+ return;
405
+ }
406
+ this.emitNextPageRequest();
407
+ }, 120);
408
+ }
409
+ emitNextPageRequest() {
410
+ if (this.loadingMore || !this.hasMore) {
411
+ return;
412
+ }
413
+ if (this.options.length === 0) {
414
+ return;
415
+ }
416
+ const nextPage = Math.floor(this.options.length / this.pageSize);
417
+ this.pageRequested.emit({
418
+ page: nextPage,
419
+ pageSize: this.pageSize,
420
+ query: this.committedQuery,
421
+ });
422
+ }
423
+ tryEmitIfShortList() {
424
+ if (!this.panelOpen || this.loadingMore || !this.hasMore) {
425
+ return;
426
+ }
427
+ if (this.options.length === 0) {
428
+ return;
429
+ }
430
+ const el = document.getElementById(this.optionsListId);
431
+ if (!el) {
432
+ return;
433
+ }
434
+ if (el.scrollHeight <= el.clientHeight + 8) {
435
+ this.emitNextPageRequest();
436
+ }
437
+ }
438
+ openToggle() {
439
+ if (this.disabled || this.readonly || this.loading) {
440
+ return;
441
+ }
442
+ if (this.panelOpen) {
443
+ this.onDropdownOpenChange(false);
444
+ }
445
+ else {
446
+ this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);
447
+ }
448
+ }
449
+ commitActiveOption() {
450
+ const opt = this.listOptions[this.activeIndex];
451
+ if (opt && !opt.disabled) {
452
+ this.selectOption(opt);
453
+ }
454
+ }
455
+ selectOption(opt) {
456
+ if (this.disabled || this.readonly || opt.disabled) {
457
+ return;
458
+ }
459
+ this.emitModelValue(opt.value);
460
+ this.searchQuery = opt.label;
461
+ this.committedQuery = '';
462
+ this.onDropdownOpenChange(false);
463
+ this.finishSelectionTouch();
464
+ }
465
+ onClear() {
466
+ if (this.disabled || this.readonly) {
467
+ return;
468
+ }
469
+ this.clearSearchDebounce();
470
+ this.emitModelValue(null);
471
+ this.searchQuery = '';
472
+ this.committedQuery = '';
473
+ this.onDropdownOpenChange(false);
474
+ this.notifyTouched();
475
+ this.cdr.markForCheck();
476
+ }
477
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownSearchFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
478
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DropdownSearchFieldComponent, isStandalone: true, selector: "app-dropdown-search-field", inputs: { pageSize: ["pageSize", "pageSize", numberAttribute], hasMore: "hasMore", loadingMore: "loadingMore", searchDebounceMs: ["searchDebounceMs", "searchDebounceMs", numberAttribute] }, outputs: { pageRequested: "pageRequested" }, host: { listeners: { "keydown": "onDropdownHostEscape($event)" }, properties: { "class.dropdown-search-field--invalid": "this.hostInvalidClass" } }, providers: [
479
+ {
480
+ provide: NG_VALUE_ACCESSOR,
481
+ useExisting: forwardRef(() => DropdownSearchFieldComponent),
482
+ multi: true,
483
+ },
484
+ ], viewQueries: [{ propertyName: "optionsPanelTpl", first: true, predicate: ["optionsPanelTpl"], descendants: true, static: true }, { propertyName: "dropdownTriggerRootRef", first: true, predicate: ["dropdownFieldTriggerRoot"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"dropdown-search-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"dropdown-search-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <input type=\"text\" class=\"dropdown-search-field__input\"\n [class.dropdown-search-field__input--locked]=\"isLockedSelectionDisplay\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [disabled]=\"disabled\" [readonly]=\"isNativeInputReadonly\" [attr.placeholder]=\"''\"\n autocomplete=\"off\" spellcheck=\"false\"\n [attr.aria-expanded]=\"panelOpen\" aria-autocomplete=\"list\" role=\"combobox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [attr.aria-label]=\"floatLabelCaption || placeholder || 'Buscar e selecionar'\"\n [value]=\"searchQuery\" (input)=\"onMainInput($event)\" (keydown)=\"onMainKeydown($event)\"\n (blur)=\"onMainBlur($event)\" />\n <button type=\"button\" class=\"dropdown-search-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista\" (click)=\"openToggle()\">\n <i class=\"fa-solid fa-chevron-down dropdown-search-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"dropdown-search-field__panel-inner\" (mousedown)=\"$event.preventDefault()\">\n <div class=\"dropdown-search-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n [attr.aria-label]=\"floatLabelCaption || 'Op\u00E7\u00F5es'\" (blur)=\"onMainBlur($event)\"\n (keydown)=\"onSearchListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || loadingMore)) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"dropdown-search-field__option\"\n [class.dropdown-search-field__option--disabled]=\"opt.disabled\"\n [class.dropdown-search-field__option--selected]=\"isSelected(opt)\"\n [class.dropdown-search-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box}:host ::ng-deep .base-field:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}:host ::ng-deep .base-field--invalid:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}:host ::ng-deep .base-field.base-field--readonly:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}:host ::ng-deep .base-field.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.dropdown-search-field__wrap{display:flex;flex:1;align-items:stretch;min-width:0;width:100%;box-sizing:border-box}.dropdown-search-field__origin{display:flex;align-items:center;min-width:0;width:100%;min-height:calc(1.8rem + 1.35em);box-sizing:border-box}.dropdown-search-field__input{flex:1;margin:0;box-sizing:border-box;min-height:calc(1.8rem + 1.35em);padding:1.35rem .35rem .45rem .75rem;font-size:1rem;line-height:1.35;font-family:inherit;text-align:left;color:var(--ui-field-float-input-text);background:transparent;border:0;border-radius:0;box-shadow:none;cursor:text;display:block;width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-search-field__input:focus,.dropdown-search-field__input:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__input:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}.dropdown-search-field__input--locked:read-only:not(:disabled){cursor:default;opacity:1}.dropdown-search-field__input:read-only:not(:disabled):not(.dropdown-search-field__input--locked){cursor:default;opacity:1;color:var(--ui-field-readonly-input-text)}.dropdown-search-field__chevron-btn{display:flex;flex-shrink:0;align-items:center;justify-content:center;box-sizing:border-box;width:2rem;height:2rem;margin:0 .1rem;padding:0;border:0;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.dropdown-search-field__chevron-btn:hover:not(:disabled){background:#5a7fa31f;color:var(--ui-field-float-label-top-color)}.dropdown-search-field__chevron-btn:focus,.dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-btn:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .dropdown-search-field__chevron-btn:disabled{opacity:1;cursor:default;color:var(--ui-field-readonly-prefix-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn{color:var(--ui-field-float-label-invalid-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn .dropdown-search-field__chevron-icon{color:inherit}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:hover:not(:disabled){background:#b91c1c1f}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus,:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-icon{display:inline-flex;align-items:center;justify-content:center;padding-top:2px;font-size:.8rem;line-height:1}.dropdown-search-field__panel-inner{display:flex;flex-direction:column;max-height:min(280px,55vh);width:100%;box-sizing:border-box;background:var(--app-color-nav-surface, var(--app-color-surface, #fff))}.dropdown-search-field__list{margin:0;padding:.25rem 0;flex:1;min-height:0;width:100%;max-height:min(260px,52vh);box-sizing:border-box;outline:none;overflow-x:hidden;overflow-y:auto}.dropdown-search-field__loading{padding:.65rem .75rem;font-size:.85rem;line-height:1.35;color:var(--ui-field-float-label-color);text-align:center}.dropdown-search-field__option{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.45rem .75rem;font-size:.95rem;line-height:1.35;cursor:pointer;color:var(--ui-field-float-input-text)}.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg)}.dropdown-search-field__option--active:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-highlight-bg)}.dropdown-search-field__option.dropdown-search-field__option--active.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg-active)}.dropdown-search-field__option--disabled{opacity:.45;cursor:not-allowed}.dropdown-search-field__option:hover:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-hover-bg)}.dropdown-search-field__option.dropdown-search-field__option--selected:hover:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-hover-bg)}\n"], dependencies: [{ kind: "component", type: BaseFieldComponent, selector: "app-base-field", inputs: ["label", "errorMessage", "required", "showRequiredMark", "invalid", "filled", "disabled", "readonly", "inputId", "errorId", "showPrefixIcon", "prefixIcon", "clearable", "clearAriaLabel", "showSuffixSlot", "valueAlignEnd", "loading", "skeletonVariant", "mostrarMenuContexto", "contextMenuItems", "contextMenuId"], outputs: ["clear", "contextMenuSelect"] }, { kind: "component", type: DropdownBaseComponent, selector: "app-dropdown-base", inputs: ["open", "panelTemplate", "panelWidthPx", "closeOnEscape", "hasBackdrop", "connectedPositions", "pushConnectedOverlay", "bareOverlayPanel"], outputs: ["openChange"] }, { kind: "component", type: SkeletonListComponent, selector: "app-skeleton-list", inputs: ["rows", "leading", "rowGap", "lineHeight", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
485
+ }
486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownSearchFieldComponent, decorators: [{
487
+ type: Component,
488
+ args: [{ selector: 'app-dropdown-search-field', standalone: true, imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
489
+ {
490
+ provide: NG_VALUE_ACCESSOR,
491
+ useExisting: forwardRef(() => DropdownSearchFieldComponent),
492
+ multi: true,
493
+ },
494
+ ], template: "<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"dropdown-search-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"dropdown-search-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <input type=\"text\" class=\"dropdown-search-field__input\"\n [class.dropdown-search-field__input--locked]=\"isLockedSelectionDisplay\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [disabled]=\"disabled\" [readonly]=\"isNativeInputReadonly\" [attr.placeholder]=\"''\"\n autocomplete=\"off\" spellcheck=\"false\"\n [attr.aria-expanded]=\"panelOpen\" aria-autocomplete=\"list\" role=\"combobox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [attr.aria-label]=\"floatLabelCaption || placeholder || 'Buscar e selecionar'\"\n [value]=\"searchQuery\" (input)=\"onMainInput($event)\" (keydown)=\"onMainKeydown($event)\"\n (blur)=\"onMainBlur($event)\" />\n <button type=\"button\" class=\"dropdown-search-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista\" (click)=\"openToggle()\">\n <i class=\"fa-solid fa-chevron-down dropdown-search-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"dropdown-search-field__panel-inner\" (mousedown)=\"$event.preventDefault()\">\n <div class=\"dropdown-search-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n [attr.aria-label]=\"floatLabelCaption || 'Op\u00E7\u00F5es'\" (blur)=\"onMainBlur($event)\"\n (keydown)=\"onSearchListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || loadingMore)) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"dropdown-search-field__option\"\n [class.dropdown-search-field__option--disabled]=\"opt.disabled\"\n [class.dropdown-search-field__option--selected]=\"isSelected(opt)\"\n [class.dropdown-search-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box}:host ::ng-deep .base-field:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}:host ::ng-deep .base-field--invalid:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}:host ::ng-deep .base-field.base-field--readonly:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}:host ::ng-deep .base-field.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.dropdown-search-field__wrap{display:flex;flex:1;align-items:stretch;min-width:0;width:100%;box-sizing:border-box}.dropdown-search-field__origin{display:flex;align-items:center;min-width:0;width:100%;min-height:calc(1.8rem + 1.35em);box-sizing:border-box}.dropdown-search-field__input{flex:1;margin:0;box-sizing:border-box;min-height:calc(1.8rem + 1.35em);padding:1.35rem .35rem .45rem .75rem;font-size:1rem;line-height:1.35;font-family:inherit;text-align:left;color:var(--ui-field-float-input-text);background:transparent;border:0;border-radius:0;box-shadow:none;cursor:text;display:block;width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-search-field__input:focus,.dropdown-search-field__input:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__input:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}.dropdown-search-field__input--locked:read-only:not(:disabled){cursor:default;opacity:1}.dropdown-search-field__input:read-only:not(:disabled):not(.dropdown-search-field__input--locked){cursor:default;opacity:1;color:var(--ui-field-readonly-input-text)}.dropdown-search-field__chevron-btn{display:flex;flex-shrink:0;align-items:center;justify-content:center;box-sizing:border-box;width:2rem;height:2rem;margin:0 .1rem;padding:0;border:0;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.dropdown-search-field__chevron-btn:hover:not(:disabled){background:#5a7fa31f;color:var(--ui-field-float-label-top-color)}.dropdown-search-field__chevron-btn:focus,.dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-btn:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .dropdown-search-field__chevron-btn:disabled{opacity:1;cursor:default;color:var(--ui-field-readonly-prefix-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn{color:var(--ui-field-float-label-invalid-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn .dropdown-search-field__chevron-icon{color:inherit}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:hover:not(:disabled){background:#b91c1c1f}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus,:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-icon{display:inline-flex;align-items:center;justify-content:center;padding-top:2px;font-size:.8rem;line-height:1}.dropdown-search-field__panel-inner{display:flex;flex-direction:column;max-height:min(280px,55vh);width:100%;box-sizing:border-box;background:var(--app-color-nav-surface, var(--app-color-surface, #fff))}.dropdown-search-field__list{margin:0;padding:.25rem 0;flex:1;min-height:0;width:100%;max-height:min(260px,52vh);box-sizing:border-box;outline:none;overflow-x:hidden;overflow-y:auto}.dropdown-search-field__loading{padding:.65rem .75rem;font-size:.85rem;line-height:1.35;color:var(--ui-field-float-label-color);text-align:center}.dropdown-search-field__option{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.45rem .75rem;font-size:.95rem;line-height:1.35;cursor:pointer;color:var(--ui-field-float-input-text)}.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg)}.dropdown-search-field__option--active:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-highlight-bg)}.dropdown-search-field__option.dropdown-search-field__option--active.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg-active)}.dropdown-search-field__option--disabled{opacity:.45;cursor:not-allowed}.dropdown-search-field__option:hover:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-hover-bg)}.dropdown-search-field__option.dropdown-search-field__option--selected:hover:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-hover-bg)}\n"] }]
495
+ }], propDecorators: { hostInvalidClass: [{
496
+ type: HostBinding,
497
+ args: ['class.dropdown-search-field--invalid']
498
+ }], pageSize: [{
499
+ type: Input,
500
+ args: [{ transform: numberAttribute }]
501
+ }], hasMore: [{
502
+ type: Input
503
+ }], loadingMore: [{
504
+ type: Input
505
+ }], searchDebounceMs: [{
506
+ type: Input,
507
+ args: [{ transform: numberAttribute }]
508
+ }], pageRequested: [{
509
+ type: Output
510
+ }], optionsPanelTpl: [{
511
+ type: ViewChild,
512
+ args: ['optionsPanelTpl', { static: true }]
513
+ }], dropdownTriggerRootRef: [{
514
+ type: ViewChild,
515
+ args: ['dropdownFieldTriggerRoot', { read: ElementRef }]
516
+ }], onDropdownHostEscape: [{
517
+ type: HostListener,
518
+ args: ['keydown', ['$event']]
519
+ }] } });
520
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZmllbGRzL2Ryb3Bkb3duLWZpZWxkcy9kcm9wZG93bi1zZWFyY2gtZmllbGQvZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZmllbGRzL2Ryb3Bkb3duLWZpZWxkcy9kcm9wZG93bi1zZWFyY2gtZmllbGQvZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUdOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFHOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBRTFFLElBQUssc0JBR0o7QUFIRCxXQUFLLHNCQUFzQjtJQUN6Qiw2Q0FBbUIsQ0FBQTtJQUNuQixpREFBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSEksc0JBQXNCLEtBQXRCLHNCQUFzQixRQUcxQjtBQWlCRCxNQUFNLE9BQU8sNEJBQ1gsU0FBUSx1QkFB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LENBQUM7Z0JBQzNELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiw0UEE0QjhDLFVBQVUseUVDekUzRCxxbUhBdURBLDYzS0RwQlksa0JBQWtCLHNhQUFFLHFCQUFxQiw0T0FBRSxxQkFBcUI7OzRGQVkvRCw0QkFBNEI7a0JBZnhDLFNBQVM7K0JBQ0UsMkJBQTJCLGNBQ3pCLElBQUksV0FDUCxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLG1CQUcxRCx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDZCQUE2QixDQUFDOzRCQUMzRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs4QkFTRyxnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsc0NBQXNDO2dCQUtaLFFBQVE7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUM1QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFLaUMsZ0JBQWdCO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFFbEIsYUFBYTtzQkFBL0IsTUFBTTtnQkFJUCxlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk3QixzQkFBc0I7c0JBRHRDLFNBQVM7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQW9RM0Qsb0JBQW9CO3NCQURuQixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBmb3J3YXJkUmVmLFxyXG4gIGluamVjdCxcclxuICBudW1iZXJBdHRyaWJ1dGUsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBCYXNlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnB1dC1maWVsZHMvX2Jhc2UvYmFzZS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk9wdGlvbkZpZWxkQmFzZSB9IGZyb20gJy4uL19iYXNlL2Ryb3Bkb3duLW9wdGlvbi1maWVsZC5iYXNlJztcclxuaW1wb3J0IHR5cGUgeyBEcm9wZG93blNlYXJjaFBhZ2VSZXF1ZXN0ZWQgfSBmcm9tICcuLi9fbW9kZWxzL2Ryb3Bkb3duLXNlYXJjaC1wYWdlLXJlcXVlc3RlZC5tb2RlbCc7XHJcbmltcG9ydCB7IFVpU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vX21vZGVscy9zZWxlY3Qtb3B0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vX2Jhc2UvZHJvcGRvd24tYmFzZS9kcm9wZG93bi1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IHNjaGVkdWxlQ2xvc2VEcm9wZG93blBhbmVsT25UcmlnZ2VyQmx1ciB9IGZyb20gJy4uL19iYXNlL2Ryb3Bkb3duLXRyaWdnZXItYmx1ci51dGlsJztcclxuaW1wb3J0IHsgU2tlbGV0b25MaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbG9hZGluZy9za2VsZXRvbi1sb2FkaW5nJztcclxuXHJcbmVudW0gRHJvcGRvd25TZWFyY2hPcGVuTW9kZSB7XHJcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcclxuICBLZWVwSW5wdXQgPSAna2VlcElucHV0JyxcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZHJvcGRvd24tc2VhcmNoLWZpZWxkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtCYXNlRmllbGRDb21wb25lbnQsIERyb3Bkb3duQmFzZUNvbXBvbmVudCwgU2tlbGV0b25MaXN0Q29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERyb3Bkb3duU2VhcmNoRmllbGRDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duU2VhcmNoRmllbGRDb21wb25lbnRcclxuICBleHRlbmRzIERyb3Bkb3duT3B0aW9uRmllbGRCYXNlXHJcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xyXG57XHJcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kcm9wZG93bi1zZWFyY2gtZmllbGQtLWludmFsaWQnKVxyXG4gIGdldCBob3N0SW52YWxpZENsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudWlJbnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgcGFnZVNpemUgPSA1O1xyXG4gIEBJbnB1dCgpIGhhc01vcmUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBsb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIEFww7NzIHBhcmFyIGRlIGRpZ2l0YXIsIGRpc3BhcmEgYSBtZXNtYSBwZXNxdWlzYSBxdWUgRW50ZXIgKGBwYWdlUmVxdWVzdGVkYCBjb20gYHF1ZXJ5YCkuXHJcbiAgICogYDBgIGRlc2F0aXZhIChzw7MgRW50ZXIgcGVzcXVpc2EpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHNlYXJjaERlYm91bmNlTXMgPSAzNTA7XHJcblxyXG4gIEBPdXRwdXQoKSByZWFkb25seSBwYWdlUmVxdWVzdGVkID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RHJvcGRvd25TZWFyY2hQYWdlUmVxdWVzdGVkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdvcHRpb25zUGFuZWxUcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIG9wdGlvbnNQYW5lbFRwbCE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAVmlld0NoaWxkKCdkcm9wZG93bkZpZWxkVHJpZ2dlclJvb3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcclxuICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duVHJpZ2dlclJvb3RSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgc2VhcmNoUXVlcnkgPSAnJztcclxuICBjb21taXR0ZWRRdWVyeSA9ICcnO1xyXG5cclxuICBwYW5lbE9wZW4gPSBmYWxzZTtcclxuICBwYW5lbE92ZXJsYXlXaWR0aCA9IDA7XHJcbiAgcHJpdmF0ZSBzY3JvbGxMb2FkVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzZWFyY2hEZWJvdW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWZ0ZXJXcml0ZVZhbHVlKHZhbHVlOiB1bmtub3duIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9XHJcbiAgICAgIHZhbHVlID09IG51bGwgPyAnJyA6ICh0aGlzLmZpbmRPcHRpb25CeVZhbHVlKHZhbHVlKT8ubGFiZWwgPz8gJycpO1xyXG4gICAgdGhpcy5jb21taXR0ZWRRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5zeW5jQWN0aXZlSW5kZXhGcm9tVmFsdWUodmFsdWUpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBvcHQgPSB0aGlzLmZpbmRPcHRpb25CeVZhbHVlKHRoaXMuaW50ZXJuYWxWYWx1ZSk7XHJcbiAgICByZXR1cm4gb3B0Py5sYWJlbCA/PyAnJztcclxuICB9XHJcblxyXG4gIGdldCBvcHRpb25zTGlzdElkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5jb250cm9sSWR9LXNlYXJjaC1saXN0YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbSB2YWxvciBzZWxlY2lvbmFkbyBlIHBhaW5lbCBmZWNoYWRvLCBvIHRleHRvIMOpIHPDsyBleGliacOnw6NvIGRvIHLDs3R1bG87XHJcbiAgICogZWRpw6fDo28gc8OzIGNvbSBvIHBhaW5lbCBhYmVydG8gKHBlc3F1aXNhKS5cclxuICAgKi9cclxuICBnZXQgaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgIXRoaXMuZGlzYWJsZWQgJiZcclxuICAgICAgIXRoaXMucmVhZG9ubHkgJiZcclxuICAgICAgdGhpcy5maWxsZWRVaSAmJlxyXG4gICAgICAhdGhpcy5wYW5lbE9wZW5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogYHJlYWRvbmx5YCBuYXRpdm86IHByb3AgZG8gY2FtcG8gb3UgYmxvcXVlaW8gZGUgZXhpYmnDp8OjbyBkYSBzZWxlw6fDo28uICovXHJcbiAgZ2V0IGlzTmF0aXZlSW5wdXRSZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuIHx8IHRoaXMubG9hZGluZ01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmdNb3JlJ10gfHwgY2hhbmdlc1snb3B0aW9ucyddKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cnlFbWl0SWZTaG9ydExpc3QoKSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNjcm9sbExvYWRUaW1lciAhPSBudWxsKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbExvYWRUaW1lcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoRGVib3VuY2UoKTtcclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25PcGVuQ2hhbmdlKFxyXG4gICAgbmV4dDogYm9vbGVhbixcclxuICAgIG9wZW5Nb2RlOiBEcm9wZG93blNlYXJjaE9wZW5Nb2RlID0gRHJvcGRvd25TZWFyY2hPcGVuTW9kZS5EZWZhdWx0LFxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCFuZXh0KSB7XHJcbiAgICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYW5lbE9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbGVhclNlYXJjaERlYm91bmNlKCk7XHJcbiAgICAgIGlmICh0aGlzLnNjcm9sbExvYWRUaW1lciAhPSBudWxsKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsTG9hZFRpbWVyKTtcclxuICAgICAgICB0aGlzLnNjcm9sbExvYWRUaW1lciA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzTWFpbklucHV0SWZGb2N1c0xvc3QoKSwgMCk7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wZW5Nb2RlID09PSBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLkRlZmF1bHQpIHtcclxuICAgICAgLy8gTsOjbyBsaW1wYXIgbyB0ZXh0byBxdWFuZG8gasOhIGjDoSBzZWxlw6fDo28gKGNvbXBvcnRhbWVudG8gYWxpbmhhZG8gYW8gc2VsZWN0KS5cclxuICAgICAgdGhpcy5jb21taXR0ZWRRdWVyeSA9ICcnO1xyXG4gICAgICBpZiAodGhpcy5maWxsZWRVaSkge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5pbnRlcm5hbFZhbHVlKTtcclxuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gb3B0Py5sYWJlbCA/PyAnJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29tbWl0dGVkUXVlcnkgPSB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFuZWxPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuc3luY0FjdGl2ZUluZGV4RnJvbVZhbHVlKHRoaXMuaW50ZXJuYWxWYWx1ZSk7XHJcbiAgICBjb25zdCB3ID0gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICB0aGlzLnBhbmVsT3ZlcmxheVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHcpKTtcclxuICAgIGlmICghdGhpcy5sb2FkaW5nTW9yZSkge1xyXG4gICAgICB0aGlzLnBhZ2VSZXF1ZXN0ZWQuZW1pdCh7XHJcbiAgICAgICAgcGFnZTogMCxcclxuICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgICBxdWVyeTogdGhpcy5jb21taXR0ZWRRdWVyeSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudHJ5RW1pdElmU2hvcnRMaXN0KCksIDApO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyeUVtaXRJZlNob3J0TGlzdCgpLCA4MCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5jb250cm9sSWQpPy5mb2N1cygpO1xyXG4gICAgfSwgMCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uTWFpbklucHV0KGV2OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNOYXRpdmVJbnB1dFJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGVsID0gZXYudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gZWwudmFsdWU7XHJcbiAgICB0aGlzLnNjaGVkdWxlRGVib3VuY2VkU2VhcmNoKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uTWFpbktleWRvd24oZXY6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldi5rZXkgPT09ICdEZWxldGUnIHx8IGV2LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcclxuICAgICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmZpbGxlZFVpKSB7XHJcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB0aGlzLm9uQ2xlYXIoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2LmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4gJiYgdGhpcy5saXN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHN3aXRjaCAoZXYua2V5KSB7XHJcbiAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5zdGVwQWN0aXZlKDEpO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMuc3RlcEFjdGl2ZSgtMSk7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5maXJzdEVuYWJsZWRJbmRleCgpO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAnRW5kJzpcclxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5sYXN0RW5hYmxlZEluZGV4KCk7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXYua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBpZiAoIXRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeS50cmltKCkgPT09ICcnIHx8XHJcbiAgICAgICAgICB0aGlzLmlzTG9ja2VkU2VsZWN0aW9uRGlzcGxheVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZSh0cnVlLCBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLkRlZmF1bHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJ1blNlYXJjaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoUXVlcnkudHJpbSgpO1xyXG4gICAgICBjb25zdCBkaXJ0eSA9IHEgIT09IHRoaXMuY29tbWl0dGVkUXVlcnk7XHJcbiAgICAgIGlmIChkaXJ0eSkge1xyXG4gICAgICAgIC8vIExpc3RhIHBlZGlkYSBjb20gcXVlcnkgdmF6aWEgbWFzIG8gaW5wdXQgbW9zdHJhIG8gcsOzdHVsbyBkYSBzZWxlw6fDo28g4oCUIG7Do28gw6kgcGVzcXVpc2Egbm92YS5cclxuICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlpbmdTZWxlY3RlZExhYmVsV2l0aFVuZmlsdGVyZWRMaXN0KCkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmxpc3RPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jb21taXRBY3RpdmVPcHRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ydW5TZWFyY2goKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGlzdE9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuY29tbWl0QWN0aXZlT3B0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW8gcmVhYnJpciwgYGNvbW1pdHRlZFF1ZXJ5YCDDqSAnJyAobGlzdGEgc2VtIGZpbHRybykgZSBvIHRleHRvIGRvIGlucHV0IMOpIG8gcsOzdHVsbyBkbyB2YWxvciDigJRcclxuICAgKiBgcSAhPT0gY29tbWl0dGVkUXVlcnlgIHNlcmlhIHRydWUgc2VtIG8gdXN1w6FyaW8gdGVyIHBlc3F1aXNhZG87IEVudGVyIGRldmUgY29uZmlybWFyIG9ww6fDo28uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0Rpc3BsYXlpbmdTZWxlY3RlZExhYmVsV2l0aFVuZmlsdGVyZWRMaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbGxlZFVpIHx8IHRoaXMuY29tbWl0dGVkUXVlcnkgIT09ICcnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5maW5kT3B0aW9uQnlWYWx1ZSh0aGlzLmludGVybmFsVmFsdWUpPy5sYWJlbD8udHJpbSgpO1xyXG4gICAgaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKSA9PT0gbGFiZWw7XHJcbiAgfVxyXG5cclxuICBvbk1haW5CbHVyKGV2PzogRm9jdXNFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdHJpZ2dlclJvb3QgPVxyXG4gICAgICB0aGlzLmRyb3Bkb3duVHJpZ2dlclJvb3RSZWY/Lm5hdGl2ZUVsZW1lbnQgPz8gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBzY2hlZHVsZUNsb3NlRHJvcGRvd25QYW5lbE9uVHJpZ2dlckJsdXIoe1xyXG4gICAgICB0cmlnZ2VyUm9vdCxcclxuICAgICAgaXNQYW5lbE9wZW46ICgpID0+IHRoaXMucGFuZWxPcGVuLFxyXG4gICAgICBjbG9zZVBhbmVsOiAoKSA9PiB0aGlzLm9uRHJvcGRvd25PcGVuQ2hhbmdlKGZhbHNlKSxcclxuICAgICAgbm90aWZ5VG91Y2hlZDogKCkgPT4gdGhpcy5ub3RpZnlUb3VjaGVkKCksXHJcbiAgICAgIGJsdXJSZWxhdGVkVGFyZ2V0OiBldj8ucmVsYXRlZFRhcmdldCA/PyBudWxsLFxyXG4gICAgICBhZnRlckJsdXI6ICgpID0+IHRoaXMuY2xlYXJPcnBoYW5TZWFyY2hUZXh0QWZ0ZXJCbHVyKCksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbSB2YWxvciBubyBtb2RlbG86IHJlbW92ZSB0ZXh0byBsaXZyZSBkZWl4YWRvIG5vIGlucHV0IChleC46IHBlc3F1aXNhIHNlbSBlc2NvbGhhIHbDoWxpZGEpLlxyXG4gICAqIE7Do28gYWx0ZXJhIG8gYEZvcm1Db250cm9sYCDigJQgbWFudMOpbS1zZSBgbnVsbGAvdmF6aW8gZSBvIGVzdGFkbyBpbnbDoWxpZG8gKGV4Ljogb2JyaWdhdMOzcmlvKSBjb250aW51YSB2aXPDrXZlbC5cclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFyT3JwaGFuU2VhcmNoVGV4dEFmdGVyQmx1cigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdiA9IHRoaXMuaW50ZXJuYWxWYWx1ZTtcclxuICAgIGlmICh2ICE9IG51bGwgJiYgdiAhPT0gJycpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkudHJpbSgpID09PSAnJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLmNvbW1pdHRlZFF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKiBFc2NhcGUgY29tIGZvY28gbm8gbGltcGFyL3ByZWZpeG8gZG8gYGJhc2UtZmllbGRgIChmb3JhIGRvIGlucHV0IGRhIG9yaWdlbSkuICovXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25Ecm9wZG93bkhvc3RFc2NhcGUoZXY6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4gfHwgZXYua2V5ICE9PSAnRXNjYXBlJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBvblRyaWdnZXJLZXlkb3duKGV2OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgKGV2LmtleSA9PT0gJ0RlbGV0ZScgfHwgZXYua2V5ID09PSAnQmFja3NwYWNlJykgJiZcclxuICAgICAgdGhpcy5maWxsZWRVaSAmJlxyXG4gICAgICAhdGhpcy5wYW5lbE9wZW5cclxuICAgICkge1xyXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLm9uQ2xlYXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChldi5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGV2LmtleSA9PT0gJ0Fycm93VXAnKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UodHJ1ZSwgRHJvcGRvd25TZWFyY2hPcGVuTW9kZS5EZWZhdWx0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBFbnRlci9Fc3Bhw6dvIGNvbSBmb2NvIG5hIGxpbmhhIGRhIG9ww6fDo28gKHRhYmluZGV4KS4gKi9cclxuICBvbk9wdGlvblJvd0tleWRvd24oZXY6IEtleWJvYXJkRXZlbnQsIG9wdDogVWlTZWxlY3RPcHRpb248dW5rbm93bj4pOiB2b2lkIHtcclxuICAgIGlmIChvcHQuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChldi5rZXkgIT09ICdFbnRlcicgJiYgZXYua2V5ICE9PSAnICcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3RPcHRpb24ob3B0KTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2NvIG5hIGxpc3RhIChleC46IFRhYik6IERlbGV0ZS9CYWNrc3BhY2UgbGltcGFtIGEgc2VsZcOnw6NvLiAqL1xyXG4gIG9uU2VhcmNoTGlzdEtleWRvd24oZXY6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldi5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UoZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZXYua2V5ICE9PSAnRGVsZXRlJyAmJiBldi5rZXkgIT09ICdCYWNrc3BhY2UnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkgfHwgIXRoaXMuZmlsbGVkVWkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5vbkNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvY3VzTWFpbklucHV0SWZGb2N1c0xvc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuICAgIGlmIChhID09PSBkb2N1bWVudC5ib2R5IHx8IGEgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBhID09IG51bGwpIHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5jb250cm9sSWQpPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNjaGVkdWxlRGVib3VuY2VkU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRGVib3VuY2VNcyA8PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlYXJjaERlYm91bmNlVGltZXIgIT0gbnVsbCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hEZWJvdW5jZVRpbWVyKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VhcmNoRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaERlYm91bmNlVGltZXIgPSBudWxsO1xyXG4gICAgICB0aGlzLmFwcGx5RGVib3VuY2VkU2VhcmNoKCk7XHJcbiAgICB9LCB0aGlzLnNlYXJjaERlYm91bmNlTXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclNlYXJjaERlYm91bmNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRGVib3VuY2VUaW1lciAhPSBudWxsKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaERlYm91bmNlVGltZXIpO1xyXG4gICAgICB0aGlzLnNlYXJjaERlYm91bmNlVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxpbmhhLXNlIGFvIEVudGVyOiBzw7MgZGlzcGFyYSBzZSBgcXVlcnlgIG11ZG91IGVtIHJlbGHDp8OjbyBhIGBjb21taXR0ZWRRdWVyeWA7XHJcbiAgICogY29tIHBhaW5lbCBmZWNoYWRvLCBzw7Mgc2UgaG91dmVyIHRleHRvIHBlc3F1aXPDoXZlbCAoY29tbyBFbnRlciBzZW0gYWJyaXIgdmF6aW8pLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlEZWJvdW5jZWRTZWFyY2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNOYXRpdmVJbnB1dFJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKTtcclxuICAgIGlmIChxID09PSB0aGlzLmNvbW1pdHRlZFF1ZXJ5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgaWYgKHEgPT09ICcnIHx8IHRoaXMuaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucnVuU2VhcmNoKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzRGlzcGxheWluZ1NlbGVjdGVkTGFiZWxXaXRoVW5maWx0ZXJlZExpc3QoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJ1blNlYXJjaCgpO1xyXG4gIH1cclxuXHJcbiAgcnVuU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhclNlYXJjaERlYm91bmNlKCk7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZSh0cnVlLCBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLktlZXBJbnB1dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKTtcclxuICAgIHRoaXMuY29tbWl0dGVkUXVlcnkgPSBxO1xyXG4gICAgdGhpcy5wYWdlUmVxdWVzdGVkLmVtaXQoe1xyXG4gICAgICBwYWdlOiAwLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgcXVlcnk6IHEsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgb25PcHRpb25zTGlzdFNjcm9sbChldjogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmdNb3JlIHx8ICF0aGlzLmhhc01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWwgPSBldi50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zY3JvbGxMb2FkVGltZXIgIT0gbnVsbCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxMb2FkVGltZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zY3JvbGxMb2FkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zY3JvbGxMb2FkVGltZXIgPSBudWxsO1xyXG4gICAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IDw9IGVsLmNsaWVudEhlaWdodCArIDgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNNb3JlICYmICF0aGlzLmxvYWRpbmdNb3JlICYmIHRoaXMub3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmVtaXROZXh0UGFnZVJlcXVlc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG5lYXJCb3R0b20gPVxyXG4gICAgICAgIGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodCA8PSA2NDtcclxuICAgICAgaWYgKCFuZWFyQm90dG9tKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW1pdE5leHRQYWdlUmVxdWVzdCgpO1xyXG4gICAgfSwgMTIwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdE5leHRQYWdlUmVxdWVzdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmdNb3JlIHx8ICF0aGlzLmhhc01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dFBhZ2UgPSBNYXRoLmZsb29yKHRoaXMub3B0aW9ucy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKTtcclxuICAgIHRoaXMucGFnZVJlcXVlc3RlZC5lbWl0KHtcclxuICAgICAgcGFnZTogbmV4dFBhZ2UsXHJcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxyXG4gICAgICBxdWVyeTogdGhpcy5jb21taXR0ZWRRdWVyeSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlFbWl0SWZTaG9ydExpc3QoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuIHx8IHRoaXMubG9hZGluZ01vcmUgfHwgIXRoaXMuaGFzTW9yZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9uc0xpc3RJZCkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgaWYgKCFlbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IDw9IGVsLmNsaWVudEhlaWdodCArIDgpIHtcclxuICAgICAgdGhpcy5lbWl0TmV4dFBhZ2VSZXF1ZXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuVG9nZ2xlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSB8fCB0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UoZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZSh0cnVlLCBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLkRlZmF1bHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21taXRBY3RpdmVPcHRpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHQgPSB0aGlzLmxpc3RPcHRpb25zW3RoaXMuYWN0aXZlSW5kZXhdO1xyXG4gICAgaWYgKG9wdCAmJiAhb3B0LmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKG9wdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RPcHRpb24ob3B0OiBVaVNlbGVjdE9wdGlvbjx1bmtub3duPik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSB8fCBvcHQuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0TW9kZWxWYWx1ZShvcHQudmFsdWUpO1xyXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9IG9wdC5sYWJlbDtcclxuICAgIHRoaXMuY29tbWl0dGVkUXVlcnkgPSAnJztcclxuICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UoZmFsc2UpO1xyXG4gICAgdGhpcy5maW5pc2hTZWxlY3Rpb25Ub3VjaCgpO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbGVhclNlYXJjaERlYm91bmNlKCk7XHJcbiAgICB0aGlzLmVtaXRNb2RlbFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5jb21taXR0ZWRRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgICB0aGlzLm5vdGlmeVRvdWNoZWQoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxufVxyXG4iLCI8YXBwLWJhc2UtZmllbGQgW2xhYmVsXT1cImZsb2F0TGFiZWxDYXB0aW9uXCIgW2ZpbGxlZF09XCJmaWxsZWRVaVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICBbZXJyb3JNZXNzYWdlXT1cInVpRXJyb3JNZXNzYWdlXCIgW3JlcXVpcmVkXT1cInVpUmVxdWlyZWRFZmZlY3RpdmVcIiBbc2hvd1JlcXVpcmVkTWFya109XCJzaG93UmVxdWlyZWRNYXJrXCIgW2ludmFsaWRdPVwidWlJbnZhbGlkXCJcbiAgW2lucHV0SWRdPVwiY29udHJvbElkXCIgW2Vycm9ySWRdPVwiZXJyb3JFbGVtZW50SWRcIiBbc2hvd1ByZWZpeEljb25dPVwic2hvd1ByZWZpeEljb25cIiBbcHJlZml4SWNvbl09XCJwcmVmaXhJY29uXCJcbiAgW2NsZWFyYWJsZV09XCJjbGVhcmFibGVcIiBbY2xlYXJBcmlhTGFiZWxdPVwiY2xlYXJBcmlhTGFiZWxcIlxuICBbbW9zdHJhck1lbnVDb250ZXh0b109XCJtb3N0cmFyTWVudUNvbnRleHRvXCIgW2NvbnRleHRNZW51SXRlbXNdPVwiY29udGV4dE1lbnVJdGVtc1wiIFtjb250ZXh0TWVudUlkXT1cImNvbnRleHRNZW51SWRcIlxuICAoY2xlYXIpPVwib25DbGVhcigpXCIgKGNvbnRleHRNZW51U2VsZWN0KT1cImNvbnRleHRNZW51U2VsZWN0LmVtaXQoJGV2ZW50KVwiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwRmllbGRQcmVmaXhdXCIgLz5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fd3JhcFwiPlxuICAgIDxhcHAtZHJvcGRvd24tYmFzZSBbb3Blbl09XCJwYW5lbE9wZW5cIiBbcGFuZWxUZW1wbGF0ZV09XCJvcHRpb25zUGFuZWxUcGxcIiBbcGFuZWxXaWR0aFB4XT1cInBhbmVsT3ZlcmxheVdpZHRoXCJcbiAgICAgIChvcGVuQ2hhbmdlKT1cIm9uRHJvcGRvd25PcGVuQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDxkaXYgI2Ryb3Bkb3duRmllbGRUcmlnZ2VyUm9vdCBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fb3JpZ2luXCIgYXBwRHJvcGRvd25UcmlnZ2VyXG4gICAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9faW5wdXRcIlxuICAgICAgICAgIFtjbGFzcy5kcm9wZG93bi1zZWFyY2gtZmllbGRfX2lucHV0LS1sb2NrZWRdPVwiaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5XCIgW2lkXT1cImNvbnRyb2xJZFwiXG4gICAgICAgICAgW2F0dHIubmFtZV09XCJuYW1lIHx8IG51bGxcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbcmVhZG9ubHldPVwiaXNOYXRpdmVJbnB1dFJlYWRvbmx5XCIgW2F0dHIucGxhY2Vob2xkZXJdPVwiJydcIlxuICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW5cIiBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIiByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicGFuZWxPcGVuID8gb3B0aW9uc0xpc3RJZCA6IG51bGxcIiBbYXR0ci5hcmlhLWludmFsaWRdPVwidWlJbnZhbGlkXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInVpQXJpYURlc2NyaWJlZEJ5XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJmbG9hdExhYmVsQ2FwdGlvbiB8fCBwbGFjZWhvbGRlciB8fCAnQnVzY2FyIGUgc2VsZWNpb25hcidcIlxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hRdWVyeVwiIChpbnB1dCk9XCJvbk1haW5JbnB1dCgkZXZlbnQpXCIgKGtleWRvd24pPVwib25NYWluS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAoYmx1cik9XCJvbk1haW5CbHVyKCRldmVudClcIiAvPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fY2hldnJvbi1idG5cIiB0YWJpbmRleD1cIi0xXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCIgYXJpYS1sYWJlbD1cIkFicmlyIGxpc3RhXCIgKGNsaWNrKT1cIm9wZW5Ub2dnbGUoKVwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtY2hldnJvbi1kb3duIGRyb3Bkb3duLXNlYXJjaC1maWVsZF9fY2hldnJvbi1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYXBwLWRyb3Bkb3duLWJhc2U+XG4gIDwvZGl2PlxuPC9hcHAtYmFzZS1maWVsZD5cblxuPG5nLXRlbXBsYXRlICNvcHRpb25zUGFuZWxUcGw+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1zZWFyY2gtZmllbGRfX3BhbmVsLWlubmVyXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1zZWFyY2gtZmllbGRfX2xpc3RcIiBbaWRdPVwib3B0aW9uc0xpc3RJZFwiIHJvbGU9XCJsaXN0Ym94XCIgdGFiaW5kZXg9XCItMVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZsb2F0TGFiZWxDYXB0aW9uIHx8ICdPcMOnw7VlcydcIiAoYmx1cik9XCJvbk1haW5CbHVyKCRldmVudClcIlxuICAgICAgKGtleWRvd24pPVwib25TZWFyY2hMaXN0S2V5ZG93bigkZXZlbnQpXCIgKHNjcm9sbCk9XCJvbk9wdGlvbnNMaXN0U2Nyb2xsKCRldmVudClcIj5cbiAgICAgIEBpZiAobGlzdE9wdGlvbnMubGVuZ3RoID09PSAwICYmIChvcHRpb25zTG9hZGluZyB8fCBsb2FkaW5nTW9yZSkpIHtcbiAgICAgIDxhcHAtc2tlbGV0b24tbGlzdCBbcm93c109XCI4XCIgLz5cbiAgICAgIH1cbiAgICAgIEBmb3IgKG9wdCBvZiBsaXN0T3B0aW9uczsgdHJhY2sgdHJhY2tPcHRpb24oJGluZGV4LCBvcHQpKSB7XG4gICAgICA8ZGl2IHJvbGU9XCJvcHRpb25cIiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fb3B0aW9uXCJcbiAgICAgICAgW2NsYXNzLmRyb3Bkb3duLXNlYXJjaC1maWVsZF9fb3B0aW9uLS1kaXNhYmxlZF09XCJvcHQuZGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3MuZHJvcGRvd24tc2VhcmNoLWZpZWxkX19vcHRpb24tLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgIFtjbGFzcy5kcm9wZG93bi1zZWFyY2gtZmllbGRfX29wdGlvbi0tYWN0aXZlXT1cIiFvcHQuZGlzYWJsZWQgJiYgYWN0aXZlSW5kZXggPT09ICRpbmRleFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIm9wdC5kaXNhYmxlZCA/IG51bGwgOiAtMVwiIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHQpXCIgKGNsaWNrKT1cInNlbGVjdE9wdGlvbihvcHQpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25Sb3dLZXlkb3duKCRldmVudCwgb3B0KVwiPlxuICAgICAgICB7eyBvcHQubGFiZWwgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChvcHRpb25zLmxlbmd0aCA+IDAgJiYgbG9hZGluZ01vcmUpIHtcbiAgICAgIDxhcHAtc2tlbGV0b24tbGlzdCBbcm93c109XCIxXCIgW2xlYWRpbmddPVwiZmFsc2VcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=