ngx-sumax-erp-components 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/date-picker/CustomDatePickerFormat.mjs +43 -0
  3. package/esm2022/lib/date-picker/CustomDatePickerI18n.mjs +50 -0
  4. package/esm2022/lib/date-picker/date-picker.component.mjs +366 -0
  5. package/esm2022/lib/date-picker/date-picker.mjs +3 -0
  6. package/esm2022/lib/date-picker/date-picker.module.mjs +69 -0
  7. package/esm2022/lib/date-picker/date-picker.service.mjs +68 -0
  8. package/esm2022/lib/date-time-picker/date-time-picker.component.mjs +311 -0
  9. package/esm2022/lib/date-time-picker/date-time-picker.mjs +3 -0
  10. package/esm2022/lib/date-time-picker/date-time-picker.module.mjs +76 -0
  11. package/esm2022/lib/date-time-picker/date-time-picker.service.mjs +64 -0
  12. package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.component.mjs +1140 -0
  13. package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.module.mjs +93 -0
  14. package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.service.mjs +85 -0
  15. package/esm2022/lib/dialog-ag-grid-search/dialog-ag-grid-search.component.mjs +283 -0
  16. package/esm2022/lib/dialog-ag-grid-search/dialog-ag-grid-search.module.mjs +23 -0
  17. package/esm2022/lib/error-message/error-message.component.mjs +24 -0
  18. package/esm2022/lib/error-message/error-message.module.mjs +19 -0
  19. package/esm2022/lib/input-number/input-number.component.mjs +351 -0
  20. package/esm2022/lib/input-number/input-number.mjs +3 -0
  21. package/esm2022/lib/input-number/input-number.module.mjs +65 -0
  22. package/esm2022/lib/input-number/input-number.service.mjs +68 -0
  23. package/esm2022/lib/input-text/input-text.component.mjs +345 -0
  24. package/esm2022/lib/input-text/input-text.mjs +3 -0
  25. package/esm2022/lib/input-text/input-text.module.mjs +73 -0
  26. package/esm2022/lib/input-text/input-text.service.mjs +96 -0
  27. package/esm2022/lib/ng-select-multiple/ng-select-multiple.component.mjs +375 -0
  28. package/esm2022/lib/ng-select-multiple/ng-select-multiple.mjs +3 -0
  29. package/esm2022/lib/ng-select-multiple/ng-select-multiple.module.mjs +69 -0
  30. package/esm2022/lib/ng-select-multiple/ng-select-multiple.service.mjs +96 -0
  31. package/esm2022/lib/ng-select-simple/ng-select-simple.component.mjs +461 -0
  32. package/esm2022/lib/ng-select-simple/ng-select-simple.mjs +3 -0
  33. package/esm2022/lib/ng-select-simple/ng-select-simple.module.mjs +53 -0
  34. package/esm2022/lib/ng-select-simple/ng-select-simple.service.mjs +138 -0
  35. package/esm2022/lib/sc-ag-grid/cell-editors/container-shared/container-shared.component.mjs +144 -0
  36. package/esm2022/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayCustom.component.mjs +27 -0
  37. package/esm2022/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayDefault.component.mjs +22 -0
  38. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-button/sc-cell-render-button.component.mjs +242 -0
  39. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-checkbox-list/sc-cell-render-checkbox-list.component.mjs +62 -0
  40. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-config.mjs +27 -0
  41. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-select/sc-cell-render-select.component.mjs +70 -0
  42. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-toggle/sc-cell-render-toggle.component.mjs +45 -0
  43. package/esm2022/lib/sc-ag-grid/directives/scAgGrid.directive.mjs +25 -0
  44. package/esm2022/lib/sc-ag-grid/index.mjs +14 -0
  45. package/esm2022/lib/sc-ag-grid/input-search/input-search.component.mjs +20 -0
  46. package/esm2022/lib/sc-ag-grid/input-search/input-search.module.mjs +31 -0
  47. package/esm2022/lib/sc-ag-grid/sc-ag-grid-customizable/sc-ag-grid-customizable.component.mjs +564 -0
  48. package/esm2022/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.component.mjs +80 -0
  49. package/esm2022/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.module.mjs +31 -0
  50. package/esm2022/lib/sc-ag-grid/sc-ag-grid.module.mjs +118 -0
  51. package/esm2022/lib/sc-ag-grid/sc-grid.uitl.mjs +10 -0
  52. package/esm2022/lib/sc-wizard/sc-wizard.component.mjs +75 -0
  53. package/esm2022/lib/sc-wizard/sc-wizard.module.mjs +44 -0
  54. package/esm2022/lib/text-area/text-area.component.mjs +272 -0
  55. package/esm2022/lib/text-area/text-area.mjs +3 -0
  56. package/esm2022/lib/text-area/text-area.module.mjs +60 -0
  57. package/esm2022/lib/text-area/text-area.service.mjs +54 -0
  58. package/esm2022/lib/tooltip-message/tooltip-message.component.mjs +25 -0
  59. package/esm2022/lib/tooltip-message/tooltip-message.module.mjs +21 -0
  60. package/esm2022/lib/utils/DateTimeModel.mjs +56 -0
  61. package/esm2022/lib/utils/DateTimePickerEditable.mjs +3 -0
  62. package/esm2022/lib/utils/DateUtil.mjs +196 -0
  63. package/esm2022/lib/utils/INgSelect.mjs +2 -0
  64. package/esm2022/lib/utils/IScAgGrid.mjs +7 -0
  65. package/esm2022/lib/utils/ScWizardBase.mjs +14 -0
  66. package/esm2022/lib/utils/SharedComponentsUtil.mjs +38 -0
  67. package/esm2022/lib/utils/ValidateUtil.mjs +18 -0
  68. package/esm2022/lib/utils/message-util.service.mjs +75 -0
  69. package/esm2022/ngx-sumax-erp-components.mjs +5 -0
  70. package/esm2022/public-api.mjs +33 -0
  71. package/fesm2022/ngx-sumax-erp-components.mjs +7045 -0
  72. package/fesm2022/ngx-sumax-erp-components.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/date-picker/CustomDatePickerFormat.d.ts +11 -0
  75. package/lib/date-picker/CustomDatePickerI18n.d.ts +25 -0
  76. package/lib/date-picker/date-picker.component.d.ts +108 -0
  77. package/lib/date-picker/date-picker.d.ts +10 -0
  78. package/lib/date-picker/date-picker.module.d.ts +18 -0
  79. package/lib/date-picker/date-picker.service.d.ts +22 -0
  80. package/lib/date-time-picker/date-time-picker.component.d.ts +96 -0
  81. package/lib/date-time-picker/date-time-picker.d.ts +9 -0
  82. package/lib/date-time-picker/date-time-picker.module.d.ts +18 -0
  83. package/lib/date-time-picker/date-time-picker.service.d.ts +20 -0
  84. package/lib/date-time-picker-editable/date-time-picker-editable.component.d.ts +118 -0
  85. package/lib/date-time-picker-editable/date-time-picker-editable.module.d.ts +16 -0
  86. package/lib/date-time-picker-editable/date-time-picker-editable.service.d.ts +27 -0
  87. package/lib/dialog-ag-grid-search/dialog-ag-grid-search.component.d.ts +82 -0
  88. package/lib/dialog-ag-grid-search/dialog-ag-grid-search.module.d.ts +13 -0
  89. package/lib/error-message/error-message.component.d.ts +13 -0
  90. package/lib/error-message/error-message.module.d.ts +9 -0
  91. package/lib/input-number/input-number.component.d.ts +74 -0
  92. package/lib/input-number/input-number.d.ts +10 -0
  93. package/lib/input-number/input-number.module.d.ts +17 -0
  94. package/lib/input-number/input-number.service.d.ts +22 -0
  95. package/lib/input-text/input-text.component.d.ts +85 -0
  96. package/lib/input-text/input-text.d.ts +17 -0
  97. package/lib/input-text/input-text.module.d.ts +18 -0
  98. package/lib/input-text/input-text.service.d.ts +35 -0
  99. package/lib/ng-select-multiple/ng-select-multiple.component.d.ts +83 -0
  100. package/lib/ng-select-multiple/ng-select-multiple.d.ts +14 -0
  101. package/lib/ng-select-multiple/ng-select-multiple.module.d.ts +17 -0
  102. package/lib/ng-select-multiple/ng-select-multiple.service.d.ts +30 -0
  103. package/lib/ng-select-simple/ng-select-simple.component.d.ts +124 -0
  104. package/lib/ng-select-simple/ng-select-simple.d.ts +20 -0
  105. package/lib/ng-select-simple/ng-select-simple.module.d.ts +17 -0
  106. package/lib/ng-select-simple/ng-select-simple.service.d.ts +42 -0
  107. package/lib/sc-ag-grid/cell-editors/container-shared/container-shared.component.d.ts +61 -0
  108. package/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayCustom.component.d.ts +10 -0
  109. package/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayDefault.component.d.ts +9 -0
  110. package/lib/sc-ag-grid/cell-render/sc-cell-render-button/sc-cell-render-button.component.d.ts +49 -0
  111. package/lib/sc-ag-grid/cell-render/sc-cell-render-checkbox-list/sc-cell-render-checkbox-list.component.d.ts +11 -0
  112. package/lib/sc-ag-grid/cell-render/sc-cell-render-config.d.ts +20 -0
  113. package/lib/sc-ag-grid/cell-render/sc-cell-render-select/sc-cell-render-select.component.d.ts +16 -0
  114. package/lib/sc-ag-grid/cell-render/sc-cell-render-toggle/sc-cell-render-toggle.component.d.ts +16 -0
  115. package/lib/sc-ag-grid/directives/scAgGrid.directive.d.ts +10 -0
  116. package/lib/sc-ag-grid/index.d.ts +13 -0
  117. package/lib/sc-ag-grid/input-search/input-search.component.d.ts +11 -0
  118. package/lib/sc-ag-grid/input-search/input-search.module.d.ts +9 -0
  119. package/lib/sc-ag-grid/sc-ag-grid-customizable/sc-ag-grid-customizable.component.d.ts +191 -0
  120. package/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.component.d.ts +25 -0
  121. package/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.module.d.ts +9 -0
  122. package/lib/sc-ag-grid/sc-ag-grid.module.d.ts +32 -0
  123. package/lib/sc-ag-grid/sc-grid.uitl.d.ts +5 -0
  124. package/lib/sc-wizard/sc-wizard.component.d.ts +38 -0
  125. package/lib/sc-wizard/sc-wizard.module.d.ts +13 -0
  126. package/lib/text-area/text-area.component.d.ts +66 -0
  127. package/lib/text-area/text-area.d.ts +8 -0
  128. package/lib/text-area/text-area.module.d.ts +16 -0
  129. package/lib/text-area/text-area.service.d.ts +18 -0
  130. package/lib/tooltip-message/tooltip-message.component.d.ts +13 -0
  131. package/lib/tooltip-message/tooltip-message.module.d.ts +11 -0
  132. package/lib/utils/DateTimeModel.d.ts +16 -0
  133. package/lib/utils/DateTimePickerEditable.d.ts +13 -0
  134. package/lib/utils/DateUtil.d.ts +37 -0
  135. package/lib/utils/INgSelect.d.ts +6 -0
  136. package/lib/utils/IScAgGrid.d.ts +65 -0
  137. package/lib/utils/ScWizardBase.d.ts +9 -0
  138. package/lib/utils/SharedComponentsUtil.d.ts +6 -0
  139. package/lib/utils/ValidateUtil.d.ts +4 -0
  140. package/lib/utils/message-util.service.d.ts +10 -0
  141. package/package.json +32 -0
  142. package/public-api.d.ts +29 -0
@@ -0,0 +1,1140 @@
1
+ import { DatePipe } from "@angular/common";
2
+ import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, forwardRef, inject, } from "@angular/core";
3
+ import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, UntypedFormControl, } from "@angular/forms";
4
+ import { NgbCalendar, NgbDateParserFormatter, NgbDatepickerI18n } from "@ng-bootstrap/ng-bootstrap";
5
+ import { CustomDatepickerFormat } from "../date-picker/CustomDatePickerFormat";
6
+ import { CustomDatepickerI18n, I18n } from "../date-picker/CustomDatePickerI18n";
7
+ import { DateTimeModel } from "../utils/DateTimeModel";
8
+ import { DateUtil } from "../utils/DateUtil";
9
+ import { DateTimePickerEditableService } from "./date-time-picker-editable.service";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "@ng-bootstrap/ng-bootstrap";
13
+ import * as i3 from "@angular/forms";
14
+ import * as i4 from "../tooltip-message/tooltip-message.component";
15
+ import * as i5 from "@angular/material/tooltip";
16
+ import * as i6 from "../error-message/error-message.component";
17
+ const MASK_12_HOURS = "dd/mm/yyyy --:-- --";
18
+ const MASK_24_HOURS = "dd/mm/yyyy --:--";
19
+ export class DateTimePickerEditableComponent {
20
+ get stringFormat() {
21
+ return this.format === 12 ? "dd/MM/yyyy hh:mm a" : "dd/MM/yyyy HH:mm";
22
+ }
23
+ constructor() {
24
+ this._datePipe = inject(DatePipe);
25
+ this._calendar = inject(NgbCalendar);
26
+ this._dateTimePickerEditableService = inject(DateTimePickerEditableService);
27
+ this._cdrf = inject(ChangeDetectorRef);
28
+ /**
29
+ * @description Texto superion
30
+ * @default null
31
+ * @type any
32
+ */
33
+ this.label = "";
34
+ /**
35
+ * @description Parametro de la visualización del texto superior
36
+ * @default true
37
+ * @type boolean
38
+ */
39
+ this.showLabel = true;
40
+ this.readonly = false;
41
+ /**
42
+ * @description Parametro de control requerido
43
+ * @default false
44
+ * @type boolean
45
+ */
46
+ this.required = false;
47
+ this.validatorMessage = false;
48
+ this.tooltipMessage = true;
49
+ this.submitted = true;
50
+ /**
51
+ * @description Parametro de formato de fecha: 12 | 14
52
+ * @default 24
53
+ * @type 12 | 14
54
+ */
55
+ this.format = 24;
56
+ this.labelInfo = false;
57
+ this.textLabelInfo = "";
58
+ this.openWhenFocus = false;
59
+ this.goNextWhenSelect = false;
60
+ /**
61
+ * @description Parametro para mostrar el botón de eliminar
62
+ * @default false
63
+ * @type boolean
64
+ */
65
+ this.clearable = true;
66
+ /**
67
+ * @description Parametro de autocompletado:
68
+ * True: autocompleta con la hora ó minuto actual
69
+ * False: autocompleta con 00:00
70
+ * @default false
71
+ * @type boolean
72
+ */
73
+ this.autoCompleteHours = false;
74
+ this.autoComplete = true;
75
+ this.disabled = false;
76
+ this.onNext = new EventEmitter();
77
+ this.onBack = new EventEmitter();
78
+ this.onChange = (_) => { };
79
+ this.onTouch = () => { };
80
+ this.onValidationChange = () => { };
81
+ this.contador = 0;
82
+ this.position = 0;
83
+ this.dateTimeControl = new FormControl("dd/mm/yyyy --:-- --");
84
+ this.hoursControl = new UntypedFormControl({
85
+ hour: null,
86
+ minute: null,
87
+ });
88
+ this.dateControl = new UntypedFormControl({
89
+ year: null,
90
+ month: null,
91
+ day: null,
92
+ });
93
+ this.today = this._calendar.getToday();
94
+ this.showLabel = this._dateTimePickerEditableService.getShowLabel();
95
+ this.openWhenFocus = this._dateTimePickerEditableService.getOpenWhenFocus();
96
+ this.goNextWhenSelect = this._dateTimePickerEditableService.getGoNextWhenSelect();
97
+ this.validatorMessage = this._dateTimePickerEditableService.getValidatorMessage();
98
+ this.tooltipMessage = this._dateTimePickerEditableService.getTooltipMessage();
99
+ this.submitted = this._dateTimePickerEditableService.getSubmitted();
100
+ this.format = this._dateTimePickerEditableService.getFormat();
101
+ this.clearable = this._dateTimePickerEditableService.getClearable();
102
+ this.autoCompleteHours = this._dateTimePickerEditableService.getAutoCompleteHours();
103
+ this.autoComplete = this._dateTimePickerEditableService.getAutoComplete();
104
+ }
105
+ validate(control) {
106
+ this.controls = control;
107
+ this._cdrf.detectChanges();
108
+ return null;
109
+ }
110
+ registerOnValidatorChange(fn) {
111
+ this.onValidationChange = fn;
112
+ }
113
+ ngOnInit() {
114
+ this.hoursChange();
115
+ const timeout = setTimeout(() => {
116
+ this.dateChange();
117
+ clearTimeout(timeout);
118
+ if (!this.clearable)
119
+ this.btnClean.nativeElement.style.visibility = "hidden";
120
+ }, 100);
121
+ if (this.format == 12) {
122
+ this.dateTimeControl.setValue(MASK_12_HOURS);
123
+ }
124
+ else {
125
+ this.dateTimeControl.setValue(MASK_24_HOURS);
126
+ }
127
+ }
128
+ ngOnChanges(changes) {
129
+ if (changes["submitted"]) {
130
+ if (this.controls !== undefined && changes["submitted"].currentValue) {
131
+ this.controls.markAsDirty();
132
+ this.controls.markAsTouched();
133
+ }
134
+ }
135
+ }
136
+ focus() {
137
+ this.inputDateTime.nativeElement.focus();
138
+ const timeout = setTimeout(() => {
139
+ if (!this.disabled)
140
+ this.inputDateTime.nativeElement.setSelectionRange(0, 2);
141
+ clearTimeout(timeout);
142
+ }, 100);
143
+ if (!this.readonly && this.openWhenFocus) {
144
+ this.ngbDatepicker?.open();
145
+ }
146
+ }
147
+ writeValue(obj) {
148
+ if (obj != null) {
149
+ this.dateControl.setValue(DateTimeModel.fromLocalString(obj));
150
+ this.hoursControl.setValue({
151
+ hour: this.dateControl.value.hour,
152
+ minute: this.dateControl.value.minute,
153
+ second: this.dateControl.value.second,
154
+ });
155
+ this.dateTimeControl.setValue(this._datePipe.transform(obj, this.stringFormat));
156
+ }
157
+ }
158
+ registerOnChange(fn) {
159
+ this.onChange = fn;
160
+ }
161
+ registerOnTouched(fn) {
162
+ this.onTouch = fn;
163
+ }
164
+ setDisabledState(isDisabled) {
165
+ this.disabled = isDisabled;
166
+ if (this.disabled)
167
+ this.dateTimeControl.disable();
168
+ else
169
+ this.dateTimeControl.enable();
170
+ }
171
+ hoursChange() {
172
+ if (this.format == 12)
173
+ this.hoursControl.valueChanges.subscribe((res) => {
174
+ if (/[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9][0-9][0-9] [0-1][0-9]:[0-6][0-9] [A,P]M/.test(this.dateTimeControl.value) ||
175
+ /[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9][0-9][0-9]/.test(this.dateTimeControl.value.substring(0, 10))) {
176
+ this.dateControl.setValue({
177
+ ...this.dateControl.value,
178
+ ...res,
179
+ }, { emitEvent: false });
180
+ try {
181
+ const input = new DateTimeModel(Object.assign(this.dateControl.value, this.hoursControl.value));
182
+ this.dateTimeControl.setValue(this._datePipe.transform(input, this.stringFormat));
183
+ }
184
+ finally {
185
+ this.onEmit();
186
+ }
187
+ }
188
+ });
189
+ else if (this.format == 24)
190
+ this.hoursControl.valueChanges.subscribe((res) => {
191
+ if (/[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9][0-9][0-9] [0-1][0-9]:[0-6][0-9]/.test(this.dateTimeControl.value) ||
192
+ /[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9][0-9][0-9]/.test(this.dateTimeControl.value.substring(0, 10))) {
193
+ this.dateControl.setValue({
194
+ ...this.dateControl.value,
195
+ ...res,
196
+ }, { emitEvent: false });
197
+ try {
198
+ const input = new DateTimeModel(Object.assign(this.dateControl.value, this.hoursControl.value));
199
+ this.dateTimeControl.setValue(this._datePipe.transform(input, this.stringFormat));
200
+ }
201
+ catch (error) {
202
+ /* console.error(error) */
203
+ }
204
+ finally {
205
+ this.onEmit();
206
+ }
207
+ }
208
+ });
209
+ }
210
+ onEmit(emitValue = null) {
211
+ try {
212
+ const value = new DateTimeModel(Object.assign(this.dateControl.value, this.hoursControl.value));
213
+ emitValue = this._datePipe.transform(value.toString(), "yyyy-MM-ddTHH:mm");
214
+ }
215
+ catch (e) { }
216
+ this.onChange(emitValue);
217
+ this.onTouch();
218
+ }
219
+ dateChange() {
220
+ if (this.format == 12)
221
+ this.dateControl.valueChanges.subscribe((res) => {
222
+ if (/[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9][0-9][0-9] [0-1][0-9]:[0-6][0-9] [A,P]M/.test(this.dateTimeControl.value) ||
223
+ /[0-1][0-9]:[0-6][0-9]/.test(this.dateTimeControl.value.substring(11, 16))) {
224
+ this.dateControl.setValue({
225
+ ...this.hoursControl.value,
226
+ ...res,
227
+ }, { emitEvent: false });
228
+ try {
229
+ const input = new DateTimeModel(Object.assign(this.dateControl.value, this.hoursControl.value));
230
+ this.dateTimeControl.setValue(this._datePipe.transform(input, this.stringFormat));
231
+ }
232
+ catch (error) {
233
+ }
234
+ finally {
235
+ this.onEmit();
236
+ }
237
+ }
238
+ });
239
+ else if (this.format == 24)
240
+ this.dateControl.valueChanges.subscribe((res) => {
241
+ if (/[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9][0-9][0-9] [0-1][0-9]:[0-6][0-9] [A,P]M/.test(this.dateTimeControl.value) ||
242
+ /[0-1][0-9]:[0-6][0-9]/.test(this.dateTimeControl.value.substring(11, 16))) {
243
+ this.dateControl.setValue({
244
+ ...this.hoursControl.value,
245
+ ...res,
246
+ }, { emitEvent: false });
247
+ try {
248
+ const input = new DateTimeModel(Object.assign(this.dateControl.value, this.hoursControl.value));
249
+ this.dateTimeControl.setValue(this._datePipe.transform(input, this.stringFormat));
250
+ }
251
+ catch (error) {
252
+ }
253
+ finally {
254
+ this.onEmit();
255
+ }
256
+ }
257
+ });
258
+ }
259
+ onBlur() {
260
+ this.onEmit();
261
+ }
262
+ focusOutInput() {
263
+ const value = this.dateTimeControl.value;
264
+ if ((value != MASK_12_HOURS && this.format == 12) || (value != MASK_24_HOURS && this.format == 24)) {
265
+ const dia = value?.substring(0, 2);
266
+ const mes = value?.substring(3, 5);
267
+ const anio = value?.substring(6, 10);
268
+ const hora = value?.substring(11, 13);
269
+ const minutos = value?.substring(14, 16);
270
+ if (isNaN(Number(dia)) ||
271
+ dia == "00" ||
272
+ isNaN(Number(mes)) ||
273
+ mes == "00" ||
274
+ isNaN(Number(anio)) ||
275
+ anio == "0000" ||
276
+ isNaN(Number(hora)) ||
277
+ isNaN(Number(minutos))) {
278
+ this.dateControl.setValue({
279
+ year: isNaN(Number(anio)) || anio == "0000" ? this.today.year : Number(anio),
280
+ month: isNaN(Number(mes)) || mes == "00" ? this.today.month : Number(mes),
281
+ day: isNaN(Number(dia)) || dia == "00" ? this.today.day : Number(dia),
282
+ }, { emitEvent: false });
283
+ let hour = this.hoursControl.value.hour;
284
+ if (isNaN(Number(hora)))
285
+ hour = this.autoCompleteHours ? DateUtil.getHours(DateUtil.now()) : 0;
286
+ let minute = this.hoursControl.value.minute;
287
+ if (isNaN(Number(minutos)))
288
+ minute = this.autoCompleteHours ? DateUtil.getMinutes(DateUtil.now()) : 0;
289
+ this.hoursControl.setValue({
290
+ hour,
291
+ minute,
292
+ }, { emitEvent: false });
293
+ const input = new DateTimeModel(Object.assign(this.dateControl.value, this.hoursControl.value));
294
+ try {
295
+ this.dateTimeControl.setValue(this._datePipe.transform(input, this.stringFormat));
296
+ }
297
+ finally {
298
+ this.onEmit();
299
+ }
300
+ }
301
+ }
302
+ this.contador = 0;
303
+ }
304
+ onKeyUp(e) {
305
+ const input = e.target;
306
+ if (this.disabled)
307
+ return;
308
+ if (!isNaN(Number(e.key)) && e.key.trim() != "") {
309
+ //============================= DIA ==================================
310
+ if (input.selectionStart == 0 && input.selectionEnd == 2) {
311
+ const valorActual = this.dateTimeControl.value;
312
+ const diaActual = valorActual.substring(0, 2);
313
+ if (diaActual == "dd") {
314
+ const nuevoValor = `${e.key.padStart(2, 0)}${valorActual.substring(2)}`;
315
+ this.dateTimeControl.setValue(nuevoValor);
316
+ this.dateControl.setValue({
317
+ ...this.dateControl.value,
318
+ day: Number(this.dateTimeControl.value.substring(0, 2)),
319
+ });
320
+ this.contador++;
321
+ if (e.key > 3) {
322
+ this.contador = 0;
323
+ input.setSelectionRange(3, 5);
324
+ this.onEmit();
325
+ return;
326
+ }
327
+ else
328
+ this.onEmit();
329
+ }
330
+ else if (Number(diaActual) <= 3 && Number(diaActual) > 0 && this.contador > 0) {
331
+ const nuevoValor = `${Number(Number(diaActual).toString() + Number(e.key)) > 31 ? 31 : Number(diaActual).toString() + Number(e.key)}${valorActual.substring(2)}`;
332
+ this.dateTimeControl.setValue(nuevoValor);
333
+ this.dateControl.setValue({
334
+ ...this.dateControl.value,
335
+ day: Number(this.dateTimeControl.value.substring(0, 2)),
336
+ });
337
+ this.contador++;
338
+ this.onEmit();
339
+ input.setSelectionRange(3, 5);
340
+ this.contador = 0;
341
+ return;
342
+ }
343
+ else {
344
+ const nuevoValor = `${e.key.padStart(2, 0)}${valorActual.substring(2)}`;
345
+ this.dateTimeControl.setValue(nuevoValor);
346
+ this.dateControl.setValue({
347
+ ...this.dateControl.value,
348
+ day: Number(this.dateTimeControl.value.substring(0, 2)),
349
+ });
350
+ this.contador++;
351
+ if (Number(e.key.padStart(2, 0)) > 3 || this.contador > 1) {
352
+ this.contador = 0;
353
+ input.setSelectionRange(3, 5);
354
+ this.onEmit();
355
+ return;
356
+ }
357
+ else
358
+ this.onEmit();
359
+ }
360
+ this.onEmit();
361
+ input.setSelectionRange(0, 2);
362
+ }
363
+ //============================= MES ==================================
364
+ else if (input.selectionStart == 3 && input.selectionEnd == 5) {
365
+ const valorActual = this.dateTimeControl.value;
366
+ const mesActual = valorActual.substring(3, 5);
367
+ if (mesActual == "mm") {
368
+ const nuevoValor = `${valorActual.substring(0, 3)}${e.key.padStart(2, 0)}${valorActual.substring(5)}`;
369
+ this.dateTimeControl.setValue(nuevoValor);
370
+ this.dateControl.setValue({
371
+ ...this.dateControl.value,
372
+ month: Number(this.dateTimeControl.value.substring(3, 5)),
373
+ });
374
+ this.contador++;
375
+ if (e.key > 1) {
376
+ this.onEmit();
377
+ input.setSelectionRange(6, 10);
378
+ this.contador = 0;
379
+ return;
380
+ }
381
+ else
382
+ this.onEmit();
383
+ }
384
+ else if (Number(mesActual) <= 1 && Number(mesActual) > 0 && this.contador > 0) {
385
+ const nuevoValor = `${valorActual.substring(0, 3)}${Number(Number(mesActual).toString() + Number(e.key)) > 12 ? 12 : Number(mesActual).toString() + Number(e.key)}${valorActual.substring(5)}`;
386
+ this.dateTimeControl.setValue(nuevoValor);
387
+ this.dateControl.setValue({
388
+ ...this.dateControl.value,
389
+ month: Number(this.dateTimeControl.value.substring(3, 5)),
390
+ });
391
+ this.contador++;
392
+ this.onEmit();
393
+ input.setSelectionRange(6, 10);
394
+ this.contador = 0;
395
+ return;
396
+ }
397
+ else {
398
+ const nuevoValor = `${valorActual.substring(0, 3)}${e.key.padStart(2, 0)}${valorActual.substring(5)}`;
399
+ this.dateTimeControl.setValue(nuevoValor);
400
+ this.dateControl.setValue({
401
+ ...this.dateControl.value,
402
+ month: Number(this.dateTimeControl.value.substring(3, 5)),
403
+ });
404
+ this.contador++;
405
+ if (Number(e.key.padStart(2, 0)) > 1 || this.contador > 1) {
406
+ this.onEmit();
407
+ input.setSelectionRange(6, 10);
408
+ this.contador = 0;
409
+ return;
410
+ }
411
+ else
412
+ this.onEmit();
413
+ }
414
+ this.onEmit();
415
+ input.setSelectionRange(3, 5);
416
+ }
417
+ //============================= AÑO ==================================
418
+ else if (input.selectionStart == 6 && input.selectionEnd == 10) {
419
+ const valorActual = this.dateTimeControl.value;
420
+ const anioActual = valorActual.substring(6, 10);
421
+ if (anioActual == "yyyy") {
422
+ const nuevoValor = `${valorActual.substring(0, 6)}${e.key.padStart(4, 0)}${valorActual.substring(10)}`;
423
+ this.dateTimeControl.setValue(nuevoValor);
424
+ this.dateControl.setValue({
425
+ ...this.dateControl.value,
426
+ year: Number(this.dateTimeControl.value.substring(6, 10)),
427
+ });
428
+ this.contador++;
429
+ if (e.key > 2) {
430
+ const nuevoValor = `${valorActual.substring(0, 6)}${DateUtil.getYear(DateUtil.now())}${valorActual.substring(10)}`;
431
+ this.dateTimeControl.setValue(nuevoValor);
432
+ this.dateControl.setValue({
433
+ ...this.dateControl.value,
434
+ year: Number(this.dateTimeControl.value.substring(6, 10)),
435
+ });
436
+ this.onEmit();
437
+ input.setSelectionRange(11, 13);
438
+ this.contador = 0;
439
+ return;
440
+ }
441
+ else
442
+ this.onEmit();
443
+ }
444
+ else if (Number(anioActual) <= 2999 && Number(anioActual) > 0) {
445
+ let nuevoValor;
446
+ this.contador++;
447
+ if (Number(anioActual) >= 1000) {
448
+ nuevoValor = `${valorActual.substring(0, 6)}${Number(e.key).toString().padStart(4, "0")}${valorActual.substring(10)}`;
449
+ }
450
+ else {
451
+ nuevoValor = `${valorActual.substring(0, 6)}${(Number(anioActual).toString() + Number(e.key)).padStart(4, "0")}${valorActual.substring(10)}`;
452
+ this.dateTimeControl.setValue(nuevoValor);
453
+ this.dateControl.setValue({
454
+ ...this.dateControl.value,
455
+ year: Number(this.dateTimeControl.value.substring(6, 10)),
456
+ });
457
+ if (Number(Number(anioActual).toString() + Number(e.key)) > 1000 &&
458
+ Number(Number(anioActual).toString() + Number(e.key)) < 3000) {
459
+ this.onEmit();
460
+ input.setSelectionRange(11, 13);
461
+ this.contador = 0;
462
+ return;
463
+ }
464
+ else if (Number(Number(anioActual).toString() + Number(e.key)) > 2999) {
465
+ nuevoValor = `${valorActual.substring(0, 6)}${DateUtil.getYear(DateUtil.now())}${valorActual.substring(10)}`;
466
+ this.dateTimeControl.setValue(nuevoValor);
467
+ this.dateControl.setValue({
468
+ ...this.dateControl.value,
469
+ year: Number(this.dateTimeControl.value.substring(6, 10)),
470
+ });
471
+ this.onEmit();
472
+ input.setSelectionRange(11, 13);
473
+ this.contador = 0;
474
+ return;
475
+ }
476
+ }
477
+ this.dateTimeControl.setValue(nuevoValor);
478
+ this.dateControl.setValue({
479
+ ...this.dateControl.value,
480
+ year: Number(this.dateTimeControl.value.substring(6, 10)),
481
+ });
482
+ }
483
+ else {
484
+ const nuevoValor = `${valorActual.substring(0, 6)}${e.key.padStart(4, 0)}${valorActual.substring(10)}`;
485
+ this.dateTimeControl.setValue(nuevoValor);
486
+ this.dateControl.setValue({
487
+ ...this.dateControl.value,
488
+ year: Number(this.dateTimeControl.value.substring(6, 10)),
489
+ });
490
+ }
491
+ this.contador++;
492
+ this.onEmit();
493
+ input.setSelectionRange(6, 10);
494
+ }
495
+ //============================= HORA =================================
496
+ else if (input.selectionStart == 11 && input.selectionEnd == 13) {
497
+ const valorActual = this.dateTimeControl.value;
498
+ const horaActual = valorActual.substring(11, 13);
499
+ if (horaActual == "--") {
500
+ const nuevoValor = `${valorActual.substring(0, 11)}${e.key.padStart(2, 0)}${valorActual.substring(13)}`;
501
+ this.dateTimeControl.setValue(nuevoValor);
502
+ //=========== FORMATO 12 HORAS===========
503
+ if (this.format == 12)
504
+ this.hoursControl.setValue({
505
+ ...this.hoursControl.value,
506
+ hour: /[0-1][0-9]:[0-6][0-9] [A,P]M/.test(this.dateTimeControl.value.substring(11))
507
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "HH"))
508
+ : Number(this.dateTimeControl.value.substring(11, 13)),
509
+ minute: this.dateTimeControl.value.substring(14, 16) == "--" ? 0 : this.hoursControl.value.minute,
510
+ });
511
+ //=========== FORMATO 24 HORAS===========
512
+ else
513
+ this.hoursControl.setValue({
514
+ ...this.hoursControl.value,
515
+ hour: /[0-1][0-9]:[0-6][0-9]/.test(this.dateTimeControl.value.substring(11))
516
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "HH"))
517
+ : Number(this.dateTimeControl.value.substring(11, 13)),
518
+ minute: this.dateTimeControl.value.substring(14, 16) == "00" ? 0 : this.hoursControl.value.minute,
519
+ });
520
+ this.contador++;
521
+ if (e.key > 1 && this.format == 12) {
522
+ this.onEmit();
523
+ input.setSelectionRange(14, 16);
524
+ this.contador = 0;
525
+ return;
526
+ }
527
+ else if (e.key > 2 && this.format == 24) {
528
+ this.onEmit();
529
+ input.setSelectionRange(14, 16);
530
+ this.contador = 0;
531
+ return;
532
+ }
533
+ else
534
+ this.onEmit();
535
+ }
536
+ else if (Number(horaActual) <= 1 && Number(horaActual) > 0 && this.contador > 0 && this.format == 12) {
537
+ const nuevoValor = `${valorActual.substring(0, 11)}${Number(Number(horaActual).toString() + Number(e.key)) > 12 ? 12 : Number(horaActual).toString() + Number(e.key)}${valorActual.substring(13)}`;
538
+ this.dateTimeControl.setValue(nuevoValor);
539
+ this.hoursControl.setValue({
540
+ ...this.hoursControl.value,
541
+ hour: /[0-1][0-9]:[0-6][0-9] [A,P]M/.test(this.dateTimeControl.value.substring(11))
542
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "HH"))
543
+ : Number(this.dateTimeControl.value.substring(11, 13)),
544
+ minute: this.dateTimeControl.value.substring(14, 16) == "00" ? 0 : this.hoursControl.value.minute,
545
+ });
546
+ this.contador++;
547
+ this.onEmit();
548
+ input.setSelectionRange(14, 16);
549
+ this.contador = 0;
550
+ return;
551
+ }
552
+ else if (Number(horaActual) <= 2 && Number(horaActual) > 0 && this.contador > 0 && this.format == 24) {
553
+ const nuevoValor = `${valorActual.substring(0, 11)}${Number(Number(horaActual).toString() + Number(e.key)) > 24 ? 24 : Number(horaActual).toString() + Number(e.key)}${valorActual.substring(13)}`;
554
+ this.dateTimeControl.setValue(nuevoValor);
555
+ let hour;
556
+ try {
557
+ hour = /[0-1][0-9]:[0-6][0-9]/.test(this.dateTimeControl.value.substring(11))
558
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "HH"))
559
+ : Number(this.dateTimeControl.value.substring(11, 13));
560
+ }
561
+ catch (error) {
562
+ hour = Number(this.dateTimeControl.value.substring(11, 13));
563
+ }
564
+ this.hoursControl.setValue({
565
+ ...this.hoursControl.value,
566
+ hour,
567
+ minute: this.dateTimeControl.value.substring(14, 16) == "00" ? 0 : this.hoursControl.value.minute,
568
+ });
569
+ this.contador++;
570
+ this.onEmit();
571
+ input.setSelectionRange(14, 16);
572
+ this.contador = 0;
573
+ return;
574
+ }
575
+ else {
576
+ const nuevoValor = `${valorActual.substring(0, 11)}${e.key.padStart(2, 0)}${valorActual.substring(13)}`;
577
+ this.dateTimeControl.setValue(nuevoValor);
578
+ const regex = this.format == 12 ? /[0-1][0-9]:[0-6][0-9] [A,P]M/ : /[0-1][0-9]:[0-6][0-9]/;
579
+ this.hoursControl.setValue({
580
+ ...this.hoursControl.value,
581
+ hour: regex.test(this.dateTimeControl.value.substring(11))
582
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "HH"))
583
+ : Number(this.dateTimeControl.value.substring(11, 13)),
584
+ minute: this.dateTimeControl.value.substring(14, 16) == "00" || this.dateTimeControl.value.substring(14, 16) == "--"
585
+ ? 0
586
+ : this.hoursControl.value.minute,
587
+ });
588
+ this.contador++;
589
+ if ((Number(e.key.padStart(2, 0)) > 1 || this.contador > 1) && this.format == 12) {
590
+ this.onEmit();
591
+ input.setSelectionRange(14, 16);
592
+ this.contador = 0;
593
+ return;
594
+ }
595
+ else if ((Number(e.key.padStart(2, 0)) > 2 || this.contador > 1) && this.format == 24) {
596
+ this.onEmit();
597
+ input.setSelectionRange(14, 16);
598
+ this.contador = 0;
599
+ return;
600
+ }
601
+ else
602
+ this.onEmit();
603
+ }
604
+ this.onEmit();
605
+ input.setSelectionRange(11, 13);
606
+ }
607
+ //============================ MINUTOS ===============================
608
+ else if (input.selectionStart == 14 && input.selectionEnd == 16) {
609
+ const valorActual = this.dateTimeControl.value;
610
+ const minutosActuales = valorActual.substring(14, 16);
611
+ if (minutosActuales == "--") {
612
+ const nuevoValor = `${valorActual.substring(0, 14)}${e.key.padStart(2, 0)}${valorActual.substring(16)}`;
613
+ this.dateTimeControl.setValue(nuevoValor);
614
+ this.hoursControl.setValue({
615
+ ...this.hoursControl.value,
616
+ minute: /[0-1][0-9]:[0-6][0-9] [A,P]M/.test(this.dateTimeControl.value.substring(11))
617
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "mm"))
618
+ : Number(this.dateTimeControl.value.substring(14, 16)),
619
+ });
620
+ this.contador++;
621
+ if (e.key > 5) {
622
+ this.onEmit();
623
+ if (this.format == 12)
624
+ input.setSelectionRange(17, 19);
625
+ else
626
+ input.setSelectionRange(14, 16);
627
+ this.contador = 0;
628
+ return;
629
+ }
630
+ else
631
+ this.onEmit();
632
+ }
633
+ else if (Number(minutosActuales) <= 5 && Number(minutosActuales) > 0 && this.contador > 0) {
634
+ const nuevoValor = `${valorActual.substring(0, 14)}${Number(Number(minutosActuales).toString() + Number(e.key)) > 59 ? 59 : Number(minutosActuales).toString() + Number(e.key)}${valorActual.substring(16)}`;
635
+ this.dateTimeControl.setValue(nuevoValor);
636
+ let minute;
637
+ const regex = this.format == 12 ? /[0-1][0-9]:[0-6][0-9] [A,P]M/ : /[0-1][0-9]:[0-6][0-9]/;
638
+ try {
639
+ minute = regex.test(this.dateTimeControl.value.substring(11))
640
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "mm"))
641
+ : Number(this.dateTimeControl.value.substring(14, 16));
642
+ }
643
+ catch (error) {
644
+ minute = Number(this.dateTimeControl.value.substring(14, 16));
645
+ }
646
+ this.hoursControl.setValue({
647
+ ...this.hoursControl.value,
648
+ minute,
649
+ });
650
+ this.contador++;
651
+ this.onEmit();
652
+ if (this.format == 12)
653
+ input.setSelectionRange(17, 19);
654
+ else
655
+ input.setSelectionRange(14, 16);
656
+ this.contador = 0;
657
+ return;
658
+ }
659
+ else {
660
+ const nuevoValor = `${valorActual.substring(0, 14)}${e.key.padStart(2, 0)}${valorActual.substring(16)}`;
661
+ this.dateTimeControl.setValue(nuevoValor);
662
+ this.hoursControl.setValue({
663
+ ...this.hoursControl.value,
664
+ minute: /[0-1][0-9]:[0-6][0-9] [A,P]M/.test(this.dateTimeControl.value.substring(11))
665
+ ? Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "mm"))
666
+ : Number(this.dateTimeControl.value.substring(14, 16)),
667
+ });
668
+ this.contador++;
669
+ if (Number(e.key.padStart(2, 0)) > 5 || this.contador > 1) {
670
+ this.onEmit();
671
+ if (this.format == 12)
672
+ input.setSelectionRange(17, 19);
673
+ else
674
+ input.setSelectionRange(14, 16);
675
+ this.contador = 0;
676
+ return;
677
+ }
678
+ else
679
+ this.onEmit();
680
+ }
681
+ this.onEmit();
682
+ input.setSelectionRange(14, 16);
683
+ }
684
+ }
685
+ else {
686
+ //======================== EVENTOS TECLADO ===========================
687
+ if (e.key == "ArrowRight") {
688
+ if (input.selectionStart == 0 && input.selectionEnd == 2) {
689
+ input.setSelectionRange(3, 5);
690
+ this.contador = 0;
691
+ }
692
+ else if (input.selectionStart == 3 && input.selectionEnd == 5) {
693
+ input.setSelectionRange(6, 10);
694
+ this.contador = 0;
695
+ }
696
+ else if (input.selectionStart == 6 && input.selectionEnd == 10) {
697
+ input.setSelectionRange(11, 13);
698
+ this.contador = 0;
699
+ }
700
+ else if (input.selectionStart == 11 && input.selectionEnd == 13) {
701
+ input.setSelectionRange(14, 16);
702
+ this.contador = 0;
703
+ }
704
+ else if (input.selectionStart == 14 && input.selectionEnd == 16) {
705
+ if (this.format == 12)
706
+ input.setSelectionRange(17, 19);
707
+ else if (this.format == 24)
708
+ this.btnOpen?.nativeElement.focus();
709
+ this.contador = 0;
710
+ }
711
+ else if (input.selectionStart == 17 && input.selectionEnd == 19) {
712
+ this.btnOpen?.nativeElement.focus();
713
+ this.contador = 0;
714
+ }
715
+ }
716
+ else if (e.key == "ArrowLeft") {
717
+ if (input.selectionStart == 0 && input.selectionEnd == 2) {
718
+ this.goBack();
719
+ this.contador = 0;
720
+ }
721
+ else if (input.selectionStart == 3 && input.selectionEnd == 5) {
722
+ input.setSelectionRange(0, 2);
723
+ this.contador = 0;
724
+ }
725
+ else if (input.selectionStart == 6 && input.selectionEnd == 10) {
726
+ input.setSelectionRange(3, 5);
727
+ this.contador = 0;
728
+ }
729
+ else if (input.selectionStart == 11 && input.selectionEnd == 13) {
730
+ input.setSelectionRange(6, 10);
731
+ this.contador = 0;
732
+ }
733
+ else if (input.selectionStart == 14 && input.selectionEnd == 16) {
734
+ input.setSelectionRange(11, 13);
735
+ this.contador = 0;
736
+ }
737
+ else if (input.selectionStart == 17 && input.selectionEnd == 19) {
738
+ input.setSelectionRange(14, 16);
739
+ this.contador = 0;
740
+ }
741
+ }
742
+ else if (e.key.toLowerCase() == "a") {
743
+ if (input.selectionStart == 17 && input.selectionEnd == 19) {
744
+ const valorActual = this.dateTimeControl.value;
745
+ const nuevoValor = `${valorActual.substring(0, 17)}AM`;
746
+ this.dateTimeControl.setValue(nuevoValor);
747
+ this.hoursControl.setValue({
748
+ ...this.hoursControl.value,
749
+ hour: Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "HH")),
750
+ });
751
+ this.onEmit();
752
+ input.setSelectionRange(17, 19);
753
+ }
754
+ }
755
+ else if (e.key.toLowerCase() == "p") {
756
+ if (input.selectionStart == 17 && input.selectionEnd == 19) {
757
+ const valorActual = this.dateTimeControl.value;
758
+ const nuevoValor = `${valorActual.substring(0, 17)}PM`;
759
+ this.dateTimeControl.setValue(nuevoValor);
760
+ this.hoursControl.setValue({
761
+ ...this.hoursControl.value,
762
+ hour: Number(this._datePipe.transform(`01/01/2020 ${this.dateTimeControl.value.substring(11)}`, "HH")),
763
+ });
764
+ this.onEmit();
765
+ input.setSelectionRange(17, 19);
766
+ }
767
+ }
768
+ else if (e.code == "Space" && this.autoComplete) {
769
+ const valorActual = this.dateTimeControl.value;
770
+ const diaActual = this.today.day.toString();
771
+ const mesActual = this.today.month.toString();
772
+ const anioActual = this.today.year.toString();
773
+ const horaActual = DateUtil.toStrFormat(DateUtil.now(), this.format == 24 ? "MASK_24_HOURS" : "MASK_12_HOURS");
774
+ const t = DateUtil.toStrFormat(DateUtil.now(), "MIDDAY_INDICATOR");
775
+ const minutosActuales = DateUtil.getMinutes(DateUtil.now()).toString().padStart(2, "0");
776
+ if (input.selectionStart == 0 && input.selectionEnd == 2) {
777
+ const nuevoValor = `${diaActual.padStart(2, "0")}${valorActual.substring(2)}`;
778
+ this.dateTimeControl.setValue(nuevoValor);
779
+ this.dateControl.setValue({
780
+ ...this.dateControl.value,
781
+ day: this.today.day,
782
+ }, { emitEvent: false });
783
+ input.setSelectionRange(3, 5);
784
+ }
785
+ else if (input.selectionStart == 3 && input.selectionEnd == 5) {
786
+ const nuevoValor = `${valorActual.substring(0, 3)}${mesActual.padStart(2, "0")}${valorActual.substring(5)}`;
787
+ this.dateTimeControl.setValue(nuevoValor);
788
+ this.dateControl.setValue({
789
+ ...this.dateControl.value,
790
+ month: this.today.month,
791
+ }, { emitEvent: false });
792
+ input.setSelectionRange(6, 10);
793
+ }
794
+ else if (input.selectionStart == 6 && input.selectionEnd == 10) {
795
+ const nuevoValor = `${valorActual.substring(0, 6)}${anioActual.padStart(4, "0")}${valorActual.substring(10)}`;
796
+ this.dateTimeControl.setValue(nuevoValor);
797
+ this.dateControl.setValue({
798
+ ...this.dateControl.value,
799
+ year: this.today.year,
800
+ }, { emitEvent: false });
801
+ input.setSelectionRange(11, 13);
802
+ }
803
+ else if (input.selectionStart == 11 && input.selectionEnd == 13) {
804
+ let nuevoValor;
805
+ if (this.format == 24)
806
+ nuevoValor = `${valorActual.substring(0, 11)}${horaActual}${valorActual.substring(13)}`;
807
+ else if (this.format == 12)
808
+ nuevoValor = `${valorActual.substring(0, 11)}${horaActual}${valorActual.substring(13, 17)}${t.toUpperCase()}`;
809
+ this.dateTimeControl.setValue(nuevoValor);
810
+ this.hoursControl.setValue({
811
+ ...this.hoursControl.value,
812
+ minute: this.hoursControl.value.minute != null ? this.hoursControl.value.minute : 0,
813
+ hour: this.format == 12 ? Number(horaActual) : Number(horaActual) + 12,
814
+ });
815
+ input.setSelectionRange(14, 16);
816
+ }
817
+ else if (input.selectionStart == 14 && input.selectionEnd == 16) {
818
+ const nuevoValor = `${valorActual.substring(0, 14)}${minutosActuales.padStart(2, "0")}${valorActual.substring(16)}`;
819
+ this.dateTimeControl.setValue(nuevoValor);
820
+ this.hoursControl.setValue({
821
+ ...this.hoursControl.value,
822
+ minute: Number(minutosActuales),
823
+ });
824
+ if (this.format == 12)
825
+ input.setSelectionRange(17, 19);
826
+ else
827
+ input.setSelectionRange(14, 16);
828
+ }
829
+ this.onEmit();
830
+ }
831
+ else if (e.key == "Enter" || e.key == "ArrowDown") {
832
+ this.goNext();
833
+ }
834
+ else if (e.key == "ArrowUp") {
835
+ this.goBack();
836
+ }
837
+ else if (e.key == "Delete") {
838
+ this.limpiarTodo();
839
+ }
840
+ else if (e.key == "Backspace") {
841
+ this.limpiar();
842
+ }
843
+ }
844
+ }
845
+ goNext() {
846
+ if (this.next != undefined) {
847
+ if (this.next.disabled || this.next.readonly) {
848
+ if (this.nextIsDisable != undefined) {
849
+ this.nextIsDisable.focus();
850
+ }
851
+ }
852
+ else {
853
+ this.next.focus();
854
+ }
855
+ }
856
+ else {
857
+ if (this.nextIsDisable != undefined) {
858
+ this.nextIsDisable.focus();
859
+ }
860
+ else {
861
+ this.onNext.emit();
862
+ }
863
+ }
864
+ }
865
+ goBack() {
866
+ if (this.back != undefined) {
867
+ if (this.back.disabled || this.back.readonly) {
868
+ if (this.backIsDisable != undefined) {
869
+ this.backIsDisable.focus();
870
+ }
871
+ }
872
+ else {
873
+ this.back.focus();
874
+ }
875
+ }
876
+ else {
877
+ if (this.backIsDisable != undefined) {
878
+ this.backIsDisable.focus();
879
+ }
880
+ else {
881
+ this.onBack.emit();
882
+ }
883
+ }
884
+ }
885
+ limpiarTodo() {
886
+ this.contador = 0;
887
+ this.hoursControl.setValue({
888
+ hour: null,
889
+ minute: null,
890
+ }, { emitEvent: false });
891
+ this.dateControl.setValue({
892
+ year: null,
893
+ month: null,
894
+ day: null,
895
+ }, { emitEvent: false });
896
+ if (this.format == 12)
897
+ this.dateTimeControl.setValue("dd/mm/yyyy --:-- --");
898
+ else if (this.format == 24)
899
+ this.dateTimeControl.setValue("dd/mm/yyyy --:--");
900
+ this.inputDateTime.nativeElement.setSelectionRange(0, 2);
901
+ this.onChange(null);
902
+ this.onTouch();
903
+ }
904
+ limpiar() {
905
+ if (this.inputDateTime.nativeElement.selectionStart == 0 && this.inputDateTime.nativeElement.selectionEnd == 2) {
906
+ this.dateControl.setValue({
907
+ ...this.dateControl.value,
908
+ day: null,
909
+ }, { emitEvent: false });
910
+ this.dateTimeControl.setValue(`dd${this.dateTimeControl.value.substring(2)}`);
911
+ this.onChange(null);
912
+ this.onTouch();
913
+ this.inputDateTime.nativeElement.setSelectionRange(0, 2);
914
+ this.contador = 0;
915
+ }
916
+ else if (this.inputDateTime.nativeElement.selectionStart == 3 && this.inputDateTime.nativeElement.selectionEnd == 5) {
917
+ this.dateControl.setValue({
918
+ ...this.dateControl.value,
919
+ month: null,
920
+ }, { emitEvent: false });
921
+ this.dateTimeControl.setValue(`${this.dateTimeControl.value.substring(0, 3)}mm${this.dateTimeControl.value.substring(5)}`);
922
+ this.onChange(null);
923
+ this.onTouch();
924
+ this.inputDateTime.nativeElement.setSelectionRange(3, 5);
925
+ this.contador = 0;
926
+ }
927
+ else if (this.inputDateTime.nativeElement.selectionStart == 6 && this.inputDateTime.nativeElement.selectionEnd == 10) {
928
+ this.dateControl.setValue({
929
+ ...this.dateControl.value,
930
+ year: null,
931
+ }, { emitEvent: false });
932
+ this.dateTimeControl.setValue(`${this.dateTimeControl.value.substring(0, 6)}yyyy${this.dateTimeControl.value.substring(10)}`);
933
+ this.onChange(null);
934
+ this.onTouch();
935
+ this.inputDateTime.nativeElement.setSelectionRange(6, 10);
936
+ this.contador = 0;
937
+ }
938
+ else if (this.inputDateTime.nativeElement.selectionStart == 11 && this.inputDateTime.nativeElement.selectionEnd == 13) {
939
+ this.hoursControl.setValue({
940
+ ...this.dateControl.value,
941
+ hour: null,
942
+ }, { emitEvent: false });
943
+ this.dateTimeControl.setValue(`${this.dateTimeControl.value.substring(0, 11)}--${this.dateTimeControl.value.substring(13)}`);
944
+ this.onChange(null);
945
+ this.onTouch();
946
+ this.inputDateTime.nativeElement.setSelectionRange(11, 13);
947
+ this.contador = 0;
948
+ }
949
+ else if (this.inputDateTime.nativeElement.selectionStart == 14 && this.inputDateTime.nativeElement.selectionEnd == 16) {
950
+ this.hoursControl.setValue({
951
+ ...this.dateControl.value,
952
+ minute: null,
953
+ }, { emitEvent: false });
954
+ this.dateTimeControl.setValue(`${this.dateTimeControl.value.substring(0, 14)}--${this.dateTimeControl.value.substring(16)}`);
955
+ this.onChange(null);
956
+ this.onTouch();
957
+ this.inputDateTime.nativeElement.setSelectionRange(14, 16);
958
+ this.contador = 0;
959
+ }
960
+ }
961
+ preventDefault(e) {
962
+ e.preventDefault();
963
+ return false;
964
+ }
965
+ onClick(e, input) {
966
+ e.preventDefault();
967
+ if (this.disabled)
968
+ return;
969
+ if (input.selectionStart == 0 || input.selectionStart == 1 || input.selectionStart == 2) {
970
+ const timeout = setTimeout(() => {
971
+ input.setSelectionRange(0, 2);
972
+ this.contador = 0;
973
+ clearTimeout(timeout);
974
+ }, 100);
975
+ }
976
+ else if (input.selectionStart == 3 || input.selectionStart == 4 || input.selectionStart == 5) {
977
+ const timeout = setTimeout(() => {
978
+ input.setSelectionRange(3, 5);
979
+ this.contador = 0;
980
+ clearTimeout(timeout);
981
+ }, 100);
982
+ }
983
+ else if (input.selectionStart == 6 ||
984
+ input.selectionStart == 7 ||
985
+ input.selectionStart == 8 ||
986
+ input.selectionStart == 9 ||
987
+ input.selectionStart == 10) {
988
+ const timeout = setTimeout(() => {
989
+ input.setSelectionRange(6, 10);
990
+ this.contador = 0;
991
+ clearTimeout(timeout);
992
+ }, 100);
993
+ }
994
+ else if (input.selectionStart == 11 || input.selectionStart == 12 || input.selectionStart == 13) {
995
+ const timeout = setTimeout(() => {
996
+ input.setSelectionRange(11, 13);
997
+ this.contador = 0;
998
+ clearTimeout(timeout);
999
+ }, 100);
1000
+ }
1001
+ else if (input.selectionStart == 14 || input.selectionStart == 15 || input.selectionStart == 16) {
1002
+ const timeout = setTimeout(() => {
1003
+ input.setSelectionRange(14, 16);
1004
+ this.contador = 0;
1005
+ clearTimeout(timeout);
1006
+ }, 100);
1007
+ }
1008
+ else if (input.selectionStart == 17 || input.selectionStart == 18 || input.selectionStart == 19) {
1009
+ const timeout = setTimeout(() => {
1010
+ input.setSelectionRange(17, 19);
1011
+ this.contador = 0;
1012
+ clearTimeout(timeout);
1013
+ }, 100);
1014
+ }
1015
+ else {
1016
+ const timeout = setTimeout(() => {
1017
+ input.setSelectionRange(0, 2);
1018
+ this.contador = 0;
1019
+ clearTimeout(timeout);
1020
+ }, 100);
1021
+ }
1022
+ }
1023
+ open(d) {
1024
+ if (this.dateTimeControl.value == "dd/mm/yyyy --:-- --" || this.dateTimeControl.value == "dd/mm/yyyy --:--") {
1025
+ this.hoursControl.setValue({
1026
+ hour: new Date().getHours(),
1027
+ minute: new Date().getMinutes(),
1028
+ second: new Date().getSeconds(),
1029
+ });
1030
+ this.dateControl.setValue({
1031
+ year: new Date().getFullYear(),
1032
+ month: new Date().getMonth() + 1,
1033
+ day: new Date().getDate(),
1034
+ ...this.hoursControl.value,
1035
+ });
1036
+ const value = new DateTimeModel(Object.assign(this.dateControl.value, this.hoursControl.value));
1037
+ this.dateTimeControl.setValue(this._datePipe.transform(value.toString(), this.stringFormat));
1038
+ this.onEmit();
1039
+ }
1040
+ }
1041
+ focusOut(event) {
1042
+ if (event.target.ariaLabel == "Minutes") {
1043
+ this.ngbDatepicker?.close();
1044
+ if (this.goNextWhenSelect) {
1045
+ this.goNext();
1046
+ }
1047
+ }
1048
+ }
1049
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: DateTimePickerEditableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1050
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: DateTimePickerEditableComponent, selector: "date-time-picker-editable", inputs: { label: "label", showLabel: "showLabel", readonly: "readonly", required: "required", validatorMessage: "validatorMessage", tooltipMessage: "tooltipMessage", submitted: "submitted", format: "format", next: "next", nextIsDisable: "nextIsDisable", labelInfo: "labelInfo", textLabelInfo: "textLabelInfo", back: "back", backIsDisable: "backIsDisable", openWhenFocus: "openWhenFocus", goNextWhenSelect: "goNextWhenSelect", clearable: "clearable", autoCompleteHours: "autoCompleteHours", autoComplete: "autoComplete", disabled: "disabled" }, outputs: { onNext: "onNext", onBack: "onBack" }, providers: [
1051
+ {
1052
+ provide: NG_VALUE_ACCESSOR,
1053
+ multi: true,
1054
+ useExisting: DateTimePickerEditableComponent,
1055
+ },
1056
+ {
1057
+ provide: NG_VALIDATORS,
1058
+ useExisting: forwardRef(() => DateTimePickerEditableComponent),
1059
+ multi: true,
1060
+ },
1061
+ I18n,
1062
+ { provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n },
1063
+ { provide: NgbDateParserFormatter, useClass: CustomDatepickerFormat },
1064
+ ], viewQueries: [{ propertyName: "inputDateTime", first: true, predicate: ["inputDateTime"], descendants: true }, { propertyName: "btnOpen", first: true, predicate: ["btnOpen"], descendants: true }, { propertyName: "btnClean", first: true, predicate: ["btnClean"], descendants: true }, { propertyName: "ngbDatepicker", first: true, predicate: ["d2"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"row\">\r\n <div class=\"col-12\" style=\"overflow: hidden\">\r\n <label *ngIf=\"label != null && label != '' && showLabel\" class=\"d-flex sumax-label mb-0 p-0\"\r\n ><span [title]=\"label\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis\">{{ label }}</span>\r\n <span *ngIf=\"required\" class=\"ms-1\" [class.text-danger]=\"controls?.errors != null\"> *</span>\r\n <span *ngIf=\"labelInfo\">\r\n <i class=\"fa fa-exclamation-circle text-info ms-2\" [matTooltip]=\"textLabelInfo\" matTooltipClass=\"bg-info\"></i>\r\n </span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm position-absolute\"\r\n container=\"body\"\r\n id=\"fakeInput\"\r\n ngbDatepicker\r\n [formControl]=\"dateControl\"\r\n [autoClose]=\"'outside'\"\r\n [footerTemplate]=\"footerTemplate\"\r\n #d2=\"ngbDatepicker\" />\r\n <div class=\"input-group w-100\">\r\n <input\r\n type=\"text\"\r\n readonly\r\n id=\"inputDateTime\"\r\n #inputDateTime\r\n style=\"flex: 1\"\r\n [class.is-invalid]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [disabled]=\"disabled || readonly\"\r\n class=\"form-control form-control-sm\"\r\n (blur)=\"onBlur()\"\r\n (focusout)=\"focusOutInput()\"\r\n (keyup)=\"onKeyUp($event)\"\r\n (dblclick)=\"preventDefault($event)\"\r\n (click)=\"preventDefault($event)\"\r\n (mouseup)=\"onClick($event, inputDateTime)\"\r\n [formControl]=\"dateTimeControl\" />\r\n <div class=\"input-group-append\">\r\n <button\r\n #btnOpen\r\n (keyup.ArrowLeft)=\"goBack()\"\r\n [disabled]=\"disabled || readonly\"\r\n (keyup.ArrowRight)=\"clearable ? btnClean.focus() : goNext()\"\r\n class=\"btn btn-info p-0 rounded-0 use-button\"\r\n (click)=\"d2.toggle(); open(d2)\"\r\n type=\"button\">\r\n <i aria-hidden=\"true\" class=\"fa fa-calendar text-light px-1\"></i>\r\n </button>\r\n <button\r\n #btnClean\r\n class=\"btn btn-danger p-0 rounded-0 limpiar\"\r\n [disabled]=\"disabled || readonly\"\r\n (click)=\"limpiarTodo()\"\r\n (keyup.ArrowLeft)=\"btnOpen.focus()\"\r\n (keyup.ArrowRight)=\"goNext()\"\r\n type=\"button\">\r\n <!-- <mat-icon class=\"text-white pt-1\" style=\"font-size: 18px;\" [matTooltip]=\"'Limpiar'\" matTooltipClass=\"bg-danger\">close</mat-icon> -->\r\n <i aria-hidden=\"true\" class=\"fa fa-times px-1 text-light\"></i>\r\n </button>\r\n </div>\r\n <div class=\"position-absolute container-tooltipmessage\">\r\n <tooltip-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></tooltip-message>\r\n </div>\r\n </div>\r\n <error-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></error-message>\r\n <ng-template #footerTemplate>\r\n <ngb-timepicker [formControl]=\"hoursControl\" [meridian]=\"format == 12 ? true : false\" (focusout)=\"focusOut($event)\"></ngb-timepicker>\r\n </ng-template>\r\n </div>\r\n</div>\r\n", styles: ["#fakeInput{position:relative;visibility:hidden;padding:0;height:0}#inputDateTime{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-control:focus,.form-control:active{border-color:#007eff;box-shadow:inset 0 1px 1px #00000013,0 0 0 3px #007eff1a!important}ngb-timepicker fieldset{width:230px!important}.container-tooltipmessage{width:16px;height:100%;display:flex;align-items:center;z-index:1000;right:68px;top:1px}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:inset 0 1px 1px #00000013,0 0 0 3px #fde6e8!important}.was-validated .form-control:invalid,.form-control.is-invalid{background-image:none;box-shadow:inset 0 1px 1px #00000013,0 0 0 3px #fde6e8!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "directive", type: i2.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.tooltipMessageComponent, selector: "tooltip-message", inputs: ["tooltipMessage", "validatorMessage", "controls", "label", "submitted"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i6.errorMessageComponent, selector: "error-message", inputs: ["tooltipMessage", "validatorMessage", "controls", "label", "submitted"] }] }); }
1065
+ }
1066
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: DateTimePickerEditableComponent, decorators: [{
1067
+ type: Component,
1068
+ args: [{ selector: "date-time-picker-editable", providers: [
1069
+ {
1070
+ provide: NG_VALUE_ACCESSOR,
1071
+ multi: true,
1072
+ useExisting: DateTimePickerEditableComponent,
1073
+ },
1074
+ {
1075
+ provide: NG_VALIDATORS,
1076
+ useExisting: forwardRef(() => DateTimePickerEditableComponent),
1077
+ multi: true,
1078
+ },
1079
+ I18n,
1080
+ { provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n },
1081
+ { provide: NgbDateParserFormatter, useClass: CustomDatepickerFormat },
1082
+ ], template: "<div class=\"row\">\r\n <div class=\"col-12\" style=\"overflow: hidden\">\r\n <label *ngIf=\"label != null && label != '' && showLabel\" class=\"d-flex sumax-label mb-0 p-0\"\r\n ><span [title]=\"label\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis\">{{ label }}</span>\r\n <span *ngIf=\"required\" class=\"ms-1\" [class.text-danger]=\"controls?.errors != null\"> *</span>\r\n <span *ngIf=\"labelInfo\">\r\n <i class=\"fa fa-exclamation-circle text-info ms-2\" [matTooltip]=\"textLabelInfo\" matTooltipClass=\"bg-info\"></i>\r\n </span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm position-absolute\"\r\n container=\"body\"\r\n id=\"fakeInput\"\r\n ngbDatepicker\r\n [formControl]=\"dateControl\"\r\n [autoClose]=\"'outside'\"\r\n [footerTemplate]=\"footerTemplate\"\r\n #d2=\"ngbDatepicker\" />\r\n <div class=\"input-group w-100\">\r\n <input\r\n type=\"text\"\r\n readonly\r\n id=\"inputDateTime\"\r\n #inputDateTime\r\n style=\"flex: 1\"\r\n [class.is-invalid]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [disabled]=\"disabled || readonly\"\r\n class=\"form-control form-control-sm\"\r\n (blur)=\"onBlur()\"\r\n (focusout)=\"focusOutInput()\"\r\n (keyup)=\"onKeyUp($event)\"\r\n (dblclick)=\"preventDefault($event)\"\r\n (click)=\"preventDefault($event)\"\r\n (mouseup)=\"onClick($event, inputDateTime)\"\r\n [formControl]=\"dateTimeControl\" />\r\n <div class=\"input-group-append\">\r\n <button\r\n #btnOpen\r\n (keyup.ArrowLeft)=\"goBack()\"\r\n [disabled]=\"disabled || readonly\"\r\n (keyup.ArrowRight)=\"clearable ? btnClean.focus() : goNext()\"\r\n class=\"btn btn-info p-0 rounded-0 use-button\"\r\n (click)=\"d2.toggle(); open(d2)\"\r\n type=\"button\">\r\n <i aria-hidden=\"true\" class=\"fa fa-calendar text-light px-1\"></i>\r\n </button>\r\n <button\r\n #btnClean\r\n class=\"btn btn-danger p-0 rounded-0 limpiar\"\r\n [disabled]=\"disabled || readonly\"\r\n (click)=\"limpiarTodo()\"\r\n (keyup.ArrowLeft)=\"btnOpen.focus()\"\r\n (keyup.ArrowRight)=\"goNext()\"\r\n type=\"button\">\r\n <!-- <mat-icon class=\"text-white pt-1\" style=\"font-size: 18px;\" [matTooltip]=\"'Limpiar'\" matTooltipClass=\"bg-danger\">close</mat-icon> -->\r\n <i aria-hidden=\"true\" class=\"fa fa-times px-1 text-light\"></i>\r\n </button>\r\n </div>\r\n <div class=\"position-absolute container-tooltipmessage\">\r\n <tooltip-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></tooltip-message>\r\n </div>\r\n </div>\r\n <error-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></error-message>\r\n <ng-template #footerTemplate>\r\n <ngb-timepicker [formControl]=\"hoursControl\" [meridian]=\"format == 12 ? true : false\" (focusout)=\"focusOut($event)\"></ngb-timepicker>\r\n </ng-template>\r\n </div>\r\n</div>\r\n", styles: ["#fakeInput{position:relative;visibility:hidden;padding:0;height:0}#inputDateTime{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-control:focus,.form-control:active{border-color:#007eff;box-shadow:inset 0 1px 1px #00000013,0 0 0 3px #007eff1a!important}ngb-timepicker fieldset{width:230px!important}.container-tooltipmessage{width:16px;height:100%;display:flex;align-items:center;z-index:1000;right:68px;top:1px}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:inset 0 1px 1px #00000013,0 0 0 3px #fde6e8!important}.was-validated .form-control:invalid,.form-control.is-invalid{background-image:none;box-shadow:inset 0 1px 1px #00000013,0 0 0 3px #fde6e8!important}\n"] }]
1083
+ }], ctorParameters: () => [], propDecorators: { inputDateTime: [{
1084
+ type: ViewChild,
1085
+ args: ["inputDateTime"]
1086
+ }], btnOpen: [{
1087
+ type: ViewChild,
1088
+ args: ["btnOpen"]
1089
+ }], btnClean: [{
1090
+ type: ViewChild,
1091
+ args: ["btnClean"]
1092
+ }], ngbDatepicker: [{
1093
+ type: ViewChild,
1094
+ args: ["d2"]
1095
+ }], label: [{
1096
+ type: Input
1097
+ }], showLabel: [{
1098
+ type: Input
1099
+ }], readonly: [{
1100
+ type: Input
1101
+ }], required: [{
1102
+ type: Input
1103
+ }], validatorMessage: [{
1104
+ type: Input
1105
+ }], tooltipMessage: [{
1106
+ type: Input
1107
+ }], submitted: [{
1108
+ type: Input
1109
+ }], format: [{
1110
+ type: Input
1111
+ }], next: [{
1112
+ type: Input
1113
+ }], nextIsDisable: [{
1114
+ type: Input
1115
+ }], labelInfo: [{
1116
+ type: Input
1117
+ }], textLabelInfo: [{
1118
+ type: Input
1119
+ }], back: [{
1120
+ type: Input
1121
+ }], backIsDisable: [{
1122
+ type: Input
1123
+ }], openWhenFocus: [{
1124
+ type: Input
1125
+ }], goNextWhenSelect: [{
1126
+ type: Input
1127
+ }], clearable: [{
1128
+ type: Input
1129
+ }], autoCompleteHours: [{
1130
+ type: Input
1131
+ }], autoComplete: [{
1132
+ type: Input
1133
+ }], disabled: [{
1134
+ type: Input
1135
+ }], onNext: [{
1136
+ type: Output
1137
+ }], onBack: [{
1138
+ type: Output
1139
+ }] } });
1140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1lZGl0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3VtYXgtZXJwLWNvbXBvbmVudC9zcmMvbGliL2RhdGUtdGltZS1waWNrZXItZWRpdGFibGUvZGF0ZS10aW1lLXBpY2tlci1lZGl0YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3VtYXgtZXJwLWNvbXBvbmVudC9zcmMvbGliL2RhdGUtdGltZS1waWNrZXItZWRpdGFibGUvZGF0ZS10aW1lLXBpY2tlci1lZGl0YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEdBR1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUVuQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQXNCLE1BQU0sNEJBQTRCLENBQUM7QUFDeEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7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LFNBQVM7c0JBQWpCLEtBQUs7Z0JBTUcsTUFBTTtzQkFBZCxLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBmb3J3YXJkUmVmLFxyXG4gIGluamVjdCxcclxuICBpbnB1dCxcclxuICB2aWV3Q2hpbGQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgTkdfVkFMSURBVE9SUyxcclxuICBOR19WQUxVRV9BQ0NFU1NPUixcclxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXHJcbiAgVmFsaWRhdGlvbkVycm9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTmdiQ2FsZW5kYXIsIE5nYkRhdGVQYXJzZXJGb3JtYXR0ZXIsIE5nYkRhdGVwaWNrZXJJMThuLCBOZ2JJbnB1dERhdGVwaWNrZXIgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRGF0ZXBpY2tlckZvcm1hdCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci9DdXN0b21EYXRlUGlja2VyRm9ybWF0XCI7XHJcbmltcG9ydCB7IEN1c3RvbURhdGVwaWNrZXJJMThuLCBJMThuIH0gZnJvbSBcIi4uL2RhdGUtcGlja2VyL0N1c3RvbURhdGVQaWNrZXJJMThuXCI7XHJcbmltcG9ydCB7IERhdGVUaW1lTW9kZWwgfSBmcm9tIFwiLi4vdXRpbHMvRGF0ZVRpbWVNb2RlbFwiO1xyXG5pbXBvcnQgeyBmb3JtYXRIb3VyIH0gZnJvbSBcIi4uL3V0aWxzL0RhdGVUaW1lUGlja2VyRWRpdGFibGVcIjtcclxuaW1wb3J0IHsgRGF0ZVV0aWwgfSBmcm9tIFwiLi4vdXRpbHMvRGF0ZVV0aWxcIjtcclxuaW1wb3J0IHsgRGF0ZVRpbWVQaWNrZXJFZGl0YWJsZVNlcnZpY2UgfSBmcm9tIFwiLi9kYXRlLXRpbWUtcGlja2VyLWVkaXRhYmxlLnNlcnZpY2VcIjtcclxuXHJcbmNvbnN0IE1BU0tfMTJfSE9VUlMgPSBcImRkL21tL3l5eXkgLS06LS0gLS1cIjtcclxuY29uc3QgTUFTS18yNF9IT1VSUyA9IFwiZGQvbW0veXl5eSAtLTotLVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiZGF0ZS10aW1lLXBpY2tlci1lZGl0YWJsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZGF0ZS10aW1lLXBpY2tlci1lZGl0YWJsZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9kYXRlLXRpbWUtcGlja2VyLWVkaXRhYmxlLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBEYXRlVGltZVBpY2tlckVkaXRhYmxlQ29tcG9uZW50LFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVRpbWVQaWNrZXJFZGl0YWJsZUNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICAgIEkxOG4sXHJcbiAgICB7IHByb3ZpZGU6IE5nYkRhdGVwaWNrZXJJMThuLCB1c2VDbGFzczogQ3VzdG9tRGF0ZXBpY2tlckkxOG4gfSxcclxuICAgIHsgcHJvdmlkZTogTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgdXNlQ2xhc3M6IEN1c3RvbURhdGVwaWNrZXJGb3JtYXQgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVRpbWVQaWNrZXJFZGl0YWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XHJcbiAgcHJpdmF0ZSBfZGF0ZVBpcGUgPSBpbmplY3QoRGF0ZVBpcGUpO1xyXG4gIHByaXZhdGUgX2NhbGVuZGFyID0gaW5qZWN0KE5nYkNhbGVuZGFyKTtcclxuICBwcml2YXRlIF9kYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZSA9IGluamVjdChEYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBfY2RyZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dERhdGVUaW1lXCIpIGlucHV0RGF0ZVRpbWU6IGFueTtcclxuICBAVmlld0NoaWxkKFwiYnRuT3BlblwiKSBidG5PcGVuITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKFwiYnRuQ2xlYW5cIikgYnRuQ2xlYW4hOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoXCJkMlwiKSBuZ2JEYXRlcGlja2VyITogTmdiSW5wdXREYXRlcGlja2VyO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gVGV4dG8gc3VwZXJpb25cclxuICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICogQHR5cGUgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFBhcmFtZXRybyBkZSBsYSB2aXN1YWxpemFjacOzbiBkZWwgdGV4dG8gc3VwZXJpb3JcclxuICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNob3dMYWJlbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUGFyYW1ldHJvIGRlIGNvbnRyb2wgcmVxdWVyaWRvXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB2YWxpZGF0b3JNZXNzYWdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdG9vbHRpcE1lc3NhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHN1Ym1pdHRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFBhcmFtZXRybyBkZSBmb3JtYXRvIGRlIGZlY2hhOiAxMiB8IDE0XHJcbiAgICogQGRlZmF1bHQgMjRcclxuICAgKiBAdHlwZSAxMiB8IDE0XHJcbiAgICovXHJcbiAgQElucHV0KCkgZm9ybWF0OiBmb3JtYXRIb3VyID0gMjQ7XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFByw7N4aW1vIGNvbnRyb2wgYSBoYWNlciBmb2N1c1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG5leHQ6IGFueTtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUHLDs3hpbW8gY29udHJvbCBhIGhhY2VyIGZvY3VzIGVuIGNhc28gZWwgTkVYVCBlc3TDqSBkZXNoYWJpbGl0YWRvXHJcbiAgICovXHJcbiAgQElucHV0KCkgbmV4dElzRGlzYWJsZTogYW55O1xyXG4gIEBJbnB1dCgpIGxhYmVsSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRleHRMYWJlbEluZm86IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEFudGVyaW9yIGNvbnRyb2wgYSBoYWNlciBmb2N1c1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhY2s6IGFueTtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gQW50ZXJpb3IgY29udHJvbCBhIGhhY2VyIGZvY3VzIGVuIGNhc28gZWwgQkFDSyBlc3TDqSBkZXNoYWJpbGl0YWRvXHJcbiAgICovXHJcbiAgQElucHV0KCkgYmFja0lzRGlzYWJsZTogYW55O1xyXG4gIEBJbnB1dCgpIG9wZW5XaGVuRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBnb05leHRXaGVuU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFBhcmFtZXRybyBwYXJhIG1vc3RyYXIgZWwgYm90w7NuIGRlIGVsaW1pbmFyXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgY2xlYXJhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUGFyYW1ldHJvIGRlIGF1dG9jb21wbGV0YWRvOlxyXG4gICAqIFRydWU6IGF1dG9jb21wbGV0YSBjb24gbGEgaG9yYSDDsyBtaW51dG8gYWN0dWFsXHJcbiAgICogRmFsc2U6IGF1dG9jb21wbGV0YSBjb24gMDA6MDBcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSBhdXRvQ29tcGxldGVIb3VyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGF1dG9Db21wbGV0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgb25OZXh0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25CYWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgb25Ub3VjaCA9ICgpID0+IHsgfTtcclxuICBvblZhbGlkYXRpb25DaGFuZ2UgPSAoKSA9PiB7IH07XHJcblxyXG4gIGNvbnRyb2xzOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XHJcbiAgY29udGFkb3IgPSAwO1xyXG4gIHBvc2l0aW9uID0gMDtcclxuICBkYXRlVGltZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woXCJkZC9tbS95eXl5IC0tOi0tIC0tXCIpO1xyXG4gIGhvdXJzQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woe1xyXG4gICAgaG91cjogbnVsbCxcclxuICAgIG1pbnV0ZTogbnVsbCxcclxuICB9KTtcclxuICBkYXRlQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woe1xyXG4gICAgeWVhcjogbnVsbCxcclxuICAgIG1vbnRoOiBudWxsLFxyXG4gICAgZGF5OiBudWxsLFxyXG4gIH0pO1xyXG4gIHRvZGF5ID0gdGhpcy5fY2FsZW5kYXIuZ2V0VG9kYXkoKTtcclxuXHJcbiAgZ2V0IHN0cmluZ0Zvcm1hdCAoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1hdCA9PT0gMTIgPyBcImRkL01NL3l5eXkgaGg6bW0gYVwiIDogXCJkZC9NTS95eXl5IEhIOm1tXCI7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuc2hvd0xhYmVsID0gdGhpcy5fZGF0ZVRpbWVQaWNrZXJFZGl0YWJsZVNlcnZpY2UuZ2V0U2hvd0xhYmVsKCk7XHJcbiAgICB0aGlzLm9wZW5XaGVuRm9jdXMgPSB0aGlzLl9kYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZS5nZXRPcGVuV2hlbkZvY3VzKCk7XHJcbiAgICB0aGlzLmdvTmV4dFdoZW5TZWxlY3QgPSB0aGlzLl9kYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZS5nZXRHb05leHRXaGVuU2VsZWN0KCk7XHJcbiAgICB0aGlzLnZhbGlkYXRvck1lc3NhZ2UgPSB0aGlzLl9kYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZS5nZXRWYWxpZGF0b3JNZXNzYWdlKCk7XHJcbiAgICB0aGlzLnRvb2x0aXBNZXNzYWdlID0gdGhpcy5fZGF0ZVRpbWVQaWNrZXJFZGl0YWJsZVNlcnZpY2UuZ2V0VG9vbHRpcE1lc3NhZ2UoKTtcclxuICAgIHRoaXMuc3VibWl0dGVkID0gdGhpcy5fZGF0ZVRpbWVQaWNrZXJFZGl0YWJsZVNlcnZpY2UuZ2V0U3VibWl0dGVkKCk7XHJcbiAgICB0aGlzLmZvcm1hdCA9IHRoaXMuX2RhdGVUaW1lUGlja2VyRWRpdGFibGVTZXJ2aWNlLmdldEZvcm1hdCgpO1xyXG4gICAgdGhpcy5jbGVhcmFibGUgPSB0aGlzLl9kYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZS5nZXRDbGVhcmFibGUoKTtcclxuICAgIHRoaXMuYXV0b0NvbXBsZXRlSG91cnMgPSB0aGlzLl9kYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZS5nZXRBdXRvQ29tcGxldGVIb3VycygpO1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGUgPSB0aGlzLl9kYXRlVGltZVBpY2tlckVkaXRhYmxlU2VydmljZS5nZXRBdXRvQ29tcGxldGUoKTtcclxuICB9XHJcblxyXG5cclxuICB2YWxpZGF0ZSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IGFueSB7XHJcbiAgICB0aGlzLmNvbnRyb2xzID0gY29udHJvbDtcclxuICAgIHRoaXMuX2NkcmYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlPyhmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblZhbGlkYXRpb25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0ICgpOiB2b2lkIHtcclxuICAgIHRoaXMuaG91cnNDaGFuZ2UoKTtcclxuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kYXRlQ2hhbmdlKCk7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcclxuICAgICAgaWYgKCF0aGlzLmNsZWFyYWJsZSkgdGhpcy5idG5DbGVhbiEubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgIH0sIDEwMCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybWF0ID09IDEyKSB7XHJcbiAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKE1BU0tfMTJfSE9VUlMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUoTUFTS18yNF9IT1VSUyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyAoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJzdWJtaXR0ZWRcIl0pIHtcclxuICAgICAgaWYgKHRoaXMuY29udHJvbHMgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2VzW1wic3VibWl0dGVkXCJdLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbHMubWFya0FzRGlydHkoKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xzLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9jdXMgKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbnB1dERhdGVUaW1lLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuXHJcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkgdGhpcy5pbnB1dERhdGVUaW1lLm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMik7XHJcblxyXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICB9LCAxMDApO1xyXG5cclxuICAgIGlmICghdGhpcy5yZWFkb25seSAmJiB0aGlzLm9wZW5XaGVuRm9jdXMpIHtcclxuICAgICAgdGhpcy5uZ2JEYXRlcGlja2VyPy5vcGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlIChvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKG9iaiAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoRGF0ZVRpbWVNb2RlbC5mcm9tTG9jYWxTdHJpbmcob2JqKSk7XHJcbiAgICAgIHRoaXMuaG91cnNDb250cm9sLnNldFZhbHVlKHtcclxuICAgICAgICBob3VyOiB0aGlzLmRhdGVDb250cm9sLnZhbHVlLmhvdXIsXHJcbiAgICAgICAgbWludXRlOiB0aGlzLmRhdGVDb250cm9sLnZhbHVlLm1pbnV0ZSxcclxuICAgICAgICBzZWNvbmQ6IHRoaXMuZGF0ZUNvbnRyb2wudmFsdWUuc2Vjb25kLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKG9iaiwgdGhpcy5zdHJpbmdGb3JtYXQpKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmVnaXN0ZXJPbkNoYW5nZSAoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZCAoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoID0gZm47XHJcbiAgfVxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHRoaXMuZGF0ZVRpbWVDb250cm9sLmRpc2FibGUoKTtcclxuICAgIGVsc2UgdGhpcy5kYXRlVGltZUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgfVxyXG5cclxuICBob3Vyc0NoYW5nZSAoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtYXQgPT0gMTIpXHJcbiAgICAgIHRoaXMuaG91cnNDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIC9bMC0zXVswLTldXFwvWzAtMV1bMC05XVxcL1swLTldWzAtOV1bMC05XVswLTldIFswLTFdWzAtOV06WzAtNl1bMC05XSBbQSxQXU0vLnRlc3QodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhKSB8fFxyXG4gICAgICAgICAgL1swLTNdWzAtOV1cXC9bMC0xXVswLTldXFwvWzAtOV1bMC05XVswLTldWzAtOV0vLnRlc3QodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygwLCAxMCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5kYXRlQ29udHJvbC52YWx1ZSEsXHJcbiAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0OiBhbnkgPSBuZXcgRGF0ZVRpbWVNb2RlbChPYmplY3QuYXNzaWduKHRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsIHRoaXMuaG91cnNDb250cm9sLnZhbHVlKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZSh0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0oaW5wdXQsIHRoaXMuc3RyaW5nRm9ybWF0KSk7XHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBlbHNlIGlmICh0aGlzLmZvcm1hdCA9PSAyNClcclxuICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgL1swLTNdWzAtOV1cXC9bMC0xXVswLTldXFwvWzAtOV1bMC05XVswLTldWzAtOV0gWzAtMV1bMC05XTpbMC02XVswLTldLy50ZXN0KHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlISkgfHxcclxuICAgICAgICAgIC9bMC0zXVswLTldXFwvWzAtMV1bMC05XVxcL1swLTldWzAtOV1bMC05XVswLTldLy50ZXN0KHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMCwgMTApKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZShcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgLi4ucmVzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0OiBhbnkgPSBuZXcgRGF0ZVRpbWVNb2RlbChPYmplY3QuYXNzaWduKHRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsIHRoaXMuaG91cnNDb250cm9sLnZhbHVlKSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShpbnB1dCwgdGhpcy5zdHJpbmdGb3JtYXQpKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIC8qIGNvbnNvbGUuZXJyb3IoZXJyb3IpICovXHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkVtaXQgKGVtaXRWYWx1ZTogYW55ID0gbnVsbCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZVRpbWVNb2RlbChPYmplY3QuYXNzaWduKHRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsIHRoaXMuaG91cnNDb250cm9sLnZhbHVlKSk7XHJcbiAgICAgIGVtaXRWYWx1ZSA9IHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZS50b1N0cmluZygpLCBcInl5eXktTU0tZGRUSEg6bW1cIik7XHJcbiAgICB9IGNhdGNoIChlKSB7IH1cclxuICAgIHRoaXMub25DaGFuZ2UoZW1pdFZhbHVlKTtcclxuICAgIHRoaXMub25Ub3VjaCgpO1xyXG4gIH1cclxuXHJcbiAgZGF0ZUNoYW5nZSAoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtYXQgPT0gMTIpXHJcbiAgICAgIHRoaXMuZGF0ZUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgL1swLTNdWzAtOV1cXC9bMC0xXVswLTldXFwvWzAtOV1bMC05XVswLTldWzAtOV0gWzAtMV1bMC05XTpbMC02XVswLTldIFtBLFBdTS8udGVzdCh0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEpIHx8XHJcbiAgICAgICAgICAvWzAtMV1bMC05XTpbMC02XVswLTldLy50ZXN0KHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTEsIDE2KSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAuLi50aGlzLmhvdXJzQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICAuLi5yZXMsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0OiBhbnkgPSBuZXcgRGF0ZVRpbWVNb2RlbChPYmplY3QuYXNzaWduKHRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsIHRoaXMuaG91cnNDb250cm9sLnZhbHVlKSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShpbnB1dCwgdGhpcy5zdHJpbmdGb3JtYXQpKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBlbHNlIGlmICh0aGlzLmZvcm1hdCA9PSAyNClcclxuICAgICAgdGhpcy5kYXRlQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAvWzAtM11bMC05XVxcL1swLTFdWzAtOV1cXC9bMC05XVswLTldWzAtOV1bMC05XSBbMC0xXVswLTldOlswLTZdWzAtOV0gW0EsUF1NLy50ZXN0KHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlISkgfHxcclxuICAgICAgICAgIC9bMC0xXVswLTldOlswLTZdWzAtOV0vLnRlc3QodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSwgMTYpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZShcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuaG91cnNDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICAgIC4uLnJlcyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgaW5wdXQ6IGFueSA9IG5ldyBEYXRlVGltZU1vZGVsKE9iamVjdC5hc3NpZ24odGhpcy5kYXRlQ29udHJvbC52YWx1ZSwgdGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUpKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGlucHV0LCB0aGlzLnN0cmluZ0Zvcm1hdCkpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQmx1ciAoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uRW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgZm9jdXNPdXRJbnB1dCAoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlO1xyXG5cclxuICAgIGlmICgodmFsdWUgIT0gTUFTS18xMl9IT1VSUyAmJiB0aGlzLmZvcm1hdCA9PSAxMikgfHwgKHZhbHVlICE9IE1BU0tfMjRfSE9VUlMgJiYgdGhpcy5mb3JtYXQgPT0gMjQpKSB7XHJcbiAgICAgIGNvbnN0IGRpYSA9IHZhbHVlPy5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICAgIGNvbnN0IG1lcyA9IHZhbHVlPy5zdWJzdHJpbmcoMywgNSk7XHJcbiAgICAgIGNvbnN0IGFuaW8gPSB2YWx1ZT8uc3Vic3RyaW5nKDYsIDEwKTtcclxuICAgICAgY29uc3QgaG9yYSA9IHZhbHVlPy5zdWJzdHJpbmcoMTEsIDEzKTtcclxuICAgICAgY29uc3QgbWludXRvcyA9IHZhbHVlPy5zdWJzdHJpbmcoMTQsIDE2KTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpc05hTihOdW1iZXIoZGlhKSkgfHxcclxuICAgICAgICBkaWEgPT0gXCIwMFwiIHx8XHJcbiAgICAgICAgaXNOYU4oTnVtYmVyKG1lcykpIHx8XHJcbiAgICAgICAgbWVzID09IFwiMDBcIiB8fFxyXG4gICAgICAgIGlzTmFOKE51bWJlcihhbmlvKSkgfHxcclxuICAgICAgICBhbmlvID09IFwiMDAwMFwiIHx8XHJcbiAgICAgICAgaXNOYU4oTnVtYmVyKGhvcmEpKSB8fFxyXG4gICAgICAgIGlzTmFOKE51bWJlcihtaW51dG9zKSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZShcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgeWVhcjogaXNOYU4oTnVtYmVyKGFuaW8pKSB8fCBhbmlvID09IFwiMDAwMFwiID8gdGhpcy50b2RheS55ZWFyIDogTnVtYmVyKGFuaW8pLFxyXG4gICAgICAgICAgICBtb250aDogaXNOYU4oTnVtYmVyKG1lcykpIHx8IG1lcyA9PSBcIjAwXCIgPyB0aGlzLnRvZGF5Lm1vbnRoIDogTnVtYmVyKG1lcyksXHJcbiAgICAgICAgICAgIGRheTogaXNOYU4oTnVtYmVyKGRpYSkpIHx8IGRpYSA9PSBcIjAwXCIgPyB0aGlzLnRvZGF5LmRheSA6IE51bWJlcihkaWEpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgaG91ciA9IHRoaXMuaG91cnNDb250cm9sLnZhbHVlLmhvdXI7XHJcbiAgICAgICAgaWYgKGlzTmFOKE51bWJlcihob3JhKSkpIGhvdXIgPSB0aGlzLmF1dG9Db21wbGV0ZUhvdXJzID8gRGF0ZVV0aWwuZ2V0SG91cnMoRGF0ZVV0aWwubm93KCkpIDogMDtcclxuXHJcbiAgICAgICAgbGV0IG1pbnV0ZSA9IHRoaXMuaG91cnNDb250cm9sLnZhbHVlLm1pbnV0ZTtcclxuICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKG1pbnV0b3MpKSkgbWludXRlID0gdGhpcy5hdXRvQ29tcGxldGVIb3VycyA/IERhdGVVdGlsLmdldE1pbnV0ZXMoRGF0ZVV0aWwubm93KCkpIDogMDtcclxuXHJcbiAgICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGhvdXIsXHJcbiAgICAgICAgICAgIG1pbnV0ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgaW5wdXQ6IGFueSA9IG5ldyBEYXRlVGltZU1vZGVsKE9iamVjdC5hc3NpZ24odGhpcy5kYXRlQ29udHJvbC52YWx1ZSwgdGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUpKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGlucHV0LCB0aGlzLnN0cmluZ0Zvcm1hdCkpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gIH1cclxuXHJcbiAgb25LZXlVcCAoZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0O1xyXG5cclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYgKCFpc05hTihOdW1iZXIoZS5rZXkpKSAmJiBlLmtleS50cmltKCkgIT0gXCJcIikge1xyXG4gICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09IERJQSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAwICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAyKSB7XHJcbiAgICAgICAgY29uc3QgdmFsb3JBY3R1YWw6IHN0cmluZyA9IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlITtcclxuICAgICAgICBjb25zdCBkaWFBY3R1YWw6IHN0cmluZyA9IHZhbG9yQWN0dWFsLnN1YnN0cmluZygwLCAyKTtcclxuXHJcbiAgICAgICAgaWYgKGRpYUFjdHVhbCA9PSBcImRkXCIpIHtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgZS5rZXkucGFkU3RhcnQoMiwgMCkgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygyKSB9YDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgIGRheTogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMCwgMikpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICBpZiAoZS5rZXkgPiAzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgzLCA1KTtcclxuICAgICAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIoZGlhQWN0dWFsKSA8PSAzICYmIE51bWJlcihkaWFBY3R1YWwpID4gMCAmJiB0aGlzLmNvbnRhZG9yID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgbnVldm9WYWxvciA9IGAkeyBOdW1iZXIoTnVtYmVyKGRpYUFjdHVhbCkudG9TdHJpbmcoKSArIE51bWJlcihlLmtleSkpID4gMzEgPyAzMSA6IE51bWJlcihkaWFBY3R1YWwpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpXHJcbiAgICAgICAgICAgIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMikgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICBkYXk6IE51bWJlcih0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDAsIDIpKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDMsIDUpO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgZS5rZXkucGFkU3RhcnQoMiwgMCkgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygyKSB9YDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgIGRheTogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMCwgMikpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICBpZiAoTnVtYmVyKGUua2V5LnBhZFN0YXJ0KDIsIDApKSA+IDMgfHwgdGhpcy5jb250YWRvciA+IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDMsIDUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9IGVsc2UgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAyKTtcclxuICAgICAgfVxyXG4gICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgIGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDMgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDUpIHtcclxuICAgICAgICBjb25zdCB2YWxvckFjdHVhbDogc3RyaW5nID0gdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhO1xyXG4gICAgICAgIGNvbnN0IG1lc0FjdHVhbDogc3RyaW5nID0gdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDMsIDUpO1xyXG5cclxuICAgICAgICBpZiAobWVzQWN0dWFsID09IFwibW1cIikge1xyXG4gICAgICAgICAgY29uc3QgbnVldm9WYWxvciA9IGAkeyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMCwgMykgfSR7IGUua2V5LnBhZFN0YXJ0KDIsIDApIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoNSkgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICBtb250aDogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMywgNSkpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICBpZiAoZS5rZXkgPiAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDYsIDEwKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyKG1lc0FjdHVhbCkgPD0gMSAmJiBOdW1iZXIobWVzQWN0dWFsKSA+IDAgJiYgdGhpcy5jb250YWRvciA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDMpIH0keyBOdW1iZXIoTnVtYmVyKG1lc0FjdHVhbCkudG9TdHJpbmcoKSArIE51bWJlcihlLmtleSkpID4gMTIgPyAxMiA6IE51bWJlcihtZXNBY3R1YWwpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpXHJcbiAgICAgICAgICAgIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoNSkgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICBtb250aDogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMywgNSkpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoNiwgMTApO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDMpIH0keyBlLmtleS5wYWRTdGFydCgyLCAwKSB9JHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDUpIH1gO1xyXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKHtcclxuICAgICAgICAgICAgLi4udGhpcy5kYXRlQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgbW9udGg6IE51bWJlcih0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDMsIDUpKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgICAgaWYgKE51bWJlcihlLmtleS5wYWRTdGFydCgyLCAwKSkgPiAxIHx8IHRoaXMuY29udGFkb3IgPiAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDYsIDEwKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDMsIDUpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQcORTyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgIGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDYgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDEwKSB7XHJcbiAgICAgICAgY29uc3QgdmFsb3JBY3R1YWw6IHN0cmluZyA9IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlITtcclxuICAgICAgICBjb25zdCBhbmlvQWN0dWFsOiBzdHJpbmcgPSB2YWxvckFjdHVhbC5zdWJzdHJpbmcoNiwgMTApO1xyXG4gICAgICAgIGlmIChhbmlvQWN0dWFsID09IFwieXl5eVwiKSB7XHJcbiAgICAgICAgICBjb25zdCBudWV2b1ZhbG9yID0gYCR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygwLCA2KSB9JHsgZS5rZXkucGFkU3RhcnQoNCwgMCkgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygxMCkgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICB5ZWFyOiBOdW1iZXIodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZyg2LCAxMCkpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICBpZiAoZS5rZXkgPiAyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDYpIH0keyBEYXRlVXRpbC5nZXRZZWFyKERhdGVVdGlsLm5vdygpKSB9JHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDEwKSB9YDtcclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgeWVhcjogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoNiwgMTApKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDExLCAxMyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9IGVsc2UgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKE51bWJlcihhbmlvQWN0dWFsKSA8PSAyOTk5ICYmIE51bWJlcihhbmlvQWN0dWFsKSA+IDApIHtcclxuICAgICAgICAgIGxldCBudWV2b1ZhbG9yO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgICAgaWYgKE51bWJlcihhbmlvQWN0dWFsKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDYpIH0keyBOdW1iZXIoZS5rZXkpLnRvU3RyaW5nKCkucGFkU3RhcnQoNCwgXCIwXCIpIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTApIH1gO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbnVldm9WYWxvciA9IGAkeyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMCwgNikgfSR7IChOdW1iZXIoYW5pb0FjdHVhbCkudG9TdHJpbmcoKSArIE51bWJlcihlLmtleSkpLnBhZFN0YXJ0KFxyXG4gICAgICAgICAgICAgIDQsXHJcbiAgICAgICAgICAgICAgXCIwXCJcclxuICAgICAgICAgICAgKSB9JHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDEwKSB9YDtcclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgeWVhcjogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoNiwgMTApKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBOdW1iZXIoTnVtYmVyKGFuaW9BY3R1YWwpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpKSA+IDEwMDAgJiZcclxuICAgICAgICAgICAgICBOdW1iZXIoTnVtYmVyKGFuaW9BY3R1YWwpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpKSA8IDMwMDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxMSwgMTMpO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIoTnVtYmVyKGFuaW9BY3R1YWwpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpKSA+IDI5OTkpIHtcclxuICAgICAgICAgICAgICBudWV2b1ZhbG9yID0gYCR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygwLCA2KSB9JHsgRGF0ZVV0aWwuZ2V0WWVhcihEYXRlVXRpbC5ub3coKSkgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygxMCkgfWA7XHJcbiAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgeWVhcjogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoNiwgMTApKSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDExLCAxMyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICB5ZWFyOiBOdW1iZXIodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZyg2LCAxMCkpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDYpIH0keyBlLmtleS5wYWRTdGFydCg0LCAwKSB9JHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDEwKSB9YDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgIHllYXI6IE51bWJlcih0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDYsIDEwKSksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoNiwgMTApO1xyXG4gICAgICB9XHJcbiAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSE9SQSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgZWxzZSBpZiAoaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMTEgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDEzKSB7XHJcbiAgICAgICAgY29uc3QgdmFsb3JBY3R1YWw6IHN0cmluZyA9IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlITtcclxuICAgICAgICBjb25zdCBob3JhQWN0dWFsOiBzdHJpbmcgPSB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTEsIDEzKTtcclxuXHJcbiAgICAgICAgaWYgKGhvcmFBY3R1YWwgPT0gXCItLVwiKSB7XHJcbiAgICAgICAgICBjb25zdCBudWV2b1ZhbG9yID0gYCR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygwLCAxMSkgfSR7IGUua2V5LnBhZFN0YXJ0KDIsIDApIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTMpIH1gO1xyXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICAvLz09PT09PT09PT09IEZPUk1BVE8gMTIgSE9SQVM9PT09PT09PT09PVxyXG4gICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09IDEyKVxyXG4gICAgICAgICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgaG91cjogL1swLTFdWzAtOV06WzAtNl1bMC05XSBbQSxQXU0vLnRlc3QodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkpXHJcbiAgICAgICAgICAgICAgICA/IE51bWJlcih0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0oYDAxLzAxLzIwMjAgJHsgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkgfWAsIFwiSEhcIikpXHJcbiAgICAgICAgICAgICAgICA6IE51bWJlcih0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExLCAxMykpLFxyXG4gICAgICAgICAgICAgIG1pbnV0ZTogdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxNCwgMTYpID09IFwiLS1cIiA/IDAgOiB0aGlzLmhvdXJzQ29udHJvbC52YWx1ZS5taW51dGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy89PT09PT09PT09PSBGT1JNQVRPIDI0IEhPUkFTPT09PT09PT09PT1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuaG91cnNDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICAgIGhvdXI6IC9bMC0xXVswLTldOlswLTZdWzAtOV0vLnRlc3QodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkpXHJcbiAgICAgICAgICAgICAgICA/IE51bWJlcih0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0oYDAxLzAxLzIwMjAgJHsgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkgfWAsIFwiSEhcIikpXHJcbiAgICAgICAgICAgICAgICA6IE51bWJlcih0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExLCAxMykpLFxyXG4gICAgICAgICAgICAgIG1pbnV0ZTogdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxNCwgMTYpID09IFwiMDBcIiA/IDAgOiB0aGlzLmhvdXJzQ29udHJvbC52YWx1ZS5taW51dGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgICAgaWYgKGUua2V5ID4gMSAmJiB0aGlzLmZvcm1hdCA9PSAxMikge1xyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNCwgMTYpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChlLmtleSA+IDIgJiYgdGhpcy5mb3JtYXQgPT0gMjQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyKGhvcmFBY3R1YWwpIDw9IDEgJiYgTnVtYmVyKGhvcmFBY3R1YWwpID4gMCAmJiB0aGlzLmNvbnRhZG9yID4gMCAmJiB0aGlzLmZvcm1hdCA9PSAxMikge1xyXG4gICAgICAgICAgY29uc3QgbnVldm9WYWxvciA9IGAkeyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMCwgMTEpIH0keyBOdW1iZXIoTnVtYmVyKGhvcmFBY3R1YWwpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpKSA+IDEyID8gMTIgOiBOdW1iZXIoaG9yYUFjdHVhbCkudG9TdHJpbmcoKSArIE51bWJlcihlLmtleSlcclxuICAgICAgICAgICAgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygxMykgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuaG91cnNDb250cm9sLnNldFZhbHVlKHtcclxuICAgICAgICAgICAgLi4udGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgIGhvdXI6IC9bMC0xXVswLTldOlswLTZdWzAtOV0gW0EsUF1NLy50ZXN0KHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTEpKVxyXG4gICAgICAgICAgICAgID8gTnVtYmVyKHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShgMDEvMDEvMjAyMCAkeyB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExKSB9YCwgXCJISFwiKSlcclxuICAgICAgICAgICAgICA6IE51bWJlcih0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExLCAxMykpLFxyXG4gICAgICAgICAgICBtaW51dGU6IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTQsIDE2KSA9PSBcIjAwXCIgPyAwIDogdGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUubWludXRlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyKGhvcmFBY3R1YWwpIDw9IDIgJiYgTnVtYmVyKGhvcmFBY3R1YWwpID4gMCAmJiB0aGlzLmNvbnRhZG9yID4gMCAmJiB0aGlzLmZvcm1hdCA9PSAyNCkge1xyXG4gICAgICAgICAgY29uc3QgbnVldm9WYWxvciA9IGAkeyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMCwgMTEpIH0keyBOdW1iZXIoTnVtYmVyKGhvcmFBY3R1YWwpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpKSA+IDI0ID8gMjQgOiBOdW1iZXIoaG9yYUFjdHVhbCkudG9TdHJpbmcoKSArIE51bWJlcihlLmtleSlcclxuICAgICAgICAgICAgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygxMykgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIGxldCBob3VyO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaG91ciA9IC9bMC0xXVswLTldOlswLTZdWzAtOV0vLnRlc3QodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkpXHJcbiAgICAgICAgICAgICAgPyBOdW1iZXIodGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGAwMS8wMS8yMDIwICR7IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTEpIH1gLCBcIkhIXCIpKVxyXG4gICAgICAgICAgICAgIDogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTEsIDEzKSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBob3VyID0gTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTEsIDEzKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuaG91cnNDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICBob3VyLFxyXG4gICAgICAgICAgICBtaW51dGU6IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTQsIDE2KSA9PSBcIjAwXCIgPyAwIDogdGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUubWludXRlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBudWV2b1ZhbG9yID0gYCR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygwLCAxMSkgfSR7IGUua2V5LnBhZFN0YXJ0KDIsIDApIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTMpIH1gO1xyXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICBjb25zdCByZWdleCA9IHRoaXMuZm9ybWF0ID09IDEyID8gL1swLTFdWzAtOV06WzAtNl1bMC05XSBbQSxQXU0vIDogL1swLTFdWzAtOV06WzAtNl1bMC05XS87XHJcblxyXG4gICAgICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmhvdXJzQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgaG91cjogcmVnZXgudGVzdCh0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExKSlcclxuICAgICAgICAgICAgICA/IE51bWJlcih0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0oYDAxLzAxLzIwMjAgJHsgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkgfWAsIFwiSEhcIikpXHJcbiAgICAgICAgICAgICAgOiBOdW1iZXIodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSwgMTMpKSxcclxuICAgICAgICAgICAgbWludXRlOlxyXG4gICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTQsIDE2KSA9PSBcIjAwXCIgfHwgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxNCwgMTYpID09IFwiLS1cIlxyXG4gICAgICAgICAgICAgICAgPyAwXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMuaG91cnNDb250cm9sLnZhbHVlLm1pbnV0ZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgICAgaWYgKChOdW1iZXIoZS5rZXkucGFkU3RhcnQoMiwgMCkpID4gMSB8fCB0aGlzLmNvbnRhZG9yID4gMSkgJiYgdGhpcy5mb3JtYXQgPT0gMTIpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoKE51bWJlcihlLmtleS5wYWRTdGFydCgyLCAwKSkgPiAyIHx8IHRoaXMuY29udGFkb3IgPiAxKSAmJiB0aGlzLmZvcm1hdCA9PSAyNCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNCwgMTYpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTEsIDEzKTtcclxuICAgICAgfVxyXG4gICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUlOVVRPUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgIGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE0ICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxNikge1xyXG4gICAgICAgIGNvbnN0IHZhbG9yQWN0dWFsOiBzdHJpbmcgPSB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSE7XHJcbiAgICAgICAgY29uc3QgbWludXRvc0FjdHVhbGVzOiBzdHJpbmcgPSB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTQsIDE2KTtcclxuICAgICAgICBpZiAobWludXRvc0FjdHVhbGVzID09IFwiLS1cIikge1xyXG4gICAgICAgICAgY29uc3QgbnVldm9WYWxvciA9IGAkeyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMCwgMTQpIH0keyBlLmtleS5wYWRTdGFydCgyLCAwKSB9JHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDE2KSB9YDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmhvdXJzQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgbWludXRlOiAvWzAtMV1bMC05XTpbMC02XVswLTldIFtBLFBdTS8udGVzdCh0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExKSlcclxuICAgICAgICAgICAgICA/IE51bWJlcih0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0oYDAxLzAxLzIwMjAgJHsgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkgfWAsIFwibW1cIikpXHJcbiAgICAgICAgICAgICAgOiBOdW1iZXIodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxNCwgMTYpKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgICAgaWYgKGUua2V5ID4gNSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT0gMTIpIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDE3LCAxOSk7XHJcbiAgICAgICAgICAgIGVsc2UgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB0aGlzLm9uRW1pdCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyKG1pbnV0b3NBY3R1YWxlcykgPD0gNSAmJiBOdW1iZXIobWludXRvc0FjdHVhbGVzKSA+IDAgJiYgdGhpcy5jb250YWRvciA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDE0KSB9JHsgTnVtYmVyKE51bWJlcihtaW51dG9zQWN0dWFsZXMpLnRvU3RyaW5nKCkgKyBOdW1iZXIoZS5rZXkpKSA+IDU5ID8gNTkgOiBOdW1iZXIobWludXRvc0FjdHVhbGVzKS50b1N0cmluZygpICsgTnVtYmVyKGUua2V5KVxyXG4gICAgICAgICAgICB9JHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDE2KSB9YDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgbGV0IG1pbnV0ZTtcclxuICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gdGhpcy5mb3JtYXQgPT0gMTIgPyAvWzAtMV1bMC05XTpbMC02XVswLTldIFtBLFBdTS8gOiAvWzAtMV1bMC05XTpbMC02XVswLTldLztcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG1pbnV0ZSA9IHJlZ2V4LnRlc3QodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMSkpXHJcbiAgICAgICAgICAgICAgPyBOdW1iZXIodGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGAwMS8wMS8yMDIwICR7IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTEpIH1gLCBcIm1tXCIpKVxyXG4gICAgICAgICAgICAgIDogTnVtYmVyKHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTQsIDE2KSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBtaW51dGUgPSBOdW1iZXIodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxNCwgMTYpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaG91cnNDb250cm9sLnNldFZhbHVlKHtcclxuICAgICAgICAgICAgLi4udGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgIG1pbnV0ZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvcisrO1xyXG4gICAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PSAxMikgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTcsIDE5KTtcclxuICAgICAgICAgIGVsc2UgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBudWV2b1ZhbG9yID0gYCR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygwLCAxNCkgfSR7IGUua2V5LnBhZFN0YXJ0KDIsIDApIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTYpIH1gO1xyXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuaG91cnNDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICBtaW51dGU6IC9bMC0xXVswLTldOlswLTZdWzAtOV0gW0EsUF1NLy50ZXN0KHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTEpKVxyXG4gICAgICAgICAgICAgID8gTnVtYmVyKHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShgMDEvMDEvMjAyMCAkeyB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExKSB9YCwgXCJtbVwiKSlcclxuICAgICAgICAgICAgICA6IE51bWJlcih0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDE0LCAxNikpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yKys7XHJcbiAgICAgICAgICBpZiAoTnVtYmVyKGUua2V5LnBhZFN0YXJ0KDIsIDApKSA+IDUgfHwgdGhpcy5jb250YWRvciA+IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09IDEyKSBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNywgMTkpO1xyXG4gICAgICAgICAgICBlbHNlIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDE0LCAxNik7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9IGVsc2UgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNCwgMTYpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PSBFVkVOVE9TIFRFQ0xBRE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgIGlmIChlLmtleSA9PSBcIkFycm93UmlnaHRcIikge1xyXG4gICAgICAgIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAwICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAyKSB7XHJcbiAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgzLCA1KTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMyAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT0gNSkge1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoNiwgMTApO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSA2ICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxMCkge1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTEsIDEzKTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMTEgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDEzKSB7XHJcbiAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNCwgMTYpO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAxNCAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT0gMTYpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PSAxMikgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTcsIDE5KTtcclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZm9ybWF0ID09IDI0KSB0aGlzLmJ0bk9wZW4/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMTcgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDE5KSB7XHJcbiAgICAgICAgICB0aGlzLmJ0bk9wZW4/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PSBcIkFycm93TGVmdFwiKSB7XHJcbiAgICAgICAgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDAgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDIpIHtcclxuICAgICAgICAgIHRoaXMuZ29CYWNrKCk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDMgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDUpIHtcclxuICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIDIpO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSA2ICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxMCkge1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMywgNSk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDExICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxMykge1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoNiwgMTApO1xyXG4gICAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAxNCAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT0gMTYpIHtcclxuICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDExLCAxMyk7XHJcbiAgICAgICAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE3ICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxOSkge1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChlLmtleS50b0xvd2VyQ2FzZSgpID09IFwiYVwiKSB7XHJcbiAgICAgICAgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE3ICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxOSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsb3JBY3R1YWwgPSB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwhLnN1YnN0cmluZygwLCAxNykgfUFNYDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmhvdXJzQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgaG91cjogTnVtYmVyKHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShgMDEvMDEvMjAyMCAkeyB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExKSB9YCwgXCJISFwiKSksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNywgMTkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChlLmtleS50b0xvd2VyQ2FzZSgpID09IFwicFwiKSB7XHJcbiAgICAgICAgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE3ICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxOSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsb3JBY3R1YWwgPSB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwhLnN1YnN0cmluZygwLCAxNykgfVBNYDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgICAgICAuLi50aGlzLmhvdXJzQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgaG91cjogTnVtYmVyKHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShgMDEvMDEvMjAyMCAkeyB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDExKSB9YCwgXCJISFwiKSksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNywgMTkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChlLmNvZGUgPT0gXCJTcGFjZVwiICYmIHRoaXMuYXV0b0NvbXBsZXRlKSB7XHJcbiAgICAgICAgY29uc3QgdmFsb3JBY3R1YWw6IHN0cmluZyA9IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlITtcclxuICAgICAgICBjb25zdCBkaWFBY3R1YWw6IHN0cmluZyA9IHRoaXMudG9kYXkuZGF5LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgbWVzQWN0dWFsOiBzdHJpbmcgPSB0aGlzLnRvZGF5Lm1vbnRoLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgYW5pb0FjdHVhbDogc3RyaW5nID0gdGhpcy50b2RheS55ZWFyLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29uc3QgaG9yYUFjdHVhbDogc3RyaW5nID0gRGF0ZVV0aWwudG9TdHJGb3JtYXQoRGF0ZVV0aWwubm93KCksIHRoaXMuZm9ybWF0ID09IDI0ID8gXCJNQVNLXzI0X0hPVVJTXCIgOiBcIk1BU0tfMTJfSE9VUlNcIik7XHJcbiAgICAgICAgY29uc3QgdDogc3RyaW5nID0gRGF0ZVV0aWwudG9TdHJGb3JtYXQoRGF0ZVV0aWwubm93KCksIFwiTUlEREFZX0lORElDQVRPUlwiKTtcclxuICAgICAgICBjb25zdCBtaW51dG9zQWN0dWFsZXM6IHN0cmluZyA9IERhdGVVdGlsLmdldE1pbnV0ZXMoRGF0ZVV0aWwubm93KCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpO1xyXG4gICAgICAgIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAwICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAyKSB7XHJcbiAgICAgICAgICBjb25zdCBudWV2b1ZhbG9yID0gYCR7IGRpYUFjdHVhbC5wYWRTdGFydCgyLCBcIjBcIikgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygyKSB9YDtcclxuICAgICAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKG51ZXZvVmFsb3IpO1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZShcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgZGF5OiB0aGlzLnRvZGF5LmRheSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgzLCA1KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDMgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDUpIHtcclxuICAgICAgICAgIGNvbnN0IG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDMpIH0keyBtZXNBY3R1YWwucGFkU3RhcnQoMiwgXCIwXCIpIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoNSkgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICAgIG1vbnRoOiB0aGlzLnRvZGF5Lm1vbnRoLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDYsIDEwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDYgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDEwKSB7XHJcbiAgICAgICAgICBjb25zdCBudWV2b1ZhbG9yID0gYCR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygwLCA2KSB9JHsgYW5pb0FjdHVhbC5wYWRTdGFydCg0LCBcIjBcIikgfSR7IHZhbG9yQWN0dWFsLnN1YnN0cmluZygxMCkgfWA7XHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yKTtcclxuICAgICAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICAgIHllYXI6IHRoaXMudG9kYXkueWVhcixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxMSwgMTMpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMTEgJiYgaW5wdXQuc2VsZWN0aW9uRW5kID09IDEzKSB7XHJcbiAgICAgICAgICBsZXQgbnVldm9WYWxvcjtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PSAyNCkgbnVldm9WYWxvciA9IGAkeyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMCwgMTEpIH0keyBob3JhQWN0dWFsIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTMpIH1gO1xyXG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5mb3JtYXQgPT0gMTIpXHJcbiAgICAgICAgICAgIG51ZXZvVmFsb3IgPSBgJHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDAsIDExKSB9JHsgaG9yYUFjdHVhbCB9JHsgdmFsb3JBY3R1YWwuc3Vic3RyaW5nKDEzLCAxNykgfSR7IHQudG9VcHBlckNhc2UoKSB9YDtcclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShudWV2b1ZhbG9yISk7XHJcbiAgICAgICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuaG91cnNDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICBtaW51dGU6IHRoaXMuaG91cnNDb250cm9sLnZhbHVlLm1pbnV0ZSAhPSBudWxsID8gdGhpcy5ob3Vyc0NvbnRyb2wudmFsdWUubWludXRlIDogMCxcclxuICAgICAgICAgICAgaG91cjogdGhpcy5mb3JtYXQgPT0gMTIgPyBOdW1iZXIoaG9yYUFjdHVhbCkgOiBOdW1iZXIoaG9yYUFjdHVhbCkgKyAxMixcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTQsIDE2KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE0ICYmIGlucHV0LnNlbGVjdGlvbkVuZCA9PSAxNikge1xyXG4gICAgICAgICAgY29uc3QgbnVldm9WYWxvciA9IGAkeyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMCwgMTQpIH0keyBtaW51dG9zQWN0dWFsZXMucGFkU3RhcnQoMiwgXCIwXCIpIH0keyB2YWxvckFjdHVhbC5zdWJzdHJpbmcoMTYpIH1gO1xyXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUobnVldm9WYWxvcik7XHJcbiAgICAgICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuaG91cnNDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgICBtaW51dGU6IE51bWJlcihtaW51dG9zQWN0dWFsZXMpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT0gMTIpIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDE3LCAxOSk7XHJcbiAgICAgICAgICBlbHNlIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDE0LCAxNik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25FbWl0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT0gXCJFbnRlclwiIHx8IGUua2V5ID09IFwiQXJyb3dEb3duXCIpIHtcclxuICAgICAgICB0aGlzLmdvTmV4dCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgICAgdGhpcy5nb0JhY2soKTtcclxuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PSBcIkRlbGV0ZVwiKSB7XHJcbiAgICAgICAgdGhpcy5saW1waWFyVG9kbygpO1xyXG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09IFwiQmFja3NwYWNlXCIpIHtcclxuICAgICAgICB0aGlzLmxpbXBpYXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ29OZXh0ICgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm5leHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmICh0aGlzLm5leHQuZGlzYWJsZWQgfHwgdGhpcy5uZXh0LnJlYWRvbmx5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMubmV4dElzRGlzYWJsZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMubmV4dElzRGlzYWJsZS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5leHQuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubmV4dElzRGlzYWJsZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLm5leHRJc0Rpc2FibGUuZm9jdXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9uTmV4dC5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvQmFjayAoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5iYWNrICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5iYWNrLmRpc2FibGVkIHx8IHRoaXMuYmFjay5yZWFkb25seSkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhY2tJc0Rpc2FibGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmJhY2tJc0Rpc2FibGUuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5iYWNrLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmJhY2tJc0Rpc2FibGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5iYWNrSXNEaXNhYmxlLmZvY3VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vbkJhY2suZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsaW1waWFyVG9kbyAoKSB7XHJcbiAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgIHRoaXMuaG91cnNDb250cm9sLnNldFZhbHVlKFxyXG4gICAgICB7XHJcbiAgICAgICAgaG91cjogbnVsbCxcclxuICAgICAgICBtaW51dGU6IG51bGwsXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5kYXRlQ29udHJvbC5zZXRWYWx1ZShcclxuICAgICAge1xyXG4gICAgICAgIHllYXI6IG51bGwsXHJcbiAgICAgICAgbW9udGg6IG51bGwsXHJcbiAgICAgICAgZGF5OiBudWxsLFxyXG4gICAgICB9LFxyXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgKTtcclxuICAgIGlmICh0aGlzLmZvcm1hdCA9PSAxMikgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUoXCJkZC9tbS95eXl5IC0tOi0tIC0tXCIpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5mb3JtYXQgPT0gMjQpIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKFwiZGQvbW0veXl5eSAtLTotLVwiKTtcclxuICAgIHRoaXMuaW5wdXREYXRlVGltZS5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDAsIDIpO1xyXG4gICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICAgIHRoaXMub25Ub3VjaCgpO1xyXG4gIH1cclxuXHJcbiAgbGltcGlhciAoKSB7XHJcbiAgICBpZiAodGhpcy5pbnB1dERhdGVUaW1lLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPT0gMCAmJiB0aGlzLmlucHV0RGF0ZVRpbWUubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPT0gMikge1xyXG4gICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICBkYXk6IG51bGwsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShgZGQkeyB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDIpIH1gKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICAgICAgdGhpcy5vblRvdWNoKCk7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRlVGltZS5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDAsIDIpO1xyXG4gICAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dERhdGVUaW1lLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPT0gMyAmJiB0aGlzLmlucHV0RGF0ZVRpbWUubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPT0gNSkge1xyXG4gICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICBtb250aDogbnVsbCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZGF0ZVRpbWVDb250cm9sLnNldFZhbHVlKGAkeyB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDAsIDMpIH1tbSR7IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoNSkgfWApO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xyXG4gICAgICB0aGlzLm9uVG91Y2goKTtcclxuICAgICAgdGhpcy5pbnB1dERhdGVUaW1lLm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMywgNSk7XHJcbiAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlucHV0RGF0ZVRpbWUubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9PSA2ICYmIHRoaXMuaW5wdXREYXRlVGltZS5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9PSAxMCkge1xyXG4gICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICB5ZWFyOiBudWxsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgKTtcclxuICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUoYCR7IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMCwgNikgfXl5eXkkeyB0aGlzLmRhdGVUaW1lQ29udHJvbC52YWx1ZSEuc3Vic3RyaW5nKDEwKSB9YCk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XHJcbiAgICAgIHRoaXMub25Ub3VjaCgpO1xyXG4gICAgICB0aGlzLmlucHV0RGF0ZVRpbWUubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSg2LCAxMCk7XHJcbiAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlucHV0RGF0ZVRpbWUubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9PSAxMSAmJiB0aGlzLmlucHV0RGF0ZVRpbWUubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPT0gMTMpIHtcclxuICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLi4udGhpcy5kYXRlQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgIGhvdXI6IG51bGwsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZShgJHsgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygwLCAxMSkgfS0tJHsgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUhLnN1YnN0cmluZygxMykgfWApO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xyXG4gICAgICB0aGlzLm9uVG91Y2goKTtcclxuICAgICAgdGhpcy5pbnB1dERhdGVUaW1lLm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMTEsIDEzKTtcclxuICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5wdXREYXRlVGltZS5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID09IDE0ICYmIHRoaXMuaW5wdXREYXRlVGltZS5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9PSAxNikge1xyXG4gICAgICB0aGlzLmhvdXJzQ29udHJvbC5zZXRWYWx1ZShcclxuICAgICAgICB7XHJcbiAgICAgICAgICAuLi50aGlzLmRhdGVDb250cm9sLnZhbHVlLFxyXG4gICAgICAgICAgbWludXRlOiBudWxsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgKTtcclxuICAgICAgdGhpcy5kYXRlVGltZUNvbnRyb2wuc2V0VmFsdWUoYCR7IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMCwgMTQpIH0tLSR7IHRoaXMuZGF0ZVRpbWVDb250cm9sLnZhbHVlIS5zdWJzdHJpbmcoMTYpIH1gKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICAgICAgdGhpcy5vblRvdWNoKCk7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRlVGltZS5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKDE0LCAxNik7XHJcbiAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcmV2ZW50RGVmYXVsdCAoZTogYW55KSB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrIChlOiBFdmVudCwgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAwIHx8IGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDEgfHwgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMikge1xyXG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMik7XHJcbiAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfSBlbHNlIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAzIHx8IGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDQgfHwgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gNSkge1xyXG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMywgNSk7XHJcbiAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gNiB8fFxyXG4gICAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSA3IHx8XHJcbiAgICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDggfHxcclxuICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gOSB8fFxyXG4gICAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAxMFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSg2LCAxMCk7XHJcbiAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfSBlbHNlIGlmIChpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAxMSB8fCBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAxMiB8fCBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PSAxMykge1xyXG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMTEsIDEzKTtcclxuICAgICAgICB0aGlzLmNvbnRhZG9yID0gMDtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgIH0sIDEwMCk7XHJcbiAgICB9IGVsc2UgaWYgKGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE0IHx8IGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE1IHx8IGlucHV0LnNlbGVjdGlvblN0YXJ0ID09IDE2KSB7XHJcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxNCwgMTYpO1xyXG4gICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcclxuICAgICAgfSwgMTAwKTtcclxuICAgIH0gZWxzZSBpZiAoaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMTcgfHwgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMTggfHwgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMTkpIHtcclxuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDE3LCAxOSk7XHJcbiAgICAgICAgdGhpcy5jb250YWRvciA9IDA7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKDAsIDIpO1xyXG4gICAgICAgIHRoaXMuY29udGFkb3IgPSAwO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcclxuICAgICAgfSwgMTAwKTtcclxuICAgIH1cclxuICB9XHJcbiAgb3BlbiAoZDogTmdiSW5wdXREYXRlcGlja2VyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUgPT0gXCJkZC9tbS95eXl5IC0tOi0tIC0tXCIgfHwgdGhpcy5kYXRlVGltZUNvbnRyb2wudmFsdWUgPT0gXCJkZC9tbS95eXl5IC0tOi0tXCIpIHtcclxuICAgICAgdGhpcy5ob3Vyc0NvbnRyb2wuc2V0VmFsdWUoe1xyXG4gICAgICAgIGhvdXI6IG5ldyBEYXRlKCkuZ2V0SG91cnMoKSxcclxuICAgICAgICBtaW51dGU6IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpLFxyXG4gICAgICAgIHNlY29uZDogbmV3IERhdGUoKS5nZXRTZWNvbmRzKCksXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKHtcclxuICAgICAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgbW9udGg6IG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDEsXHJcbiAgICAgICAgZGF5OiBuZXcgRGF0ZSgpLmdldERhdGUoKSxcclxuICAgICAgICAuLi50aGlzLmhvdXJzQ29udHJvbC52YWx1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGVUaW1lTW9kZWwoT2JqZWN0LmFzc2lnbih0aGlzLmRhdGVDb250cm9sLnZhbHVlLCB0aGlzLmhvdXJzQ29udHJvbC52YWx1ZSkpO1xyXG4gICAgICB0aGlzLmRhdGVUaW1lQ29udHJvbC5zZXRWYWx1ZSh0aGlzLl9kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUudG9TdHJpbmcoKSwgdGhpcy5zdHJpbmdGb3JtYXQpKTtcclxuICAgICAgdGhpcy5vbkVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvY3VzT3V0IChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmFyaWFMYWJlbCA9PSBcIk1pbnV0ZXNcIikge1xyXG4gICAgICB0aGlzLm5nYkRhdGVwaWNrZXI/LmNsb3NlKCk7XHJcbiAgICAgIGlmICh0aGlzLmdvTmV4dFdoZW5TZWxlY3QpIHtcclxuICAgICAgICB0aGlzLmdvTmV4dCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuXCI+XHJcbiAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbCAhPSBudWxsICYmIGxhYmVsICE9ICcnICYmIHNob3dMYWJlbFwiIGNsYXNzPVwiZC1mbGV4IHN1bWF4LWxhYmVsIG1iLTAgcC0wXCJcclxuICAgICAgPjxzcGFuIFt0aXRsZV09XCJsYWJlbFwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXNcIj57eyBsYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJyZXF1aXJlZFwiIGNsYXNzPVwibXMtMVwiIFtjbGFzcy50ZXh0LWRhbmdlcl09XCJjb250cm9scz8uZXJyb3JzICE9IG51bGxcIj4gKjwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJsYWJlbEluZm9cIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSB0ZXh0LWluZm8gbXMtMlwiIFttYXRUb29sdGlwXT1cInRleHRMYWJlbEluZm9cIiBtYXRUb29sdGlwQ2xhc3M9XCJiZy1pbmZvXCI+PC9pPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHBvc2l0aW9uLWFic29sdXRlXCJcclxuICAgICAgY29udGFpbmVyPVwiYm9keVwiXHJcbiAgICAgIGlkPVwiZmFrZUlucHV0XCJcclxuICAgICAgbmdiRGF0ZXBpY2tlclxyXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiZGF0ZUNvbnRyb2xcIlxyXG4gICAgICBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXHJcbiAgICAgIFtmb290ZXJUZW1wbGF0ZV09XCJmb290ZXJUZW1wbGF0ZVwiXHJcbiAgICAgICNkMj1cIm5nYkRhdGVwaWNrZXJcIiAvPlxyXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICByZWFkb25seVxyXG4gICAgICAgIGlkPVwiaW5wdXREYXRlVGltZVwiXHJcbiAgICAgICAgI2lucHV0RGF0ZVRpbWVcclxuICAgICAgICBzdHlsZT1cImZsZXg6IDFcIlxyXG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImNvbnRyb2xzPy5lcnJvcnMgIT0gbnVsbCAmJiAoY29udHJvbHM/LmRpcnR5IHx8IGNvbnRyb2xzPy50b3VjaGVkKSAmJiBzdWJtaXR0ZWRcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCJcclxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXHJcbiAgICAgICAgKGZvY3Vzb3V0KT1cImZvY3VzT3V0SW5wdXQoKVwiXHJcbiAgICAgICAgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgKGRibGNsaWNrKT1cInByZXZlbnREZWZhdWx0KCRldmVudClcIlxyXG4gICAgICAgIChjbGljayk9XCJwcmV2ZW50RGVmYXVsdCgkZXZlbnQpXCJcclxuICAgICAgICAobW91c2V1cCk9XCJvbkNsaWNrKCRldmVudCwgaW5wdXREYXRlVGltZSlcIlxyXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJkYXRlVGltZUNvbnRyb2xcIiAvPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgI2J0bk9wZW5cclxuICAgICAgICAgIChrZXl1cC5BcnJvd0xlZnQpPVwiZ29CYWNrKClcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcclxuICAgICAgICAgIChrZXl1cC5BcnJvd1JpZ2h0KT1cImNsZWFyYWJsZSA/IGJ0bkNsZWFuLmZvY3VzKCkgOiBnb05leHQoKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4taW5mbyBwLTAgcm91bmRlZC0wIHVzZS1idXR0b25cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImQyLnRvZ2dsZSgpOyBvcGVuKGQyKVwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICA8aSBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIHRleHQtbGlnaHQgcHgtMVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAjYnRuQ2xlYW5cclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgcC0wIHJvdW5kZWQtMCBsaW1waWFyXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwibGltcGlhclRvZG8oKVwiXHJcbiAgICAgICAgICAoa2V5dXAuQXJyb3dMZWZ0KT1cImJ0bk9wZW4uZm9jdXMoKVwiXHJcbiAgICAgICAgICAoa2V5dXAuQXJyb3dSaWdodCk9XCJnb05leHQoKVwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cInRleHQtd2hpdGUgcHQtMVwiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiIFttYXRUb29sdGlwXT1cIidMaW1waWFyJ1wiIG1hdFRvb2x0aXBDbGFzcz1cImJnLWRhbmdlclwiPmNsb3NlPC9tYXQtaWNvbj4gLS0+XHJcbiAgICAgICAgICA8aSBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImZhIGZhLXRpbWVzIHB4LTEgdGV4dC1saWdodFwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBjb250YWluZXItdG9vbHRpcG1lc3NhZ2VcIj5cclxuICAgICAgICA8dG9vbHRpcC1tZXNzYWdlXHJcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NvbnRyb2xzXT1cImNvbnRyb2xzXCJcclxuICAgICAgICAgIFt2YWxpZGF0b3JNZXNzYWdlXT1cInZhbGlkYXRvck1lc3NhZ2VcIlxyXG4gICAgICAgICAgW3Rvb2x0aXBNZXNzYWdlXT1cInRvb2x0aXBNZXNzYWdlXCJcclxuICAgICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCI+PC90b29sdGlwLW1lc3NhZ2U+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZXJyb3ItbWVzc2FnZVxyXG4gICAgICBbbGFiZWxdPVwibGFiZWxcIlxyXG4gICAgICBbY29udHJvbHNdPVwiY29udHJvbHNcIlxyXG4gICAgICBbdmFsaWRhdG9yTWVzc2FnZV09XCJ2YWxpZGF0b3JNZXNzYWdlXCJcclxuICAgICAgW3Rvb2x0aXBNZXNzYWdlXT1cInRvb2x0aXBNZXNzYWdlXCJcclxuICAgICAgW3N1Ym1pdHRlZF09XCJzdWJtaXR0ZWRcIj48L2Vycm9yLW1lc3NhZ2U+XHJcbiAgICA8bmctdGVtcGxhdGUgI2Zvb3RlclRlbXBsYXRlPlxyXG4gICAgICA8bmdiLXRpbWVwaWNrZXIgW2Zvcm1Db250cm9sXT1cImhvdXJzQ29udHJvbFwiIFttZXJpZGlhbl09XCJmb3JtYXQgPT0gMTIgPyB0cnVlIDogZmFsc2VcIiAoZm9jdXNvdXQpPVwiZm9jdXNPdXQoJGV2ZW50KVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19