@sbb-esta/lyne-elements-experimental-dev 4.7.0-dev.1773333596 → 4.7.0-dev.1773388997
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +65 -76
- package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +72 -52
- package/autocomplete-grid/autocomplete-grid-button.js +3 -6
- package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -17
- package/autocomplete-grid/autocomplete-grid-cell.js +4 -7
- package/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +20 -21
- package/autocomplete-grid/autocomplete-grid-optgroup.js +3 -6
- package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -33
- package/autocomplete-grid/autocomplete-grid-option.js +4 -9
- package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -22
- package/autocomplete-grid/autocomplete-grid-row.js +4 -7
- package/autocomplete-grid/autocomplete-grid.js +3 -6
- package/autocomplete-grid-cell.component-Dak9wlBr.js +24 -0
- package/autocomplete-grid-option.component-DNRFHOwc.js +37 -0
- package/autocomplete-grid-row.component-DBHZQ0GQ.js +27 -0
- package/autocomplete-grid.js +9 -21
- package/autocomplete-grid.pure.js +7 -15
- package/core/datetime/date-helper.js +2 -191
- package/core/datetime.js +2 -5
- package/core/timetable/access-leg-helper.js +76 -71
- package/core/timetable/timetable-helper.js +9 -11
- package/core/timetable/timetable-properties.js +0 -1
- package/core/timetable.js +3 -7
- package/date-helper-CGproP5d.js +185 -0
- package/development/autocomplete-grid/autocomplete-grid/autocomplete-grid.component.js +114 -122
- package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +92 -70
- package/development/autocomplete-grid/autocomplete-grid-button.js +6 -4
- package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +2 -29
- package/development/autocomplete-grid/autocomplete-grid-cell.js +7 -5
- package/development/autocomplete-grid/autocomplete-grid-optgroup/autocomplete-grid-optgroup.component.js +27 -22
- package/development/autocomplete-grid/autocomplete-grid-optgroup.js +6 -4
- package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +2 -109
- package/development/autocomplete-grid/autocomplete-grid-option.js +7 -7
- package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +2 -91
- package/development/autocomplete-grid/autocomplete-grid-row.js +7 -5
- package/development/autocomplete-grid/autocomplete-grid.js +6 -4
- package/development/autocomplete-grid-cell.component-BBvM4o2H.js +42 -0
- package/development/autocomplete-grid-option.component-QzfM5eIE.js +123 -0
- package/development/autocomplete-grid-row.component-H8sCTCkT.js +104 -0
- package/development/autocomplete-grid.js +10 -14
- package/development/autocomplete-grid.pure.js +4 -13
- package/development/core/datetime/date-helper.js +2 -285
- package/development/core/datetime.js +2 -6
- package/development/core/timetable/access-leg-helper.js +104 -82
- package/development/core/timetable/timetable-helper.js +16 -17
- package/development/core/timetable/timetable-properties.js +0 -2
- package/development/core/timetable.js +3 -8
- package/development/date-helper-8_Y-PuHh.js +520 -0
- package/development/differenceInMinutes-DN_1Rk3O.js +110 -0
- package/development/format-Bbrn2bgo.js +1848 -0
- package/development/isValid-C-HzKv4v.js +178 -0
- package/development/journey-summary/journey-summary.component.js +2 -288
- package/development/journey-summary.component-uGhZvA4p.js +385 -0
- package/development/journey-summary.js +8 -5
- package/development/journey-summary.pure.js +2 -5
- package/development/pearl-chain/pearl-chain.component.js +2 -634
- package/development/pearl-chain-time/pearl-chain-time.component.js +2 -306
- package/development/pearl-chain-time.component-B8mayTWD.js +415 -0
- package/development/pearl-chain-time.js +8 -5
- package/development/pearl-chain-time.pure.js +2 -5
- package/development/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -28
- package/development/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -393
- package/development/pearl-chain-vertical-item.component-BDzbcIaf.js +435 -0
- package/development/pearl-chain-vertical-item.js +8 -5
- package/development/pearl-chain-vertical-item.pure.js +2 -5
- package/development/pearl-chain-vertical.component-CswE7b3M.js +39 -0
- package/development/pearl-chain-vertical.js +8 -5
- package/development/pearl-chain-vertical.pure.js +2 -5
- package/development/pearl-chain.component-wpsTvoSe.js +704 -0
- package/development/pearl-chain.js +8 -5
- package/development/pearl-chain.pure.js +2 -5
- package/development/seat-reservation/common/mapper/icon-mapper.js +168 -71
- package/development/seat-reservation/common/mapper/mapper.js +153 -122
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +570 -559
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +992 -972
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.js +20334 -20367
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1731 -1738
- package/development/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9741 -9782
- package/development/seat-reservation/common/mapper.js +1 -8
- package/development/seat-reservation/common/svgs.js +2 -46
- package/development/seat-reservation/common/translations/i18n.js +1118 -900
- package/development/seat-reservation/common/translations.js +1 -4
- package/development/seat-reservation/common/types.js +0 -2
- package/development/seat-reservation/common.js +7 -11
- package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +1305 -1230
- package/development/seat-reservation/seat-reservation/seat-reservation.component.js +2 -859
- package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -106
- package/development/seat-reservation/seat-reservation-area.js +7 -5
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +35 -34
- package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -162
- package/development/seat-reservation/seat-reservation-graphic.js +7 -5
- package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -713
- package/development/seat-reservation/seat-reservation-navigation-coach.js +7 -5
- package/development/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -131
- package/development/seat-reservation/seat-reservation-navigation-services.js +7 -5
- package/development/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -601
- package/development/seat-reservation/seat-reservation-place-control.js +7 -5
- package/development/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -22
- package/development/seat-reservation/seat-reservation-scoped.js +7 -5
- package/development/seat-reservation/seat-reservation.js +7 -6
- package/development/seat-reservation-area.component-BK92ZtFo.js +138 -0
- package/development/seat-reservation-graphic.component-cUnsHh5x.js +193 -0
- package/development/seat-reservation-navigation-coach.component-D6Bglus8.js +828 -0
- package/development/seat-reservation-navigation-services.component-DYJ6Ddkg.js +179 -0
- package/development/seat-reservation-place-control.component-Bg9evKBW.js +726 -0
- package/development/seat-reservation-scoped.component-DRQ_I702.js +31 -0
- package/development/seat-reservation.component-Cq_aJKR0.js +818 -0
- package/development/seat-reservation.js +15 -28
- package/development/seat-reservation.pure.js +10 -28
- package/development/svgs-C3JMWR26.js +28 -0
- package/development/timetable-duration/timetable-duration.component.js +2 -108
- package/development/timetable-duration.component-DI0lET17.js +125 -0
- package/development/timetable-duration.js +8 -5
- package/development/timetable-duration.pure.js +2 -5
- package/development/timetable-row/timetable-row.component.js +2 -781
- package/development/timetable-row.component-CAED6Zwc.js +932 -0
- package/development/timetable-row.js +8 -13
- package/development/timetable-row.pure.js +2 -12
- package/development/toDate-Biiv3kyf.js +150 -0
- package/differenceInMinutes-Dr9gRqtu.js +27 -0
- package/format-CM5exOsN.js +1103 -0
- package/isValid-B9oVW3lA.js +36 -0
- package/journey-summary/journey-summary.component.js +2 -194
- package/journey-summary.component-Cq_4kaOp.js +264 -0
- package/journey-summary.js +5 -4
- package/journey-summary.pure.js +2 -4
- package/package.json +2 -2
- package/pearl-chain/pearl-chain.component.js +2 -165
- package/pearl-chain-time/pearl-chain-time.component.js +2 -157
- package/pearl-chain-time.component-DGDW5S1c.js +239 -0
- package/pearl-chain-time.js +5 -4
- package/pearl-chain-time.pure.js +2 -4
- package/pearl-chain-vertical/pearl-chain-vertical.component.js +2 -17
- package/pearl-chain-vertical-item/pearl-chain-vertical-item.component.js +2 -77
- package/pearl-chain-vertical-item.component-G22bWhLU.js +108 -0
- package/pearl-chain-vertical-item.js +5 -4
- package/pearl-chain-vertical-item.pure.js +2 -4
- package/pearl-chain-vertical.component-CXIDT5RD.js +21 -0
- package/pearl-chain-vertical.js +5 -4
- package/pearl-chain-vertical.pure.js +2 -4
- package/pearl-chain.component-DmjkVIva.js +194 -0
- package/pearl-chain.js +5 -4
- package/pearl-chain.pure.js +2 -4
- package/seat-reservation/common/mapper/icon-mapper.js +71 -71
- package/seat-reservation/common/mapper/mapper.js +95 -89
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-bus.js +568 -558
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-decks.js +989 -970
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-giruno.js +20332 -20366
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-others.js +1729 -1737
- package/seat-reservation/common/mapper/sample-data/seat-reservation-sample-data-train.js +9739 -9781
- package/seat-reservation/common/mapper.js +3 -9
- package/seat-reservation/common/svgs.js +2 -243
- package/seat-reservation/common/translations/i18n.js +1084 -891
- package/seat-reservation/common/translations.js +2 -4
- package/seat-reservation/common/types.js +0 -1
- package/seat-reservation/common.js +9 -15
- package/seat-reservation/seat-reservation/seat-reservation-base-element.js +832 -810
- package/seat-reservation/seat-reservation/seat-reservation.component.js +2 -420
- package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +2 -51
- package/seat-reservation/seat-reservation-area.js +4 -7
- package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +68 -71
- package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +2 -75
- package/seat-reservation/seat-reservation-graphic.js +4 -7
- package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +2 -234
- package/seat-reservation/seat-reservation-navigation-coach.js +4 -7
- package/seat-reservation/seat-reservation-navigation-services/seat-reservation-navigation-services.component.js +2 -85
- package/seat-reservation/seat-reservation-navigation-services.js +4 -7
- package/seat-reservation/seat-reservation-place-control/seat-reservation-place-control.component.js +2 -203
- package/seat-reservation/seat-reservation-place-control.js +4 -7
- package/seat-reservation/seat-reservation-scoped/seat-reservation-scoped.component.js +2 -13
- package/seat-reservation/seat-reservation-scoped.js +4 -7
- package/seat-reservation/seat-reservation.js +5 -9
- package/seat-reservation-area.component-n-9rGn_y.js +75 -0
- package/seat-reservation-graphic.component-YTXRmKt0.js +102 -0
- package/seat-reservation-navigation-coach.component-YJ0vaYmO.js +333 -0
- package/seat-reservation-navigation-services.component-C3xnLJg2.js +127 -0
- package/seat-reservation-place-control.component-DmBAfM6K.js +322 -0
- package/seat-reservation-scoped.component-DPkz6u17.js +17 -0
- package/seat-reservation.component-C_anMkgw.js +364 -0
- package/seat-reservation.js +17 -39
- package/seat-reservation.pure.js +15 -32
- package/svgs-D9arBcqr.js +26 -0
- package/timetable-duration/timetable-duration.component.js +2 -57
- package/timetable-duration.component-DCu8Phts.js +65 -0
- package/timetable-duration.js +5 -4
- package/timetable-duration.pure.js +2 -4
- package/timetable-row/timetable-row.component.js +2 -427
- package/timetable-row.component-BVRCB3xK.js +559 -0
- package/timetable-row.js +6 -13
- package/timetable-row.pure.js +2 -11
- package/toDate-p-Tpkb7t.js +16 -0
- package/development/differenceInMinutes-B0dawX-5.js +0 -26
- package/development/format-BMkeaqaF.js +0 -1433
- package/development/isValid-BYRch7pV.js +0 -53
- package/development/toDate-BWb6Z1JD.js +0 -24
- package/differenceInMinutes-COvvdYsJ.js +0 -23
- package/format-CmKROkbc.js +0 -1186
- package/isValid-m3_OsPaB.js +0 -45
- package/toDate-Bw2KTWeq.js +0 -15
|
@@ -0,0 +1,1848 @@
|
|
|
1
|
+
import { n as constructFrom, o as millisecondsInWeek, t as toDate } from "./toDate-Biiv3kyf.js";
|
|
2
|
+
import { n as differenceInCalendarDays, t as isValid } from "./isValid-C-HzKv4v.js";
|
|
3
|
+
//#region node_modules/date-fns/_lib/defaultOptions.js
|
|
4
|
+
var defaultOptions = {};
|
|
5
|
+
function getDefaultOptions() {
|
|
6
|
+
return defaultOptions;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region node_modules/date-fns/startOfWeek.js
|
|
10
|
+
/**
|
|
11
|
+
* The {@link startOfWeek} function options.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* @name startOfWeek
|
|
15
|
+
* @category Week Helpers
|
|
16
|
+
* @summary Return the start of a week for the given date.
|
|
17
|
+
*
|
|
18
|
+
* @description
|
|
19
|
+
* Return the start of a week for the given date.
|
|
20
|
+
* The result will be in the local timezone.
|
|
21
|
+
*
|
|
22
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
23
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
24
|
+
*
|
|
25
|
+
* @param date - The original date
|
|
26
|
+
* @param options - An object with options
|
|
27
|
+
*
|
|
28
|
+
* @returns The start of a week
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // The start of a week for 2 September 2014 11:55:00:
|
|
32
|
+
* const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))
|
|
33
|
+
* //=> Sun Aug 31 2014 00:00:00
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:
|
|
37
|
+
* const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })
|
|
38
|
+
* //=> Mon Sep 01 2014 00:00:00
|
|
39
|
+
*/
|
|
40
|
+
function startOfWeek(date, options) {
|
|
41
|
+
const defaultOptions = getDefaultOptions();
|
|
42
|
+
const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions.weekStartsOn ?? defaultOptions.locale?.options?.weekStartsOn ?? 0;
|
|
43
|
+
const _date = toDate(date, options?.in);
|
|
44
|
+
const day = _date.getDay();
|
|
45
|
+
const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
46
|
+
_date.setDate(_date.getDate() - diff);
|
|
47
|
+
_date.setHours(0, 0, 0, 0);
|
|
48
|
+
return _date;
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region node_modules/date-fns/startOfISOWeek.js
|
|
52
|
+
/**
|
|
53
|
+
* The {@link startOfISOWeek} function options.
|
|
54
|
+
*/
|
|
55
|
+
/**
|
|
56
|
+
* @name startOfISOWeek
|
|
57
|
+
* @category ISO Week Helpers
|
|
58
|
+
* @summary Return the start of an ISO week for the given date.
|
|
59
|
+
*
|
|
60
|
+
* @description
|
|
61
|
+
* Return the start of an ISO week for the given date.
|
|
62
|
+
* The result will be in the local timezone.
|
|
63
|
+
*
|
|
64
|
+
* ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
|
|
65
|
+
*
|
|
66
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
67
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
68
|
+
*
|
|
69
|
+
* @param date - The original date
|
|
70
|
+
* @param options - An object with options
|
|
71
|
+
*
|
|
72
|
+
* @returns The start of an ISO week
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* // The start of an ISO week for 2 September 2014 11:55:00:
|
|
76
|
+
* const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))
|
|
77
|
+
* //=> Mon Sep 01 2014 00:00:00
|
|
78
|
+
*/
|
|
79
|
+
function startOfISOWeek(date, options) {
|
|
80
|
+
return startOfWeek(date, {
|
|
81
|
+
...options,
|
|
82
|
+
weekStartsOn: 1
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region node_modules/date-fns/getISOWeekYear.js
|
|
87
|
+
/**
|
|
88
|
+
* The {@link getISOWeekYear} function options.
|
|
89
|
+
*/
|
|
90
|
+
/**
|
|
91
|
+
* @name getISOWeekYear
|
|
92
|
+
* @category ISO Week-Numbering Year Helpers
|
|
93
|
+
* @summary Get the ISO week-numbering year of the given date.
|
|
94
|
+
*
|
|
95
|
+
* @description
|
|
96
|
+
* Get the ISO week-numbering year of the given date,
|
|
97
|
+
* which always starts 3 days before the year's first Thursday.
|
|
98
|
+
*
|
|
99
|
+
* ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
|
|
100
|
+
*
|
|
101
|
+
* @param date - The given date
|
|
102
|
+
*
|
|
103
|
+
* @returns The ISO week-numbering year
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* // Which ISO-week numbering year is 2 January 2005?
|
|
107
|
+
* const result = getISOWeekYear(new Date(2005, 0, 2))
|
|
108
|
+
* //=> 2004
|
|
109
|
+
*/
|
|
110
|
+
function getISOWeekYear(date, options) {
|
|
111
|
+
const _date = toDate(date, options?.in);
|
|
112
|
+
const year = _date.getFullYear();
|
|
113
|
+
const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);
|
|
114
|
+
fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
|
|
115
|
+
fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
|
|
116
|
+
const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
|
|
117
|
+
const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);
|
|
118
|
+
fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
|
|
119
|
+
fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
|
|
120
|
+
const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
|
|
121
|
+
if (_date.getTime() >= startOfNextYear.getTime()) return year + 1;
|
|
122
|
+
else if (_date.getTime() >= startOfThisYear.getTime()) return year;
|
|
123
|
+
else return year - 1;
|
|
124
|
+
}
|
|
125
|
+
//#endregion
|
|
126
|
+
//#region node_modules/date-fns/startOfISOWeekYear.js
|
|
127
|
+
/**
|
|
128
|
+
* The {@link startOfISOWeekYear} function options.
|
|
129
|
+
*/
|
|
130
|
+
/**
|
|
131
|
+
* @name startOfISOWeekYear
|
|
132
|
+
* @category ISO Week-Numbering Year Helpers
|
|
133
|
+
* @summary Return the start of an ISO week-numbering year for the given date.
|
|
134
|
+
*
|
|
135
|
+
* @description
|
|
136
|
+
* Return the start of an ISO week-numbering year,
|
|
137
|
+
* which always starts 3 days before the year's first Thursday.
|
|
138
|
+
* The result will be in the local timezone.
|
|
139
|
+
*
|
|
140
|
+
* ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
|
|
141
|
+
*
|
|
142
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
143
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
144
|
+
*
|
|
145
|
+
* @param date - The original date
|
|
146
|
+
* @param options - An object with options
|
|
147
|
+
*
|
|
148
|
+
* @returns The start of an ISO week-numbering year
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* // The start of an ISO week-numbering year for 2 July 2005:
|
|
152
|
+
* const result = startOfISOWeekYear(new Date(2005, 6, 2))
|
|
153
|
+
* //=> Mon Jan 03 2005 00:00:00
|
|
154
|
+
*/
|
|
155
|
+
function startOfISOWeekYear(date, options) {
|
|
156
|
+
const year = getISOWeekYear(date, options);
|
|
157
|
+
const fourthOfJanuary = constructFrom(options?.in || date, 0);
|
|
158
|
+
fourthOfJanuary.setFullYear(year, 0, 4);
|
|
159
|
+
fourthOfJanuary.setHours(0, 0, 0, 0);
|
|
160
|
+
return startOfISOWeek(fourthOfJanuary);
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
163
|
+
//#region node_modules/date-fns/startOfYear.js
|
|
164
|
+
/**
|
|
165
|
+
* The {@link startOfYear} function options.
|
|
166
|
+
*/
|
|
167
|
+
/**
|
|
168
|
+
* @name startOfYear
|
|
169
|
+
* @category Year Helpers
|
|
170
|
+
* @summary Return the start of a year for the given date.
|
|
171
|
+
*
|
|
172
|
+
* @description
|
|
173
|
+
* Return the start of a year for the given date.
|
|
174
|
+
* The result will be in the local timezone.
|
|
175
|
+
*
|
|
176
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
177
|
+
* @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.
|
|
178
|
+
*
|
|
179
|
+
* @param date - The original date
|
|
180
|
+
* @param options - The options
|
|
181
|
+
*
|
|
182
|
+
* @returns The start of a year
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* // The start of a year for 2 September 2014 11:55:00:
|
|
186
|
+
* const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))
|
|
187
|
+
* //=> Wed Jan 01 2014 00:00:00
|
|
188
|
+
*/
|
|
189
|
+
function startOfYear(date, options) {
|
|
190
|
+
const date_ = toDate(date, options?.in);
|
|
191
|
+
date_.setFullYear(date_.getFullYear(), 0, 1);
|
|
192
|
+
date_.setHours(0, 0, 0, 0);
|
|
193
|
+
return date_;
|
|
194
|
+
}
|
|
195
|
+
//#endregion
|
|
196
|
+
//#region node_modules/date-fns/locale/en-US/_lib/formatDistance.js
|
|
197
|
+
var formatDistanceLocale = {
|
|
198
|
+
lessThanXSeconds: {
|
|
199
|
+
one: "less than a second",
|
|
200
|
+
other: "less than {{count}} seconds"
|
|
201
|
+
},
|
|
202
|
+
xSeconds: {
|
|
203
|
+
one: "1 second",
|
|
204
|
+
other: "{{count}} seconds"
|
|
205
|
+
},
|
|
206
|
+
halfAMinute: "half a minute",
|
|
207
|
+
lessThanXMinutes: {
|
|
208
|
+
one: "less than a minute",
|
|
209
|
+
other: "less than {{count}} minutes"
|
|
210
|
+
},
|
|
211
|
+
xMinutes: {
|
|
212
|
+
one: "1 minute",
|
|
213
|
+
other: "{{count}} minutes"
|
|
214
|
+
},
|
|
215
|
+
aboutXHours: {
|
|
216
|
+
one: "about 1 hour",
|
|
217
|
+
other: "about {{count}} hours"
|
|
218
|
+
},
|
|
219
|
+
xHours: {
|
|
220
|
+
one: "1 hour",
|
|
221
|
+
other: "{{count}} hours"
|
|
222
|
+
},
|
|
223
|
+
xDays: {
|
|
224
|
+
one: "1 day",
|
|
225
|
+
other: "{{count}} days"
|
|
226
|
+
},
|
|
227
|
+
aboutXWeeks: {
|
|
228
|
+
one: "about 1 week",
|
|
229
|
+
other: "about {{count}} weeks"
|
|
230
|
+
},
|
|
231
|
+
xWeeks: {
|
|
232
|
+
one: "1 week",
|
|
233
|
+
other: "{{count}} weeks"
|
|
234
|
+
},
|
|
235
|
+
aboutXMonths: {
|
|
236
|
+
one: "about 1 month",
|
|
237
|
+
other: "about {{count}} months"
|
|
238
|
+
},
|
|
239
|
+
xMonths: {
|
|
240
|
+
one: "1 month",
|
|
241
|
+
other: "{{count}} months"
|
|
242
|
+
},
|
|
243
|
+
aboutXYears: {
|
|
244
|
+
one: "about 1 year",
|
|
245
|
+
other: "about {{count}} years"
|
|
246
|
+
},
|
|
247
|
+
xYears: {
|
|
248
|
+
one: "1 year",
|
|
249
|
+
other: "{{count}} years"
|
|
250
|
+
},
|
|
251
|
+
overXYears: {
|
|
252
|
+
one: "over 1 year",
|
|
253
|
+
other: "over {{count}} years"
|
|
254
|
+
},
|
|
255
|
+
almostXYears: {
|
|
256
|
+
one: "almost 1 year",
|
|
257
|
+
other: "almost {{count}} years"
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
var formatDistance = (token, count, options) => {
|
|
261
|
+
let result;
|
|
262
|
+
const tokenValue = formatDistanceLocale[token];
|
|
263
|
+
if (typeof tokenValue === "string") result = tokenValue;
|
|
264
|
+
else if (count === 1) result = tokenValue.one;
|
|
265
|
+
else result = tokenValue.other.replace("{{count}}", count.toString());
|
|
266
|
+
if (options?.addSuffix) if (options.comparison && options.comparison > 0) return "in " + result;
|
|
267
|
+
else return result + " ago";
|
|
268
|
+
return result;
|
|
269
|
+
};
|
|
270
|
+
//#endregion
|
|
271
|
+
//#region node_modules/date-fns/locale/_lib/buildFormatLongFn.js
|
|
272
|
+
function buildFormatLongFn(args) {
|
|
273
|
+
return (options = {}) => {
|
|
274
|
+
const width = options.width ? String(options.width) : args.defaultWidth;
|
|
275
|
+
return args.formats[width] || args.formats[args.defaultWidth];
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
var formatLong = {
|
|
279
|
+
date: buildFormatLongFn({
|
|
280
|
+
formats: {
|
|
281
|
+
full: "EEEE, MMMM do, y",
|
|
282
|
+
long: "MMMM do, y",
|
|
283
|
+
medium: "MMM d, y",
|
|
284
|
+
short: "MM/dd/yyyy"
|
|
285
|
+
},
|
|
286
|
+
defaultWidth: "full"
|
|
287
|
+
}),
|
|
288
|
+
time: buildFormatLongFn({
|
|
289
|
+
formats: {
|
|
290
|
+
full: "h:mm:ss a zzzz",
|
|
291
|
+
long: "h:mm:ss a z",
|
|
292
|
+
medium: "h:mm:ss a",
|
|
293
|
+
short: "h:mm a"
|
|
294
|
+
},
|
|
295
|
+
defaultWidth: "full"
|
|
296
|
+
}),
|
|
297
|
+
dateTime: buildFormatLongFn({
|
|
298
|
+
formats: {
|
|
299
|
+
full: "{{date}} 'at' {{time}}",
|
|
300
|
+
long: "{{date}} 'at' {{time}}",
|
|
301
|
+
medium: "{{date}}, {{time}}",
|
|
302
|
+
short: "{{date}}, {{time}}"
|
|
303
|
+
},
|
|
304
|
+
defaultWidth: "full"
|
|
305
|
+
})
|
|
306
|
+
};
|
|
307
|
+
//#endregion
|
|
308
|
+
//#region node_modules/date-fns/locale/en-US/_lib/formatRelative.js
|
|
309
|
+
var formatRelativeLocale = {
|
|
310
|
+
lastWeek: "'last' eeee 'at' p",
|
|
311
|
+
yesterday: "'yesterday at' p",
|
|
312
|
+
today: "'today at' p",
|
|
313
|
+
tomorrow: "'tomorrow at' p",
|
|
314
|
+
nextWeek: "eeee 'at' p",
|
|
315
|
+
other: "P"
|
|
316
|
+
};
|
|
317
|
+
var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token];
|
|
318
|
+
//#endregion
|
|
319
|
+
//#region node_modules/date-fns/locale/_lib/buildLocalizeFn.js
|
|
320
|
+
/**
|
|
321
|
+
* The localize function argument callback which allows to convert raw value to
|
|
322
|
+
* the actual type.
|
|
323
|
+
*
|
|
324
|
+
* @param value - The value to convert
|
|
325
|
+
*
|
|
326
|
+
* @returns The converted value
|
|
327
|
+
*/
|
|
328
|
+
/**
|
|
329
|
+
* The map of localized values for each width.
|
|
330
|
+
*/
|
|
331
|
+
/**
|
|
332
|
+
* The index type of the locale unit value. It types conversion of units of
|
|
333
|
+
* values that don't start at 0 (i.e. quarters).
|
|
334
|
+
*/
|
|
335
|
+
/**
|
|
336
|
+
* Converts the unit value to the tuple of values.
|
|
337
|
+
*/
|
|
338
|
+
/**
|
|
339
|
+
* The tuple of localized era values. The first element represents BC,
|
|
340
|
+
* the second element represents AD.
|
|
341
|
+
*/
|
|
342
|
+
/**
|
|
343
|
+
* The tuple of localized quarter values. The first element represents Q1.
|
|
344
|
+
*/
|
|
345
|
+
/**
|
|
346
|
+
* The tuple of localized day values. The first element represents Sunday.
|
|
347
|
+
*/
|
|
348
|
+
/**
|
|
349
|
+
* The tuple of localized month values. The first element represents January.
|
|
350
|
+
*/
|
|
351
|
+
function buildLocalizeFn(args) {
|
|
352
|
+
return (value, options) => {
|
|
353
|
+
const context = options?.context ? String(options.context) : "standalone";
|
|
354
|
+
let valuesArray;
|
|
355
|
+
if (context === "formatting" && args.formattingValues) {
|
|
356
|
+
const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
|
|
357
|
+
const width = options?.width ? String(options.width) : defaultWidth;
|
|
358
|
+
valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
|
|
359
|
+
} else {
|
|
360
|
+
const defaultWidth = args.defaultWidth;
|
|
361
|
+
const width = options?.width ? String(options.width) : args.defaultWidth;
|
|
362
|
+
valuesArray = args.values[width] || args.values[defaultWidth];
|
|
363
|
+
}
|
|
364
|
+
const index = args.argumentCallback ? args.argumentCallback(value) : value;
|
|
365
|
+
return valuesArray[index];
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
//#endregion
|
|
369
|
+
//#region node_modules/date-fns/locale/en-US/_lib/localize.js
|
|
370
|
+
var eraValues = {
|
|
371
|
+
narrow: ["B", "A"],
|
|
372
|
+
abbreviated: ["BC", "AD"],
|
|
373
|
+
wide: ["Before Christ", "Anno Domini"]
|
|
374
|
+
};
|
|
375
|
+
var quarterValues = {
|
|
376
|
+
narrow: [
|
|
377
|
+
"1",
|
|
378
|
+
"2",
|
|
379
|
+
"3",
|
|
380
|
+
"4"
|
|
381
|
+
],
|
|
382
|
+
abbreviated: [
|
|
383
|
+
"Q1",
|
|
384
|
+
"Q2",
|
|
385
|
+
"Q3",
|
|
386
|
+
"Q4"
|
|
387
|
+
],
|
|
388
|
+
wide: [
|
|
389
|
+
"1st quarter",
|
|
390
|
+
"2nd quarter",
|
|
391
|
+
"3rd quarter",
|
|
392
|
+
"4th quarter"
|
|
393
|
+
]
|
|
394
|
+
};
|
|
395
|
+
var monthValues = {
|
|
396
|
+
narrow: [
|
|
397
|
+
"J",
|
|
398
|
+
"F",
|
|
399
|
+
"M",
|
|
400
|
+
"A",
|
|
401
|
+
"M",
|
|
402
|
+
"J",
|
|
403
|
+
"J",
|
|
404
|
+
"A",
|
|
405
|
+
"S",
|
|
406
|
+
"O",
|
|
407
|
+
"N",
|
|
408
|
+
"D"
|
|
409
|
+
],
|
|
410
|
+
abbreviated: [
|
|
411
|
+
"Jan",
|
|
412
|
+
"Feb",
|
|
413
|
+
"Mar",
|
|
414
|
+
"Apr",
|
|
415
|
+
"May",
|
|
416
|
+
"Jun",
|
|
417
|
+
"Jul",
|
|
418
|
+
"Aug",
|
|
419
|
+
"Sep",
|
|
420
|
+
"Oct",
|
|
421
|
+
"Nov",
|
|
422
|
+
"Dec"
|
|
423
|
+
],
|
|
424
|
+
wide: [
|
|
425
|
+
"January",
|
|
426
|
+
"February",
|
|
427
|
+
"March",
|
|
428
|
+
"April",
|
|
429
|
+
"May",
|
|
430
|
+
"June",
|
|
431
|
+
"July",
|
|
432
|
+
"August",
|
|
433
|
+
"September",
|
|
434
|
+
"October",
|
|
435
|
+
"November",
|
|
436
|
+
"December"
|
|
437
|
+
]
|
|
438
|
+
};
|
|
439
|
+
var dayValues = {
|
|
440
|
+
narrow: [
|
|
441
|
+
"S",
|
|
442
|
+
"M",
|
|
443
|
+
"T",
|
|
444
|
+
"W",
|
|
445
|
+
"T",
|
|
446
|
+
"F",
|
|
447
|
+
"S"
|
|
448
|
+
],
|
|
449
|
+
short: [
|
|
450
|
+
"Su",
|
|
451
|
+
"Mo",
|
|
452
|
+
"Tu",
|
|
453
|
+
"We",
|
|
454
|
+
"Th",
|
|
455
|
+
"Fr",
|
|
456
|
+
"Sa"
|
|
457
|
+
],
|
|
458
|
+
abbreviated: [
|
|
459
|
+
"Sun",
|
|
460
|
+
"Mon",
|
|
461
|
+
"Tue",
|
|
462
|
+
"Wed",
|
|
463
|
+
"Thu",
|
|
464
|
+
"Fri",
|
|
465
|
+
"Sat"
|
|
466
|
+
],
|
|
467
|
+
wide: [
|
|
468
|
+
"Sunday",
|
|
469
|
+
"Monday",
|
|
470
|
+
"Tuesday",
|
|
471
|
+
"Wednesday",
|
|
472
|
+
"Thursday",
|
|
473
|
+
"Friday",
|
|
474
|
+
"Saturday"
|
|
475
|
+
]
|
|
476
|
+
};
|
|
477
|
+
var dayPeriodValues = {
|
|
478
|
+
narrow: {
|
|
479
|
+
am: "a",
|
|
480
|
+
pm: "p",
|
|
481
|
+
midnight: "mi",
|
|
482
|
+
noon: "n",
|
|
483
|
+
morning: "morning",
|
|
484
|
+
afternoon: "afternoon",
|
|
485
|
+
evening: "evening",
|
|
486
|
+
night: "night"
|
|
487
|
+
},
|
|
488
|
+
abbreviated: {
|
|
489
|
+
am: "AM",
|
|
490
|
+
pm: "PM",
|
|
491
|
+
midnight: "midnight",
|
|
492
|
+
noon: "noon",
|
|
493
|
+
morning: "morning",
|
|
494
|
+
afternoon: "afternoon",
|
|
495
|
+
evening: "evening",
|
|
496
|
+
night: "night"
|
|
497
|
+
},
|
|
498
|
+
wide: {
|
|
499
|
+
am: "a.m.",
|
|
500
|
+
pm: "p.m.",
|
|
501
|
+
midnight: "midnight",
|
|
502
|
+
noon: "noon",
|
|
503
|
+
morning: "morning",
|
|
504
|
+
afternoon: "afternoon",
|
|
505
|
+
evening: "evening",
|
|
506
|
+
night: "night"
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
var formattingDayPeriodValues = {
|
|
510
|
+
narrow: {
|
|
511
|
+
am: "a",
|
|
512
|
+
pm: "p",
|
|
513
|
+
midnight: "mi",
|
|
514
|
+
noon: "n",
|
|
515
|
+
morning: "in the morning",
|
|
516
|
+
afternoon: "in the afternoon",
|
|
517
|
+
evening: "in the evening",
|
|
518
|
+
night: "at night"
|
|
519
|
+
},
|
|
520
|
+
abbreviated: {
|
|
521
|
+
am: "AM",
|
|
522
|
+
pm: "PM",
|
|
523
|
+
midnight: "midnight",
|
|
524
|
+
noon: "noon",
|
|
525
|
+
morning: "in the morning",
|
|
526
|
+
afternoon: "in the afternoon",
|
|
527
|
+
evening: "in the evening",
|
|
528
|
+
night: "at night"
|
|
529
|
+
},
|
|
530
|
+
wide: {
|
|
531
|
+
am: "a.m.",
|
|
532
|
+
pm: "p.m.",
|
|
533
|
+
midnight: "midnight",
|
|
534
|
+
noon: "noon",
|
|
535
|
+
morning: "in the morning",
|
|
536
|
+
afternoon: "in the afternoon",
|
|
537
|
+
evening: "in the evening",
|
|
538
|
+
night: "at night"
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
var ordinalNumber = (dirtyNumber, _options) => {
|
|
542
|
+
const number = Number(dirtyNumber);
|
|
543
|
+
const rem100 = number % 100;
|
|
544
|
+
if (rem100 > 20 || rem100 < 10) switch (rem100 % 10) {
|
|
545
|
+
case 1: return number + "st";
|
|
546
|
+
case 2: return number + "nd";
|
|
547
|
+
case 3: return number + "rd";
|
|
548
|
+
}
|
|
549
|
+
return number + "th";
|
|
550
|
+
};
|
|
551
|
+
var localize = {
|
|
552
|
+
ordinalNumber,
|
|
553
|
+
era: buildLocalizeFn({
|
|
554
|
+
values: eraValues,
|
|
555
|
+
defaultWidth: "wide"
|
|
556
|
+
}),
|
|
557
|
+
quarter: buildLocalizeFn({
|
|
558
|
+
values: quarterValues,
|
|
559
|
+
defaultWidth: "wide",
|
|
560
|
+
argumentCallback: (quarter) => quarter - 1
|
|
561
|
+
}),
|
|
562
|
+
month: buildLocalizeFn({
|
|
563
|
+
values: monthValues,
|
|
564
|
+
defaultWidth: "wide"
|
|
565
|
+
}),
|
|
566
|
+
day: buildLocalizeFn({
|
|
567
|
+
values: dayValues,
|
|
568
|
+
defaultWidth: "wide"
|
|
569
|
+
}),
|
|
570
|
+
dayPeriod: buildLocalizeFn({
|
|
571
|
+
values: dayPeriodValues,
|
|
572
|
+
defaultWidth: "wide",
|
|
573
|
+
formattingValues: formattingDayPeriodValues,
|
|
574
|
+
defaultFormattingWidth: "wide"
|
|
575
|
+
})
|
|
576
|
+
};
|
|
577
|
+
//#endregion
|
|
578
|
+
//#region node_modules/date-fns/locale/_lib/buildMatchFn.js
|
|
579
|
+
function buildMatchFn(args) {
|
|
580
|
+
return (string, options = {}) => {
|
|
581
|
+
const width = options.width;
|
|
582
|
+
const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
|
|
583
|
+
const matchResult = string.match(matchPattern);
|
|
584
|
+
if (!matchResult) return null;
|
|
585
|
+
const matchedString = matchResult[0];
|
|
586
|
+
const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
|
|
587
|
+
const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : findKey(parsePatterns, (pattern) => pattern.test(matchedString));
|
|
588
|
+
let value;
|
|
589
|
+
value = args.valueCallback ? args.valueCallback(key) : key;
|
|
590
|
+
value = options.valueCallback ? options.valueCallback(value) : value;
|
|
591
|
+
const rest = string.slice(matchedString.length);
|
|
592
|
+
return {
|
|
593
|
+
value,
|
|
594
|
+
rest
|
|
595
|
+
};
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
function findKey(object, predicate) {
|
|
599
|
+
for (const key in object) if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) return key;
|
|
600
|
+
}
|
|
601
|
+
function findIndex(array, predicate) {
|
|
602
|
+
for (let key = 0; key < array.length; key++) if (predicate(array[key])) return key;
|
|
603
|
+
}
|
|
604
|
+
//#endregion
|
|
605
|
+
//#region node_modules/date-fns/locale/_lib/buildMatchPatternFn.js
|
|
606
|
+
function buildMatchPatternFn(args) {
|
|
607
|
+
return (string, options = {}) => {
|
|
608
|
+
const matchResult = string.match(args.matchPattern);
|
|
609
|
+
if (!matchResult) return null;
|
|
610
|
+
const matchedString = matchResult[0];
|
|
611
|
+
const parseResult = string.match(args.parsePattern);
|
|
612
|
+
if (!parseResult) return null;
|
|
613
|
+
let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
|
|
614
|
+
value = options.valueCallback ? options.valueCallback(value) : value;
|
|
615
|
+
const rest = string.slice(matchedString.length);
|
|
616
|
+
return {
|
|
617
|
+
value,
|
|
618
|
+
rest
|
|
619
|
+
};
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
//#endregion
|
|
623
|
+
//#region node_modules/date-fns/locale/en-US.js
|
|
624
|
+
/**
|
|
625
|
+
* @category Locales
|
|
626
|
+
* @summary English locale (United States).
|
|
627
|
+
* @language English
|
|
628
|
+
* @iso-639-2 eng
|
|
629
|
+
* @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)
|
|
630
|
+
* @author Lesha Koss [@leshakoss](https://github.com/leshakoss)
|
|
631
|
+
*/
|
|
632
|
+
var enUS = {
|
|
633
|
+
code: "en-US",
|
|
634
|
+
formatDistance,
|
|
635
|
+
formatLong,
|
|
636
|
+
formatRelative,
|
|
637
|
+
localize,
|
|
638
|
+
match: {
|
|
639
|
+
ordinalNumber: buildMatchPatternFn({
|
|
640
|
+
matchPattern: /^(\d+)(th|st|nd|rd)?/i,
|
|
641
|
+
parsePattern: /\d+/i,
|
|
642
|
+
valueCallback: (value) => parseInt(value, 10)
|
|
643
|
+
}),
|
|
644
|
+
era: buildMatchFn({
|
|
645
|
+
matchPatterns: {
|
|
646
|
+
narrow: /^(b|a)/i,
|
|
647
|
+
abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
|
|
648
|
+
wide: /^(before christ|before common era|anno domini|common era)/i
|
|
649
|
+
},
|
|
650
|
+
defaultMatchWidth: "wide",
|
|
651
|
+
parsePatterns: { any: [/^b/i, /^(a|c)/i] },
|
|
652
|
+
defaultParseWidth: "any"
|
|
653
|
+
}),
|
|
654
|
+
quarter: buildMatchFn({
|
|
655
|
+
matchPatterns: {
|
|
656
|
+
narrow: /^[1234]/i,
|
|
657
|
+
abbreviated: /^q[1234]/i,
|
|
658
|
+
wide: /^[1234](th|st|nd|rd)? quarter/i
|
|
659
|
+
},
|
|
660
|
+
defaultMatchWidth: "wide",
|
|
661
|
+
parsePatterns: { any: [
|
|
662
|
+
/1/i,
|
|
663
|
+
/2/i,
|
|
664
|
+
/3/i,
|
|
665
|
+
/4/i
|
|
666
|
+
] },
|
|
667
|
+
defaultParseWidth: "any",
|
|
668
|
+
valueCallback: (index) => index + 1
|
|
669
|
+
}),
|
|
670
|
+
month: buildMatchFn({
|
|
671
|
+
matchPatterns: {
|
|
672
|
+
narrow: /^[jfmasond]/i,
|
|
673
|
+
abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
|
|
674
|
+
wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
|
|
675
|
+
},
|
|
676
|
+
defaultMatchWidth: "wide",
|
|
677
|
+
parsePatterns: {
|
|
678
|
+
narrow: [
|
|
679
|
+
/^j/i,
|
|
680
|
+
/^f/i,
|
|
681
|
+
/^m/i,
|
|
682
|
+
/^a/i,
|
|
683
|
+
/^m/i,
|
|
684
|
+
/^j/i,
|
|
685
|
+
/^j/i,
|
|
686
|
+
/^a/i,
|
|
687
|
+
/^s/i,
|
|
688
|
+
/^o/i,
|
|
689
|
+
/^n/i,
|
|
690
|
+
/^d/i
|
|
691
|
+
],
|
|
692
|
+
any: [
|
|
693
|
+
/^ja/i,
|
|
694
|
+
/^f/i,
|
|
695
|
+
/^mar/i,
|
|
696
|
+
/^ap/i,
|
|
697
|
+
/^may/i,
|
|
698
|
+
/^jun/i,
|
|
699
|
+
/^jul/i,
|
|
700
|
+
/^au/i,
|
|
701
|
+
/^s/i,
|
|
702
|
+
/^o/i,
|
|
703
|
+
/^n/i,
|
|
704
|
+
/^d/i
|
|
705
|
+
]
|
|
706
|
+
},
|
|
707
|
+
defaultParseWidth: "any"
|
|
708
|
+
}),
|
|
709
|
+
day: buildMatchFn({
|
|
710
|
+
matchPatterns: {
|
|
711
|
+
narrow: /^[smtwf]/i,
|
|
712
|
+
short: /^(su|mo|tu|we|th|fr|sa)/i,
|
|
713
|
+
abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
|
|
714
|
+
wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
|
|
715
|
+
},
|
|
716
|
+
defaultMatchWidth: "wide",
|
|
717
|
+
parsePatterns: {
|
|
718
|
+
narrow: [
|
|
719
|
+
/^s/i,
|
|
720
|
+
/^m/i,
|
|
721
|
+
/^t/i,
|
|
722
|
+
/^w/i,
|
|
723
|
+
/^t/i,
|
|
724
|
+
/^f/i,
|
|
725
|
+
/^s/i
|
|
726
|
+
],
|
|
727
|
+
any: [
|
|
728
|
+
/^su/i,
|
|
729
|
+
/^m/i,
|
|
730
|
+
/^tu/i,
|
|
731
|
+
/^w/i,
|
|
732
|
+
/^th/i,
|
|
733
|
+
/^f/i,
|
|
734
|
+
/^sa/i
|
|
735
|
+
]
|
|
736
|
+
},
|
|
737
|
+
defaultParseWidth: "any"
|
|
738
|
+
}),
|
|
739
|
+
dayPeriod: buildMatchFn({
|
|
740
|
+
matchPatterns: {
|
|
741
|
+
narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
|
|
742
|
+
any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
|
|
743
|
+
},
|
|
744
|
+
defaultMatchWidth: "any",
|
|
745
|
+
parsePatterns: { any: {
|
|
746
|
+
am: /^a/i,
|
|
747
|
+
pm: /^p/i,
|
|
748
|
+
midnight: /^mi/i,
|
|
749
|
+
noon: /^no/i,
|
|
750
|
+
morning: /morning/i,
|
|
751
|
+
afternoon: /afternoon/i,
|
|
752
|
+
evening: /evening/i,
|
|
753
|
+
night: /night/i
|
|
754
|
+
} },
|
|
755
|
+
defaultParseWidth: "any"
|
|
756
|
+
})
|
|
757
|
+
},
|
|
758
|
+
options: {
|
|
759
|
+
weekStartsOn: 0,
|
|
760
|
+
firstWeekContainsDate: 1
|
|
761
|
+
}
|
|
762
|
+
};
|
|
763
|
+
//#endregion
|
|
764
|
+
//#region node_modules/date-fns/getDayOfYear.js
|
|
765
|
+
/**
|
|
766
|
+
* The {@link getDayOfYear} function options.
|
|
767
|
+
*/
|
|
768
|
+
/**
|
|
769
|
+
* @name getDayOfYear
|
|
770
|
+
* @category Day Helpers
|
|
771
|
+
* @summary Get the day of the year of the given date.
|
|
772
|
+
*
|
|
773
|
+
* @description
|
|
774
|
+
* Get the day of the year of the given date.
|
|
775
|
+
*
|
|
776
|
+
* @param date - The given date
|
|
777
|
+
* @param options - The options
|
|
778
|
+
*
|
|
779
|
+
* @returns The day of year
|
|
780
|
+
*
|
|
781
|
+
* @example
|
|
782
|
+
* // Which day of the year is 2 July 2014?
|
|
783
|
+
* const result = getDayOfYear(new Date(2014, 6, 2))
|
|
784
|
+
* //=> 183
|
|
785
|
+
*/
|
|
786
|
+
function getDayOfYear(date, options) {
|
|
787
|
+
const _date = toDate(date, options?.in);
|
|
788
|
+
return differenceInCalendarDays(_date, startOfYear(_date)) + 1;
|
|
789
|
+
}
|
|
790
|
+
//#endregion
|
|
791
|
+
//#region node_modules/date-fns/getISOWeek.js
|
|
792
|
+
/**
|
|
793
|
+
* The {@link getISOWeek} function options.
|
|
794
|
+
*/
|
|
795
|
+
/**
|
|
796
|
+
* @name getISOWeek
|
|
797
|
+
* @category ISO Week Helpers
|
|
798
|
+
* @summary Get the ISO week of the given date.
|
|
799
|
+
*
|
|
800
|
+
* @description
|
|
801
|
+
* Get the ISO week of the given date.
|
|
802
|
+
*
|
|
803
|
+
* ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date
|
|
804
|
+
*
|
|
805
|
+
* @param date - The given date
|
|
806
|
+
* @param options - The options
|
|
807
|
+
*
|
|
808
|
+
* @returns The ISO week
|
|
809
|
+
*
|
|
810
|
+
* @example
|
|
811
|
+
* // Which week of the ISO-week numbering year is 2 January 2005?
|
|
812
|
+
* const result = getISOWeek(new Date(2005, 0, 2))
|
|
813
|
+
* //=> 53
|
|
814
|
+
*/
|
|
815
|
+
function getISOWeek(date, options) {
|
|
816
|
+
const _date = toDate(date, options?.in);
|
|
817
|
+
const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);
|
|
818
|
+
return Math.round(diff / millisecondsInWeek) + 1;
|
|
819
|
+
}
|
|
820
|
+
//#endregion
|
|
821
|
+
//#region node_modules/date-fns/getWeekYear.js
|
|
822
|
+
/**
|
|
823
|
+
* The {@link getWeekYear} function options.
|
|
824
|
+
*/
|
|
825
|
+
/**
|
|
826
|
+
* @name getWeekYear
|
|
827
|
+
* @category Week-Numbering Year Helpers
|
|
828
|
+
* @summary Get the local week-numbering year of the given date.
|
|
829
|
+
*
|
|
830
|
+
* @description
|
|
831
|
+
* Get the local week-numbering year of the given date.
|
|
832
|
+
* The exact calculation depends on the values of
|
|
833
|
+
* `options.weekStartsOn` (which is the index of the first day of the week)
|
|
834
|
+
* and `options.firstWeekContainsDate` (which is the day of January, which is always in
|
|
835
|
+
* the first week of the week-numbering year)
|
|
836
|
+
*
|
|
837
|
+
* Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system
|
|
838
|
+
*
|
|
839
|
+
* @param date - The given date
|
|
840
|
+
* @param options - An object with options.
|
|
841
|
+
*
|
|
842
|
+
* @returns The local week-numbering year
|
|
843
|
+
*
|
|
844
|
+
* @example
|
|
845
|
+
* // Which week numbering year is 26 December 2004 with the default settings?
|
|
846
|
+
* const result = getWeekYear(new Date(2004, 11, 26))
|
|
847
|
+
* //=> 2005
|
|
848
|
+
*
|
|
849
|
+
* @example
|
|
850
|
+
* // Which week numbering year is 26 December 2004 if week starts on Saturday?
|
|
851
|
+
* const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })
|
|
852
|
+
* //=> 2004
|
|
853
|
+
*
|
|
854
|
+
* @example
|
|
855
|
+
* // Which week numbering year is 26 December 2004 if the first week contains 4 January?
|
|
856
|
+
* const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })
|
|
857
|
+
* //=> 2004
|
|
858
|
+
*/
|
|
859
|
+
function getWeekYear(date, options) {
|
|
860
|
+
const _date = toDate(date, options?.in);
|
|
861
|
+
const year = _date.getFullYear();
|
|
862
|
+
const defaultOptions = getDefaultOptions();
|
|
863
|
+
const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions.firstWeekContainsDate ?? defaultOptions.locale?.options?.firstWeekContainsDate ?? 1;
|
|
864
|
+
const firstWeekOfNextYear = constructFrom(options?.in || date, 0);
|
|
865
|
+
firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
|
|
866
|
+
firstWeekOfNextYear.setHours(0, 0, 0, 0);
|
|
867
|
+
const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
|
|
868
|
+
const firstWeekOfThisYear = constructFrom(options?.in || date, 0);
|
|
869
|
+
firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
|
|
870
|
+
firstWeekOfThisYear.setHours(0, 0, 0, 0);
|
|
871
|
+
const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
|
|
872
|
+
if (+_date >= +startOfNextYear) return year + 1;
|
|
873
|
+
else if (+_date >= +startOfThisYear) return year;
|
|
874
|
+
else return year - 1;
|
|
875
|
+
}
|
|
876
|
+
//#endregion
|
|
877
|
+
//#region node_modules/date-fns/startOfWeekYear.js
|
|
878
|
+
/**
|
|
879
|
+
* The {@link startOfWeekYear} function options.
|
|
880
|
+
*/
|
|
881
|
+
/**
|
|
882
|
+
* @name startOfWeekYear
|
|
883
|
+
* @category Week-Numbering Year Helpers
|
|
884
|
+
* @summary Return the start of a local week-numbering year for the given date.
|
|
885
|
+
*
|
|
886
|
+
* @description
|
|
887
|
+
* Return the start of a local week-numbering year.
|
|
888
|
+
* The exact calculation depends on the values of
|
|
889
|
+
* `options.weekStartsOn` (which is the index of the first day of the week)
|
|
890
|
+
* and `options.firstWeekContainsDate` (which is the day of January, which is always in
|
|
891
|
+
* the first week of the week-numbering year)
|
|
892
|
+
*
|
|
893
|
+
* Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system
|
|
894
|
+
*
|
|
895
|
+
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
896
|
+
* @typeParam ResultDate - The result `Date` type.
|
|
897
|
+
*
|
|
898
|
+
* @param date - The original date
|
|
899
|
+
* @param options - An object with options
|
|
900
|
+
*
|
|
901
|
+
* @returns The start of a week-numbering year
|
|
902
|
+
*
|
|
903
|
+
* @example
|
|
904
|
+
* // The start of an a week-numbering year for 2 July 2005 with default settings:
|
|
905
|
+
* const result = startOfWeekYear(new Date(2005, 6, 2))
|
|
906
|
+
* //=> Sun Dec 26 2004 00:00:00
|
|
907
|
+
*
|
|
908
|
+
* @example
|
|
909
|
+
* // The start of a week-numbering year for 2 July 2005
|
|
910
|
+
* // if Monday is the first day of week
|
|
911
|
+
* // and 4 January is always in the first week of the year:
|
|
912
|
+
* const result = startOfWeekYear(new Date(2005, 6, 2), {
|
|
913
|
+
* weekStartsOn: 1,
|
|
914
|
+
* firstWeekContainsDate: 4
|
|
915
|
+
* })
|
|
916
|
+
* //=> Mon Jan 03 2005 00:00:00
|
|
917
|
+
*/
|
|
918
|
+
function startOfWeekYear(date, options) {
|
|
919
|
+
const defaultOptions = getDefaultOptions();
|
|
920
|
+
const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions.firstWeekContainsDate ?? defaultOptions.locale?.options?.firstWeekContainsDate ?? 1;
|
|
921
|
+
const year = getWeekYear(date, options);
|
|
922
|
+
const firstWeek = constructFrom(options?.in || date, 0);
|
|
923
|
+
firstWeek.setFullYear(year, 0, firstWeekContainsDate);
|
|
924
|
+
firstWeek.setHours(0, 0, 0, 0);
|
|
925
|
+
return startOfWeek(firstWeek, options);
|
|
926
|
+
}
|
|
927
|
+
//#endregion
|
|
928
|
+
//#region node_modules/date-fns/getWeek.js
|
|
929
|
+
/**
|
|
930
|
+
* The {@link getWeek} function options.
|
|
931
|
+
*/
|
|
932
|
+
/**
|
|
933
|
+
* @name getWeek
|
|
934
|
+
* @category Week Helpers
|
|
935
|
+
* @summary Get the local week index of the given date.
|
|
936
|
+
*
|
|
937
|
+
* @description
|
|
938
|
+
* Get the local week index of the given date.
|
|
939
|
+
* The exact calculation depends on the values of
|
|
940
|
+
* `options.weekStartsOn` (which is the index of the first day of the week)
|
|
941
|
+
* and `options.firstWeekContainsDate` (which is the day of January, which is always in
|
|
942
|
+
* the first week of the week-numbering year)
|
|
943
|
+
*
|
|
944
|
+
* Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system
|
|
945
|
+
*
|
|
946
|
+
* @param date - The given date
|
|
947
|
+
* @param options - An object with options
|
|
948
|
+
*
|
|
949
|
+
* @returns The week
|
|
950
|
+
*
|
|
951
|
+
* @example
|
|
952
|
+
* // Which week of the local week numbering year is 2 January 2005 with default options?
|
|
953
|
+
* const result = getWeek(new Date(2005, 0, 2))
|
|
954
|
+
* //=> 2
|
|
955
|
+
*
|
|
956
|
+
* @example
|
|
957
|
+
* // Which week of the local week numbering year is 2 January 2005,
|
|
958
|
+
* // if Monday is the first day of the week,
|
|
959
|
+
* // and the first week of the year always contains 4 January?
|
|
960
|
+
* const result = getWeek(new Date(2005, 0, 2), {
|
|
961
|
+
* weekStartsOn: 1,
|
|
962
|
+
* firstWeekContainsDate: 4
|
|
963
|
+
* })
|
|
964
|
+
* //=> 53
|
|
965
|
+
*/
|
|
966
|
+
function getWeek(date, options) {
|
|
967
|
+
const _date = toDate(date, options?.in);
|
|
968
|
+
const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);
|
|
969
|
+
return Math.round(diff / millisecondsInWeek) + 1;
|
|
970
|
+
}
|
|
971
|
+
//#endregion
|
|
972
|
+
//#region node_modules/date-fns/_lib/addLeadingZeros.js
|
|
973
|
+
function addLeadingZeros(number, targetLength) {
|
|
974
|
+
return (number < 0 ? "-" : "") + Math.abs(number).toString().padStart(targetLength, "0");
|
|
975
|
+
}
|
|
976
|
+
//#endregion
|
|
977
|
+
//#region node_modules/date-fns/_lib/format/lightFormatters.js
|
|
978
|
+
var lightFormatters = {
|
|
979
|
+
y(date, token) {
|
|
980
|
+
const signedYear = date.getFullYear();
|
|
981
|
+
const year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
982
|
+
return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
|
|
983
|
+
},
|
|
984
|
+
M(date, token) {
|
|
985
|
+
const month = date.getMonth();
|
|
986
|
+
return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
|
|
987
|
+
},
|
|
988
|
+
d(date, token) {
|
|
989
|
+
return addLeadingZeros(date.getDate(), token.length);
|
|
990
|
+
},
|
|
991
|
+
a(date, token) {
|
|
992
|
+
const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
|
|
993
|
+
switch (token) {
|
|
994
|
+
case "a":
|
|
995
|
+
case "aa": return dayPeriodEnumValue.toUpperCase();
|
|
996
|
+
case "aaa": return dayPeriodEnumValue;
|
|
997
|
+
case "aaaaa": return dayPeriodEnumValue[0];
|
|
998
|
+
default: return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
|
|
999
|
+
}
|
|
1000
|
+
},
|
|
1001
|
+
h(date, token) {
|
|
1002
|
+
return addLeadingZeros(date.getHours() % 12 || 12, token.length);
|
|
1003
|
+
},
|
|
1004
|
+
H(date, token) {
|
|
1005
|
+
return addLeadingZeros(date.getHours(), token.length);
|
|
1006
|
+
},
|
|
1007
|
+
m(date, token) {
|
|
1008
|
+
return addLeadingZeros(date.getMinutes(), token.length);
|
|
1009
|
+
},
|
|
1010
|
+
s(date, token) {
|
|
1011
|
+
return addLeadingZeros(date.getSeconds(), token.length);
|
|
1012
|
+
},
|
|
1013
|
+
S(date, token) {
|
|
1014
|
+
const numberOfDigits = token.length;
|
|
1015
|
+
const milliseconds = date.getMilliseconds();
|
|
1016
|
+
return addLeadingZeros(Math.trunc(milliseconds * Math.pow(10, numberOfDigits - 3)), token.length);
|
|
1017
|
+
}
|
|
1018
|
+
};
|
|
1019
|
+
//#endregion
|
|
1020
|
+
//#region node_modules/date-fns/_lib/format/formatters.js
|
|
1021
|
+
var dayPeriodEnum = {
|
|
1022
|
+
am: "am",
|
|
1023
|
+
pm: "pm",
|
|
1024
|
+
midnight: "midnight",
|
|
1025
|
+
noon: "noon",
|
|
1026
|
+
morning: "morning",
|
|
1027
|
+
afternoon: "afternoon",
|
|
1028
|
+
evening: "evening",
|
|
1029
|
+
night: "night"
|
|
1030
|
+
};
|
|
1031
|
+
var formatters = {
|
|
1032
|
+
G: function(date, token, localize) {
|
|
1033
|
+
const era = date.getFullYear() > 0 ? 1 : 0;
|
|
1034
|
+
switch (token) {
|
|
1035
|
+
case "G":
|
|
1036
|
+
case "GG":
|
|
1037
|
+
case "GGG": return localize.era(era, { width: "abbreviated" });
|
|
1038
|
+
case "GGGGG": return localize.era(era, { width: "narrow" });
|
|
1039
|
+
default: return localize.era(era, { width: "wide" });
|
|
1040
|
+
}
|
|
1041
|
+
},
|
|
1042
|
+
y: function(date, token, localize) {
|
|
1043
|
+
if (token === "yo") {
|
|
1044
|
+
const signedYear = date.getFullYear();
|
|
1045
|
+
const year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
1046
|
+
return localize.ordinalNumber(year, { unit: "year" });
|
|
1047
|
+
}
|
|
1048
|
+
return lightFormatters.y(date, token);
|
|
1049
|
+
},
|
|
1050
|
+
Y: function(date, token, localize, options) {
|
|
1051
|
+
const signedWeekYear = getWeekYear(date, options);
|
|
1052
|
+
const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
|
|
1053
|
+
if (token === "YY") return addLeadingZeros(weekYear % 100, 2);
|
|
1054
|
+
if (token === "Yo") return localize.ordinalNumber(weekYear, { unit: "year" });
|
|
1055
|
+
return addLeadingZeros(weekYear, token.length);
|
|
1056
|
+
},
|
|
1057
|
+
R: function(date, token) {
|
|
1058
|
+
return addLeadingZeros(getISOWeekYear(date), token.length);
|
|
1059
|
+
},
|
|
1060
|
+
u: function(date, token) {
|
|
1061
|
+
return addLeadingZeros(date.getFullYear(), token.length);
|
|
1062
|
+
},
|
|
1063
|
+
Q: function(date, token, localize) {
|
|
1064
|
+
const quarter = Math.ceil((date.getMonth() + 1) / 3);
|
|
1065
|
+
switch (token) {
|
|
1066
|
+
case "Q": return String(quarter);
|
|
1067
|
+
case "QQ": return addLeadingZeros(quarter, 2);
|
|
1068
|
+
case "Qo": return localize.ordinalNumber(quarter, { unit: "quarter" });
|
|
1069
|
+
case "QQQ": return localize.quarter(quarter, {
|
|
1070
|
+
width: "abbreviated",
|
|
1071
|
+
context: "formatting"
|
|
1072
|
+
});
|
|
1073
|
+
case "QQQQQ": return localize.quarter(quarter, {
|
|
1074
|
+
width: "narrow",
|
|
1075
|
+
context: "formatting"
|
|
1076
|
+
});
|
|
1077
|
+
default: return localize.quarter(quarter, {
|
|
1078
|
+
width: "wide",
|
|
1079
|
+
context: "formatting"
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
},
|
|
1083
|
+
q: function(date, token, localize) {
|
|
1084
|
+
const quarter = Math.ceil((date.getMonth() + 1) / 3);
|
|
1085
|
+
switch (token) {
|
|
1086
|
+
case "q": return String(quarter);
|
|
1087
|
+
case "qq": return addLeadingZeros(quarter, 2);
|
|
1088
|
+
case "qo": return localize.ordinalNumber(quarter, { unit: "quarter" });
|
|
1089
|
+
case "qqq": return localize.quarter(quarter, {
|
|
1090
|
+
width: "abbreviated",
|
|
1091
|
+
context: "standalone"
|
|
1092
|
+
});
|
|
1093
|
+
case "qqqqq": return localize.quarter(quarter, {
|
|
1094
|
+
width: "narrow",
|
|
1095
|
+
context: "standalone"
|
|
1096
|
+
});
|
|
1097
|
+
default: return localize.quarter(quarter, {
|
|
1098
|
+
width: "wide",
|
|
1099
|
+
context: "standalone"
|
|
1100
|
+
});
|
|
1101
|
+
}
|
|
1102
|
+
},
|
|
1103
|
+
M: function(date, token, localize) {
|
|
1104
|
+
const month = date.getMonth();
|
|
1105
|
+
switch (token) {
|
|
1106
|
+
case "M":
|
|
1107
|
+
case "MM": return lightFormatters.M(date, token);
|
|
1108
|
+
case "Mo": return localize.ordinalNumber(month + 1, { unit: "month" });
|
|
1109
|
+
case "MMM": return localize.month(month, {
|
|
1110
|
+
width: "abbreviated",
|
|
1111
|
+
context: "formatting"
|
|
1112
|
+
});
|
|
1113
|
+
case "MMMMM": return localize.month(month, {
|
|
1114
|
+
width: "narrow",
|
|
1115
|
+
context: "formatting"
|
|
1116
|
+
});
|
|
1117
|
+
default: return localize.month(month, {
|
|
1118
|
+
width: "wide",
|
|
1119
|
+
context: "formatting"
|
|
1120
|
+
});
|
|
1121
|
+
}
|
|
1122
|
+
},
|
|
1123
|
+
L: function(date, token, localize) {
|
|
1124
|
+
const month = date.getMonth();
|
|
1125
|
+
switch (token) {
|
|
1126
|
+
case "L": return String(month + 1);
|
|
1127
|
+
case "LL": return addLeadingZeros(month + 1, 2);
|
|
1128
|
+
case "Lo": return localize.ordinalNumber(month + 1, { unit: "month" });
|
|
1129
|
+
case "LLL": return localize.month(month, {
|
|
1130
|
+
width: "abbreviated",
|
|
1131
|
+
context: "standalone"
|
|
1132
|
+
});
|
|
1133
|
+
case "LLLLL": return localize.month(month, {
|
|
1134
|
+
width: "narrow",
|
|
1135
|
+
context: "standalone"
|
|
1136
|
+
});
|
|
1137
|
+
default: return localize.month(month, {
|
|
1138
|
+
width: "wide",
|
|
1139
|
+
context: "standalone"
|
|
1140
|
+
});
|
|
1141
|
+
}
|
|
1142
|
+
},
|
|
1143
|
+
w: function(date, token, localize, options) {
|
|
1144
|
+
const week = getWeek(date, options);
|
|
1145
|
+
if (token === "wo") return localize.ordinalNumber(week, { unit: "week" });
|
|
1146
|
+
return addLeadingZeros(week, token.length);
|
|
1147
|
+
},
|
|
1148
|
+
I: function(date, token, localize) {
|
|
1149
|
+
const isoWeek = getISOWeek(date);
|
|
1150
|
+
if (token === "Io") return localize.ordinalNumber(isoWeek, { unit: "week" });
|
|
1151
|
+
return addLeadingZeros(isoWeek, token.length);
|
|
1152
|
+
},
|
|
1153
|
+
d: function(date, token, localize) {
|
|
1154
|
+
if (token === "do") return localize.ordinalNumber(date.getDate(), { unit: "date" });
|
|
1155
|
+
return lightFormatters.d(date, token);
|
|
1156
|
+
},
|
|
1157
|
+
D: function(date, token, localize) {
|
|
1158
|
+
const dayOfYear = getDayOfYear(date);
|
|
1159
|
+
if (token === "Do") return localize.ordinalNumber(dayOfYear, { unit: "dayOfYear" });
|
|
1160
|
+
return addLeadingZeros(dayOfYear, token.length);
|
|
1161
|
+
},
|
|
1162
|
+
E: function(date, token, localize) {
|
|
1163
|
+
const dayOfWeek = date.getDay();
|
|
1164
|
+
switch (token) {
|
|
1165
|
+
case "E":
|
|
1166
|
+
case "EE":
|
|
1167
|
+
case "EEE": return localize.day(dayOfWeek, {
|
|
1168
|
+
width: "abbreviated",
|
|
1169
|
+
context: "formatting"
|
|
1170
|
+
});
|
|
1171
|
+
case "EEEEE": return localize.day(dayOfWeek, {
|
|
1172
|
+
width: "narrow",
|
|
1173
|
+
context: "formatting"
|
|
1174
|
+
});
|
|
1175
|
+
case "EEEEEE": return localize.day(dayOfWeek, {
|
|
1176
|
+
width: "short",
|
|
1177
|
+
context: "formatting"
|
|
1178
|
+
});
|
|
1179
|
+
default: return localize.day(dayOfWeek, {
|
|
1180
|
+
width: "wide",
|
|
1181
|
+
context: "formatting"
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
},
|
|
1185
|
+
e: function(date, token, localize, options) {
|
|
1186
|
+
const dayOfWeek = date.getDay();
|
|
1187
|
+
const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
1188
|
+
switch (token) {
|
|
1189
|
+
case "e": return String(localDayOfWeek);
|
|
1190
|
+
case "ee": return addLeadingZeros(localDayOfWeek, 2);
|
|
1191
|
+
case "eo": return localize.ordinalNumber(localDayOfWeek, { unit: "day" });
|
|
1192
|
+
case "eee": return localize.day(dayOfWeek, {
|
|
1193
|
+
width: "abbreviated",
|
|
1194
|
+
context: "formatting"
|
|
1195
|
+
});
|
|
1196
|
+
case "eeeee": return localize.day(dayOfWeek, {
|
|
1197
|
+
width: "narrow",
|
|
1198
|
+
context: "formatting"
|
|
1199
|
+
});
|
|
1200
|
+
case "eeeeee": return localize.day(dayOfWeek, {
|
|
1201
|
+
width: "short",
|
|
1202
|
+
context: "formatting"
|
|
1203
|
+
});
|
|
1204
|
+
default: return localize.day(dayOfWeek, {
|
|
1205
|
+
width: "wide",
|
|
1206
|
+
context: "formatting"
|
|
1207
|
+
});
|
|
1208
|
+
}
|
|
1209
|
+
},
|
|
1210
|
+
c: function(date, token, localize, options) {
|
|
1211
|
+
const dayOfWeek = date.getDay();
|
|
1212
|
+
const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
1213
|
+
switch (token) {
|
|
1214
|
+
case "c": return String(localDayOfWeek);
|
|
1215
|
+
case "cc": return addLeadingZeros(localDayOfWeek, token.length);
|
|
1216
|
+
case "co": return localize.ordinalNumber(localDayOfWeek, { unit: "day" });
|
|
1217
|
+
case "ccc": return localize.day(dayOfWeek, {
|
|
1218
|
+
width: "abbreviated",
|
|
1219
|
+
context: "standalone"
|
|
1220
|
+
});
|
|
1221
|
+
case "ccccc": return localize.day(dayOfWeek, {
|
|
1222
|
+
width: "narrow",
|
|
1223
|
+
context: "standalone"
|
|
1224
|
+
});
|
|
1225
|
+
case "cccccc": return localize.day(dayOfWeek, {
|
|
1226
|
+
width: "short",
|
|
1227
|
+
context: "standalone"
|
|
1228
|
+
});
|
|
1229
|
+
default: return localize.day(dayOfWeek, {
|
|
1230
|
+
width: "wide",
|
|
1231
|
+
context: "standalone"
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
},
|
|
1235
|
+
i: function(date, token, localize) {
|
|
1236
|
+
const dayOfWeek = date.getDay();
|
|
1237
|
+
const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
|
|
1238
|
+
switch (token) {
|
|
1239
|
+
case "i": return String(isoDayOfWeek);
|
|
1240
|
+
case "ii": return addLeadingZeros(isoDayOfWeek, token.length);
|
|
1241
|
+
case "io": return localize.ordinalNumber(isoDayOfWeek, { unit: "day" });
|
|
1242
|
+
case "iii": return localize.day(dayOfWeek, {
|
|
1243
|
+
width: "abbreviated",
|
|
1244
|
+
context: "formatting"
|
|
1245
|
+
});
|
|
1246
|
+
case "iiiii": return localize.day(dayOfWeek, {
|
|
1247
|
+
width: "narrow",
|
|
1248
|
+
context: "formatting"
|
|
1249
|
+
});
|
|
1250
|
+
case "iiiiii": return localize.day(dayOfWeek, {
|
|
1251
|
+
width: "short",
|
|
1252
|
+
context: "formatting"
|
|
1253
|
+
});
|
|
1254
|
+
default: return localize.day(dayOfWeek, {
|
|
1255
|
+
width: "wide",
|
|
1256
|
+
context: "formatting"
|
|
1257
|
+
});
|
|
1258
|
+
}
|
|
1259
|
+
},
|
|
1260
|
+
a: function(date, token, localize) {
|
|
1261
|
+
const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am";
|
|
1262
|
+
switch (token) {
|
|
1263
|
+
case "a":
|
|
1264
|
+
case "aa": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1265
|
+
width: "abbreviated",
|
|
1266
|
+
context: "formatting"
|
|
1267
|
+
});
|
|
1268
|
+
case "aaa": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1269
|
+
width: "abbreviated",
|
|
1270
|
+
context: "formatting"
|
|
1271
|
+
}).toLowerCase();
|
|
1272
|
+
case "aaaaa": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1273
|
+
width: "narrow",
|
|
1274
|
+
context: "formatting"
|
|
1275
|
+
});
|
|
1276
|
+
default: return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1277
|
+
width: "wide",
|
|
1278
|
+
context: "formatting"
|
|
1279
|
+
});
|
|
1280
|
+
}
|
|
1281
|
+
},
|
|
1282
|
+
b: function(date, token, localize) {
|
|
1283
|
+
const hours = date.getHours();
|
|
1284
|
+
let dayPeriodEnumValue;
|
|
1285
|
+
if (hours === 12) dayPeriodEnumValue = dayPeriodEnum.noon;
|
|
1286
|
+
else if (hours === 0) dayPeriodEnumValue = dayPeriodEnum.midnight;
|
|
1287
|
+
else dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
|
|
1288
|
+
switch (token) {
|
|
1289
|
+
case "b":
|
|
1290
|
+
case "bb": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1291
|
+
width: "abbreviated",
|
|
1292
|
+
context: "formatting"
|
|
1293
|
+
});
|
|
1294
|
+
case "bbb": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1295
|
+
width: "abbreviated",
|
|
1296
|
+
context: "formatting"
|
|
1297
|
+
}).toLowerCase();
|
|
1298
|
+
case "bbbbb": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1299
|
+
width: "narrow",
|
|
1300
|
+
context: "formatting"
|
|
1301
|
+
});
|
|
1302
|
+
default: return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1303
|
+
width: "wide",
|
|
1304
|
+
context: "formatting"
|
|
1305
|
+
});
|
|
1306
|
+
}
|
|
1307
|
+
},
|
|
1308
|
+
B: function(date, token, localize) {
|
|
1309
|
+
const hours = date.getHours();
|
|
1310
|
+
let dayPeriodEnumValue;
|
|
1311
|
+
if (hours >= 17) dayPeriodEnumValue = dayPeriodEnum.evening;
|
|
1312
|
+
else if (hours >= 12) dayPeriodEnumValue = dayPeriodEnum.afternoon;
|
|
1313
|
+
else if (hours >= 4) dayPeriodEnumValue = dayPeriodEnum.morning;
|
|
1314
|
+
else dayPeriodEnumValue = dayPeriodEnum.night;
|
|
1315
|
+
switch (token) {
|
|
1316
|
+
case "B":
|
|
1317
|
+
case "BB":
|
|
1318
|
+
case "BBB": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1319
|
+
width: "abbreviated",
|
|
1320
|
+
context: "formatting"
|
|
1321
|
+
});
|
|
1322
|
+
case "BBBBB": return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1323
|
+
width: "narrow",
|
|
1324
|
+
context: "formatting"
|
|
1325
|
+
});
|
|
1326
|
+
default: return localize.dayPeriod(dayPeriodEnumValue, {
|
|
1327
|
+
width: "wide",
|
|
1328
|
+
context: "formatting"
|
|
1329
|
+
});
|
|
1330
|
+
}
|
|
1331
|
+
},
|
|
1332
|
+
h: function(date, token, localize) {
|
|
1333
|
+
if (token === "ho") {
|
|
1334
|
+
let hours = date.getHours() % 12;
|
|
1335
|
+
if (hours === 0) hours = 12;
|
|
1336
|
+
return localize.ordinalNumber(hours, { unit: "hour" });
|
|
1337
|
+
}
|
|
1338
|
+
return lightFormatters.h(date, token);
|
|
1339
|
+
},
|
|
1340
|
+
H: function(date, token, localize) {
|
|
1341
|
+
if (token === "Ho") return localize.ordinalNumber(date.getHours(), { unit: "hour" });
|
|
1342
|
+
return lightFormatters.H(date, token);
|
|
1343
|
+
},
|
|
1344
|
+
K: function(date, token, localize) {
|
|
1345
|
+
const hours = date.getHours() % 12;
|
|
1346
|
+
if (token === "Ko") return localize.ordinalNumber(hours, { unit: "hour" });
|
|
1347
|
+
return addLeadingZeros(hours, token.length);
|
|
1348
|
+
},
|
|
1349
|
+
k: function(date, token, localize) {
|
|
1350
|
+
let hours = date.getHours();
|
|
1351
|
+
if (hours === 0) hours = 24;
|
|
1352
|
+
if (token === "ko") return localize.ordinalNumber(hours, { unit: "hour" });
|
|
1353
|
+
return addLeadingZeros(hours, token.length);
|
|
1354
|
+
},
|
|
1355
|
+
m: function(date, token, localize) {
|
|
1356
|
+
if (token === "mo") return localize.ordinalNumber(date.getMinutes(), { unit: "minute" });
|
|
1357
|
+
return lightFormatters.m(date, token);
|
|
1358
|
+
},
|
|
1359
|
+
s: function(date, token, localize) {
|
|
1360
|
+
if (token === "so") return localize.ordinalNumber(date.getSeconds(), { unit: "second" });
|
|
1361
|
+
return lightFormatters.s(date, token);
|
|
1362
|
+
},
|
|
1363
|
+
S: function(date, token) {
|
|
1364
|
+
return lightFormatters.S(date, token);
|
|
1365
|
+
},
|
|
1366
|
+
X: function(date, token, _localize) {
|
|
1367
|
+
const timezoneOffset = date.getTimezoneOffset();
|
|
1368
|
+
if (timezoneOffset === 0) return "Z";
|
|
1369
|
+
switch (token) {
|
|
1370
|
+
case "X": return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
1371
|
+
case "XXXX":
|
|
1372
|
+
case "XX": return formatTimezone(timezoneOffset);
|
|
1373
|
+
default: return formatTimezone(timezoneOffset, ":");
|
|
1374
|
+
}
|
|
1375
|
+
},
|
|
1376
|
+
x: function(date, token, _localize) {
|
|
1377
|
+
const timezoneOffset = date.getTimezoneOffset();
|
|
1378
|
+
switch (token) {
|
|
1379
|
+
case "x": return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
1380
|
+
case "xxxx":
|
|
1381
|
+
case "xx": return formatTimezone(timezoneOffset);
|
|
1382
|
+
default: return formatTimezone(timezoneOffset, ":");
|
|
1383
|
+
}
|
|
1384
|
+
},
|
|
1385
|
+
O: function(date, token, _localize) {
|
|
1386
|
+
const timezoneOffset = date.getTimezoneOffset();
|
|
1387
|
+
switch (token) {
|
|
1388
|
+
case "O":
|
|
1389
|
+
case "OO":
|
|
1390
|
+
case "OOO": return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
1391
|
+
default: return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
1392
|
+
}
|
|
1393
|
+
},
|
|
1394
|
+
z: function(date, token, _localize) {
|
|
1395
|
+
const timezoneOffset = date.getTimezoneOffset();
|
|
1396
|
+
switch (token) {
|
|
1397
|
+
case "z":
|
|
1398
|
+
case "zz":
|
|
1399
|
+
case "zzz": return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
1400
|
+
default: return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
1401
|
+
}
|
|
1402
|
+
},
|
|
1403
|
+
t: function(date, token, _localize) {
|
|
1404
|
+
return addLeadingZeros(Math.trunc(+date / 1e3), token.length);
|
|
1405
|
+
},
|
|
1406
|
+
T: function(date, token, _localize) {
|
|
1407
|
+
return addLeadingZeros(+date, token.length);
|
|
1408
|
+
}
|
|
1409
|
+
};
|
|
1410
|
+
function formatTimezoneShort(offset, delimiter = "") {
|
|
1411
|
+
const sign = offset > 0 ? "-" : "+";
|
|
1412
|
+
const absOffset = Math.abs(offset);
|
|
1413
|
+
const hours = Math.trunc(absOffset / 60);
|
|
1414
|
+
const minutes = absOffset % 60;
|
|
1415
|
+
if (minutes === 0) return sign + String(hours);
|
|
1416
|
+
return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
|
|
1417
|
+
}
|
|
1418
|
+
function formatTimezoneWithOptionalMinutes(offset, delimiter) {
|
|
1419
|
+
if (offset % 60 === 0) return (offset > 0 ? "-" : "+") + addLeadingZeros(Math.abs(offset) / 60, 2);
|
|
1420
|
+
return formatTimezone(offset, delimiter);
|
|
1421
|
+
}
|
|
1422
|
+
function formatTimezone(offset, delimiter = "") {
|
|
1423
|
+
const sign = offset > 0 ? "-" : "+";
|
|
1424
|
+
const absOffset = Math.abs(offset);
|
|
1425
|
+
const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);
|
|
1426
|
+
const minutes = addLeadingZeros(absOffset % 60, 2);
|
|
1427
|
+
return sign + hours + delimiter + minutes;
|
|
1428
|
+
}
|
|
1429
|
+
//#endregion
|
|
1430
|
+
//#region node_modules/date-fns/_lib/format/longFormatters.js
|
|
1431
|
+
var dateLongFormatter = (pattern, formatLong) => {
|
|
1432
|
+
switch (pattern) {
|
|
1433
|
+
case "P": return formatLong.date({ width: "short" });
|
|
1434
|
+
case "PP": return formatLong.date({ width: "medium" });
|
|
1435
|
+
case "PPP": return formatLong.date({ width: "long" });
|
|
1436
|
+
default: return formatLong.date({ width: "full" });
|
|
1437
|
+
}
|
|
1438
|
+
};
|
|
1439
|
+
var timeLongFormatter = (pattern, formatLong) => {
|
|
1440
|
+
switch (pattern) {
|
|
1441
|
+
case "p": return formatLong.time({ width: "short" });
|
|
1442
|
+
case "pp": return formatLong.time({ width: "medium" });
|
|
1443
|
+
case "ppp": return formatLong.time({ width: "long" });
|
|
1444
|
+
default: return formatLong.time({ width: "full" });
|
|
1445
|
+
}
|
|
1446
|
+
};
|
|
1447
|
+
var dateTimeLongFormatter = (pattern, formatLong) => {
|
|
1448
|
+
const matchResult = pattern.match(/(P+)(p+)?/) || [];
|
|
1449
|
+
const datePattern = matchResult[1];
|
|
1450
|
+
const timePattern = matchResult[2];
|
|
1451
|
+
if (!timePattern) return dateLongFormatter(pattern, formatLong);
|
|
1452
|
+
let dateTimeFormat;
|
|
1453
|
+
switch (datePattern) {
|
|
1454
|
+
case "P":
|
|
1455
|
+
dateTimeFormat = formatLong.dateTime({ width: "short" });
|
|
1456
|
+
break;
|
|
1457
|
+
case "PP":
|
|
1458
|
+
dateTimeFormat = formatLong.dateTime({ width: "medium" });
|
|
1459
|
+
break;
|
|
1460
|
+
case "PPP":
|
|
1461
|
+
dateTimeFormat = formatLong.dateTime({ width: "long" });
|
|
1462
|
+
break;
|
|
1463
|
+
default:
|
|
1464
|
+
dateTimeFormat = formatLong.dateTime({ width: "full" });
|
|
1465
|
+
break;
|
|
1466
|
+
}
|
|
1467
|
+
return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong)).replace("{{time}}", timeLongFormatter(timePattern, formatLong));
|
|
1468
|
+
};
|
|
1469
|
+
var longFormatters = {
|
|
1470
|
+
p: timeLongFormatter,
|
|
1471
|
+
P: dateTimeLongFormatter
|
|
1472
|
+
};
|
|
1473
|
+
//#endregion
|
|
1474
|
+
//#region node_modules/date-fns/_lib/protectedTokens.js
|
|
1475
|
+
var dayOfYearTokenRE = /^D+$/;
|
|
1476
|
+
var weekYearTokenRE = /^Y+$/;
|
|
1477
|
+
var throwTokens = [
|
|
1478
|
+
"D",
|
|
1479
|
+
"DD",
|
|
1480
|
+
"YY",
|
|
1481
|
+
"YYYY"
|
|
1482
|
+
];
|
|
1483
|
+
function isProtectedDayOfYearToken(token) {
|
|
1484
|
+
return dayOfYearTokenRE.test(token);
|
|
1485
|
+
}
|
|
1486
|
+
function isProtectedWeekYearToken(token) {
|
|
1487
|
+
return weekYearTokenRE.test(token);
|
|
1488
|
+
}
|
|
1489
|
+
function warnOrThrowProtectedError(token, format, input) {
|
|
1490
|
+
const _message = message(token, format, input);
|
|
1491
|
+
console.warn(_message);
|
|
1492
|
+
if (throwTokens.includes(token)) throw new RangeError(_message);
|
|
1493
|
+
}
|
|
1494
|
+
function message(token, format, input) {
|
|
1495
|
+
const subject = token[0] === "Y" ? "years" : "days of the month";
|
|
1496
|
+
return `Use \`${token.toLowerCase()}\` instead of \`${token}\` (in \`${format}\`) for formatting ${subject} to the input \`${input}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;
|
|
1497
|
+
}
|
|
1498
|
+
//#endregion
|
|
1499
|
+
//#region node_modules/date-fns/format.js
|
|
1500
|
+
var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
|
|
1501
|
+
var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
|
|
1502
|
+
var escapedStringRegExp = /^'([^]*?)'?$/;
|
|
1503
|
+
var doubleQuoteRegExp = /''/g;
|
|
1504
|
+
var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
|
|
1505
|
+
/**
|
|
1506
|
+
* The {@link format} function options.
|
|
1507
|
+
*/
|
|
1508
|
+
/**
|
|
1509
|
+
* @name format
|
|
1510
|
+
* @alias formatDate
|
|
1511
|
+
* @category Common Helpers
|
|
1512
|
+
* @summary Format the date.
|
|
1513
|
+
*
|
|
1514
|
+
* @description
|
|
1515
|
+
* Return the formatted date string in the given format. The result may vary by locale.
|
|
1516
|
+
*
|
|
1517
|
+
* > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.
|
|
1518
|
+
* > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
1519
|
+
*
|
|
1520
|
+
* The characters wrapped between two single quotes characters (') are escaped.
|
|
1521
|
+
* Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.
|
|
1522
|
+
* (see the last example)
|
|
1523
|
+
*
|
|
1524
|
+
* Format of the string is based on Unicode Technical Standard #35:
|
|
1525
|
+
* https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
|
|
1526
|
+
* with a few additions (see note 7 below the table).
|
|
1527
|
+
*
|
|
1528
|
+
* Accepted patterns:
|
|
1529
|
+
* | Unit | Pattern | Result examples | Notes |
|
|
1530
|
+
* |---------------------------------|---------|-----------------------------------|-------|
|
|
1531
|
+
* | Era | G..GGG | AD, BC | |
|
|
1532
|
+
* | | GGGG | Anno Domini, Before Christ | 2 |
|
|
1533
|
+
* | | GGGGG | A, B | |
|
|
1534
|
+
* | Calendar year | y | 44, 1, 1900, 2017 | 5 |
|
|
1535
|
+
* | | yo | 44th, 1st, 0th, 17th | 5,7 |
|
|
1536
|
+
* | | yy | 44, 01, 00, 17 | 5 |
|
|
1537
|
+
* | | yyy | 044, 001, 1900, 2017 | 5 |
|
|
1538
|
+
* | | yyyy | 0044, 0001, 1900, 2017 | 5 |
|
|
1539
|
+
* | | yyyyy | ... | 3,5 |
|
|
1540
|
+
* | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |
|
|
1541
|
+
* | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |
|
|
1542
|
+
* | | YY | 44, 01, 00, 17 | 5,8 |
|
|
1543
|
+
* | | YYY | 044, 001, 1900, 2017 | 5 |
|
|
1544
|
+
* | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |
|
|
1545
|
+
* | | YYYYY | ... | 3,5 |
|
|
1546
|
+
* | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |
|
|
1547
|
+
* | | RR | -43, 00, 01, 1900, 2017 | 5,7 |
|
|
1548
|
+
* | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |
|
|
1549
|
+
* | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |
|
|
1550
|
+
* | | RRRRR | ... | 3,5,7 |
|
|
1551
|
+
* | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |
|
|
1552
|
+
* | | uu | -43, 01, 1900, 2017 | 5 |
|
|
1553
|
+
* | | uuu | -043, 001, 1900, 2017 | 5 |
|
|
1554
|
+
* | | uuuu | -0043, 0001, 1900, 2017 | 5 |
|
|
1555
|
+
* | | uuuuu | ... | 3,5 |
|
|
1556
|
+
* | Quarter (formatting) | Q | 1, 2, 3, 4 | |
|
|
1557
|
+
* | | Qo | 1st, 2nd, 3rd, 4th | 7 |
|
|
1558
|
+
* | | QQ | 01, 02, 03, 04 | |
|
|
1559
|
+
* | | QQQ | Q1, Q2, Q3, Q4 | |
|
|
1560
|
+
* | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |
|
|
1561
|
+
* | | QQQQQ | 1, 2, 3, 4 | 4 |
|
|
1562
|
+
* | Quarter (stand-alone) | q | 1, 2, 3, 4 | |
|
|
1563
|
+
* | | qo | 1st, 2nd, 3rd, 4th | 7 |
|
|
1564
|
+
* | | qq | 01, 02, 03, 04 | |
|
|
1565
|
+
* | | qqq | Q1, Q2, Q3, Q4 | |
|
|
1566
|
+
* | | qqqq | 1st quarter, 2nd quarter, ... | 2 |
|
|
1567
|
+
* | | qqqqq | 1, 2, 3, 4 | 4 |
|
|
1568
|
+
* | Month (formatting) | M | 1, 2, ..., 12 | |
|
|
1569
|
+
* | | Mo | 1st, 2nd, ..., 12th | 7 |
|
|
1570
|
+
* | | MM | 01, 02, ..., 12 | |
|
|
1571
|
+
* | | MMM | Jan, Feb, ..., Dec | |
|
|
1572
|
+
* | | MMMM | January, February, ..., December | 2 |
|
|
1573
|
+
* | | MMMMM | J, F, ..., D | |
|
|
1574
|
+
* | Month (stand-alone) | L | 1, 2, ..., 12 | |
|
|
1575
|
+
* | | Lo | 1st, 2nd, ..., 12th | 7 |
|
|
1576
|
+
* | | LL | 01, 02, ..., 12 | |
|
|
1577
|
+
* | | LLL | Jan, Feb, ..., Dec | |
|
|
1578
|
+
* | | LLLL | January, February, ..., December | 2 |
|
|
1579
|
+
* | | LLLLL | J, F, ..., D | |
|
|
1580
|
+
* | Local week of year | w | 1, 2, ..., 53 | |
|
|
1581
|
+
* | | wo | 1st, 2nd, ..., 53th | 7 |
|
|
1582
|
+
* | | ww | 01, 02, ..., 53 | |
|
|
1583
|
+
* | ISO week of year | I | 1, 2, ..., 53 | 7 |
|
|
1584
|
+
* | | Io | 1st, 2nd, ..., 53th | 7 |
|
|
1585
|
+
* | | II | 01, 02, ..., 53 | 7 |
|
|
1586
|
+
* | Day of month | d | 1, 2, ..., 31 | |
|
|
1587
|
+
* | | do | 1st, 2nd, ..., 31st | 7 |
|
|
1588
|
+
* | | dd | 01, 02, ..., 31 | |
|
|
1589
|
+
* | Day of year | D | 1, 2, ..., 365, 366 | 9 |
|
|
1590
|
+
* | | Do | 1st, 2nd, ..., 365th, 366th | 7 |
|
|
1591
|
+
* | | DD | 01, 02, ..., 365, 366 | 9 |
|
|
1592
|
+
* | | DDD | 001, 002, ..., 365, 366 | |
|
|
1593
|
+
* | | DDDD | ... | 3 |
|
|
1594
|
+
* | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |
|
|
1595
|
+
* | | EEEE | Monday, Tuesday, ..., Sunday | 2 |
|
|
1596
|
+
* | | EEEEE | M, T, W, T, F, S, S | |
|
|
1597
|
+
* | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |
|
|
1598
|
+
* | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |
|
|
1599
|
+
* | | io | 1st, 2nd, ..., 7th | 7 |
|
|
1600
|
+
* | | ii | 01, 02, ..., 07 | 7 |
|
|
1601
|
+
* | | iii | Mon, Tue, Wed, ..., Sun | 7 |
|
|
1602
|
+
* | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |
|
|
1603
|
+
* | | iiiii | M, T, W, T, F, S, S | 7 |
|
|
1604
|
+
* | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |
|
|
1605
|
+
* | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |
|
|
1606
|
+
* | | eo | 2nd, 3rd, ..., 1st | 7 |
|
|
1607
|
+
* | | ee | 02, 03, ..., 01 | |
|
|
1608
|
+
* | | eee | Mon, Tue, Wed, ..., Sun | |
|
|
1609
|
+
* | | eeee | Monday, Tuesday, ..., Sunday | 2 |
|
|
1610
|
+
* | | eeeee | M, T, W, T, F, S, S | |
|
|
1611
|
+
* | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |
|
|
1612
|
+
* | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |
|
|
1613
|
+
* | | co | 2nd, 3rd, ..., 1st | 7 |
|
|
1614
|
+
* | | cc | 02, 03, ..., 01 | |
|
|
1615
|
+
* | | ccc | Mon, Tue, Wed, ..., Sun | |
|
|
1616
|
+
* | | cccc | Monday, Tuesday, ..., Sunday | 2 |
|
|
1617
|
+
* | | ccccc | M, T, W, T, F, S, S | |
|
|
1618
|
+
* | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |
|
|
1619
|
+
* | AM, PM | a..aa | AM, PM | |
|
|
1620
|
+
* | | aaa | am, pm | |
|
|
1621
|
+
* | | aaaa | a.m., p.m. | 2 |
|
|
1622
|
+
* | | aaaaa | a, p | |
|
|
1623
|
+
* | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |
|
|
1624
|
+
* | | bbb | am, pm, noon, midnight | |
|
|
1625
|
+
* | | bbbb | a.m., p.m., noon, midnight | 2 |
|
|
1626
|
+
* | | bbbbb | a, p, n, mi | |
|
|
1627
|
+
* | Flexible day period | B..BBB | at night, in the morning, ... | |
|
|
1628
|
+
* | | BBBB | at night, in the morning, ... | 2 |
|
|
1629
|
+
* | | BBBBB | at night, in the morning, ... | |
|
|
1630
|
+
* | Hour [1-12] | h | 1, 2, ..., 11, 12 | |
|
|
1631
|
+
* | | ho | 1st, 2nd, ..., 11th, 12th | 7 |
|
|
1632
|
+
* | | hh | 01, 02, ..., 11, 12 | |
|
|
1633
|
+
* | Hour [0-23] | H | 0, 1, 2, ..., 23 | |
|
|
1634
|
+
* | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |
|
|
1635
|
+
* | | HH | 00, 01, 02, ..., 23 | |
|
|
1636
|
+
* | Hour [0-11] | K | 1, 2, ..., 11, 0 | |
|
|
1637
|
+
* | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |
|
|
1638
|
+
* | | KK | 01, 02, ..., 11, 00 | |
|
|
1639
|
+
* | Hour [1-24] | k | 24, 1, 2, ..., 23 | |
|
|
1640
|
+
* | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |
|
|
1641
|
+
* | | kk | 24, 01, 02, ..., 23 | |
|
|
1642
|
+
* | Minute | m | 0, 1, ..., 59 | |
|
|
1643
|
+
* | | mo | 0th, 1st, ..., 59th | 7 |
|
|
1644
|
+
* | | mm | 00, 01, ..., 59 | |
|
|
1645
|
+
* | Second | s | 0, 1, ..., 59 | |
|
|
1646
|
+
* | | so | 0th, 1st, ..., 59th | 7 |
|
|
1647
|
+
* | | ss | 00, 01, ..., 59 | |
|
|
1648
|
+
* | Fraction of second | S | 0, 1, ..., 9 | |
|
|
1649
|
+
* | | SS | 00, 01, ..., 99 | |
|
|
1650
|
+
* | | SSS | 000, 001, ..., 999 | |
|
|
1651
|
+
* | | SSSS | ... | 3 |
|
|
1652
|
+
* | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |
|
|
1653
|
+
* | | XX | -0800, +0530, Z | |
|
|
1654
|
+
* | | XXX | -08:00, +05:30, Z | |
|
|
1655
|
+
* | | XXXX | -0800, +0530, Z, +123456 | 2 |
|
|
1656
|
+
* | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |
|
|
1657
|
+
* | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |
|
|
1658
|
+
* | | xx | -0800, +0530, +0000 | |
|
|
1659
|
+
* | | xxx | -08:00, +05:30, +00:00 | 2 |
|
|
1660
|
+
* | | xxxx | -0800, +0530, +0000, +123456 | |
|
|
1661
|
+
* | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |
|
|
1662
|
+
* | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |
|
|
1663
|
+
* | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |
|
|
1664
|
+
* | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |
|
|
1665
|
+
* | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |
|
|
1666
|
+
* | Seconds timestamp | t | 512969520 | 7 |
|
|
1667
|
+
* | | tt | ... | 3,7 |
|
|
1668
|
+
* | Milliseconds timestamp | T | 512969520900 | 7 |
|
|
1669
|
+
* | | TT | ... | 3,7 |
|
|
1670
|
+
* | Long localized date | P | 04/29/1453 | 7 |
|
|
1671
|
+
* | | PP | Apr 29, 1453 | 7 |
|
|
1672
|
+
* | | PPP | April 29th, 1453 | 7 |
|
|
1673
|
+
* | | PPPP | Friday, April 29th, 1453 | 2,7 |
|
|
1674
|
+
* | Long localized time | p | 12:00 AM | 7 |
|
|
1675
|
+
* | | pp | 12:00:00 AM | 7 |
|
|
1676
|
+
* | | ppp | 12:00:00 AM GMT+2 | 7 |
|
|
1677
|
+
* | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |
|
|
1678
|
+
* | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |
|
|
1679
|
+
* | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |
|
|
1680
|
+
* | | PPPppp | April 29th, 1453 at ... | 7 |
|
|
1681
|
+
* | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |
|
|
1682
|
+
* Notes:
|
|
1683
|
+
* 1. "Formatting" units (e.g. formatting quarter) in the default en-US locale
|
|
1684
|
+
* are the same as "stand-alone" units, but are different in some languages.
|
|
1685
|
+
* "Formatting" units are declined according to the rules of the language
|
|
1686
|
+
* in the context of a date. "Stand-alone" units are always nominative singular:
|
|
1687
|
+
*
|
|
1688
|
+
* `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`
|
|
1689
|
+
*
|
|
1690
|
+
* `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`
|
|
1691
|
+
*
|
|
1692
|
+
* 2. Any sequence of the identical letters is a pattern, unless it is escaped by
|
|
1693
|
+
* the single quote characters (see below).
|
|
1694
|
+
* If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)
|
|
1695
|
+
* the output will be the same as default pattern for this unit, usually
|
|
1696
|
+
* the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units
|
|
1697
|
+
* are marked with "2" in the last column of the table.
|
|
1698
|
+
*
|
|
1699
|
+
* `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`
|
|
1700
|
+
*
|
|
1701
|
+
* `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`
|
|
1702
|
+
*
|
|
1703
|
+
* `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`
|
|
1704
|
+
*
|
|
1705
|
+
* `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`
|
|
1706
|
+
*
|
|
1707
|
+
* `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`
|
|
1708
|
+
*
|
|
1709
|
+
* 3. Some patterns could be unlimited length (such as `yyyyyyyy`).
|
|
1710
|
+
* The output will be padded with zeros to match the length of the pattern.
|
|
1711
|
+
*
|
|
1712
|
+
* `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`
|
|
1713
|
+
*
|
|
1714
|
+
* 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.
|
|
1715
|
+
* These tokens represent the shortest form of the quarter.
|
|
1716
|
+
*
|
|
1717
|
+
* 5. The main difference between `y` and `u` patterns are B.C. years:
|
|
1718
|
+
*
|
|
1719
|
+
* | Year | `y` | `u` |
|
|
1720
|
+
* |------|-----|-----|
|
|
1721
|
+
* | AC 1 | 1 | 1 |
|
|
1722
|
+
* | BC 1 | 1 | 0 |
|
|
1723
|
+
* | BC 2 | 2 | -1 |
|
|
1724
|
+
*
|
|
1725
|
+
* Also `yy` always returns the last two digits of a year,
|
|
1726
|
+
* while `uu` pads single digit years to 2 characters and returns other years unchanged:
|
|
1727
|
+
*
|
|
1728
|
+
* | Year | `yy` | `uu` |
|
|
1729
|
+
* |------|------|------|
|
|
1730
|
+
* | 1 | 01 | 01 |
|
|
1731
|
+
* | 14 | 14 | 14 |
|
|
1732
|
+
* | 376 | 76 | 376 |
|
|
1733
|
+
* | 1453 | 53 | 1453 |
|
|
1734
|
+
*
|
|
1735
|
+
* The same difference is true for local and ISO week-numbering years (`Y` and `R`),
|
|
1736
|
+
* except local week-numbering years are dependent on `options.weekStartsOn`
|
|
1737
|
+
* and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)
|
|
1738
|
+
* and [getWeekYear](https://date-fns.org/docs/getWeekYear)).
|
|
1739
|
+
*
|
|
1740
|
+
* 6. Specific non-location timezones are currently unavailable in `date-fns`,
|
|
1741
|
+
* so right now these tokens fall back to GMT timezones.
|
|
1742
|
+
*
|
|
1743
|
+
* 7. These patterns are not in the Unicode Technical Standard #35:
|
|
1744
|
+
* - `i`: ISO day of week
|
|
1745
|
+
* - `I`: ISO week of year
|
|
1746
|
+
* - `R`: ISO week-numbering year
|
|
1747
|
+
* - `t`: seconds timestamp
|
|
1748
|
+
* - `T`: milliseconds timestamp
|
|
1749
|
+
* - `o`: ordinal number modifier
|
|
1750
|
+
* - `P`: long localized date
|
|
1751
|
+
* - `p`: long localized time
|
|
1752
|
+
*
|
|
1753
|
+
* 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.
|
|
1754
|
+
* You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
1755
|
+
*
|
|
1756
|
+
* 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.
|
|
1757
|
+
* You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
1758
|
+
*
|
|
1759
|
+
* @param date - The original date
|
|
1760
|
+
* @param format - The string of tokens
|
|
1761
|
+
* @param options - An object with options
|
|
1762
|
+
*
|
|
1763
|
+
* @returns The formatted date string
|
|
1764
|
+
*
|
|
1765
|
+
* @throws `date` must not be Invalid Date
|
|
1766
|
+
* @throws `options.locale` must contain `localize` property
|
|
1767
|
+
* @throws `options.locale` must contain `formatLong` property
|
|
1768
|
+
* @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
1769
|
+
* @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
1770
|
+
* @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
1771
|
+
* @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
1772
|
+
* @throws format string contains an unescaped latin alphabet character
|
|
1773
|
+
*
|
|
1774
|
+
* @example
|
|
1775
|
+
* // Represent 11 February 2014 in middle-endian format:
|
|
1776
|
+
* const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')
|
|
1777
|
+
* //=> '02/11/2014'
|
|
1778
|
+
*
|
|
1779
|
+
* @example
|
|
1780
|
+
* // Represent 2 July 2014 in Esperanto:
|
|
1781
|
+
* import { eoLocale } from 'date-fns/locale/eo'
|
|
1782
|
+
* const result = format(new Date(2014, 6, 2), "do 'de' MMMM yyyy", {
|
|
1783
|
+
* locale: eoLocale
|
|
1784
|
+
* })
|
|
1785
|
+
* //=> '2-a de julio 2014'
|
|
1786
|
+
*
|
|
1787
|
+
* @example
|
|
1788
|
+
* // Escape string by single quote characters:
|
|
1789
|
+
* const result = format(new Date(2014, 6, 2, 15), "h 'o''clock'")
|
|
1790
|
+
* //=> "3 o'clock"
|
|
1791
|
+
*/
|
|
1792
|
+
function format(date, formatStr, options) {
|
|
1793
|
+
const defaultOptions = getDefaultOptions();
|
|
1794
|
+
const locale = options?.locale ?? defaultOptions.locale ?? enUS;
|
|
1795
|
+
const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions.firstWeekContainsDate ?? defaultOptions.locale?.options?.firstWeekContainsDate ?? 1;
|
|
1796
|
+
const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions.weekStartsOn ?? defaultOptions.locale?.options?.weekStartsOn ?? 0;
|
|
1797
|
+
const originalDate = toDate(date, options?.in);
|
|
1798
|
+
if (!isValid(originalDate)) throw new RangeError("Invalid time value");
|
|
1799
|
+
let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => {
|
|
1800
|
+
const firstCharacter = substring[0];
|
|
1801
|
+
if (firstCharacter === "p" || firstCharacter === "P") {
|
|
1802
|
+
const longFormatter = longFormatters[firstCharacter];
|
|
1803
|
+
return longFormatter(substring, locale.formatLong);
|
|
1804
|
+
}
|
|
1805
|
+
return substring;
|
|
1806
|
+
}).join("").match(formattingTokensRegExp).map((substring) => {
|
|
1807
|
+
if (substring === "''") return {
|
|
1808
|
+
isToken: false,
|
|
1809
|
+
value: "'"
|
|
1810
|
+
};
|
|
1811
|
+
const firstCharacter = substring[0];
|
|
1812
|
+
if (firstCharacter === "'") return {
|
|
1813
|
+
isToken: false,
|
|
1814
|
+
value: cleanEscapedString(substring)
|
|
1815
|
+
};
|
|
1816
|
+
if (formatters[firstCharacter]) return {
|
|
1817
|
+
isToken: true,
|
|
1818
|
+
value: substring
|
|
1819
|
+
};
|
|
1820
|
+
if (firstCharacter.match(unescapedLatinCharacterRegExp)) throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`");
|
|
1821
|
+
return {
|
|
1822
|
+
isToken: false,
|
|
1823
|
+
value: substring
|
|
1824
|
+
};
|
|
1825
|
+
});
|
|
1826
|
+
if (locale.localize.preprocessor) parts = locale.localize.preprocessor(originalDate, parts);
|
|
1827
|
+
const formatterOptions = {
|
|
1828
|
+
firstWeekContainsDate,
|
|
1829
|
+
weekStartsOn,
|
|
1830
|
+
locale
|
|
1831
|
+
};
|
|
1832
|
+
return parts.map((part) => {
|
|
1833
|
+
if (!part.isToken) return part.value;
|
|
1834
|
+
const token = part.value;
|
|
1835
|
+
if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) warnOrThrowProtectedError(token, formatStr, String(date));
|
|
1836
|
+
const formatter = formatters[token[0]];
|
|
1837
|
+
return formatter(originalDate, token, locale.localize, formatterOptions);
|
|
1838
|
+
}).join("");
|
|
1839
|
+
}
|
|
1840
|
+
function cleanEscapedString(input) {
|
|
1841
|
+
const matched = input.match(escapedStringRegExp);
|
|
1842
|
+
if (!matched) return input;
|
|
1843
|
+
return matched[1].replace(doubleQuoteRegExp, "'");
|
|
1844
|
+
}
|
|
1845
|
+
//#endregion
|
|
1846
|
+
export { format as t };
|
|
1847
|
+
|
|
1848
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LUJicm4yYmdvLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRPcHRpb25zLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtZZWFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrWWVhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mWWVhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdFJlbGF0aXZlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTG9jYWxpemVGbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoRm4uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5T2ZZZWFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vla1llYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZldlZWtZZWFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWsuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9hZGRMZWFkaW5nWmVyb3MuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbGlnaHRGb3JtYXR0ZXJzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZm9ybWF0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiBkZWZhdWx0T3B0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zKG5ld09wdGlvbnMpIHtcbiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zO1xufVxuIiwiaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gNyA6IDApICsgZGF5IC0gd2Vla1N0YXJ0c09uO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgc3RhcnRPZldlZWs7XG4iLCJpbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mSVNPV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mSVNPV2VlaztcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mSVNPV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZJU09XZWVrLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0SVNPV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBJU08gV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZSxcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIElTTy13ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0SVNPV2Vla1llYXIobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElTT1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyID0gY29uc3RydWN0RnJvbShfZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyKTtcblxuICBjb25zdCBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyID0gY29uc3RydWN0RnJvbShfZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIpO1xuXG4gIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChfZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldElTT1dlZWtZZWFyO1xuIiwiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZJU09XZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgSmFuIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlXztcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mWWVhcjtcbiIsImNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIHNlY29uZFwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIHhTZWNvbmRzOiB7XG4gICAgb25lOiBcIjEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHNlY29uZHNcIixcbiAgfSxcblxuICBoYWxmQU1pbnV0ZTogXCJoYWxmIGEgbWludXRlXCIsXG5cbiAgbGVzc1RoYW5YTWludXRlczoge1xuICAgIG9uZTogXCJsZXNzIHRoYW4gYSBtaW51dGVcIixcbiAgICBvdGhlcjogXCJsZXNzIHRoYW4ge3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICB4TWludXRlczoge1xuICAgIG9uZTogXCIxIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBtaW51dGVzXCIsXG4gIH0sXG5cbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBob3VyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeEhvdXJzOiB7XG4gICAgb25lOiBcIjEgaG91clwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBob3Vyc1wiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIjEgZGF5XCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGRheXNcIixcbiAgfSxcblxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogXCJhYm91dCAxIHdlZWtcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICB4V2Vla3M6IHtcbiAgICBvbmU6IFwiMSB3ZWVrXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHdlZWtzXCIsXG4gIH0sXG5cbiAgYWJvdXRYTW9udGhzOiB7XG4gICAgb25lOiBcImFib3V0IDEgbW9udGhcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgeE1vbnRoczoge1xuICAgIG9uZTogXCIxIG1vbnRoXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1vbnRoc1wiLFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgb25lOiBcImFib3V0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIHhZZWFyczoge1xuICAgIG9uZTogXCIxIHllYXJcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiBcIm92ZXIgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwib3ZlciB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICBhbG1vc3RYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWxtb3N0IDEgeWVhclwiLFxuICAgIG90aGVyOiBcImFsbW9zdCB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREaXN0YW5jZSA9ICh0b2tlbiwgY291bnQsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdDtcblxuICBjb25zdCB0b2tlblZhbHVlID0gZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dO1xuICBpZiAodHlwZW9mIHRva2VuVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlO1xuICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vbmU7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vdGhlci5yZXBsYWNlKFwie3tjb3VudH19XCIsIGNvdW50LnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/LmFkZFN1ZmZpeCkge1xuICAgIGlmIChvcHRpb25zLmNvbXBhcmlzb24gJiYgb3B0aW9ucy5jb21wYXJpc29uID4gMCkge1xuICAgICAgcmV0dXJuIFwiaW4gXCIgKyByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyBcIiBhZ29cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZEZvcm1hdExvbmdGbihhcmdzKSB7XG4gIHJldHVybiAob3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIFN0cmluZygpXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgY29uc3QgZm9ybWF0ID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdO1xuICAgIHJldHVybiBmb3JtYXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsImNvbnN0IGZvcm1hdFJlbGF0aXZlTG9jYWxlID0ge1xuICBsYXN0V2VlazogXCInbGFzdCcgZWVlZSAnYXQnIHBcIixcbiAgeWVzdGVyZGF5OiBcIid5ZXN0ZXJkYXkgYXQnIHBcIixcbiAgdG9kYXk6IFwiJ3RvZGF5IGF0JyBwXCIsXG4gIHRvbW9ycm93OiBcIid0b21vcnJvdyBhdCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICdhdCcgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PlxuICBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG4iLCIvKipcbiAqIFRoZSBsb2NhbGl6ZSBmdW5jdGlvbiBhcmd1bWVudCBjYWxsYmFjayB3aGljaCBhbGxvd3MgdG8gY29udmVydCByYXcgdmFsdWUgdG9cbiAqIHRoZSBhY3R1YWwgdHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAqL1xuXG4vKipcbiAqIFRoZSBtYXAgb2YgbG9jYWxpemVkIHZhbHVlcyBmb3IgZWFjaCB3aWR0aC5cbiAqL1xuXG4vKipcbiAqIFRoZSBpbmRleCB0eXBlIG9mIHRoZSBsb2NhbGUgdW5pdCB2YWx1ZS4gSXQgdHlwZXMgY29udmVyc2lvbiBvZiB1bml0cyBvZlxuICogdmFsdWVzIHRoYXQgZG9uJ3Qgc3RhcnQgYXQgMCAoaS5lLiBxdWFydGVycykuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgdW5pdCB2YWx1ZSB0byB0aGUgdHVwbGUgb2YgdmFsdWVzLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBlcmEgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEJDLFxuICogdGhlIHNlY29uZCBlbGVtZW50IHJlcHJlc2VudHMgQUQuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIHF1YXJ0ZXIgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFExLlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBkYXkgdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIFN1bmRheS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgbW9udGggdmFsdWVzLiBUaGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIEphbnVhcnkuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTG9jYWxpemVGbihhcmdzKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/IFN0cmluZyhvcHRpb25zLmNvbnRleHQpIDogXCJzdGFuZGFsb25lXCI7XG5cbiAgICBsZXQgdmFsdWVzQXJyYXk7XG4gICAgaWYgKGNvbnRleHQgPT09IFwiZm9ybWF0dGluZ1wiICYmIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlcykge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0Rm9ybWF0dGluZ1dpZHRoIHx8IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPVxuICAgICAgICBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLnZhbHVlc1t3aWR0aF0gfHwgYXJncy52YWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sgPyBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gRm9yIHNvbWUgcmVhc29uIFR5cGVTY3JpcHQganVzdCBkb24ndCB3YW50IHRvIG1hdGNoIGl0LCBubyBtYXR0ZXIgaG93IGhhcmQgd2UgdHJ5LiBJIGNoYWxsZW5nZSB5b3UgdG8gdHJ5IHRvIHJlbW92ZSBpdCFcbiAgICByZXR1cm4gdmFsdWVzQXJyYXlbaW5kZXhdO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgYnVpbGRMb2NhbGl6ZUZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzXCI7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGNoRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoO1xuXG4gICAgY29uc3QgbWF0Y2hQYXR0ZXJuID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLm1hdGNoUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdO1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKG1hdGNoUGF0dGVybik7XG5cbiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VQYXR0ZXJucyA9XG4gICAgICAod2lkdGggJiYgYXJncy5wYXJzZVBhdHRlcm5zW3dpZHRoXSkgfHxcbiAgICAgIGFyZ3MucGFyc2VQYXR0ZXJuc1thcmdzLmRlZmF1bHRQYXJzZVdpZHRoXTtcblxuICAgIGNvbnN0IGtleSA9IEFycmF5LmlzQXJyYXkocGFyc2VQYXR0ZXJucylcbiAgICAgID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpXG4gICAgICA6IC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgICAgIGZpbmRLZXkocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSk7XG5cbiAgICBsZXQgdmFsdWU7XG5cbiAgICB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhrZXkpIDoga2V5O1xuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrXG4gICAgICA/IC8vIFtUT0RPXSAtLSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgICAgIG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSlcbiAgICAgIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJlxuICAgICAgcHJlZGljYXRlKG9iamVjdFtrZXldKVxuICAgICkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChsZXQga2V5ID0gMDsga2V5IDwgYXJyYXkubGVuZ3RoOyBrZXkrKykge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlba2V5XSkpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGxldCB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFja1xuICAgICAgPyBhcmdzLnZhbHVlQ2FsbGJhY2socGFyc2VSZXN1bHRbMF0pXG4gICAgICA6IHBhcnNlUmVzdWx0WzBdO1xuXG4gICAgLy8gW1RPRE9dIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IGJ1aWxkTWF0Y2hGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi5qc1wiO1xuaW1wb3J0IHsgYnVpbGRNYXRjaFBhdHRlcm5GbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIjtcblxuY29uc3QgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFxcZCspKHRofHN0fG5kfHJkKT8vaTtcbmNvbnN0IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGJ8YSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGJcXC4/XFxzP2NcXC4/fGJcXC4/XFxzP2NcXC4/XFxzP2VcXC4/fGFcXC4/XFxzP2RcXC4/fGNcXC4/XFxzP2VcXC4/KS9pLFxuICB3aWRlOiAvXihiZWZvcmUgY2hyaXN0fGJlZm9yZSBjb21tb24gZXJhfGFubm8gZG9taW5pfGNvbW1vbiBlcmEpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL15iL2ksIC9eKGF8YykvaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxufTtcbmNvbnN0IHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbXG4gICAgL15qL2ksXG4gICAgL15mL2ksXG4gICAgL15tL2ksXG4gICAgL15hL2ksXG4gICAgL15tL2ksXG4gICAgL15qL2ksXG4gICAgL15qL2ksXG4gICAgL15hL2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL15qYS9pLFxuICAgIC9eZi9pLFxuICAgIC9ebWFyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWF5L2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufTtcbiIsImltcG9ydCB7IGZvcm1hdERpc3RhbmNlIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qc1wiO1xuaW1wb3J0IHsgZm9ybWF0TG9uZyB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0TG9uZy5qc1wiO1xuaW1wb3J0IHsgZm9ybWF0UmVsYXRpdmUgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdFJlbGF0aXZlLmpzXCI7XG5pbXBvcnQgeyBsb2NhbGl6ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvbG9jYWxpemUuanNcIjtcbmltcG9ydCB7IG1hdGNoIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9tYXRjaC5qc1wiO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBMb2NhbGVzXG4gKiBAc3VtbWFyeSBFbmdsaXNoIGxvY2FsZSAoVW5pdGVkIFN0YXRlcykuXG4gKiBAbGFuZ3VhZ2UgRW5nbGlzaFxuICogQGlzby02MzktMiBlbmdcbiAqIEBhdXRob3IgU2FzaGEgS29zcyBbQGtvc3Nub2NvcnBdKGh0dHBzOi8vZ2l0aHViLmNvbS9rb3Nzbm9jb3JwKVxuICogQGF1dGhvciBMZXNoYSBLb3NzIFtAbGVzaGFrb3NzXShodHRwczovL2dpdGh1Yi5jb20vbGVzaGFrb3NzKVxuICovXG5leHBvcnQgY29uc3QgZW5VUyA9IHtcbiAgY29kZTogXCJlbi1VU1wiLFxuICBmb3JtYXREaXN0YW5jZTogZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IGZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IGxvY2FsaXplLFxuICBtYXRjaDogbWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDAgLyogU3VuZGF5ICovLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogMSxcbiAgfSxcbn07XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZW5VUztcbiIsImltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyB9IGZyb20gXCIuL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZlllYXIgfSBmcm9tIFwiLi9zdGFydE9mWWVhci5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXREYXlPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXREYXlPZlllYXJcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgeWVhciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheU9mWWVhcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSlcbiAqIC8vPT4gMTgzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXlPZlllYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoX2RhdGUsIHN0YXJ0T2ZZZWFyKF9kYXRlKSk7XG4gIGNvbnN0IGRheU9mWWVhciA9IGRpZmYgKyAxO1xuICByZXR1cm4gZGF5T2ZZZWFyO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldERheU9mWWVhcjtcbiIsImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mSVNPV2VlayhfZGF0ZSkgLSArc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRJU09XZWVrO1xuIiwiaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXRXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSlcbiAqIC8vPT4gMjAwNVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgd2VlayBzdGFydHMgb24gU2F0dXJkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IHdlZWtTdGFydHNPbjogNiB9KVxuICogLy89PiAyMDA0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB0aGUgZmlyc3Qgd2VlayBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KVxuICogLy89PiAyMDA0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZk5leHRZZWFyLCBvcHRpb25zKTtcblxuICBjb25zdCBmaXJzdFdlZWtPZlRoaXNZZWFyID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTtcblxuICBpZiAoK19kYXRlID49ICtzdGFydE9mTmV4dFllYXIpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoK19kYXRlID49ICtzdGFydE9mVGhpc1llYXIpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrWWVhcjtcbiIsImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldFdlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0V2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZXZWVrIH0gZnJvbSBcIi4vc3RhcnRPZldlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrWWVhclxuICogQGNhdGVnb3J5IFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDUgd2l0aCBkZWZhdWx0IHNldHRpbmdzOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDVcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAqIC8vIGFuZCA0IEphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB5ZWFyID0gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IGZpcnN0V2VlayA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vlay5zZXRGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IF9kYXRlID0gc3RhcnRPZldlZWsoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrWWVhcjtcbiIsImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mV2VlayhfZGF0ZSwgb3B0aW9ucykgLSArc3RhcnRPZldlZWtZZWFyKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIsIHRhcmdldExlbmd0aCkge1xuICBjb25zdCBzaWduID0gbnVtYmVyIDwgMCA/IFwiLVwiIDogXCJcIjtcbiAgY29uc3Qgb3V0cHV0ID0gTWF0aC5hYnMobnVtYmVyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgXCIwXCIpO1xuICByZXR1cm4gc2lnbiArIG91dHB1dDtcbn1cbiIsImltcG9ydCB7IGFkZExlYWRpbmdaZXJvcyB9IGZyb20gXCIuLi9hZGRMZWFkaW5nWmVyb3MuanNcIjtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKi9cblxuZXhwb3J0IGNvbnN0IGxpZ2h0Rm9ybWF0dGVycyA9IHtcbiAgLy8gWWVhclxuICB5KGRhdGUsIHRva2VuKSB7XG4gICAgLy8gRnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTMxL3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0Zvcm1hdF90b2tlbnNcbiAgICAvLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4gICAgLy8gfC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuICAgIC8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbiAgICAvLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4gICAgLy8gfCBBRCAxMjMgICB8ICAgMTIzIHwgMjMgfCAgIDEyMyB8ICAwMTIzIHwgMDAxMjMgfFxuICAgIC8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbiAgICAvLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG5cbiAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModG9rZW4gPT09IFwieXlcIiA/IHllYXIgJSAxMDAgOiB5ZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE0oZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICByZXR1cm4gdG9rZW4gPT09IFwiTVwiID8gU3RyaW5nKG1vbnRoICsgMSkgOiBhZGRMZWFkaW5nWmVyb3MobW9udGggKyAxLCAyKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0RGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGEoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXRlLmdldEhvdXJzKCkgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSBcImFtXCIgPyBcImEubS5cIiA6IFwicC5tLlwiO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTIzXVxuICBIKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldEhvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG0oZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0TWludXRlcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFNlY29uZHMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUyhkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IG51bWJlck9mRGlnaXRzID0gdG9rZW4ubGVuZ3RoO1xuICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLnRydW5jKFxuICAgICAgbWlsbGlzZWNvbmRzICogTWF0aC5wb3coMTAsIG51bWJlck9mRGlnaXRzIC0gMyksXG4gICAgKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxufTtcbiIsImltcG9ydCB7IGdldERheU9mWWVhciB9IGZyb20gXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IGdldFdlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0V2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIjtcblxuaW1wb3J0IHsgYWRkTGVhZGluZ1plcm9zIH0gZnJvbSBcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiO1xuaW1wb3J0IHsgbGlnaHRGb3JtYXR0ZXJzIH0gZnJvbSBcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCI7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5leHBvcnQgY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModHdvRGlnaXRZZWFyLCAyKTtcbiAgICB9XG5cbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJZb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiSW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHllYXJcbiAgRDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mWWVhciA9IGdldERheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJEb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogXCJkYXlPZlllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIElTTyBkYXkgb2Ygd2Vla1xuICBpOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlIFwiaWlcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJIb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldEhvdXJzKCksIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSBcImtvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcInNvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbiIsImNvbnN0IGRhdGVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgIGNhc2UgXCJQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgIGNhc2UgXCJQUFBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgfVxufTtcblxuY29uc3QgdGltZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwicFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcInBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcInBwcFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwicHBwcFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCBkYXRlVGltZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBjb25zdCBtYXRjaFJlc3VsdCA9IHBhdHRlcm4ubWF0Y2goLyhQKykocCspPy8pIHx8IFtdO1xuICBjb25zdCBkYXRlUGF0dGVybiA9IG1hdGNoUmVzdWx0WzFdO1xuICBjb25zdCB0aW1lUGF0dGVybiA9IG1hdGNoUmVzdWx0WzJdO1xuXG4gIGlmICghdGltZVBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZyk7XG4gIH1cblxuICBsZXQgZGF0ZVRpbWVGb3JtYXQ7XG5cbiAgc3dpdGNoIChkYXRlUGF0dGVybikge1xuICAgIGNhc2UgXCJQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFBQXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGRhdGVUaW1lRm9ybWF0XG4gICAgLnJlcGxhY2UoXCJ7e2RhdGV9fVwiLCBkYXRlTG9uZ0Zvcm1hdHRlcihkYXRlUGF0dGVybiwgZm9ybWF0TG9uZykpXG4gICAgLnJlcGxhY2UoXCJ7e3RpbWV9fVwiLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZykpO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvbmdGb3JtYXR0ZXJzID0ge1xuICBwOiB0aW1lTG9uZ0Zvcm1hdHRlcixcbiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyLFxufTtcbiIsImNvbnN0IGRheU9mWWVhclRva2VuUkUgPSAvXkQrJC87XG5jb25zdCB3ZWVrWWVhclRva2VuUkUgPSAvXlkrJC87XG5cbmNvbnN0IHRocm93VG9rZW5zID0gW1wiRFwiLCBcIkREXCIsIFwiWVlcIiwgXCJZWVlZXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gZGF5T2ZZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gd2Vla1llYXJUb2tlblJFLnRlc3QodG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0LCBpbnB1dCkge1xuICBjb25zdCBfbWVzc2FnZSA9IG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpO1xuICBjb25zb2xlLndhcm4oX21lc3NhZ2UpO1xuICBpZiAodGhyb3dUb2tlbnMuaW5jbHVkZXModG9rZW4pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihfbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3Qgc3ViamVjdCA9IHRva2VuWzBdID09PSBcIllcIiA/IFwieWVhcnNcIiA6IFwiZGF5cyBvZiB0aGUgbW9udGhcIjtcbiAgcmV0dXJuIGBVc2UgXFxgJHt0b2tlbi50b0xvd2VyQ2FzZSgpfVxcYCBpbnN0ZWFkIG9mIFxcYCR7dG9rZW59XFxgIChpbiBcXGAke2Zvcm1hdH1cXGApIGZvciBmb3JtYXR0aW5nICR7c3ViamVjdH0gdG8gdGhlIGlucHV0IFxcYCR7aW5wdXR9XFxgOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRgO1xufVxuIiwiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSBcIi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHsgbG9uZ0Zvcm1hdHRlcnMgfSBmcm9tIFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHtcbiAgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbixcbiAgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLFxuICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLFxufSBmcm9tIFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gXCIuL2lzVmFsaWQuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5leHBvcnQgeyBmb3JtYXR0ZXJzLCBsb25nRm9ybWF0dGVycyB9O1xuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbmV4cG9ydCB7IGZvcm1hdCBhcyBmb3JtYXREYXRlIH07XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBhbGlhcyBmb3JtYXREYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEZvcm1hdCB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nIGluIHRoZSBnaXZlbiBmb3JtYXQuIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyKSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICpcbiAqIEB0aHJvd3MgYGRhdGVgIG11c3Qgbm90IGJlIEludmFsaWQgRGF0ZVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IGRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IGxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IFwiJ1wiIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHx8XG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2XSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUksaUJBQWlCLEVBQUU7QUFFdkIsU0FBZ0Isb0JBQW9CO0FBQ2xDLFFBQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMrQlQsU0FBZ0Is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
|