@elderbyte/ngx-starter 18.9.0 → 18.10.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.
Files changed (22) hide show
  1. package/esm2022/lib/common/time/public_api.mjs +3 -1
  2. package/esm2022/lib/common/time/temporal-plain-date-interval.mjs +34 -0
  3. package/esm2022/lib/common/time/temporal-util.mjs +187 -0
  4. package/esm2022/lib/components/time/elder-interval-input/elder-interval-input.component.mjs +13 -4
  5. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.mjs +45 -0
  6. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.mjs +203 -0
  7. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +269 -0
  8. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.service.mjs +703 -0
  9. package/esm2022/lib/components/time/elder-time.module.mjs +22 -2
  10. package/fesm2022/elderbyte-ngx-starter.mjs +1790 -375
  11. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  12. package/lib/common/time/public_api.d.ts +2 -0
  13. package/lib/common/time/temporal-plain-date-interval.d.ts +15 -0
  14. package/lib/common/time/temporal-util.d.ts +34 -0
  15. package/lib/components/time/elder-interval-input/elder-interval-input.component.d.ts +4 -1
  16. package/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.d.ts +30 -0
  17. package/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +48 -0
  18. package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +73 -0
  19. package/lib/components/time/elder-interval-picker/elder-interval-picker.service.d.ts +130 -0
  20. package/lib/components/time/elder-time.module.d.ts +8 -2
  21. package/package.json +3 -2
  22. package/src/lib/components/time/elder-interval-picker/elder-interval-picker.component.scss +36 -0
@@ -0,0 +1,203 @@
1
+ import { ChangeDetectionStrategy, Component, input, Input, ViewChild } from '@angular/core';
2
+ import { MatIconButton } from '@angular/material/button';
3
+ import { MatFormField, MatLabel, MatSuffix, } from '@angular/material/form-field';
4
+ import { MatIcon } from '@angular/material/icon';
5
+ import { LoggerFactory } from '@elderbyte/ts-logger';
6
+ import { ElderOverlayOriginDirective } from '../../../../components/overlays/elder-overlay-origin.directive';
7
+ import { ElderOverlayTriggerDirective } from '../../../../components/overlays/elder-overlay-trigger.directive';
8
+ import { ElderOverlayComponent } from '../../../../components/overlays/elder-overlay.component';
9
+ import { ElderDialogPanelComponent } from '../../../../components/panels/elder-dialog-panel/elder-dialog-panel.component';
10
+ import { ElderIntervalInputComponent, } from '../../../../components/time/elder-interval-input/elder-interval-input.component';
11
+ import { ElderIntervalPickerComponent } from '../elder-interval-picker.component';
12
+ import * as i0 from "@angular/core";
13
+ export class ElderIntervalPickerToggleComponent {
14
+ constructor() {
15
+ /***************************************************************************
16
+ * *
17
+ * Fields *
18
+ * *
19
+ **************************************************************************/
20
+ this.log = LoggerFactory.getLogger(this.constructor.name);
21
+ this.isEmittingOnChange = true;
22
+ this.showAnchor = false;
23
+ this.isAnchorReadOnly = false;
24
+ this.isDisabledInput = false;
25
+ this.isResultTextVisible = true;
26
+ this.isHelpTextsVisible = false;
27
+ this.isOverlayCenteredToScreen = false;
28
+ this.inputAnchorDateTime = input(null);
29
+ this.inputInterval = null;
30
+ this.anchorDateTime = null;
31
+ this.intervalInputMode = 'date-range'; // will be overwritten by connected element after view init
32
+ this.isButtonDisabled = false;
33
+ }
34
+ /***************************************************************************
35
+ * *
36
+ * Life Cycle *
37
+ * *
38
+ **************************************************************************/
39
+ ngOnInit() { }
40
+ ngOnDestroy() {
41
+ this.inputIntervalElSubscription.unsubscribe();
42
+ }
43
+ ngAfterViewInit() {
44
+ if (this.intervalInputElement.disabled) {
45
+ this.isButtonDisabled = true;
46
+ }
47
+ if (this.isDisabledInput) {
48
+ this.isButtonDisabled = true;
49
+ }
50
+ this.inputIntervalElSubscription =
51
+ this.intervalInputElement.valueUpdated.subscribe((interval) => {
52
+ this.pullIntervalData();
53
+ });
54
+ this.intervalInputMode = this.intervalInputElement.mode;
55
+ if (this.intervalInputElement?.value) {
56
+ this.inputInterval = this.intervalInputElement.interval;
57
+ }
58
+ this.pullIntervalData();
59
+ }
60
+ /***************************************************************************
61
+ * *
62
+ * Public API *
63
+ * *
64
+ **************************************************************************/
65
+ handleOverlayAttachedChange(attached) {
66
+ if (this.isEmittingOnChange) {
67
+ return;
68
+ }
69
+ this.pullIntervalData();
70
+ }
71
+ updateIntervalInputElement(interval) {
72
+ this.intervalInputElement.value = interval;
73
+ }
74
+ pullIntervalData() {
75
+ if (!this.intervalInputElement) {
76
+ this.connectedIntervalPicker.svc.pullInputInterval();
77
+ return;
78
+ }
79
+ this.inputInterval = this.intervalInputElement.value;
80
+ this.connectedIntervalPicker.svc.setDateTimesFromElderInterval(this.inputInterval);
81
+ }
82
+ handleIntervalPickerDateChange(interval) {
83
+ this.inputInterval = interval;
84
+ if (this.intervalInputElement) {
85
+ this.updateIntervalInputElement(this.inputInterval);
86
+ }
87
+ }
88
+ registerInputComponent(inputComponent) {
89
+ this.intervalInputElement = inputComponent;
90
+ }
91
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
92
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.2", type: ElderIntervalPickerToggleComponent, isStandalone: true, selector: "elder-interval-picker-toggle", inputs: { intervalInputElement: { classPropertyName: "intervalInputElement", publicName: "intervalInputElement", isSignal: false, isRequired: false, transformFunction: null }, isEmittingOnChange: { classPropertyName: "isEmittingOnChange", publicName: "isEmittingOnChange", isSignal: false, isRequired: false, transformFunction: null }, showAnchor: { classPropertyName: "showAnchor", publicName: "showAnchor", isSignal: false, isRequired: false, transformFunction: null }, isAnchorReadOnly: { classPropertyName: "isAnchorReadOnly", publicName: "isAnchorReadOnly", isSignal: false, isRequired: false, transformFunction: null }, isDisabledInput: { classPropertyName: "isDisabledInput", publicName: "isDisabledInput", isSignal: false, isRequired: false, transformFunction: null }, isResultTextVisible: { classPropertyName: "isResultTextVisible", publicName: "isResultTextVisible", isSignal: false, isRequired: false, transformFunction: null }, isHelpTextsVisible: { classPropertyName: "isHelpTextsVisible", publicName: "isHelpTextsVisible", isSignal: false, isRequired: false, transformFunction: null }, isOverlayCenteredToScreen: { classPropertyName: "isOverlayCenteredToScreen", publicName: "isOverlayCenteredToScreen", isSignal: false, isRequired: false, transformFunction: null }, inputAnchorDateTime: { classPropertyName: "inputAnchorDateTime", publicName: "inputAnchorDateTime", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "connectedIntervalPicker", first: true, predicate: ["connectedIntervalPicker"], descendants: true }], ngImport: i0, template: `
93
+ <span style="padding-right: 8px">
94
+ <button
95
+ mat-icon-button
96
+ [elderOverlayOrigin]="dateIntervalOverlay"
97
+ [elderOverlayTrigger]="dateIntervalOverlay"
98
+ [disabled]="isButtonDisabled"
99
+ class="elder-control-icon-button mat-datepicker-toggle"
100
+ >
101
+ <mat-icon>date_range</mat-icon>
102
+ </button>
103
+ </span>
104
+
105
+ <elder-overlay
106
+ #dateIntervalOverlay
107
+ (attachedChange)="handleOverlayAttachedChange($event)"
108
+ >
109
+ <elder-dialog-panel>
110
+ <div class="pb-md pt-xs">
111
+ <elder-interval-picker
112
+ #connectedIntervalPicker
113
+ [intervalInputMode]="intervalInputMode"
114
+ [isEmittingOnChange]="isEmittingOnChange"
115
+ [inputInterval]="inputInterval"
116
+ (dateChange)="handleIntervalPickerDateChange($event)"
117
+ [showAnchor]="showAnchor"
118
+ [inputAnchorDateTime]="inputAnchorDateTime()"
119
+ [isAnchorReadOnly]="isAnchorReadOnly"
120
+ [isResultTextVisible]="isResultTextVisible"
121
+ [isHelpTextsVisible]="isHelpTextsVisible"
122
+ ></elder-interval-picker>
123
+ </div>
124
+ </elder-dialog-panel>
125
+ </elder-overlay>
126
+ `, isInline: true, dependencies: [{ kind: "component", type: ElderIntervalPickerComponent, selector: "elder-interval-picker", inputs: ["isEmittingOnChange", "intervalInputMode", "showAnchor", "isAnchorReadOnly", "isResultTextVisible", "isHelpTextsVisible", "inputInterval", "inputAnchorDateTime"], outputs: ["dateChange"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
127
+ }
128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ElderIntervalPickerToggleComponent, decorators: [{
129
+ type: Component,
130
+ args: [{
131
+ selector: 'elder-interval-picker-toggle',
132
+ standalone: true,
133
+ imports: [
134
+ ElderIntervalPickerComponent,
135
+ ElderIntervalInputComponent,
136
+ MatFormField,
137
+ MatLabel,
138
+ ElderOverlayComponent,
139
+ ElderDialogPanelComponent,
140
+ MatIcon,
141
+ MatIconButton,
142
+ MatSuffix,
143
+ ElderOverlayTriggerDirective,
144
+ ElderOverlayOriginDirective,
145
+ ],
146
+ template: `
147
+ <span style="padding-right: 8px">
148
+ <button
149
+ mat-icon-button
150
+ [elderOverlayOrigin]="dateIntervalOverlay"
151
+ [elderOverlayTrigger]="dateIntervalOverlay"
152
+ [disabled]="isButtonDisabled"
153
+ class="elder-control-icon-button mat-datepicker-toggle"
154
+ >
155
+ <mat-icon>date_range</mat-icon>
156
+ </button>
157
+ </span>
158
+
159
+ <elder-overlay
160
+ #dateIntervalOverlay
161
+ (attachedChange)="handleOverlayAttachedChange($event)"
162
+ >
163
+ <elder-dialog-panel>
164
+ <div class="pb-md pt-xs">
165
+ <elder-interval-picker
166
+ #connectedIntervalPicker
167
+ [intervalInputMode]="intervalInputMode"
168
+ [isEmittingOnChange]="isEmittingOnChange"
169
+ [inputInterval]="inputInterval"
170
+ (dateChange)="handleIntervalPickerDateChange($event)"
171
+ [showAnchor]="showAnchor"
172
+ [inputAnchorDateTime]="inputAnchorDateTime()"
173
+ [isAnchorReadOnly]="isAnchorReadOnly"
174
+ [isResultTextVisible]="isResultTextVisible"
175
+ [isHelpTextsVisible]="isHelpTextsVisible"
176
+ ></elder-interval-picker>
177
+ </div>
178
+ </elder-dialog-panel>
179
+ </elder-overlay>
180
+ `,
181
+ changeDetection: ChangeDetectionStrategy.OnPush,
182
+ }]
183
+ }], propDecorators: { connectedIntervalPicker: [{
184
+ type: ViewChild,
185
+ args: ['connectedIntervalPicker']
186
+ }], intervalInputElement: [{
187
+ type: Input
188
+ }], isEmittingOnChange: [{
189
+ type: Input
190
+ }], showAnchor: [{
191
+ type: Input
192
+ }], isAnchorReadOnly: [{
193
+ type: Input
194
+ }], isDisabledInput: [{
195
+ type: Input
196
+ }], isResultTextVisible: [{
197
+ type: Input
198
+ }], isHelpTextsVisible: [{
199
+ type: Input
200
+ }], isOverlayCenteredToScreen: [{
201
+ type: Input
202
+ }] } });
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL2VsZGVyLWludGVydmFsLXBpY2tlci10b2dnbGUvZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxZQUFZLEVBQ1osUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHckQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDN0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDL0csT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDaEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0VBQStFLENBQUM7QUFDMUgsT0FBTyxFQUNMLDJCQUEyQixHQUU1QixNQUFNLGlGQUFpRixDQUFDO0FBQ3pGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOztBQXVEbEYsTUFBTSxPQUFPLGtDQUFrQztJQXJEL0M7UUFzREU7Ozs7b0ZBSTRFO1FBRTNELFFBQUcsR0FB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QWMsQ0FBQztJQUM3QyxDQUFDOzhHQXZHVSxrQ0FBa0M7a0dBQWxDLGtDQUFrQyxpb0RBckNuQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDVCw0REE5Q0MsNEJBQTRCLHVRQUk1QixxQkFBcUIsOFJBQ3JCLHlCQUF5QiwrREFDekIsT0FBTywySUFDUCxhQUFhLDZGQUViLDRCQUE0Qiw0SkFDNUIsMkJBQTJCOzsyRkF1Q2xCLGtDQUFrQztrQkFyRDlDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDhCQUE4QjtvQkFDeEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCw0QkFBNEI7d0JBQzVCLDJCQUEyQjt3QkFDM0IsWUFBWTt3QkFDWixRQUFRO3dCQUNSLHFCQUFxQjt3QkFDckIseUJBQXlCO3dCQUN6QixPQUFPO3dCQUNQLGFBQWE7d0JBQ2IsU0FBUzt3QkFDVCw0QkFBNEI7d0JBQzVCLDJCQUEyQjtxQkFDNUI7b0JBQ0QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs4QkFXQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCO2dCQUczQixvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBpbnB1dCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtcbiAgTWF0Rm9ybUZpZWxkLFxuICBNYXRMYWJlbCxcbiAgTWF0U3VmZml4LFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEludGVydmFsIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL3RpbWUvaW50ZXJ2YWwnO1xuaW1wb3J0IHsgRWxkZXJPdmVybGF5T3JpZ2luRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9vdmVybGF5cy9lbGRlci1vdmVybGF5LW9yaWdpbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRWxkZXJPdmVybGF5VHJpZ2dlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvb3ZlcmxheXMvZWxkZXItb3ZlcmxheS10cmlnZ2VyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFbGRlck92ZXJsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL292ZXJsYXlzL2VsZGVyLW92ZXJsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IEVsZGVyRGlhbG9nUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL3BhbmVscy9lbGRlci1kaWFsb2ctcGFuZWwvZWxkZXItZGlhbG9nLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBFbGRlckludGVydmFsSW5wdXRDb21wb25lbnQsXG4gIEludGVydmFsSW5wdXRNb2RlLFxufSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtaW5wdXQvZWxkZXItaW50ZXJ2YWwtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEVsZGVySW50ZXJ2YWxQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9lbGRlci1pbnRlcnZhbC1waWNrZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBFbGRlckludGVydmFsUGlja2VyQ29tcG9uZW50LFxuICAgIEVsZGVySW50ZXJ2YWxJbnB1dENvbXBvbmVudCxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgRWxkZXJPdmVybGF5Q29tcG9uZW50LFxuICAgIEVsZGVyRGlhbG9nUGFuZWxDb21wb25lbnQsXG4gICAgTWF0SWNvbixcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE1hdFN1ZmZpeCxcbiAgICBFbGRlck92ZXJsYXlUcmlnZ2VyRGlyZWN0aXZlLFxuICAgIEVsZGVyT3ZlcmxheU9yaWdpbkRpcmVjdGl2ZSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDhweFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW2VsZGVyT3ZlcmxheU9yaWdpbl09XCJkYXRlSW50ZXJ2YWxPdmVybGF5XCJcbiAgICAgICAgW2VsZGVyT3ZlcmxheVRyaWdnZXJdPVwiZGF0ZUludGVydmFsT3ZlcmxheVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0J1dHRvbkRpc2FibGVkXCJcbiAgICAgICAgY2xhc3M9XCJlbGRlci1jb250cm9sLWljb24tYnV0dG9uIG1hdC1kYXRlcGlja2VyLXRvZ2dsZVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5kYXRlX3JhbmdlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvc3Bhbj5cblxuICAgIDxlbGRlci1vdmVybGF5XG4gICAgICAjZGF0ZUludGVydmFsT3ZlcmxheVxuICAgICAgKGF0dGFjaGVkQ2hhbmdlKT1cImhhbmRsZU92ZXJsYXlBdHRhY2hlZENoYW5nZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8ZWxkZXItZGlhbG9nLXBhbmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGItbWQgcHQteHNcIj5cbiAgICAgICAgICA8ZWxkZXItaW50ZXJ2YWwtcGlja2VyXG4gICAgICAgICAgICAjY29ubmVjdGVkSW50ZXJ2YWxQaWNrZXJcbiAgICAgICAgICAgIFtpbnRlcnZhbElucHV0TW9kZV09XCJpbnRlcnZhbElucHV0TW9kZVwiXG4gICAgICAgICAgICBbaXNFbWl0dGluZ09uQ2hhbmdlXT1cImlzRW1pdHRpbmdPbkNoYW5nZVwiXG4gICAgICAgICAgICBbaW5wdXRJbnRlcnZhbF09XCJpbnB1dEludGVydmFsXCJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImhhbmRsZUludGVydmFsUGlja2VyRGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzaG93QW5jaG9yXT1cInNob3dBbmNob3JcIlxuICAgICAgICAgICAgW2lucHV0QW5jaG9yRGF0ZVRpbWVdPVwiaW5wdXRBbmNob3JEYXRlVGltZSgpXCJcbiAgICAgICAgICAgIFtpc0FuY2hvclJlYWRPbmx5XT1cImlzQW5jaG9yUmVhZE9ubHlcIlxuICAgICAgICAgICAgW2lzUmVzdWx0VGV4dFZpc2libGVdPVwiaXNSZXN1bHRUZXh0VmlzaWJsZVwiXG4gICAgICAgICAgICBbaXNIZWxwVGV4dHNWaXNpYmxlXT1cImlzSGVscFRleHRzVmlzaWJsZVwiXG4gICAgICAgICAgPjwvZWxkZXItaW50ZXJ2YWwtcGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZWxkZXItZGlhbG9nLXBhbmVsPlxuICAgIDwvZWxkZXItb3ZlcmxheT5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEVsZGVySW50ZXJ2YWxQaWNrZXJUb2dnbGVDb21wb25lbnQge1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogRmllbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgQFZpZXdDaGlsZCgnY29ubmVjdGVkSW50ZXJ2YWxQaWNrZXInKVxuICBjb25uZWN0ZWRJbnRlcnZhbFBpY2tlciE6IEVsZGVySW50ZXJ2YWxQaWNrZXJDb21wb25lbnQ7XG5cbiAgQElucHV0KCkgaW50ZXJ2YWxJbnB1dEVsZW1lbnQ/OiBFbGRlckludGVydmFsSW5wdXRDb21wb25lbnQ7XG4gIEBJbnB1dCgpIGlzRW1pdHRpbmdPbkNoYW5nZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBbmNob3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNBbmNob3JSZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0Rpc2FibGVkSW5wdXQgPSBmYWxzZTtcbiAgQElucHV0KCkgaXNSZXN1bHRUZXh0VmlzaWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIGlzSGVscFRleHRzVmlzaWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBpc092ZXJsYXlDZW50ZXJlZFRvU2NyZWVuID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgaW5wdXRBbmNob3JEYXRlVGltZSA9IGlucHV0PERhdGU+KG51bGwpO1xuXG4gIGlucHV0SW50ZXJ2YWw6IEludGVydmFsID0gbnVsbDtcbiAgYW5jaG9yRGF0ZVRpbWU6IERhdGUgPSBudWxsO1xuICBpbnRlcnZhbElucHV0TW9kZTogSW50ZXJ2YWxJbnB1dE1vZGUgPSAnZGF0ZS1yYW5nZSc7IC8vIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgY29ubmVjdGVkIGVsZW1lbnQgYWZ0ZXIgdmlldyBpbml0XG4gIGlzQnV0dG9uRGlzYWJsZWQgPSBmYWxzZTtcblxuICBpbnB1dEludGVydmFsRWxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogTGlmZSBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEludGVydmFsRWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbElucHV0RWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pc0J1dHRvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkSW5wdXQpIHtcbiAgICAgIHRoaXMuaXNCdXR0b25EaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5pbnB1dEludGVydmFsRWxTdWJzY3JpcHRpb24gPVxuICAgICAgdGhpcy5pbnRlcnZhbElucHV0RWxlbWVudC52YWx1ZVVwZGF0ZWQuc3Vic2NyaWJlKChpbnRlcnZhbCkgPT4ge1xuICAgICAgICB0aGlzLnB1bGxJbnRlcnZhbERhdGEoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuaW50ZXJ2YWxJbnB1dE1vZGUgPSB0aGlzLmludGVydmFsSW5wdXRFbGVtZW50Lm1vZGU7XG5cbiAgICBpZiAodGhpcy5pbnRlcnZhbElucHV0RWxlbWVudD8udmFsdWUpIHtcbiAgICAgIHRoaXMuaW5wdXRJbnRlcnZhbCA9IHRoaXMuaW50ZXJ2YWxJbnB1dEVsZW1lbnQuaW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgdGhpcy5wdWxsSW50ZXJ2YWxEYXRhKCk7XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHVibGljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBoYW5kbGVPdmVybGF5QXR0YWNoZWRDaGFuZ2UoYXR0YWNoZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VtaXR0aW5nT25DaGFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wdWxsSW50ZXJ2YWxEYXRhKCk7XG4gIH1cblxuICB1cGRhdGVJbnRlcnZhbElucHV0RWxlbWVudChpbnRlcnZhbDogSW50ZXJ2YWwpOiB2b2lkIHtcbiAgICB0aGlzLmludGVydmFsSW5wdXRFbGVtZW50LnZhbHVlID0gaW50ZXJ2YWw7XG4gIH1cblxuICBwdWxsSW50ZXJ2YWxEYXRhKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnRlcnZhbElucHV0RWxlbWVudCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWRJbnRlcnZhbFBpY2tlci5zdmMucHVsbElucHV0SW50ZXJ2YWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0SW50ZXJ2YWwgPSB0aGlzLmludGVydmFsSW5wdXRFbGVtZW50IS52YWx1ZSBhcyBJbnRlcnZhbDtcbiAgICB0aGlzLmNvbm5lY3RlZEludGVydmFsUGlja2VyLnN2Yy5zZXREYXRlVGltZXNGcm9tRWxkZXJJbnRlcnZhbChcbiAgICAgIHRoaXMuaW5wdXRJbnRlcnZhbFxuICAgICk7XG4gIH1cblxuICBoYW5kbGVJbnRlcnZhbFBpY2tlckRhdGVDaGFuZ2UoaW50ZXJ2YWw6IEludGVydmFsKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEludGVydmFsID0gaW50ZXJ2YWw7XG5cbiAgICBpZiAodGhpcy5pbnRlcnZhbElucHV0RWxlbWVudCkge1xuICAgICAgdGhpcy51cGRhdGVJbnRlcnZhbElucHV0RWxlbWVudCh0aGlzLmlucHV0SW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVySW5wdXRDb21wb25lbnQoaW5wdXRDb21wb25lbnQ6IEVsZGVySW50ZXJ2YWxJbnB1dENvbXBvbmVudCkge1xuICAgIHRoaXMuaW50ZXJ2YWxJbnB1dEVsZW1lbnQgPSBpbnB1dENvbXBvbmVudDtcbiAgfVxufVxuIl19