@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0
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.
- package/core/constants/autocomplete.const.d.ts +4 -0
- package/core/constants/context-selector.const.d.ts +1 -0
- package/core/constants/gantt.const.d.ts +7 -0
- package/core/constants/hyperlink.const.d.ts +1 -0
- package/core/constants/inline-edit.const.d.ts +4 -0
- package/core/constants/kanban.const.d.ts +2 -0
- package/core/constants/pin-code-field.const.d.ts +5 -0
- package/core/constants/rating-scale.const.d.ts +1 -0
- package/core/constants/spotlight.const.d.ts +8 -0
- package/core/constants/star-rating.const.d.ts +4 -0
- package/core/constants/stepper.const.d.ts +1 -0
- package/core/constants/tiered-menu.const.d.ts +3 -0
- package/core/types/autocomplete.type.d.ts +9 -0
- package/core/types/chat.type.d.ts +12 -0
- package/core/types/checkbox-list.type.d.ts +12 -0
- package/core/types/gantt.type.d.ts +22 -0
- package/core/types/grid-menu.type.d.ts +13 -0
- package/core/types/hyperlink.type.d.ts +1 -0
- package/core/types/image-cropper.type.d.ts +20 -0
- package/core/types/inline-edit.type.d.ts +26 -0
- package/core/types/kanban.type.d.ts +36 -0
- package/core/types/panel.type.d.ts +16 -0
- package/core/types/profile-picture-picker.type.d.ts +9 -0
- package/core/types/rating-scale.type.d.ts +5 -0
- package/core/types/select-button.type.d.ts +1 -0
- package/core/types/spotlight.type.d.ts +34 -0
- package/core/types/star-rating.type.d.ts +1 -0
- package/core/types/stepper.type.d.ts +20 -0
- package/core/types/table-column.type.d.ts +3 -1
- package/core/types/table-options.type.d.ts +8 -2
- package/core/types/table.type.d.ts +1 -1
- package/core/types/tiered-menu.type.d.ts +16 -0
- package/core/types/tree.type.d.ts +25 -0
- package/core/types/workspace-switch.type.d.ts +6 -0
- package/core/utils/body-scroll.util.d.ts +2 -0
- package/core/utils/roving-focus.util.d.ts +2 -0
- package/core/utils/selection.util.d.ts +3 -0
- package/core/utils/tree.util.d.ts +4 -0
- package/esm2022/core/constants/autocomplete.const.mjs +5 -0
- package/esm2022/core/constants/context-selector.const.mjs +2 -0
- package/esm2022/core/constants/gantt.const.mjs +7 -0
- package/esm2022/core/constants/hyperlink.const.mjs +2 -1
- package/esm2022/core/constants/inline-edit.const.mjs +5 -0
- package/esm2022/core/constants/kanban.const.mjs +3 -0
- package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
- package/esm2022/core/constants/rating-scale.const.mjs +2 -0
- package/esm2022/core/constants/spotlight.const.mjs +9 -0
- package/esm2022/core/constants/star-rating.const.mjs +5 -0
- package/esm2022/core/constants/stepper.const.mjs +2 -0
- package/esm2022/core/constants/table.const.mjs +2 -2
- package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
- package/esm2022/core/types/autocomplete.type.mjs +2 -0
- package/esm2022/core/types/chat.type.mjs +2 -0
- package/esm2022/core/types/checkbox-list.type.mjs +2 -0
- package/esm2022/core/types/gantt.type.mjs +2 -0
- package/esm2022/core/types/grid-menu.type.mjs +2 -0
- package/esm2022/core/types/hyperlink.type.mjs +1 -1
- package/esm2022/core/types/image-cropper.type.mjs +2 -0
- package/esm2022/core/types/inline-edit.type.mjs +2 -0
- package/esm2022/core/types/kanban.type.mjs +2 -0
- package/esm2022/core/types/panel.type.mjs +9 -0
- package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
- package/esm2022/core/types/rating-scale.type.mjs +2 -0
- package/esm2022/core/types/select-button.type.mjs +1 -1
- package/esm2022/core/types/spotlight.type.mjs +2 -0
- package/esm2022/core/types/star-rating.type.mjs +2 -0
- package/esm2022/core/types/stepper.type.mjs +7 -0
- package/esm2022/core/types/table-column.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/types/tiered-menu.type.mjs +2 -0
- package/esm2022/core/types/tree.type.mjs +2 -0
- package/esm2022/core/types/workspace-switch.type.mjs +2 -0
- package/esm2022/core/utils/body-scroll.util.mjs +19 -0
- package/esm2022/core/utils/combobox.util.mjs +3 -2
- package/esm2022/core/utils/roving-focus.util.mjs +20 -0
- package/esm2022/core/utils/selection.util.mjs +13 -0
- package/esm2022/core/utils/string.util.mjs +8 -3
- package/esm2022/core/utils/tree.util.mjs +23 -0
- package/esm2022/features/accordion/accordion.component.mjs +2 -2
- package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
- package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
- package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2022/features/card-list/card/card.component.mjs +63 -99
- package/esm2022/features/chat/chat.component.mjs +126 -0
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
- package/esm2022/features/combobox/combobox.component.mjs +20 -8
- package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
- package/esm2022/features/filters/filters.component.mjs +1 -1
- package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
- package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
- package/esm2022/features/gantt/gantt.component.mjs +89 -0
- package/esm2022/features/gantt/gantt.engine.mjs +662 -0
- package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
- package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
- package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
- package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
- package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
- package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
- package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
- package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
- package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
- package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
- package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
- package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
- package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
- package/esm2022/features/kanban/kanban.component.mjs +198 -0
- package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
- package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
- package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
- package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
- package/esm2022/features/paginator/paginator.component.mjs +8 -3
- package/esm2022/features/panel/panel.component.mjs +43 -11
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
- package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
- package/esm2022/features/select-button/select-button.component.mjs +7 -4
- package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
- package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
- package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
- package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
- package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
- package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
- package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
- package/esm2022/features/stepper/stepper.component.mjs +86 -0
- package/esm2022/features/switch/switch.component.mjs +12 -8
- package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
- package/esm2022/features/tab/tab.component.mjs +4 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
- package/esm2022/features/table/table.component.mjs +220 -29
- package/esm2022/features/table/utils/table-data.util.mjs +71 -8
- package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
- package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
- package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
- package/esm2022/features/tree/tree.component.mjs +211 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
- package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
- package/esm2022/locales/en.json +351 -3
- package/esm2022/locales/es-CO.json +351 -3
- package/esm2022/locales/pt.json +351 -3
- package/esm2022/providers/features.provider.mjs +40 -4
- package/esm2022/public-api.mjs +56 -3
- package/features/accordion/accordion.component.d.ts +1 -1
- package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
- package/features/autocomplete/autocomplete.component.d.ts +102 -0
- package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
- package/features/card-list/card/card.component.d.ts +14 -34
- package/features/chat/chat.component.d.ts +31 -0
- package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
- package/features/combobox/combobox.component.d.ts +2 -1
- package/features/context-selector/context-selector.component.d.ts +37 -0
- package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
- package/features/gantt/gantt-date.utils.d.ts +36 -0
- package/features/gantt/gantt.component.d.ts +24 -0
- package/features/gantt/gantt.engine.d.ts +52 -0
- package/features/grid-menu/grid-menu.component.d.ts +29 -0
- package/features/hyperlink/hyperlink.component.d.ts +2 -1
- package/features/image-cropper/image-cropper.component.d.ts +43 -0
- package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
- package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
- package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
- package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
- package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
- package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
- package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
- package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
- package/features/inline-edit/inline-edit.component.d.ts +13 -0
- package/features/interactive-content/interactive-content.directive.d.ts +31 -0
- package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
- package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
- package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
- package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
- package/features/kanban/kanban.component.d.ts +32 -0
- package/features/kanban/services/kanban-event.service.d.ts +15 -0
- package/features/loading-state/loading-state.component.d.ts +0 -2
- package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
- package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
- package/features/panel/panel.component.d.ts +12 -3
- package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
- package/features/rating-scale/rating-scale.component.d.ts +24 -0
- package/features/select-button/select-button.component.d.ts +2 -1
- package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
- package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
- package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
- package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
- package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
- package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
- package/features/spotlight/spotlight.component.d.ts +59 -0
- package/features/star-rating/star-rating.component.d.ts +26 -0
- package/features/stepper/stepper.component.d.ts +23 -0
- package/features/switch/switch.component.d.ts +2 -1
- package/features/tab/tab.component.d.ts +1 -1
- package/features/table/components/table-cell-content.component.d.ts +4 -3
- package/features/table/table.component.d.ts +40 -5
- package/features/table/utils/table-data.util.d.ts +1 -0
- package/features/table/utils/table-layout.util.d.ts +1 -0
- package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
- package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
- package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
- package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
- package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
- package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
- package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
- package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
- package/features/tree/tree.component.d.ts +37 -0
- package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
- package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
- package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
- package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
- package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
- package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
- package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +72 -2
- package/src/locales/en.json +353 -15
- package/src/locales/es-CO.json +352 -14
- package/src/locales/pt.json +352 -14
- package/styles/sdc-global-variables.scss +1 -1
- package/styles.css +1 -1
- /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, forwardRef, inject } from '@angular/core';
|
|
3
|
+
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
5
|
+
import { Overlay, OverlayModule } from '@angular/cdk/overlay';
|
|
6
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
7
|
+
import { Subject, Subscription, debounceTime, distinctUntilChanged } from 'rxjs';
|
|
8
|
+
import { AUTOCOMPLETE_DEFAULT_DELAY, AUTOCOMPLETE_DEFAULT_EMPTY_MESSAGE_KEY, AUTOCOMPLETE_DEFAULT_MIN_LENGTH, AUTOCOMPLETE_DEFAULT_PLACEHOLDER_KEY } from '../../core/constants/autocomplete.const';
|
|
9
|
+
import { AutocompleteChipComponent } from './components/autocomplete-chip/autocomplete-chip.component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/common";
|
|
12
|
+
import * as i2 from "@angular/forms";
|
|
13
|
+
import * as i3 from "@angular/cdk/overlay";
|
|
14
|
+
import * as i4 from "@angular/cdk/scrolling";
|
|
15
|
+
import * as i5 from "@ngx-translate/core";
|
|
16
|
+
export class AutocompleteComponent {
|
|
17
|
+
static nextId = 0;
|
|
18
|
+
static allocateComponentId() {
|
|
19
|
+
const nextId = AutocompleteComponent.nextId;
|
|
20
|
+
AutocompleteComponent.nextId += 1;
|
|
21
|
+
return `sdc-autocomplete-${nextId}`;
|
|
22
|
+
}
|
|
23
|
+
cdr = inject(ChangeDetectorRef);
|
|
24
|
+
overlay = inject(Overlay);
|
|
25
|
+
inputSubject = new Subject();
|
|
26
|
+
lazyLoadSubject = new Subject();
|
|
27
|
+
subscriptions = new Subscription();
|
|
28
|
+
suggestions = [];
|
|
29
|
+
placeholder = AUTOCOMPLETE_DEFAULT_PLACEHOLDER_KEY;
|
|
30
|
+
suggestionValue;
|
|
31
|
+
suggestionLabel;
|
|
32
|
+
readonly = false;
|
|
33
|
+
emptyMessage = AUTOCOMPLETE_DEFAULT_EMPTY_MESSAGE_KEY;
|
|
34
|
+
delay = AUTOCOMPLETE_DEFAULT_DELAY;
|
|
35
|
+
invalid = false;
|
|
36
|
+
virtualScroll = false;
|
|
37
|
+
virtualScrollItemSize = 37;
|
|
38
|
+
lazy = false;
|
|
39
|
+
dropdown = false;
|
|
40
|
+
forceSelection = false;
|
|
41
|
+
checkmark = false;
|
|
42
|
+
multiple = false;
|
|
43
|
+
minLengthToSearch = AUTOCOMPLETE_DEFAULT_MIN_LENGTH;
|
|
44
|
+
inputClass = '';
|
|
45
|
+
dataKey;
|
|
46
|
+
disabled = false;
|
|
47
|
+
lazyLoad = new EventEmitter();
|
|
48
|
+
selected = new EventEmitter();
|
|
49
|
+
unselected = new EventEmitter();
|
|
50
|
+
blurred = new EventEmitter();
|
|
51
|
+
cleared = new EventEmitter();
|
|
52
|
+
keyUp = new EventEmitter();
|
|
53
|
+
focused = new EventEmitter();
|
|
54
|
+
completeMethod = new EventEmitter();
|
|
55
|
+
containerDiv;
|
|
56
|
+
inputEl;
|
|
57
|
+
componentId = AutocompleteComponent.allocateComponentId();
|
|
58
|
+
scrollStrategy = this.overlay.scrollStrategies.close();
|
|
59
|
+
overlayPositions = [
|
|
60
|
+
{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
|
|
61
|
+
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },
|
|
62
|
+
];
|
|
63
|
+
inputValue = '';
|
|
64
|
+
isOpen = false;
|
|
65
|
+
loading = false;
|
|
66
|
+
showEmptyMessage = false;
|
|
67
|
+
focusedIndex = -1;
|
|
68
|
+
filteredSuggestions = [];
|
|
69
|
+
value = null;
|
|
70
|
+
values = [];
|
|
71
|
+
onChange = () => { };
|
|
72
|
+
onTouched = () => { };
|
|
73
|
+
lazyRequestId = 0;
|
|
74
|
+
constructor() {
|
|
75
|
+
this.subscriptions.add(this.inputSubject.pipe(debounceTime(this.delay), distinctUntilChanged()).subscribe((query) => {
|
|
76
|
+
if (query.length < this.minLengthToSearch && query.length > 0) {
|
|
77
|
+
this.filteredSuggestions = [];
|
|
78
|
+
this.showEmptyMessage = false;
|
|
79
|
+
this.focusedIndex = -1;
|
|
80
|
+
this.cdr.markForCheck();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.refreshFilteredSuggestions(query);
|
|
84
|
+
if (!this.forceSelection && !this.multiple) {
|
|
85
|
+
this.onChange(query);
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
this.subscriptions.add(this.lazyLoadSubject.pipe(debounceTime(this.delay), distinctUntilChanged()).subscribe((query) => {
|
|
89
|
+
this.loading = true;
|
|
90
|
+
this.lazyRequestId += 1;
|
|
91
|
+
const requestId = this.lazyRequestId;
|
|
92
|
+
this.isOpen = true;
|
|
93
|
+
this.cdr.markForCheck();
|
|
94
|
+
this.lazyLoad.emit({
|
|
95
|
+
query,
|
|
96
|
+
response: (data) => {
|
|
97
|
+
if (requestId !== this.lazyRequestId) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.loading = false;
|
|
101
|
+
this.suggestions = data;
|
|
102
|
+
this.refreshFilteredSuggestions(query);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
ngOnChanges(changes) {
|
|
108
|
+
if (changes['suggestions'] && !this.lazy) {
|
|
109
|
+
this.refreshFilteredSuggestions(this.inputValue);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
ngOnDestroy() {
|
|
113
|
+
this.subscriptions.unsubscribe();
|
|
114
|
+
}
|
|
115
|
+
writeValue(value) {
|
|
116
|
+
if (this.multiple) {
|
|
117
|
+
this.values = this.normalizeMultipleValue(value);
|
|
118
|
+
this.inputValue = '';
|
|
119
|
+
this.value = null;
|
|
120
|
+
this.refreshFilteredSuggestions(this.inputValue);
|
|
121
|
+
this.cdr.markForCheck();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (Array.isArray(value)) {
|
|
125
|
+
throw new Error('Autocomplete value must not be an array when multiple is false.');
|
|
126
|
+
}
|
|
127
|
+
this.value = value ?? null;
|
|
128
|
+
this.inputValue = this.toDisplayValue(value ?? null);
|
|
129
|
+
this.refreshFilteredSuggestions(this.inputValue);
|
|
130
|
+
this.cdr.markForCheck();
|
|
131
|
+
}
|
|
132
|
+
registerOnChange(onChange) {
|
|
133
|
+
this.onChange = onChange;
|
|
134
|
+
}
|
|
135
|
+
registerOnTouched(onTouched) {
|
|
136
|
+
this.onTouched = onTouched;
|
|
137
|
+
}
|
|
138
|
+
setDisabledState(isDisabled) {
|
|
139
|
+
this.disabled = isDisabled;
|
|
140
|
+
this.cdr.markForCheck();
|
|
141
|
+
}
|
|
142
|
+
onInput(event) {
|
|
143
|
+
if (this.disabled || this.readonly) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const query = event.target.value ?? '';
|
|
147
|
+
this.inputValue = query;
|
|
148
|
+
this.onTouched();
|
|
149
|
+
if (this.lazy) {
|
|
150
|
+
this.lazyLoadSubject.next(query);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.completeMethod.emit({ query });
|
|
154
|
+
this.inputSubject.next(query);
|
|
155
|
+
this.isOpen = true;
|
|
156
|
+
this.cdr.markForCheck();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
onInputBlur(event) {
|
|
160
|
+
this.blurred.emit(event);
|
|
161
|
+
this.onTouched();
|
|
162
|
+
if (!this.forceSelection || this.multiple) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const match = this.findExactMatch(this.inputValue);
|
|
166
|
+
if (!match) {
|
|
167
|
+
this.inputValue = this.toDisplayValue(this.value);
|
|
168
|
+
this.cdr.markForCheck();
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
this.selectSuggestion(match.data);
|
|
172
|
+
}
|
|
173
|
+
onInputFocus(event) {
|
|
174
|
+
this.focused.emit(event);
|
|
175
|
+
}
|
|
176
|
+
onKeyDown(event) {
|
|
177
|
+
if (this.handleClosedPanelKeyDown(event)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
switch (event.key) {
|
|
181
|
+
case 'ArrowDown':
|
|
182
|
+
this.moveFocusBy(1, event);
|
|
183
|
+
return;
|
|
184
|
+
case 'ArrowUp':
|
|
185
|
+
this.moveFocusBy(-1, event);
|
|
186
|
+
return;
|
|
187
|
+
case 'Enter':
|
|
188
|
+
case 'Tab':
|
|
189
|
+
this.selectFocusedSuggestion(event);
|
|
190
|
+
return;
|
|
191
|
+
case 'Escape':
|
|
192
|
+
this.closeDropdownPanel();
|
|
193
|
+
return;
|
|
194
|
+
default:
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
onKeyUp(event) {
|
|
199
|
+
this.keyUp.emit(event);
|
|
200
|
+
}
|
|
201
|
+
onWindowResize() {
|
|
202
|
+
this.closeDropdownPanel();
|
|
203
|
+
}
|
|
204
|
+
selectSuggestion(suggestion) {
|
|
205
|
+
if (this.multiple) {
|
|
206
|
+
if (!this.values.some((value) => this.areSuggestionsEqual(value, suggestion))) {
|
|
207
|
+
this.values = [...this.values, suggestion];
|
|
208
|
+
this.onChange(this.values);
|
|
209
|
+
}
|
|
210
|
+
this.inputValue = '';
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
this.value = suggestion;
|
|
214
|
+
this.inputValue = this.toDisplayValue(suggestion);
|
|
215
|
+
this.onChange(this.getSuggestionResultValue(suggestion));
|
|
216
|
+
}
|
|
217
|
+
this.selected.emit(suggestion);
|
|
218
|
+
this.refreshFilteredSuggestions(this.inputValue);
|
|
219
|
+
this.closeDropdownPanel();
|
|
220
|
+
this.cdr.markForCheck();
|
|
221
|
+
}
|
|
222
|
+
clear() {
|
|
223
|
+
this.value = null;
|
|
224
|
+
this.values = [];
|
|
225
|
+
this.inputValue = '';
|
|
226
|
+
this.filteredSuggestions = [];
|
|
227
|
+
this.showEmptyMessage = false;
|
|
228
|
+
this.closeDropdownPanel();
|
|
229
|
+
this.onChange(this.multiple ? [] : null);
|
|
230
|
+
this.cleared.emit();
|
|
231
|
+
this.cdr.markForCheck();
|
|
232
|
+
}
|
|
233
|
+
toggleDropdown() {
|
|
234
|
+
if (this.disabled || this.readonly) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (this.isOpen) {
|
|
238
|
+
this.closeDropdownPanel();
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
this.openDropdownPanel();
|
|
242
|
+
}
|
|
243
|
+
removeSuggestion(suggestion) {
|
|
244
|
+
this.values = this.values.filter((value) => !this.areSuggestionsEqual(value, suggestion));
|
|
245
|
+
this.onChange(this.values);
|
|
246
|
+
this.unselected.emit(suggestion);
|
|
247
|
+
this.refreshFilteredSuggestions(this.inputValue);
|
|
248
|
+
this.cdr.markForCheck();
|
|
249
|
+
}
|
|
250
|
+
trackBySuggestionId(_, item) {
|
|
251
|
+
return item.id;
|
|
252
|
+
}
|
|
253
|
+
isSuggestionSelected(suggestion) {
|
|
254
|
+
return suggestion.isSelected === true;
|
|
255
|
+
}
|
|
256
|
+
get activeDescendantId() {
|
|
257
|
+
if (this.focusedIndex < 0) {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
return this.filteredSuggestions[this.focusedIndex]?.id ?? null;
|
|
261
|
+
}
|
|
262
|
+
openDropdownPanel() {
|
|
263
|
+
if (this.lazy) {
|
|
264
|
+
this.lazyLoadSubject.next(this.inputValue);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
this.refreshFilteredSuggestions(this.inputValue);
|
|
268
|
+
}
|
|
269
|
+
this.isOpen = true;
|
|
270
|
+
this.cdr.markForCheck();
|
|
271
|
+
}
|
|
272
|
+
closeDropdownPanel() {
|
|
273
|
+
this.isOpen = false;
|
|
274
|
+
this.focusedIndex = -1;
|
|
275
|
+
this.cdr.markForCheck();
|
|
276
|
+
}
|
|
277
|
+
refreshFilteredSuggestions(query) {
|
|
278
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
279
|
+
const allSuggestions = this.suggestions.map((suggestion) => this.wrapSuggestion(suggestion));
|
|
280
|
+
const filtered = this.filterSuggestionsByQuery(normalizedQuery, allSuggestions);
|
|
281
|
+
const selectedIds = new Set(this.values.map((value) => this.getSuggestionIdentity(value)));
|
|
282
|
+
this.filteredSuggestions = this.markSelectedSuggestions(filtered, selectedIds);
|
|
283
|
+
this.showEmptyMessage = this.filteredSuggestions.length === 0 && normalizedQuery.length >= 0;
|
|
284
|
+
this.focusedIndex = this.filteredSuggestions.length ? 0 : -1;
|
|
285
|
+
this.cdr.markForCheck();
|
|
286
|
+
}
|
|
287
|
+
filterSuggestionsByQuery(query, suggestions) {
|
|
288
|
+
return query
|
|
289
|
+
? suggestions.filter((suggestion) => this.toDisplayValue(suggestion.data).toLowerCase().includes(query))
|
|
290
|
+
: suggestions;
|
|
291
|
+
}
|
|
292
|
+
markSelectedSuggestions(suggestions, selectedIds) {
|
|
293
|
+
return suggestions.map((suggestion) => ({
|
|
294
|
+
...suggestion,
|
|
295
|
+
isSelected: selectedIds.has(suggestion.id)
|
|
296
|
+
}));
|
|
297
|
+
}
|
|
298
|
+
wrapSuggestion(suggestion) {
|
|
299
|
+
return {
|
|
300
|
+
data: suggestion,
|
|
301
|
+
id: this.getSuggestionIdentity(suggestion)
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
getSuggestionIdentity(suggestion) {
|
|
305
|
+
if (!suggestion || typeof suggestion !== 'object') {
|
|
306
|
+
return String(suggestion ?? '');
|
|
307
|
+
}
|
|
308
|
+
const objectSuggestion = suggestion;
|
|
309
|
+
const selectedKey = this.dataKey ?? this.suggestionValue;
|
|
310
|
+
if (selectedKey) {
|
|
311
|
+
const selectedValue = objectSuggestion[selectedKey];
|
|
312
|
+
return this.stringifyIdentityValue(selectedValue);
|
|
313
|
+
}
|
|
314
|
+
return JSON.stringify(suggestion);
|
|
315
|
+
}
|
|
316
|
+
stringifyIdentityValue(value) {
|
|
317
|
+
if (value == null) {
|
|
318
|
+
return '';
|
|
319
|
+
}
|
|
320
|
+
if (typeof value === 'object') {
|
|
321
|
+
return JSON.stringify(value);
|
|
322
|
+
}
|
|
323
|
+
if (typeof value === 'symbol') {
|
|
324
|
+
return value.description ?? '';
|
|
325
|
+
}
|
|
326
|
+
if (typeof value === 'function') {
|
|
327
|
+
return '';
|
|
328
|
+
}
|
|
329
|
+
if (typeof value === 'string') {
|
|
330
|
+
return value;
|
|
331
|
+
}
|
|
332
|
+
if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
|
|
333
|
+
return String(value);
|
|
334
|
+
}
|
|
335
|
+
return '';
|
|
336
|
+
}
|
|
337
|
+
handleClosedPanelKeyDown(event) {
|
|
338
|
+
if (this.isOpen && this.filteredSuggestions.length) {
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
if (event.key === 'ArrowDown' && !this.isOpen) {
|
|
342
|
+
this.openDropdownPanel();
|
|
343
|
+
}
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
moveFocusBy(step, event) {
|
|
347
|
+
event.preventDefault();
|
|
348
|
+
if (step > 0) {
|
|
349
|
+
this.focusedIndex = Math.min(this.focusedIndex + 1, this.filteredSuggestions.length - 1);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
this.focusedIndex = Math.max(this.focusedIndex - 1, 0);
|
|
353
|
+
}
|
|
354
|
+
this.scrollFocusedSuggestionIntoView();
|
|
355
|
+
this.cdr.markForCheck();
|
|
356
|
+
}
|
|
357
|
+
selectFocusedSuggestion(event) {
|
|
358
|
+
const activeSuggestion = this.filteredSuggestions[this.focusedIndex];
|
|
359
|
+
if (activeSuggestion) {
|
|
360
|
+
event.preventDefault();
|
|
361
|
+
this.selectSuggestion(activeSuggestion.data);
|
|
362
|
+
}
|
|
363
|
+
this.closeDropdownPanel();
|
|
364
|
+
}
|
|
365
|
+
getSuggestionResultValue(suggestion) {
|
|
366
|
+
if (!this.suggestionValue || !suggestion || typeof suggestion !== 'object') {
|
|
367
|
+
return suggestion;
|
|
368
|
+
}
|
|
369
|
+
return suggestion[this.suggestionValue];
|
|
370
|
+
}
|
|
371
|
+
toDisplayValue(value) {
|
|
372
|
+
if (value === null || value === undefined) {
|
|
373
|
+
return '';
|
|
374
|
+
}
|
|
375
|
+
if (typeof value === 'string') {
|
|
376
|
+
return value;
|
|
377
|
+
}
|
|
378
|
+
if (this.suggestionLabel && typeof value === 'object') {
|
|
379
|
+
return String(value[this.suggestionLabel] ?? '');
|
|
380
|
+
}
|
|
381
|
+
return String(value);
|
|
382
|
+
}
|
|
383
|
+
normalizeMultipleValue(value) {
|
|
384
|
+
if (Array.isArray(value)) {
|
|
385
|
+
return value.filter((entry) => typeof entry !== 'string');
|
|
386
|
+
}
|
|
387
|
+
if (value && typeof value !== 'string') {
|
|
388
|
+
return [value];
|
|
389
|
+
}
|
|
390
|
+
return [];
|
|
391
|
+
}
|
|
392
|
+
areSuggestionsEqual(left, right) {
|
|
393
|
+
return this.getSuggestionIdentity(left) === this.getSuggestionIdentity(right);
|
|
394
|
+
}
|
|
395
|
+
findExactMatch(query) {
|
|
396
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
397
|
+
return this.suggestions
|
|
398
|
+
.map((suggestion) => this.wrapSuggestion(suggestion))
|
|
399
|
+
.find((suggestion) => this.toDisplayValue(suggestion.data).toLowerCase() === normalizedQuery);
|
|
400
|
+
}
|
|
401
|
+
scrollFocusedSuggestionIntoView() {
|
|
402
|
+
queueMicrotask(() => {
|
|
403
|
+
const activeId = this.filteredSuggestions[this.focusedIndex]?.id;
|
|
404
|
+
if (!activeId) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
document.getElementById(activeId)?.scrollIntoView({ block: 'nearest' });
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
411
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "sdc-autocomplete", inputs: { suggestions: "suggestions", placeholder: "placeholder", suggestionValue: "suggestionValue", suggestionLabel: "suggestionLabel", readonly: "readonly", emptyMessage: "emptyMessage", delay: "delay", invalid: "invalid", virtualScroll: "virtualScroll", virtualScrollItemSize: "virtualScrollItemSize", lazy: "lazy", dropdown: "dropdown", forceSelection: "forceSelection", checkmark: "checkmark", multiple: "multiple", minLengthToSearch: "minLengthToSearch", inputClass: "inputClass", dataKey: "dataKey", disabled: "disabled" }, outputs: { lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen", "attr.aria-haspopup": "\"listbox\"" } }, providers: [
|
|
412
|
+
{
|
|
413
|
+
provide: NG_VALUE_ACCESSOR,
|
|
414
|
+
useExisting: forwardRef(() => AutocompleteComponent),
|
|
415
|
+
multi: true
|
|
416
|
+
}
|
|
417
|
+
], viewQueries: [{ propertyName: "containerDiv", first: true, predicate: ["containerDiv"], descendants: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"sdc-autocomplete\"\n [class.sdc-autocomplete--disabled]=\"disabled\"\n [class.sdc-autocomplete--invalid]=\"invalid\"\n [class.sdc-autocomplete--multiple]=\"multiple\"\n [ngClass]=\"inputClass\"\n>\n <div class=\"sdc-autocomplete__control\">\n @if (multiple && values.length > 0) {\n <div class=\"sdc-autocomplete__chips\">\n @for (suggestion of values; track suggestion) {\n <sdc-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></sdc-autocomplete-chip>\n }\n </div>\n }\n\n <input\n #inputEl\n [id]=\"componentId\"\n class=\"sdc-autocomplete__input\"\n type=\"text\"\n [attr.aria-label]=\"placeholder | translate\"\n [placeholder]=\"placeholder | translate\"\n [readOnly]=\"readonly\"\n [(ngModel)]=\"inputValue\"\n [disabled]=\"disabled\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"activeDescendantId\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyup)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading) {\n <span class=\"sdc-autocomplete__loader\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n </span>\n } @else if ((value || values.length > 0 || inputValue) && !disabled) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__clear\"\n tabindex=\"-1\"\n (click)=\"clear()\"\n >\n <i class=\"far fa-times\"></i>\n </button>\n }\n </div>\n\n @if (dropdown) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas\"\n [class.fa-caret-down]=\"!isOpen\"\n [class.fa-caret-up]=\"isOpen\"\n ></i>\n </button>\n }\n</div>\n\n@if ((showEmptyMessage || filteredSuggestions.length > 0) && !readonly) {\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closeDropdownPanel()\"\n (detach)=\"closeDropdownPanel()\"\n>\n <div\n class=\"sdc-autocomplete__panel\"\n [id]=\"'dropdown-container-' + componentId\"\n [style.width.px]=\"containerDiv?.offsetWidth ?? null\"\n >\n <ul\n class=\"sdc-autocomplete__list\"\n >\n @if (virtualScroll && filteredSuggestions.length > 10) {\n <cdk-virtual-scroll-viewport\n class=\"sdc-autocomplete__viewport\"\n [itemSize]=\"virtualScrollItemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"let suggestion of filteredSuggestions; let i = index; trackBy: trackBySuggestionId\"\n >\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n }\n }\n\n @if (showEmptyMessage) {\n <li class=\"sdc-autocomplete__empty\">{{ emptyMessage | translate }}</li>\n }\n </ul>\n </div>\n</ng-template>\n}\n", styles: [":host{display:block}.sdc-autocomplete{display:flex;align-items:stretch;width:100%;min-height:2.25rem;overflow:hidden;border:1px solid #c1c1cc;border-radius:.25rem;background:#fff}.sdc-autocomplete--invalid{border-color:#d9534f}.sdc-autocomplete--disabled{background:#f7f7f8;color:#999}.sdc-autocomplete__control{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;gap:.375rem;padding:.25rem .5rem}.sdc-autocomplete__chips{display:flex;flex-wrap:wrap;gap:.375rem}.sdc-autocomplete__input{flex:1 1 7rem;min-width:0;border:0;outline:none;background:transparent}.sdc-autocomplete__clear,.sdc-autocomplete__toggle{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;border:0;background:transparent;cursor:pointer;color:#666}.sdc-autocomplete__toggle{border-left:1px solid #e2e2e4}.sdc-autocomplete__loader{color:#428bca}.sdc-autocomplete__panel{margin-top:.25rem;overflow:hidden;border-radius:.25rem;background:#fff;box-shadow:0 .5rem 1.5rem #0000001f}.sdc-autocomplete__list{max-height:13rem;margin:0;padding:.25rem 0;overflow:auto;list-style:none}.sdc-autocomplete__viewport{height:13rem}.sdc-autocomplete__option,.sdc-autocomplete__empty{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;color:#444}.sdc-autocomplete__option{cursor:pointer}.sdc-autocomplete__option--focused{background:#f3f7fa}.sdc-autocomplete__option--selected{background:#e9f2f8}.sdc-autocomplete__empty{color:#777}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i3.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", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "component", type: AutocompleteChipComponent, selector: "sdc-autocomplete-chip", inputs: ["suggestion", "suggestionLabel"], outputs: ["suggestionRemoved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
418
|
+
}
|
|
419
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, decorators: [{
|
|
420
|
+
type: Component,
|
|
421
|
+
args: [{ selector: 'sdc-autocomplete', standalone: true, imports: [
|
|
422
|
+
CommonModule,
|
|
423
|
+
FormsModule,
|
|
424
|
+
OverlayModule,
|
|
425
|
+
ScrollingModule,
|
|
426
|
+
TranslateModule,
|
|
427
|
+
AutocompleteChipComponent
|
|
428
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
|
|
429
|
+
{
|
|
430
|
+
provide: NG_VALUE_ACCESSOR,
|
|
431
|
+
useExisting: forwardRef(() => AutocompleteComponent),
|
|
432
|
+
multi: true
|
|
433
|
+
}
|
|
434
|
+
], host: {
|
|
435
|
+
role: 'combobox',
|
|
436
|
+
'[attr.aria-expanded]': 'isOpen',
|
|
437
|
+
'[attr.aria-haspopup]': '"listbox"',
|
|
438
|
+
'(window:resize)': 'onWindowResize()'
|
|
439
|
+
}, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"sdc-autocomplete\"\n [class.sdc-autocomplete--disabled]=\"disabled\"\n [class.sdc-autocomplete--invalid]=\"invalid\"\n [class.sdc-autocomplete--multiple]=\"multiple\"\n [ngClass]=\"inputClass\"\n>\n <div class=\"sdc-autocomplete__control\">\n @if (multiple && values.length > 0) {\n <div class=\"sdc-autocomplete__chips\">\n @for (suggestion of values; track suggestion) {\n <sdc-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></sdc-autocomplete-chip>\n }\n </div>\n }\n\n <input\n #inputEl\n [id]=\"componentId\"\n class=\"sdc-autocomplete__input\"\n type=\"text\"\n [attr.aria-label]=\"placeholder | translate\"\n [placeholder]=\"placeholder | translate\"\n [readOnly]=\"readonly\"\n [(ngModel)]=\"inputValue\"\n [disabled]=\"disabled\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"activeDescendantId\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyup)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading) {\n <span class=\"sdc-autocomplete__loader\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n </span>\n } @else if ((value || values.length > 0 || inputValue) && !disabled) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__clear\"\n tabindex=\"-1\"\n (click)=\"clear()\"\n >\n <i class=\"far fa-times\"></i>\n </button>\n }\n </div>\n\n @if (dropdown) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas\"\n [class.fa-caret-down]=\"!isOpen\"\n [class.fa-caret-up]=\"isOpen\"\n ></i>\n </button>\n }\n</div>\n\n@if ((showEmptyMessage || filteredSuggestions.length > 0) && !readonly) {\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closeDropdownPanel()\"\n (detach)=\"closeDropdownPanel()\"\n>\n <div\n class=\"sdc-autocomplete__panel\"\n [id]=\"'dropdown-container-' + componentId\"\n [style.width.px]=\"containerDiv?.offsetWidth ?? null\"\n >\n <ul\n class=\"sdc-autocomplete__list\"\n >\n @if (virtualScroll && filteredSuggestions.length > 10) {\n <cdk-virtual-scroll-viewport\n class=\"sdc-autocomplete__viewport\"\n [itemSize]=\"virtualScrollItemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"let suggestion of filteredSuggestions; let i = index; trackBy: trackBySuggestionId\"\n >\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n }\n }\n\n @if (showEmptyMessage) {\n <li class=\"sdc-autocomplete__empty\">{{ emptyMessage | translate }}</li>\n }\n </ul>\n </div>\n</ng-template>\n}\n", styles: [":host{display:block}.sdc-autocomplete{display:flex;align-items:stretch;width:100%;min-height:2.25rem;overflow:hidden;border:1px solid #c1c1cc;border-radius:.25rem;background:#fff}.sdc-autocomplete--invalid{border-color:#d9534f}.sdc-autocomplete--disabled{background:#f7f7f8;color:#999}.sdc-autocomplete__control{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;gap:.375rem;padding:.25rem .5rem}.sdc-autocomplete__chips{display:flex;flex-wrap:wrap;gap:.375rem}.sdc-autocomplete__input{flex:1 1 7rem;min-width:0;border:0;outline:none;background:transparent}.sdc-autocomplete__clear,.sdc-autocomplete__toggle{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;border:0;background:transparent;cursor:pointer;color:#666}.sdc-autocomplete__toggle{border-left:1px solid #e2e2e4}.sdc-autocomplete__loader{color:#428bca}.sdc-autocomplete__panel{margin-top:.25rem;overflow:hidden;border-radius:.25rem;background:#fff;box-shadow:0 .5rem 1.5rem #0000001f}.sdc-autocomplete__list{max-height:13rem;margin:0;padding:.25rem 0;overflow:auto;list-style:none}.sdc-autocomplete__viewport{height:13rem}.sdc-autocomplete__option,.sdc-autocomplete__empty{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;color:#444}.sdc-autocomplete__option{cursor:pointer}.sdc-autocomplete__option--focused{background:#f3f7fa}.sdc-autocomplete__option--selected{background:#e9f2f8}.sdc-autocomplete__empty{color:#777}\n"] }]
|
|
440
|
+
}], ctorParameters: () => [], propDecorators: { suggestions: [{
|
|
441
|
+
type: Input
|
|
442
|
+
}], placeholder: [{
|
|
443
|
+
type: Input
|
|
444
|
+
}], suggestionValue: [{
|
|
445
|
+
type: Input
|
|
446
|
+
}], suggestionLabel: [{
|
|
447
|
+
type: Input
|
|
448
|
+
}], readonly: [{
|
|
449
|
+
type: Input
|
|
450
|
+
}], emptyMessage: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], delay: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], invalid: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], virtualScroll: [{
|
|
457
|
+
type: Input
|
|
458
|
+
}], virtualScrollItemSize: [{
|
|
459
|
+
type: Input
|
|
460
|
+
}], lazy: [{
|
|
461
|
+
type: Input
|
|
462
|
+
}], dropdown: [{
|
|
463
|
+
type: Input
|
|
464
|
+
}], forceSelection: [{
|
|
465
|
+
type: Input
|
|
466
|
+
}], checkmark: [{
|
|
467
|
+
type: Input
|
|
468
|
+
}], multiple: [{
|
|
469
|
+
type: Input
|
|
470
|
+
}], minLengthToSearch: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}], inputClass: [{
|
|
473
|
+
type: Input
|
|
474
|
+
}], dataKey: [{
|
|
475
|
+
type: Input
|
|
476
|
+
}], disabled: [{
|
|
477
|
+
type: Input
|
|
478
|
+
}], lazyLoad: [{
|
|
479
|
+
type: Output
|
|
480
|
+
}], selected: [{
|
|
481
|
+
type: Output
|
|
482
|
+
}], unselected: [{
|
|
483
|
+
type: Output
|
|
484
|
+
}], blurred: [{
|
|
485
|
+
type: Output
|
|
486
|
+
}], cleared: [{
|
|
487
|
+
type: Output
|
|
488
|
+
}], keyUp: [{
|
|
489
|
+
type: Output
|
|
490
|
+
}], focused: [{
|
|
491
|
+
type: Output
|
|
492
|
+
}], completeMethod: [{
|
|
493
|
+
type: Output
|
|
494
|
+
}], containerDiv: [{
|
|
495
|
+
type: ViewChild,
|
|
496
|
+
args: ['containerDiv']
|
|
497
|
+
}], inputEl: [{
|
|
498
|
+
type: ViewChild,
|
|
499
|
+
args: ['inputEl']
|
|
500
|
+
}] } });
|
|
501
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpGLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsc0NBQXNDLEVBQ3RDLCtCQUErQixFQUMvQixvQ0FBb0MsRUFDckMsTUFBTSx5Q0FBeUMsQ0FBQztBQU1qRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7Ozs7OztBQXFDdkcsTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVsQixN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SztzQkFBZCxNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFOEIsWUFBWTtzQkFBaEQsU0FBUzt1QkFBQyxjQUFjO2dCQUNPLE9BQU87c0JBQXRDLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB0eXBlIHsgQ29ubmVjdGVkUG9zaXRpb24sIFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgQVVUT0NPTVBMRVRFX0RFRkFVTFRfREVMQVksXG4gIEFVVE9DT01QTEVURV9ERUZBVUxUX0VNUFRZX01FU1NBR0VfS0VZLFxuICBBVVRPQ09NUExFVEVfREVGQVVMVF9NSU5fTEVOR1RILFxuICBBVVRPQ09NUExFVEVfREVGQVVMVF9QTEFDRUhPTERFUl9LRVlcbn0gZnJvbSAnLi4vLi4vY29yZS9jb25zdGFudHMvYXV0b2NvbXBsZXRlLmNvbnN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXV0b2NvbXBsZXRlQ29tcGxldGVFdmVudCxcbiAgQXV0b2NvbXBsZXRlTGF6eUxvYWRFdmVudCxcbiAgQXV0b2NvbXBsZXRlV3JpdGVWYWx1ZVxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2F1dG9jb21wbGV0ZS50eXBlJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZUNoaXBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlLWNoaXAvYXV0b2NvbXBsZXRlLWNoaXAuY29tcG9uZW50JztcblxudHlwZSBTdWdnZXN0aW9uV3JhcHBlcjxUPiA9IHtcbiAgZGF0YTogVDtcbiAgaWQ6IHN0cmluZztcbiAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtYXV0b2NvbXBsZXRlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBPdmVybGF5TW9kdWxlLFxuICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGhvc3Q6IHtcbiAgICByb2xlOiAnY29tYm9ib3gnLFxuICAgICdbYXR0ci5hcmlhLWV4cGFuZGVkXSc6ICdpc09wZW4nLFxuICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdcImxpc3Rib3hcIicsXG4gICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYWxsb2NhdGVDb21wb25lbnRJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5leHRJZCA9IEF1dG9jb21wbGV0ZUNvbXBvbmVudC5uZXh0SWQ7XG4gICAgQXV0b2NvbXBsZXRlQ29tcG9uZW50Lm5leHRJZCArPSAxO1xuICAgIHJldHVybiBgc2RjLWF1dG9jb21wbGV0ZS0ke25leHRJZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhenlMb2FkU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb25zOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSBBVVRPQ09NUExFVEVfREVGQVVMVF9QTEFDRUhPTERFUl9LRVk7XG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb25WYWx1ZT86IGtleW9mIFQ7XG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb25MYWJlbD86IGtleW9mIFQ7XG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVtcHR5TWVzc2FnZSA9IEFVVE9DT01QTEVURV9ERUZBVUxUX0VNUFRZX01FU1NBR0VfS0VZO1xuICBASW5wdXQoKSBkZWxheSA9IEFVVE9DT01QTEVURV9ERUZBVUxUX0RFTEFZO1xuICBASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcbiAgQElucHV0KCkgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gMzc7XG4gIEBJbnB1dCgpIGxhenkgPSBmYWxzZTtcbiAgQElucHV0KCkgZHJvcGRvd24gPSBmYWxzZTtcbiAgQElucHV0KCkgZm9yY2VTZWxlY3Rpb24gPSBmYWxzZTtcbiAgQElucHV0KCkgY2hlY2ttYXJrID0gZmFsc2U7XG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbkxlbmd0aFRvU2VhcmNoID0gQVVUT0NPTVBMRVRFX0RFRkFVTFRfTUlOX0xFTkdUSDtcbiAgQElucHV0KCkgaW5wdXRDbGFzcyA9ICcnO1xuICBASW5wdXQoKSBkYXRhS2V5Pzoga2V5b2YgVDtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgbGF6eUxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZUxhenlMb2FkRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHVuc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBrZXlVcCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNvbXBsZXRlTWV0aG9kID0gbmV3IEV2ZW50RW1pdHRlcjxBdXRvY29tcGxldGVDb21wbGV0ZUV2ZW50PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lckRpdicpIHByb3RlY3RlZCBjb250YWluZXJEaXY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnaW5wdXRFbCcpIHByb3RlY3RlZCBpbnB1dEVsPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29tcG9uZW50SWQgPSBBdXRvY29tcGxldGVDb21wb25lbnQuYWxsb2NhdGVDb21wb25lbnRJZCgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuY2xvc2UoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG92ZXJsYXlQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXG4gICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfSxcbiAgXTtcblxuICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZSA9ICcnO1xuICBwcm90ZWN0ZWQgaXNPcGVuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzaG93RW1wdHlNZXNzYWdlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBmb2N1c2VkSW5kZXggPSAtMTtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkU3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10gPSBbXTtcbiAgcHJvdGVjdGVkIHZhbHVlOiBUIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCB2YWx1ZXM6IFRbXSA9IFtdO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgbGF6eVJlcXVlc3RJZCA9IDA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuaW5wdXRTdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGlmIChxdWVyeS5sZW5ndGggPCB0aGlzLm1pbkxlbmd0aFRvU2VhcmNoICYmIHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2UgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleCA9IC0xO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkU3VnZ2VzdGlvbnMocXVlcnkpO1xuXG4gICAgICAgIGlmICghdGhpcy5mb3JjZVNlbGVjdGlvbiAmJiAhdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UocXVlcnkpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5sYXp5TG9hZFN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWxheSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgocXVlcnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sYXp5UmVxdWVzdElkICs9IDE7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMubGF6eVJlcXVlc3RJZDtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLmxhenlMb2FkLmVtaXQoe1xuICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIHJlc3BvbnNlOiAoZGF0YTogVFtdKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdElkICE9PSB0aGlzLmxhenlSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnMgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRTdWdnZXN0aW9ucyhxdWVyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3VnZ2VzdGlvbnMnXSAmJiAhdGhpcy5sYXp5KSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBBdXRvY29tcGxldGVXcml0ZVZhbHVlPFQ+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMudmFsdWVzID0gdGhpcy5ub3JtYWxpemVNdWx0aXBsZVZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXV0b2NvbXBsZXRlIHZhbHVlIG11c3Qgbm90IGJlIGFuIGFycmF5IHdoZW4gbXVsdGlwbGUgaXMgZmFsc2UuJyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlID8/IG51bGw7XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy50b0Rpc3BsYXlWYWx1ZSh2YWx1ZSA/PyBudWxsKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmlucHV0VmFsdWUgPSBxdWVyeTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5sYXp5TG9hZFN1YmplY3QubmV4dChxdWVyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tcGxldGVNZXRob2QuZW1pdCh7IHF1ZXJ5IH0pO1xuICAgICAgdGhpcy5pbnB1dFN1YmplY3QubmV4dChxdWVyeSk7XG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnB1dEJsdXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgICBpZiAoIXRoaXMuZm9yY2VTZWxlY3Rpb24gfHwgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5maW5kRXhhY3RNYXRjaCh0aGlzLmlucHV0VmFsdWUpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy50b0Rpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbihtYXRjaC5kYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbklucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZUNsb3NlZFBhbmVsS2V5RG93bihldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNCeSgxLCBldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLm1vdmVGb2N1c0J5KC0xLCBldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIHRoaXMuc2VsZWN0Rm9jdXNlZFN1Z2dlc3Rpb24oZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd25QYW5lbCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5VXAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5rZXlVcC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd25QYW5lbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWVzLnNvbWUoKHZhbHVlKSA9PiB0aGlzLmFyZVN1Z2dlc3Rpb25zRXF1YWwodmFsdWUsIHN1Z2dlc3Rpb24pKSkge1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi50aGlzLnZhbHVlcywgc3VnZ2VzdGlvbl07XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnRvRGlzcGxheVZhbHVlKHN1Z2dlc3Rpb24pO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldFN1Z2dlc3Rpb25SZXN1bHRWYWx1ZShzdWdnZXN0aW9uKSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkU3VnZ2VzdGlvbnModGhpcy5pbnB1dFZhbHVlKTtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd25QYW5lbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIHRoaXMudmFsdWVzID0gW107XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gW107XG4gICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duUGFuZWwoKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMubXVsdGlwbGUgPyBbXSA6IG51bGwpO1xuICAgIHRoaXMuY2xlYXJlZC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duUGFuZWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5Ecm9wZG93blBhbmVsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBUKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMgPSB0aGlzLnZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiAhdGhpcy5hcmVTdWdnZXN0aW9uc0VxdWFsKHZhbHVlLCBzdWdnZXN0aW9uKSk7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlcyk7XG4gICAgdGhpcy51bnNlbGVjdGVkLmVtaXQoc3VnZ2VzdGlvbik7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRTdWdnZXN0aW9ucyh0aGlzLmlucHV0VmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlTdWdnZXN0aW9uSWQoXzogbnVtYmVyLCBpdGVtOiBTdWdnZXN0aW9uV3JhcHBlcjxUPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdWdnZXN0aW9uU2VsZWN0ZWQoc3VnZ2VzdGlvbjogU3VnZ2VzdGlvbldyYXBwZXI8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VnZ2VzdGlvbi5pc1NlbGVjdGVkID09PSB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhY3RpdmVEZXNjZW5kYW50SWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9uc1t0aGlzLmZvY3VzZWRJbmRleF0/LmlkID8/IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3BlbkRyb3Bkb3duUGFuZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5sYXp5TG9hZFN1YmplY3QubmV4dCh0aGlzLmlucHV0VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsb3NlRHJvcGRvd25QYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBxdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBhbGxTdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiB0aGlzLndyYXBTdWdnZXN0aW9uKHN1Z2dlc3Rpb24pKTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyU3VnZ2VzdGlvbnNCeVF1ZXJ5KG5vcm1hbGl6ZWRRdWVyeSwgYWxsU3VnZ2VzdGlvbnMpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLnZhbHVlcy5tYXAoKHZhbHVlKSA9PiB0aGlzLmdldFN1Z2dlc3Rpb25JZGVudGl0eSh2YWx1ZSkpKTtcblxuICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHRoaXMubWFya1NlbGVjdGVkU3VnZ2VzdGlvbnMoZmlsdGVyZWQsIHNlbGVjdGVkSWRzKTtcbiAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2UgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoID09PSAwICYmIG5vcm1hbGl6ZWRRdWVyeS5sZW5ndGggPj0gMDtcbiAgICB0aGlzLmZvY3VzZWRJbmRleCA9IHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggPyAwIDogLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlclN1Z2dlc3Rpb25zQnlRdWVyeShxdWVyeTogc3RyaW5nLCBzdWdnZXN0aW9uczogU3VnZ2VzdGlvbldyYXBwZXI8VD5bXSk6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10ge1xuICAgIHJldHVybiBxdWVyeVxuICAgICAgPyBzdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+XG4gICAgICAgIHRoaXMudG9EaXNwbGF5VmFsdWUoc3VnZ2VzdGlvbi5kYXRhKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KVxuICAgICAgKVxuICAgICAgOiBzdWdnZXN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbWFya1NlbGVjdGVkU3VnZ2VzdGlvbnMoXG4gICAgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10sXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+XG4gICk6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10ge1xuICAgIHJldHVybiBzdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+ICh7XG4gICAgICAuLi5zdWdnZXN0aW9uLFxuICAgICAgaXNTZWxlY3RlZDogc2VsZWN0ZWRJZHMuaGFzKHN1Z2dlc3Rpb24uaWQpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBUKTogU3VnZ2VzdGlvbldyYXBwZXI8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBzdWdnZXN0aW9uLFxuICAgICAgaWQ6IHRoaXMuZ2V0U3VnZ2VzdGlvbklkZW50aXR5KHN1Z2dlc3Rpb24pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VnZ2VzdGlvbklkZW50aXR5KHN1Z2dlc3Rpb246IFQpOiBzdHJpbmcge1xuICAgIGlmICghc3VnZ2VzdGlvbiB8fCB0eXBlb2Ygc3VnZ2VzdGlvbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoc3VnZ2VzdGlvbiA/PyAnJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqZWN0U3VnZ2VzdGlvbiA9IHN1Z2dlc3Rpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgc2VsZWN0ZWRLZXkgPSB0aGlzLmRhdGFLZXkgPz8gdGhpcy5zdWdnZXN0aW9uVmFsdWU7XG5cbiAgICBpZiAoc2VsZWN0ZWRLZXkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBvYmplY3RTdWdnZXN0aW9uW3NlbGVjdGVkS2V5IGFzIHN0cmluZ107XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdpZnlJZGVudGl0eVZhbHVlKHNlbGVjdGVkVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdWdnZXN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RyaW5naWZ5SWRlbnRpdHlWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2xvc2VkUGFuZWxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiAhdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMub3BlbkRyb3Bkb3duUGFuZWwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzQnkoc3RlcDogMSB8IC0xLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoc3RlcCA+IDApIHtcbiAgICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gTWF0aC5taW4odGhpcy5mb2N1c2VkSW5kZXggKyAxLCB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gTWF0aC5tYXgodGhpcy5mb2N1c2VkSW5kZXggLSAxLCAwKTtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbEZvY3VzZWRTdWdnZXN0aW9uSW50b1ZpZXcoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0Rm9jdXNlZFN1Z2dlc3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVTdWdnZXN0aW9uID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zW3RoaXMuZm9jdXNlZEluZGV4XTtcblxuICAgIGlmIChhY3RpdmVTdWdnZXN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZWxlY3RTdWdnZXN0aW9uKGFjdGl2ZVN1Z2dlc3Rpb24uZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZURyb3Bkb3duUGFuZWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VnZ2VzdGlvblJlc3VsdFZhbHVlKHN1Z2dlc3Rpb246IFQpOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMuc3VnZ2VzdGlvblZhbHVlIHx8ICFzdWdnZXN0aW9uIHx8IHR5cGVvZiBzdWdnZXN0aW9uICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHN1Z2dlc3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWVdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvRGlzcGxheVZhbHVlKHZhbHVlOiBUIHwgc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25MYWJlbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlW3RoaXMuc3VnZ2VzdGlvbkxhYmVsXSA/PyAnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZU11bHRpcGxlVmFsdWUodmFsdWU6IEF1dG9jb21wbGV0ZVdyaXRlVmFsdWU8VD4pOiBUW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBUID0+IHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXJlU3VnZ2VzdGlvbnNFcXVhbChsZWZ0OiBULCByaWdodDogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFN1Z2dlc3Rpb25JZGVudGl0eShsZWZ0KSA9PT0gdGhpcy5nZXRTdWdnZXN0aW9uSWRlbnRpdHkocmlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRXhhY3RNYXRjaChxdWVyeTogc3RyaW5nKTogU3VnZ2VzdGlvbldyYXBwZXI8VD4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuc3VnZ2VzdGlvbnNcbiAgICAgIC5tYXAoKHN1Z2dlc3Rpb24pID0+IHRoaXMud3JhcFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbikpXG4gICAgICAuZmluZCgoc3VnZ2VzdGlvbikgPT4gdGhpcy50b0Rpc3BsYXlWYWx1ZShzdWdnZXN0aW9uLmRhdGEpLnRvTG93ZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWRRdWVyeSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEZvY3VzZWRTdWdnZXN0aW9uSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXhdPy5pZDtcblxuICAgICAgaWYgKCFhY3RpdmVJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZUlkKT8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJEaXZcbiAgY2RrT3ZlcmxheU9yaWdpblxuICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICBjbGFzcz1cInNkYy1hdXRvY29tcGxldGVcIlxuICBbY2xhc3Muc2RjLWF1dG9jb21wbGV0ZS0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbY2xhc3Muc2RjLWF1dG9jb21wbGV0ZS0taW52YWxpZF09XCJpbnZhbGlkXCJcbiAgW2NsYXNzLnNkYy1hdXRvY29tcGxldGUtLW11bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19jb250cm9sXCI+XG4gICAgQGlmIChtdWx0aXBsZSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19jaGlwc1wiPlxuICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiB2YWx1ZXM7IHRyYWNrIHN1Z2dlc3Rpb24pIHtcbiAgICAgIDxzZGMtYXV0b2NvbXBsZXRlLWNoaXBcbiAgICAgICAgW3N1Z2dlc3Rpb25dPVwic3VnZ2VzdGlvblwiXG4gICAgICAgIFtzdWdnZXN0aW9uTGFiZWxdPVwic3VnZ2VzdGlvbkxhYmVsXCJcbiAgICAgICAgKHN1Z2dlc3Rpb25SZW1vdmVkKT1cInJlbW92ZVN1Z2dlc3Rpb24oJGV2ZW50KVwiXG4gICAgICA+PC9zZGMtYXV0b2NvbXBsZXRlLWNoaXA+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRFbFxuICAgICAgW2lkXT1cImNvbXBvbmVudElkXCJcbiAgICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9faW5wdXRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgW3JlYWRPbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRWYWx1ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwibXVsdGlwbGUgPyAnbGlzdCcgOiAnYm90aCdcIlxuICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRJZFwiXG4gICAgICByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIEBpZiAobG9hZGluZykge1xuICAgIDxzcGFuIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fbG9hZGVyXCI+XG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXNwaW5cIj48L2k+XG4gICAgPC9zcGFuPlxuICAgIH0gQGVsc2UgaWYgKCh2YWx1ZSB8fCB2YWx1ZXMubGVuZ3RoID4gMCB8fCBpbnB1dFZhbHVlKSAmJiAhZGlzYWJsZWQpIHtcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fY2xlYXJcIlxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGltZXNcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cblxuICBAaWYgKGRyb3Bkb3duKSB7XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cInNkYy1hdXRvY29tcGxldGVfX3RvZ2dsZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiXG4gID5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgW2NsYXNzLmZhLWNhcmV0LWRvd25dPVwiIWlzT3BlblwiXG4gICAgICBbY2xhc3MuZmEtY2FyZXQtdXBdPVwiaXNPcGVuXCJcbiAgICA+PC9pPlxuICA8L2J1dHRvbj5cbiAgfVxuPC9kaXY+XG5cbkBpZiAoKHNob3dFbXB0eU1lc3NhZ2UgfHwgZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSAmJiAhcmVhZG9ubHkpIHtcbjxuZy10ZW1wbGF0ZVxuICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwib3ZlcmxheVBvc2l0aW9uc1wiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3ldPVwic2Nyb2xsU3RyYXRlZ3lcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVZpZXdwb3J0TWFyZ2luXT1cIjhcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgKGJhY2tkcm9wQ2xpY2spPVwiY2xvc2VEcm9wZG93blBhbmVsKClcIlxuICAoZGV0YWNoKT1cImNsb3NlRHJvcGRvd25QYW5lbCgpXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fcGFuZWxcIlxuICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRhaW5lckRpdj8ub2Zmc2V0V2lkdGggPz8gbnVsbFwiXG4gID5cbiAgICA8dWxcbiAgICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fbGlzdFwiXG4gICAgPlxuICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoID4gMTApIHtcbiAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX192aWV3cG9ydFwiXG4gICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemVcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgc3VnZ2VzdGlvbiBvZiBmaWx0ZXJlZFN1Z2dlc3Rpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5U3VnZ2VzdGlvbklkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgW2lkXT1cInN1Z2dlc3Rpb24uaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19vcHRpb25cIlxuICAgICAgICAgICAgW2NsYXNzLnNkYy1hdXRvY29tcGxldGVfX29wdGlvbi0tZm9jdXNlZF09XCJpID09PSBmb2N1c2VkSW5kZXhcIlxuICAgICAgICAgICAgW2NsYXNzLnNkYy1hdXRvY29tcGxldGVfX29wdGlvbi0tc2VsZWN0ZWRdPVwiaXNTdWdnZXN0aW9uU2VsZWN0ZWQoc3VnZ2VzdGlvbilcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24uZGF0YSlcIlxuICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwic2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uLmRhdGEpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKGNoZWNrbWFyayAmJiBtdWx0aXBsZSAmJiBpc1N1Z2dlc3Rpb25TZWxlY3RlZChzdWdnZXN0aW9uKSkge1xuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB7eyB0b0Rpc3BsYXlWYWx1ZShzdWdnZXN0aW9uLmRhdGEpIH19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBmaWx0ZXJlZFN1Z2dlc3Rpb25zOyB0cmFjayBzdWdnZXN0aW9uLmlkOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgPGxpXG4gICAgICAgIFtpZF09XCJzdWdnZXN0aW9uLmlkXCJcbiAgICAgICAgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19vcHRpb25cIlxuICAgICAgICBbY2xhc3Muc2RjLWF1dG9jb21wbGV0ZV9fb3B0aW9uLS1mb2N1c2VkXT1cImkgPT09IGZvY3VzZWRJbmRleFwiXG4gICAgICAgIFtjbGFzcy5zZGMtYXV0b2NvbXBsZXRlX19vcHRpb24tLXNlbGVjdGVkXT1cImlzU3VnZ2VzdGlvblNlbGVjdGVkKHN1Z2dlc3Rpb24pXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAoY2hlY2ttYXJrICYmIG11bHRpcGxlICYmIGlzU3VnZ2VzdGlvblNlbGVjdGVkKHN1Z2dlc3Rpb24pKSB7XG4gICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWNoZWNrXCI+PC9pPlxuICAgICAgICB9XG4gICAgICAgIHt7IHRvRGlzcGxheVZhbHVlKHN1Z2dlc3Rpb24uZGF0YSkgfX1cbiAgICAgIDwvbGk+XG4gICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd0VtcHR5TWVzc2FnZSkge1xuICAgICAgPGxpIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fZW1wdHlcIj57eyBlbXB0eU1lc3NhZ2UgfCB0cmFuc2xhdGUgfX08L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbn1cbiJdfQ==
|