@openmrs/ngx-formentry 19.0.1-pre.492 → 19.0.1-pre.504
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/components/input/label.component.d.ts +1 -1
- package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +1 -1
- package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +1 -1
- package/components/number-input/number-input.component.d.ts +1 -1
- package/components/select/select.component.d.ts +1 -1
- package/fesm2022/openmrs-ngx-formentry.mjs +364 -346
- package/fesm2022/openmrs-ngx-formentry.mjs.map +1 -1
- package/form-entry/helpers/js-expression-helper.d.ts +1 -1
- package/package.json +15 -16
- package/esm2022/abstract-controls-extension/afe-control-type.mjs +0 -8
- package/esm2022/abstract-controls-extension/afe-form-array.mjs +0 -89
- package/esm2022/abstract-controls-extension/afe-form-control.mjs +0 -91
- package/esm2022/abstract-controls-extension/afe-form-group.mjs +0 -66
- package/esm2022/abstract-controls-extension/control-extensions.mjs +0 -5
- package/esm2022/abstract-controls-extension/index.mjs +0 -5
- package/esm2022/abstract-controls-extension/value-change.listener.mjs +0 -2
- package/esm2022/change-tracking/control-relation.mjs +0 -42
- package/esm2022/change-tracking/control-relations.mjs +0 -32
- package/esm2022/components/afe-ng-select.component.mjs +0 -101
- package/esm2022/components/appointments-overview/appointments-overview.component.mjs +0 -116
- package/esm2022/components/check-box/checkbox.component.mjs +0 -110
- package/esm2022/components/check-box/checkbox.module.mjs +0 -19
- package/esm2022/components/custom-component-wrapper/custom-component-wrapper.component.mjs +0 -21
- package/esm2022/components/custom-component-wrapper/custom-component-wrapper.module.mjs +0 -22
- package/esm2022/components/custom-control-wrapper/custom-control-wrapper.component.mjs +0 -68
- package/esm2022/components/custom-control-wrapper/custom-control-wrapper.module.mjs +0 -23
- package/esm2022/components/date-time-picker/date-picker/date-picker.component.mjs +0 -188
- package/esm2022/components/date-time-picker/date-time-picker.component.mjs +0 -115
- package/esm2022/components/date-time-picker/date-time-picker.module.mjs +0 -48
- package/esm2022/components/date-time-picker/index.mjs +0 -9
- package/esm2022/components/date-time-picker/picker-modal/modal.component.mjs +0 -25
- package/esm2022/components/date-time-picker/pipes/moment.pipe.mjs +0 -17
- package/esm2022/components/date-time-picker/time-picker/time-picker.component.mjs +0 -121
- package/esm2022/components/file-upload/file-upload.component.mjs +0 -109
- package/esm2022/components/file-upload/file-upload.module.mjs +0 -37
- package/esm2022/components/file-upload/secure.pipe.mjs +0 -101
- package/esm2022/components/input/input.directive.mjs +0 -78
- package/esm2022/components/input/input.module.mjs +0 -23
- package/esm2022/components/input/label.component.mjs +0 -263
- package/esm2022/components/input/text-area.directive.mjs +0 -58
- package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.component.mjs +0 -87
- package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.module.mjs +0 -40
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.mjs +0 -114
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.mjs +0 -7
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.mjs +0 -347
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.mjs +0 -16
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.mjs +0 -39
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-body.component.mjs +0 -142
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs +0 -439
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.mjs +0 -373
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.mjs +0 -367
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar.component.mjs +0 -342
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.mjs +0 -259
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.mjs +0 -392
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.mjs +0 -614
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.mjs +0 -65
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.mjs +0 -21
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.mjs +0 -522
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.class.mjs +0 -166
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.module.mjs +0 -97
- package/esm2022/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.mjs +0 -28
- package/esm2022/components/ngx-pick-datetime/lib/date-time/timer-box.component.mjs +0 -90
- package/esm2022/components/ngx-pick-datetime/lib/date-time/timer.component.mjs +0 -292
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-config.class.mjs +0 -56
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-container.component.mjs +0 -243
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.mjs +0 -119
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.module.mjs +0 -26
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.service.mjs +0 -233
- package/esm2022/components/ngx-pick-datetime/lib/utils/index.mjs +0 -5
- package/esm2022/components/ngx-pick-datetime/lib/utils/object.utils.mjs +0 -26
- package/esm2022/components/ngx-remote-select/ngx-remote-select.component.mjs +0 -151
- package/esm2022/components/ngx-remote-select/ngx-remote-select.module.mjs +0 -22
- package/esm2022/components/ngx-tabset/components/ngx-tab-set.component.mjs +0 -74
- package/esm2022/components/ngx-tabset/components/tab.component.mjs +0 -33
- package/esm2022/components/ngx-tabset/directives/hover-class.directive.mjs +0 -30
- package/esm2022/components/ngx-tabset/modules/ngx-tabset.module.mjs +0 -38
- package/esm2022/components/number-input/number-input.component.mjs +0 -254
- package/esm2022/components/number-input/number-input.module.mjs +0 -21
- package/esm2022/components/number-input/number.directive.mjs +0 -22
- package/esm2022/components/radio-button/radio.component.mjs +0 -98
- package/esm2022/components/radio-button/radio.module.mjs +0 -19
- package/esm2022/components/select/optgroup.directive.mjs +0 -19
- package/esm2022/components/select/option.directive.mjs +0 -19
- package/esm2022/components/select/select.component.mjs +0 -182
- package/esm2022/components/select/select.module.mjs +0 -23
- package/esm2022/components/workspace-launcher/workspace-launcher.component.mjs +0 -26
- package/esm2022/components/workspace-launcher/workspace-launcher.module.mjs +0 -19
- package/esm2022/form-entry/control-alerts/alert-helpers.mjs +0 -40
- package/esm2022/form-entry/control-alerts/can-generate-alert.mjs +0 -2
- package/esm2022/form-entry/control-calculators/can-calculate.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/can-disable.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/can-hide.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/disabler-helper.mjs +0 -32
- package/esm2022/form-entry/control-hiders-disablers/hider-helpers.mjs +0 -41
- package/esm2022/form-entry/data-sources/data-sources.mjs +0 -30
- package/esm2022/form-entry/data-sources/dummy-data-source.mjs +0 -104
- package/esm2022/form-entry/directives/collapse-animations.mjs +0 -11
- package/esm2022/form-entry/directives/collapse.directive.mjs +0 -172
- package/esm2022/form-entry/directives/historical-value.directive.mjs +0 -68
- package/esm2022/form-entry/error-renderer/error-renderer.component.mjs +0 -53
- package/esm2022/form-entry/expression-runner/expression-runner.mjs +0 -170
- package/esm2022/form-entry/form-entry.module.mjs +0 -188
- package/esm2022/form-entry/form-factory/control-relations.factory.mjs +0 -238
- package/esm2022/form-entry/form-factory/form-control.service.mjs +0 -118
- package/esm2022/form-entry/form-factory/form-node.mjs +0 -99
- package/esm2022/form-entry/form-factory/form.factory.mjs +0 -143
- package/esm2022/form-entry/form-factory/form.mjs +0 -190
- package/esm2022/form-entry/form-factory/hiders-disablers.factory.mjs +0 -68
- package/esm2022/form-entry/form-factory/index.mjs +0 -7
- package/esm2022/form-entry/form-factory/question.factory.mjs +0 -1123
- package/esm2022/form-entry/form-factory/show-messages.factory.mjs +0 -31
- package/esm2022/form-entry/form-factory/validation.factory.mjs +0 -182
- package/esm2022/form-entry/form-renderer/form-renderer.component.mjs +0 -277
- package/esm2022/form-entry/helpers/historical-expression-helper-service.mjs +0 -42
- package/esm2022/form-entry/helpers/historical-field-helper-service.mjs +0 -39
- package/esm2022/form-entry/helpers/js-expression-helper.mjs +0 -322
- package/esm2022/form-entry/helpers/risk-dataset-table.mjs +0 -247
- package/esm2022/form-entry/pipes/time-ago.pipe.mjs +0 -110
- package/esm2022/form-entry/question-models/checkbox.model.mjs +0 -11
- package/esm2022/form-entry/question-models/conditional-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/custom-control-question.model.mjs +0 -10
- package/esm2022/form-entry/question-models/date-question.mjs +0 -12
- package/esm2022/form-entry/question-models/date-validation.model.mjs +0 -10
- package/esm2022/form-entry/question-models/decimal-validation.model.mjs +0 -19
- package/esm2022/form-entry/question-models/diagnosis-question.mjs +0 -12
- package/esm2022/form-entry/question-models/disallow-decimals-validation.model.mjs +0 -18
- package/esm2022/form-entry/question-models/file-upload-question.mjs +0 -13
- package/esm2022/form-entry/question-models/group-question.mjs +0 -12
- package/esm2022/form-entry/question-models/index.mjs +0 -24
- package/esm2022/form-entry/question-models/interfaces/base-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/checkbox-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/data-source.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/date-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/diagnosis-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/file-upload-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/group-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/multi-select-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/nested-questions.mjs +0 -7
- package/esm2022/form-entry/question-models/interfaces/radio-button-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/remote-select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/repeating-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/select-option.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/test-order-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/text-area-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/text-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/ui-select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/workspace-launcher-options.mjs +0 -2
- package/esm2022/form-entry/question-models/js-expression-validation.model.mjs +0 -8
- package/esm2022/form-entry/question-models/max-length-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/max-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/min-length-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/min-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/models.mjs +0 -13
- package/esm2022/form-entry/question-models/multi-select-question.mjs +0 -11
- package/esm2022/form-entry/question-models/pair.model.mjs +0 -7
- package/esm2022/form-entry/question-models/question-base.mjs +0 -26
- package/esm2022/form-entry/question-models/radio-button.model.mjs +0 -12
- package/esm2022/form-entry/question-models/remote-select-question.mjs +0 -12
- package/esm2022/form-entry/question-models/rendering-type.mjs +0 -9
- package/esm2022/form-entry/question-models/repeating-question.mjs +0 -11
- package/esm2022/form-entry/question-models/select-option.mjs +0 -7
- package/esm2022/form-entry/question-models/select-question.mjs +0 -12
- package/esm2022/form-entry/question-models/test-order-question.mjs +0 -15
- package/esm2022/form-entry/question-models/text-area-input-question.mjs +0 -13
- package/esm2022/form-entry/question-models/text-input-question.mjs +0 -10
- package/esm2022/form-entry/question-models/ui-select-question.mjs +0 -11
- package/esm2022/form-entry/question-models/validation.model.mjs +0 -7
- package/esm2022/form-entry/question-models/workspace-launcher.model.mjs +0 -15
- package/esm2022/form-entry/services/debug-mode.service.mjs +0 -24
- package/esm2022/form-entry/services/form-errors.service.mjs +0 -21
- package/esm2022/form-entry/services/form-schema-compiler.service.mjs +0 -262
- package/esm2022/form-entry/services/historical-encounter-data.service.mjs +0 -172
- package/esm2022/form-entry/validators/conditional-answered.validator.mjs +0 -46
- package/esm2022/form-entry/validators/conditional-required.validator.mjs +0 -40
- package/esm2022/form-entry/validators/date.validator.mjs +0 -18
- package/esm2022/form-entry/validators/disallow-decimals.validator.mjs +0 -15
- package/esm2022/form-entry/validators/future-date-restriction.validator.mjs +0 -21
- package/esm2022/form-entry/validators/js-expression.validator.mjs +0 -26
- package/esm2022/form-entry/validators/max-date.validator.mjs +0 -23
- package/esm2022/form-entry/validators/max-length.validator.mjs +0 -17
- package/esm2022/form-entry/validators/max.validator.mjs +0 -21
- package/esm2022/form-entry/validators/min-date.validator.mjs +0 -23
- package/esm2022/form-entry/validators/min-length.validator.mjs +0 -17
- package/esm2022/form-entry/validators/min.validator.mjs +0 -21
- package/esm2022/form-entry/validators/required.validator.mjs +0 -11
- package/esm2022/form-entry/validators/validations.mjs +0 -5
- package/esm2022/form-entry/value-adapters/diagnosis.adapter.mjs +0 -241
- package/esm2022/form-entry/value-adapters/encounter.adapter.mjs +0 -190
- package/esm2022/form-entry/value-adapters/obs-adapter-helper.mjs +0 -559
- package/esm2022/form-entry/value-adapters/obs.adapter.mjs +0 -541
- package/esm2022/form-entry/value-adapters/order.adapter.mjs +0 -186
- package/esm2022/form-entry/value-adapters/patient-identifier.adapter.mjs +0 -77
- package/esm2022/form-entry/value-adapters/person-attribute.adapter.mjs +0 -88
- package/esm2022/form-entry/value-adapters/value.adapter.mjs +0 -2
- package/esm2022/lib/index.mjs +0 -59
- package/esm2022/openmrs-ngx-formentry.mjs +0 -5
- package/esm2022/public_api.mjs +0 -2
- package/esm2022/shared.module.mjs +0 -21
|
@@ -1,522 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, InjectionToken, Input, NgZone, Optional, Output, ViewContainerRef } from '@angular/core';
|
|
2
|
-
import { DOCUMENT } from '@angular/common';
|
|
3
|
-
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
|
-
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
|
|
5
|
-
import { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';
|
|
6
|
-
import { coerceArray, coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
7
|
-
import { merge, Subscription } from 'rxjs';
|
|
8
|
-
import { filter, take } from 'rxjs/operators';
|
|
9
|
-
import { OwlDateTimeContainerComponent } from './date-time-picker-container.component';
|
|
10
|
-
import { DateTimeAdapter } from './adapter/date-time-adapter.class';
|
|
11
|
-
import { OWL_DATE_TIME_FORMATS } from './adapter/date-time-format.class';
|
|
12
|
-
import { OwlDateTime } from './date-time.class';
|
|
13
|
-
import { OwlDialogService } from '../dialog/dialog.service';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@angular/cdk/overlay";
|
|
16
|
-
import * as i2 from "../dialog/dialog.service";
|
|
17
|
-
import * as i3 from "./adapter/date-time-adapter.class";
|
|
18
|
-
/** Injection token that determines the scroll handling while the dtPicker is open. */
|
|
19
|
-
export const OWL_DTPICKER_SCROLL_STRATEGY = new InjectionToken('owl-dtpicker-scroll-strategy');
|
|
20
|
-
/** @docs-private */
|
|
21
|
-
export function OWL_DTPICKER_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {
|
|
22
|
-
const fn = () => overlay.scrollStrategies.block();
|
|
23
|
-
return fn;
|
|
24
|
-
}
|
|
25
|
-
/** @docs-private */
|
|
26
|
-
export const OWL_DTPICKER_SCROLL_STRATEGY_PROVIDER = {
|
|
27
|
-
provide: OWL_DTPICKER_SCROLL_STRATEGY,
|
|
28
|
-
deps: [Overlay],
|
|
29
|
-
useFactory: OWL_DTPICKER_SCROLL_STRATEGY_PROVIDER_FACTORY
|
|
30
|
-
};
|
|
31
|
-
export class OwlDateTimeComponent extends OwlDateTime {
|
|
32
|
-
get startAt() {
|
|
33
|
-
// If an explicit startAt is set we start there, otherwise we start at whatever the currently
|
|
34
|
-
// selected value is.
|
|
35
|
-
if (this._startAt) {
|
|
36
|
-
return this._startAt;
|
|
37
|
-
}
|
|
38
|
-
if (this._dtInput) {
|
|
39
|
-
if (this._dtInput.selectMode === 'single') {
|
|
40
|
-
return this._dtInput.value || null;
|
|
41
|
-
}
|
|
42
|
-
else if (this._dtInput.selectMode === 'range' ||
|
|
43
|
-
this._dtInput.selectMode === 'rangeFrom') {
|
|
44
|
-
return this._dtInput.values[0] || null;
|
|
45
|
-
}
|
|
46
|
-
else if (this._dtInput.selectMode === 'rangeTo') {
|
|
47
|
-
return this._dtInput.values[1] || null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
set startAt(date) {
|
|
55
|
-
this._startAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
|
|
56
|
-
}
|
|
57
|
-
get pickerType() {
|
|
58
|
-
return this._pickerType;
|
|
59
|
-
}
|
|
60
|
-
set pickerType(val) {
|
|
61
|
-
if (val !== this._pickerType) {
|
|
62
|
-
this._pickerType = val;
|
|
63
|
-
if (this._dtInput) {
|
|
64
|
-
this._dtInput.formatNativeInputValue();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
get pickerMode() {
|
|
69
|
-
return this._pickerMode;
|
|
70
|
-
}
|
|
71
|
-
set pickerMode(mode) {
|
|
72
|
-
if (mode === 'popup') {
|
|
73
|
-
this._pickerMode = mode;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
this._pickerMode = 'dialog';
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
get disabled() {
|
|
80
|
-
return this._disabled === undefined && this._dtInput
|
|
81
|
-
? this._dtInput.disabled
|
|
82
|
-
: !!this._disabled;
|
|
83
|
-
}
|
|
84
|
-
set disabled(value) {
|
|
85
|
-
value = coerceBooleanProperty(value);
|
|
86
|
-
if (value !== this._disabled) {
|
|
87
|
-
this._disabled = value;
|
|
88
|
-
this.disabledChange.next(value);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
get opened() {
|
|
92
|
-
return this._opened;
|
|
93
|
-
}
|
|
94
|
-
set opened(val) {
|
|
95
|
-
val ? this.open() : this.close();
|
|
96
|
-
}
|
|
97
|
-
get dtInput() {
|
|
98
|
-
return this._dtInput;
|
|
99
|
-
}
|
|
100
|
-
get selected() {
|
|
101
|
-
return this._selected;
|
|
102
|
-
}
|
|
103
|
-
set selected(value) {
|
|
104
|
-
this._selected = value;
|
|
105
|
-
this.changeDetector.markForCheck();
|
|
106
|
-
}
|
|
107
|
-
get selecteds() {
|
|
108
|
-
return this._selecteds;
|
|
109
|
-
}
|
|
110
|
-
set selecteds(values) {
|
|
111
|
-
this._selecteds = values;
|
|
112
|
-
this.changeDetector.markForCheck();
|
|
113
|
-
}
|
|
114
|
-
/** The minimum selectable date. */
|
|
115
|
-
get minDateTime() {
|
|
116
|
-
return this._dtInput && this._dtInput.min;
|
|
117
|
-
}
|
|
118
|
-
/** The maximum selectable date. */
|
|
119
|
-
get maxDateTime() {
|
|
120
|
-
return this._dtInput && this._dtInput.max;
|
|
121
|
-
}
|
|
122
|
-
get dateTimeFilter() {
|
|
123
|
-
return this._dtInput && this._dtInput.dateTimeFilter;
|
|
124
|
-
}
|
|
125
|
-
get selectMode() {
|
|
126
|
-
return this._dtInput.selectMode;
|
|
127
|
-
}
|
|
128
|
-
get isInSingleMode() {
|
|
129
|
-
return this._dtInput.isInSingleMode;
|
|
130
|
-
}
|
|
131
|
-
get isInRangeMode() {
|
|
132
|
-
return this._dtInput.isInRangeMode;
|
|
133
|
-
}
|
|
134
|
-
constructor(overlay, viewContainerRef, dialogService, ngZone, changeDetector, dateTimeAdapter, defaultScrollStrategy, dateTimeFormats, document) {
|
|
135
|
-
super(dateTimeAdapter, dateTimeFormats);
|
|
136
|
-
this.overlay = overlay;
|
|
137
|
-
this.viewContainerRef = viewContainerRef;
|
|
138
|
-
this.dialogService = dialogService;
|
|
139
|
-
this.ngZone = ngZone;
|
|
140
|
-
this.changeDetector = changeDetector;
|
|
141
|
-
this.dateTimeAdapter = dateTimeAdapter;
|
|
142
|
-
this.dateTimeFormats = dateTimeFormats;
|
|
143
|
-
this.document = document;
|
|
144
|
-
/** Custom class for the picker backdrop. */
|
|
145
|
-
this.backdropClass = [];
|
|
146
|
-
/** Custom class for the picker overlay pane. */
|
|
147
|
-
this.panelClass = [];
|
|
148
|
-
/**
|
|
149
|
-
* Set the type of the dateTime picker
|
|
150
|
-
* 'both' -- show both calendar and timer
|
|
151
|
-
* 'calendar' -- show only calendar
|
|
152
|
-
* 'timer' -- show only timer
|
|
153
|
-
*/
|
|
154
|
-
this._pickerType = 'both';
|
|
155
|
-
/**
|
|
156
|
-
* Whether the picker open as a dialog
|
|
157
|
-
*/
|
|
158
|
-
this._pickerMode = 'popup';
|
|
159
|
-
/** Whether the calendar is open. */
|
|
160
|
-
this._opened = false;
|
|
161
|
-
/**
|
|
162
|
-
* Callback when the picker is closed
|
|
163
|
-
* */
|
|
164
|
-
this.afterPickerClosed = new EventEmitter();
|
|
165
|
-
/**
|
|
166
|
-
* Callback when the picker is open
|
|
167
|
-
* */
|
|
168
|
-
this.afterPickerOpen = new EventEmitter();
|
|
169
|
-
/**
|
|
170
|
-
* Emits selected year in multi-year view
|
|
171
|
-
* This doesn't imply a change on the selected date.
|
|
172
|
-
* */
|
|
173
|
-
this.yearSelected = new EventEmitter();
|
|
174
|
-
/**
|
|
175
|
-
* Emits selected month in year view
|
|
176
|
-
* This doesn't imply a change on the selected date.
|
|
177
|
-
* */
|
|
178
|
-
this.monthSelected = new EventEmitter();
|
|
179
|
-
/**
|
|
180
|
-
* Emit when the selected value has been confirmed
|
|
181
|
-
* */
|
|
182
|
-
this.confirmSelectedChange = new EventEmitter();
|
|
183
|
-
/**
|
|
184
|
-
* Emits when the date time picker is disabled.
|
|
185
|
-
* */
|
|
186
|
-
this.disabledChange = new EventEmitter();
|
|
187
|
-
this.dtInputSub = Subscription.EMPTY;
|
|
188
|
-
this.hidePickerStreamSub = Subscription.EMPTY;
|
|
189
|
-
this.confirmSelectedStreamSub = Subscription.EMPTY;
|
|
190
|
-
this.pickerOpenedStreamSub = Subscription.EMPTY;
|
|
191
|
-
/** The element that was focused before the date time picker was opened. */
|
|
192
|
-
this.focusedElementBeforeOpen = null;
|
|
193
|
-
this._selecteds = [];
|
|
194
|
-
this.defaultScrollStrategy = defaultScrollStrategy;
|
|
195
|
-
}
|
|
196
|
-
ngOnDestroy() {
|
|
197
|
-
this.close();
|
|
198
|
-
this.dtInputSub.unsubscribe();
|
|
199
|
-
this.disabledChange.complete();
|
|
200
|
-
if (this.popupRef) {
|
|
201
|
-
this.popupRef.dispose();
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
registerInput(input) {
|
|
205
|
-
if (this._dtInput) {
|
|
206
|
-
throw Error('A Owl DateTimePicker can only be associated with a single input.');
|
|
207
|
-
}
|
|
208
|
-
this._dtInput = input;
|
|
209
|
-
this.dtInputSub = this._dtInput.valueChange.subscribe((value) => {
|
|
210
|
-
if (Array.isArray(value)) {
|
|
211
|
-
this.selecteds = value;
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
this.selected = value;
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
open() {
|
|
219
|
-
if (this._opened || this.disabled) {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
if (!this._dtInput) {
|
|
223
|
-
throw Error('Attempted to open an DateTimePicker with no associated input.');
|
|
224
|
-
}
|
|
225
|
-
if (this.document) {
|
|
226
|
-
this.focusedElementBeforeOpen = this.document.activeElement;
|
|
227
|
-
}
|
|
228
|
-
// reset the picker selected value
|
|
229
|
-
if (this.isInSingleMode) {
|
|
230
|
-
this.selected = this._dtInput.value;
|
|
231
|
-
}
|
|
232
|
-
else if (this.isInRangeMode) {
|
|
233
|
-
this.selecteds = this._dtInput.values;
|
|
234
|
-
}
|
|
235
|
-
// when the picker is open , we make sure the picker's current selected time value
|
|
236
|
-
// is the same as the _startAt time value.
|
|
237
|
-
if (this.selected && this.pickerType !== 'calendar' && this._startAt) {
|
|
238
|
-
this.selected = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this.selected), this.dateTimeAdapter.getMonth(this.selected), this.dateTimeAdapter.getDate(this.selected), this.dateTimeAdapter.getHours(this._startAt), this.dateTimeAdapter.getMinutes(this._startAt), this.dateTimeAdapter.getSeconds(this._startAt));
|
|
239
|
-
}
|
|
240
|
-
this.pickerMode === 'dialog' ? this.openAsDialog() : this.openAsPopup();
|
|
241
|
-
this.pickerContainer.picker = this;
|
|
242
|
-
// Listen to picker container's hidePickerStream
|
|
243
|
-
this.hidePickerStreamSub = this.pickerContainer.hidePickerStream.subscribe(() => {
|
|
244
|
-
this.close();
|
|
245
|
-
});
|
|
246
|
-
// Listen to picker container's confirmSelectedStream
|
|
247
|
-
this.confirmSelectedStreamSub = this.pickerContainer.confirmSelectedStream.subscribe((event) => {
|
|
248
|
-
this.confirmSelect(event);
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Selects the given date
|
|
253
|
-
*/
|
|
254
|
-
select(date) {
|
|
255
|
-
if (Array.isArray(date)) {
|
|
256
|
-
this.selecteds = [...date];
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
this.selected = date;
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Cases in which automatically confirm the select when date or dates are selected:
|
|
263
|
-
* 1) picker mode is NOT 'dialog'
|
|
264
|
-
* 2) picker type is 'calendar' and selectMode is 'single'.
|
|
265
|
-
* 3) picker type is 'calendar' and selectMode is 'range' and
|
|
266
|
-
* the 'selecteds' has 'from'(selecteds[0]) and 'to'(selecteds[1]) values.
|
|
267
|
-
* 4) selectMode is 'rangeFrom' and selecteds[0] has value.
|
|
268
|
-
* 5) selectMode is 'rangeTo' and selecteds[1] has value.
|
|
269
|
-
* */
|
|
270
|
-
if (this.pickerMode !== 'dialog' &&
|
|
271
|
-
this.pickerType === 'calendar' &&
|
|
272
|
-
((this.selectMode === 'single' && this.selected) ||
|
|
273
|
-
(this.selectMode === 'rangeFrom' && this.selecteds[0]) ||
|
|
274
|
-
(this.selectMode === 'rangeTo' && this.selecteds[1]) ||
|
|
275
|
-
(this.selectMode === 'range' && this.selecteds[0] && this.selecteds[1]))) {
|
|
276
|
-
this.confirmSelect();
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* Emits the selected year in multi-year view
|
|
281
|
-
* */
|
|
282
|
-
selectYear(normalizedYear) {
|
|
283
|
-
this.yearSelected.emit(normalizedYear);
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Emits selected month in year view
|
|
287
|
-
* */
|
|
288
|
-
selectMonth(normalizedMonth) {
|
|
289
|
-
this.monthSelected.emit(normalizedMonth);
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Hide the picker
|
|
293
|
-
*/
|
|
294
|
-
close() {
|
|
295
|
-
if (!this._opened) {
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
if (this.popupRef && this.popupRef.hasAttached()) {
|
|
299
|
-
this.popupRef.detach();
|
|
300
|
-
}
|
|
301
|
-
if (this.pickerContainerPortal && this.pickerContainerPortal.isAttached) {
|
|
302
|
-
this.pickerContainerPortal.detach();
|
|
303
|
-
}
|
|
304
|
-
if (this.hidePickerStreamSub) {
|
|
305
|
-
this.hidePickerStreamSub.unsubscribe();
|
|
306
|
-
this.hidePickerStreamSub = null;
|
|
307
|
-
}
|
|
308
|
-
if (this.confirmSelectedStreamSub) {
|
|
309
|
-
this.confirmSelectedStreamSub.unsubscribe();
|
|
310
|
-
this.confirmSelectedStreamSub = null;
|
|
311
|
-
}
|
|
312
|
-
if (this.pickerOpenedStreamSub) {
|
|
313
|
-
this.pickerOpenedStreamSub.unsubscribe();
|
|
314
|
-
this.pickerOpenedStreamSub = null;
|
|
315
|
-
}
|
|
316
|
-
if (this.dialogRef) {
|
|
317
|
-
this.dialogRef.close();
|
|
318
|
-
this.dialogRef = null;
|
|
319
|
-
}
|
|
320
|
-
const completeClose = () => {
|
|
321
|
-
if (this._opened) {
|
|
322
|
-
this._opened = false;
|
|
323
|
-
this.afterPickerClosed.emit(null);
|
|
324
|
-
this.focusedElementBeforeOpen = null;
|
|
325
|
-
}
|
|
326
|
-
};
|
|
327
|
-
if (this.focusedElementBeforeOpen &&
|
|
328
|
-
typeof this.focusedElementBeforeOpen.focus === 'function') {
|
|
329
|
-
// Because IE moves focus asynchronously, we can't count on it being restored before we've
|
|
330
|
-
// marked the datepicker as closed. If the event fires out of sequence and the element that
|
|
331
|
-
// we're refocusing opens the datepicker on focus, the user could be stuck with not being
|
|
332
|
-
// able to close the calendar at all. We work around it by making the logic, that marks
|
|
333
|
-
// the datepicker as closed, async as well.
|
|
334
|
-
this.focusedElementBeforeOpen.focus();
|
|
335
|
-
setTimeout(completeClose);
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
completeClose();
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Confirm the selected value
|
|
343
|
-
*/
|
|
344
|
-
confirmSelect(event) {
|
|
345
|
-
if (this.isInSingleMode) {
|
|
346
|
-
const selected = this.selected || this.startAt || this.dateTimeAdapter.now();
|
|
347
|
-
this.confirmSelectedChange.emit(selected);
|
|
348
|
-
}
|
|
349
|
-
else if (this.isInRangeMode) {
|
|
350
|
-
this.confirmSelectedChange.emit(this.selecteds);
|
|
351
|
-
}
|
|
352
|
-
this.close();
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Open the picker as a dialog
|
|
357
|
-
*/
|
|
358
|
-
openAsDialog() {
|
|
359
|
-
this.dialogRef = this.dialogService.open(OwlDateTimeContainerComponent, {
|
|
360
|
-
autoFocus: false,
|
|
361
|
-
backdropClass: [
|
|
362
|
-
'cdk-overlay-dark-backdrop',
|
|
363
|
-
...coerceArray(this.backdropClass)
|
|
364
|
-
],
|
|
365
|
-
paneClass: ['owl-dt-dialog', ...coerceArray(this.panelClass)],
|
|
366
|
-
viewContainerRef: this.viewContainerRef,
|
|
367
|
-
scrollStrategy: this.scrollStrategy || this.defaultScrollStrategy(),
|
|
368
|
-
closeOnNavigation: true,
|
|
369
|
-
width: '',
|
|
370
|
-
height: ''
|
|
371
|
-
});
|
|
372
|
-
this.pickerContainer = this.dialogRef.componentInstance;
|
|
373
|
-
this.dialogRef.afterOpen().subscribe(() => {
|
|
374
|
-
this.afterPickerOpen.emit(null);
|
|
375
|
-
this._opened = true;
|
|
376
|
-
});
|
|
377
|
-
this.dialogRef.afterClosed().subscribe(() => this.close());
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Open the picker as popup
|
|
381
|
-
*/
|
|
382
|
-
openAsPopup() {
|
|
383
|
-
if (!this.pickerContainerPortal) {
|
|
384
|
-
this.pickerContainerPortal = new ComponentPortal(OwlDateTimeContainerComponent, this.viewContainerRef);
|
|
385
|
-
}
|
|
386
|
-
if (!this.popupRef) {
|
|
387
|
-
this.createPopup();
|
|
388
|
-
}
|
|
389
|
-
if (!this.popupRef.hasAttached()) {
|
|
390
|
-
const componentRef = this.popupRef.attach(this.pickerContainerPortal);
|
|
391
|
-
this.pickerContainer = componentRef.instance;
|
|
392
|
-
// Update the position once the calendar has rendered.
|
|
393
|
-
this.ngZone.onStable
|
|
394
|
-
.asObservable()
|
|
395
|
-
.pipe(take(1))
|
|
396
|
-
.subscribe(() => {
|
|
397
|
-
this.popupRef.updatePosition();
|
|
398
|
-
});
|
|
399
|
-
// emit open stream
|
|
400
|
-
this.pickerOpenedStreamSub = this.pickerContainer.pickerOpenedStream
|
|
401
|
-
.pipe(take(1))
|
|
402
|
-
.subscribe(() => {
|
|
403
|
-
this.afterPickerOpen.emit(null);
|
|
404
|
-
this._opened = true;
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
createPopup() {
|
|
409
|
-
const overlayConfig = new OverlayConfig({
|
|
410
|
-
positionStrategy: this.createPopupPositionStrategy(),
|
|
411
|
-
hasBackdrop: true,
|
|
412
|
-
backdropClass: [
|
|
413
|
-
'cdk-overlay-transparent-backdrop',
|
|
414
|
-
...coerceArray(this.backdropClass)
|
|
415
|
-
],
|
|
416
|
-
scrollStrategy: this.scrollStrategy || this.defaultScrollStrategy(),
|
|
417
|
-
panelClass: ['owl-dt-popup', ...coerceArray(this.panelClass)]
|
|
418
|
-
});
|
|
419
|
-
this.popupRef = this.overlay.create(overlayConfig);
|
|
420
|
-
merge(this.popupRef.backdropClick(), this.popupRef.detachments(), this.popupRef
|
|
421
|
-
.keydownEvents()
|
|
422
|
-
.pipe(filter((event) => event.keyCode === ESCAPE ||
|
|
423
|
-
(this._dtInput && event.altKey && event.keyCode === UP_ARROW)))).subscribe(() => this.close());
|
|
424
|
-
}
|
|
425
|
-
/**
|
|
426
|
-
* Create the popup PositionStrategy.
|
|
427
|
-
* */
|
|
428
|
-
createPopupPositionStrategy() {
|
|
429
|
-
return this.overlay
|
|
430
|
-
.position()
|
|
431
|
-
.flexibleConnectedTo(this._dtInput.elementRef)
|
|
432
|
-
.withTransformOriginOn('.owl-dt-container')
|
|
433
|
-
.withFlexibleDimensions(false)
|
|
434
|
-
.withPush(false)
|
|
435
|
-
.withPositions([
|
|
436
|
-
{
|
|
437
|
-
originX: 'start',
|
|
438
|
-
originY: 'bottom',
|
|
439
|
-
overlayX: 'start',
|
|
440
|
-
overlayY: 'top'
|
|
441
|
-
},
|
|
442
|
-
{
|
|
443
|
-
originX: 'start',
|
|
444
|
-
originY: 'top',
|
|
445
|
-
overlayX: 'start',
|
|
446
|
-
overlayY: 'bottom'
|
|
447
|
-
},
|
|
448
|
-
{
|
|
449
|
-
originX: 'end',
|
|
450
|
-
originY: 'bottom',
|
|
451
|
-
overlayX: 'end',
|
|
452
|
-
overlayY: 'top'
|
|
453
|
-
},
|
|
454
|
-
{
|
|
455
|
-
originX: 'end',
|
|
456
|
-
originY: 'top',
|
|
457
|
-
overlayX: 'end',
|
|
458
|
-
overlayY: 'bottom'
|
|
459
|
-
},
|
|
460
|
-
{
|
|
461
|
-
originX: 'start',
|
|
462
|
-
originY: 'top',
|
|
463
|
-
overlayX: 'start',
|
|
464
|
-
overlayY: 'top',
|
|
465
|
-
offsetY: -176
|
|
466
|
-
},
|
|
467
|
-
{
|
|
468
|
-
originX: 'start',
|
|
469
|
-
originY: 'top',
|
|
470
|
-
overlayX: 'start',
|
|
471
|
-
overlayY: 'top',
|
|
472
|
-
offsetY: -352
|
|
473
|
-
}
|
|
474
|
-
]);
|
|
475
|
-
}
|
|
476
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OwlDateTimeComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i2.OwlDialogService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i3.DateTimeAdapter, optional: true }, { token: OWL_DTPICKER_SCROLL_STRATEGY }, { token: OWL_DATE_TIME_FORMATS, optional: true }, { token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
477
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: OwlDateTimeComponent, selector: "ofe-owl-date-time", inputs: { backdropClass: "backdropClass", panelClass: "panelClass", startAt: "startAt", pickerType: "pickerType", pickerMode: "pickerMode", disabled: "disabled", opened: "opened", scrollStrategy: "scrollStrategy" }, outputs: { afterPickerClosed: "afterPickerClosed", afterPickerOpen: "afterPickerOpen", yearSelected: "yearSelected", monthSelected: "monthSelected" }, exportAs: ["owlDateTime"], usesInheritance: true, ngImport: i0, template: "", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
478
|
-
}
|
|
479
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OwlDateTimeComponent, decorators: [{
|
|
480
|
-
type: Component,
|
|
481
|
-
args: [{ selector: 'ofe-owl-date-time', exportAs: 'owlDateTime', changeDetection: ChangeDetectionStrategy.OnPush, template: "" }]
|
|
482
|
-
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i2.OwlDialogService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i3.DateTimeAdapter, decorators: [{
|
|
483
|
-
type: Optional
|
|
484
|
-
}] }, { type: undefined, decorators: [{
|
|
485
|
-
type: Inject,
|
|
486
|
-
args: [OWL_DTPICKER_SCROLL_STRATEGY]
|
|
487
|
-
}] }, { type: undefined, decorators: [{
|
|
488
|
-
type: Optional
|
|
489
|
-
}, {
|
|
490
|
-
type: Inject,
|
|
491
|
-
args: [OWL_DATE_TIME_FORMATS]
|
|
492
|
-
}] }, { type: undefined, decorators: [{
|
|
493
|
-
type: Optional
|
|
494
|
-
}, {
|
|
495
|
-
type: Inject,
|
|
496
|
-
args: [DOCUMENT]
|
|
497
|
-
}] }], propDecorators: { backdropClass: [{
|
|
498
|
-
type: Input
|
|
499
|
-
}], panelClass: [{
|
|
500
|
-
type: Input
|
|
501
|
-
}], startAt: [{
|
|
502
|
-
type: Input
|
|
503
|
-
}], pickerType: [{
|
|
504
|
-
type: Input
|
|
505
|
-
}], pickerMode: [{
|
|
506
|
-
type: Input
|
|
507
|
-
}], disabled: [{
|
|
508
|
-
type: Input
|
|
509
|
-
}], opened: [{
|
|
510
|
-
type: Input
|
|
511
|
-
}], scrollStrategy: [{
|
|
512
|
-
type: Input
|
|
513
|
-
}], afterPickerClosed: [{
|
|
514
|
-
type: Output
|
|
515
|
-
}], afterPickerOpen: [{
|
|
516
|
-
type: Output
|
|
517
|
-
}], yearSelected: [{
|
|
518
|
-
type: Output
|
|
519
|
-
}], monthSelected: [{
|
|
520
|
-
type: Output
|
|
521
|
-
}] } });
|
|
522
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9jb21wb25lbnRzL25neC1waWNrLWRhdGV0aW1lL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9jb21wb25lbnRzL25neC1waWNrLWRhdGV0aW1lL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUNMLE1BQU0sRUFFTixRQUFRLEVBQ1IsTUFBTSxFQUNOLGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFFTCxPQUFPLEVBQ1AsYUFBYSxFQUlkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0UsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2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QkFBQyw0QkFBNEI7OzBCQUNuQyxRQUFROzswQkFDUixNQUFNOzJCQUFDLHFCQUFxQjs7MEJBRTVCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsUUFBUTt5Q0FqT1gsYUFBYTtzQkFEbkIsS0FBSztnQkFLQyxVQUFVO3NCQURoQixLQUFLO2dCQU9GLE9BQU87c0JBRFYsS0FBSztnQkFvQ0YsVUFBVTtzQkFEYixLQUFLO2dCQW1CRixVQUFVO3NCQURiLEtBQUs7Z0JBZ0JGLFFBQVE7c0JBRFgsS0FBSztnQkFrQkYsTUFBTTtzQkFEVCxLQUFLO2dCQWNDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBT04saUJBQWlCO3NCQURoQixNQUFNO2dCQU9QLGVBQWU7c0JBRGQsTUFBTTtnQkFRUCxZQUFZO3NCQURYLE1BQU07Z0JBUVAsYUFBYTtzQkFEWixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEJsb2NrU2Nyb2xsU3RyYXRlZ3ksXG4gIE92ZXJsYXksXG4gIE92ZXJsYXlDb25maWcsXG4gIE92ZXJsYXlSZWYsXG4gIFBvc2l0aW9uU3RyYXRlZ3ksXG4gIFNjcm9sbFN0cmF0ZWd5XG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IEVTQ0FQRSwgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgY29lcmNlQXJyYXksIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBtZXJnZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE93bERhdGVUaW1lQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT3dsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4vZGF0ZS10aW1lLXBpY2tlci1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJztcbmltcG9ydCB7XG4gIE9XTF9EQVRFX1RJTUVfRk9STUFUUyxcbiAgT3dsRGF0ZVRpbWVGb3JtYXRzXG59IGZyb20gJy4vYWRhcHRlci9kYXRlLXRpbWUtZm9ybWF0LmNsYXNzJztcbmltcG9ydCB7XG4gIE93bERhdGVUaW1lLFxuICBQaWNrZXJNb2RlLFxuICBQaWNrZXJUeXBlLFxuICBTZWxlY3RNb2RlXG59IGZyb20gJy4vZGF0ZS10aW1lLmNsYXNzJztcbmltcG9ydCB7IE93bERpYWxvZ1JlZiB9IGZyb20gJy4uL2RpYWxvZy9kaWFsb2ctcmVmLmNsYXNzJztcbmltcG9ydCB7IE93bERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuXG4vKiogSW5qZWN0aW9uIHRva2VuIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2Nyb2xsIGhhbmRsaW5nIHdoaWxlIHRoZSBkdFBpY2tlciBpcyBvcGVuLiAqL1xuZXhwb3J0IGNvbnN0IE9XTF9EVFBJQ0tFUl9TQ1JPTExfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW48XG4gICgpID0+IFNjcm9sbFN0cmF0ZWd5XG4+KCdvd2wtZHRwaWNrZXItc2Nyb2xsLXN0cmF0ZWd5Jyk7XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgZnVuY3Rpb24gT1dMX0RUUElDS0VSX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZKFxuICBvdmVybGF5OiBPdmVybGF5XG4pOiAoKSA9PiBCbG9ja1Njcm9sbFN0cmF0ZWd5IHtcbiAgY29uc3QgZm4gPSAoKSA9PiBvdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKTtcbiAgcmV0dXJuIGZuO1xufVxuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IE9XTF9EVFBJQ0tFUl9TQ1JPTExfU1RSQVRFR1lfUFJPVklERVIgPSB7XG4gIHByb3ZpZGU6IE9XTF9EVFBJQ0tFUl9TQ1JPTExfU1RSQVRFR1ksXG4gIGRlcHM6IFtPdmVybGF5XSxcbiAgdXNlRmFjdG9yeTogT1dMX0RUUElDS0VSX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZmUtb3dsLWRhdGUtdGltZScsXG4gIGV4cG9ydEFzOiAnb3dsRGF0ZVRpbWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgT3dsRGF0ZVRpbWVDb21wb25lbnQ8VD5cbiAgZXh0ZW5kcyBPd2xEYXRlVGltZTxUPlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKiBDdXN0b20gY2xhc3MgZm9yIHRoZSBwaWNrZXIgYmFja2Ryb3AuICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBiYWNrZHJvcENsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBDdXN0b20gY2xhc3MgZm9yIHRoZSBwaWNrZXIgb3ZlcmxheSBwYW5lLiAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcGFuZWxDbGFzczogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcblxuICAvKiogVGhlIGRhdGUgdG8gb3BlbiB0aGUgY2FsZW5kYXIgdG8gaW5pdGlhbGx5LiAqL1xuICBwcml2YXRlIF9zdGFydEF0OiBUIHwgbnVsbDtcblxuICBASW5wdXQoKVxuICBnZXQgc3RhcnRBdCgpOiBUIHwgbnVsbCB7XG4gICAgLy8gSWYgYW4gZXhwbGljaXQgc3RhcnRBdCBpcyBzZXQgd2Ugc3RhcnQgdGhlcmUsIG90aGVyd2lzZSB3ZSBzdGFydCBhdCB3aGF0ZXZlciB0aGUgY3VycmVudGx5XG4gICAgLy8gc2VsZWN0ZWQgdmFsdWUgaXMuXG4gICAgaWYgKHRoaXMuX3N0YXJ0QXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydEF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kdElucHV0KSB7XG4gICAgICBpZiAodGhpcy5fZHRJbnB1dC5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHRJbnB1dC52YWx1ZSB8fCBudWxsO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5fZHRJbnB1dC5zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8XG4gICAgICAgIHRoaXMuX2R0SW5wdXQuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbSdcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHRJbnB1dC52YWx1ZXNbMF0gfHwgbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHRJbnB1dC5zZWxlY3RNb2RlID09PSAncmFuZ2VUbycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2R0SW5wdXQudmFsdWVzWzFdIHx8IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNldCBzdGFydEF0KGRhdGU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fc3RhcnRBdCA9IHRoaXMuZ2V0VmFsaWREYXRlKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHR5cGUgb2YgdGhlIGRhdGVUaW1lIHBpY2tlclxuICAgKiAgICAgICdib3RoJyAtLSBzaG93IGJvdGggY2FsZW5kYXIgYW5kIHRpbWVyXG4gICAqICAgICAgJ2NhbGVuZGFyJyAtLSBzaG93IG9ubHkgY2FsZW5kYXJcbiAgICogICAgICAndGltZXInIC0tIHNob3cgb25seSB0aW1lclxuICAgKi9cbiAgcHJpdmF0ZSBfcGlja2VyVHlwZTogUGlja2VyVHlwZSA9ICdib3RoJztcbiAgQElucHV0KClcbiAgZ2V0IHBpY2tlclR5cGUoKTogUGlja2VyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3BpY2tlclR5cGU7XG4gIH1cblxuICBzZXQgcGlja2VyVHlwZSh2YWw6IFBpY2tlclR5cGUpIHtcbiAgICBpZiAodmFsICE9PSB0aGlzLl9waWNrZXJUeXBlKSB7XG4gICAgICB0aGlzLl9waWNrZXJUeXBlID0gdmFsO1xuICAgICAgaWYgKHRoaXMuX2R0SW5wdXQpIHtcbiAgICAgICAgdGhpcy5fZHRJbnB1dC5mb3JtYXROYXRpdmVJbnB1dFZhbHVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpY2tlciBvcGVuIGFzIGEgZGlhbG9nXG4gICAqL1xuICBfcGlja2VyTW9kZTogUGlja2VyTW9kZSA9ICdwb3B1cCc7XG4gIEBJbnB1dCgpXG4gIGdldCBwaWNrZXJNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9waWNrZXJNb2RlO1xuICB9XG5cbiAgc2V0IHBpY2tlck1vZGUobW9kZTogUGlja2VyTW9kZSkge1xuICAgIGlmIChtb2RlID09PSAncG9wdXAnKSB7XG4gICAgICB0aGlzLl9waWNrZXJNb2RlID0gbW9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGlja2VyTW9kZSA9ICdkaWFsb2cnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBkYXRlIHRpbWUgcGlja2VyIHNob3VsZCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl9kdElucHV0XG4gICAgICA/IHRoaXMuX2R0SW5wdXQuZGlzYWJsZWRcbiAgICAgIDogISF0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgICAgdGhpcy5kaXNhYmxlZENoYW5nZS5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgb3Blbi4gKi9cbiAgcHJpdmF0ZSBfb3BlbmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBvcGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29wZW5lZDtcbiAgfVxuXG4gIHNldCBvcGVuZWQodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID8gdGhpcy5vcGVuKCkgOiB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNjcm9sbCBzdHJhdGVneSB3aGVuIHRoZSBwaWNrZXIgaXMgb3BlblxuICAgKiBMZWFybiBtb3JlIHRoaXMgZnJvbSBodHRwczovL21hdGVyaWFsLmFuZ3VsYXIuaW8vY2RrL292ZXJsYXkvb3ZlcnZpZXcjc2Nyb2xsLXN0cmF0ZWdpZXNcbiAgICogKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiB0aGUgcGlja2VyIGlzIGNsb3NlZFxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgYWZ0ZXJQaWNrZXJDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiB0aGUgcGlja2VyIGlzIG9wZW5cbiAgICogKi9cbiAgQE91dHB1dCgpXG4gIGFmdGVyUGlja2VyT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCB5ZWFyIGluIG11bHRpLXllYXIgdmlld1xuICAgKiBUaGlzIGRvZXNuJ3QgaW1wbHkgYSBjaGFuZ2Ugb24gdGhlIHNlbGVjdGVkIGRhdGUuXG4gICAqICovXG4gIEBPdXRwdXQoKVxuICB5ZWFyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHNlbGVjdGVkIG1vbnRoIGluIHllYXIgdmlld1xuICAgKiBUaGlzIGRvZXNuJ3QgaW1wbHkgYSBjaGFuZ2Ugb24gdGhlIHNlbGVjdGVkIGRhdGUuXG4gICAqICovXG4gIEBPdXRwdXQoKVxuICBtb250aFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0IHdoZW4gdGhlIHNlbGVjdGVkIHZhbHVlIGhhcyBiZWVuIGNvbmZpcm1lZFxuICAgKiAqL1xuICBwdWJsaWMgY29uZmlybVNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10gfCBUPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSBkYXRlIHRpbWUgcGlja2VyIGlzIGRpc2FibGVkLlxuICAgKiAqL1xuICBwdWJsaWMgZGlzYWJsZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHJpdmF0ZSBwaWNrZXJDb250YWluZXJQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxcbiAgICBPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPlxuICA+O1xuICBwcml2YXRlIHBpY2tlckNvbnRhaW5lcjogT3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8VD47XG4gIHByaXZhdGUgcG9wdXBSZWY6IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgZGlhbG9nUmVmOiBPd2xEaWFsb2dSZWY8T3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8VD4+O1xuICBwcml2YXRlIGR0SW5wdXRTdWIgPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgaGlkZVBpY2tlclN0cmVhbVN1YiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBjb25maXJtU2VsZWN0ZWRTdHJlYW1TdWIgPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgcGlja2VyT3BlbmVkU3RyZWFtU3ViID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIC8qKiBUaGUgZWxlbWVudCB0aGF0IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgZGF0ZSB0aW1lIHBpY2tlciB3YXMgb3BlbmVkLiAqL1xuICBwcml2YXRlIGZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9kdElucHV0OiBPd2xEYXRlVGltZUlucHV0RGlyZWN0aXZlPFQ+O1xuICBnZXQgZHRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZHRJbnB1dDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGVkOiBUIHwgbnVsbDtcbiAgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RlZHM6IFRbXSA9IFtdO1xuICBnZXQgc2VsZWN0ZWRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZHM7XG4gIH1cblxuICBzZXQgc2VsZWN0ZWRzKHZhbHVlczogVFtdKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRzID0gdmFsdWVzO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogVGhlIG1pbmltdW0gc2VsZWN0YWJsZSBkYXRlLiAqL1xuICBnZXQgbWluRGF0ZVRpbWUoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9kdElucHV0ICYmIHRoaXMuX2R0SW5wdXQubWluO1xuICB9XG5cbiAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgZ2V0IG1heERhdGVUaW1lKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZHRJbnB1dCAmJiB0aGlzLl9kdElucHV0Lm1heDtcbiAgfVxuXG4gIGdldCBkYXRlVGltZUZpbHRlcigpOiAoZGF0ZTogVCB8IG51bGwpID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kdElucHV0ICYmIHRoaXMuX2R0SW5wdXQuZGF0ZVRpbWVGaWx0ZXI7XG4gIH1cblxuICBnZXQgc2VsZWN0TW9kZSgpOiBTZWxlY3RNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fZHRJbnB1dC5zZWxlY3RNb2RlO1xuICB9XG5cbiAgZ2V0IGlzSW5TaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kdElucHV0LmlzSW5TaW5nbGVNb2RlO1xuICB9XG5cbiAgZ2V0IGlzSW5SYW5nZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2R0SW5wdXQuaXNJblJhbmdlTW9kZTtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFNjcm9sbFN0cmF0ZWd5OiAoKSA9PiBTY3JvbGxTdHJhdGVneTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogT3dsRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGRhdGVUaW1lQWRhcHRlcjogRGF0ZVRpbWVBZGFwdGVyPFQ+LFxuICAgIEBJbmplY3QoT1dMX0RUUElDS0VSX1NDUk9MTF9TVFJBVEVHWSkgZGVmYXVsdFNjcm9sbFN0cmF0ZWd5OiBhbnksXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE9XTF9EQVRFX1RJTUVfRk9STUFUUylcbiAgICBwcm90ZWN0ZWQgZGF0ZVRpbWVGb3JtYXRzOiBPd2xEYXRlVGltZUZvcm1hdHMsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KERPQ1VNRU5UKVxuICAgIHByaXZhdGUgZG9jdW1lbnQ6IGFueVxuICApIHtcbiAgICBzdXBlcihkYXRlVGltZUFkYXB0ZXIsIGRhdGVUaW1lRm9ybWF0cyk7XG4gICAgdGhpcy5kZWZhdWx0U2Nyb2xsU3RyYXRlZ3kgPSBkZWZhdWx0U2Nyb2xsU3RyYXRlZ3k7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICAgIHRoaXMuZHRJbnB1dFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UuY29tcGxldGUoKTtcblxuICAgIGlmICh0aGlzLnBvcHVwUmVmKSB7XG4gICAgICB0aGlzLnBvcHVwUmVmLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJJbnB1dChpbnB1dDogT3dsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZTxUPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kdElucHV0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0EgT3dsIERhdGVUaW1lUGlja2VyIGNhbiBvbmx5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBpbnB1dC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX2R0SW5wdXQgPSBpbnB1dDtcbiAgICB0aGlzLmR0SW5wdXRTdWIgPSB0aGlzLl9kdElucHV0LnZhbHVlQ2hhbmdlLnN1YnNjcmliZShcbiAgICAgICh2YWx1ZTogVFtdIHwgVCB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZHMgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wZW5lZCB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9kdElucHV0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0F0dGVtcHRlZCB0byBvcGVuIGFuIERhdGVUaW1lUGlja2VyIHdpdGggbm8gYXNzb2NpYXRlZCBpbnB1dC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRvY3VtZW50KSB7XG4gICAgICB0aGlzLmZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiA9IHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyByZXNldCB0aGUgcGlja2VyIHNlbGVjdGVkIHZhbHVlXG4gICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLl9kdElucHV0LnZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0luUmFuZ2VNb2RlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkcyA9IHRoaXMuX2R0SW5wdXQudmFsdWVzO1xuICAgIH1cblxuICAgIC8vIHdoZW4gdGhlIHBpY2tlciBpcyBvcGVuICwgd2UgbWFrZSBzdXJlIHRoZSBwaWNrZXIncyBjdXJyZW50IHNlbGVjdGVkIHRpbWUgdmFsdWVcbiAgICAvLyBpcyB0aGUgc2FtZSBhcyB0aGUgX3N0YXJ0QXQgdGltZSB2YWx1ZS5cbiAgICBpZiAodGhpcy5zZWxlY3RlZCAmJiB0aGlzLnBpY2tlclR5cGUgIT09ICdjYWxlbmRhcicgJiYgdGhpcy5fc3RhcnRBdCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZCksXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRoaXMuc2VsZWN0ZWQpLFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXRlKHRoaXMuc2VsZWN0ZWQpLFxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRIb3Vycyh0aGlzLl9zdGFydEF0KSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TWludXRlcyh0aGlzLl9zdGFydEF0KSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLl9zdGFydEF0KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnBpY2tlck1vZGUgPT09ICdkaWFsb2cnID8gdGhpcy5vcGVuQXNEaWFsb2coKSA6IHRoaXMub3BlbkFzUG9wdXAoKTtcblxuICAgIHRoaXMucGlja2VyQ29udGFpbmVyLnBpY2tlciA9IHRoaXM7XG5cbiAgICAvLyBMaXN0ZW4gdG8gcGlja2VyIGNvbnRhaW5lcidzIGhpZGVQaWNrZXJTdHJlYW1cbiAgICB0aGlzLmhpZGVQaWNrZXJTdHJlYW1TdWIgPSB0aGlzLnBpY2tlckNvbnRhaW5lci5oaWRlUGlja2VyU3RyZWFtLnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gcGlja2VyIGNvbnRhaW5lcidzIGNvbmZpcm1TZWxlY3RlZFN0cmVhbVxuICAgIHRoaXMuY29uZmlybVNlbGVjdGVkU3RyZWFtU3ViID0gdGhpcy5waWNrZXJDb250YWluZXIuY29uZmlybVNlbGVjdGVkU3RyZWFtLnN1YnNjcmliZShcbiAgICAgIChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlybVNlbGVjdChldmVudCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBnaXZlbiBkYXRlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0KGRhdGU6IFRbXSB8IFQpOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRlKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZHMgPSBbLi4uZGF0ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBkYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc2VzIGluIHdoaWNoIGF1dG9tYXRpY2FsbHkgY29uZmlybSB0aGUgc2VsZWN0IHdoZW4gZGF0ZSBvciBkYXRlcyBhcmUgc2VsZWN0ZWQ6XG4gICAgICogMSkgcGlja2VyIG1vZGUgaXMgTk9UICdkaWFsb2cnXG4gICAgICogMikgcGlja2VyIHR5cGUgaXMgJ2NhbGVuZGFyJyBhbmQgc2VsZWN0TW9kZSBpcyAnc2luZ2xlJy5cbiAgICAgKiAzKSBwaWNrZXIgdHlwZSBpcyAnY2FsZW5kYXInIGFuZCBzZWxlY3RNb2RlIGlzICdyYW5nZScgYW5kXG4gICAgICogICAgdGhlICdzZWxlY3RlZHMnIGhhcyAnZnJvbScoc2VsZWN0ZWRzWzBdKSBhbmQgJ3RvJyhzZWxlY3RlZHNbMV0pIHZhbHVlcy5cbiAgICAgKiA0KSBzZWxlY3RNb2RlIGlzICdyYW5nZUZyb20nIGFuZCBzZWxlY3RlZHNbMF0gaGFzIHZhbHVlLlxuICAgICAqIDUpIHNlbGVjdE1vZGUgaXMgJ3JhbmdlVG8nIGFuZCBzZWxlY3RlZHNbMV0gaGFzIHZhbHVlLlxuICAgICAqICovXG4gICAgaWYgKFxuICAgICAgdGhpcy5waWNrZXJNb2RlICE9PSAnZGlhbG9nJyAmJlxuICAgICAgdGhpcy5waWNrZXJUeXBlID09PSAnY2FsZW5kYXInICYmXG4gICAgICAoKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScgJiYgdGhpcy5zZWxlY3RlZCkgfHxcbiAgICAgICAgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScgJiYgdGhpcy5zZWxlY3RlZHNbMF0pIHx8XG4gICAgICAgICh0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJyAmJiB0aGlzLnNlbGVjdGVkc1sxXSkgfHxcbiAgICAgICAgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyAmJiB0aGlzLnNlbGVjdGVkc1swXSAmJiB0aGlzLnNlbGVjdGVkc1sxXSkpXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbmZpcm1TZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNlbGVjdGVkIHllYXIgaW4gbXVsdGkteWVhciB2aWV3XG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RZZWFyKG5vcm1hbGl6ZWRZZWFyOiBUKTogdm9pZCB7XG4gICAgdGhpcy55ZWFyU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkWWVhcik7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgbW9udGggaW4geWVhciB2aWV3XG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RNb250aChub3JtYWxpemVkTW9udGg6IFQpOiB2b2lkIHtcbiAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkTW9udGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIHBpY2tlclxuICAgKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fb3BlbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9wdXBSZWYgJiYgdGhpcy5wb3B1cFJlZi5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICB0aGlzLnBvcHVwUmVmLmRldGFjaCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpY2tlckNvbnRhaW5lclBvcnRhbCAmJiB0aGlzLnBpY2tlckNvbnRhaW5lclBvcnRhbC5pc0F0dGFjaGVkKSB7XG4gICAgICB0aGlzLnBpY2tlckNvbnRhaW5lclBvcnRhbC5kZXRhY2goKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRlUGlja2VyU3RyZWFtU3ViKSB7XG4gICAgICB0aGlzLmhpZGVQaWNrZXJTdHJlYW1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuaGlkZVBpY2tlclN0cmVhbVN1YiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlybVNlbGVjdGVkU3RyZWFtU3ViKSB7XG4gICAgICB0aGlzLmNvbmZpcm1TZWxlY3RlZFN0cmVhbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5jb25maXJtU2VsZWN0ZWRTdHJlYW1TdWIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpY2tlck9wZW5lZFN0cmVhbVN1Yikge1xuICAgICAgdGhpcy5waWNrZXJPcGVuZWRTdHJlYW1TdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMucGlja2VyT3BlbmVkU3RyZWFtU3ViID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICB0aGlzLmRpYWxvZ1JlZiA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVDbG9zZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9vcGVuZWQpIHtcbiAgICAgICAgdGhpcy5fb3BlbmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWZ0ZXJQaWNrZXJDbG9zZWQuZW1pdChudWxsKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4gPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmZvY3VzZWRFbGVtZW50QmVmb3JlT3BlbiAmJlxuICAgICAgdHlwZW9mIHRoaXMuZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzID09PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICAvLyBCZWNhdXNlIElFIG1vdmVzIGZvY3VzIGFzeW5jaHJvbm91c2x5LCB3ZSBjYW4ndCBjb3VudCBvbiBpdCBiZWluZyByZXN0b3JlZCBiZWZvcmUgd2UndmVcbiAgICAgIC8vIG1hcmtlZCB0aGUgZGF0ZXBpY2tlciBhcyBjbG9zZWQuIElmIHRoZSBldmVudCBmaXJlcyBvdXQgb2Ygc2VxdWVuY2UgYW5kIHRoZSBlbGVtZW50IHRoYXRcbiAgICAgIC8vIHdlJ3JlIHJlZm9jdXNpbmcgb3BlbnMgdGhlIGRhdGVwaWNrZXIgb24gZm9jdXMsIHRoZSB1c2VyIGNvdWxkIGJlIHN0dWNrIHdpdGggbm90IGJlaW5nXG4gICAgICAvLyBhYmxlIHRvIGNsb3NlIHRoZSBjYWxlbmRhciBhdCBhbGwuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IG1ha2luZyB0aGUgbG9naWMsIHRoYXQgbWFya3NcbiAgICAgIC8vIHRoZSBkYXRlcGlja2VyIGFzIGNsb3NlZCwgYXN5bmMgYXMgd2VsbC5cbiAgICAgIHRoaXMuZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzKCk7XG4gICAgICBzZXRUaW1lb3V0KGNvbXBsZXRlQ2xvc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wbGV0ZUNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgY29uZmlybVNlbGVjdChldmVudD86IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5zdGFydEF0IHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpO1xuICAgICAgdGhpcy5jb25maXJtU2VsZWN0ZWRDaGFuZ2UuZW1pdChzZWxlY3RlZCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMuY29uZmlybVNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZHMpO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2UoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgcGlja2VyIGFzIGEgZGlhbG9nXG4gICAqL1xuICBwcml2YXRlIG9wZW5Bc0RpYWxvZygpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKE93bERhdGVUaW1lQ29udGFpbmVyQ29tcG9uZW50LCB7XG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgYmFja2Ryb3BDbGFzczogW1xuICAgICAgICAnY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcCcsXG4gICAgICAgIC4uLmNvZXJjZUFycmF5KHRoaXMuYmFja2Ryb3BDbGFzcylcbiAgICAgIF0sXG4gICAgICBwYW5lQ2xhc3M6IFsnb3dsLWR0LWRpYWxvZycsIC4uLmNvZXJjZUFycmF5KHRoaXMucGFuZWxDbGFzcyldLFxuICAgICAgdmlld0NvbnRhaW5lclJlZjogdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuc2Nyb2xsU3RyYXRlZ3kgfHwgdGhpcy5kZWZhdWx0U2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgIGNsb3NlT25OYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgd2lkdGg6ICcnLFxuICAgICAgaGVpZ2h0OiAnJ1xuICAgIH0pO1xuICAgIHRoaXMucGlja2VyQ29udGFpbmVyID0gdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2U7XG5cbiAgICB0aGlzLmRpYWxvZ1JlZi5hZnRlck9wZW4oKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclBpY2tlck9wZW4uZW1pdChudWxsKTtcbiAgICAgIHRoaXMuX29wZW5lZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5kaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBwaWNrZXIgYXMgcG9wdXBcbiAgICovXG4gIHByaXZhdGUgb3BlbkFzUG9wdXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBpY2tlckNvbnRhaW5lclBvcnRhbCkge1xuICAgICAgdGhpcy5waWNrZXJDb250YWluZXJQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsPFxuICAgICAgICBPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPlxuICAgICAgPihPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9wdXBSZWYpIHtcbiAgICAgIHRoaXMuY3JlYXRlUG9wdXAoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9wdXBSZWYuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8T3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8XG4gICAgICAgIFRcbiAgICAgID4+ID0gdGhpcy5wb3B1cFJlZi5hdHRhY2godGhpcy5waWNrZXJDb250YWluZXJQb3J0YWwpO1xuICAgICAgdGhpcy5waWNrZXJDb250YWluZXIgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb25jZSB0aGUgY2FsZW5kYXIgaGFzIHJlbmRlcmVkLlxuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucG9wdXBSZWYudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIGVtaXQgb3BlbiBzdHJlYW1cbiAgICAgIHRoaXMucGlja2VyT3BlbmVkU3RyZWFtU3ViID0gdGhpcy5waWNrZXJDb250YWluZXIucGlja2VyT3BlbmVkU3RyZWFtXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWZ0ZXJQaWNrZXJPcGVuLmVtaXQobnVsbCk7XG4gICAgICAgICAgdGhpcy5fb3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQb3B1cCgpOiB2b2lkIHtcbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5jcmVhdGVQb3B1cFBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgYmFja2Ryb3BDbGFzczogW1xuICAgICAgICAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgICAuLi5jb2VyY2VBcnJheSh0aGlzLmJhY2tkcm9wQ2xhc3MpXG4gICAgICBdLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuc2Nyb2xsU3RyYXRlZ3kgfHwgdGhpcy5kZWZhdWx0U2Nyb2xsU3RyYXRlZ3koKSxcbiAgICAgIHBhbmVsQ2xhc3M6IFsnb3dsLWR0LXBvcHVwJywgLi4uY29lcmNlQXJyYXkodGhpcy5wYW5lbENsYXNzKV1cbiAgICB9KTtcblxuICAgIHRoaXMucG9wdXBSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuXG4gICAgbWVyZ2UoXG4gICAgICB0aGlzLnBvcHVwUmVmLmJhY2tkcm9wQ2xpY2soKSxcbiAgICAgIHRoaXMucG9wdXBSZWYuZGV0YWNobWVudHMoKSxcbiAgICAgIHRoaXMucG9wdXBSZWZcbiAgICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAoZXZlbnQpID0+XG4gICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSB8fFxuICAgICAgICAgICAgICAodGhpcy5fZHRJbnB1dCAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gVVBfQVJST1cpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHBvcHVwIFBvc2l0aW9uU3RyYXRlZ3kuXG4gICAqICovXG4gIHByaXZhdGUgY3JlYXRlUG9wdXBQb3NpdGlvblN0cmF0ZWd5KCk6IFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9kdElucHV0LmVsZW1lbnRSZWYpXG4gICAgICAud2l0aFRyYW5zZm9ybU9yaWdpbk9uKCcub3dsLWR0LWNvbnRhaW5lcicpXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgIC53aXRoUHVzaChmYWxzZSlcbiAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgb2Zmc2V0WTogLTE3NlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgICAgb2Zmc2V0WTogLTM1MlxuICAgICAgICB9XG4gICAgICBdKTtcbiAgfVxufVxuIiwiIl19
|