@skyux/datetime 8.6.0 → 9.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/documentation.json +8 -8
  2. package/esm2022/lib/modules/date-pipe/date-format-utility.mjs +45 -0
  3. package/{esm2020 → esm2022}/lib/modules/date-pipe/date-pipe.module.mjs +5 -5
  4. package/esm2022/lib/modules/date-pipe/date.pipe.mjs +67 -0
  5. package/esm2022/lib/modules/date-pipe/fuzzy-date.pipe.mjs +47 -0
  6. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker-end-date-resource-key.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker-start-date-resource-key.pipe.mjs +4 -4
  8. package/esm2022/lib/modules/date-range-picker/date-range-picker.component.mjs +518 -0
  9. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker.module.mjs +19 -19
  10. package/esm2022/lib/modules/date-range-picker/date-range.service.mjs +97 -0
  11. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator.mjs +54 -0
  12. package/esm2022/lib/modules/datepicker/date-formatter.mjs +38 -0
  13. package/esm2022/lib/modules/datepicker/datepicker-adapter.service.mjs +23 -0
  14. package/esm2022/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +332 -0
  15. package/esm2022/lib/modules/datepicker/datepicker-calendar.component.mjs +95 -0
  16. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-config.service.mjs +4 -4
  17. package/esm2022/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +487 -0
  18. package/esm2022/lib/modules/datepicker/datepicker-input.directive.mjs +534 -0
  19. package/esm2022/lib/modules/datepicker/datepicker.component.mjs +327 -0
  20. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker.module.mjs +35 -35
  21. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker.service.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/modules/datepicker/daypicker-button.component.mjs +4 -4
  23. package/esm2022/lib/modules/datepicker/daypicker-cell.component.mjs +128 -0
  24. package/esm2022/lib/modules/datepicker/daypicker.component.mjs +224 -0
  25. package/esm2022/lib/modules/datepicker/fuzzy-date.service.mjs +412 -0
  26. package/esm2022/lib/modules/datepicker/monthpicker.component.mjs +80 -0
  27. package/{esm2020 → esm2022}/lib/modules/datepicker/yearpicker.component.mjs +53 -54
  28. package/{esm2020 → esm2022}/lib/modules/shared/sky-datetime-resources.module.mjs +11 -11
  29. package/esm2022/lib/modules/timepicker/timepicker.component.mjs +396 -0
  30. package/esm2022/lib/modules/timepicker/timepicker.directive.mjs +237 -0
  31. package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker.module.mjs +17 -17
  32. package/esm2022/testing/datepicker-fixture.mjs +55 -0
  33. package/esm2022/testing/timepicker-fixture.mjs +52 -0
  34. package/fesm2022/skyux-datetime-testing.mjs +112 -0
  35. package/{fesm2020 → fesm2022}/skyux-datetime-testing.mjs.map +1 -1
  36. package/fesm2022/skyux-datetime.mjs +5030 -0
  37. package/fesm2022/skyux-datetime.mjs.map +1 -0
  38. package/lib/modules/date-range-picker/date-range-picker.component.d.ts +1 -1
  39. package/lib/modules/datepicker/datepicker-calendar-inner.component.d.ts +1 -1
  40. package/lib/modules/datepicker/datepicker-calendar.component.d.ts +1 -1
  41. package/lib/modules/datepicker/datepicker-input-fuzzy.directive.d.ts +1 -1
  42. package/lib/modules/datepicker/datepicker-input.directive.d.ts +1 -1
  43. package/lib/modules/datepicker/datepicker.component.d.ts +1 -1
  44. package/lib/modules/datepicker/daypicker-button.component.d.ts +1 -1
  45. package/lib/modules/datepicker/daypicker-cell.component.d.ts +1 -1
  46. package/lib/modules/datepicker/daypicker.component.d.ts +1 -1
  47. package/lib/modules/timepicker/timepicker.directive.d.ts +1 -1
  48. package/package.json +19 -27
  49. package/esm2020/lib/modules/date-pipe/date-format-utility.mjs +0 -45
  50. package/esm2020/lib/modules/date-pipe/date.pipe.mjs +0 -70
  51. package/esm2020/lib/modules/date-pipe/fuzzy-date.pipe.mjs +0 -50
  52. package/esm2020/lib/modules/date-range-picker/date-range-picker.component.mjs +0 -494
  53. package/esm2020/lib/modules/date-range-picker/date-range.service.mjs +0 -100
  54. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator.mjs +0 -53
  55. package/esm2020/lib/modules/datepicker/date-formatter.mjs +0 -38
  56. package/esm2020/lib/modules/datepicker/datepicker-adapter.service.mjs +0 -26
  57. package/esm2020/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +0 -333
  58. package/esm2020/lib/modules/datepicker/datepicker-calendar.component.mjs +0 -96
  59. package/esm2020/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +0 -462
  60. package/esm2020/lib/modules/datepicker/datepicker-input.directive.mjs +0 -496
  61. package/esm2020/lib/modules/datepicker/datepicker.component.mjs +0 -319
  62. package/esm2020/lib/modules/datepicker/daypicker-cell.component.mjs +0 -126
  63. package/esm2020/lib/modules/datepicker/daypicker.component.mjs +0 -216
  64. package/esm2020/lib/modules/datepicker/fuzzy-date.service.mjs +0 -392
  65. package/esm2020/lib/modules/datepicker/monthpicker.component.mjs +0 -81
  66. package/esm2020/lib/modules/timepicker/timepicker.component.mjs +0 -389
  67. package/esm2020/lib/modules/timepicker/timepicker.directive.mjs +0 -236
  68. package/esm2020/testing/datepicker-fixture.mjs +0 -58
  69. package/esm2020/testing/timepicker-fixture.mjs +0 -55
  70. package/fesm2015/skyux-datetime-testing.mjs +0 -117
  71. package/fesm2015/skyux-datetime-testing.mjs.map +0 -1
  72. package/fesm2015/skyux-datetime.mjs +0 -4925
  73. package/fesm2015/skyux-datetime.mjs.map +0 -1
  74. package/fesm2020/skyux-datetime-testing.mjs +0 -117
  75. package/fesm2020/skyux-datetime.mjs +0 -4895
  76. package/fesm2020/skyux-datetime.mjs.map +0 -1
  77. /package/{esm2020 → esm2022}/index.mjs +0 -0
  78. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculation.mjs +0 -0
  79. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +0 -0
  80. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +0 -0
  86. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-relative-value.mjs +0 -0
  87. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range.mjs +0 -0
  88. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-calendar-change.mjs +0 -0
  89. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-custom-date.mjs +0 -0
  90. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-date.mjs +0 -0
  91. /package/{esm2020 → esm2022}/lib/modules/datepicker/fuzzy-date.mjs +0 -0
  92. /package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker-time-format-type.mjs +0 -0
  93. /package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker-time-output.mjs +0 -0
  94. /package/{esm2020 → esm2022}/skyux-datetime.mjs +0 -0
  95. /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
  96. /package/{esm2020 → esm2022}/testing/skyux-datetime-testing.mjs +0 -0
@@ -1,462 +0,0 @@
1
- var _SkyFuzzyDatepickerInputDirective_instances, _SkyFuzzyDatepickerInputDirective_value_get, _SkyFuzzyDatepickerInputDirective_value_set, _SkyFuzzyDatepickerInputDirective_control, _SkyFuzzyDatepickerInputDirective_dateFormatter, _SkyFuzzyDatepickerInputDirective_locale, _SkyFuzzyDatepickerInputDirective_preferredShortDateFormat, _SkyFuzzyDatepickerInputDirective_ngUnsubscribe, _SkyFuzzyDatepickerInputDirective__futureDisabled, _SkyFuzzyDatepickerInputDirective__dateFormat, _SkyFuzzyDatepickerInputDirective__disabled, _SkyFuzzyDatepickerInputDirective__maxDate, _SkyFuzzyDatepickerInputDirective__minDate, _SkyFuzzyDatepickerInputDirective__startingDay, _SkyFuzzyDatepickerInputDirective__value, _SkyFuzzyDatepickerInputDirective__yearRequired, _SkyFuzzyDatepickerInputDirective_changeDetector, _SkyFuzzyDatepickerInputDirective_configService, _SkyFuzzyDatepickerInputDirective_elementRef, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, _SkyFuzzyDatepickerInputDirective_renderer, _SkyFuzzyDatepickerInputDirective_resourcesService, _SkyFuzzyDatepickerInputDirective_datepickerComponent, _SkyFuzzyDatepickerInputDirective_onValueChange, _SkyFuzzyDatepickerInputDirective_setInputElementValue, _SkyFuzzyDatepickerInputDirective_getMaxDate, _SkyFuzzyDatepickerInputDirective_getMinDate, _SkyFuzzyDatepickerInputDirective_fuzzyDatesEqual, _SkyFuzzyDatepickerInputDirective_onChange, _SkyFuzzyDatepickerInputDirective_onTouched, _SkyFuzzyDatepickerInputDirective_onValidatorChange, _SkyFuzzyDatepickerInputDirective_updateValue;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import { Directive, HostListener, Input, Optional, forwardRef, } from '@angular/core';
4
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
5
- import { Subject } from 'rxjs';
6
- import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
7
- import { SkyDateFormatter } from './date-formatter';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "./datepicker-config.service";
10
- import * as i2 from "./fuzzy-date.service";
11
- import * as i3 from "@skyux/i18n";
12
- import * as i4 from "./datepicker.component";
13
- const SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR = {
14
- provide: NG_VALUE_ACCESSOR,
15
- useExisting: forwardRef(() => SkyFuzzyDatepickerInputDirective),
16
- multi: true,
17
- };
18
- const SKY_FUZZY_DATEPICKER_VALIDATOR = {
19
- provide: NG_VALIDATORS,
20
- useExisting: forwardRef(() => SkyFuzzyDatepickerInputDirective),
21
- multi: true,
22
- };
23
- export class SkyFuzzyDatepickerInputDirective {
24
- /**
25
- * The date format for the input. Place this attribute on the `input` element
26
- * to override the default in `SkyDatepickerConfigService`.
27
- * @default "MM/DD/YYYY"
28
- */
29
- set dateFormat(value) {
30
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__dateFormat, value, "f");
31
- if (__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "a", _SkyFuzzyDatepickerInputDirective_value_get)) {
32
- const formattedDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").format(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "a", _SkyFuzzyDatepickerInputDirective_value_get), this.dateFormat, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_locale, "f"));
33
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_setInputElementValue).call(this, formattedDate);
34
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_changeDetector, "f").markForCheck();
35
- }
36
- }
37
- // TODO: Refactor to not have getter logic
38
- get dateFormat() {
39
- return (__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__dateFormat, "f") ||
40
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_configService, "f").dateFormat ||
41
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_preferredShortDateFormat, "f"));
42
- }
43
- /**
44
- * Whether to disable the datepicker on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
45
- * To set the disabled state on reactive forms, use the `FormControl` instead.
46
- * @default false
47
- */
48
- set disabled(value) {
49
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__disabled, value, "f");
50
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, "f").disabled = value;
51
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_renderer, "f").setProperty(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_elementRef, "f").nativeElement, 'disabled', value);
52
- }
53
- get disabled() {
54
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__disabled, "f");
55
- }
56
- /**
57
- * Whether to prevent users from specifying dates that are in the future.
58
- * Place this attribute on the `input` element.
59
- * @default false
60
- */
61
- set futureDisabled(value) {
62
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__futureDisabled, value, "f");
63
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onValidatorChange, "f").call(this);
64
- }
65
- get futureDisabled() {
66
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__futureDisabled, "f");
67
- }
68
- /**
69
- * The latest fuzzy date allowed. Place this attribute on the `input` element
70
- * to prevent fuzzy dates after a specified date. This property accepts
71
- * a `SkyFuzzyDate` value that includes numeric month, day, and year values.
72
- * For example: `{ month: 1, day: 1, year: 2027 }`.
73
- */
74
- set maxDate(value) {
75
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__maxDate, value, "f");
76
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, "f").maxDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_getMaxDate).call(this);
77
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onValidatorChange, "f").call(this);
78
- }
79
- get maxDate() {
80
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__maxDate, "f");
81
- }
82
- /**
83
- * The earliest fuzzy date allowed. Place this attribute on the `input` element
84
- * to prevent fuzzy dates before a specified date. This property accepts a `SkyFuzzyDate` value
85
- * that includes numeric month, day, and year values.
86
- * For example: `{ month: 1, day: 1, year: 2007 }`.
87
- */
88
- set minDate(value) {
89
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__minDate, value, "f");
90
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, "f").minDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_getMinDate).call(this);
91
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onValidatorChange, "f").call(this);
92
- }
93
- get minDate() {
94
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__minDate, "f");
95
- }
96
- /**
97
- * The starting day of the week in the calendar, where `0` sets the starting day
98
- * to Sunday. Place this attribute on the `input` element to override the default
99
- * in `SkyDatepickerConfigService`.
100
- * @default 0
101
- */
102
- set startingDay(value) {
103
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__startingDay, value, "f");
104
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, "f").startingDay = this.startingDay;
105
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onValidatorChange, "f").call(this);
106
- }
107
- // TODO: Refactor to not have getter logic
108
- get startingDay() {
109
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__startingDay, "f") || __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_configService, "f").startingDay;
110
- }
111
- /**
112
- * Whether to require the year in fuzzy dates.
113
- * @default false
114
- */
115
- set yearRequired(value) {
116
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__yearRequired, value, "f");
117
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onValidatorChange, "f").call(this);
118
- }
119
- get yearRequired() {
120
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__yearRequired, "f");
121
- }
122
- constructor(changeDetector, configService, elementRef, fuzzyDateService, localeProvider, renderer, resourcesService, datepickerComponent) {
123
- _SkyFuzzyDatepickerInputDirective_instances.add(this);
124
- /**
125
- * Whether to disable date validation on the fuzzy datepicker input.
126
- * @default false
127
- */
128
- this.skyDatepickerNoValidate = false;
129
- _SkyFuzzyDatepickerInputDirective_control.set(this, void 0);
130
- _SkyFuzzyDatepickerInputDirective_dateFormatter.set(this, new SkyDateFormatter());
131
- _SkyFuzzyDatepickerInputDirective_locale.set(this, void 0);
132
- _SkyFuzzyDatepickerInputDirective_preferredShortDateFormat.set(this, void 0);
133
- _SkyFuzzyDatepickerInputDirective_ngUnsubscribe.set(this, new Subject());
134
- _SkyFuzzyDatepickerInputDirective__futureDisabled.set(this, false);
135
- _SkyFuzzyDatepickerInputDirective__dateFormat.set(this, void 0);
136
- _SkyFuzzyDatepickerInputDirective__disabled.set(this, false);
137
- _SkyFuzzyDatepickerInputDirective__maxDate.set(this, void 0);
138
- _SkyFuzzyDatepickerInputDirective__minDate.set(this, void 0);
139
- _SkyFuzzyDatepickerInputDirective__startingDay.set(this, void 0);
140
- _SkyFuzzyDatepickerInputDirective__value.set(this, void 0);
141
- _SkyFuzzyDatepickerInputDirective__yearRequired.set(this, false);
142
- _SkyFuzzyDatepickerInputDirective_changeDetector.set(this, void 0);
143
- _SkyFuzzyDatepickerInputDirective_configService.set(this, void 0);
144
- _SkyFuzzyDatepickerInputDirective_elementRef.set(this, void 0);
145
- _SkyFuzzyDatepickerInputDirective_fuzzyDateService.set(this, void 0);
146
- _SkyFuzzyDatepickerInputDirective_renderer.set(this, void 0);
147
- _SkyFuzzyDatepickerInputDirective_resourcesService.set(this, void 0);
148
- _SkyFuzzyDatepickerInputDirective_datepickerComponent.set(this, void 0);
149
- // eslint-disable-next-line @typescript-eslint/no-empty-function
150
- // istanbul ignore next
151
- _SkyFuzzyDatepickerInputDirective_onChange.set(this, (_) => { });
152
- // eslint-disable-next-line @typescript-eslint/no-empty-function
153
- // istanbul ignore next
154
- _SkyFuzzyDatepickerInputDirective_onTouched.set(this, () => { });
155
- // eslint-disable-next-line @typescript-eslint/no-empty-function
156
- // istanbul ignore next
157
- _SkyFuzzyDatepickerInputDirective_onValidatorChange.set(this, () => { });
158
- if (!datepickerComponent) {
159
- throw new Error('You must wrap the `skyFuzzyDatepickerInput` directive within a ' +
160
- '`<sky-datepicker>` component!');
161
- }
162
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_changeDetector, changeDetector, "f");
163
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_configService, configService, "f");
164
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_elementRef, elementRef, "f");
165
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, fuzzyDateService, "f");
166
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_renderer, renderer, "f");
167
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_resourcesService, resourcesService, "f");
168
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, datepickerComponent, "f");
169
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_locale, localeProvider.defaultLocale, "f");
170
- localeProvider
171
- .getLocaleInfo()
172
- .pipe(takeUntil(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_ngUnsubscribe, "f")))
173
- .subscribe((localeInfo) => {
174
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_locale, localeInfo.locale, "f");
175
- SkyDateFormatter.setLocale(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_locale, "f"));
176
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_preferredShortDateFormat, SkyDateFormatter.getPreferredShortDateFormat(), "f");
177
- });
178
- }
179
- ngOnInit() {
180
- if (this.yearRequired) {
181
- if (this.dateFormat?.toLowerCase().indexOf('y') === -1) {
182
- throw new Error('You have configured conflicting settings. Year is required and dateFormat does not include year.');
183
- }
184
- }
185
- const element = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_elementRef, "f").nativeElement;
186
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_renderer, "f").addClass(element, 'sky-form-control');
187
- const hasAriaLabel = element.getAttribute('aria-label');
188
- /* istanbul ignore else */
189
- if (!hasAriaLabel) {
190
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_resourcesService, "f")
191
- .getString('skyux_date_field_default_label')
192
- .pipe(takeUntil(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_ngUnsubscribe, "f")))
193
- .subscribe((value) => {
194
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_renderer, "f").setAttribute(element, 'aria-label', value);
195
- });
196
- }
197
- }
198
- ngAfterContentInit() {
199
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, "f").dateChange
200
- .pipe(distinctUntilChanged(), takeUntil(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_ngUnsubscribe, "f")))
201
- .subscribe((value) => {
202
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_instances, value, "a", _SkyFuzzyDatepickerInputDirective_value_set);
203
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onTouched, "f").call(this);
204
- });
205
- }
206
- ngAfterViewInit() {
207
- // This is needed to address a bug in Angular 4.
208
- // When a control value is set initially, its value is not represented on the view.
209
- // See: https://github.com/angular/angular/issues/13792
210
- // Of note is the parent check which allows us to determine if the form is reactive.
211
- // Without this check there is a changed before checked error
212
- /* istanbul ignore else */
213
- if (__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f") && __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f").parent) {
214
- setTimeout(() => {
215
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f")?.setValue(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "a", _SkyFuzzyDatepickerInputDirective_value_get), {
216
- emitEvent: false,
217
- });
218
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_changeDetector, "f").markForCheck();
219
- });
220
- }
221
- }
222
- ngOnDestroy() {
223
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_ngUnsubscribe, "f").next();
224
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_ngUnsubscribe, "f").complete();
225
- }
226
- onInputChange(event) {
227
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_onValueChange).call(this, event.target.value);
228
- }
229
- onInputBlur() {
230
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onTouched, "f").call(this);
231
- const formattedDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").format(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "a", _SkyFuzzyDatepickerInputDirective_value_get), this.dateFormat, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_locale, "f"));
232
- if (__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f")?.valid) {
233
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_setInputElementValue).call(this, formattedDate);
234
- }
235
- }
236
- onInput() {
237
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f")?.markAsDirty();
238
- }
239
- writeValue(value) {
240
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_updateValue).call(this, value, false);
241
- }
242
- validate(control) {
243
- if (!__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f")) {
244
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_control, control, "f");
245
- }
246
- if (this.skyDatepickerNoValidate) {
247
- return null;
248
- }
249
- if (!__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f").value) {
250
- return null;
251
- }
252
- const value = control.value;
253
- let fuzzyDate;
254
- let validationError = null;
255
- if (typeof value === 'string') {
256
- fuzzyDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getFuzzyDateFromString(value, this.dateFormat);
257
- }
258
- else {
259
- fuzzyDate = value;
260
- }
261
- if (!fuzzyDate) {
262
- validationError = {
263
- skyFuzzyDate: {
264
- invalid: value,
265
- },
266
- };
267
- }
268
- else {
269
- if (!fuzzyDate.year && this.yearRequired) {
270
- validationError = {
271
- skyFuzzyDate: {
272
- yearRequired: value,
273
- },
274
- };
275
- }
276
- if (!validationError && fuzzyDate.year) {
277
- let fuzzyDateRange;
278
- if (this.maxDate) {
279
- fuzzyDateRange = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getFuzzyDateRange(fuzzyDate, this.maxDate);
280
- if (!fuzzyDateRange.valid) {
281
- validationError = {
282
- skyFuzzyDate: {
283
- maxDate: value,
284
- },
285
- };
286
- }
287
- }
288
- if (!validationError && this.minDate) {
289
- fuzzyDateRange = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getFuzzyDateRange(this.minDate, fuzzyDate);
290
- if (!fuzzyDateRange.valid) {
291
- validationError = {
292
- skyFuzzyDate: {
293
- minDate: value,
294
- },
295
- };
296
- }
297
- }
298
- if (!validationError && this.futureDisabled) {
299
- fuzzyDateRange = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getFuzzyDateRange(fuzzyDate, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getCurrentFuzzyDate());
300
- if (!fuzzyDateRange.valid) {
301
- validationError = {
302
- skyFuzzyDate: {
303
- futureDisabled: value,
304
- },
305
- };
306
- }
307
- }
308
- }
309
- }
310
- if (validationError) {
311
- // Mark the invalid control as touched so that the input's invalid CSS styles appear.
312
- // (This is only required when the invalid value is set by the FormControl constructor.)
313
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f").markAsTouched();
314
- }
315
- return validationError;
316
- }
317
- registerOnChange(fn) {
318
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_onChange, fn, "f");
319
- }
320
- registerOnTouched(fn) {
321
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_onTouched, fn, "f");
322
- }
323
- registerOnValidatorChange(fn) {
324
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_onValidatorChange, fn, "f");
325
- }
326
- setDisabledState(disabled) {
327
- this.disabled = disabled;
328
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, "f").disabled = disabled;
329
- }
330
- /**
331
- * Detects changes to the underlying input element's value and updates the ngModel accordingly.
332
- * This is useful if you need to update the ngModel value before the input element loses focus.
333
- */
334
- detectInputValueChange() {
335
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_onValueChange).call(this, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_elementRef, "f").nativeElement.value);
336
- }
337
- }
338
- _SkyFuzzyDatepickerInputDirective_control = new WeakMap(), _SkyFuzzyDatepickerInputDirective_dateFormatter = new WeakMap(), _SkyFuzzyDatepickerInputDirective_locale = new WeakMap(), _SkyFuzzyDatepickerInputDirective_preferredShortDateFormat = new WeakMap(), _SkyFuzzyDatepickerInputDirective_ngUnsubscribe = new WeakMap(), _SkyFuzzyDatepickerInputDirective__futureDisabled = new WeakMap(), _SkyFuzzyDatepickerInputDirective__dateFormat = new WeakMap(), _SkyFuzzyDatepickerInputDirective__disabled = new WeakMap(), _SkyFuzzyDatepickerInputDirective__maxDate = new WeakMap(), _SkyFuzzyDatepickerInputDirective__minDate = new WeakMap(), _SkyFuzzyDatepickerInputDirective__startingDay = new WeakMap(), _SkyFuzzyDatepickerInputDirective__value = new WeakMap(), _SkyFuzzyDatepickerInputDirective__yearRequired = new WeakMap(), _SkyFuzzyDatepickerInputDirective_changeDetector = new WeakMap(), _SkyFuzzyDatepickerInputDirective_configService = new WeakMap(), _SkyFuzzyDatepickerInputDirective_elementRef = new WeakMap(), _SkyFuzzyDatepickerInputDirective_fuzzyDateService = new WeakMap(), _SkyFuzzyDatepickerInputDirective_renderer = new WeakMap(), _SkyFuzzyDatepickerInputDirective_resourcesService = new WeakMap(), _SkyFuzzyDatepickerInputDirective_datepickerComponent = new WeakMap(), _SkyFuzzyDatepickerInputDirective_onChange = new WeakMap(), _SkyFuzzyDatepickerInputDirective_onTouched = new WeakMap(), _SkyFuzzyDatepickerInputDirective_onValidatorChange = new WeakMap(), _SkyFuzzyDatepickerInputDirective_instances = new WeakSet(), _SkyFuzzyDatepickerInputDirective_value_get = function _SkyFuzzyDatepickerInputDirective_value_get() {
339
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__value, "f");
340
- }, _SkyFuzzyDatepickerInputDirective_value_set = function _SkyFuzzyDatepickerInputDirective_value_set(value) {
341
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_updateValue).call(this, value);
342
- }, _SkyFuzzyDatepickerInputDirective_onValueChange = function _SkyFuzzyDatepickerInputDirective_onValueChange(newValue) {
343
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective_instances, newValue, "a", _SkyFuzzyDatepickerInputDirective_value_set);
344
- }, _SkyFuzzyDatepickerInputDirective_setInputElementValue = function _SkyFuzzyDatepickerInputDirective_setInputElementValue(value) {
345
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_renderer, "f").setProperty(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_elementRef, "f").nativeElement, 'value', value);
346
- }, _SkyFuzzyDatepickerInputDirective_getMaxDate = function _SkyFuzzyDatepickerInputDirective_getMaxDate() {
347
- if (this.maxDate) {
348
- const maxDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getMomentFromFuzzyDate(this.maxDate);
349
- if (maxDate.isValid()) {
350
- return maxDate.toDate();
351
- }
352
- }
353
- else if (this.futureDisabled) {
354
- return new Date();
355
- }
356
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_configService, "f").maxDate;
357
- }, _SkyFuzzyDatepickerInputDirective_getMinDate = function _SkyFuzzyDatepickerInputDirective_getMinDate() {
358
- if (this.minDate) {
359
- const minDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getMomentFromFuzzyDate(this.minDate);
360
- if (minDate.isValid()) {
361
- return minDate.toDate();
362
- }
363
- }
364
- return __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_configService, "f").minDate;
365
- }, _SkyFuzzyDatepickerInputDirective_fuzzyDatesEqual = function _SkyFuzzyDatepickerInputDirective_fuzzyDatesEqual(dateA, dateB) {
366
- return (dateA !== undefined &&
367
- dateB !== undefined &&
368
- ((!dateA.day && !dateB.day) || dateA.day === dateB.day) &&
369
- ((!dateA.month && !dateB.month) || dateA.month === dateB.month) &&
370
- ((!dateA.year && !dateB.year) || dateA.year === dateB.year));
371
- }, _SkyFuzzyDatepickerInputDirective_updateValue = function _SkyFuzzyDatepickerInputDirective_updateValue(value, emitEvent = true) {
372
- if (__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__value, "f") === value ||
373
- (__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__value, "f") === undefined && value === null)) {
374
- return;
375
- }
376
- let fuzzyDate;
377
- let fuzzyMoment;
378
- let dateValue;
379
- let formattedDate;
380
- if (value instanceof Date) {
381
- dateValue = value;
382
- formattedDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_dateFormatter, "f").format(value, this.dateFormat);
383
- fuzzyDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getFuzzyDateFromSelectedDate(value, this.dateFormat);
384
- }
385
- else if (typeof value === 'string') {
386
- fuzzyDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getFuzzyDateFromString(value, this.dateFormat);
387
- if (fuzzyDate) {
388
- formattedDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").format(fuzzyDate, this.dateFormat, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_locale, "f"));
389
- }
390
- if (!formattedDate) {
391
- formattedDate = value;
392
- }
393
- fuzzyMoment = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getMomentFromFuzzyDate(fuzzyDate);
394
- if (fuzzyMoment) {
395
- dateValue = fuzzyMoment.toDate();
396
- }
397
- }
398
- else {
399
- fuzzyDate = value;
400
- formattedDate = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").format(fuzzyDate, this.dateFormat, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_locale, "f"));
401
- fuzzyMoment = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_fuzzyDateService, "f").getMomentFromFuzzyDate(fuzzyDate);
402
- if (fuzzyMoment) {
403
- dateValue = fuzzyMoment.toDate();
404
- }
405
- }
406
- const areFuzzyDatesEqual = __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_fuzzyDatesEqual).call(this, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__value, "f"), fuzzyDate);
407
- const isNewValue = fuzzyDate !== __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__value, "f") || !areFuzzyDatesEqual;
408
- __classPrivateFieldSet(this, _SkyFuzzyDatepickerInputDirective__value, fuzzyDate || value, "f");
409
- if (isNewValue) {
410
- if (emitEvent) {
411
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_onChange, "f").call(this, __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__value, "f"));
412
- }
413
- else {
414
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_control, "f")?.setValue(__classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective__value, "f"), { emitEvent: false });
415
- }
416
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_datepickerComponent, "f").selectedDate = dateValue;
417
- }
418
- __classPrivateFieldGet(this, _SkyFuzzyDatepickerInputDirective_instances, "m", _SkyFuzzyDatepickerInputDirective_setInputElementValue).call(this, formattedDate || '');
419
- };
420
- SkyFuzzyDatepickerInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyFuzzyDatepickerInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyDatepickerConfigService }, { token: i0.ElementRef }, { token: i2.SkyFuzzyDateService }, { token: i3.SkyAppLocaleProvider }, { token: i0.Renderer2 }, { token: i3.SkyLibResourcesService }, { token: i4.SkyDatepickerComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
421
- SkyFuzzyDatepickerInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: SkyFuzzyDatepickerInputDirective, selector: "[skyFuzzyDatepickerInput]", inputs: { dateFormat: "dateFormat", disabled: "disabled", futureDisabled: "futureDisabled", maxDate: "maxDate", minDate: "minDate", skyDatepickerNoValidate: "skyDatepickerNoValidate", startingDay: "startingDay", yearRequired: "yearRequired" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "input": "onInput()" } }, providers: [
422
- SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR,
423
- SKY_FUZZY_DATEPICKER_VALIDATOR,
424
- ], ngImport: i0 });
425
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyFuzzyDatepickerInputDirective, decorators: [{
426
- type: Directive,
427
- args: [{
428
- selector: '[skyFuzzyDatepickerInput]',
429
- providers: [
430
- SKY_FUZZY_DATEPICKER_VALUE_ACCESSOR,
431
- SKY_FUZZY_DATEPICKER_VALIDATOR,
432
- ],
433
- }]
434
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyDatepickerConfigService }, { type: i0.ElementRef }, { type: i2.SkyFuzzyDateService }, { type: i3.SkyAppLocaleProvider }, { type: i0.Renderer2 }, { type: i3.SkyLibResourcesService }, { type: i4.SkyDatepickerComponent, decorators: [{
435
- type: Optional
436
- }] }]; }, propDecorators: { dateFormat: [{
437
- type: Input
438
- }], disabled: [{
439
- type: Input
440
- }], futureDisabled: [{
441
- type: Input
442
- }], maxDate: [{
443
- type: Input
444
- }], minDate: [{
445
- type: Input
446
- }], skyDatepickerNoValidate: [{
447
- type: Input
448
- }], startingDay: [{
449
- type: Input
450
- }], yearRequired: [{
451
- type: Input
452
- }], onInputChange: [{
453
- type: HostListener,
454
- args: ['change', ['$event']]
455
- }], onInputBlur: [{
456
- type: HostListener,
457
- args: ['blur']
458
- }], onInput: [{
459
- type: HostListener,
460
- args: ['input']
461
- }] } });
462
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC1mdXp6eS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC1mdXp6eS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUVSLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7QUFNcEQsTUFBTSxtQ0FBbUMsR0FBRztJQUMxQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7SUFDL0QsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSw4QkFBOEIsR0FBRztJQUNyQyxPQUFPLEVBQUUsYUFBYTtJQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdDQUFnQyxDQUFDO0lBQy9ELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQVNGLE1BQU0sT0FBTyxnQ0FBZ0M7SUFTM0M7Ozs7T0FJRztJQUNILElBQ1csVUFBVSxDQUFDLEtBQXlCO1FBQzdDLHVCQUFBLElBQUksaURBQWdCLEtBQUssTUFBQSxDQUFDO1FBRTFCLElBQUksdUJBQUEsSUFBSSxnR0FBTyxFQUFFO1lB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QkssWUFBWTtzQkFEdEIsS0FBSztnQkFxSkMsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTTNCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsTUFBTTtnQkFnQmIsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMixcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lBcHBMb2NhbGVQcm92aWRlciwgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5RGF0ZUZvcm1hdHRlciB9IGZyb20gJy4vZGF0ZS1mb3JtYXR0ZXInO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2RhdGVwaWNrZXItY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5RnV6enlEYXRlIH0gZnJvbSAnLi9mdXp6eS1kYXRlJztcbmltcG9ydCB7IFNreUZ1enp5RGF0ZVNlcnZpY2UgfSBmcm9tICcuL2Z1enp5LWRhdGUuc2VydmljZSc7XG5cbmNvbnN0IFNLWV9GVVpaWV9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5RnV6enlEYXRlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IFNLWV9GVVpaWV9EQVRFUElDS0VSX1ZBTElEQVRPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5RnV6enlEYXRlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tza3lGdXp6eURhdGVwaWNrZXJJbnB1dF0nLFxuICBwcm92aWRlcnM6IFtcbiAgICBTS1lfRlVaWllfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUixcbiAgICBTS1lfRlVaWllfREFURVBJQ0tFUl9WQUxJREFUT1IsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNreUZ1enp5RGF0ZXBpY2tlcklucHV0RGlyZWN0aXZlXG4gIGltcGxlbWVudHNcbiAgICBPbkluaXQsXG4gICAgT25EZXN0cm95LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBWYWxpZGF0b3JcbntcbiAgLyoqXG4gICAqIFRoZSBkYXRlIGZvcm1hdCBmb3IgdGhlIGlucHV0LiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50XG4gICAqIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGluIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqIEBkZWZhdWx0IFwiTU0vREQvWVlZWVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGVGb3JtYXQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19kYXRlRm9ybWF0ID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy4jdmFsdWUpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLiNmdXp6eURhdGVTZXJ2aWNlLmZvcm1hdChcbiAgICAgICAgdGhpcy4jdmFsdWUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgdGhpcy4jbG9jYWxlXG4gICAgICApO1xuICAgICAgdGhpcy4jc2V0SW5wdXRFbGVtZW50VmFsdWUoZm9ybWF0dGVkRGF0ZSk7XG4gICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciB0byBub3QgaGF2ZSBnZXR0ZXIgbG9naWNcbiAgcHVibGljIGdldCBkYXRlRm9ybWF0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuI19kYXRlRm9ybWF0IHx8XG4gICAgICB0aGlzLiNjb25maWdTZXJ2aWNlLmRhdGVGb3JtYXQgfHxcbiAgICAgIHRoaXMuI3ByZWZlcnJlZFNob3J0RGF0ZUZvcm1hdFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBkYXRlcGlja2VyIG9uIHRlbXBsYXRlLWRyaXZlbiBmb3Jtcy4gRG9uJ3QgdXNlIHRoaXMgaW5wdXQgb24gcmVhY3RpdmUgZm9ybXMgYmVjYXVzZSB0aGV5IG1heSBvdmVyd3JpdGUgdGhlIGlucHV0IG9yIGxlYXZlIHRoZSBjb250cm9sIG91dCBvZiBzeW5jLlxuICAgKiBUbyBzZXQgdGhlIGRpc2FibGVkIHN0YXRlIG9uIHJlYWN0aXZlIGZvcm1zLCB1c2UgdGhlIGBGb3JtQ29udHJvbGAgaW5zdGVhZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LmRpc2FibGVkID0gdmFsdWU7XG5cbiAgICB0aGlzLiNyZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgIHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICB2YWx1ZVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfZGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IHVzZXJzIGZyb20gc3BlY2lmeWluZyBkYXRlcyB0aGF0IGFyZSBpbiB0aGUgZnV0dXJlLlxuICAgKiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmdXR1cmVEaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19mdXR1cmVEaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuI29uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZ1dHVyZURpc2FibGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfZnV0dXJlRGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxhdGVzdCBmdXp6eSBkYXRlIGFsbG93ZWQuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnRcbiAgICogdG8gcHJldmVudCBmdXp6eSBkYXRlcyBhZnRlciBhIHNwZWNpZmllZCBkYXRlLiBUaGlzIHByb3BlcnR5IGFjY2VwdHNcbiAgICogYSBgU2t5RnV6enlEYXRlYCB2YWx1ZSB0aGF0IGluY2x1ZGVzIG51bWVyaWMgbW9udGgsIGRheSwgYW5kIHllYXIgdmFsdWVzLlxuICAgKiBGb3IgZXhhbXBsZTogYHsgbW9udGg6IDEsIGRheTogMSwgeWVhcjogMjAyNyB9YC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4RGF0ZSh2YWx1ZTogU2t5RnV6enlEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX21heERhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50Lm1heERhdGUgPSB0aGlzLiNnZXRNYXhEYXRlKCk7XG4gICAgdGhpcy4jb25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4RGF0ZSgpOiBTa3lGdXp6eURhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfbWF4RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZWFybGllc3QgZnV6enkgZGF0ZSBhbGxvd2VkLiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50XG4gICAqIHRvIHByZXZlbnQgZnV6enkgZGF0ZXMgYmVmb3JlIGEgc3BlY2lmaWVkIGRhdGUuIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBhIGBTa3lGdXp6eURhdGVgIHZhbHVlXG4gICAqIHRoYXQgaW5jbHVkZXMgbnVtZXJpYyBtb250aCwgZGF5LCBhbmQgeWVhciB2YWx1ZXMuXG4gICAqIEZvciBleGFtcGxlOiBgeyBtb250aDogMSwgZGF5OiAxLCB5ZWFyOiAyMDA3IH1gLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtaW5EYXRlKHZhbHVlOiBTa3lGdXp6eURhdGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfbWluRGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQubWluRGF0ZSA9IHRoaXMuI2dldE1pbkRhdGUoKTtcbiAgICB0aGlzLiNvblZhbGlkYXRvckNoYW5nZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5EYXRlKCk6IFNreUZ1enp5RGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19taW5EYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBkYXRlIHZhbGlkYXRpb24gb24gdGhlIGZ1enp5IGRhdGVwaWNrZXIgaW5wdXQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2t5RGF0ZXBpY2tlck5vVmFsaWRhdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHN0YXJ0aW5nIGRheSBvZiB0aGUgd2VlayBpbiB0aGUgY2FsZW5kYXIsIHdoZXJlIGAwYCBzZXRzIHRoZSBzdGFydGluZyBkYXlcbiAgICogdG8gU3VuZGF5LiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIGluIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc3RhcnRpbmdEYXkodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19zdGFydGluZ0RheSA9IHZhbHVlO1xuICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQuc3RhcnRpbmdEYXkgPSB0aGlzLnN0YXJ0aW5nRGF5O1xuXG4gICAgdGhpcy4jb25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIHRvIG5vdCBoYXZlIGdldHRlciBsb2dpY1xuICBwdWJsaWMgZ2V0IHN0YXJ0aW5nRGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuI19zdGFydGluZ0RheSB8fCB0aGlzLiNjb25maWdTZXJ2aWNlLnN0YXJ0aW5nRGF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVxdWlyZSB0aGUgeWVhciBpbiBmdXp6eSBkYXRlcy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgeWVhclJlcXVpcmVkKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX3llYXJSZXF1aXJlZCA9IHZhbHVlO1xuICAgIHRoaXMuI29uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHllYXJSZXF1aXJlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3llYXJSZXF1aXJlZDtcbiAgfVxuXG4gIGdldCAjdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy4jX3ZhbHVlO1xuICB9XG5cbiAgc2V0ICN2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy4jdXBkYXRlVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgI2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZDtcblxuICAjZGF0ZUZvcm1hdHRlciA9IG5ldyBTa3lEYXRlRm9ybWF0dGVyKCk7XG5cbiAgI2xvY2FsZTogc3RyaW5nO1xuXG4gICNwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI19mdXR1cmVEaXNhYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG4gICNfZGF0ZUZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICNfZGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcblxuICAjX21heERhdGU6IFNreUZ1enp5RGF0ZSB8IHVuZGVmaW5lZDtcblxuICAjX21pbkRhdGU6IFNreUZ1enp5RGF0ZSB8IHVuZGVmaW5lZDtcblxuICAjX3N0YXJ0aW5nRGF5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgI192YWx1ZTogYW55O1xuXG4gICNfeWVhclJlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgI2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgI2NvbmZpZ1NlcnZpY2U6IFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlO1xuICAjZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgI2Z1enp5RGF0ZVNlcnZpY2U6IFNreUZ1enp5RGF0ZVNlcnZpY2U7XG4gICNyZW5kZXJlcjogUmVuZGVyZXIyO1xuICAjcmVzb3VyY2VzU2VydmljZTogU2t5TGliUmVzb3VyY2VzU2VydmljZTtcbiAgI2RhdGVwaWNrZXJDb21wb25lbnQ6IFNreURhdGVwaWNrZXJDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGNvbmZpZ1NlcnZpY2U6IFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgZnV6enlEYXRlU2VydmljZTogU2t5RnV6enlEYXRlU2VydmljZSxcbiAgICBsb2NhbGVQcm92aWRlcjogU2t5QXBwTG9jYWxlUHJvdmlkZXIsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICByZXNvdXJjZXNTZXJ2aWNlOiBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIGRhdGVwaWNrZXJDb21wb25lbnQ/OiBTa3lEYXRlcGlja2VyQ29tcG9uZW50XG4gICkge1xuICAgIGlmICghZGF0ZXBpY2tlckNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnWW91IG11c3Qgd3JhcCB0aGUgYHNreUZ1enp5RGF0ZXBpY2tlcklucHV0YCBkaXJlY3RpdmUgd2l0aGluIGEgJyArXG4gICAgICAgICAgJ2A8c2t5LWRhdGVwaWNrZXI+YCBjb21wb25lbnQhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI2NvbmZpZ1NlcnZpY2UgPSBjb25maWdTZXJ2aWNlO1xuICAgIHRoaXMuI2VsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMuI2Z1enp5RGF0ZVNlcnZpY2UgPSBmdXp6eURhdGVTZXJ2aWNlO1xuICAgIHRoaXMuI3JlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZSA9IHJlc291cmNlc1NlcnZpY2U7XG4gICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudCA9IGRhdGVwaWNrZXJDb21wb25lbnQ7XG5cbiAgICB0aGlzLiNsb2NhbGUgPSBsb2NhbGVQcm92aWRlci5kZWZhdWx0TG9jYWxlO1xuICAgIGxvY2FsZVByb3ZpZGVyXG4gICAgICAuZ2V0TG9jYWxlSW5mbygpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChsb2NhbGVJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuI2xvY2FsZSA9IGxvY2FsZUluZm8ubG9jYWxlO1xuICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLnNldExvY2FsZSh0aGlzLiNsb2NhbGUpO1xuICAgICAgICB0aGlzLiNwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQgPVxuICAgICAgICAgIFNreURhdGVGb3JtYXR0ZXIuZ2V0UHJlZmVycmVkU2hvcnREYXRlRm9ybWF0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy55ZWFyUmVxdWlyZWQpIHtcbiAgICAgIGlmICh0aGlzLmRhdGVGb3JtYXQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigneScpID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1lvdSBoYXZlIGNvbmZpZ3VyZWQgY29uZmxpY3Rpbmcgc2V0dGluZ3MuIFllYXIgaXMgcmVxdWlyZWQgYW5kIGRhdGVGb3JtYXQgZG9lcyBub3QgaW5jbHVkZSB5ZWFyLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgdGhpcy4jcmVuZGVyZXIuYWRkQ2xhc3MoZWxlbWVudCwgJ3NreS1mb3JtLWNvbnRyb2wnKTtcblxuICAgIGNvbnN0IGhhc0FyaWFMYWJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghaGFzQXJpYUxhYmVsKSB7XG4gICAgICB0aGlzLiNyZXNvdXJjZXNTZXJ2aWNlXG4gICAgICAgIC5nZXRTdHJpbmcoJ3NreXV4X2RhdGVfZmllbGRfZGVmYXVsdF9sYWJlbCcpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuI3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnYXJpYS1sYWJlbCcsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LmRhdGVDaGFuZ2VcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBEYXRlKSA9PiB7XG4gICAgICAgIHRoaXMuI3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuI29uVG91Y2hlZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGFkZHJlc3MgYSBidWcgaW4gQW5ndWxhciA0LlxuICAgIC8vIFdoZW4gYSBjb250cm9sIHZhbHVlIGlzIHNldCBpbml0aWFsbHksIGl0cyB2YWx1ZSBpcyBub3QgcmVwcmVzZW50ZWQgb24gdGhlIHZpZXcuXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzc5MlxuICAgIC8vIE9mIG5vdGUgaXMgdGhlIHBhcmVudCBjaGVjayB3aGljaCBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmb3JtIGlzIHJlYWN0aXZlLlxuICAgIC8vIFdpdGhvdXQgdGhpcyBjaGVjayB0aGVyZSBpcyBhIGNoYW5nZWQgYmVmb3JlIGNoZWNrZWQgZXJyb3JcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXG4gICAgaWYgKHRoaXMuI2NvbnRyb2wgJiYgdGhpcy4jY29udHJvbC5wYXJlbnQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLiNjb250cm9sPy5zZXRWYWx1ZSh0aGlzLiN2YWx1ZSwge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLiNvblZhbHVlQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgcHVibGljIG9uSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuI29uVG91Y2hlZCgpO1xuXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuI2Z1enp5RGF0ZVNlcnZpY2UuZm9ybWF0KFxuICAgICAgdGhpcy4jdmFsdWUsXG4gICAgICB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICB0aGlzLiNsb2NhbGVcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuI2NvbnRyb2w/LnZhbGlkKSB7XG4gICAgICB0aGlzLiNzZXRJbnB1dEVsZW1lbnRWYWx1ZShmb3JtYXR0ZWREYXRlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcpXG4gIHB1YmxpYyBvbklucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuI2NvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy4jdXBkYXRlVmFsdWUodmFsdWUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLiNjb250cm9sKSB7XG4gICAgICB0aGlzLiNjb250cm9sID0gY29udHJvbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5za3lEYXRlcGlja2VyTm9WYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLiNjb250cm9sLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZTogYW55ID0gY29udHJvbC52YWx1ZTtcblxuICAgIGxldCBmdXp6eURhdGU6IFNreUZ1enp5RGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdmFsaWRhdGlvbkVycm9yOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgZnV6enlEYXRlID0gdGhpcy4jZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVGcm9tU3RyaW5nKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmdXp6eURhdGUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1enp5RGF0ZSkge1xuICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICBza3lGdXp6eURhdGU6IHtcbiAgICAgICAgICBpbnZhbGlkOiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZnV6enlEYXRlLnllYXIgJiYgdGhpcy55ZWFyUmVxdWlyZWQpIHtcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgIHNreUZ1enp5RGF0ZToge1xuICAgICAgICAgICAgeWVhclJlcXVpcmVkOiB2YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbGlkYXRpb25FcnJvciAmJiBmdXp6eURhdGUueWVhcikge1xuICAgICAgICBsZXQgZnV6enlEYXRlUmFuZ2U7XG5cbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgIGZ1enp5RGF0ZVJhbmdlID0gdGhpcy4jZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVSYW5nZShcbiAgICAgICAgICAgIGZ1enp5RGF0ZSxcbiAgICAgICAgICAgIHRoaXMubWF4RGF0ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWZ1enp5RGF0ZVJhbmdlLnZhbGlkKSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB7XG4gICAgICAgICAgICAgIHNreUZ1enp5RGF0ZToge1xuICAgICAgICAgICAgICAgIG1heERhdGU6IHZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbGlkYXRpb25FcnJvciAmJiB0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgICBmdXp6eURhdGVSYW5nZSA9IHRoaXMuI2Z1enp5RGF0ZVNlcnZpY2UuZ2V0RnV6enlEYXRlUmFuZ2UoXG4gICAgICAgICAgICB0aGlzLm1pbkRhdGUsXG4gICAgICAgICAgICBmdXp6eURhdGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghZnV6enlEYXRlUmFuZ2UudmFsaWQpIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvciA9IHtcbiAgICAgICAgICAgICAgc2t5RnV6enlEYXRlOiB7XG4gICAgICAgICAgICAgICAgbWluRGF0ZTogdmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmIHRoaXMuZnV0dXJlRGlzYWJsZWQpIHtcbiAgICAgICAgICBmdXp6eURhdGVSYW5nZSA9IHRoaXMuI2Z1enp5RGF0ZVNlcnZpY2UuZ2V0RnV6enlEYXRlUmFuZ2UoXG4gICAgICAgICAgICBmdXp6eURhdGUsXG4gICAgICAgICAgICB0aGlzLiNmdXp6eURhdGVTZXJ2aWNlLmdldEN1cnJlbnRGdXp6eURhdGUoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFmdXp6eURhdGVSYW5nZS52YWxpZCkge1xuICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgICAgICBza3lGdXp6eURhdGU6IHtcbiAgICAgICAgICAgICAgICBmdXR1cmVEaXNhYmxlZDogdmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIC8vIE1hcmsgdGhlIGludmFsaWQgY29udHJvbCBhcyB0b3VjaGVkIHNvIHRoYXQgdGhlIGlucHV0J3MgaW52YWxpZCBDU1Mgc3R5bGVzIGFwcGVhci5cbiAgICAgIC8vIChUaGlzIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiB0aGUgaW52YWxpZCB2YWx1ZSBpcyBzZXQgYnkgdGhlIEZvcm1Db250cm9sIGNvbnN0cnVjdG9yLilcbiAgICAgIHRoaXMuI2NvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0aW9uRXJyb3I7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLiNvbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy4jb25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuI29uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0cyBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGlucHV0IGVsZW1lbnQncyB2YWx1ZSBhbmQgdXBkYXRlcyB0aGUgbmdNb2RlbCBhY2NvcmRpbmdseS5cbiAgICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IG5lZWQgdG8gdXBkYXRlIHRoZSBuZ01vZGVsIHZhbHVlIGJlZm9yZSB0aGUgaW5wdXQgZWxlbWVudCBsb3NlcyBmb2N1cy5cbiAgICovXG4gIHB1YmxpYyBkZXRlY3RJbnB1dFZhbHVlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuI29uVmFsdWVDaGFuZ2UodGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlKTtcbiAgfVxuXG4gICNvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgI3NldElucHV0RWxlbWVudFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiNyZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgfVxuXG4gICNnZXRNYXhEYXRlKCk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLm1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLiNmdXp6eURhdGVTZXJ2aWNlLmdldE1vbWVudEZyb21GdXp6eURhdGUoXG4gICAgICAgIHRoaXMubWF4RGF0ZVxuICAgICAgKTtcbiAgICAgIGlmIChtYXhEYXRlLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gbWF4RGF0ZS50b0RhdGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZnV0dXJlRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jY29uZmlnU2VydmljZS5tYXhEYXRlO1xuICB9XG5cbiAgI2dldE1pbkRhdGUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xuICAgICAgY29uc3QgbWluRGF0ZSA9IHRoaXMuI2Z1enp5RGF0ZVNlcnZpY2UuZ2V0TW9tZW50RnJvbUZ1enp5RGF0ZShcbiAgICAgICAgdGhpcy5taW5EYXRlXG4gICAgICApO1xuICAgICAgaWYgKG1pbkRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBtaW5EYXRlLnRvRGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jY29uZmlnU2VydmljZS5taW5EYXRlO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgI2Z1enp5RGF0ZXNFcXVhbChkYXRlQT86IFNreUZ1enp5RGF0ZSwgZGF0ZUI/OiBTa3lGdXp6eURhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZUEgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgZGF0ZUIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKCghZGF0ZUEuZGF5ICYmICFkYXRlQi5kYXkpIHx8IGRhdGVBLmRheSA9PT0gZGF0ZUIuZGF5KSAmJlxuICAgICAgKCghZGF0ZUEubW9udGggJiYgIWRhdGVCLm1vbnRoKSB8fCBkYXRlQS5tb250aCA9PT0gZGF0ZUIubW9udGgpICYmXG4gICAgICAoKCFkYXRlQS55ZWFyICYmICFkYXRlQi55ZWFyKSB8fCBkYXRlQS55ZWFyID09PSBkYXRlQi55ZWFyKVxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICNvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICNvblRvdWNoZWQgPSAoKSA9PiB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAjb25WYWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sIGFuZCBpbnB1dCBlbGVtZW50XG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgRGVub3RlcyBpZiB3ZSBlbWl0IGFuIGV2ZW50IHRvIHRoZSBjb25zdW1lcidzIGZvcm0gY29udHJvbC4gV2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcyBpZiB0aGUgdmFsdWUgaXMgYmVpbmcgdXBkYXRlZCB2aWEgYSBgc2V0VmFsdWVgIGNhbGwgb3IgYSBgcGF0Y2hWYWx1ZWAgY2FsbCBhcyB0aGlzIGlzIGFscmVhZHkgaGFuZGxlZCBieSBBbmd1bGFyLlxuICAgKiBJbiB0aGVzZSBjYXNlcyB3ZSBkbyBub3Qgd2FudCB0byBmaXJlIGBvbkNoYW5nZWAgYXMgaXQgd2lsbCBjYXVzZSBleHRyYSBgdmFsdWVDaGFuZ2VgIGFuZCBgc3RhdHVzQ2hhbmdlYCBldmVudHMgYW5kIHRoZSBzdGF0dXMgb2YgdGhlIGZvcm0gc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSB0aGVzZSBjaGFuZ2VzLlxuICAgKi9cbiAgI3VwZGF0ZVZhbHVlKHZhbHVlOiBhbnksIGVtaXRFdmVudCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLiNfdmFsdWUgPT09IHZhbHVlIHx8XG4gICAgICAodGhpcy4jX3ZhbHVlID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IG51bGwpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGZ1enp5RGF0ZTogU2t5RnV6enlEYXRlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBmdXp6eU1vbWVudDogYW55O1xuICAgIGxldCBkYXRlVmFsdWU6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZvcm1hdHRlZERhdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGRhdGVWYWx1ZSA9IHZhbHVlO1xuICAgICAgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuI2RhdGVGb3JtYXR0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLmRhdGVGb3JtYXQpO1xuICAgICAgZnV6enlEYXRlID0gdGhpcy4jZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVGcm9tU2VsZWN0ZWREYXRlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgZnV6enlEYXRlID0gdGhpcy4jZnV6enlEYXRlU2VydmljZS5nZXRGdXp6eURhdGVGcm9tU3RyaW5nKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0XG4gICAgICApO1xuICAgICAgaWYgKGZ1enp5RGF0ZSkge1xuICAgICAgICBmb3JtYXR0ZWREYXRlID0gdGhpcy4jZnV6enlEYXRlU2VydmljZS5mb3JtYXQoXG4gICAgICAgICAgZnV6enlEYXRlLFxuICAgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgICB0aGlzLiNsb2NhbGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3JtYXR0ZWREYXRlKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGUgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgZnV6enlNb21lbnQgPSB0aGlzLiNmdXp6eURhdGVTZXJ2aWNlLmdldE1vbWVudEZyb21GdXp6eURhdGUoZnV6enlEYXRlKTtcblxuICAgICAgaWYgKGZ1enp5TW9tZW50KSB7XG4gICAgICAgIGRhdGVWYWx1ZSA9IGZ1enp5TW9tZW50LnRvRGF0ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmdXp6eURhdGUgPSB2YWx1ZSBhcyBTa3lGdXp6eURhdGU7XG4gICAgICBmb3JtYXR0ZWREYXRlID0gdGhpcy4jZnV6enlEYXRlU2VydmljZS5mb3JtYXQoXG4gICAgICAgIGZ1enp5RGF0ZSxcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0LFxuICAgICAgICB0aGlzLiNsb2NhbGVcbiAgICAgICk7XG4gICAgICBmdXp6eU1vbWVudCA9IHRoaXMuI2Z1enp5RGF0ZVNlcnZpY2UuZ2V0TW9tZW50RnJvbUZ1enp5RGF0ZShmdXp6eURhdGUpO1xuXG4gICAgICBpZiAoZnV6enlNb21lbnQpIHtcbiAgICAgICAgZGF0ZVZhbHVlID0gZnV6enlNb21lbnQudG9EYXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXJlRnV6enlEYXRlc0VxdWFsID0gdGhpcy4jZnV6enlEYXRlc0VxdWFsKHRoaXMuI192YWx1ZSwgZnV6enlEYXRlKTtcbiAgICBjb25zdCBpc05ld1ZhbHVlID0gZnV6enlEYXRlICE9PSB0aGlzLiNfdmFsdWUgfHwgIWFyZUZ1enp5RGF0ZXNFcXVhbDtcblxuICAgIHRoaXMuI192YWx1ZSA9IGZ1enp5RGF0ZSB8fCB2YWx1ZTtcblxuICAgIGlmIChpc05ld1ZhbHVlKSB7XG4gICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgIHRoaXMuI29uQ2hhbmdlKHRoaXMuI192YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNjb250cm9sPy5zZXRWYWx1ZSh0aGlzLiNfdmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudC5zZWxlY3RlZERhdGUgPSBkYXRlVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy4jc2V0SW5wdXRFbGVtZW50VmFsdWUoZm9ybWF0dGVkRGF0ZSB8fCAnJyk7XG4gIH1cbn1cbiJdfQ==