@dereekb/dbx-form 12.7.0 → 13.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/LICENSE +1 -1
- package/fesm2022/dereekb-dbx-form-calendar.mjs +86 -86
- package/fesm2022/dereekb-dbx-form-calendar.mjs.map +1 -1
- package/fesm2022/dereekb-dbx-form-mapbox.mjs +28 -28
- package/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -1
- package/fesm2022/dereekb-dbx-form.mjs +381 -542
- package/fesm2022/dereekb-dbx-form.mjs.map +1 -1
- package/lib/formly/field/value/phone/_phone.scss +1 -0
- package/lib/style/_theming.scss +196 -1
- package/package.json +26 -32
- package/types/dereekb-dbx-form-calendar.d.ts +679 -0
- package/types/dereekb-dbx-form-mapbox.d.ts +216 -0
- package/types/dereekb-dbx-form.d.ts +3050 -0
- package/calendar/index.d.ts +0 -1
- package/calendar/lib/calendar.module.d.ts +0 -19
- package/calendar/lib/calendar.schedule.selection.cell.component.d.ts +0 -16
- package/calendar/lib/calendar.schedule.selection.component.d.ts +0 -74
- package/calendar/lib/calendar.schedule.selection.d.ts +0 -29
- package/calendar/lib/calendar.schedule.selection.days.component.d.ts +0 -15
- package/calendar/lib/calendar.schedule.selection.days.form.component.d.ts +0 -10
- package/calendar/lib/calendar.schedule.selection.dialog.button.component.d.ts +0 -15
- package/calendar/lib/calendar.schedule.selection.dialog.component.d.ts +0 -24
- package/calendar/lib/calendar.schedule.selection.form.d.ts +0 -4
- package/calendar/lib/calendar.schedule.selection.popover.button.component.d.ts +0 -17
- package/calendar/lib/calendar.schedule.selection.popover.component.d.ts +0 -14
- package/calendar/lib/calendar.schedule.selection.popover.content.component.d.ts +0 -5
- package/calendar/lib/calendar.schedule.selection.range.component.d.ts +0 -52
- package/calendar/lib/calendar.schedule.selection.store.d.ts +0 -282
- package/calendar/lib/calendar.schedule.selection.store.provide.d.ts +0 -23
- package/calendar/lib/calendar.schedule.selection.toggle.button.component.d.ts +0 -18
- package/calendar/lib/field/index.d.ts +0 -1
- package/calendar/lib/field/schedule/calendar.schedule.field.component.d.ts +0 -102
- package/calendar/lib/field/schedule/calendar.schedule.field.d.ts +0 -6
- package/calendar/lib/field/schedule/calendar.schedule.module.d.ts +0 -8
- package/calendar/lib/field/schedule/index.d.ts +0 -3
- package/calendar/lib/index.d.ts +0 -17
- package/esm2022/calendar/dereekb-dbx-form-calendar.mjs +0 -5
- package/esm2022/calendar/index.mjs +0 -2
- package/esm2022/calendar/lib/calendar.module.mjs +0 -84
- package/esm2022/calendar/lib/calendar.schedule.selection.cell.component.mjs +0 -42
- package/esm2022/calendar/lib/calendar.schedule.selection.component.mjs +0 -156
- package/esm2022/calendar/lib/calendar.schedule.selection.days.component.mjs +0 -47
- package/esm2022/calendar/lib/calendar.schedule.selection.days.form.component.mjs +0 -22
- package/esm2022/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +0 -32
- package/esm2022/calendar/lib/calendar.schedule.selection.dialog.component.mjs +0 -59
- package/esm2022/calendar/lib/calendar.schedule.selection.form.mjs +0 -15
- package/esm2022/calendar/lib/calendar.schedule.selection.mjs +0 -31
- package/esm2022/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +0 -50
- package/esm2022/calendar/lib/calendar.schedule.selection.popover.component.mjs +0 -41
- package/esm2022/calendar/lib/calendar.schedule.selection.popover.content.component.mjs +0 -34
- package/esm2022/calendar/lib/calendar.schedule.selection.range.component.mjs +0 -165
- package/esm2022/calendar/lib/calendar.schedule.selection.store.mjs +0 -785
- package/esm2022/calendar/lib/calendar.schedule.selection.store.provide.mjs +0 -48
- package/esm2022/calendar/lib/calendar.schedule.selection.toggle.button.component.mjs +0 -67
- package/esm2022/calendar/lib/field/index.mjs +0 -3
- package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +0 -154
- package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.mjs +0 -28
- package/esm2022/calendar/lib/field/schedule/calendar.schedule.module.mjs +0 -26
- package/esm2022/calendar/lib/field/schedule/index.mjs +0 -4
- package/esm2022/calendar/lib/index.mjs +0 -18
- package/esm2022/dereekb-dbx-form.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/lib/form/action/form.action.dialog.component.mjs +0 -75
- package/esm2022/lib/form/action/form.action.directive.mjs +0 -168
- package/esm2022/lib/form/action/form.action.module.mjs +0 -19
- package/esm2022/lib/form/action/index.mjs +0 -5
- package/esm2022/lib/form/action/transition/form.action.transition.module.mjs +0 -19
- package/esm2022/lib/form/action/transition/form.action.transition.safety.directive.mjs +0 -28
- package/esm2022/lib/form/action/transition/index.mjs +0 -3
- package/esm2022/lib/form/form.angular.util.mjs +0 -13
- package/esm2022/lib/form/form.mjs +0 -42
- package/esm2022/lib/form/form.module.mjs +0 -17
- package/esm2022/lib/form/index.mjs +0 -6
- package/esm2022/lib/form/io/form.change.directive.mjs +0 -38
- package/esm2022/lib/form/io/form.input.directive.mjs +0 -94
- package/esm2022/lib/form/io/form.io.module.mjs +0 -26
- package/esm2022/lib/form/io/form.loading.directive.mjs +0 -35
- package/esm2022/lib/form/io/index.mjs +0 -5
- package/esm2022/lib/form.module.mjs +0 -18
- package/esm2022/lib/form.providers.mjs +0 -32
- package/esm2022/lib/formly/config/index.mjs +0 -2
- package/esm2022/lib/formly/config/validation.mjs +0 -23
- package/esm2022/lib/formly/field/checklist/checklist.field.mjs +0 -102
- package/esm2022/lib/formly/field/checklist/checklist.item.field.component.mjs +0 -87
- package/esm2022/lib/formly/field/checklist/checklist.item.field.content.default.component.mjs +0 -50
- package/esm2022/lib/formly/field/checklist/checklist.item.field.mjs +0 -14
- package/esm2022/lib/formly/field/checklist/checklist.item.field.module.mjs +0 -30
- package/esm2022/lib/formly/field/checklist/checklist.item.mjs +0 -2
- package/esm2022/lib/formly/field/checklist/index.mjs +0 -7
- package/esm2022/lib/formly/field/component/component.field.component.mjs +0 -25
- package/esm2022/lib/formly/field/component/component.field.mjs +0 -7
- package/esm2022/lib/formly/field/component/component.field.module.mjs +0 -26
- package/esm2022/lib/formly/field/component/index.mjs +0 -4
- package/esm2022/lib/formly/field/field.mjs +0 -97
- package/esm2022/lib/formly/field/form.field.module.mjs +0 -22
- package/esm2022/lib/formly/field/index.mjs +0 -9
- package/esm2022/lib/formly/field/selection/index.mjs +0 -8
- package/esm2022/lib/formly/field/selection/list/index.mjs +0 -4
- package/esm2022/lib/formly/field/selection/list/list.field.component.mjs +0 -90
- package/esm2022/lib/formly/field/selection/list/list.field.mjs +0 -15
- package/esm2022/lib/formly/field/selection/list/list.field.module.mjs +0 -26
- package/esm2022/lib/formly/field/selection/pickable/index.mjs +0 -8
- package/esm2022/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +0 -37
- package/esm2022/lib/formly/field/selection/pickable/pickable.field.directive.mjs +0 -272
- package/esm2022/lib/formly/field/selection/pickable/pickable.field.mjs +0 -26
- package/esm2022/lib/formly/field/selection/pickable/pickable.field.module.mjs +0 -33
- package/esm2022/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +0 -130
- package/esm2022/lib/formly/field/selection/pickable/pickable.mjs +0 -2
- package/esm2022/lib/formly/field/selection/pickable/pickable.util.mjs +0 -35
- package/esm2022/lib/formly/field/selection/searchable/index.mjs +0 -9
- package/esm2022/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +0 -70
- package/esm2022/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +0 -90
- package/esm2022/lib/formly/field/selection/searchable/searchable.field.directive.mjs +0 -288
- package/esm2022/lib/formly/field/selection/searchable/searchable.field.mjs +0 -69
- package/esm2022/lib/formly/field/selection/searchable/searchable.field.module.mjs +0 -34
- package/esm2022/lib/formly/field/selection/searchable/searchable.mjs +0 -2
- package/esm2022/lib/formly/field/selection/searchable/searchable.text.field.component.mjs +0 -72
- package/esm2022/lib/formly/field/selection/searchable/text.chip.field.mjs +0 -15
- package/esm2022/lib/formly/field/selection/selection.field.mjs +0 -39
- package/esm2022/lib/formly/field/selection/selection.mjs +0 -2
- package/esm2022/lib/formly/field/selection/selection.module.mjs +0 -28
- package/esm2022/lib/formly/field/selection/sourceselect/index.mjs +0 -5
- package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.component.mjs +0 -325
- package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.mjs +0 -14
- package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +0 -26
- package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.mjs +0 -2
- package/esm2022/lib/formly/field/texteditor/index.mjs +0 -4
- package/esm2022/lib/formly/field/texteditor/texteditor.field.component.mjs +0 -97
- package/esm2022/lib/formly/field/texteditor/texteditor.field.mjs +0 -21
- package/esm2022/lib/formly/field/texteditor/texteditor.field.module.mjs +0 -26
- package/esm2022/lib/formly/field/value/array/array.field.component.mjs +0 -231
- package/esm2022/lib/formly/field/value/array/array.field.mjs +0 -28
- package/esm2022/lib/formly/field/value/array/array.field.module.mjs +0 -26
- package/esm2022/lib/formly/field/value/array/index.mjs +0 -4
- package/esm2022/lib/formly/field/value/boolean/boolean.field.mjs +0 -51
- package/esm2022/lib/formly/field/value/boolean/boolean.field.module.mjs +0 -19
- package/esm2022/lib/formly/field/value/boolean/index.mjs +0 -3
- package/esm2022/lib/formly/field/value/date/date.field.module.mjs +0 -36
- package/esm2022/lib/formly/field/value/date/date.value.mjs +0 -133
- package/esm2022/lib/formly/field/value/date/datetime.field.component.mjs +0 -737
- package/esm2022/lib/formly/field/value/date/datetime.field.mjs +0 -151
- package/esm2022/lib/formly/field/value/date/datetime.field.service.mjs +0 -23
- package/esm2022/lib/formly/field/value/date/datetime.mjs +0 -26
- package/esm2022/lib/formly/field/value/date/datetime.preset.mjs +0 -31
- package/esm2022/lib/formly/field/value/date/fixeddaterange.field.component.mjs +0 -521
- package/esm2022/lib/formly/field/value/date/index.mjs +0 -10
- package/esm2022/lib/formly/field/value/hidden.field.mjs +0 -8
- package/esm2022/lib/formly/field/value/index.mjs +0 -9
- package/esm2022/lib/formly/field/value/number/index.mjs +0 -3
- package/esm2022/lib/formly/field/value/number/number.field.mjs +0 -75
- package/esm2022/lib/formly/field/value/number/number.field.module.mjs +0 -18
- package/esm2022/lib/formly/field/value/phone/index.mjs +0 -4
- package/esm2022/lib/formly/field/value/phone/phone.field.component.mjs +0 -104
- package/esm2022/lib/formly/field/value/phone/phone.field.mjs +0 -66
- package/esm2022/lib/formly/field/value/phone/phone.field.module.mjs +0 -26
- package/esm2022/lib/formly/field/value/text/index.mjs +0 -5
- package/esm2022/lib/formly/field/value/text/text.additional.field.mjs +0 -114
- package/esm2022/lib/formly/field/value/text/text.address.field.mjs +0 -73
- package/esm2022/lib/formly/field/value/text/text.field.mjs +0 -47
- package/esm2022/lib/formly/field/value/text/text.field.module.mjs +0 -20
- package/esm2022/lib/formly/field/value/value.module.mjs +0 -31
- package/esm2022/lib/formly/field/wrapper/autotouch.wrapper.component.mjs +0 -32
- package/esm2022/lib/formly/field/wrapper/expand.wrapper.component.mjs +0 -34
- package/esm2022/lib/formly/field/wrapper/expand.wrapper.delegate.mjs +0 -58
- package/esm2022/lib/formly/field/wrapper/flex.wrapper.component.mjs +0 -38
- package/esm2022/lib/formly/field/wrapper/index.mjs +0 -13
- package/esm2022/lib/formly/field/wrapper/info.wrapper.component.mjs +0 -48
- package/esm2022/lib/formly/field/wrapper/section.wrapper.component.mjs +0 -31
- package/esm2022/lib/formly/field/wrapper/style.wrapper.component.mjs +0 -53
- package/esm2022/lib/formly/field/wrapper/subsection.wrapper.component.mjs +0 -30
- package/esm2022/lib/formly/field/wrapper/toggle.wrapper.component.mjs +0 -55
- package/esm2022/lib/formly/field/wrapper/working.wrapper.component.mjs +0 -45
- package/esm2022/lib/formly/field/wrapper/wrapper.key.mjs +0 -10
- package/esm2022/lib/formly/field/wrapper/wrapper.mjs +0 -77
- package/esm2022/lib/formly/field/wrapper/wrapper.module.mjs +0 -101
- package/esm2022/lib/formly/form/form.form.mjs +0 -17
- package/esm2022/lib/formly/form/form.form.module.mjs +0 -20
- package/esm2022/lib/formly/form/index.mjs +0 -4
- package/esm2022/lib/formly/form/search.form.component.mjs +0 -35
- package/esm2022/lib/formly/formly.component.template.mjs +0 -29
- package/esm2022/lib/formly/formly.context.directive.mjs +0 -23
- package/esm2022/lib/formly/formly.context.mjs +0 -102
- package/esm2022/lib/formly/formly.directive.mjs +0 -79
- package/esm2022/lib/formly/formly.form.component.mjs +0 -193
- package/esm2022/lib/formly/formly.module.mjs +0 -40
- package/esm2022/lib/formly/formly.providers.mjs +0 -8
- package/esm2022/lib/formly/index.mjs +0 -12
- package/esm2022/lib/formly/template/available.mjs +0 -18
- package/esm2022/lib/formly/template/available.module.mjs +0 -18
- package/esm2022/lib/formly/template/index.mjs +0 -8
- package/esm2022/lib/formly/template/login.mjs +0 -92
- package/esm2022/lib/formly/template/login.module.mjs +0 -17
- package/esm2022/lib/formly/template/timezone.mjs +0 -46
- package/esm2022/lib/formly/template/timezone.module.mjs +0 -17
- package/esm2022/lib/formly/template/website.mjs +0 -25
- package/esm2022/lib/index.mjs +0 -7
- package/esm2022/lib/layout/form.layout.module.mjs +0 -20
- package/esm2022/lib/layout/form.spacer.directive.mjs +0 -20
- package/esm2022/lib/layout/index.mjs +0 -3
- package/esm2022/lib/validator/available.mjs +0 -31
- package/esm2022/lib/validator/boolean.mjs +0 -12
- package/esm2022/lib/validator/email.mjs +0 -6
- package/esm2022/lib/validator/field.mjs +0 -31
- package/esm2022/lib/validator/index.mjs +0 -8
- package/esm2022/lib/validator/number.mjs +0 -53
- package/esm2022/lib/validator/phone.mjs +0 -61
- package/esm2022/lib/validator/website.mjs +0 -68
- package/esm2022/mapbox/dereekb-dbx-form-mapbox.mjs +0 -5
- package/esm2022/mapbox/index.mjs +0 -3
- package/esm2022/mapbox/lib/field/index.mjs +0 -3
- package/esm2022/mapbox/lib/field/latlng/index.mjs +0 -5
- package/esm2022/mapbox/lib/field/latlng/latlng.field.component.mjs +0 -262
- package/esm2022/mapbox/lib/field/latlng/latlng.field.marker.component.mjs +0 -34
- package/esm2022/mapbox/lib/field/latlng/latlng.field.mjs +0 -35
- package/esm2022/mapbox/lib/field/latlng/latlng.module.mjs +0 -26
- package/esm2022/mapbox/lib/field/zoom/index.mjs +0 -4
- package/esm2022/mapbox/lib/field/zoom/zoom.field.component.mjs +0 -146
- package/esm2022/mapbox/lib/field/zoom/zoom.field.mjs +0 -23
- package/esm2022/mapbox/lib/field/zoom/zoom.module.mjs +0 -26
- package/esm2022/mapbox/lib/mapbox.module.mjs +0 -16
- package/index.d.ts +0 -1
- package/lib/form/action/form.action.dialog.component.d.ts +0 -62
- package/lib/form/action/form.action.directive.d.ts +0 -65
- package/lib/form/action/form.action.module.d.ts +0 -10
- package/lib/form/action/index.d.ts +0 -4
- package/lib/form/action/transition/form.action.transition.module.d.ts +0 -10
- package/lib/form/action/transition/form.action.transition.safety.directive.d.ts +0 -17
- package/lib/form/action/transition/index.d.ts +0 -2
- package/lib/form/form.angular.util.d.ts +0 -15
- package/lib/form/form.d.ts +0 -92
- package/lib/form/form.module.d.ts +0 -9
- package/lib/form/index.d.ts +0 -5
- package/lib/form/io/form.change.directive.d.ts +0 -17
- package/lib/form/io/form.input.directive.d.ts +0 -27
- package/lib/form/io/form.io.module.d.ts +0 -16
- package/lib/form/io/form.loading.directive.d.ts +0 -21
- package/lib/form/io/index.d.ts +0 -4
- package/lib/form.module.d.ts +0 -10
- package/lib/form.providers.d.ts +0 -8
- package/lib/formly/config/index.d.ts +0 -1
- package/lib/formly/config/validation.d.ts +0 -23
- package/lib/formly/field/checklist/checklist.field.d.ts +0 -44
- package/lib/formly/field/checklist/checklist.item.d.ts +0 -36
- package/lib/formly/field/checklist/checklist.item.field.component.d.ts +0 -43
- package/lib/formly/field/checklist/checklist.item.field.content.default.component.d.ts +0 -10
- package/lib/formly/field/checklist/checklist.item.field.d.ts +0 -7
- package/lib/formly/field/checklist/checklist.item.field.module.d.ts +0 -10
- package/lib/formly/field/checklist/index.d.ts +0 -6
- package/lib/formly/field/component/component.field.component.d.ts +0 -12
- package/lib/formly/field/component/component.field.d.ts +0 -3
- package/lib/formly/field/component/component.field.module.d.ts +0 -8
- package/lib/formly/field/component/index.d.ts +0 -3
- package/lib/formly/field/field.d.ts +0 -99
- package/lib/formly/field/form.field.module.d.ts +0 -12
- package/lib/formly/field/index.d.ts +0 -8
- package/lib/formly/field/selection/index.d.ts +0 -7
- package/lib/formly/field/selection/list/index.d.ts +0 -3
- package/lib/formly/field/selection/list/list.field.component.d.ts +0 -55
- package/lib/formly/field/selection/list/list.field.d.ts +0 -8
- package/lib/formly/field/selection/list/list.field.module.d.ts +0 -8
- package/lib/formly/field/selection/pickable/index.d.ts +0 -7
- package/lib/formly/field/selection/pickable/pickable.chip.field.component.d.ts +0 -10
- package/lib/formly/field/selection/pickable/pickable.d.ts +0 -26
- package/lib/formly/field/selection/pickable/pickable.field.d.ts +0 -8
- package/lib/formly/field/selection/pickable/pickable.field.directive.d.ts +0 -169
- package/lib/formly/field/selection/pickable/pickable.field.module.d.ts +0 -9
- package/lib/formly/field/selection/pickable/pickable.list.field.component.d.ts +0 -39
- package/lib/formly/field/selection/pickable/pickable.util.d.ts +0 -14
- package/lib/formly/field/selection/searchable/index.d.ts +0 -8
- package/lib/formly/field/selection/searchable/searchable.chip.field.component.d.ts +0 -28
- package/lib/formly/field/selection/searchable/searchable.d.ts +0 -39
- package/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.d.ts +0 -22
- package/lib/formly/field/selection/searchable/searchable.field.d.ts +0 -25
- package/lib/formly/field/selection/searchable/searchable.field.directive.d.ts +0 -163
- package/lib/formly/field/selection/searchable/searchable.field.module.d.ts +0 -10
- package/lib/formly/field/selection/searchable/searchable.text.field.component.d.ts +0 -24
- package/lib/formly/field/selection/searchable/text.chip.field.d.ts +0 -8
- package/lib/formly/field/selection/selection.d.ts +0 -26
- package/lib/formly/field/selection/selection.field.d.ts +0 -38
- package/lib/formly/field/selection/selection.module.d.ts +0 -18
- package/lib/formly/field/selection/sourceselect/index.d.ts +0 -4
- package/lib/formly/field/selection/sourceselect/sourceselect.d.ts +0 -116
- package/lib/formly/field/selection/sourceselect/sourceselect.field.component.d.ts +0 -95
- package/lib/formly/field/selection/sourceselect/sourceselect.field.d.ts +0 -7
- package/lib/formly/field/selection/sourceselect/sourceselect.field.module.d.ts +0 -8
- package/lib/formly/field/texteditor/index.d.ts +0 -3
- package/lib/formly/field/texteditor/texteditor.field.component.d.ts +0 -24
- package/lib/formly/field/texteditor/texteditor.field.d.ts +0 -6
- package/lib/formly/field/texteditor/texteditor.field.module.d.ts +0 -8
- package/lib/formly/field/value/array/array.field.component.d.ts +0 -89
- package/lib/formly/field/value/array/array.field.d.ts +0 -40
- package/lib/formly/field/value/array/array.field.module.d.ts +0 -8
- package/lib/formly/field/value/array/index.d.ts +0 -3
- package/lib/formly/field/value/boolean/boolean.field.d.ts +0 -8
- package/lib/formly/field/value/boolean/boolean.field.module.d.ts +0 -9
- package/lib/formly/field/value/boolean/index.d.ts +0 -2
- package/lib/formly/field/value/date/date.field.module.d.ts +0 -10
- package/lib/formly/field/value/date/date.value.d.ts +0 -32
- package/lib/formly/field/value/date/datetime.d.ts +0 -56
- package/lib/formly/field/value/date/datetime.field.component.d.ts +0 -307
- package/lib/formly/field/value/date/datetime.field.d.ts +0 -31
- package/lib/formly/field/value/date/datetime.field.service.d.ts +0 -12
- package/lib/formly/field/value/date/datetime.preset.d.ts +0 -2
- package/lib/formly/field/value/date/fixeddaterange.field.component.d.ts +0 -163
- package/lib/formly/field/value/date/index.d.ts +0 -9
- package/lib/formly/field/value/hidden.field.d.ts +0 -4
- package/lib/formly/field/value/index.d.ts +0 -8
- package/lib/formly/field/value/number/index.d.ts +0 -2
- package/lib/formly/field/value/number/number.field.d.ts +0 -46
- package/lib/formly/field/value/number/number.field.module.d.ts +0 -8
- package/lib/formly/field/value/phone/index.d.ts +0 -3
- package/lib/formly/field/value/phone/phone.field.component.d.ts +0 -35
- package/lib/formly/field/value/phone/phone.field.d.ts +0 -28
- package/lib/formly/field/value/phone/phone.field.module.d.ts +0 -8
- package/lib/formly/field/value/text/index.d.ts +0 -4
- package/lib/formly/field/value/text/text.additional.field.d.ts +0 -24
- package/lib/formly/field/value/text/text.address.field.d.ts +0 -43
- package/lib/formly/field/value/text/text.field.d.ts +0 -21
- package/lib/formly/field/value/text/text.field.module.d.ts +0 -10
- package/lib/formly/field/value/value.module.d.ts +0 -21
- package/lib/formly/field/wrapper/autotouch.wrapper.component.d.ts +0 -11
- package/lib/formly/field/wrapper/expand.wrapper.component.d.ts +0 -14
- package/lib/formly/field/wrapper/expand.wrapper.delegate.d.ts +0 -31
- package/lib/formly/field/wrapper/flex.wrapper.component.d.ts +0 -25
- package/lib/formly/field/wrapper/index.d.ts +0 -12
- package/lib/formly/field/wrapper/info.wrapper.component.d.ts +0 -11
- package/lib/formly/field/wrapper/section.wrapper.component.d.ts +0 -10
- package/lib/formly/field/wrapper/style.wrapper.component.d.ts +0 -27
- package/lib/formly/field/wrapper/subsection.wrapper.component.d.ts +0 -10
- package/lib/formly/field/wrapper/toggle.wrapper.component.d.ts +0 -17
- package/lib/formly/field/wrapper/working.wrapper.component.d.ts +0 -21
- package/lib/formly/field/wrapper/wrapper.d.ts +0 -35
- package/lib/formly/field/wrapper/wrapper.key.d.ts +0 -9
- package/lib/formly/field/wrapper/wrapper.module.d.ts +0 -17
- package/lib/formly/form/form.form.d.ts +0 -11
- package/lib/formly/form/form.form.module.d.ts +0 -10
- package/lib/formly/form/index.d.ts +0 -3
- package/lib/formly/form/search.form.component.d.ts +0 -12
- package/lib/formly/formly.component.template.d.ts +0 -19
- package/lib/formly/formly.context.d.ts +0 -57
- package/lib/formly/formly.context.directive.d.ts +0 -17
- package/lib/formly/formly.directive.d.ts +0 -54
- package/lib/formly/formly.form.component.d.ts +0 -51
- package/lib/formly/formly.module.d.ts +0 -15
- package/lib/formly/formly.providers.d.ts +0 -1
- package/lib/formly/index.d.ts +0 -11
- package/lib/formly/template/available.d.ts +0 -7
- package/lib/formly/template/available.module.d.ts +0 -8
- package/lib/formly/template/index.d.ts +0 -7
- package/lib/formly/template/login.d.ts +0 -66
- package/lib/formly/template/login.module.d.ts +0 -7
- package/lib/formly/template/timezone.d.ts +0 -20
- package/lib/formly/template/timezone.module.d.ts +0 -7
- package/lib/formly/template/website.d.ts +0 -15
- package/lib/index.d.ts +0 -6
- package/lib/layout/form.layout.module.d.ts +0 -10
- package/lib/layout/form.spacer.directive.d.ts +0 -8
- package/lib/layout/index.d.ts +0 -2
- package/lib/validator/available.d.ts +0 -30
- package/lib/validator/boolean.d.ts +0 -2
- package/lib/validator/email.d.ts +0 -2
- package/lib/validator/field.d.ts +0 -32
- package/lib/validator/index.d.ts +0 -7
- package/lib/validator/number.d.ts +0 -23
- package/lib/validator/phone.d.ts +0 -16
- package/lib/validator/website.d.ts +0 -31
- package/mapbox/index.d.ts +0 -2
- package/mapbox/lib/field/index.d.ts +0 -2
- package/mapbox/lib/field/latlng/index.d.ts +0 -4
- package/mapbox/lib/field/latlng/latlng.field.component.d.ts +0 -116
- package/mapbox/lib/field/latlng/latlng.field.d.ts +0 -6
- package/mapbox/lib/field/latlng/latlng.field.marker.component.d.ts +0 -12
- package/mapbox/lib/field/latlng/latlng.module.d.ts +0 -8
- package/mapbox/lib/field/zoom/index.d.ts +0 -3
- package/mapbox/lib/field/zoom/zoom.field.component.d.ts +0 -68
- package/mapbox/lib/field/zoom/zoom.field.d.ts +0 -6
- package/mapbox/lib/field/zoom/zoom.module.d.ts +0 -8
- package/mapbox/lib/mapbox.module.d.ts +0 -8
|
@@ -1,737 +0,0 @@
|
|
|
1
|
-
import { asArray, filterMaybeArrayValues, isISO8601DayStringStart, mapIdentityFunction } from '@dereekb/util';
|
|
2
|
-
import { dateFromLogicalDate, DateTimeMinuteInstance, guessCurrentTimezone, readableTimeStringToDate, toLocalReadableTimeString, utcDayForDate, safeToJsDate, findMinDate, findMaxDate, isSameDateHoursAndMinutes, getTimezoneAbbreviation, isSameDateDay, dateTimezoneUtcNormal, toJsDayDate, isSameDate, dateTimeMinuteWholeDayDecisionFunction, dateTimeMinuteDecisionFunction } from '@dereekb/date';
|
|
3
|
-
import { switchMap, shareReplay, map, startWith, tap, first, distinctUntilChanged, debounceTime, throttleTime, BehaviorSubject, combineLatest, Subject, merge, interval, of, combineLatestWith, filter, skip } from 'rxjs';
|
|
4
|
-
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
|
5
|
-
import { FormControl, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
6
|
-
import { FieldType } from '@ngx-formly/material';
|
|
7
|
-
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
8
|
-
import { addMinutes, startOfDay, addDays } from 'date-fns';
|
|
9
|
-
import { asObservableFromGetter, filterMaybe, skipFirstMaybe, SubscriptionObject, switchMapMaybeDefault, switchMapFilterMaybe } from '@dereekb/rxjs';
|
|
10
|
-
import { dateTimePreset } from './datetime';
|
|
11
|
-
import { DbxDateTimeFieldMenuPresetsService } from './datetime.field.service';
|
|
12
|
-
import { DbxDateTimeValueMode, dbxDateTimeInputValueParseFactory, dbxDateTimeIsSameDateTimeFieldValue, dbxDateTimeOutputValueFactory } from './date.value';
|
|
13
|
-
import { streamValueFromControl } from '../../../../form/form.angular.util';
|
|
14
|
-
import { toggleDisableFormControl } from '../../../../form/form';
|
|
15
|
-
import { toSignal } from '@angular/core/rxjs-interop';
|
|
16
|
-
import { FlexLayoutModule } from '@ngbracket/ngx-layout';
|
|
17
|
-
import { DatePipe, NgClass, NgTemplateOutlet } from '@angular/common';
|
|
18
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
19
|
-
import { MatError, MatFormFieldModule } from '@angular/material/form-field';
|
|
20
|
-
import { MatInputModule } from '@angular/material/input';
|
|
21
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
22
|
-
import { MatMenuModule } from '@angular/material/menu';
|
|
23
|
-
import { DateDistancePipe, GetValuePipe, TimeDistancePipe } from '@dereekb/dbx-core';
|
|
24
|
-
import { MatDividerModule } from '@angular/material/divider';
|
|
25
|
-
import * as i0 from "@angular/core";
|
|
26
|
-
import * as i1 from "@ngbracket/ngx-layout/flex";
|
|
27
|
-
import * as i2 from "@ngbracket/ngx-layout/extended";
|
|
28
|
-
import * as i3 from "@angular/material/button";
|
|
29
|
-
import * as i4 from "@angular/material/form-field";
|
|
30
|
-
import * as i5 from "@angular/material/datepicker";
|
|
31
|
-
import * as i6 from "@angular/material/input";
|
|
32
|
-
import * as i7 from "@angular/forms";
|
|
33
|
-
import * as i8 from "@angular/material/icon";
|
|
34
|
-
import * as i9 from "@angular/material/menu";
|
|
35
|
-
import * as i10 from "@angular/material/divider";
|
|
36
|
-
export var DbxDateTimeFieldTimeMode;
|
|
37
|
-
(function (DbxDateTimeFieldTimeMode) {
|
|
38
|
-
/**
|
|
39
|
-
* Time is required.
|
|
40
|
-
*/
|
|
41
|
-
DbxDateTimeFieldTimeMode["REQUIRED"] = "required";
|
|
42
|
-
/**
|
|
43
|
-
* Time is optional.
|
|
44
|
-
*/
|
|
45
|
-
DbxDateTimeFieldTimeMode["OPTIONAL"] = "optional";
|
|
46
|
-
/**
|
|
47
|
-
* Time is permenantly off.
|
|
48
|
-
*/
|
|
49
|
-
DbxDateTimeFieldTimeMode["NONE"] = "none";
|
|
50
|
-
})(DbxDateTimeFieldTimeMode || (DbxDateTimeFieldTimeMode = {}));
|
|
51
|
-
export function isDbxDateTimeFieldTimeDateConfig(input) {
|
|
52
|
-
return input != null && typeof input === 'object' && typeof input.path === 'string';
|
|
53
|
-
}
|
|
54
|
-
export function syncConfigValueObs(parseConfigsObs, type) {
|
|
55
|
-
return parseConfigsObs.pipe(switchMap((x) => {
|
|
56
|
-
const config = x.find((y) => y.syncType === type);
|
|
57
|
-
let result;
|
|
58
|
-
if (config) {
|
|
59
|
-
const { control } = config;
|
|
60
|
-
result = control.valueChanges.pipe(startWith(control.value), map((x) => safeToJsDate(x) ?? null));
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
result = of(null);
|
|
64
|
-
}
|
|
65
|
-
return result;
|
|
66
|
-
}), distinctUntilChanged(), shareReplay(1));
|
|
67
|
-
}
|
|
68
|
-
const TIME_OUTPUT_THROTTLE_TIME = 10;
|
|
69
|
-
/**
|
|
70
|
-
* Error code used when the selected date is not in the schedule.
|
|
71
|
-
*/
|
|
72
|
-
export const DBX_DATE_TIME_FIELD_DATE_NOT_IN_SCHEDULE_ERROR = 'dateTimeFieldDateNotInSchedule';
|
|
73
|
-
/**
|
|
74
|
-
* Error code used when the selected time/time input is not in the limited range.
|
|
75
|
-
*/
|
|
76
|
-
export const DBX_DATE_TIME_FIELD_TIME_NOT_IN_RANGE_ERROR = 'dateTimeFieldTimeNotInRange';
|
|
77
|
-
export class DbxDateTimeFieldComponent extends FieldType {
|
|
78
|
-
dbxDateTimeFieldConfigService = inject(DbxDateTimeFieldMenuPresetsService);
|
|
79
|
-
_sub = new SubscriptionObject();
|
|
80
|
-
_valueSub = new SubscriptionObject();
|
|
81
|
-
_autoFillDateSync = new SubscriptionObject();
|
|
82
|
-
_config = new BehaviorSubject(undefined);
|
|
83
|
-
latestConfig$ = this._config.pipe(switchMapMaybeDefault(), distinctUntilChanged(), shareReplay(1));
|
|
84
|
-
_syncConfigObs = new BehaviorSubject(undefined);
|
|
85
|
-
_defaultTimezone = new BehaviorSubject(undefined);
|
|
86
|
-
_timeDate = new BehaviorSubject(undefined);
|
|
87
|
-
_presets = new BehaviorSubject(of([]));
|
|
88
|
-
/**
|
|
89
|
-
* Alternative/backup full day control if not defined in the Formly form.
|
|
90
|
-
*/
|
|
91
|
-
_fullDayInputCtrl = new FormControl(false);
|
|
92
|
-
_fullDayControlObs = new BehaviorSubject(undefined);
|
|
93
|
-
fullDayControl$ = this._fullDayControlObs.pipe(filterMaybe());
|
|
94
|
-
_offset = new BehaviorSubject(0);
|
|
95
|
-
_formControlObs = new BehaviorSubject(undefined);
|
|
96
|
-
formControl$ = this._formControlObs.pipe(filterMaybe());
|
|
97
|
-
_cleared = new Subject();
|
|
98
|
-
_updateTime = new Subject();
|
|
99
|
-
_resyncTimeInputSub = new SubscriptionObject();
|
|
100
|
-
_resyncTimeInput = new Subject();
|
|
101
|
-
timeErrorStateMatcher = {
|
|
102
|
-
isErrorState: (control, form) => {
|
|
103
|
-
if (control) {
|
|
104
|
-
return (control.invalid && (control.dirty || control.touched)) || this.errorStateMatcher.isErrorState(this.formControl, form);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
resyncTimeInput$ = this._resyncTimeInput.pipe(debounceTime(200), shareReplay(1));
|
|
112
|
-
_configUpdateTimeSync = new SubscriptionObject(this.latestConfig$.pipe(skip(1)).subscribe((x) => {
|
|
113
|
-
this._updateTime.next();
|
|
114
|
-
}));
|
|
115
|
-
timezone$ = this._defaultTimezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
|
|
116
|
-
return defaultTimezone ?? guessCurrentTimezone();
|
|
117
|
-
}), distinctUntilChanged(), shareReplay(1));
|
|
118
|
-
timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
|
|
119
|
-
timeDate$ = this._timeDate.pipe(switchMapMaybeDefault(), switchMap((x) => {
|
|
120
|
-
let obs;
|
|
121
|
-
if (x) {
|
|
122
|
-
// if the string is not a date string, then treat it as a path
|
|
123
|
-
if ((typeof x === 'string' && !isISO8601DayStringStart(x)) || isDbxDateTimeFieldTimeDateConfig(x)) {
|
|
124
|
-
const { path, mapValue } = typeof x === 'string' ? { path: x } : x;
|
|
125
|
-
obs =
|
|
126
|
-
streamValueFromControl(this.form, path)?.pipe(map(mapValue ?? mapIdentityFunction()), map((x) => (x ? toJsDayDate(x) : undefined))) ?? of(undefined);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
obs = of(toJsDayDate(x));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
obs = of(undefined);
|
|
134
|
-
}
|
|
135
|
-
return obs;
|
|
136
|
-
}), distinctUntilChanged(isSameDateDay), shareReplay(1));
|
|
137
|
-
valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
|
|
138
|
-
return x.pipe(map(dbxDateTimeInputValueParseFactory(this.valueMode, timezoneInstance)));
|
|
139
|
-
}), throttleTime(20, undefined, { leading: true, trailing: true }), // throttle incoming values and timezone changes
|
|
140
|
-
distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
141
|
-
refreshInteral$ = interval(10 * 1000);
|
|
142
|
-
/**
|
|
143
|
-
* Used to trigger/display visual updates (specifically on timeDistance, etc.).
|
|
144
|
-
*/
|
|
145
|
-
displayValue$ = this.refreshInteral$.pipe(
|
|
146
|
-
// every 10 seconds, refresh w/interval
|
|
147
|
-
startWith(0), map(() => new Date().getMinutes()), distinctUntilChanged(), switchMap(() => this.valueInSystemTimezone$), shareReplay(1));
|
|
148
|
-
timeString$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? toLocalReadableTimeString(x) : '')), distinctUntilChanged(), shareReplay(1));
|
|
149
|
-
dateInputCtrl = new FormControl(null, {
|
|
150
|
-
validators: []
|
|
151
|
-
});
|
|
152
|
-
timeInputCtrl = new FormControl(null, {
|
|
153
|
-
validators: [Validators.pattern(/^(now)$|^([0-9]|(0[0-9])|(1[0-9])|(2[0-3]))(:)?([0-5][0-9])?(\s)?([apAP][Mm])?(\\s)*$/)]
|
|
154
|
-
});
|
|
155
|
-
get dateLabel() {
|
|
156
|
-
return this.props.dateLabel ?? 'Date';
|
|
157
|
-
}
|
|
158
|
-
get timeLabel() {
|
|
159
|
-
return this.props.timeLabel ?? 'Time';
|
|
160
|
-
}
|
|
161
|
-
get allDayLabel() {
|
|
162
|
-
return this.props.allDayLabel ?? 'All Day';
|
|
163
|
-
}
|
|
164
|
-
get atTimeLabel() {
|
|
165
|
-
return this.props.atTimeLabel ?? 'At';
|
|
166
|
-
}
|
|
167
|
-
get dateOnly() {
|
|
168
|
-
return this.timeMode === DbxDateTimeFieldTimeMode.NONE;
|
|
169
|
-
}
|
|
170
|
-
get dateTimeField() {
|
|
171
|
-
return this.field.props;
|
|
172
|
-
}
|
|
173
|
-
get timeOnly() {
|
|
174
|
-
const timeValuesOnly = this.valueMode === DbxDateTimeValueMode.MINUTE_OF_DAY;
|
|
175
|
-
if (timeValuesOnly) {
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
return this.dateTimeField.timeOnly;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
get alwaysShowDateInput() {
|
|
183
|
-
return this.props.alwaysShowDateInput ?? true;
|
|
184
|
-
}
|
|
185
|
-
get autofillDateWhenTimeIsPicked() {
|
|
186
|
-
return this.props.autofillDateWhenTimeIsPicked ?? this.alwaysShowDateInput === false;
|
|
187
|
-
}
|
|
188
|
-
get showDateInput() {
|
|
189
|
-
return !this.timeOnly;
|
|
190
|
-
}
|
|
191
|
-
get valueMode() {
|
|
192
|
-
return this.field.props.valueMode ?? DbxDateTimeValueMode.DATE;
|
|
193
|
-
}
|
|
194
|
-
get timeMode() {
|
|
195
|
-
const dateValuesOnly = this.valueMode === DbxDateTimeValueMode.DAY_STRING;
|
|
196
|
-
if (dateValuesOnly) {
|
|
197
|
-
return DbxDateTimeFieldTimeMode.NONE;
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
return this.timeOnly ? DbxDateTimeFieldTimeMode.REQUIRED : (this.dateTimeField.timeMode ?? DbxDateTimeFieldTimeMode.REQUIRED);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
get isDateRequired() {
|
|
204
|
-
return this.props.required ?? false;
|
|
205
|
-
}
|
|
206
|
-
get isTimeRequired() {
|
|
207
|
-
return this.isDateRequired && this.timeMode === DbxDateTimeFieldTimeMode.REQUIRED;
|
|
208
|
-
}
|
|
209
|
-
get description() {
|
|
210
|
-
return this.field.props.description;
|
|
211
|
-
}
|
|
212
|
-
get hideDateHint() {
|
|
213
|
-
return this.field.props.hideDateHint ?? false;
|
|
214
|
-
}
|
|
215
|
-
get hideDatePicker() {
|
|
216
|
-
return this.field.props.hideDatePicker ?? false;
|
|
217
|
-
}
|
|
218
|
-
get timezone() {
|
|
219
|
-
return this.field.props.timezone;
|
|
220
|
-
}
|
|
221
|
-
get timeDate() {
|
|
222
|
-
return this.field.props.timeDate;
|
|
223
|
-
}
|
|
224
|
-
get showTimezone() {
|
|
225
|
-
return this.field.props.showTimezone ?? true;
|
|
226
|
-
}
|
|
227
|
-
get presets() {
|
|
228
|
-
return this.field.props.presets;
|
|
229
|
-
}
|
|
230
|
-
get showClearButton() {
|
|
231
|
-
return this.field.props.showClearButton;
|
|
232
|
-
}
|
|
233
|
-
get minuteStep() {
|
|
234
|
-
return this.field.props.minuteStep ?? this.field.props.step ?? 5;
|
|
235
|
-
}
|
|
236
|
-
fullDay$ = this.fullDayControl$.pipe(switchMap((control) => control.valueChanges.pipe(startWith(control.value))), distinctUntilChanged(), shareReplay(1));
|
|
237
|
-
showTimeInput$ = this.fullDay$.pipe(map((x) => !x && this.timeMode !== DbxDateTimeFieldTimeMode.NONE));
|
|
238
|
-
showAddTime$ = this.showTimeInput$.pipe(map((x) => !x && this.timeMode === DbxDateTimeFieldTimeMode.OPTIONAL), shareReplay(1));
|
|
239
|
-
currentDate$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), shareReplay(1));
|
|
240
|
-
date$ = this.currentDate$.pipe(filterMaybe(), shareReplay(1));
|
|
241
|
-
timezoneAbbreviation$ = combineLatest([this.currentDate$, this.timezone$, this.timeDate$]).pipe(map(([date, timezone, timeDate]) => getTimezoneAbbreviation(timezone, timeDate ?? date ?? new Date())), distinctUntilChanged(), shareReplay(1));
|
|
242
|
-
dateValue$ = merge(this.date$, this.valueInSystemTimezone$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : null)), distinctUntilChanged(isSameDateDay), shareReplay(1));
|
|
243
|
-
timeInput$ = this._updateTime.pipe(debounceTime(5), map(() => this.timeInputCtrl.value || ''), distinctUntilChanged());
|
|
244
|
-
syncConfigObs$ = this._syncConfigObs.pipe(switchMapMaybeDefault(), shareReplay(1));
|
|
245
|
-
parsedSyncConfigs$ = this.syncConfigObs$.pipe(map((x) => {
|
|
246
|
-
let parsed;
|
|
247
|
-
if (x) {
|
|
248
|
-
parsed = filterMaybeArrayValues(asArray(x).map((y) => {
|
|
249
|
-
const control = this.form.get(y.syncWith);
|
|
250
|
-
if (control) {
|
|
251
|
-
return {
|
|
252
|
-
control,
|
|
253
|
-
...y
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
return undefined;
|
|
258
|
-
}
|
|
259
|
-
}));
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
parsed = [];
|
|
263
|
-
}
|
|
264
|
-
return parsed;
|
|
265
|
-
}), shareReplay(1));
|
|
266
|
-
syncConfigBeforeValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'before');
|
|
267
|
-
syncConfigAfterValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'after');
|
|
268
|
-
isTimeCleared$ = combineLatest([this.currentDate$, this._timeDate.pipe(startWith(null))]).pipe(switchMap(([date, time]) => {
|
|
269
|
-
const isTimeCleared = Boolean(!date && !time);
|
|
270
|
-
return this._cleared.pipe(map(() => true), startWith(isTimeCleared));
|
|
271
|
-
}), distinctUntilChanged(), shareReplay(1));
|
|
272
|
-
_rawDateTimeDateValue$ = this._config.pipe(first(), switchMap(() => (this.timeOnly ? of(null) : this.dateValue$)));
|
|
273
|
-
_rawDateTimeTimeValue$ = this.timeInput$.pipe(startWith(null));
|
|
274
|
-
rawDateTime$ = combineLatest([this._rawDateTimeDateValue$, this._rawDateTimeTimeValue$, this.fullDay$, this.timeDate$, this.isTimeCleared$]).pipe(map(([date, timeString, fullDay, timeDate, isTimeCleared]) => {
|
|
275
|
-
let result;
|
|
276
|
-
if (!isTimeCleared) {
|
|
277
|
-
if (!date || this.timeOnly) {
|
|
278
|
-
date = timeDate ?? new Date(); // use the time date, or default to the current day
|
|
279
|
-
}
|
|
280
|
-
if (date) {
|
|
281
|
-
if (fullDay) {
|
|
282
|
-
if (this.dateTimeField.fullDayInUTC) {
|
|
283
|
-
result = utcDayForDate(date);
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
result = startOfDay(date);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
else if (timeString) {
|
|
290
|
-
result =
|
|
291
|
-
readableTimeStringToDate(timeString, {
|
|
292
|
-
date,
|
|
293
|
-
useSystemTimezone: true
|
|
294
|
-
}) ?? date;
|
|
295
|
-
}
|
|
296
|
-
else if (!this.timeOnly) {
|
|
297
|
-
if (this.timeMode !== DbxDateTimeFieldTimeMode.REQUIRED) {
|
|
298
|
-
// only autofill the date if the time is marked as required (and the time string is empty)
|
|
299
|
-
result = date;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return result;
|
|
305
|
-
}), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
306
|
-
dateTimePickerConfig$ = combineLatest([this._config.pipe(switchMapFilterMaybe()), this.syncConfigBeforeValue$, this.syncConfigAfterValue$]).pipe(map(([x, dateInputMin, dateInputMax]) => {
|
|
307
|
-
let result = x;
|
|
308
|
-
if (dateInputMin != null || dateInputMax != null) {
|
|
309
|
-
const { min: limitMin, max: limitMax } = x?.limits ?? {};
|
|
310
|
-
const min = findMinDate([dateInputMin, dateFromLogicalDate(limitMin)]);
|
|
311
|
-
const max = findMaxDate([dateInputMax, dateFromLogicalDate(limitMax)]);
|
|
312
|
-
result = {
|
|
313
|
-
...x,
|
|
314
|
-
limits: {
|
|
315
|
-
...x?.limits,
|
|
316
|
-
min,
|
|
317
|
-
max
|
|
318
|
-
}
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
return result;
|
|
322
|
-
}), distinctUntilChanged(), shareReplay(1));
|
|
323
|
-
dateInputMin$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.min ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
|
|
324
|
-
dateInputMax$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.max ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
|
|
325
|
-
/**
|
|
326
|
-
* Whether or not there is a limited min/max date range applied/available.
|
|
327
|
-
*/
|
|
328
|
-
hasRestrictedDateRange$ = combineLatest([this.dateInputMin$, this.dateInputMax$]).pipe(map(([a, b]) => Boolean(a || b)), distinctUntilChanged(), shareReplay(1));
|
|
329
|
-
dateMinAndMaxIsSameDay$ = combineLatest([this.dateInputMin$, this.dateInputMax$]).pipe(map(([a, b]) => Boolean(a && b) && isSameDateDay(a, b)), distinctUntilChanged(), shareReplay(1));
|
|
330
|
-
pickerFilter$ = this.dateTimePickerConfig$.pipe(distinctUntilChanged(), map((x) => {
|
|
331
|
-
if (x) {
|
|
332
|
-
const filter = dateTimeMinuteWholeDayDecisionFunction(x, false);
|
|
333
|
-
return (x) => (x != null ? filter(x) : true);
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
return () => true;
|
|
337
|
-
}
|
|
338
|
-
}), shareReplay(1));
|
|
339
|
-
defaultPickerFilter = () => true;
|
|
340
|
-
timeOutput$ = combineLatest([this.rawDateTime$, this._offset, this.dateTimePickerConfig$]).pipe(throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), distinctUntilChanged((current, next) => current[0] === next[0] && next[1] === 0 && current[2] === next[2]), tap(([, stepsOffset]) => (stepsOffset ? this._offset.next(0) : 0)), map(([date, stepsOffset, config]) => {
|
|
341
|
-
if (date != null) {
|
|
342
|
-
const instance = new DateTimeMinuteInstance({
|
|
343
|
-
date,
|
|
344
|
-
...config,
|
|
345
|
-
roundDownToMinute: true
|
|
346
|
-
});
|
|
347
|
-
// only clamp when the steps offset is set
|
|
348
|
-
if (stepsOffset) {
|
|
349
|
-
date = instance.clamp(date);
|
|
350
|
-
const minutes = stepsOffset * this.minuteStep;
|
|
351
|
-
if (minutes != 0) {
|
|
352
|
-
date = addMinutes(date, minutes);
|
|
353
|
-
date = instance.clamp(date); // clamp the date again
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return date;
|
|
358
|
-
}), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
359
|
-
dateTimePickerInstance$ = this.dateTimePickerConfig$.pipe(map((config) => {
|
|
360
|
-
return new DateTimeMinuteInstance({
|
|
361
|
-
...config,
|
|
362
|
-
roundDownToMinute: true
|
|
363
|
-
});
|
|
364
|
-
}), shareReplay(1));
|
|
365
|
-
hasEmptyDisplayValue$ = this.displayValue$.pipe(map((x) => !x), distinctUntilChanged(), shareReplay(1));
|
|
366
|
-
allPresets$ = this._presets.pipe(switchMapFilterMaybe(), map((x) => x.map(dateTimePreset)), shareReplay(1));
|
|
367
|
-
_presetsPickerFilter$ = this.dateTimePickerConfig$.pipe(map((config) => {
|
|
368
|
-
if (config) {
|
|
369
|
-
const filter = dateTimeMinuteDecisionFunction(config); // filter that the date must be in the given range
|
|
370
|
-
return (x) => (x != null ? filter(x) : true);
|
|
371
|
-
}
|
|
372
|
-
else {
|
|
373
|
-
return () => true;
|
|
374
|
-
}
|
|
375
|
-
}));
|
|
376
|
-
presets$ = combineLatest([this.allPresets$, this.fullDay$]).pipe(switchMap(([x, fullDay]) => {
|
|
377
|
-
let result;
|
|
378
|
-
if (this.timeOnly) {
|
|
379
|
-
result = of(x); // do not filter based on the date
|
|
380
|
-
}
|
|
381
|
-
else if (fullDay) {
|
|
382
|
-
result = of([]);
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
result = combineLatest([this._rawDateTimeDateValue$.pipe(throttleTime(1000, undefined, { leading: true, trailing: true })), this._presetsPickerFilter$]).pipe(map(([selectedDate, isAllowedDate]) => {
|
|
386
|
-
const allowedPresets = [];
|
|
387
|
-
if (selectedDate) {
|
|
388
|
-
// iterate each preset and check if it is allowed
|
|
389
|
-
x.forEach((preset) => {
|
|
390
|
-
const value = preset.value();
|
|
391
|
-
let presetDate;
|
|
392
|
-
if (value.logicalDate) {
|
|
393
|
-
presetDate = dateFromLogicalDate(value.logicalDate);
|
|
394
|
-
}
|
|
395
|
-
else if (value.timeString) {
|
|
396
|
-
presetDate = readableTimeStringToDate(value.timeString, {
|
|
397
|
-
date: selectedDate,
|
|
398
|
-
useSystemTimezone: true
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
// the computed date should be within the allowed range
|
|
402
|
-
if (presetDate && isAllowedDate(presetDate)) {
|
|
403
|
-
allowedPresets.push(preset);
|
|
404
|
-
}
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
return allowedPresets;
|
|
408
|
-
}));
|
|
409
|
-
}
|
|
410
|
-
return result;
|
|
411
|
-
}), shareReplay(1));
|
|
412
|
-
showClearButton$ = this.hasEmptyDisplayValue$.pipe(map((x) => Boolean(this.showClearButton && !x)), distinctUntilChanged(), shareReplay(1));
|
|
413
|
-
canAutofillDateWithOnlyAvailableDate$ = this.dateMinAndMaxIsSameDay$;
|
|
414
|
-
showDateInput$ = this.dateMinAndMaxIsSameDay$.pipe(map((dateMinAndMaxIsSameDay) => {
|
|
415
|
-
return this.showDateInput && (this.alwaysShowDateInput || !dateMinAndMaxIsSameDay);
|
|
416
|
-
}), distinctUntilChanged(), shareReplay(1));
|
|
417
|
-
currentErrorMessage$ = this.formControl$.pipe(switchMap((formControl) => formControl.statusChanges.pipe(filter((x) => x === 'INVALID' || x === 'VALID'), map((x) => {
|
|
418
|
-
let currentErrorMessage;
|
|
419
|
-
if (x === 'INVALID') {
|
|
420
|
-
if (this.formControl.hasError('required')) {
|
|
421
|
-
currentErrorMessage = 'Date is required';
|
|
422
|
-
}
|
|
423
|
-
else if (this.formControl.hasError(DBX_DATE_TIME_FIELD_DATE_NOT_IN_SCHEDULE_ERROR)) {
|
|
424
|
-
currentErrorMessage = 'Date does not fall on an available dates in schedule.';
|
|
425
|
-
}
|
|
426
|
-
else if (this.formControl.hasError(DBX_DATE_TIME_FIELD_TIME_NOT_IN_RANGE_ERROR)) {
|
|
427
|
-
currentErrorMessage = 'Time is not valid for the given date.';
|
|
428
|
-
}
|
|
429
|
-
else {
|
|
430
|
-
currentErrorMessage = 'The given date and time is invalid.';
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return currentErrorMessage;
|
|
434
|
-
}))), startWith(undefined), shareReplay(1));
|
|
435
|
-
hasError$ = this.currentErrorMessage$.pipe(map((x) => Boolean(x)), distinctUntilChanged(), shareReplay(1));
|
|
436
|
-
dateValueSignal = toSignal(this.dateValue$);
|
|
437
|
-
displayValueSignal = toSignal(this.displayValue$);
|
|
438
|
-
pickerFilterSignal = toSignal(this.pickerFilter$, { initialValue: this.defaultPickerFilter });
|
|
439
|
-
dateInputMinSignal = toSignal(this.dateInputMin$, { initialValue: null });
|
|
440
|
-
dateInputMaxSignal = toSignal(this.dateInputMax$, { initialValue: null });
|
|
441
|
-
showDateInputSignal = toSignal(this.showDateInput$);
|
|
442
|
-
showTimeInputSignal = toSignal(this.showTimeInput$);
|
|
443
|
-
showAddTimeSignal = toSignal(this.showAddTime$);
|
|
444
|
-
fullDaySignal = toSignal(this.fullDay$);
|
|
445
|
-
timezoneAbbreviationSignal = toSignal(this.timezoneAbbreviation$);
|
|
446
|
-
hasEmptyDisplayValueSignal = toSignal(this.hasEmptyDisplayValue$);
|
|
447
|
-
currentErrorMessageSignal = toSignal(this.currentErrorMessage$);
|
|
448
|
-
showClearButtonSignal = toSignal(this.showClearButton$);
|
|
449
|
-
presetsSignal = toSignal(this.presets$);
|
|
450
|
-
hasErrorSignal = toSignal(this.hasError$);
|
|
451
|
-
ngOnInit() {
|
|
452
|
-
this._formControlObs.next(this.formControl);
|
|
453
|
-
const inputPickerConfig = this.dateTimeField.pickerConfig;
|
|
454
|
-
this._config.next(inputPickerConfig ? asObservableFromGetter(inputPickerConfig) : of({}));
|
|
455
|
-
this._syncConfigObs.next(this.dateTimeField.getSyncFieldsObs?.());
|
|
456
|
-
this._sub.subscription = this.valueInSystemTimezone$
|
|
457
|
-
.pipe(combineLatestWith(this.timezoneInstance$.pipe(map((timezoneInstance) => dbxDateTimeOutputValueFactory(this.valueMode, timezoneInstance)))), throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), switchMap(([currentValue, valueFactory]) => {
|
|
458
|
-
return this.timeOutput$.pipe(throttleTime(TIME_OUTPUT_THROTTLE_TIME * 2, undefined, { leading: false, trailing: true }), skipFirstMaybe(), distinctUntilChanged(isSameDateHoursAndMinutes), map((x) => valueFactory(x)), filter((x) => !dbxDateTimeIsSameDateTimeFieldValue(x, currentValue)));
|
|
459
|
-
}))
|
|
460
|
-
.subscribe((value) => {
|
|
461
|
-
this.formControl.setValue(value);
|
|
462
|
-
this.formControl.markAsDirty();
|
|
463
|
-
this.formControl.markAsTouched();
|
|
464
|
-
});
|
|
465
|
-
let hasSetMidnightFromInput = false;
|
|
466
|
-
/*
|
|
467
|
-
this._valueSub.subscription = this.timeString$.subscribe((x) => {
|
|
468
|
-
this.setTime(x);
|
|
469
|
-
});
|
|
470
|
-
*/
|
|
471
|
-
if (this.autofillDateWhenTimeIsPicked) {
|
|
472
|
-
this._autoFillDateSync.subscription = this.canAutofillDateWithOnlyAvailableDate$
|
|
473
|
-
.pipe(switchMap((canAutofill) => {
|
|
474
|
-
if (canAutofill) {
|
|
475
|
-
// when the time updates the first time, set the current min date
|
|
476
|
-
return this._updateTime.pipe(debounceTime(200), switchMap((x) => this.dateInputMin$), filterMaybe());
|
|
477
|
-
}
|
|
478
|
-
else {
|
|
479
|
-
return of(null); // don't show anything
|
|
480
|
-
}
|
|
481
|
-
}))
|
|
482
|
-
.subscribe((autoDate) => {
|
|
483
|
-
if (autoDate != null) {
|
|
484
|
-
this.dateInputCtrl.setValue(autoDate);
|
|
485
|
-
}
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
this._valueSub.subscription = this.valueInSystemTimezone$
|
|
489
|
-
.pipe(map((x) => (x ? isSameDate(x, startOfDay(x)) : false)), distinctUntilChanged(), switchMap((isInputValueAtMidnight) => {
|
|
490
|
-
hasSetMidnightFromInput = false;
|
|
491
|
-
return this.timeString$.pipe(
|
|
492
|
-
// skip(1),
|
|
493
|
-
map((timeString) => [timeString, isInputValueAtMidnight]));
|
|
494
|
-
}))
|
|
495
|
-
.subscribe(([x, isInputValueAtMidnight]) => {
|
|
496
|
-
// Skip events where the timeInput value is cleared, unless the input value is at midnight and we've already processed it being at midnight
|
|
497
|
-
if (!this.timeInputCtrl.value && x === '12:00AM' && (!isInputValueAtMidnight || (isInputValueAtMidnight && hasSetMidnightFromInput))) {
|
|
498
|
-
return;
|
|
499
|
-
}
|
|
500
|
-
// update the has set flag
|
|
501
|
-
if (x === '12:00AM' && isInputValueAtMidnight) {
|
|
502
|
-
hasSetMidnightFromInput = true;
|
|
503
|
-
}
|
|
504
|
-
this.setTime(x);
|
|
505
|
-
});
|
|
506
|
-
// Set default timezone if provided.
|
|
507
|
-
if (this.timezone && !this.dateTimeField.fullDayInUTC) {
|
|
508
|
-
this._defaultTimezone.next(asObservableFromGetter(this.timezone));
|
|
509
|
-
}
|
|
510
|
-
this._timeDate.next(asObservableFromGetter(this.timeDate));
|
|
511
|
-
// Watch for disabled changes so we can propogate them properly.
|
|
512
|
-
this.formControl.registerOnDisabledChange((isDisabled) => {
|
|
513
|
-
toggleDisableFormControl(this.dateInputCtrl, isDisabled);
|
|
514
|
-
toggleDisableFormControl(this.timeInputCtrl, isDisabled);
|
|
515
|
-
});
|
|
516
|
-
const isFullDayField = this.dateTimeField.fullDayFieldName;
|
|
517
|
-
let fullDayFieldCtrl;
|
|
518
|
-
if (isFullDayField) {
|
|
519
|
-
fullDayFieldCtrl = this.form.get(isFullDayField);
|
|
520
|
-
}
|
|
521
|
-
if (!fullDayFieldCtrl) {
|
|
522
|
-
const isFullDay = this.timeMode === DbxDateTimeFieldTimeMode.NONE;
|
|
523
|
-
this._fullDayInputCtrl.setValue(isFullDay);
|
|
524
|
-
// Set the control in the form too if the name is defined.
|
|
525
|
-
if (isFullDayField) {
|
|
526
|
-
this.form.addControl(isFullDayField, this._fullDayInputCtrl);
|
|
527
|
-
}
|
|
528
|
-
fullDayFieldCtrl = this._fullDayInputCtrl;
|
|
529
|
-
}
|
|
530
|
-
this._fullDayControlObs.next(fullDayFieldCtrl);
|
|
531
|
-
switch (this.timeMode) {
|
|
532
|
-
case DbxDateTimeFieldTimeMode.OPTIONAL:
|
|
533
|
-
break;
|
|
534
|
-
case DbxDateTimeFieldTimeMode.NONE:
|
|
535
|
-
this.removeTime();
|
|
536
|
-
break;
|
|
537
|
-
case DbxDateTimeFieldTimeMode.REQUIRED:
|
|
538
|
-
this.addTime();
|
|
539
|
-
break;
|
|
540
|
-
}
|
|
541
|
-
if (this.presets != null) {
|
|
542
|
-
this._presets.next(asObservableFromGetter(this.presets));
|
|
543
|
-
}
|
|
544
|
-
else {
|
|
545
|
-
this._presets.next(this.dbxDateTimeFieldConfigService.configurations$);
|
|
546
|
-
}
|
|
547
|
-
this._resyncTimeInputSub.subscription = this.resyncTimeInput$.pipe(switchMap((x) => combineLatest([this.currentDate$, this.timeString$]).pipe(first()))).subscribe(([currentDate, timeString]) => {
|
|
548
|
-
// only resync when the current date is set, otherwise do not change the time string.
|
|
549
|
-
// This helps in cases where the user picks a time first and we don't want it to be cleared.
|
|
550
|
-
if (currentDate != null) {
|
|
551
|
-
this.timeInputCtrl.setValue(timeString, { emitEvent: false });
|
|
552
|
-
}
|
|
553
|
-
});
|
|
554
|
-
// add validators/errors for the form
|
|
555
|
-
this.formControl.addAsyncValidators([
|
|
556
|
-
(x) => {
|
|
557
|
-
const formValue = x.value;
|
|
558
|
-
let obs;
|
|
559
|
-
if (formValue != null) {
|
|
560
|
-
obs = combineLatest([this.timezoneInstance$, this.dateTimePickerInstance$]).pipe(map(([timezoneInstance, x]) => {
|
|
561
|
-
// the form value is going to be in the output form, so we need to parse it back to the "input" date before evaluating it
|
|
562
|
-
const formValueInSystemTimezone = dbxDateTimeInputValueParseFactory(this.valueMode, timezoneInstance)(formValue);
|
|
563
|
-
let errors = {
|
|
564
|
-
...this.timeInputCtrl.errors
|
|
565
|
-
};
|
|
566
|
-
if (formValueInSystemTimezone) {
|
|
567
|
-
if (x.dateIsInSchedule(formValueInSystemTimezone)) {
|
|
568
|
-
if (!x.isInValidRange(formValueInSystemTimezone)) {
|
|
569
|
-
errors = {
|
|
570
|
-
[DBX_DATE_TIME_FIELD_TIME_NOT_IN_RANGE_ERROR]: true
|
|
571
|
-
};
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
else {
|
|
575
|
-
errors = {
|
|
576
|
-
[DBX_DATE_TIME_FIELD_DATE_NOT_IN_SCHEDULE_ERROR]: true
|
|
577
|
-
};
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
return errors;
|
|
581
|
-
}), first());
|
|
582
|
-
}
|
|
583
|
-
else {
|
|
584
|
-
obs = of({});
|
|
585
|
-
}
|
|
586
|
-
return obs;
|
|
587
|
-
}
|
|
588
|
-
]);
|
|
589
|
-
}
|
|
590
|
-
ngOnDestroy() {
|
|
591
|
-
super.ngOnDestroy();
|
|
592
|
-
this._sub.destroy();
|
|
593
|
-
this._valueSub.destroy();
|
|
594
|
-
this._config.complete();
|
|
595
|
-
this._configUpdateTimeSync.destroy();
|
|
596
|
-
this._defaultTimezone.complete();
|
|
597
|
-
this._resyncTimeInputSub.destroy();
|
|
598
|
-
this._autoFillDateSync.destroy();
|
|
599
|
-
this._timeDate.complete();
|
|
600
|
-
this._presets.complete();
|
|
601
|
-
this._fullDayControlObs.complete();
|
|
602
|
-
this._offset.complete();
|
|
603
|
-
this._formControlObs.complete();
|
|
604
|
-
this._updateTime.complete();
|
|
605
|
-
this._cleared.complete();
|
|
606
|
-
this._resyncTimeInput.complete();
|
|
607
|
-
this._syncConfigObs.complete();
|
|
608
|
-
}
|
|
609
|
-
selectPreset(preset) {
|
|
610
|
-
const value = preset.value();
|
|
611
|
-
if (value.logicalDate) {
|
|
612
|
-
this.setLogicalTime(value.logicalDate);
|
|
613
|
-
}
|
|
614
|
-
else if (value.timeString) {
|
|
615
|
-
this.setTime(value.timeString);
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
datePicked(event) {
|
|
619
|
-
const date = event.value;
|
|
620
|
-
if (date) {
|
|
621
|
-
this.setDateInputValue(date);
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
setLogicalTime(time) {
|
|
625
|
-
const date = dateFromLogicalDate(time);
|
|
626
|
-
if (date) {
|
|
627
|
-
this.setTimeFromDate(date);
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
setDateInputValue(date) {
|
|
631
|
-
this.dateInputCtrl.setValue(date);
|
|
632
|
-
this._updateTime.next();
|
|
633
|
-
}
|
|
634
|
-
setTimeFromDate(timeDate) {
|
|
635
|
-
const timeString = toLocalReadableTimeString(timeDate);
|
|
636
|
-
this.setTime(timeString);
|
|
637
|
-
}
|
|
638
|
-
setTime(time) {
|
|
639
|
-
if (this.timeInputCtrl.value !== time) {
|
|
640
|
-
this.timeInputCtrl.setValue(time);
|
|
641
|
-
this._offset.next(0);
|
|
642
|
-
this._updateTime.next();
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
keydownOnDateInput(event) {
|
|
646
|
-
let direction = 0;
|
|
647
|
-
switch (event.key?.toLowerCase()) {
|
|
648
|
-
case 'arrowup':
|
|
649
|
-
direction = 1;
|
|
650
|
-
break;
|
|
651
|
-
case 'arrowdown':
|
|
652
|
-
direction = -1;
|
|
653
|
-
break;
|
|
654
|
-
}
|
|
655
|
-
let offset = 1;
|
|
656
|
-
if (event.ctrlKey && event.shiftKey) {
|
|
657
|
-
offset = 365;
|
|
658
|
-
}
|
|
659
|
-
else if (event.ctrlKey) {
|
|
660
|
-
offset = 30;
|
|
661
|
-
}
|
|
662
|
-
else if (event.shiftKey) {
|
|
663
|
-
offset = 7;
|
|
664
|
-
}
|
|
665
|
-
if (direction !== 0) {
|
|
666
|
-
combineLatest([this.date$, this.dateTimePickerConfig$])
|
|
667
|
-
.pipe(first())
|
|
668
|
-
.subscribe(([date, config]) => {
|
|
669
|
-
const newDate = startOfDay(addDays(date, offset * direction));
|
|
670
|
-
const instance = new DateTimeMinuteInstance({
|
|
671
|
-
date: newDate,
|
|
672
|
-
...config
|
|
673
|
-
});
|
|
674
|
-
const nextDate = instance.isInSchedule(newDate) ? newDate : instance.findNextAvailableDayInSchedule(newDate, direction === 1 ? 'future' : 'past');
|
|
675
|
-
if (nextDate != null) {
|
|
676
|
-
this.setDateInputValue(instance.clampToLimit(nextDate));
|
|
677
|
-
}
|
|
678
|
-
});
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
keydownOnTimeInput(event) {
|
|
682
|
-
let direction = 0;
|
|
683
|
-
switch (event.key?.toLowerCase()) {
|
|
684
|
-
case 'arrowup':
|
|
685
|
-
direction = 1;
|
|
686
|
-
break;
|
|
687
|
-
case 'arrowdown':
|
|
688
|
-
direction = -1;
|
|
689
|
-
break;
|
|
690
|
-
}
|
|
691
|
-
let offset = 1;
|
|
692
|
-
if (event.altKey && event.shiftKey) {
|
|
693
|
-
offset = 300;
|
|
694
|
-
}
|
|
695
|
-
else if (event.altKey) {
|
|
696
|
-
offset = 60;
|
|
697
|
-
}
|
|
698
|
-
else if (event.shiftKey) {
|
|
699
|
-
offset = 5;
|
|
700
|
-
}
|
|
701
|
-
if (direction !== 0) {
|
|
702
|
-
this._offset.next(this._offset.value + offset * direction);
|
|
703
|
-
this._updateTime.next();
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
focusTime() {
|
|
707
|
-
// do nothing
|
|
708
|
-
}
|
|
709
|
-
focusOutTime() {
|
|
710
|
-
// only refresh when there is not a pattern error
|
|
711
|
-
if (!this.timeInputCtrl.hasError('pattern')) {
|
|
712
|
-
this._updateTime.next();
|
|
713
|
-
this._resyncTimeInput.next();
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
addTime() {
|
|
717
|
-
this.setFullDay(false);
|
|
718
|
-
}
|
|
719
|
-
removeTime() {
|
|
720
|
-
this.setFullDay(true);
|
|
721
|
-
}
|
|
722
|
-
setFullDay(fullDay) {
|
|
723
|
-
this.fullDayControl$.pipe(first()).subscribe((x) => {
|
|
724
|
-
x.setValue(fullDay);
|
|
725
|
-
});
|
|
726
|
-
}
|
|
727
|
-
clearValue() {
|
|
728
|
-
this._cleared.next();
|
|
729
|
-
}
|
|
730
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxDateTimeFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
731
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DbxDateTimeFieldComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutGap=\"6px grid\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n @if (showDateInputSignal()) {\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\">\n <ng-container [ngTemplateOutlet]=\"dateInputTemplate\"></ng-container>\n </div>\n }\n <!-- Time -->\n @if (showTimeInputSignal() || showAddTimeSignal()) {\n <!-- Only show flex if there is content to be displayed. -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInputSignal() ? '50' : '100'\">\n @if (showTimeInputSignal()) {\n <ng-container [ngTemplateOutlet]=\"timeMenuAndInputTemplate\"></ng-container>\n }\n @if (showAddTimeSignal()) {\n <div class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n }\n </div>\n }\n <!-- Date Hint -->\n @switch (hasErrorSignal()) {\n @case (false) {\n @if (!hideDateHint) {\n <div class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n @switch (hasEmptyDisplayValueSignal()) {\n @case (true) {\n <span class=\"dbx-small\">No date/time set</span>\n }\n @case (false) {\n @switch (fullDaySignal()) {\n @case (true) {\n <small>\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValueSignal() | date: 'fullDate' }} {{ timezoneAbbreviationSignal() }} ({{ displayValueSignal() | dateDistance }})\n </small>\n }\n @case (false) {\n <small>\n @if (displayValueSignal()) {\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValueSignal() | date: 'medium' }} {{ timezoneAbbreviationSignal() }} ({{ displayValueSignal() | timeDistance }})\n }\n </small>\n }\n }\n }\n }\n </div>\n </div>\n }\n }\n @case (true) {\n @if (currentErrorMessageSignal()) {\n <mat-error>{{ currentErrorMessageSignal() }}</mat-error>\n }\n }\n }\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [disabled]=\"disabled\" [required]=\"isDateRequired\" [min]=\"dateInputMinSignal()\" [max]=\"dateInputMaxSignal()\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"pickerFilterSignal()\" (dateChange)=\"datePicked($event)\" [value]=\"dateValueSignal()\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n @if (!hideDatePicker) {\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n }\n @if (showClearButtonSignal()) {\n <button matSuffix class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n }\n @if (!showTimeInputSignal()) {\n <span matTextSuffix>\n <ng-container [ngTemplateOutlet]=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n }\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n @if (timeMode === 'optional') {\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n }\n @for (preset of presetsSignal(); track preset) {\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n }\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput [errorStateMatcher]=\"timeErrorStateMatcher\" matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container [ngTemplateOutlet]=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n @if (timeInputCtrl.hasError('pattern')) {\n <mat-error>The input time is not recognizable.</mat-error>\n }\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n @if (showTimezone) {\n <span class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviationSignal() }}</span>\n }\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: FlexLayoutModule }, { kind: "directive", type: i1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "pipe", type: GetValuePipe, name: "getValue" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: TimeDistancePipe, name: "timeDistance" }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i10.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
732
|
-
}
|
|
733
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxDateTimeFieldComponent, decorators: [{
|
|
734
|
-
type: Component,
|
|
735
|
-
args: [{ imports: [FlexLayoutModule, NgTemplateOutlet, MatButtonModule, NgClass, MatError, MatFormFieldModule, MatDatepickerModule, MatInputModule, FormsModule, ReactiveFormsModule, MatIconModule, MatMenuModule, MatFormFieldModule, GetValuePipe, DatePipe, DateDistancePipe, TimeDistancePipe, MatDividerModule], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutGap=\"6px grid\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n @if (showDateInputSignal()) {\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\">\n <ng-container [ngTemplateOutlet]=\"dateInputTemplate\"></ng-container>\n </div>\n }\n <!-- Time -->\n @if (showTimeInputSignal() || showAddTimeSignal()) {\n <!-- Only show flex if there is content to be displayed. -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInputSignal() ? '50' : '100'\">\n @if (showTimeInputSignal()) {\n <ng-container [ngTemplateOutlet]=\"timeMenuAndInputTemplate\"></ng-container>\n }\n @if (showAddTimeSignal()) {\n <div class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n }\n </div>\n }\n <!-- Date Hint -->\n @switch (hasErrorSignal()) {\n @case (false) {\n @if (!hideDateHint) {\n <div class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n @switch (hasEmptyDisplayValueSignal()) {\n @case (true) {\n <span class=\"dbx-small\">No date/time set</span>\n }\n @case (false) {\n @switch (fullDaySignal()) {\n @case (true) {\n <small>\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValueSignal() | date: 'fullDate' }} {{ timezoneAbbreviationSignal() }} ({{ displayValueSignal() | dateDistance }})\n </small>\n }\n @case (false) {\n <small>\n @if (displayValueSignal()) {\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValueSignal() | date: 'medium' }} {{ timezoneAbbreviationSignal() }} ({{ displayValueSignal() | timeDistance }})\n }\n </small>\n }\n }\n }\n }\n </div>\n </div>\n }\n }\n @case (true) {\n @if (currentErrorMessageSignal()) {\n <mat-error>{{ currentErrorMessageSignal() }}</mat-error>\n }\n }\n }\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [disabled]=\"disabled\" [required]=\"isDateRequired\" [min]=\"dateInputMinSignal()\" [max]=\"dateInputMaxSignal()\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"pickerFilterSignal()\" (dateChange)=\"datePicked($event)\" [value]=\"dateValueSignal()\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n @if (!hideDatePicker) {\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n }\n @if (showClearButtonSignal()) {\n <button matSuffix class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n }\n @if (!showTimeInputSignal()) {\n <span matTextSuffix>\n <ng-container [ngTemplateOutlet]=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n }\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n @if (timeMode === 'optional') {\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n }\n @for (preset of presetsSignal(); track preset) {\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n }\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput [errorStateMatcher]=\"timeErrorStateMatcher\" matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container [ngTemplateOutlet]=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n @if (timeInputCtrl.hasError('pattern')) {\n <mat-error>The input time is not recognizable.</mat-error>\n }\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n @if (showTimezone) {\n <span class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviationSignal() }}</span>\n }\n</ng-template>\n" }]
|
|
736
|
-
}] });
|
|
737
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9kYXRldGltZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0YsT0FBTyxFQUFFLHNCQUFzQixFQUF5Ryx1QkFBdUIsRUFBb0IsbUJBQW1CLEVBQXFELE1BQU0sZUFBZSxDQUFDO0FBQzFXLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBaUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxzQ0FBc0MsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5YixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZPLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztB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YywwV0FBRSxXQUFXLG1uQkFBRSxtQkFBbUIsaU5BQUUsYUFBYSxtTEFBRSxhQUFhLHl2QkFBc0IsWUFBWSw0Q0FBRSxRQUFRLHdDQUFFLGdCQUFnQixnREFBRSxnQkFBZ0Isb0RBQUUsZ0JBQWdCOzs0RkFJaFMseUJBQXlCO2tCQU5yQyxTQUFTOzhCQUVDLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsbUJBQzNSLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWF5YmUsIHR5cGUgUmVhZGFibGVUaW1lU3RyaW5nLCB0eXBlIEFycmF5T3JWYWx1ZSwgdHlwZSBJU084NjAxRGF0ZVN0cmluZywgYXNBcnJheSwgZmlsdGVyTWF5YmVBcnJheVZhbHVlcywgdHlwZSBEZWNpc2lvbkZ1bmN0aW9uLCB0eXBlIE1pbGxpc2Vjb25kcywgdHlwZSBUaW1lem9uZVN0cmluZywgdHlwZSBMb2dpY2FsRGF0ZSwgdHlwZSBEYXRlT3JEYXlTdHJpbmcsIGlzSVNPODYwMURheVN0cmluZ1N0YXJ0LCB0eXBlIE1hcEZ1bmN0aW9uLCBtYXBJZGVudGl0eUZ1bmN0aW9uLCBNaW51dGVPZkRheSwgVW5peERhdGVUaW1lTnVtYmVyLCBJU084NjAxRGF5U3RyaW5nIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBkYXRlRnJvbUxvZ2ljYWxEYXRlLCBEYXRlVGltZU1pbnV0ZUNvbmZpZywgRGF0ZVRpbWVNaW51dGVJbnN0YW5jZSwgZ3Vlc3NDdXJyZW50VGltZXpvbmUsIHJlYWRhYmxlVGltZVN0cmluZ1RvRGF0ZSwgdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZywgdXRjRGF5Rm9yRGF0ZSwgc2FmZVRvSnNEYXRlLCBmaW5kTWluRGF0ZSwgZmluZE1heERhdGUsIGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMsIGdldFRpbWV6b25lQWJicmV2aWF0aW9uLCBpc1NhbWVEYXRlRGF5LCBkYXRlVGltZXpvbmVVdGNOb3JtYWwsIERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlLCB0b0pzRGF5RGF0ZSwgaXNTYW1lRGF0ZSwgZGF0ZVRpbWVNaW51dGVXaG9sZURheURlY2lzaW9uRnVuY3Rpb24sIGRhdGVUaW1lTWludXRlRGVjaXNpb25GdW5jdGlvbiB9IGZyb20gJ0BkZXJlZWtiL2RhdGUnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCBzaGFyZVJlcGxheSwgbWFwLCBzdGFydFdpdGgsIHRhcCwgZmlyc3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBkZWJvdW5jZVRpbWUsIHRocm90dGxlVGltZSwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBTdWJqZWN0LCBtZXJnZSwgaW50ZXJ2YWwsIG9mLCBjb21iaW5lTGF0ZXN0V2l0aCwgZmlsdGVyLCBza2lwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRmllbGRUeXBlQ29uZmlnLCBGb3JtbHlGaWVsZFByb3BzIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VySW5wdXRFdmVudCwgTWF0RGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgYWRkTWludXRlcywgc3RhcnRPZkRheSwgYWRkRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIsIGZpbHRlck1heWJlLCBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlciwgc2tpcEZpcnN0TWF5YmUsIFN1YnNjcmlwdGlvbk9iamVjdCwgc3dpdGNoTWFwTWF5YmVEZWZhdWx0LCBzd2l0Y2hNYXBGaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGF0ZVRpbWVQcmVzZXQsIERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbiwgZGF0ZVRpbWVQcmVzZXQgfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UgfSBmcm9tICcuL2RhdGV0aW1lLmZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUsIGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSwgZGJ4RGF0ZVRpbWVJc1NhbWVEYXRlVGltZUZpZWxkVmFsdWUsIGRieERhdGVUaW1lT3V0cHV0VmFsdWVGYWN0b3J5IH0gZnJvbSAnLi9kYXRlLnZhbHVlJztcbmltcG9ydCB7IEZvcm1Db250cm9sUGF0aCwgc3RyZWFtVmFsdWVGcm9tQ29udHJvbCB9IGZyb20gJy4uLy4uLy4uLy4uL2Zvcm0vZm9ybS5hbmd1bGFyLnV0aWwnO1xuaW1wb3J0IHsgdG9nZ2xlRGlzYWJsZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vLi4vZm9ybS9mb3JtJztcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZsZXhMYXlvdXRNb2R1bGUgfSBmcm9tICdAbmdicmFja2V0L25neC1sYXlvdXQnO1xuaW1wb3J0IHsgRGF0ZVBpcGUsIE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEVycm9yLCBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgRGF0ZURpc3RhbmNlUGlwZSwgR2V0VmFsdWVQaXBlLCBUaW1lRGlzdGFuY2VQaXBlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuXG5leHBvcnQgZW51bSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUge1xuICAvKipcbiAgICogVGltZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIFJFUVVJUkVEID0gJ3JlcXVpcmVkJyxcbiAgLyoqXG4gICAqIFRpbWUgaXMgb3B0aW9uYWwuXG4gICAqL1xuICBPUFRJT05BTCA9ICdvcHRpb25hbCcsXG4gIC8qKlxuICAgKiBUaW1lIGlzIHBlcm1lbmFudGx5IG9mZi5cbiAgICovXG4gIE5PTkUgPSAnbm9uZSdcbn1cblxuZXhwb3J0IHR5cGUgRGJ4RGF0ZVRpbWVQaWNrZXJDb25maWd1cmF0aW9uID0gT21pdDxEYXRlVGltZU1pbnV0ZUNvbmZpZywgJ2RhdGUnPjtcblxuZXhwb3J0IHR5cGUgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNUeXBlID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRTeW5jRmllbGQge1xuICAvKipcbiAgICogRmllbGQga2V5L3BhdGggdG8gc3luYyB3aXRoL2FnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBzeW5jV2l0aDogc3RyaW5nO1xuICAvKipcbiAgICogSG93IHRvIHN5bmMgYWdhaW5zdCB0aGUgb3RoZXIgZmllbGQuXG4gICAqL1xuICByZWFkb25seSBzeW5jVHlwZTogRGJ4RGF0ZVRpbWVGaWVsZFN5bmNUeXBlO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB0aW1lIGRhdGUgZmllbGQgdGhhdCBoYXMgYSByZWZlcmVuY2UgYW5kIG9wdGlvbmFsIG1hcCBmdW5jdGlvbiB0byBtYXAgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZzxJID0gdW5rbm93bj4ge1xuICByZWFkb25seSBwYXRoOiBGb3JtQ29udHJvbFBhdGg7XG4gIHJlYWRvbmx5IG1hcFZhbHVlPzogTWFwRnVuY3Rpb248SSwgTWF5YmU8RGF0ZU9yRGF5U3RyaW5nPj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyhpbnB1dDogdW5rbm93bik6IGlucHV0IGlzIERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyB7XG4gIHJldHVybiBpbnB1dCAhPSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChpbnB1dCBhcyBEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcpLnBhdGggPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRQcm9wcyBleHRlbmRzIEZvcm1seUZpZWxkUHJvcHMge1xuICAvKipcbiAgICogQ3VzdG9tIGRhdGUgbGFiZWwuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIERhdGVcbiAgICovXG4gIHJlYWRvbmx5IGRhdGVMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIHRpbWUgbGFiZWwuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFRpbWVcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogTGFiZWwgdG8gdXNlIGZvciB0aGUgZGF0ZSBoaW50IGZvciBcIkFsbCBEYXlcIi4gRGVmYXVsdHMgdG8gXCJBbGwgRGF5XCIuXG4gICAqL1xuICByZWFkb25seSBhbGxEYXlMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogTGFiZWwgdG8gdXNlIGZvciB0aGUgZGF0ZSBoaW50IGZvciBcIkF0XCIuIERlZmF1bHRzIHRvIFwiQXRcIi5cbiAgICovXG4gIHJlYWRvbmx5IGF0VGltZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBtb2RlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBEQVRFXG4gICAqL1xuICByZWFkb25seSB2YWx1ZU1vZGU/OiBEYnhEYXRlVGltZVZhbHVlTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGRhdGUgaXMgaGlkZGVuLCBhbmQgYXV0b21hdGljYWxseSB1c2VzIHRvZGF5L2lucHV0IGRhdGUuXG4gICAqL1xuICByZWFkb25seSB0aW1lT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHRpbWVPbmx5IGlzIGZhbHNlLlxuICAgKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbHdheXMgc2hvdyB0aGUgZGF0ZSBpbnB1dCBldmVuIHdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBkYXRlIHRoYXQgY2FuIGJlIHNlbGVjdGVkLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWx3YXlzU2hvd0RhdGVJbnB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGF1dG9maWxsIHRoZSBkYXRlIHdoZW4gdGltZSBpcyBwaWNrZWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB0aW1lIGNhbiBiZSBhZGRlZC9yZW1vdmVkIG9wdGlvbmFsbHkuXG4gICAqXG4gICAqIFRoaXMgaXMgaWdub3JlZCBpZiB0aW1lT25seSBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSB0aW1lTW9kZT86IERieERhdGVUaW1lRmllbGRUaW1lTW9kZTtcblxuICAvKipcbiAgICogT3RoZXIgZm9ybSBjb250cm9sIGZvciBlbmFibGluZy9kaXNhYmxpbmcgd2hldGhlciBvciBub3QgaXQgaXMgYSBmdWxsIGRheS5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaWYgdGltZSBpcyBvcHRpb25hbC5cbiAgICpcbiAgICogV2hlbiB0aW1lIGlzIG9mZiwgdGhlIGZpZWxkIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVsbERheUZpZWxkTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcGFzcyB0aGUgZGF0ZSB2YWx1ZSBhcyBhIFVUQyBkYXRlLCBvciBhIGRhdGUgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuXG4gICAqL1xuICByZWFkb25seSBmdWxsRGF5SW5VVEM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBvdCBoaWRlIHRoZSBkYXRlIGhpbnQgaW5mbyBjb250ZW50LlxuICAgKlxuICAgKiBGYWxzZSBieSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBoaWRlRGF0ZUhpbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBoaWRlIHRoZSBkYXRlL2NhbGVuZGFyIHBpY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IGhpZGVEYXRlUGlja2VyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3VzdG9tIHBpY2tlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBwaWNrZXJDb25maWc/OiBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+O1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzeW5jaW5nIHdpdGggb25lIG9yIG1vcmUgZmllbGRzIHdpdGggYSBEYXRlIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0U3luY0ZpZWxkc09icz86ICgpID0+IE9ic2VydmFibGU8QXJyYXlPclZhbHVlPERieERhdGVUaW1lRmllbGRTeW5jRmllbGQ+PjtcblxuICAvKipcbiAgICogKE9wdGlvbmFsKSBUaGUgaW5wdXQgdGltZXpvbmUgdG8gZGVmYXVsdCB0by5cbiAgICpcbiAgICogSWdub3JlZCBpZiBmdWxsRGF5SW5VVEMgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWV6b25lPzogTWF5YmU8T2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8TWF5YmU8VGltZXpvbmVTdHJpbmc+Pj47XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVGhlIGRhdGUgdG8gYXBwbHkgdGhlIHRpbWUgdG8uXG4gICAqXG4gICAqIFRoZSB0aW1lem9uZSBhYmJydmlhdGlvbiB3aWxsIGFsc28gdXNlIHRoaXMgZGF0ZSB3aGVuIHVzaW5nIHRoZSB0aW1lLW9ubHkgbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVEYXRlPzogTWF5YmU8T2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8TWF5YmU8RGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHwgRm9ybUNvbnRyb2xQYXRoIHwgRGF0ZU9yRGF5U3RyaW5nPj4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSB0aW1lem9uZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1RpbWV6b25lPzogTWF5YmU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwcmVzZXRzIHRvIHNob3cgaW4gdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2V0cz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPjtcblxuICAvKipcbiAgICogVGhlIHRpbWUgaW4gbXMgdG8gcHJldmVudCBvdXRwdXQgZnJvbSBnb2luZyBvdXQgd2hlbiB0aGUgaW5wdXQgdmFsdWUgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0T3V0cHV0RGVib3VuY2VUaW1lPzogTWlsbGlzZWNvbmRzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSBjbGVhciBkYXRlIGJ1dHRvbi4gVHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd0NsZWFyQnV0dG9uPzogTWF5YmU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWludXRlcyB0byBhZGQvc3VidHJhY3Qgd2hlbiB1c2luZyB0aGUgYXJyb3cga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IG1pbnV0ZVN0ZXA/OiBNYXliZTxudW1iZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGQgZXh0ZW5kcyBQaWNrPERieERhdGVUaW1lRmllbGRTeW5jRmllbGQsICdzeW5jVHlwZSc+IHtcbiAgcmVhZG9ubHkgY29udHJvbDogQWJzdHJhY3RDb250cm9sPE1heWJlPERhdGUgfCBJU084NjAxRGF0ZVN0cmluZz4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3luY0NvbmZpZ1ZhbHVlT2JzKHBhcnNlQ29uZmlnc09iczogT2JzZXJ2YWJsZTxEYnhEYXRlVGltZUZpZWxkU3luY1BhcnNlZEZpZWxkW10+LCB0eXBlOiBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGUpOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiB7XG4gIHJldHVybiBwYXJzZUNvbmZpZ3NPYnMucGlwZShcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHguZmluZCgoeSkgPT4geS5zeW5jVHlwZSA9PT0gdHlwZSk7XG4gICAgICBsZXQgcmVzdWx0OiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPjtcblxuICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICBjb25zdCB7IGNvbnRyb2wgfSA9IGNvbmZpZztcbiAgICAgICAgcmVzdWx0ID0gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgoY29udHJvbC52YWx1ZSksXG4gICAgICAgICAgbWFwKCh4KSA9PiBzYWZlVG9Kc0RhdGUoeCkgPz8gbnVsbClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbn1cblxuY29uc3QgVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRTogTWlsbGlzZWNvbmRzID0gMTA7XG5cbi8qKlxuICogRXJyb3IgY29kZSB1c2VkIHdoZW4gdGhlIHNlbGVjdGVkIGRhdGUgaXMgbm90IGluIHRoZSBzY2hlZHVsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IERCWF9EQVRFX1RJTUVfRklFTERfREFURV9OT1RfSU5fU0NIRURVTEVfRVJST1IgPSAnZGF0ZVRpbWVGaWVsZERhdGVOb3RJblNjaGVkdWxlJztcblxuLyoqXG4gKiBFcnJvciBjb2RlIHVzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgdGltZS90aW1lIGlucHV0IGlzIG5vdCBpbiB0aGUgbGltaXRlZCByYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IERCWF9EQVRFX1RJTUVfRklFTERfVElNRV9OT1RfSU5fUkFOR0VfRVJST1IgPSAnZGF0ZVRpbWVGaWVsZFRpbWVOb3RJblJhbmdlJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBpbXBvcnRzOiBbRmxleExheW91dE1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCwgTWF0QnV0dG9uTW9kdWxlLCBOZ0NsYXNzLCBNYXRFcnJvciwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXREYXRlcGlja2VyTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdE1lbnVNb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgR2V0VmFsdWVQaXBlLCBEYXRlUGlwZSwgRGF0ZURpc3RhbmNlUGlwZSwgVGltZURpc3RhbmNlUGlwZSwgTWF0RGl2aWRlck1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIERieERhdGVUaW1lRmllbGRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPERieERhdGVUaW1lRmllbGRQcm9wcz4+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRieERhdGVUaW1lRmllbGRDb25maWdTZXJ2aWNlID0gaW5qZWN0KERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2F1dG9GaWxsRGF0ZVN5bmMgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBsYXRlc3RDb25maWckID0gdGhpcy5fY29uZmlnLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zeW5jQ29uZmlnT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPEFycmF5T3JWYWx1ZTxEYnhEYXRlVGltZUZpZWxkU3luY0ZpZWxkPj4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRUaW1lem9uZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZURhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8TWF5YmU8RGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHwgRm9ybUNvbnRyb2xQYXRoIHwgRGF0ZU9yRGF5U3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICAvKipcbiAgICogQWx0ZXJuYXRpdmUvYmFja3VwIGZ1bGwgZGF5IGNvbnRyb2wgaWYgbm90IGRlZmluZWQgaW4gdGhlIEZvcm1seSBmb3JtLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnVsbERheUlucHV0Q3RybCA9IG5ldyBGb3JtQ29udHJvbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Z1bGxEYXlDb250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8Ym9vbGVhbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmdWxsRGF5Q29udHJvbCQgPSB0aGlzLl9mdWxsRGF5Q29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29mZnNldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZm9ybUNvbnRyb2xPYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPEFic3RyYWN0Q29udHJvbDxNYXliZTxEYXRlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsZWFyZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF91cGRhdGVUaW1lID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9yZXN5bmNUaW1lSW5wdXRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3luY1RpbWVJbnB1dCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgdGltZUVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlciA9IHtcbiAgICBpc0Vycm9yU3RhdGU6IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsLCBmb3JtKSA9PiB7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpKSB8fCB0aGlzLmVycm9yU3RhdGVNYXRjaGVyLmlzRXJyb3JTdGF0ZSh0aGlzLmZvcm1Db250cm9sLCBmb3JtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmVhZG9ubHkgcmVzeW5jVGltZUlucHV0JCA9IHRoaXMuX3Jlc3luY1RpbWVJbnB1dC5waXBlKGRlYm91bmNlVGltZSgyMDApLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnVXBkYXRlVGltZVN5bmMgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KFxuICAgIHRoaXMubGF0ZXN0Q29uZmlnJC5waXBlKHNraXAoMSkpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuX2RlZmF1bHRUaW1lem9uZS5waXBlKHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5waXBlKFxuICAgIG1hcCgoZGVmYXVsdFRpbWV6b25lKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFRpbWV6b25lID8/IGd1ZXNzQ3VycmVudFRpbWV6b25lKCk7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lSW5zdGFuY2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPj4gPSB0aGlzLnRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgodGltZXpvbmUpID0+ICh0aW1lem9uZSA/IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh7IHRpbWV6b25lIH0pIDogdW5kZWZpbmVkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lRGF0ZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gdGhpcy5fdGltZURhdGUucGlwZShcbiAgICBzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSxcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+O1xuXG4gICAgICBpZiAoeCkge1xuICAgICAgICAvLyBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIGRhdGUgc3RyaW5nLCB0aGVuIHRyZWF0IGl0IGFzIGEgcGF0aFxuICAgICAgICBpZiAoKHR5cGVvZiB4ID09PSAnc3RyaW5nJyAmJiAhaXNJU084NjAxRGF5U3RyaW5nU3RhcnQoeCkpIHx8IGlzRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnKHgpKSB7XG4gICAgICAgICAgY29uc3QgeyBwYXRoLCBtYXBWYWx1ZSB9OiBEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcgPSB0eXBlb2YgeCA9PT0gJ3N0cmluZycgPyB7IHBhdGg6IHggfSA6IHg7XG4gICAgICAgICAgb2JzID1cbiAgICAgICAgICAgIHN0cmVhbVZhbHVlRnJvbUNvbnRyb2w8RGF0ZU9yRGF5U3RyaW5nPih0aGlzLmZvcm0sIHBhdGgpPy5waXBlKFxuICAgICAgICAgICAgICBtYXAobWFwVmFsdWUgPz8gbWFwSWRlbnRpdHlGdW5jdGlvbigpKSxcbiAgICAgICAgICAgICAgbWFwKCh4KSA9PiAoeCA/IHRvSnNEYXlEYXRlKHgpIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICkgPz8gb2YodW5kZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYnMgPSBvZih0b0pzRGF5RGF0ZSh4KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9icyA9IG9mKHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnM7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB2YWx1ZUluU3lzdGVtVGltZXpvbmUkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IHRoaXMuZm9ybUNvbnRyb2wkLnBpcGUoXG4gICAgbWFwKChjb250cm9sKSA9PiBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aDxNYXliZTxEYXRlIHwgSVNPODYwMURheVN0cmluZyB8IE1pbnV0ZU9mRGF5IHwgVW5peERhdGVUaW1lTnVtYmVyPj4oY29udHJvbC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKSksXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJCksXG4gICAgc3dpdGNoTWFwKChbeCwgdGltZXpvbmVJbnN0YW5jZV0pID0+IHtcbiAgICAgIHJldHVybiB4LnBpcGUobWFwKGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKTtcbiAgICB9KSxcbiAgICB0aHJvdHRsZVRpbWUoMjAsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZSB9KSwgLy8gdGhyb3R0bGUgaW5jb21pbmcgdmFsdWVzIGFuZCB0aW1lem9uZSBjaGFuZ2VzXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSByZWZyZXNoSW50ZXJhbCQgPSBpbnRlcnZhbCgxMCAqIDEwMDApO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHRyaWdnZXIvZGlzcGxheSB2aXN1YWwgdXBkYXRlcyAoc3BlY2lmaWNhbGx5IG9uIHRpbWVEaXN0YW5jZSwgZXRjLikuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VmFsdWUkID0gdGhpcy5yZWZyZXNoSW50ZXJhbCQucGlwZShcbiAgICAvLyBldmVyeSAxMCBzZWNvbmRzLCByZWZyZXNoIHcvaW50ZXJ2YWxcbiAgICBzdGFydFdpdGgoMCksXG4gICAgbWFwKCgpID0+IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZVN0cmluZyQ6IE9ic2VydmFibGU8UmVhZGFibGVUaW1lU3RyaW5nIHwgJyc+ID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IHRvTG9jYWxSZWFkYWJsZVRpbWVTdHJpbmcoeCkgOiAnJykpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlSW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sPE1heWJlPERhdGU+PihudWxsLCB7XG4gICAgdmFsaWRhdG9yczogW11cbiAgfSk7XG5cbiAgcmVhZG9ubHkgdGltZUlucHV0Q3RybCA9IG5ldyBGb3JtQ29udHJvbDxNYXliZTxSZWFkYWJsZVRpbWVTdHJpbmc+PihudWxsLCB7XG4gICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucGF0dGVybigvXihub3cpJHxeKFswLTldfCgwWzAtOV0pfCgxWzAtOV0pfCgyWzAtM10pKSg6KT8oWzAtNV1bMC05XSk/KFxccyk/KFthcEFQXVtNbV0pPyhcXFxccykqJC8pXVxuICB9KTtcblxuICBnZXQgZGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZGF0ZUxhYmVsID8/ICdEYXRlJztcbiAgfVxuXG4gIGdldCB0aW1lTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50aW1lTGFiZWwgPz8gJ1RpbWUnO1xuICB9XG5cbiAgZ2V0IGFsbERheUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYWxsRGF5TGFiZWwgPz8gJ0FsbCBEYXknO1xuICB9XG5cbiAgZ2V0IGF0VGltZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYXRUaW1lTGFiZWwgPz8gJ0F0JztcbiAgfVxuXG4gIGdldCBkYXRlT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gIH1cblxuICBnZXQgZGF0ZVRpbWVGaWVsZCgpOiBEYnhEYXRlVGltZUZpZWxkUHJvcHMge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzO1xuICB9XG5cbiAgZ2V0IHRpbWVPbmx5KCk6IE1heWJlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0aW1lVmFsdWVzT25seSA9IHRoaXMudmFsdWVNb2RlID09PSBEYnhEYXRlVGltZVZhbHVlTW9kZS5NSU5VVEVfT0ZfREFZO1xuXG4gICAgaWYgKHRpbWVWYWx1ZXNPbmx5KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGaWVsZC50aW1lT25seTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWx3YXlzU2hvd0RhdGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5hbHdheXNTaG93RGF0ZUlucHV0ID8/IHRydWU7XG4gIH1cblxuICBnZXQgYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5hdXRvZmlsbERhdGVXaGVuVGltZUlzUGlja2VkID8/IHRoaXMuYWx3YXlzU2hvd0RhdGVJbnB1dCA9PT0gZmFsc2U7XG4gIH1cblxuICBnZXQgc2hvd0RhdGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudGltZU9ubHk7XG4gIH1cblxuICBnZXQgdmFsdWVNb2RlKCk6IERieERhdGVUaW1lVmFsdWVNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy52YWx1ZU1vZGUgPz8gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuREFURTtcbiAgfVxuXG4gIGdldCB0aW1lTW9kZSgpOiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUge1xuICAgIGNvbnN0IGRhdGVWYWx1ZXNPbmx5ID0gdGhpcy52YWx1ZU1vZGUgPT09IERieERhdGVUaW1lVmFsdWVNb2RlLkRBWV9TVFJJTkc7XG5cbiAgICBpZiAoZGF0ZVZhbHVlc09ubHkpIHtcbiAgICAgIHJldHVybiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudGltZU9ubHkgPyBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQgOiAodGhpcy5kYXRlVGltZUZpZWxkLnRpbWVNb2RlID8/IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzRGF0ZVJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnJlcXVpcmVkID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlzVGltZVJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGF0ZVJlcXVpcmVkICYmIHRoaXMudGltZU1vZGUgPT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBNYXliZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGdldCBoaWRlRGF0ZUhpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuaGlkZURhdGVIaW50ID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGhpZGVEYXRlUGlja2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLmhpZGVEYXRlUGlja2VyID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHRpbWV6b25lKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnRpbWV6b25lO1xuICB9XG5cbiAgZ2V0IHRpbWVEYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnRpbWVEYXRlO1xuICB9XG5cbiAgZ2V0IHNob3dUaW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5zaG93VGltZXpvbmUgPz8gdHJ1ZTtcbiAgfVxuXG4gIGdldCBwcmVzZXRzKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnByZXNldHM7XG4gIH1cblxuICBnZXQgc2hvd0NsZWFyQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNob3dDbGVhckJ1dHRvbjtcbiAgfVxuXG4gIGdldCBtaW51dGVTdGVwKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLm1pbnV0ZVN0ZXAgPz8gdGhpcy5maWVsZC5wcm9wcy5zdGVwID8/IDU7XG4gIH1cblxuICByZWFkb25seSBmdWxsRGF5JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZnVsbERheUNvbnRyb2wkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChjb250cm9sKSA9PiBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChjb250cm9sLnZhbHVlKSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzaG93VGltZUlucHV0JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZnVsbERheSQucGlwZShtYXAoKHgpID0+ICF4ICYmIHRoaXMudGltZU1vZGUgIT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5OT05FKSk7XG5cbiAgcmVhZG9ubHkgc2hvd0FkZFRpbWUkID0gdGhpcy5zaG93VGltZUlucHV0JC5waXBlKFxuICAgIG1hcCgoeCkgPT4gIXggJiYgdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk9QVElPTkFMKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlJCA9IHRoaXMuZGF0ZUlucHV0Q3RybC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5kYXRlSW5wdXRDdHJsLnZhbHVlKSwgc2hhcmVSZXBsYXkoMSkpO1xuICByZWFkb25seSBkYXRlJCA9IHRoaXMuY3VycmVudERhdGUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lQWJicmV2aWF0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuY3VycmVudERhdGUkLCB0aGlzLnRpbWV6b25lJCwgdGhpcy50aW1lRGF0ZSRdKS5waXBlKFxuICAgIG1hcCgoW2RhdGUsIHRpbWV6b25lLCB0aW1lRGF0ZV0pID0+IGdldFRpbWV6b25lQWJicmV2aWF0aW9uKHRpbWV6b25lLCB0aW1lRGF0ZSA/PyBkYXRlID8/IG5ldyBEYXRlKCkpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVZhbHVlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSBtZXJnZSh0aGlzLmRhdGUkLCB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQucGlwZShza2lwRmlyc3RNYXliZSgpKSkucGlwZShcbiAgICBtYXAoKHg6IE1heWJlPERhdGU+KSA9PiAoeCA/IHN0YXJ0T2ZEYXkoeCkgOiBudWxsKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8TWF5YmU8RGF0ZT4+KGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZUlucHV0JDogT2JzZXJ2YWJsZTxSZWFkYWJsZVRpbWVTdHJpbmc+ID0gdGhpcy5fdXBkYXRlVGltZS5waXBlKFxuICAgIGRlYm91bmNlVGltZSg1KSxcbiAgICBtYXAoKCkgPT4gdGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlIHx8ICcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3luY0NvbmZpZ09icyQgPSB0aGlzLl9zeW5jQ29uZmlnT2JzLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBwYXJzZWRTeW5jQ29uZmlncyQ6IE9ic2VydmFibGU8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZFtdPiA9IHRoaXMuc3luY0NvbmZpZ09icyQucGlwZShcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGxldCBwYXJzZWQ6IERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGRbXTtcblxuICAgICAgaWYgKHgpIHtcbiAgICAgICAgcGFyc2VkID0gZmlsdGVyTWF5YmVBcnJheVZhbHVlcyhcbiAgICAgICAgICBhc0FycmF5KHgpLm1hcCgoeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoeS5zeW5jV2l0aCk7XG5cbiAgICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udHJvbCxcbiAgICAgICAgICAgICAgICAuLi55XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWQgPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHN5bmNDb25maWdCZWZvcmVWYWx1ZSQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gc3luY0NvbmZpZ1ZhbHVlT2JzKHRoaXMucGFyc2VkU3luY0NvbmZpZ3MkLCAnYmVmb3JlJyk7XG4gIHJlYWRvbmx5IHN5bmNDb25maWdBZnRlclZhbHVlJDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSBzeW5jQ29uZmlnVmFsdWVPYnModGhpcy5wYXJzZWRTeW5jQ29uZmlncyQsICdhZnRlcicpO1xuXG4gIHJlYWRvbmx5IGlzVGltZUNsZWFyZWQkID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50RGF0ZSQsIHRoaXMuX3RpbWVEYXRlLnBpcGUoc3RhcnRXaXRoKG51bGwpKV0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbZGF0ZSwgdGltZV0pID0+IHtcbiAgICAgIGNvbnN0IGlzVGltZUNsZWFyZWQgPSBCb29sZWFuKCFkYXRlICYmICF0aW1lKTtcbiAgICAgIHJldHVybiB0aGlzLl9jbGVhcmVkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgc3RhcnRXaXRoKGlzVGltZUNsZWFyZWQpXG4gICAgICApO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3Jhd0RhdGVUaW1lRGF0ZVZhbHVlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSB0aGlzLl9jb25maWcucGlwZShcbiAgICBmaXJzdCgpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiAodGhpcy50aW1lT25seSA/IG9mKG51bGwpIDogdGhpcy5kYXRlVmFsdWUkKSlcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yYXdEYXRlVGltZVRpbWVWYWx1ZSQ6IE9ic2VydmFibGU8TWF5YmU8UmVhZGFibGVUaW1lU3RyaW5nPj4gPSB0aGlzLnRpbWVJbnB1dCQucGlwZShzdGFydFdpdGgobnVsbCkpO1xuXG4gIHJlYWRvbmx5IHJhd0RhdGVUaW1lJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yYXdEYXRlVGltZURhdGVWYWx1ZSQsIHRoaXMuX3Jhd0RhdGVUaW1lVGltZVZhbHVlJCwgdGhpcy5mdWxsRGF5JCwgdGhpcy50aW1lRGF0ZSQsIHRoaXMuaXNUaW1lQ2xlYXJlZCRdKS5waXBlKFxuICAgIG1hcCgoW2RhdGUsIHRpbWVTdHJpbmcsIGZ1bGxEYXksIHRpbWVEYXRlLCBpc1RpbWVDbGVhcmVkXSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogTWF5YmU8RGF0ZT47XG5cbiAgICAgIGlmICghaXNUaW1lQ2xlYXJlZCkge1xuICAgICAgICBpZiAoIWRhdGUgfHwgdGhpcy50aW1lT25seSkge1xuICAgICAgICAgIGRhdGUgPSB0aW1lRGF0ZSA/PyBuZXcgRGF0ZSgpOyAvLyB1c2UgdGhlIHRpbWUgZGF0ZSwgb3IgZGVmYXVsdCB0byB0aGUgY3VycmVudCBkYXlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgaWYgKGZ1bGxEYXkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGVUaW1lRmllbGQuZnVsbERheUluVVRDKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHV0Y0RheUZvckRhdGUoZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzdGFydE9mRGF5KGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGltZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgICAgcmVhZGFibGVUaW1lU3RyaW5nVG9EYXRlKHRpbWVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgIHVzZVN5c3RlbVRpbWV6b25lOiB0cnVlXG4gICAgICAgICAgICAgIH0pID8/IGRhdGU7XG4gICAgICAgICAgfSBlbHNlIGlmICghdGhpcy50aW1lT25seSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZU1vZGUgIT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRCkge1xuICAgICAgICAgICAgICAvLyBvbmx5IGF1dG9maWxsIHRoZSBkYXRlIGlmIHRoZSB0aW1lIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAoYW5kIHRoZSB0aW1lIHN0cmluZyBpcyBlbXB0eSlcbiAgICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVUaW1lUGlja2VyQ29uZmlnJDogT2JzZXJ2YWJsZTxNYXliZTxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2NvbmZpZy5waXBlKHN3aXRjaE1hcEZpbHRlck1heWJlKCkpLCB0aGlzLnN5bmNDb25maWdCZWZvcmVWYWx1ZSQsIHRoaXMuc3luY0NvbmZpZ0FmdGVyVmFsdWUkXSkucGlwZShcbiAgICBtYXAoKFt4LCBkYXRlSW5wdXRNaW4sIGRhdGVJbnB1dE1heF0pID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IE1heWJlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4gPSB4O1xuXG4gICAgICBpZiAoZGF0ZUlucHV0TWluICE9IG51bGwgfHwgZGF0ZUlucHV0TWF4ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtaW46IGxpbWl0TWluLCBtYXg6IGxpbWl0TWF4IH0gPSB4Py5saW1pdHMgPz8ge307XG4gICAgICAgIGNvbnN0IG1pbiA9IGZpbmRNaW5EYXRlKFtkYXRlSW5wdXRNaW4sIGRhdGVGcm9tTG9naWNhbERhdGUobGltaXRNaW4pXSk7XG4gICAgICAgIGNvbnN0IG1heCA9IGZpbmRNYXhEYXRlKFtkYXRlSW5wdXRNYXgsIGRhdGVGcm9tTG9naWNhbERhdGUobGltaXRNYXgpXSk7XG5cbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgICAuLi54Py5saW1pdHMsXG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBtYXhcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVJbnB1dE1pbiQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4Py5saW1pdHM/Lm1pbiA/PyBudWxsKSBhcyBEYXRlIHwgbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8RGF0ZSB8IG51bGw+KGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUlucHV0TWF4JDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSB0aGlzLmRhdGVUaW1lUGlja2VyQ29uZmlnJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHg/LmxpbWl0cz8ubWF4ID8/IG51bGwpIGFzIERhdGUgfCBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxEYXRlIHwgbnVsbD4oaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlcmUgaXMgYSBsaW1pdGVkIG1pbi9tYXggZGF0ZSByYW5nZSBhcHBsaWVkL2F2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc1Jlc3RyaWN0ZWREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXRlSW5wdXRNaW4kLCB0aGlzLmRhdGVJbnB1dE1heCRdKS5waXBlKFxuICAgIG1hcCgoW2EsIGJdKSA9PiBCb29sZWFuKGEgfHwgYikpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlTWluQW5kTWF4SXNTYW1lRGF5JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZUlucHV0TWluJCwgdGhpcy5kYXRlSW5wdXRNYXgkXSkucGlwZShcbiAgICBtYXAoKFthLCBiXSkgPT4gQm9vbGVhbihhICYmIGIpICYmIGlzU2FtZURhdGVEYXkoYSwgYikpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwaWNrZXJGaWx0ZXIkOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZSB8IG51bGw+PiA9IHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGRhdGVUaW1lTWludXRlV2hvbGVEYXlEZWNpc2lvbkZ1bmN0aW9uKHgsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuICh4OiBEYXRlIHwgbnVsbCkgPT4gKHggIT0gbnVsbCA/IGZpbHRlcih4KSA6IHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgICB9XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkZWZhdWx0UGlja2VyRmlsdGVyOiBEZWNpc2lvbkZ1bmN0aW9uPERhdGUgfCBudWxsPiA9ICgpID0+IHRydWU7XG5cbiAgcmVhZG9ubHkgdGltZU91dHB1dCQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gY29tYmluZUxhdGVzdChbdGhpcy5yYXdEYXRlVGltZSQsIHRoaXMuX29mZnNldCwgdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyRdKS5waXBlKFxuICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChjdXJyZW50LCBuZXh0KSA9PiBjdXJyZW50WzBdID09PSBuZXh0WzBdICYmIG5leHRbMV0gPT09IDAgJiYgY3VycmVudFsyXSA9PT0gbmV4dFsyXSksXG4gICAgdGFwKChbLCBzdGVwc09mZnNldF0pID0+IChzdGVwc09mZnNldCA/IHRoaXMuX29mZnNldC5uZXh0KDApIDogMCkpLFxuICAgIG1hcCgoW2RhdGUsIHN0ZXBzT2Zmc2V0LCBjb25maWddKSA9PiB7XG4gICAgICBpZiAoZGF0ZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHJvdW5kRG93blRvTWludXRlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG9ubHkgY2xhbXAgd2hlbiB0aGUgc3RlcHMgb2Zmc2V0IGlzIHNldFxuICAgICAgICBpZiAoc3RlcHNPZmZzZXQpIHtcbiAgICAgICAgICBkYXRlID0gaW5zdGFuY2UuY2xhbXAoZGF0ZSk7XG5cbiAgICAgICAgICBjb25zdCBtaW51dGVzID0gc3RlcHNPZmZzZXQgKiB0aGlzLm1pbnV0ZVN0ZXA7XG5cbiAgICAgICAgICBpZiAobWludXRlcyAhPSAwKSB7XG4gICAgICAgICAgICBkYXRlID0gYWRkTWludXRlcyhkYXRlLCBtaW51dGVzKTtcbiAgICAgICAgICAgIGRhdGUgPSBpbnN0YW5jZS5jbGFtcChkYXRlKTsgLy8gY2xhbXAgdGhlIGRhdGUgYWdhaW5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlVGltZVBpY2tlckluc3RhbmNlJCA9IHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckLnBpcGUoXG4gICAgbWFwKChjb25maWcpID0+IHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWVNaW51dGVJbnN0YW5jZSh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgcm91bmREb3duVG9NaW51dGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzRW1wdHlEaXNwbGF5VmFsdWUkID0gdGhpcy5kaXNwbGF5VmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAheCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGFsbFByZXNldHMkOiBPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0W10+ID0gdGhpcy5fcHJlc2V0cy5waXBlKFxuICAgIHN3aXRjaE1hcEZpbHRlck1heWJlKCksXG4gICAgbWFwKCh4OiBEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb25bXSkgPT4geC5tYXAoZGF0ZVRpbWVQcmVzZXQpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IF9wcmVzZXRzUGlja2VyRmlsdGVyJCA9IHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckLnBpcGUoXG4gICAgbWFwKChjb25maWcpID0+IHtcbiAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gZGF0ZVRpbWVNaW51dGVEZWNpc2lvbkZ1bmN0aW9uKGNvbmZpZyk7IC8vIGZpbHRlciB0aGF0IHRoZSBkYXRlIG11c3QgYmUgaW4gdGhlIGdpdmVuIHJhbmdlXG4gICAgICAgIHJldHVybiAoeDogRGF0ZSB8IG51bGwpID0+ICh4ICE9IG51bGwgPyBmaWx0ZXIoeCkgOiB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgcHJlc2V0cyQ6IE9ic2VydmFibGU8RGF0ZVRpbWVQcmVzZXRbXT4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmFsbFByZXNldHMkLCB0aGlzLmZ1bGxEYXkkXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFt4LCBmdWxsRGF5XSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogT2JzZXJ2YWJsZTxEYXRlVGltZVByZXNldFtdPjtcblxuICAgICAgaWYgKHRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgcmVzdWx0ID0gb2YoeCk7IC8vIGRvIG5vdCBmaWx0ZXIgYmFzZWQgb24gdGhlIGRhdGVcbiAgICAgIH0gZWxzZSBpZiAoZnVsbERheSkge1xuICAgICAgICByZXN1bHQgPSBvZihbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yYXdEYXRlVGltZURhdGVWYWx1ZSQucGlwZSh0aHJvdHRsZVRpbWUoMTAwMCwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pKSwgdGhpcy5fcHJlc2V0c1BpY2tlckZpbHRlciRdKS5waXBlKFxuICAgICAgICAgIG1hcCgoW3NlbGVjdGVkRGF0ZSwgaXNBbGxvd2VkRGF0ZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRQcmVzZXRzOiBEYXRlVGltZVByZXNldFtdID0gW107XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBlYWNoIHByZXNldCBhbmQgY2hlY2sgaWYgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgICB4LmZvckVhY2goKHByZXNldCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJlc2V0LnZhbHVlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHByZXNldERhdGU6IE1heWJlPERhdGU+O1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxvZ2ljYWxEYXRlKSB7XG4gICAgICAgICAgICAgICAgICBwcmVzZXREYXRlID0gZGF0ZUZyb21Mb2dpY2FsRGF0ZSh2YWx1ZS5sb2dpY2FsRGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS50aW1lU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICBwcmVzZXREYXRlID0gcmVhZGFibGVUaW1lU3RyaW5nVG9EYXRlKHZhbHVlLnRpbWVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogc2VsZWN0ZWREYXRlLFxuICAgICAgICAgICAgICAgICAgICB1c2VTeXN0ZW1UaW1lem9uZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNvbXB1dGVkIGRhdGUgc2hvdWxkIGJlIHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZVxuICAgICAgICAgICAgICAgIGlmIChwcmVzZXREYXRlICYmIGlzQWxsb3dlZERhdGUocHJlc2V0RGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcmVzZXRzLnB1c2gocHJlc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZFByZXNldHM7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dDbGVhckJ1dHRvbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmhhc0VtcHR5RGlzcGxheVZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gQm9vbGVhbih0aGlzLnNob3dDbGVhckJ1dHRvbiAmJiAheCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjYW5BdXRvZmlsbERhdGVXaXRoT25seUF2YWlsYWJsZURhdGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5kYXRlTWluQW5kTWF4SXNTYW1lRGF5JDtcblxuICByZWFkb25seSBzaG93RGF0ZUlucHV0JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZGF0ZU1pbkFuZE1heElzU2FtZURheSQucGlwZShcbiAgICBtYXAoKGRhdGVNaW5BbmRNYXhJc1NhbWVEYXkpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dEYXRlSW5wdXQgJiYgKHRoaXMuYWx3YXlzU2hvd0RhdGVJbnB1dCB8fCAhZGF0ZU1pbkFuZE1heElzU2FtZURheSk7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRFcnJvck1lc3NhZ2UkID0gdGhpcy5mb3JtQ29udHJvbCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGZvcm1Db250cm9sKSA9PlxuICAgICAgZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKFxuICAgICAgICBmaWx0ZXIoKHgpID0+IHggPT09ICdJTlZBTElEJyB8fCB4ID09PSAnVkFMSUQnKSxcbiAgICAgICAgbWFwKCh4KSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmICh4ID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Db250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2UgPSAnRGF0ZSBpcyByZXF1aXJlZCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbnRyb2wuaGFzRXJyb3IoREJYX0RBVEVfVElNRV9GSUVMRF9EQVRFX05PVF9JTl9TQ0hFRFVMRV9FUlJPUikpIHtcbiAgICAgICAgICAgICAgY3VycmVudEVycm9yTWVzc2FnZSA9ICdEYXRlIGRvZXMgbm90IGZhbGwgb24gYW4gYXZhaWxhYmxlIGRhdGVzIGluIHNjaGVkdWxlLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbnRyb2wuaGFzRXJyb3IoREJYX0RBVEVfVElNRV9GSUVMRF9USU1FX05PVF9JTl9SQU5HRV9FUlJPUikpIHtcbiAgICAgICAgICAgICAgY3VycmVudEVycm9yTWVzc2FnZSA9ICdUaW1lIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGdpdmVuIGRhdGUuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2UgPSAnVGhlIGdpdmVuIGRhdGUgYW5kIHRpbWUgaXMgaW52YWxpZC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjdXJyZW50RXJyb3JNZXNzYWdlO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICksXG4gICAgc3RhcnRXaXRoKHVuZGVmaW5lZCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBoYXNFcnJvciQgPSB0aGlzLmN1cnJlbnRFcnJvck1lc3NhZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBCb29sZWFuKHgpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVZhbHVlU2lnbmFsID0gdG9TaWduYWwodGhpcy5kYXRlVmFsdWUkKTtcbiAgcmVhZG9ubHkgZGlzcGxheVZhbHVlU2lnbmFsID0gdG9TaWduYWwodGhpcy5kaXNwbGF5VmFsdWUkKTtcbiAgcmVhZG9ubHkgcGlja2VyRmlsdGVyU2lnbmFsID0gdG9TaWduYWwodGhpcy5waWNrZXJGaWx0ZXIkLCB7IGluaXRpYWxWYWx1ZTogdGhpcy5kZWZhdWx0UGlja2VyRmlsdGVyIH0pO1xuICByZWFkb25seSBkYXRlSW5wdXRNaW5TaWduYWwgPSB0b1NpZ25hbCh0aGlzLmRhdGVJbnB1dE1pbiQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBkYXRlSW5wdXRNYXhTaWduYWwgPSB0b1NpZ25hbCh0aGlzLmRhdGVJbnB1dE1heCQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBzaG93RGF0ZUlucHV0U2lnbmFsID0gdG9TaWduYWwodGhpcy5zaG93RGF0ZUlucHV0JCk7XG4gIHJlYWRvbmx5IHNob3dUaW1lSW5wdXRTaWduYWwgPSB0b1NpZ25hbCh0aGlzLnNob3dUaW1lSW5wdXQkKTtcbiAgcmVhZG9ubHkgc2hvd0FkZFRpbWVTaWduYWwgPSB0b1NpZ25hbCh0aGlzLnNob3dBZGRUaW1lJCk7XG4gIHJlYWRvbmx5IGZ1bGxEYXlTaWduYWwgPSB0b1NpZ25hbCh0aGlzLmZ1bGxEYXkkKTtcbiAgcmVhZG9ubHkgdGltZXpvbmVBYmJyZXZpYXRpb25TaWduYWwgPSB0b1NpZ25hbCh0aGlzLnRpbWV6b25lQWJicmV2aWF0aW9uJCk7XG4gIHJlYWRvbmx5IGhhc0VtcHR5RGlzcGxheVZhbHVlU2lnbmFsID0gdG9TaWduYWwodGhpcy5oYXNFbXB0eURpc3BsYXlWYWx1ZSQpO1xuICByZWFkb25seSBjdXJyZW50RXJyb3JNZXNzYWdlU2lnbmFsID0gdG9TaWduYWwodGhpcy5jdXJyZW50RXJyb3JNZXNzYWdlJCk7XG4gIHJlYWRvbmx5IHNob3dDbGVhckJ1dHRvblNpZ25hbCA9IHRvU2lnbmFsKHRoaXMuc2hvd0NsZWFyQnV0dG9uJCk7XG4gIHJlYWRvbmx5IHByZXNldHNTaWduYWwgPSB0b1NpZ25hbCh0aGlzLnByZXNldHMkKTtcbiAgcmVhZG9ubHkgaGFzRXJyb3JTaWduYWwgPSB0b1NpZ25hbCh0aGlzLmhhc0Vycm9yJCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMubmV4dCh0aGlzLmZvcm1Db250cm9sKTtcblxuICAgIGNvbnN0IGlucHV0UGlja2VyQ29uZmlnID0gdGhpcy5kYXRlVGltZUZpZWxkLnBpY2tlckNvbmZpZztcbiAgICB0aGlzLl9jb25maWcubmV4dChpbnB1dFBpY2tlckNvbmZpZyA/IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIoaW5wdXRQaWNrZXJDb25maWcpIDogb2Yoe30pKTtcbiAgICB0aGlzLl9zeW5jQ29uZmlnT2JzLm5leHQodGhpcy5kYXRlVGltZUZpZWxkLmdldFN5bmNGaWVsZHNPYnM/LigpKTtcblxuICAgIHRoaXMuX3N1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnRpbWV6b25lSW5zdGFuY2UkLnBpcGUobWFwKCh0aW1lem9uZUluc3RhbmNlKSA9PiBkYnhEYXRlVGltZU91dHB1dFZhbHVlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKSksXG4gICAgICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKFtjdXJyZW50VmFsdWUsIHZhbHVlRmFjdG9yeV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50aW1lT3V0cHV0JC5waXBlKFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUUgKiAyLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgc2tpcEZpcnN0TWF5YmUoKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMpLFxuICAgICAgICAgICAgbWFwKCh4KSA9PiB2YWx1ZUZhY3RvcnkoeCkpLFxuICAgICAgICAgICAgZmlsdGVyKCh4KSA9PiAhZGJ4RGF0ZVRpbWVJc1NhbWVEYXRlVGltZUZpZWxkVmFsdWUoeCwgY3VycmVudFZhbHVlKSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9KTtcblxuICAgIGxldCBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IGZhbHNlO1xuXG4gICAgLypcbiAgICB0aGlzLl92YWx1ZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVTdHJpbmckLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgdGhpcy5zZXRUaW1lKHgpO1xuICAgIH0pO1xuICAgICovXG5cbiAgICBpZiAodGhpcy5hdXRvZmlsbERhdGVXaGVuVGltZUlzUGlja2VkKSB7XG4gICAgICB0aGlzLl9hdXRvRmlsbERhdGVTeW5jLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2FuQXV0b2ZpbGxEYXRlV2l0aE9ubHlBdmFpbGFibGVEYXRlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKGNhbkF1dG9maWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FuQXV0b2ZpbGwpIHtcbiAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdGltZSB1cGRhdGVzIHRoZSBmaXJzdCB0aW1lLCBzZXQgdGhlIGN1cnJlbnQgbWluIGRhdGVcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVRpbWUucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHgpID0+IHRoaXMuZGF0ZUlucHV0TWluJCksXG4gICAgICAgICAgICAgICAgZmlsdGVyTWF5YmUoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpOyAvLyBkb24ndCBzaG93IGFueXRoaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChhdXRvRGF0ZSkgPT4ge1xuICAgICAgICAgIGlmIChhdXRvRGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVJbnB1dEN0cmwuc2V0VmFsdWUoYXV0b0RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh4KSA9PiAoeCA/IGlzU2FtZURhdGUoeCwgc3RhcnRPZkRheSh4KSkgOiBmYWxzZSkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBzd2l0Y2hNYXAoKGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQpID0+IHtcbiAgICAgICAgICBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVTdHJpbmckLnBpcGUoXG4gICAgICAgICAgICAvLyBza2lwKDEpLFxuICAgICAgICAgICAgbWFwKCh0aW1lU3RyaW5nKSA9PiBbdGltZVN0cmluZywgaXNJbnB1dFZhbHVlQXRNaWRuaWdodF0gYXMgW3N0cmluZywgYm9vbGVhbl0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFt4LCBpc0lucHV0VmFsdWVBdE1pZG5pZ2h0XSkgPT4ge1xuICAgICAgICAvLyBTa2lwIGV2ZW50cyB3aGVyZSB0aGUgdGltZUlucHV0IHZhbHVlIGlzIGNsZWFyZWQsIHVubGVzcyB0aGUgaW5wdXQgdmFsdWUgaXMgYXQgbWlkbmlnaHQgYW5kIHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIGl0IGJlaW5nIGF0IG1pZG5pZ2h0XG4gICAgICAgIGlmICghdGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlICYmIHggPT09ICcxMjowMEFNJyAmJiAoIWlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQgfHwgKGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQgJiYgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgaGFzIHNldCBmbGFnXG4gICAgICAgIGlmICh4ID09PSAnMTI6MDBBTScgJiYgaXNJbnB1dFZhbHVlQXRNaWRuaWdodCkge1xuICAgICAgICAgIGhhc1NldE1pZG5pZ2h0RnJvbUlucHV0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VGltZSh4KTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdGltZXpvbmUgaWYgcHJvdmlkZWQuXG4gICAgaWYgKHRoaXMudGltZXpvbmUgJiYgIXRoaXMuZGF0ZVRpbWVGaWVsZC5mdWxsRGF5SW5VVEMpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRUaW1lem9uZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy50aW1lem9uZSkpO1xuICAgIH1cblxuICAgIHRoaXMuX3RpbWVEYXRlLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnRpbWVEYXRlKSk7XG5cbiAgICAvLyBXYXRjaCBmb3IgZGlzYWJsZWQgY2hhbmdlcyBzbyB3ZSBjYW4gcHJvcG9nYXRlIHRoZW0gcHJvcGVybHkuXG4gICAgdGhpcy5mb3JtQ29udHJvbC5yZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2UoKGlzRGlzYWJsZWQpID0+IHtcbiAgICAgIHRvZ2dsZURpc2FibGVGb3JtQ29udHJvbCh0aGlzLmRhdGVJbnB1dEN0cmwsIGlzRGlzYWJsZWQpO1xuICAgICAgdG9nZ2xlRGlzYWJsZUZvcm1Db250cm9sKHRoaXMudGltZUlucHV0Q3RybCwgaXNEaXNhYmxlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpc0Z1bGxEYXlGaWVsZCA9IHRoaXMuZGF0ZVRpbWVGaWVsZC5mdWxsRGF5RmllbGROYW1lO1xuICAgIGxldCBmdWxsRGF5RmllbGRDdHJsOiBNYXliZTxBYnN0cmFjdENvbnRyb2w+O1xuXG4gICAgaWYgKGlzRnVsbERheUZpZWxkKSB7XG4gICAgICBmdWxsRGF5RmllbGRDdHJsID0gdGhpcy5mb3JtLmdldChpc0Z1bGxEYXlGaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKCFmdWxsRGF5RmllbGRDdHJsKSB7XG4gICAgICBjb25zdCBpc0Z1bGxEYXkgPSB0aGlzLnRpbWVNb2RlID09PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTtcbiAgICAgIHRoaXMuX2Z1bGxEYXlJbnB1dEN0cmwuc2V0VmFsdWUoaXNGdWxsRGF5KTtcblxuICAgICAgLy8gU2V0IHRoZSBjb250cm9sIGluIHRoZSBmb3JtIHRvbyBpZiB0aGUgbmFtZSBpcyBkZWZpbmVkLlxuICAgICAgaWYgKGlzRnVsbERheUZpZWxkKSB7XG4gICAgICAgICh0aGlzLmZvcm0gYXMgRm9ybUdyb3VwKS5hZGRDb250cm9sKGlzRnVsbERheUZpZWxkLCB0aGlzLl9mdWxsRGF5SW5wdXRDdHJsKTtcbiAgICAgIH1cblxuICAgICAgZnVsbERheUZpZWxkQ3RybCA9IHRoaXMuX2Z1bGxEYXlJbnB1dEN0cmw7XG4gICAgfVxuXG4gICAgdGhpcy5fZnVsbERheUNvbnRyb2xPYnMubmV4dChmdWxsRGF5RmllbGRDdHJsKTtcblxuICAgIHN3aXRjaCAodGhpcy50aW1lTW9kZSkge1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuT1BUSU9OQUw6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTpcbiAgICAgICAgdGhpcy5yZW1vdmVUaW1lKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQ6XG4gICAgICAgIHRoaXMuYWRkVGltZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcmVzZXRzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX3ByZXNldHMubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMucHJlc2V0cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wcmVzZXRzLm5leHQodGhpcy5kYnhEYXRlVGltZUZpZWxkQ29uZmlnU2VydmljZS5jb25maWd1cmF0aW9ucyQpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dFN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnJlc3luY1RpbWVJbnB1dCQucGlwZShzd2l0Y2hNYXAoKHgpID0+IGNvbWJpbmVMYXRlc3QoW3RoaXMuY3VycmVudERhdGUkLCB0aGlzLnRpbWVTdHJpbmckXSkucGlwZShmaXJzdCgpKSkpLnN1YnNjcmliZSgoW2N1cnJlbnREYXRlLCB0aW1lU3RyaW5nXSkgPT4ge1xuICAgICAgLy8gb25seSByZXN5bmMgd2hlbiB0aGUgY3VycmVudCBkYXRlIGlzIHNldCwgb3RoZXJ3aXNlIGRvIG5vdCBjaGFuZ2UgdGhlIHRpbWUgc3RyaW5nLlxuICAgICAgLy8gVGhpcyBoZWxwcyBpbiBjYXNlcyB3aGVyZSB0aGUgdXNlciBwaWNrcyBhIHRpbWUgZmlyc3QgYW5kIHdlIGRvbid0IHdhbnQgaXQgdG8gYmUgY2xlYXJlZC5cbiAgICAgIGlmIChjdXJyZW50RGF0ZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudGltZUlucHV0Q3RybC5zZXRWYWx1ZSh0aW1lU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBhZGQgdmFsaWRhdG9ycy9lcnJvcnMgZm9yIHRoZSBmb3JtXG4gICAgdGhpcy5mb3JtQ29udHJvbC5hZGRBc3luY1ZhbGlkYXRvcnMoW1xuICAgICAgKHgpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0geC52YWx1ZSBhcyBNYXliZTxEYXRlPjtcbiAgICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzPjtcblxuICAgICAgICBpZiAoZm9ybVZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvYnMgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnRpbWV6b25lSW5zdGFuY2UkLCB0aGlzLmRhdGVUaW1lUGlja2VySW5zdGFuY2UkXSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoW3RpbWV6b25lSW5zdGFuY2UsIHhdKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHRoZSBmb3JtIHZhbHVlIGlzIGdvaW5nIHRvIGJlIGluIHRoZSBvdXRwdXQgZm9ybSwgc28gd2UgbmVlZCB0byBwYXJzZSBpdCBiYWNrIHRvIHRoZSBcImlucHV0XCIgZGF0ZSBiZWZvcmUgZXZhbHVhdGluZyBpdFxuICAgICAgICAgICAgICBjb25zdCBmb3JtVmFsdWVJblN5c3RlbVRpbWV6b25lID0gZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5KHRoaXMudmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlKShmb3JtVmFsdWUpO1xuXG4gICAgICAgICAgICAgIGxldCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy50aW1lSW5wdXRDdHJsLmVycm9yc1xuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmIChmb3JtVmFsdWVJblN5c3RlbVRpbWV6b25lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHguZGF0ZUlzSW5TY2hlZHVsZShmb3JtVmFsdWVJblN5c3RlbVRpbWV6b25lKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCF4LmlzSW5WYWxpZFJhbmdlKGZvcm1WYWx1ZUluU3lzdGVtVGltZXpvbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICBbREJYX0RBVEVfVElNRV9GSUVMRF9USU1FX05PVF9JTl9SQU5HRV9FUlJPUl06IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZXJyb3JzID0ge1xuICAgICAgICAgICAgICAgICAgICBbREJYX0RBVEVfVElNRV9GSUVMRF9EQVRFX05PVF9JTl9TQ0hFRFVMRV9FUlJPUl06IHRydWVcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlyc3QoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JzID0gb2Yoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9icztcbiAgICAgIH1cbiAgICBdKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5fc3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl92YWx1ZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fY29uZmlnLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY29uZmlnVXBkYXRlVGltZVN5bmMuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RlZmF1bHRUaW1lem9uZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dFN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fYXV0b0ZpbGxEYXRlU3luYy5kZXN0cm95KCk7XG4gICAgdGhpcy5fdGltZURhdGUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9wcmVzZXRzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZnVsbERheUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgICB0aGlzLl9vZmZzZXQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9mb3JtQ29udHJvbE9icy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3VwZGF0ZVRpbWUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9jbGVhcmVkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcmVzeW5jVGltZUlucHV0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc3luY0NvbmZpZ09icy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc2VsZWN0UHJlc2V0KHByZXNldDogRGF0ZVRpbWVQcmVzZXQpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByZXNldC52YWx1ZSgpO1xuXG4gICAgaWYgKHZhbHVlLmxvZ2ljYWxEYXRlKSB7XG4gICAgICB0aGlzLnNldExvZ2ljYWxUaW1lKHZhbHVlLmxvZ2ljYWxEYXRlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnRpbWVTdHJpbmcpIHtcbiAgICAgIHRoaXMuc2V0VGltZSh2YWx1ZS50aW1lU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICBkYXRlUGlja2VkKGV2ZW50OiBNYXREYXRlcGlja2VySW5wdXRFdmVudDxEYXRlPik6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBldmVudC52YWx1ZTtcblxuICAgIGlmIChkYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGVJbnB1dFZhbHVlKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvZ2ljYWxUaW1lKHRpbWU6IExvZ2ljYWxEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgZGF0ZSA9IGRhdGVGcm9tTG9naWNhbERhdGUodGltZSk7XG5cbiAgICBpZiAoZGF0ZSkge1xuICAgICAgdGhpcy5zZXRUaW1lRnJvbURhdGUoZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF0ZUlucHV0VmFsdWUoZGF0ZTogRGF0ZSkge1xuICAgIHRoaXMuZGF0ZUlucHV0Q3RybC5zZXRWYWx1ZShkYXRlKTtcbiAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgfVxuXG4gIHNldFRpbWVGcm9tRGF0ZSh0aW1lRGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVTdHJpbmcgPSB0b0xvY2FsUmVhZGFibGVUaW1lU3RyaW5nKHRpbWVEYXRlKTtcbiAgICB0aGlzLnNldFRpbWUodGltZVN0cmluZyk7XG4gIH1cblxuICBzZXRUaW1lKHRpbWU6IFJlYWRhYmxlVGltZVN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVJbnB1dEN0cmwudmFsdWUgIT09IHRpbWUpIHtcbiAgICAgIHRoaXMudGltZUlucHV0Q3RybC5zZXRWYWx1ZSh0aW1lKTtcbiAgICAgIHRoaXMuX29mZnNldC5uZXh0KDApO1xuICAgICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAga2V5ZG93bk9uRGF0ZUlucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IGRpcmVjdGlvbiA9IDA7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgIGRpcmVjdGlvbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgZGlyZWN0aW9uID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQgPSAxO1xuXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDM2NTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIG9mZnNldCA9IDMwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDc7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gMCkge1xuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5kYXRlJCwgdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyRdKVxuICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAuc3Vic2NyaWJlKChbZGF0ZSwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBzdGFydE9mRGF5KGFkZERheXMoZGF0ZSwgb2Zmc2V0ICogZGlyZWN0aW9uKSk7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGF0ZVRpbWVNaW51dGVJbnN0YW5jZSh7XG4gICAgICAgICAgICBkYXRlOiBuZXdEYXRlLFxuICAgICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBuZXh0RGF0ZSA9IGluc3RhbmNlLmlzSW5TY2hlZHVsZShuZXdEYXRlKSA/IG5ld0RhdGUgOiBpbnN0YW5jZS5maW5kTmV4dEF2YWlsYWJsZURheUluU2NoZWR1bGUobmV3RGF0ZSwgZGlyZWN0aW9uID09PSAxID8gJ2Z1dHVyZScgOiAncGFzdCcpO1xuXG4gICAgICAgICAgaWYgKG5leHREYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZUlucHV0VmFsdWUoaW5zdGFuY2UuY2xhbXBUb0xpbWl0KG5leHREYXRlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBrZXlkb3duT25UaW1lSW5wdXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgZGlyZWN0aW9uID0gMDtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5Py50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdhcnJvd3VwJzpcbiAgICAgICAgZGlyZWN0aW9uID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICBkaXJlY3Rpb24gPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGV0IG9mZnNldCA9IDE7XG5cbiAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSAzMDA7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDYwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDU7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gMCkge1xuICAgICAgdGhpcy5fb2Zmc2V0Lm5leHQodGhpcy5fb2Zmc2V0LnZhbHVlICsgb2Zmc2V0ICogZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzVGltZSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBmb2N1c091dFRpbWUoKTogdm9pZCB7XG4gICAgLy8gb25seSByZWZyZXNoIHdoZW4gdGhlcmUgaXMgbm90IGEgcGF0dGVybiBlcnJvclxuICAgIGlmICghdGhpcy50aW1lSW5wdXRDdHJsLmhhc0Vycm9yKCdwYXR0ZXJuJykpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICAgICAgdGhpcy5fcmVzeW5jVGltZUlucHV0Lm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBhZGRUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RnVsbERheShmYWxzZSk7XG4gIH1cblxuICByZW1vdmVUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RnVsbERheSh0cnVlKTtcbiAgfVxuXG4gIHNldEZ1bGxEYXkoZnVsbERheTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZnVsbERheUNvbnRyb2wkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICB4LnNldFZhbHVlKGZ1bGxEYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJWYWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhcmVkLm5leHQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRieC1kYXRldGltZS1maWVsZFwiIGZ4TGF5b3V0PVwicm93IHdyYXBcIiBmeExheW91dC54cz1cImNvbHVtbiB3cmFwXCIgZnhMYXlvdXRHYXA9XCI2cHggZ3JpZFwiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1ldmVubHkgc3RyZXRjaFwiPlxuICA8IS0tIERhdGUgLS0+XG4gIEBpZiAoc2hvd0RhdGVJbnB1dFNpZ25hbCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cImRieC1kYXRldGltZS1yb3dcIiBmeEZsZXgubHQtc209XCIxMDBcIiBbZnhGbGV4XT1cImRhdGVPbmx5ID8gJzEwMCcgOiAnNTAnXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRhdGVJbnB1dFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIH1cbiAgPCEtLSBUaW1lIC0tPlxuICBAaWYgKHNob3dUaW1lSW5wdXRTaWduYWwoKSB8fCBzaG93QWRkVGltZVNpZ25hbCgpKSB7XG4gICAgPCEtLSBPbmx5IHNob3cgZmxleCBpZiB0aGVyZSBpcyBjb250ZW50IHRvIGJlIGRpc3BsYXllZC4gLS0+XG4gICAgPGRpdiBjbGFzcz1cImRieC1kYXRldGltZS1yb3dcIiBmeEZsZXgubHQtc209XCIxMDBcIiBbZnhGbGV4XT1cInNob3dEYXRlSW5wdXRTaWduYWwoKSA/ICc1MCcgOiAnMTAwJ1wiPlxuICAgICAgQGlmIChzaG93VGltZUlucHV0U2lnbmFsKCkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aW1lTWVudUFuZElucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIH1cbiAgICAgIEBpZiAoc2hvd0FkZFRpbWVTaWduYWwoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXRpbWUtYnV0dG9uLXdyYXBwZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJtYXQtZGF0ZXBpY2tlci1idXR0b24taGlnaGxpZ2h0IGRieC1idXR0b24tc3BhY2VyIGFkZC10aW1lLWJ1dHRvblwiIG5nQ2xhc3MubHQtc209XCJhZGQtdGltZS1idXR0b24tZnVsbFwiIChjbGljayk9XCJhZGRUaW1lKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj50aW1lcjwvbWF0LWljb24+XG4gICAgICAgICAgICBBZGQgVGltZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuICA8IS0tIERhdGUgSGludCAtLT5cbiAgQHN3aXRjaCAoaGFzRXJyb3JTaWduYWwoKSkge1xuICAgIEBjYXNlIChmYWxzZSkge1xuICAgICAgQGlmICghaGlkZURhdGVIaW50KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93IGRieC1kYXRldGltZS1oaW50LXJvd1wiIGZ4RmxleD1cIjEwMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYngtaGludFwiPlxuICAgICAgICAgICAgQHN3aXRjaCAoaGFzRW1wdHlEaXNwbGF5VmFsdWVTaWduYWwoKSkge1xuICAgICAgICAgICAgICBAY2FzZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJ4LXNtYWxsXCI+Tm8gZGF0ZS90aW1lIHNldDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAY2FzZSAoZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBAc3dpdGNoIChmdWxsRGF5U2lnbmFsKCkpIHtcbiAgICAgICAgICAgICAgICAgIEBjYXNlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICA8YiBjbGFzcz1cImRieC1va1wiPnt7IGFsbERheUxhYmVsIH19PC9iPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGRpc3BsYXlWYWx1ZVNpZ25hbCgpIHwgZGF0ZTogJ2Z1bGxEYXRlJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvblNpZ25hbCgpIH19ICh7eyBkaXNwbGF5VmFsdWVTaWduYWwoKSB8IGRhdGVEaXN0YW5jZSB9fSlcbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBjYXNlIChmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChkaXNwbGF5VmFsdWVTaWduYWwoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJkYngtb2tcIj57eyBhdFRpbWVMYWJlbCB9fTwvYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRpc3BsYXlWYWx1ZVNpZ25hbCgpIHwgZGF0ZTogJ21lZGl1bScgfX0ge3sgdGltZXpvbmVBYmJyZXZpYXRpb25TaWduYWwoKSB9fSAoe3sgZGlzcGxheVZhbHVlU2lnbmFsKCkgfCB0aW1lRGlzdGFuY2UgfX0pXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gICAgQGNhc2UgKHRydWUpIHtcbiAgICAgIEBpZiAoY3VycmVudEVycm9yTWVzc2FnZVNpZ25hbCgpKSB7XG4gICAgICAgIDxtYXQtZXJyb3I+e3sgY3VycmVudEVycm9yTWVzc2FnZVNpZ25hbCgpIH19PC9tYXQtZXJyb3I+XG4gICAgICB9XG4gICAgfVxuICB9XG48L2Rpdj5cblxuPCEtLSBEYXRlIElucHV0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNkYXRlSW5wdXRUZW1wbGF0ZT5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdy1maWVsZFwiPlxuICAgIDxtYXQtbGFiZWw+e3sgZGF0ZUxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0ICNkYXRlSW5wdXQgbWF0SW5wdXQgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3JlcXVpcmVkXT1cImlzRGF0ZVJlcXVpcmVkXCIgW21pbl09XCJkYXRlSW5wdXRNaW5TaWduYWwoKVwiIFttYXhdPVwiZGF0ZUlucHV0TWF4U2lnbmFsKClcIiBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIiBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJwaWNrZXJGaWx0ZXJTaWduYWwoKVwiIChkYXRlQ2hhbmdlKT1cImRhdGVQaWNrZWQoJGV2ZW50KVwiIFt2YWx1ZV09XCJkYXRlVmFsdWVTaWduYWwoKVwiIChrZXlkb3duKT1cImtleWRvd25PbkRhdGVJbnB1dCgkZXZlbnQpXCIgLz5cbiAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgIEBpZiAoIWhpZGVEYXRlUGlja2VyKSB7XG4gICAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwaWNrZXIub3BlbigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxtYXQtaWNvbj5jYWxlbmRhcl90b2RheTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgQGlmIChzaG93Q2xlYXJCdXR0b25TaWduYWwoKSkge1xuICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggY2xhc3M9XCJkYngtZGF0ZXRpbWUtY2xlYXItYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJjbGVhcnMgdGhlIGRhdGUgYW5kIHRpbWUgbWVudVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjbGljayk9XCJjbGVhclZhbHVlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgICBAaWYgKCFzaG93VGltZUlucHV0U2lnbmFsKCkpIHtcbiAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGltZXpvbmVTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9zcGFuPlxuICAgIH1cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGltZSBNZW51L0lucHV0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICN0aW1lTWVudUFuZElucHV0VGVtcGxhdGU+XG4gIDxtYXQtbWVudSAjdGltZW1lbnU9XCJtYXRNZW51XCI+XG4gICAgQGlmICh0aW1lTW9kZSA9PT0gJ29wdGlvbmFsJykge1xuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJyZW1vdmVUaW1lKClcIj5cbiAgICAgICAgPHNwYW4+UmVtb3ZlIFRpbWU8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgIH1cbiAgICBAZm9yIChwcmVzZXQgb2YgcHJlc2V0c1NpZ25hbCgpOyB0cmFjayBwcmVzZXQpIHtcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2VsZWN0UHJlc2V0KHByZXNldClcIj57eyBwcmVzZXQubGFiZWwgfCBnZXRWYWx1ZSB9fTwvYnV0dG9uPlxuICAgIH1cbiAgPC9tYXQtbWVudT5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdy1maWVsZFwiPlxuICAgIDxtYXQtbGFiZWw+e3sgdGltZUxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0ICN0aW1lSW5wdXQgW2Vycm9yU3RhdGVNYXRjaGVyXT1cInRpbWVFcnJvclN0YXRlTWF0Y2hlclwiIG1hdElucHV0IFtyZXF1aXJlZF09XCJpc1RpbWVSZXF1aXJlZFwiIFtmb3JtQ29udHJvbF09XCJ0aW1lSW5wdXRDdHJsXCIgKGZvY3VzKT1cImZvY3VzVGltZSgpXCIgKGZvY3Vzb3V0KT1cImZvY3VzT3V0VGltZSgpXCIgKGtleWRvd24pPVwia2V5ZG93bk9uVGltZUlucHV0KCRldmVudClcIiAvPlxuICAgIDxidXR0b24gbWF0UHJlZml4IGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdy1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInRpbWVtZW51XCIgYXJpYS1sYWJlbD1cIm9wZW5zIHRoZSB0aW1lIG1lbnVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgIDxtYXQtaWNvbj50aW1lcjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPHNwYW4gbWF0VGV4dFN1ZmZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGltZXpvbmVTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgICBAaWYgKHRpbWVJbnB1dEN0cmwuaGFzRXJyb3IoJ3BhdHRlcm4nKSkge1xuICAgICAgPG1hdC1lcnJvcj5UaGUgaW5wdXQgdGltZSBpcyBub3QgcmVjb2duaXphYmxlLjwvbWF0LWVycm9yPlxuICAgIH1cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGltZXpvbmUgU3VmZml4IC0tPlxuPG5nLXRlbXBsYXRlICN0aW1lem9uZVN1ZmZpeFRlbXBsYXRlPlxuICBAaWYgKHNob3dUaW1lem9uZSkge1xuICAgIDxzcGFuIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXRpbWV6b25lIGRieC1mYWludFwiPnt7IHRpbWV6b25lQWJicmV2aWF0aW9uU2lnbmFsKCkgfX08L3NwYW4+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|