@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
|
@@ -1,1238 +1,1313 @@
|
|
|
1
|
-
var __typeError = (msg) => {
|
|
2
|
-
throw TypeError(msg);
|
|
3
|
-
};
|
|
4
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
1
|
import { __esDecorate, __runInitializers } from "tslib";
|
|
9
|
-
import { isArrowKeyOrPageKeysPressed } from "@sbb-esta/lyne-elements/core/a11y.js";
|
|
10
2
|
import { SbbElement } from "@sbb-esta/lyne-elements/core/base-elements.js";
|
|
11
3
|
import { forceType } from "@sbb-esta/lyne-elements/core/decorators.js";
|
|
12
4
|
import { isServer } from "lit";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
5
|
+
import { isArrowKeyOrPageKeysPressed } from "@sbb-esta/lyne-elements/core/a11y.js";
|
|
6
|
+
import { eventOptions, property, state } from "lit/decorators.js";
|
|
7
|
+
import { mapCoachInfosToCoachSelection, mapIconToSvg, mapPlaceAndCoachToSeatReservationPlaceSelection, mapPlaceInfosToPlaceSelection } from "../common/mapper.js";
|
|
8
|
+
//#region src/elements-experimental/seat-reservation/seat-reservation/seat-reservation-base-element.ts
|
|
15
9
|
var ScrollDirection;
|
|
16
|
-
(function(
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
(function(ScrollDirection) {
|
|
11
|
+
ScrollDirection["right"] = "right";
|
|
12
|
+
ScrollDirection["left"] = "left";
|
|
19
13
|
})(ScrollDirection || (ScrollDirection = {}));
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
14
|
+
var MAX_SERVICE_PROPERTIES = 3;
|
|
15
|
+
var ALLOWED_SERVICE_ICONS = [
|
|
16
|
+
"sa-vo",
|
|
17
|
+
"sa-rs",
|
|
18
|
+
"sa-abteilkinderwagen",
|
|
19
|
+
"sa-wr",
|
|
20
|
+
"sa-fa",
|
|
21
|
+
"sa-bz",
|
|
22
|
+
"sa-rz"
|
|
29
23
|
];
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
24
|
+
var SeatReservationBaseElement = (() => {
|
|
25
|
+
let _classSuper = SbbElement;
|
|
26
|
+
let _instanceExtraInitializers = [];
|
|
27
|
+
let _seatReservations_decorators;
|
|
28
|
+
let _seatReservations_initializers = [];
|
|
29
|
+
let _seatReservations_extraInitializers = [];
|
|
30
|
+
let _travelDirection_decorators;
|
|
31
|
+
let _travelDirection_initializers = [];
|
|
32
|
+
let _travelDirection_extraInitializers = [];
|
|
33
|
+
let _hasNavigation_decorators;
|
|
34
|
+
let _hasNavigation_initializers = [];
|
|
35
|
+
let _hasNavigation_extraInitializers = [];
|
|
36
|
+
let _alignVertical_decorators;
|
|
37
|
+
let _alignVertical_initializers = [];
|
|
38
|
+
let _alignVertical_extraInitializers = [];
|
|
39
|
+
let _baseGridSize_decorators;
|
|
40
|
+
let _baseGridSize_initializers = [];
|
|
41
|
+
let _baseGridSize_extraInitializers = [];
|
|
42
|
+
let _height_decorators;
|
|
43
|
+
let _height_initializers = [];
|
|
44
|
+
let _height_extraInitializers = [];
|
|
45
|
+
let _maxSeatReservations_decorators;
|
|
46
|
+
let _maxSeatReservations_initializers = [];
|
|
47
|
+
let _maxSeatReservations_extraInitializers = [];
|
|
48
|
+
let _maxBicycleReservations_decorators;
|
|
49
|
+
let _maxBicycleReservations_initializers = [];
|
|
50
|
+
let _maxBicycleReservations_extraInitializers = [];
|
|
51
|
+
let _preventPlaceClick_decorators;
|
|
52
|
+
let _preventPlaceClick_initializers = [];
|
|
53
|
+
let _preventPlaceClick_extraInitializers = [];
|
|
54
|
+
let _preselectCoachIndex_decorators;
|
|
55
|
+
let _preselectCoachIndex_initializers = [];
|
|
56
|
+
let _preselectCoachIndex_extraInitializers = [];
|
|
57
|
+
let _showTitleInfo_decorators;
|
|
58
|
+
let _showTitleInfo_initializers = [];
|
|
59
|
+
let _showTitleInfo_extraInitializers = [];
|
|
60
|
+
let _selectedCoachIndex_decorators;
|
|
61
|
+
let _selectedCoachIndex_initializers = [];
|
|
62
|
+
let _selectedCoachIndex_extraInitializers = [];
|
|
63
|
+
let _focusedCoachIndex_decorators;
|
|
64
|
+
let _focusedCoachIndex_initializers = [];
|
|
65
|
+
let _focusedCoachIndex_extraInitializers = [];
|
|
66
|
+
let _hoveredCoachIndex_decorators;
|
|
67
|
+
let _hoveredCoachIndex_initializers = [];
|
|
68
|
+
let _hoveredCoachIndex_extraInitializers = [];
|
|
69
|
+
let _coachAreaScrollend_decorators;
|
|
70
|
+
return class SeatReservationBaseElement extends _classSuper {
|
|
71
|
+
static {
|
|
72
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
73
|
+
_seatReservations_decorators = [property({
|
|
74
|
+
attribute: "seat-reservations",
|
|
75
|
+
type: Array
|
|
76
|
+
})];
|
|
77
|
+
_travelDirection_decorators = [property({
|
|
78
|
+
attribute: "travel-direction",
|
|
79
|
+
type: String
|
|
80
|
+
})];
|
|
81
|
+
_hasNavigation_decorators = [forceType(), property({
|
|
82
|
+
attribute: "has-navigation",
|
|
83
|
+
type: Boolean
|
|
84
|
+
})];
|
|
85
|
+
_alignVertical_decorators = [forceType(), property({
|
|
86
|
+
attribute: "align-vertical",
|
|
87
|
+
type: Boolean,
|
|
88
|
+
reflect: true,
|
|
89
|
+
useDefault: true
|
|
90
|
+
})];
|
|
91
|
+
_baseGridSize_decorators = [forceType(), property({
|
|
92
|
+
attribute: "base-grid-size",
|
|
93
|
+
type: Number
|
|
94
|
+
})];
|
|
95
|
+
_height_decorators = [forceType(), property({
|
|
96
|
+
attribute: "height",
|
|
97
|
+
type: Number
|
|
98
|
+
})];
|
|
99
|
+
_maxSeatReservations_decorators = [forceType(), property({
|
|
100
|
+
attribute: "max-seat-reservations",
|
|
101
|
+
type: Number
|
|
102
|
+
})];
|
|
103
|
+
_maxBicycleReservations_decorators = [forceType(), property({
|
|
104
|
+
attribute: "max-bicycle-reservations",
|
|
105
|
+
type: Number
|
|
106
|
+
})];
|
|
107
|
+
_preventPlaceClick_decorators = [forceType(), property({
|
|
108
|
+
attribute: "prevent-place-click",
|
|
109
|
+
type: Boolean
|
|
110
|
+
})];
|
|
111
|
+
_preselectCoachIndex_decorators = [forceType(), property({
|
|
112
|
+
attribute: "preselect-coach-index",
|
|
113
|
+
type: Number
|
|
114
|
+
})];
|
|
115
|
+
_showTitleInfo_decorators = [forceType(), property({
|
|
116
|
+
attribute: "show-title-info",
|
|
117
|
+
type: Boolean
|
|
118
|
+
})];
|
|
119
|
+
_selectedCoachIndex_decorators = [state()];
|
|
120
|
+
_focusedCoachIndex_decorators = [state()];
|
|
121
|
+
_hoveredCoachIndex_decorators = [state()];
|
|
122
|
+
_coachAreaScrollend_decorators = [eventOptions({ passive: true })];
|
|
123
|
+
__esDecorate(this, null, _seatReservations_decorators, {
|
|
124
|
+
kind: "accessor",
|
|
125
|
+
name: "seatReservations",
|
|
126
|
+
static: false,
|
|
127
|
+
private: false,
|
|
128
|
+
access: {
|
|
129
|
+
has: (obj) => "seatReservations" in obj,
|
|
130
|
+
get: (obj) => obj.seatReservations,
|
|
131
|
+
set: (obj, value) => {
|
|
132
|
+
obj.seatReservations = value;
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
metadata: _metadata
|
|
136
|
+
}, _seatReservations_initializers, _seatReservations_extraInitializers);
|
|
137
|
+
__esDecorate(this, null, _travelDirection_decorators, {
|
|
138
|
+
kind: "accessor",
|
|
139
|
+
name: "travelDirection",
|
|
140
|
+
static: false,
|
|
141
|
+
private: false,
|
|
142
|
+
access: {
|
|
143
|
+
has: (obj) => "travelDirection" in obj,
|
|
144
|
+
get: (obj) => obj.travelDirection,
|
|
145
|
+
set: (obj, value) => {
|
|
146
|
+
obj.travelDirection = value;
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
metadata: _metadata
|
|
150
|
+
}, _travelDirection_initializers, _travelDirection_extraInitializers);
|
|
151
|
+
__esDecorate(this, null, _hasNavigation_decorators, {
|
|
152
|
+
kind: "accessor",
|
|
153
|
+
name: "hasNavigation",
|
|
154
|
+
static: false,
|
|
155
|
+
private: false,
|
|
156
|
+
access: {
|
|
157
|
+
has: (obj) => "hasNavigation" in obj,
|
|
158
|
+
get: (obj) => obj.hasNavigation,
|
|
159
|
+
set: (obj, value) => {
|
|
160
|
+
obj.hasNavigation = value;
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
metadata: _metadata
|
|
164
|
+
}, _hasNavigation_initializers, _hasNavigation_extraInitializers);
|
|
165
|
+
__esDecorate(this, null, _alignVertical_decorators, {
|
|
166
|
+
kind: "accessor",
|
|
167
|
+
name: "alignVertical",
|
|
168
|
+
static: false,
|
|
169
|
+
private: false,
|
|
170
|
+
access: {
|
|
171
|
+
has: (obj) => "alignVertical" in obj,
|
|
172
|
+
get: (obj) => obj.alignVertical,
|
|
173
|
+
set: (obj, value) => {
|
|
174
|
+
obj.alignVertical = value;
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
metadata: _metadata
|
|
178
|
+
}, _alignVertical_initializers, _alignVertical_extraInitializers);
|
|
179
|
+
__esDecorate(this, null, _baseGridSize_decorators, {
|
|
180
|
+
kind: "accessor",
|
|
181
|
+
name: "baseGridSize",
|
|
182
|
+
static: false,
|
|
183
|
+
private: false,
|
|
184
|
+
access: {
|
|
185
|
+
has: (obj) => "baseGridSize" in obj,
|
|
186
|
+
get: (obj) => obj.baseGridSize,
|
|
187
|
+
set: (obj, value) => {
|
|
188
|
+
obj.baseGridSize = value;
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
metadata: _metadata
|
|
192
|
+
}, _baseGridSize_initializers, _baseGridSize_extraInitializers);
|
|
193
|
+
__esDecorate(this, null, _height_decorators, {
|
|
194
|
+
kind: "accessor",
|
|
195
|
+
name: "height",
|
|
196
|
+
static: false,
|
|
197
|
+
private: false,
|
|
198
|
+
access: {
|
|
199
|
+
has: (obj) => "height" in obj,
|
|
200
|
+
get: (obj) => obj.height,
|
|
201
|
+
set: (obj, value) => {
|
|
202
|
+
obj.height = value;
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
metadata: _metadata
|
|
206
|
+
}, _height_initializers, _height_extraInitializers);
|
|
207
|
+
__esDecorate(this, null, _maxSeatReservations_decorators, {
|
|
208
|
+
kind: "accessor",
|
|
209
|
+
name: "maxSeatReservations",
|
|
210
|
+
static: false,
|
|
211
|
+
private: false,
|
|
212
|
+
access: {
|
|
213
|
+
has: (obj) => "maxSeatReservations" in obj,
|
|
214
|
+
get: (obj) => obj.maxSeatReservations,
|
|
215
|
+
set: (obj, value) => {
|
|
216
|
+
obj.maxSeatReservations = value;
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
metadata: _metadata
|
|
220
|
+
}, _maxSeatReservations_initializers, _maxSeatReservations_extraInitializers);
|
|
221
|
+
__esDecorate(this, null, _maxBicycleReservations_decorators, {
|
|
222
|
+
kind: "accessor",
|
|
223
|
+
name: "maxBicycleReservations",
|
|
224
|
+
static: false,
|
|
225
|
+
private: false,
|
|
226
|
+
access: {
|
|
227
|
+
has: (obj) => "maxBicycleReservations" in obj,
|
|
228
|
+
get: (obj) => obj.maxBicycleReservations,
|
|
229
|
+
set: (obj, value) => {
|
|
230
|
+
obj.maxBicycleReservations = value;
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
metadata: _metadata
|
|
234
|
+
}, _maxBicycleReservations_initializers, _maxBicycleReservations_extraInitializers);
|
|
235
|
+
__esDecorate(this, null, _preventPlaceClick_decorators, {
|
|
236
|
+
kind: "accessor",
|
|
237
|
+
name: "preventPlaceClick",
|
|
238
|
+
static: false,
|
|
239
|
+
private: false,
|
|
240
|
+
access: {
|
|
241
|
+
has: (obj) => "preventPlaceClick" in obj,
|
|
242
|
+
get: (obj) => obj.preventPlaceClick,
|
|
243
|
+
set: (obj, value) => {
|
|
244
|
+
obj.preventPlaceClick = value;
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
metadata: _metadata
|
|
248
|
+
}, _preventPlaceClick_initializers, _preventPlaceClick_extraInitializers);
|
|
249
|
+
__esDecorate(this, null, _preselectCoachIndex_decorators, {
|
|
250
|
+
kind: "accessor",
|
|
251
|
+
name: "preselectCoachIndex",
|
|
252
|
+
static: false,
|
|
253
|
+
private: false,
|
|
254
|
+
access: {
|
|
255
|
+
has: (obj) => "preselectCoachIndex" in obj,
|
|
256
|
+
get: (obj) => obj.preselectCoachIndex,
|
|
257
|
+
set: (obj, value) => {
|
|
258
|
+
obj.preselectCoachIndex = value;
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
metadata: _metadata
|
|
262
|
+
}, _preselectCoachIndex_initializers, _preselectCoachIndex_extraInitializers);
|
|
263
|
+
__esDecorate(this, null, _showTitleInfo_decorators, {
|
|
264
|
+
kind: "accessor",
|
|
265
|
+
name: "showTitleInfo",
|
|
266
|
+
static: false,
|
|
267
|
+
private: false,
|
|
268
|
+
access: {
|
|
269
|
+
has: (obj) => "showTitleInfo" in obj,
|
|
270
|
+
get: (obj) => obj.showTitleInfo,
|
|
271
|
+
set: (obj, value) => {
|
|
272
|
+
obj.showTitleInfo = value;
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
metadata: _metadata
|
|
276
|
+
}, _showTitleInfo_initializers, _showTitleInfo_extraInitializers);
|
|
277
|
+
__esDecorate(this, null, _selectedCoachIndex_decorators, {
|
|
278
|
+
kind: "accessor",
|
|
279
|
+
name: "selectedCoachIndex",
|
|
280
|
+
static: false,
|
|
281
|
+
private: false,
|
|
282
|
+
access: {
|
|
283
|
+
has: (obj) => "selectedCoachIndex" in obj,
|
|
284
|
+
get: (obj) => obj.selectedCoachIndex,
|
|
285
|
+
set: (obj, value) => {
|
|
286
|
+
obj.selectedCoachIndex = value;
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
metadata: _metadata
|
|
290
|
+
}, _selectedCoachIndex_initializers, _selectedCoachIndex_extraInitializers);
|
|
291
|
+
__esDecorate(this, null, _focusedCoachIndex_decorators, {
|
|
292
|
+
kind: "accessor",
|
|
293
|
+
name: "focusedCoachIndex",
|
|
294
|
+
static: false,
|
|
295
|
+
private: false,
|
|
296
|
+
access: {
|
|
297
|
+
has: (obj) => "focusedCoachIndex" in obj,
|
|
298
|
+
get: (obj) => obj.focusedCoachIndex,
|
|
299
|
+
set: (obj, value) => {
|
|
300
|
+
obj.focusedCoachIndex = value;
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
metadata: _metadata
|
|
304
|
+
}, _focusedCoachIndex_initializers, _focusedCoachIndex_extraInitializers);
|
|
305
|
+
__esDecorate(this, null, _hoveredCoachIndex_decorators, {
|
|
306
|
+
kind: "accessor",
|
|
307
|
+
name: "hoveredCoachIndex",
|
|
308
|
+
static: false,
|
|
309
|
+
private: false,
|
|
310
|
+
access: {
|
|
311
|
+
has: (obj) => "hoveredCoachIndex" in obj,
|
|
312
|
+
get: (obj) => obj.hoveredCoachIndex,
|
|
313
|
+
set: (obj, value) => {
|
|
314
|
+
obj.hoveredCoachIndex = value;
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
metadata: _metadata
|
|
318
|
+
}, _hoveredCoachIndex_initializers, _hoveredCoachIndex_extraInitializers);
|
|
319
|
+
__esDecorate(this, null, _coachAreaScrollend_decorators, {
|
|
320
|
+
kind: "method",
|
|
321
|
+
name: "coachAreaScrollend",
|
|
322
|
+
static: false,
|
|
323
|
+
private: false,
|
|
324
|
+
access: {
|
|
325
|
+
has: (obj) => "coachAreaScrollend" in obj,
|
|
326
|
+
get: (obj) => obj.coachAreaScrollend
|
|
327
|
+
},
|
|
328
|
+
metadata: _metadata
|
|
329
|
+
}, null, _instanceExtraInitializers);
|
|
330
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
331
|
+
enumerable: true,
|
|
332
|
+
configurable: true,
|
|
333
|
+
writable: true,
|
|
334
|
+
value: _metadata
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
static {
|
|
338
|
+
this.events = {
|
|
339
|
+
selectedplaces: "selectedplaces",
|
|
340
|
+
selectedcoach: "selectedcoach"
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
#seatReservations_accessor_storage;
|
|
344
|
+
/** The seat reservations array contains all coaches and places */
|
|
345
|
+
get seatReservations() {
|
|
346
|
+
return this.#seatReservations_accessor_storage;
|
|
347
|
+
}
|
|
348
|
+
set seatReservations(value) {
|
|
349
|
+
this.#seatReservations_accessor_storage = value;
|
|
350
|
+
}
|
|
351
|
+
#travelDirection_accessor_storage;
|
|
352
|
+
/** Displays an arrow showing what direction does train drive*/
|
|
353
|
+
get travelDirection() {
|
|
354
|
+
return this.#travelDirection_accessor_storage;
|
|
355
|
+
}
|
|
356
|
+
set travelDirection(value) {
|
|
357
|
+
this.#travelDirection_accessor_storage = value;
|
|
358
|
+
}
|
|
359
|
+
#hasNavigation_accessor_storage;
|
|
360
|
+
/** The seat reservation navigation can be toggled by this property */
|
|
361
|
+
get hasNavigation() {
|
|
362
|
+
return this.#hasNavigation_accessor_storage;
|
|
363
|
+
}
|
|
364
|
+
set hasNavigation(value) {
|
|
365
|
+
this.#hasNavigation_accessor_storage = value;
|
|
366
|
+
}
|
|
367
|
+
#alignVertical_accessor_storage;
|
|
368
|
+
/** The seat reservation area is aligned vertically */
|
|
369
|
+
get alignVertical() {
|
|
370
|
+
return this.#alignVertical_accessor_storage;
|
|
371
|
+
}
|
|
372
|
+
set alignVertical(value) {
|
|
373
|
+
this.#alignVertical_accessor_storage = value;
|
|
374
|
+
}
|
|
375
|
+
#baseGridSize_accessor_storage;
|
|
376
|
+
/** The seat reservation area's base grid size */
|
|
377
|
+
get baseGridSize() {
|
|
378
|
+
return this.#baseGridSize_accessor_storage;
|
|
379
|
+
}
|
|
380
|
+
set baseGridSize(value) {
|
|
381
|
+
this.#baseGridSize_accessor_storage = value;
|
|
382
|
+
}
|
|
383
|
+
#height_accessor_storage;
|
|
384
|
+
/** The seat reservation area's width */
|
|
385
|
+
get height() {
|
|
386
|
+
return this.#height_accessor_storage;
|
|
387
|
+
}
|
|
388
|
+
set height(value) {
|
|
389
|
+
this.#height_accessor_storage = value;
|
|
390
|
+
}
|
|
391
|
+
#maxSeatReservations_accessor_storage;
|
|
392
|
+
/** Maximal number of possible clickable seats */
|
|
393
|
+
get maxSeatReservations() {
|
|
394
|
+
return this.#maxSeatReservations_accessor_storage;
|
|
395
|
+
}
|
|
396
|
+
set maxSeatReservations(value) {
|
|
397
|
+
this.#maxSeatReservations_accessor_storage = value;
|
|
398
|
+
}
|
|
399
|
+
#maxBicycleReservations_accessor_storage;
|
|
400
|
+
/** Maximal number of possible clickable bicycle places */
|
|
401
|
+
get maxBicycleReservations() {
|
|
402
|
+
return this.#maxBicycleReservations_accessor_storage;
|
|
403
|
+
}
|
|
404
|
+
set maxBicycleReservations(value) {
|
|
405
|
+
this.#maxBicycleReservations_accessor_storage = value;
|
|
406
|
+
}
|
|
407
|
+
#preventPlaceClick_accessor_storage;
|
|
408
|
+
/** Any click functionality is prevented */
|
|
409
|
+
get preventPlaceClick() {
|
|
410
|
+
return this.#preventPlaceClick_accessor_storage;
|
|
411
|
+
}
|
|
412
|
+
set preventPlaceClick(value) {
|
|
413
|
+
this.#preventPlaceClick_accessor_storage = value;
|
|
414
|
+
}
|
|
415
|
+
#preselectCoachIndex_accessor_storage;
|
|
416
|
+
get preselectCoachIndex() {
|
|
417
|
+
return this.#preselectCoachIndex_accessor_storage;
|
|
418
|
+
}
|
|
419
|
+
set preselectCoachIndex(value) {
|
|
420
|
+
this.#preselectCoachIndex_accessor_storage = value;
|
|
421
|
+
}
|
|
422
|
+
#showTitleInfo_accessor_storage;
|
|
423
|
+
/** The seat reservation title information at place-controls, navigation-coaches and navigation-services can be toggled by this property */
|
|
424
|
+
get showTitleInfo() {
|
|
425
|
+
return this.#showTitleInfo_accessor_storage;
|
|
426
|
+
}
|
|
427
|
+
set showTitleInfo(value) {
|
|
428
|
+
this.#showTitleInfo_accessor_storage = value;
|
|
429
|
+
}
|
|
430
|
+
#selectedCoachIndex_accessor_storage;
|
|
431
|
+
get selectedCoachIndex() {
|
|
432
|
+
return this.#selectedCoachIndex_accessor_storage;
|
|
433
|
+
}
|
|
434
|
+
set selectedCoachIndex(value) {
|
|
435
|
+
this.#selectedCoachIndex_accessor_storage = value;
|
|
436
|
+
}
|
|
437
|
+
#focusedCoachIndex_accessor_storage;
|
|
438
|
+
get focusedCoachIndex() {
|
|
439
|
+
return this.#focusedCoachIndex_accessor_storage;
|
|
440
|
+
}
|
|
441
|
+
set focusedCoachIndex(value) {
|
|
442
|
+
this.#focusedCoachIndex_accessor_storage = value;
|
|
443
|
+
}
|
|
444
|
+
#hoveredCoachIndex_accessor_storage;
|
|
445
|
+
get hoveredCoachIndex() {
|
|
446
|
+
return this.#hoveredCoachIndex_accessor_storage;
|
|
447
|
+
}
|
|
448
|
+
set hoveredCoachIndex(value) {
|
|
449
|
+
this.#hoveredCoachIndex_accessor_storage = value;
|
|
450
|
+
}
|
|
451
|
+
constructor() {
|
|
452
|
+
super();
|
|
453
|
+
this.#seatReservations_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _seatReservations_initializers, null));
|
|
454
|
+
this.#travelDirection_accessor_storage = (__runInitializers(this, _seatReservations_extraInitializers), __runInitializers(this, _travelDirection_initializers, "NONE"));
|
|
455
|
+
this.#hasNavigation_accessor_storage = (__runInitializers(this, _travelDirection_extraInitializers), __runInitializers(this, _hasNavigation_initializers, true));
|
|
456
|
+
this.#alignVertical_accessor_storage = (__runInitializers(this, _hasNavigation_extraInitializers), __runInitializers(this, _alignVertical_initializers, false));
|
|
457
|
+
this.#baseGridSize_accessor_storage = (__runInitializers(this, _alignVertical_extraInitializers), __runInitializers(this, _baseGridSize_initializers, 16));
|
|
458
|
+
this.#height_accessor_storage = (__runInitializers(this, _baseGridSize_extraInitializers), __runInitializers(this, _height_initializers, null));
|
|
459
|
+
this.#maxSeatReservations_accessor_storage = (__runInitializers(this, _height_extraInitializers), __runInitializers(this, _maxSeatReservations_initializers, -1));
|
|
460
|
+
this.#maxBicycleReservations_accessor_storage = (__runInitializers(this, _maxSeatReservations_extraInitializers), __runInitializers(this, _maxBicycleReservations_initializers, -1));
|
|
461
|
+
this.#preventPlaceClick_accessor_storage = (__runInitializers(this, _maxBicycleReservations_extraInitializers), __runInitializers(this, _preventPlaceClick_initializers, false));
|
|
462
|
+
this.#preselectCoachIndex_accessor_storage = (__runInitializers(this, _preventPlaceClick_extraInitializers), __runInitializers(this, _preselectCoachIndex_initializers, -1));
|
|
463
|
+
this.#showTitleInfo_accessor_storage = (__runInitializers(this, _preselectCoachIndex_extraInitializers), __runInitializers(this, _showTitleInfo_initializers, false));
|
|
464
|
+
this.#selectedCoachIndex_accessor_storage = (__runInitializers(this, _showTitleInfo_extraInitializers), __runInitializers(this, _selectedCoachIndex_initializers, -1));
|
|
465
|
+
this.#focusedCoachIndex_accessor_storage = (__runInitializers(this, _selectedCoachIndex_extraInitializers), __runInitializers(this, _focusedCoachIndex_initializers, -1));
|
|
466
|
+
this.#hoveredCoachIndex_accessor_storage = (__runInitializers(this, _focusedCoachIndex_extraInitializers), __runInitializers(this, _hoveredCoachIndex_initializers, -1));
|
|
467
|
+
this.coachBorderPadding = (__runInitializers(this, _hoveredCoachIndex_extraInitializers), 6);
|
|
468
|
+
this.gapBetweenCoaches = 4;
|
|
469
|
+
this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
|
|
470
|
+
this.gapBetweenCoachDecks = 48;
|
|
471
|
+
this.coachNavButtonDim = 0;
|
|
472
|
+
this.coachItemDetailsElements = [];
|
|
473
|
+
this.currScrollDirection = ScrollDirection.right;
|
|
474
|
+
this.maxCalcCoachesWidth = 0;
|
|
475
|
+
this.scrollCoachesAreaWidth = 0;
|
|
476
|
+
this.scrollNavigationAreaDim = 0;
|
|
477
|
+
this.triggerCoachPositionsCollection = [];
|
|
478
|
+
this.navigationScrollArea = null;
|
|
479
|
+
this.coachScrollArea = null;
|
|
480
|
+
this.currSelectedPlace = null;
|
|
481
|
+
this.currSelectedPlaceElementId = null;
|
|
482
|
+
this.currSelectedCoachIndex = -1;
|
|
483
|
+
this.currSelectedDeckIndex = 0;
|
|
484
|
+
this.preventCoachScrollByPlaceClick = false;
|
|
485
|
+
this.selectedSeatReservationPlaces = {
|
|
486
|
+
seats: [],
|
|
487
|
+
bicycles: []
|
|
488
|
+
};
|
|
489
|
+
this.seatReservationWithoutNavigationHasFocus = false;
|
|
490
|
+
this.isCoachGridFocusable = false;
|
|
491
|
+
this.isAutoScrolling = false;
|
|
492
|
+
this.isKeyboardNavigation = false;
|
|
493
|
+
this.hasMultipleDecks = false;
|
|
494
|
+
this.hasSeatReservationNativeFocus = false;
|
|
495
|
+
this.keyboardNavigationEvents = {
|
|
496
|
+
ArrowLeft: "ArrowLeft",
|
|
497
|
+
ArrowRight: "ArrowRight",
|
|
498
|
+
ArrowUp: "ArrowUp",
|
|
499
|
+
ArrowDown: "ArrowDown",
|
|
500
|
+
Tab: "Tab",
|
|
501
|
+
Enter: "Enter"
|
|
502
|
+
};
|
|
503
|
+
this.notAreaElements = [
|
|
504
|
+
"DRIVER_AREA",
|
|
505
|
+
"DRIVER_AREA_NO_VERTICAL_WALL",
|
|
506
|
+
"COACH_PASSAGE",
|
|
507
|
+
"COACH_WALL_NO_PASSAGE",
|
|
508
|
+
"COMPARTMENT_PASSAGE",
|
|
509
|
+
"COMPARTMENT_PASSAGE_HIGH",
|
|
510
|
+
"COMPARTMENT_PASSAGE_MIDDLE",
|
|
511
|
+
"COMPARTMENT_PASSAGE_LOW"
|
|
512
|
+
];
|
|
513
|
+
this.overHangingElementInformation = [];
|
|
514
|
+
this._isRunningInitPreselectCoachIndex = false;
|
|
515
|
+
this._lastStartScrollPos = -1;
|
|
516
|
+
this._prepareServiceIconsNavigation = (propertyIds) => {
|
|
517
|
+
if (!propertyIds) return [];
|
|
518
|
+
const shrunkPropertyIds = propertyIds?.map(function(propertyId) {
|
|
519
|
+
return {
|
|
520
|
+
pId: propertyId,
|
|
521
|
+
svgName: mapIconToSvg[propertyId]?.svgName ? mapIconToSvg[propertyId]?.svgName : ""
|
|
522
|
+
};
|
|
523
|
+
}).filter((propertyToSvg) => ALLOWED_SERVICE_ICONS.indexOf(propertyToSvg.svgName) !== -1).filter((value, index, self) => self.map((propSvg) => propSvg.svgName).indexOf(value.svgName) === index).map((propertyToSvg) => propertyToSvg.pId).slice(0, MAX_SERVICE_PROPERTIES);
|
|
524
|
+
return shrunkPropertyIds ? shrunkPropertyIds : [];
|
|
525
|
+
};
|
|
526
|
+
this.addEventListener("blur", () => this._onLeaveSeatReservationComponent());
|
|
527
|
+
}
|
|
528
|
+
willUpdate(changedProperties) {
|
|
529
|
+
super.willUpdate(changedProperties);
|
|
530
|
+
if (changedProperties.has("seatReservations")) {
|
|
531
|
+
this.hasMultipleDecks = this.seatReservations?.length > 1;
|
|
532
|
+
this._initPrepareSeatReservationData();
|
|
533
|
+
this._prepareCoachWidthAndGapCalculations();
|
|
534
|
+
this._initSeatReservationPlaceSelection();
|
|
535
|
+
this.initNavigationSelectionByScrollEvent();
|
|
536
|
+
}
|
|
537
|
+
if (changedProperties.has("baseGridSize")) {
|
|
538
|
+
this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
|
|
539
|
+
this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
|
|
540
|
+
this.initNavigationSelectionByScrollEvent();
|
|
541
|
+
}
|
|
542
|
+
if (changedProperties.has("height") && !!this.height) {
|
|
543
|
+
const seatReservationLayer = this.seatReservations[this.currSelectedDeckIndex] || null;
|
|
544
|
+
if (seatReservationLayer?.coachItems.length) {
|
|
545
|
+
this.baseGridSize = this.height / seatReservationLayer.coachItems[0].dimension.h;
|
|
546
|
+
this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
|
|
547
|
+
this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
|
|
548
|
+
this.initNavigationSelectionByScrollEvent();
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
if (changedProperties.has("alignVertical") && this.alignVertical) this.initNavigationSelectionByScrollEvent();
|
|
552
|
+
if (changedProperties.has("preselectCoachIndex")) {
|
|
553
|
+
this._isRunningInitPreselectCoachIndex = true;
|
|
554
|
+
setTimeout(() => this.scrollToSelectedNavCoach(this.preselectCoachIndex), 1);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
navigateByDirectionBtn(btnDirection) {
|
|
558
|
+
this.unfocusPlaceElement();
|
|
559
|
+
let navigateToCoachIndex = this.currSelectedCoachIndex;
|
|
560
|
+
if (btnDirection == "DIRECTION_LEFT" && navigateToCoachIndex > 0) navigateToCoachIndex = this.currSelectedCoachIndex != -1 ? this.currSelectedCoachIndex - 1 : 0;
|
|
561
|
+
else if (btnDirection == "DIRECTION_RIGHT" && navigateToCoachIndex < this.seatReservations[this.currSelectedDeckIndex]?.coachItems.length - 1) navigateToCoachIndex = this.currSelectedCoachIndex != -1 ? this.currSelectedCoachIndex + 1 : 0;
|
|
562
|
+
this.scrollToSelectedNavCoach(navigateToCoachIndex);
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Data can be prepared once for the entire component
|
|
566
|
+
* in order to avoid recurring iteration processes in rendering.
|
|
567
|
+
*/
|
|
568
|
+
_initPrepareSeatReservationData() {
|
|
569
|
+
this._determineBaseFontSize();
|
|
570
|
+
if (this.hasMultipleDecks) this._initEmptyCoachDeckOffsets();
|
|
571
|
+
this._prepareCoachItemDetailsData();
|
|
572
|
+
}
|
|
573
|
+
/** Init scroll event handling for coach navigation */
|
|
574
|
+
initNavigationSelectionByScrollEvent() {
|
|
575
|
+
this.coachScrollArea = this.shadowRoot?.querySelector("#sbb-sr__wrapper-scrollarea");
|
|
576
|
+
this.navigationScrollArea = this.shadowRoot?.querySelector("#sbb-sr__navigation-list-coaches");
|
|
577
|
+
const seatReservationDeck = this.seatReservations ? this.seatReservations[this.currSelectedDeckIndex] : null;
|
|
578
|
+
if (seatReservationDeck && seatReservationDeck.coachItems.length > 0) {
|
|
579
|
+
const coachHeightWithBorderPadding = seatReservationDeck.coachItems[0].dimension.h * this.baseGridSize + this.coachBorderPadding;
|
|
580
|
+
const gapBetweenCoachDecks = (this.seatReservations.length - 1) * this.gapBetweenCoachDecks;
|
|
581
|
+
this.style?.setProperty("--sbb-seat-reservation-height", `${coachHeightWithBorderPadding * this.seatReservations.length + gapBetweenCoachDecks}`);
|
|
582
|
+
this.style?.setProperty("--sbb-seat-reservation-decks", `${this.seatReservations.length}`);
|
|
583
|
+
}
|
|
584
|
+
if (this.navigationScrollArea) {
|
|
585
|
+
this.scrollNavigationAreaDim = this.alignVertical ? this.navigationScrollArea.getBoundingClientRect().height : this.navigationScrollArea.getBoundingClientRect().width;
|
|
586
|
+
const navCoachesList = this.navigationScrollArea.querySelector("ul > li");
|
|
587
|
+
if (navCoachesList) {
|
|
588
|
+
const firstLiEleDimension = navCoachesList?.getBoundingClientRect();
|
|
589
|
+
this.coachNavButtonDim = this.alignVertical ? firstLiEleDimension.height : firstLiEleDimension.width;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
if (this.coachScrollArea && seatReservationDeck) {
|
|
593
|
+
let currCalcTriggerPos = 0;
|
|
594
|
+
this.scrollCoachesAreaWidth = this.alignVertical ? this.coachScrollArea.getBoundingClientRect().height : this.coachScrollArea.getBoundingClientRect().width;
|
|
595
|
+
this.triggerCoachPositionsCollection = seatReservationDeck.coachItems.map((coach) => {
|
|
596
|
+
const startPosX = currCalcTriggerPos;
|
|
597
|
+
const coachWidth = this.getCalculatedDimension(coach.dimension).w;
|
|
598
|
+
const currentCoachOverhangingInfo = this.overHangingElementInformation.find((e) => e.coachId === coach.id);
|
|
599
|
+
const overhangingElementsPresent = currentCoachOverhangingInfo?.overhangingPlaces || currentCoachOverhangingInfo?.overhangingGraphicAreas;
|
|
600
|
+
currCalcTriggerPos += coachWidth + (!overhangingElementsPresent ? this.gapBetweenCoaches : 2 * this.gapBetweenCoaches);
|
|
601
|
+
return {
|
|
602
|
+
start: startPosX,
|
|
603
|
+
end: currCalcTriggerPos,
|
|
604
|
+
width: coachWidth
|
|
605
|
+
};
|
|
606
|
+
});
|
|
607
|
+
this.maxCalcCoachesWidth = currCalcTriggerPos - this.gapBetweenCoaches;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Scroll event handler managed the end of scrolling inside the coach scroll area.
|
|
612
|
+
* Timeout event handling to check if the scrolling has been completed.
|
|
613
|
+
* It is required because the Safari browser does not handle scrollend event,
|
|
614
|
+
* and we therefore imitate this event -> scrollend.
|
|
615
|
+
*/
|
|
616
|
+
coachAreaScrollend() {
|
|
617
|
+
if (this._scrollTimeout) clearTimeout(this._scrollTimeout);
|
|
618
|
+
this._scrollTimeout = setTimeout(() => this._handleCoachAreaScrollendEvent(), 150);
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* If no navigation exists (property setting -> hasNavigation) and a table coach gets the focus,
|
|
622
|
+
* the first place in the coach must be automatically preselected to control the place navigation via keyboard
|
|
623
|
+
*
|
|
624
|
+
* @param focusCoachIndex
|
|
625
|
+
*/
|
|
626
|
+
onFocusTableCoachAndPreselectPlace(focusCoachIndex) {
|
|
627
|
+
if (!this.seatReservationWithoutNavigationHasFocus && !this.hasNavigation) {
|
|
628
|
+
this.seatReservationWithoutNavigationHasFocus = true;
|
|
629
|
+
this.currSelectedCoachIndex = focusCoachIndex === 0 ? this.getNextAvailableCoachIndex(-1) : this.getPrevAvailableCoachIndex(focusCoachIndex);
|
|
630
|
+
this.preselectPlaceInCoach();
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
/** Will be triggered by focus navigation direction */
|
|
634
|
+
onFocusNavDirectionButton() {
|
|
635
|
+
this.focusedCoachIndex = -1;
|
|
636
|
+
}
|
|
637
|
+
/** TAB Key Event handling for Coach Navigation */
|
|
638
|
+
onKeyNavigationNavCoachButton(event, currNavCoachButtonIndex) {
|
|
639
|
+
if (event.key === this.keyboardNavigationEvents.Tab) {
|
|
640
|
+
this._handleTabKeyNavigation(event, "navigation", currNavCoachButtonIndex);
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
if (isArrowKeyOrPageKeysPressed(event)) this.keyboardSeatmapEventHandling(event);
|
|
644
|
+
}
|
|
645
|
+
/** General TAB Key Event handling for tab navigation inside the coach navigation area and the seatmap area */
|
|
646
|
+
_handleTabKeyNavigation(event, eventArea, currTabIndex) {
|
|
647
|
+
const pressedKey = event.key;
|
|
648
|
+
const pressedShiftTab = event.shiftKey;
|
|
649
|
+
if (pressedKey === this.keyboardNavigationEvents.Tab) {
|
|
650
|
+
if (eventArea == "navigation") {
|
|
651
|
+
if (currTabIndex == this.currSelectedCoachIndex) {
|
|
652
|
+
if (!this.currSelectedPlace || !pressedShiftTab || this.coachItemDetailsElements[currTabIndex].isDriverArea || this.focusedCoachIndex == -1) this.focusedCoachIndex = currTabIndex;
|
|
653
|
+
else if (pressedShiftTab && this.currSelectedPlace) {
|
|
654
|
+
this.focusedCoachIndex = -1;
|
|
655
|
+
this.focusPlaceElement(this.currSelectedPlace);
|
|
656
|
+
}
|
|
657
|
+
} else this.focusedCoachIndex = currTabIndex;
|
|
658
|
+
this._scrollToSelectedNavigationButton(currTabIndex);
|
|
659
|
+
} else if (eventArea == "seatmap") {
|
|
660
|
+
event.preventDefault();
|
|
661
|
+
if (pressedShiftTab) this._navigateCoachNavigationByKeyboard("PREV_TAB");
|
|
662
|
+
else this._navigateCoachNavigationByKeyboard("NEXT_TAB");
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Initialisation of Keyboard Seatmap event handling to navigation between each places inside a selected coach by using [arrow] keys.
|
|
668
|
+
* With the [TAB] key the user navigation goes to the next coach navigation element and the currently selected place is automatically reset.
|
|
669
|
+
*/
|
|
670
|
+
keyboardSeatmapEventHandling(event) {
|
|
671
|
+
const isTabNext = event.key === this.keyboardNavigationEvents.Tab;
|
|
672
|
+
const isTabPrev = event.shiftKey && isTabNext;
|
|
673
|
+
if (!this.hasNavigation && this.currSelectedCoachIndex === 0 && isTabPrev || this.currSelectedCoachIndex === this.coachItemDetailsElements.length - 1 && isTabNext) return;
|
|
674
|
+
const pressedKey = event.key;
|
|
675
|
+
this.preventCoachScrollByPlaceClick = false;
|
|
676
|
+
if (!this.hasSeatReservationNativeFocus && (isTabNext || isTabPrev)) this.hasSeatReservationNativeFocus = true;
|
|
677
|
+
if (isTabNext) {
|
|
678
|
+
this._handleTabKeyNavigation(event, "seatmap");
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
if (this.currSelectedCoachIndex !== -1 && isArrowKeyOrPageKeysPressed(event)) {
|
|
682
|
+
event.preventDefault();
|
|
683
|
+
switch (pressedKey) {
|
|
684
|
+
case this.keyboardNavigationEvents.ArrowLeft:
|
|
685
|
+
{
|
|
686
|
+
const pressedLeftKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowDown : pressedKey;
|
|
687
|
+
this._navigateToPlaceByKeyboard(pressedLeftKeyMapping);
|
|
688
|
+
}
|
|
689
|
+
break;
|
|
690
|
+
case this.keyboardNavigationEvents.ArrowRight:
|
|
691
|
+
{
|
|
692
|
+
const pressedRightKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowUp : pressedKey;
|
|
693
|
+
this._navigateToPlaceByKeyboard(pressedRightKeyMapping);
|
|
694
|
+
}
|
|
695
|
+
break;
|
|
696
|
+
case this.keyboardNavigationEvents.ArrowUp:
|
|
697
|
+
{
|
|
698
|
+
const pressedUpKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowLeft : pressedKey;
|
|
699
|
+
this._navigateToPlaceByKeyboard(pressedUpKeyMapping);
|
|
700
|
+
}
|
|
701
|
+
break;
|
|
702
|
+
case this.keyboardNavigationEvents.ArrowDown:
|
|
703
|
+
{
|
|
704
|
+
const pressedDownKeyMapping = this.alignVertical ? this.keyboardNavigationEvents.ArrowRight : pressedKey;
|
|
705
|
+
this._navigateToPlaceByKeyboard(pressedDownKeyMapping);
|
|
706
|
+
}
|
|
707
|
+
break;
|
|
708
|
+
default: break;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Selects a place inside the coach if navigated via keyboard,
|
|
714
|
+
* otherwise the coach grid is selected (necessary for ScreenReader)
|
|
715
|
+
*/
|
|
716
|
+
preselectPlaceInCoach() {
|
|
717
|
+
if (!this.isAutoScrolling) return;
|
|
718
|
+
if (this._isRunningInitPreselectCoachIndex) {
|
|
719
|
+
this._isRunningInitPreselectCoachIndex = false;
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
if (this.coachItemDetailsElements[this.currSelectedCoachIndex] && this.coachItemDetailsElements[this.currSelectedCoachIndex].isDriverArea) {
|
|
723
|
+
this._setFocusToSelectedCoachGrid();
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
if (this.isKeyboardNavigation && this.isAutoScrolling) {
|
|
727
|
+
const closestPlace = this._getClosestPlaceByKeyDirection();
|
|
728
|
+
if (closestPlace) {
|
|
729
|
+
this.unfocusPlaceElement();
|
|
730
|
+
this.focusPlaceElement(closestPlace);
|
|
731
|
+
this.focusedCoachIndex = -1;
|
|
732
|
+
} else this._setFocusToSelectedCoachGrid();
|
|
733
|
+
} else {
|
|
734
|
+
this.unfocusPlaceElement();
|
|
735
|
+
this.isCoachGridFocusable = true;
|
|
736
|
+
this._setFocusToSelectedCoachGrid();
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
scrollToSelectedNavCoach(selectedNavCoachIndex) {
|
|
740
|
+
if (this._isValidCoachIndex(selectedNavCoachIndex) && selectedNavCoachIndex !== this.currSelectedCoachIndex) {
|
|
741
|
+
this.hoveredCoachIndex = selectedNavCoachIndex;
|
|
742
|
+
this.isAutoScrolling = true;
|
|
743
|
+
this.isCoachGridFocusable = true;
|
|
744
|
+
this.currSelectedCoachIndex = selectedNavCoachIndex;
|
|
745
|
+
this.currSelectedDeckIndex = this._getExistingCoachDeckIndex();
|
|
746
|
+
this._setScrollDirectionByCoachIndex();
|
|
747
|
+
const scrollToCoachPosX = this._getCoachScrollPositionX();
|
|
748
|
+
if ((this.selectedCoachIndex !== -1 || this.currSelectedCoachIndex > 0) && this._isScrollableToSelectedCoach()) {
|
|
749
|
+
this._lastStartScrollPos = this.coachScrollArea.scrollLeft;
|
|
750
|
+
this.coachScrollArea.scrollTo({
|
|
751
|
+
top: this.alignVertical ? scrollToCoachPosX : 0,
|
|
752
|
+
left: this.alignVertical ? 0 : scrollToCoachPosX,
|
|
753
|
+
behavior: "smooth"
|
|
754
|
+
});
|
|
755
|
+
} else this.updateCurrentSelectedCoach();
|
|
756
|
+
this._scrollToSelectedNavigationButton(selectedNavCoachIndex);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
focusPlaceElement(place) {
|
|
760
|
+
this.unfocusPlaceElement();
|
|
761
|
+
if (place) {
|
|
762
|
+
this.currSelectedPlace = place;
|
|
763
|
+
this._setCurrSelectedPlaceElementId(place);
|
|
764
|
+
const selectedPlaceElement = this._getPlaceHtmlElement();
|
|
765
|
+
if (selectedPlaceElement) {
|
|
766
|
+
selectedPlaceElement.setAttribute("keyfocus", "focus");
|
|
767
|
+
const delayScrollInViewport = setTimeout(() => {
|
|
768
|
+
const placeId = this.getPlaceElementId(this.currSelectedDeckIndex, this.currSelectedCoachIndex, place.number);
|
|
769
|
+
this._scrollPlaceIntoNearestViewport(placeId);
|
|
770
|
+
clearTimeout(delayScrollInViewport);
|
|
771
|
+
}, 0);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
unfocusPlaceElement() {
|
|
776
|
+
const selectedPlaceElement = this._getPlaceHtmlElement();
|
|
777
|
+
if (selectedPlaceElement) {
|
|
778
|
+
selectedPlaceElement.setAttribute("keyfocus", "unfocus");
|
|
779
|
+
this._setCurrSelectedPlaceElementId(null);
|
|
780
|
+
this.currSelectedPlace = null;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
getCalculatedDimension(elementDimension, coachDimension, isOriginHeight, isStretchHeight) {
|
|
784
|
+
if (coachDimension && !isOriginHeight) elementDimension.h += this.coachBorderOffset * 2;
|
|
785
|
+
if (isStretchHeight) elementDimension.h += this.coachBorderOffset;
|
|
786
|
+
return {
|
|
787
|
+
w: this.baseGridSize * elementDimension.w,
|
|
788
|
+
h: this.baseGridSize * elementDimension.h
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
getCalculatedPosition(elementPosition, elementDimension, coachDimension, isOriginHeight) {
|
|
792
|
+
if (coachDimension && elementDimension) {
|
|
793
|
+
const endPosHeight = isOriginHeight ? coachDimension.h : coachDimension.h + this.coachBorderOffset;
|
|
794
|
+
if (elementPosition.y === 0) elementPosition.y -= this.coachBorderOffset;
|
|
795
|
+
else if (elementPosition.y + elementDimension.h === endPosHeight) elementPosition.y += this.coachBorderOffset;
|
|
796
|
+
}
|
|
797
|
+
return {
|
|
798
|
+
x: this.baseGridSize * elementPosition.x,
|
|
799
|
+
y: this.baseGridSize * elementPosition.y,
|
|
800
|
+
z: elementPosition.z
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* detects if a (graphical) element is on the border with its position (upper or lower border).
|
|
805
|
+
* @param baseElement
|
|
806
|
+
* @param coachDimension
|
|
807
|
+
* @protected
|
|
808
|
+
*/
|
|
809
|
+
isElementDirectlyOnBorder(baseElement, coachDimension) {
|
|
810
|
+
return baseElement.position.y === 0 || baseElement.position.y + baseElement.dimension.h === coachDimension.h;
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* Counts all available seats together depending on the seat type
|
|
814
|
+
*
|
|
815
|
+
* @param places
|
|
816
|
+
* @returns An Object with count of free seats and free bicycle places
|
|
817
|
+
*/
|
|
818
|
+
getAvailableFreePlacesNumFromCoach(places) {
|
|
819
|
+
const accumulator = {
|
|
820
|
+
seats: 0,
|
|
821
|
+
bicycles: 0
|
|
822
|
+
};
|
|
823
|
+
const freePlaces = places?.reduce((accumulator, currPlace) => {
|
|
824
|
+
if (currPlace.state !== "FREE") return accumulator;
|
|
825
|
+
if (currPlace.type === "SEAT") accumulator.seats++;
|
|
826
|
+
else accumulator.bicycles++;
|
|
827
|
+
return accumulator;
|
|
828
|
+
}, accumulator);
|
|
829
|
+
return freePlaces ? freePlaces : accumulator;
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* At the end of a scroll Event from the coach scrollable area,
|
|
833
|
+
* the reached coach is marked as selected
|
|
834
|
+
*/
|
|
835
|
+
_handleCoachAreaScrollendEvent() {
|
|
836
|
+
const findScrollCoachIndex = this.isAutoScrolling ? this.currSelectedCoachIndex : this._getCoachIndexByScrollTriggerPosition();
|
|
837
|
+
if (this.preventCoachScrollByPlaceClick) {
|
|
838
|
+
if (Math.abs(this._lastStartScrollPos - this.coachScrollArea.scrollLeft) > this.baseGridSize * 2) this.selectedCoachIndex = findScrollCoachIndex;
|
|
839
|
+
this.preventCoachScrollByPlaceClick = false;
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
this._lastStartScrollPos = this.coachScrollArea.scrollLeft;
|
|
843
|
+
this.hoveredCoachIndex = -1;
|
|
844
|
+
if (this.currSelectedCoachIndex === -1) this.currSelectedCoachIndex = findScrollCoachIndex;
|
|
845
|
+
if (this._isScrollableToSelectedCoach()) this.currSelectedCoachIndex = findScrollCoachIndex;
|
|
846
|
+
else this.currSelectedCoachIndex = findScrollCoachIndex < this.currSelectedCoachIndex ? this.currSelectedCoachIndex : findScrollCoachIndex;
|
|
847
|
+
if (!this.isAutoScrolling) this._scrollToSelectedNavigationButton(findScrollCoachIndex);
|
|
848
|
+
this.preventCoachScrollByPlaceClick = false;
|
|
849
|
+
this.updateCurrentSelectedCoach();
|
|
850
|
+
if (!this.hasNavigation) {
|
|
851
|
+
this.preselectPlaceInCoach();
|
|
852
|
+
this.isAutoScrolling = false;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
/**
|
|
856
|
+
* Performs an automatic main navigation scroll to the specified selectedNavCoachIndex.
|
|
857
|
+
* Calculates the central scroll offset of the nav coach to be selected.
|
|
858
|
+
* @param selectedNavCoachIndex
|
|
859
|
+
*/
|
|
860
|
+
_scrollToSelectedNavigationButton(selectedNavCoachIndex) {
|
|
861
|
+
setTimeout(() => {
|
|
862
|
+
if (this.hasNavigation && this.navigationScrollArea) {
|
|
863
|
+
const navigationAreaCenteredPosX = this.scrollNavigationAreaDim / 2;
|
|
864
|
+
const scrollOffsetX = selectedNavCoachIndex * this.coachNavButtonDim - navigationAreaCenteredPosX + this.coachNavButtonDim;
|
|
865
|
+
this.navigationScrollArea.scrollTo({
|
|
866
|
+
top: this.alignVertical ? scrollOffsetX : 0,
|
|
867
|
+
left: this.alignVertical ? 0 : scrollOffsetX,
|
|
868
|
+
behavior: "smooth"
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
}, 10);
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Sets the new ScrollDirection by the new given target coach index.
|
|
875
|
+
*/
|
|
876
|
+
_setScrollDirectionByCoachIndex() {
|
|
877
|
+
this.currScrollDirection = this.currSelectedCoachIndex > this.selectedCoachIndex ? ScrollDirection.right : ScrollDirection.left;
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
880
|
+
* Returns the scroll start or end position X from the selected coach.
|
|
881
|
+
* In case the user is currently navigating through places by keyboard and goes to previous coach,
|
|
882
|
+
* then we return the end position of the coach to get the closest scroll position of the next focus place.
|
|
883
|
+
* @returns number
|
|
884
|
+
*/
|
|
885
|
+
_getCoachScrollPositionX() {
|
|
886
|
+
const coachTriggerPoint = this.triggerCoachPositionsCollection[this.currSelectedCoachIndex];
|
|
887
|
+
return this.isKeyboardNavigation && this.currScrollDirection === ScrollDirection.left && coachTriggerPoint.width > this.scrollCoachesAreaWidth ? coachTriggerPoint.end - this.scrollCoachesAreaWidth : coachTriggerPoint.start;
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* Sets the focus on the HTML table (grid) caption element so that the heading is read out when using a ScreenReader.
|
|
891
|
+
*/
|
|
892
|
+
_setFocusToSelectedCoachGrid() {
|
|
893
|
+
if (this.isCoachGridFocusable && this.hasSeatReservationNativeFocus) {
|
|
894
|
+
this.isCoachGridFocusable = false;
|
|
895
|
+
const coachTableCaptionElement = this.shadowRoot?.querySelector("#sbb-sr-coach-caption-" + this.currSelectedCoachIndex);
|
|
896
|
+
if (coachTableCaptionElement) coachTableCaptionElement.focus();
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
/**
|
|
900
|
+
* Returns whether the current scrolled position can be used to scroll to the selected wagon
|
|
901
|
+
* @returns boolean
|
|
902
|
+
*/
|
|
903
|
+
_isScrollableToSelectedCoach() {
|
|
904
|
+
const currScrollPosX = this.alignVertical ? this.coachScrollArea.scrollTop : this.coachScrollArea.scrollLeft;
|
|
905
|
+
const coachScrollWindowWidth = this.alignVertical ? this.coachScrollArea.getBoundingClientRect().height : this.coachScrollArea.getBoundingClientRect().width;
|
|
906
|
+
const maxScrollWidthArea = this.maxCalcCoachesWidth - coachScrollWindowWidth;
|
|
907
|
+
const currCoachTrigger = this.triggerCoachPositionsCollection[this.currSelectedCoachIndex];
|
|
908
|
+
const isScrollPosSameToCurrCoachPos = currScrollPosX === this.triggerCoachPositionsCollection[this.currSelectedCoachIndex].start;
|
|
909
|
+
return (currScrollPosX < maxScrollWidthArea || currScrollPosX > currCoachTrigger.start) && !isScrollPosSameToCurrCoachPos;
|
|
910
|
+
}
|
|
911
|
+
/**
|
|
912
|
+
* Returns the coach index which is currently visible in the scroll area
|
|
913
|
+
* @returns number
|
|
914
|
+
*/
|
|
915
|
+
_getCoachIndexByScrollTriggerPosition() {
|
|
916
|
+
const scrollOffsetX = (this.alignVertical ? this.coachScrollArea.scrollTop : this.coachScrollArea.scrollLeft) + this.scrollCoachesAreaWidth / 2;
|
|
917
|
+
return this.triggerCoachPositionsCollection.findIndex((coachTrigger) => scrollOffsetX >= coachTrigger.start && scrollOffsetX <= coachTrigger.end);
|
|
918
|
+
}
|
|
919
|
+
/**
|
|
920
|
+
* Get the first place of current selected coach by table cell coordinate 0-0 id.
|
|
921
|
+
* @returns Place or null
|
|
922
|
+
*/
|
|
923
|
+
_getFirstPlaceInSelectedCoach() {
|
|
924
|
+
let firstPlace = null;
|
|
925
|
+
const coach = this.seatReservations[this.currSelectedDeckIndex].coachItems[this.currSelectedCoachIndex];
|
|
926
|
+
const firstCellId = "cell-" + this.currSelectedDeckIndex + "-" + this.currSelectedCoachIndex + "-0-0";
|
|
927
|
+
const placeNumber = this.shadowRoot?.querySelector("#" + firstCellId)?.querySelector("sbb-seat-reservation-place-control")?.getAttribute("text") || null;
|
|
928
|
+
if (coach && placeNumber) firstPlace = coach.places?.find((place) => place.number === placeNumber) || null;
|
|
929
|
+
return firstPlace;
|
|
930
|
+
}
|
|
931
|
+
_getSwitchedCoachDeckIndexByKeyNavigation(pressedKey, coach) {
|
|
932
|
+
if (!this.currSelectedPlace || pressedKey === this.keyboardNavigationEvents.ArrowRight || pressedKey === this.keyboardNavigationEvents.ArrowLeft) return null;
|
|
933
|
+
if (pressedKey === this.keyboardNavigationEvents.ArrowDown && this.currSelectedPlace.position.y + 2 === coach.dimension.h && !!this.seatReservations[this.currSelectedDeckIndex + 1]) return this.currSelectedDeckIndex + 1;
|
|
934
|
+
else if (pressedKey === this.keyboardNavigationEvents.ArrowUp && this.currSelectedPlace.position.y === 0 && !!this.seatReservations[this.currSelectedDeckIndex - 1]) return this.currSelectedDeckIndex - 1;
|
|
935
|
+
return null;
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* To get the correct closest place of current pressed key and the current selected place,
|
|
939
|
+
* we have to investigate the coordinates of each place to find the closest place of the currSelectedPlaceElementId.
|
|
940
|
+
* @param pressedKey
|
|
941
|
+
* @returns Place or null
|
|
942
|
+
*/
|
|
943
|
+
_getClosestPlaceByKeyDirection(pressedKey) {
|
|
944
|
+
const coach = this.seatReservations[this.currSelectedDeckIndex].coachItems[this.currSelectedCoachIndex];
|
|
945
|
+
let closestPlace = null;
|
|
946
|
+
let coachPlaces = coach.places;
|
|
947
|
+
let switchedCoachDeckIndex = null;
|
|
948
|
+
if (coachPlaces) {
|
|
949
|
+
if (!this.currSelectedPlaceElementId) return this._getFirstPlaceInSelectedCoach();
|
|
950
|
+
else if (this.currSelectedPlace) {
|
|
951
|
+
const currSelectedPlacePosition = { ...this.currSelectedPlace.position };
|
|
952
|
+
if (pressedKey) {
|
|
953
|
+
switchedCoachDeckIndex = this._getSwitchedCoachDeckIndexByKeyNavigation(pressedKey, coach);
|
|
954
|
+
if (switchedCoachDeckIndex !== null) {
|
|
955
|
+
coachPlaces = this.seatReservations[switchedCoachDeckIndex].coachItems[this.currSelectedCoachIndex].places || [];
|
|
956
|
+
currSelectedPlacePosition.y = switchedCoachDeckIndex < this.currSelectedDeckIndex ? coach.dimension.h : -1;
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
for (const place of coachPlaces) if (!pressedKey) {
|
|
960
|
+
if (this.currScrollDirection === ScrollDirection.right && place.position.y === currSelectedPlacePosition.y && (!closestPlace || place.position.x < closestPlace.position.x)) closestPlace = place;
|
|
961
|
+
else if (this.currScrollDirection === ScrollDirection.left && place.position.y === currSelectedPlacePosition.y && (!closestPlace || place.position.x > closestPlace.position.x)) closestPlace = place;
|
|
962
|
+
} else if (place.number !== this.currSelectedPlace?.number) {
|
|
963
|
+
if (pressedKey === this.keyboardNavigationEvents.ArrowRight && (place.position.y === currSelectedPlacePosition.y || place.position.y === currSelectedPlacePosition.y - 1) && place.position.x > currSelectedPlacePosition.x && (!closestPlace || place.position.x < closestPlace.position.x)) closestPlace = place;
|
|
964
|
+
else if (pressedKey === this.keyboardNavigationEvents.ArrowDown && (place.position.x === currSelectedPlacePosition.x || place.position.x === currSelectedPlacePosition.x + 1) && place.position.y > currSelectedPlacePosition.y && (!closestPlace || place.position.y < closestPlace.position.y)) closestPlace = place;
|
|
965
|
+
else if (pressedKey === this.keyboardNavigationEvents.ArrowLeft && (place.position.y === currSelectedPlacePosition.y || place.position.y === currSelectedPlacePosition.y + 1) && place.position.x < currSelectedPlacePosition.x && (!closestPlace || place.position.x > closestPlace.position.x)) closestPlace = place;
|
|
966
|
+
else if (pressedKey === this.keyboardNavigationEvents.ArrowUp && (place.position.x === currSelectedPlacePosition.x || place.position.x === currSelectedPlacePosition.x - 1) && place.position.y < currSelectedPlacePosition.y && (!closestPlace || place.position.y > closestPlace.position.y)) closestPlace = place;
|
|
967
|
+
}
|
|
968
|
+
if (switchedCoachDeckIndex !== null && closestPlace) this.currSelectedDeckIndex = switchedCoachDeckIndex;
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
return closestPlace;
|
|
972
|
+
}
|
|
973
|
+
_navigateCoachNavigationByKeyboard(tabDirection) {
|
|
974
|
+
const currFocusIndex = this.focusedCoachIndex === -1 ? this.currSelectedCoachIndex === -1 ? 0 : this.currSelectedCoachIndex : this.focusedCoachIndex;
|
|
975
|
+
const newFocusableIndex = tabDirection === "NEXT_TAB" ? this.getNextAvailableCoachIndex(currFocusIndex) : this.getPrevAvailableCoachIndex(currFocusIndex);
|
|
976
|
+
if (this.hasNavigation) {
|
|
977
|
+
const selectedPlaceElement = this._getPlaceHtmlElement();
|
|
978
|
+
const placeInCoachHasFocus = selectedPlaceElement ? selectedPlaceElement.getAttribute("keyfocus") === "focus" : false;
|
|
979
|
+
if (tabDirection === "PREV_TAB" && this.selectedCoachIndex === currFocusIndex) if (placeInCoachHasFocus || this.currSelectedPlace !== null) {
|
|
980
|
+
this.focusedCoachIndex = currFocusIndex;
|
|
981
|
+
this.unfocusPlaceElement();
|
|
982
|
+
return;
|
|
983
|
+
} else if (currFocusIndex === 0) this._refocusCurrentFocusedNavCoach(currFocusIndex);
|
|
984
|
+
else this.focusedCoachIndex = newFocusableIndex;
|
|
985
|
+
else if (newFocusableIndex !== this.currSelectedCoachIndex) this.focusedCoachIndex = newFocusableIndex;
|
|
986
|
+
else if (tabDirection === "NEXT_TAB" && newFocusableIndex === this.coachItemDetailsElements.length - 1) this._refocusCurrentFocusedNavCoach(currFocusIndex);
|
|
987
|
+
else {
|
|
988
|
+
this.focusedCoachIndex = -1;
|
|
989
|
+
this.selectedCoachIndex = newFocusableIndex;
|
|
990
|
+
if (placeInCoachHasFocus) this.focusPlaceElement(this.currSelectedPlace);
|
|
991
|
+
else {
|
|
992
|
+
this.isCoachGridFocusable = true;
|
|
993
|
+
this._setFocusToSelectedCoachGrid();
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
this._scrollToSelectedNavigationButton(newFocusableIndex);
|
|
997
|
+
} else this.scrollToSelectedNavCoach(newFocusableIndex);
|
|
998
|
+
}
|
|
999
|
+
_refocusCurrentFocusedNavCoach(focusIndex) {
|
|
1000
|
+
this.focusedCoachIndex = -1;
|
|
1001
|
+
setTimeout(() => this.focusedCoachIndex = focusIndex, 0);
|
|
1002
|
+
}
|
|
1003
|
+
_navigateToPlaceByKeyboard(pressedKey) {
|
|
1004
|
+
this.isKeyboardNavigation = true;
|
|
1005
|
+
if (this.focusedCoachIndex !== -1) this.focusedCoachIndex = -1;
|
|
1006
|
+
if (!this.preventPlaceClick) {
|
|
1007
|
+
const findClosestPlace = this._getClosestPlaceByKeyDirection(pressedKey);
|
|
1008
|
+
if (findClosestPlace) this.focusPlaceElement(findClosestPlace);
|
|
1009
|
+
else if (pressedKey === this.keyboardNavigationEvents.ArrowRight || pressedKey === this.keyboardNavigationEvents.ArrowLeft || this.alignVertical && (pressedKey === this.keyboardNavigationEvents.ArrowUp || pressedKey === this.keyboardNavigationEvents.ArrowDown)) {
|
|
1010
|
+
const newSelectedCoachIndex = pressedKey === this.keyboardNavigationEvents.ArrowRight ? this.getNextAvailableCoachIndex() : this.getPrevAvailableCoachIndex();
|
|
1011
|
+
this.scrollToSelectedNavCoach(newSelectedCoachIndex);
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
getNextAvailableCoachIndex(currentIndex) {
|
|
1016
|
+
const startIndex = currentIndex ?? this.currSelectedCoachIndex;
|
|
1017
|
+
return startIndex < this.seatReservations[this.currSelectedDeckIndex].coachItems.length - 1 ? startIndex + 1 : startIndex;
|
|
1018
|
+
}
|
|
1019
|
+
getPrevAvailableCoachIndex(currentIndex) {
|
|
1020
|
+
const startIndex = currentIndex ?? this.currSelectedCoachIndex;
|
|
1021
|
+
return startIndex > 0 ? startIndex - 1 : startIndex;
|
|
1022
|
+
}
|
|
1023
|
+
updateSelectedSeatReservationPlaces(placeSelection) {
|
|
1024
|
+
const placeTypeProp = placeSelection.placeType === "SEAT" ? "seats" : "bicycles";
|
|
1025
|
+
const maxReservations = placeSelection.placeType === "SEAT" ? this.maxSeatReservations : this.maxBicycleReservations;
|
|
1026
|
+
const currSelectedPlaces = this.selectedSeatReservationPlaces[placeTypeProp];
|
|
1027
|
+
this.selectedSeatReservationPlaces[placeTypeProp] = this._updateSelectedSeatReservationPlaces(currSelectedPlaces, maxReservations, placeSelection);
|
|
1028
|
+
/**
|
|
1029
|
+
* @type {CustomEvent<SeatReservationSelectedPlaces>}
|
|
1030
|
+
* Emits when a place was selected and returns a Place array with all selected places.
|
|
1031
|
+
*/
|
|
1032
|
+
this.dispatchEvent(new CustomEvent("selectedplaces", {
|
|
1033
|
+
bubbles: true,
|
|
1034
|
+
composed: true,
|
|
1035
|
+
detail: this.selectedSeatReservationPlaces
|
|
1036
|
+
}));
|
|
1037
|
+
}
|
|
1038
|
+
_updateSelectedSeatReservationPlaces(selectedSeatReservationPlaces, maxReservations, placeSelection) {
|
|
1039
|
+
if (placeSelection.state === "SELECTED") {
|
|
1040
|
+
const selectedPlaceDeckIndex = this._getDeckIndexByPlaceId(placeSelection.id);
|
|
1041
|
+
const seatReservationSelection = this._getSeatReservationPlaceSelection(placeSelection, selectedPlaceDeckIndex);
|
|
1042
|
+
if (seatReservationSelection) selectedSeatReservationPlaces.push(seatReservationSelection);
|
|
1043
|
+
} else selectedSeatReservationPlaces = selectedSeatReservationPlaces.filter((_selectedPlace) => _selectedPlace.id !== placeSelection.id);
|
|
1044
|
+
if (maxReservations > -1 && selectedSeatReservationPlaces.length > maxReservations) {
|
|
1045
|
+
const resetWithPlaceSelection = maxReservations > 0 ? placeSelection : void 0;
|
|
1046
|
+
selectedSeatReservationPlaces = this._resetAllPlaceSelections(selectedSeatReservationPlaces, resetWithPlaceSelection);
|
|
1047
|
+
}
|
|
1048
|
+
return selectedSeatReservationPlaces;
|
|
1049
|
+
}
|
|
1050
|
+
updateCurrentSelectedPlaceInCoach(placeSelection) {
|
|
1051
|
+
const placeDeckIndex = this._getDeckIndexByPlaceId(placeSelection.id);
|
|
1052
|
+
const coachIndex = placeSelection.coachIndex;
|
|
1053
|
+
if (placeDeckIndex === null) return;
|
|
1054
|
+
const place = this.seatReservations[placeDeckIndex].coachItems[coachIndex].places?.find((place) => place.number == placeSelection.number);
|
|
1055
|
+
if (!place) return;
|
|
1056
|
+
this.currSelectedDeckIndex = placeDeckIndex;
|
|
1057
|
+
this.currSelectedCoachIndex = coachIndex;
|
|
1058
|
+
this.currSelectedPlace = place;
|
|
1059
|
+
if (this.currSelectedCoachIndex !== this.selectedCoachIndex) this.updateCurrentSelectedCoach();
|
|
1060
|
+
this._setCurrSelectedPlaceElementId(place);
|
|
1061
|
+
const delayScrollInViewport = setTimeout(() => {
|
|
1062
|
+
this._scrollPlaceIntoNearestViewport(placeSelection.id);
|
|
1063
|
+
clearTimeout(delayScrollInViewport);
|
|
1064
|
+
}, 0);
|
|
1065
|
+
}
|
|
1066
|
+
updateCurrentSelectedCoach() {
|
|
1067
|
+
if (this.currSelectedCoachIndex == this.selectedCoachIndex) return;
|
|
1068
|
+
if (this.focusedCoachIndex != -1) this.focusedCoachIndex = this.currSelectedCoachIndex;
|
|
1069
|
+
this.selectedCoachIndex = this.currSelectedCoachIndex;
|
|
1070
|
+
const coachSelection = this._getSeatReservationSelectedCoach(this.selectedCoachIndex);
|
|
1071
|
+
if (coachSelection)
|
|
1072
|
+
/**
|
|
1073
|
+
* @type {CustomEvent<SeatReservationSelectedCoach>}
|
|
1074
|
+
* Emits when a coach was selected and returns a CoachSelection
|
|
1075
|
+
*/
|
|
1076
|
+
this.dispatchEvent(new CustomEvent("selectedcoach", {
|
|
1077
|
+
bubbles: true,
|
|
1078
|
+
composed: true,
|
|
1079
|
+
detail: coachSelection
|
|
1080
|
+
}));
|
|
1081
|
+
}
|
|
1082
|
+
getPlaceElementId(coachDeckIndex, coachIndex, placeNumber) {
|
|
1083
|
+
return "seat-reservation__place-button-" + coachDeckIndex + "-" + coachIndex + "-" + placeNumber;
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* In the case of coach layouts with different decks,
|
|
1087
|
+
* it is necessary to extend the offset with empty coaches
|
|
1088
|
+
* in order to create a stable vehicle layout.
|
|
1089
|
+
*
|
|
1090
|
+
* [ooo]-[ooo]-[ooo]
|
|
1091
|
+
* [ooo]-[ooo]-[ooo]-[ooo]-[ooo]
|
|
1092
|
+
*/
|
|
1093
|
+
_initEmptyCoachDeckOffsets() {
|
|
1094
|
+
const coachOffsetIndexCounter = Array(this.seatReservations.length - 1).fill(0);
|
|
1095
|
+
this.seatReservations[this.seatReservations.length - 1].coachItems.forEach((lowerCoachItem) => {
|
|
1096
|
+
for (let i = 0; i < this.seatReservations.length - 1; i++) {
|
|
1097
|
+
const deckCoachItem = this.seatReservations[i].coachItems[coachOffsetIndexCounter[i]];
|
|
1098
|
+
if (lowerCoachItem.id != deckCoachItem?.id) {
|
|
1099
|
+
const emptyOffsetCoach = {
|
|
1100
|
+
...lowerCoachItem,
|
|
1101
|
+
places: void 0,
|
|
1102
|
+
propertyIds: void 0,
|
|
1103
|
+
graphicElements: void 0,
|
|
1104
|
+
serviceElements: void 0,
|
|
1105
|
+
travelClass: []
|
|
1106
|
+
};
|
|
1107
|
+
this.seatReservations[i].coachItems.splice(coachOffsetIndexCounter[i], 0, emptyOffsetCoach);
|
|
1108
|
+
}
|
|
1109
|
+
coachOffsetIndexCounter[i]++;
|
|
1110
|
+
}
|
|
1111
|
+
});
|
|
1112
|
+
}
|
|
1113
|
+
/**
|
|
1114
|
+
* Initialization of SeatReservationPlaceSelection Array based on the transferred places
|
|
1115
|
+
* that have the state SELECTED within the seatReservation object
|
|
1116
|
+
*/
|
|
1117
|
+
_initSeatReservationPlaceSelection() {
|
|
1118
|
+
this.selectedSeatReservationPlaces.seats = [];
|
|
1119
|
+
this.selectedSeatReservationPlaces.bicycles = [];
|
|
1120
|
+
this.seatReservations?.forEach((seatReservation, coachDeckIndex) => seatReservation.coachItems.map((coach, coachIndex) => {
|
|
1121
|
+
coach.places?.filter((place) => place.state === "SELECTED")?.forEach((place) => {
|
|
1122
|
+
const preselectedPlaceSelection = mapPlaceInfosToPlaceSelection(place, this.getPlaceElementId(coachDeckIndex, coachIndex, place.number), seatReservation.deckCoachIndex, coachIndex);
|
|
1123
|
+
const seatReservationPlaceSelection = this._getSeatReservationPlaceSelection(preselectedPlaceSelection, coachDeckIndex);
|
|
1124
|
+
if (seatReservationPlaceSelection) if (seatReservationPlaceSelection.placeType === "SEAT") this.selectedSeatReservationPlaces.seats.push(seatReservationPlaceSelection);
|
|
1125
|
+
else this.selectedSeatReservationPlaces.bicycles.push(seatReservationPlaceSelection);
|
|
1126
|
+
});
|
|
1127
|
+
}));
|
|
1128
|
+
}
|
|
1129
|
+
/**
|
|
1130
|
+
* All selected places will be reset or the currentSelectedPlace was given, then we reset all except currentSelectedPlace
|
|
1131
|
+
* @param reservationPlaceSelections
|
|
1132
|
+
* @param currSelectedPlace
|
|
1133
|
+
*/
|
|
1134
|
+
_resetAllPlaceSelections(reservationPlaceSelections, currSelectedPlace) {
|
|
1135
|
+
for (const placeSelection of reservationPlaceSelections) if (!currSelectedPlace || currSelectedPlace.id !== placeSelection.id) {
|
|
1136
|
+
const placeElement = this.shadowRoot?.getElementById(placeSelection.id);
|
|
1137
|
+
if (placeElement) placeElement.setAttribute("state", "FREE");
|
|
1138
|
+
}
|
|
1139
|
+
if (currSelectedPlace) reservationPlaceSelections = reservationPlaceSelections.filter((_selectedPlace) => _selectedPlace.id === currSelectedPlace.id);
|
|
1140
|
+
else reservationPlaceSelections = [];
|
|
1141
|
+
return reservationPlaceSelections;
|
|
1142
|
+
}
|
|
1143
|
+
_getSeatReservationPlaceSelection(currSelectedPlace, coachDeckIndex) {
|
|
1144
|
+
if (coachDeckIndex === null) return null;
|
|
1145
|
+
const coach = this.seatReservations[coachDeckIndex].coachItems[currSelectedPlace.coachIndex];
|
|
1146
|
+
const place = coach.places?.find((place) => place.number === currSelectedPlace.number);
|
|
1147
|
+
return place ? mapPlaceAndCoachToSeatReservationPlaceSelection(place, coach, currSelectedPlace.id, currSelectedPlace.deckIndex, currSelectedPlace.coachIndex) : null;
|
|
1148
|
+
}
|
|
1149
|
+
_getSeatReservationSelectedCoach(coachIndex) {
|
|
1150
|
+
if (!this.seatReservations[this.currSelectedDeckIndex].coachItems[coachIndex]) return null;
|
|
1151
|
+
const coach = this.seatReservations[this.currSelectedDeckIndex].coachItems[coachIndex];
|
|
1152
|
+
return mapCoachInfosToCoachSelection(coachIndex, coach, this.getAvailableFreePlacesNumFromCoach(coach.places));
|
|
1153
|
+
}
|
|
1154
|
+
_setCurrSelectedPlaceElementId(place) {
|
|
1155
|
+
this.currSelectedPlaceElementId = place ? this.getPlaceElementId(this.currSelectedDeckIndex, this.currSelectedCoachIndex, place.number) : null;
|
|
1156
|
+
}
|
|
1157
|
+
/**
|
|
1158
|
+
* Preparation of the used documents font-size which needs
|
|
1159
|
+
* to be determined in order to correctly calculate CSS values with rem
|
|
1160
|
+
* */
|
|
1161
|
+
_determineBaseFontSize() {
|
|
1162
|
+
if (!isServer) {
|
|
1163
|
+
const onePixelInRem = 1 / parseInt(window.getComputedStyle(document.body).fontSize, 10);
|
|
1164
|
+
this.style?.setProperty("--sbb-seat-reservation-one-px-rem", `${onePixelInRem + "rem"}`);
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
/**
|
|
1168
|
+
* Prepares data for displaying navigation area.
|
|
1169
|
+
* Calculates the values which are not going to change during use of a component:
|
|
1170
|
+
* - coach id
|
|
1171
|
+
* - list of service icons
|
|
1172
|
+
* - class (first, second, any)
|
|
1173
|
+
* - whether there is a driver area left or right
|
|
1174
|
+
* */
|
|
1175
|
+
_prepareCoachItemDetailsData() {
|
|
1176
|
+
if (this.seatReservations) {
|
|
1177
|
+
const lowerDeck = this.seatReservations[this.seatReservations.length - 1].coachItems;
|
|
1178
|
+
this.coachItemDetailsElements = [];
|
|
1179
|
+
lowerDeck.forEach((coach, index) => {
|
|
1180
|
+
const travelClasses = [];
|
|
1181
|
+
const propertyIds = [];
|
|
1182
|
+
const places = [];
|
|
1183
|
+
this.seatReservations.map((sr) => {
|
|
1184
|
+
return sr.coachItems[index];
|
|
1185
|
+
}).forEach((coach) => {
|
|
1186
|
+
travelClasses.push(...coach.travelClass);
|
|
1187
|
+
propertyIds.push(...coach.propertyIds ? coach.propertyIds : []);
|
|
1188
|
+
places.push(...coach.places ? coach.places : []);
|
|
1189
|
+
});
|
|
1190
|
+
this.coachItemDetailsElements.push({
|
|
1191
|
+
id: coach.id,
|
|
1192
|
+
travelClass: this._prepareTravelClassNavigation(travelClasses),
|
|
1193
|
+
propertyIds: this._prepareServiceIconsNavigation(propertyIds),
|
|
1194
|
+
isDriverArea: coach.places ? coach.places.length === 0 : true,
|
|
1195
|
+
driverAreaSide: this._prepareDriverAreaSideNavigation(coach),
|
|
1196
|
+
freePlaces: this.getAvailableFreePlacesNumFromCoach(places),
|
|
1197
|
+
driverAreaElements: this._setDriverAreasElements(coach)
|
|
1198
|
+
});
|
|
1199
|
+
});
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
_prepareTravelClassNavigation(travelClasses) {
|
|
1203
|
+
if (travelClasses.indexOf("FIRST") !== -1) return "FIRST";
|
|
1204
|
+
if (travelClasses.indexOf("SECOND") !== -1) return "SECOND";
|
|
1205
|
+
return "ANY_CLASS";
|
|
1206
|
+
}
|
|
1207
|
+
_prepareDriverAreaSideNavigation(coachItem) {
|
|
1208
|
+
const coachDriverAreas = coachItem.graphicElements?.filter((graphicalElements) => graphicalElements.icon === "DRIVER_AREA");
|
|
1209
|
+
if (coachDriverAreas && coachDriverAreas.length > 0) {
|
|
1210
|
+
const hasLeftDriverArea = coachDriverAreas.find((driverAreaElement) => driverAreaElement.position.x === 0) || false;
|
|
1211
|
+
const hasRightDriverArea = coachDriverAreas.find((driverAreaElement) => driverAreaElement.position.x > 0) || false;
|
|
1212
|
+
return {
|
|
1213
|
+
left: !!hasLeftDriverArea,
|
|
1214
|
+
right: !!hasRightDriverArea
|
|
1215
|
+
};
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
_prepareCoachWidthAndGapCalculations() {
|
|
1219
|
+
if (this.seatReservations) (this.seatReservations[this.seatReservations.length - 1]?.coachItems)?.forEach((coachItem) => {
|
|
1220
|
+
const hasOverhangingPlaces = this._isOverhangingElementsPresent(coachItem.dimension.w, coachItem.places);
|
|
1221
|
+
const filteredElements = coachItem.graphicElements?.filter((e) => e.icon && !this.notAreaElements.includes(e.icon));
|
|
1222
|
+
const hasOverhangingGraphicAreas = this._isOverhangingElementsPresent(coachItem.dimension.w, filteredElements);
|
|
1223
|
+
this.overHangingElementInformation.push({
|
|
1224
|
+
coachId: coachItem.id,
|
|
1225
|
+
overhangingPlaces: hasOverhangingPlaces,
|
|
1226
|
+
overhangingGraphicAreas: hasOverhangingGraphicAreas
|
|
1227
|
+
});
|
|
1228
|
+
});
|
|
1229
|
+
}
|
|
1230
|
+
/**
|
|
1231
|
+
* Returns the current selected place HTML element by currSelectedPlaceElementId.
|
|
1232
|
+
* @returns HTMLElement or null
|
|
1233
|
+
*/
|
|
1234
|
+
_getPlaceHtmlElement() {
|
|
1235
|
+
return this.currSelectedPlaceElementId ? this.shadowRoot?.getElementById(this.currSelectedPlaceElementId) || null : null;
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* Returns the extracted coach deck index from place id
|
|
1239
|
+
* @returns number
|
|
1240
|
+
*/
|
|
1241
|
+
_getDeckIndexByPlaceId(placeId) {
|
|
1242
|
+
const deckIndex = this.shadowRoot?.querySelector("#" + placeId)?.getAttribute("data-deck-index");
|
|
1243
|
+
if (deckIndex && !isNaN(+deckIndex)) return +deckIndex;
|
|
1244
|
+
return null;
|
|
1245
|
+
}
|
|
1246
|
+
_isValidCoachIndex(coachIndex) {
|
|
1247
|
+
return coachIndex >= 0 && coachIndex <= this.seatReservations[this.seatReservations.length - 1].coachItems.length;
|
|
1248
|
+
}
|
|
1249
|
+
/**
|
|
1250
|
+
* Returns existing coach deck index depending on the selected coach.
|
|
1251
|
+
* This method is necessary to get an available coach deck index during keyboard navigation, which can vary between coaches with different decks.
|
|
1252
|
+
* For example, when navigating from a coach with two decks to a coach with one deck.
|
|
1253
|
+
*
|
|
1254
|
+
* [ooo]-[ooo]-[ooo]
|
|
1255
|
+
* [ooo]-[ooo]-[ooo]-[ooo]-[ooo]
|
|
1256
|
+
*
|
|
1257
|
+
* @returns number
|
|
1258
|
+
*/
|
|
1259
|
+
_getExistingCoachDeckIndex() {
|
|
1260
|
+
if (this.seatReservations[this.currSelectedDeckIndex].coachItems[this.currSelectedCoachIndex].places !== void 0) return this.currSelectedDeckIndex;
|
|
1261
|
+
const nextAvailableDeckCoachIndex = this.seatReservations.findIndex((seatReservation) => seatReservation.coachItems[this.currSelectedCoachIndex].places !== void 0);
|
|
1262
|
+
return this.currSelectedDeckIndex >= nextAvailableDeckCoachIndex ? this.currSelectedDeckIndex : nextAvailableDeckCoachIndex;
|
|
1263
|
+
}
|
|
1264
|
+
/**
|
|
1265
|
+
* If a selected place is slightly hidden by the overflow scroll content and is still clicked,
|
|
1266
|
+
* the method tries to scroll the selected place into the nearest viewport, so that it is completely visible.
|
|
1267
|
+
*
|
|
1268
|
+
* @param placeId
|
|
1269
|
+
*/
|
|
1270
|
+
_scrollPlaceIntoNearestViewport(placeId) {
|
|
1271
|
+
this.shadowRoot?.getElementById(placeId)?.scrollIntoView({
|
|
1272
|
+
behavior: "smooth",
|
|
1273
|
+
block: "nearest",
|
|
1274
|
+
inline: "nearest"
|
|
1275
|
+
});
|
|
1276
|
+
}
|
|
1277
|
+
/**
|
|
1278
|
+
* checks if any places or graphical elements (e.g. toilet area, etc.) are overhanging the coach borders
|
|
1279
|
+
* @param coachItemWidth
|
|
1280
|
+
* @param elements
|
|
1281
|
+
*/
|
|
1282
|
+
_isOverhangingElementsPresent(coachItemWidth, elements) {
|
|
1283
|
+
return elements?.some((element) => element.position.x === 0 || element.position.x + element.dimension.w >= coachItemWidth) ?? false;
|
|
1284
|
+
}
|
|
1285
|
+
/**
|
|
1286
|
+
* collect information about the driverAreas for one coach
|
|
1287
|
+
* @param coachItem
|
|
1288
|
+
* @private
|
|
1289
|
+
*/
|
|
1290
|
+
_setDriverAreasElements(coachItem) {
|
|
1291
|
+
if (coachItem) return {
|
|
1292
|
+
driverArea: coachItem.graphicElements?.find((element) => element.icon === "DRIVER_AREA"),
|
|
1293
|
+
driverAreaNoVerticalWall: coachItem.type === "LOCOMOTIVE_COACH" ? coachItem.graphicElements?.find((element) => element.icon === "DRIVER_AREA_NO_VERTICAL_WALL") : void 0
|
|
1294
|
+
};
|
|
1295
|
+
return {
|
|
1296
|
+
driverArea: void 0,
|
|
1297
|
+
driverAreaNoVerticalWall: void 0
|
|
1298
|
+
};
|
|
1299
|
+
}
|
|
1300
|
+
/**
|
|
1301
|
+
* Is called when the SeatReservation loses focus, what happens when the user tabs out or clicks somewhere else.
|
|
1302
|
+
* Then we reset the focused elements.
|
|
1303
|
+
*/
|
|
1304
|
+
_onLeaveSeatReservationComponent() {
|
|
1305
|
+
if (this.hasNavigation) this.focusedCoachIndex = -1;
|
|
1306
|
+
this.unfocusPlaceElement();
|
|
1307
|
+
}
|
|
1308
|
+
};
|
|
1234
1309
|
})();
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbGVtZW50cy1leHBlcmltZW50YWwvc2VhdC1yZXNlcnZhdGlvbi9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24tYmFzZS1lbGVtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZCB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvYTExeS5qcyc7XG5pbXBvcnQgeyBTYmJFbGVtZW50IH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpc1NlcnZlciwgdHlwZSBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBldmVudE9wdGlvbnMsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHtcbiAgbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24sXG4gIG1hcEljb25Ub1N2ZyxcbiAgbWFwUGxhY2VBbmRDb2FjaFRvU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24sXG4gIG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vbWFwcGVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQmFzZUVsZW1lbnQsXG4gIENvYWNoSXRlbSxcbiAgQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMsXG4gIEVsZW1lbnREaW1lbnNpb24sXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgQ29hY2hJdGVtRGV0YWlscyxcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBQbGFjZVRyYXZlbENsYXNzLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyxcbiAgVHJhdmVsRGlyZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuXG5lbnVtIFNjcm9sbERpcmVjdGlvbiB7XG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgbGVmdCA9ICdsZWZ0Jyxcbn1cblxuaW50ZXJmYWNlIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbmNvbnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgPSAzO1xuY29uc3QgQUxMT1dFRF9TRVJWSUNFX0lDT05TOiBzdHJpbmdbXSA9IFtcbiAgJ3NhLXZvJyxcbiAgJ3NhLXJzJyxcbiAgJ3NhLWFidGVpbGtpbmRlcndhZ2VuJyxcbiAgJ3NhLXdyJyxcbiAgJ3NhLWZhJyxcbiAgJ3NhLWJ6JyxcbiAgJ3NhLXJ6Jyxcbl07XG5cbmV4cG9ydCBjbGFzcyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBzZWxlY3RlZHBsYWNlczogJ3NlbGVjdGVkcGxhY2VzJyxcbiAgICBzZWxlY3RlZGNvYWNoOiAnc2VsZWN0ZWRjb2FjaCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9ucyBhcnJheSBjb250YWlucyBhbGwgY29hY2hlcyBhbmQgcGxhY2VzICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3NlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogQXJyYXkgfSlcbiAgcHVibGljIGFjY2Vzc29yIHNlYXRSZXNlcnZhdGlvbnM6IFNlYXRSZXNlcnZhdGlvbltdID0gbnVsbCE7XG5cbiAgLyoqIERpc3BsYXlzIGFuIGFycm93IHNob3dpbmcgd2hhdCBkaXJlY3Rpb24gZG9lcyB0cmFpbiBkcml2ZSovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3RyYXZlbC1kaXJlY3Rpb24nLCB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIGFjY2Vzc29yIHRyYXZlbERpcmVjdGlvbjogVHJhdmVsRGlyZWN0aW9uID0gJ05PTkUnO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBuYXZpZ2F0aW9uIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hhcy1uYXZpZ2F0aW9uJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGFzTmF2aWdhdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgaXMgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhbGlnbi12ZXJ0aWNhbCcsIHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUsIHVzZURlZmF1bHQ6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFsaWduVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIGJhc2UgZ3JpZCBzaXplICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdiYXNlLWdyaWQtc2l6ZScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYmFzZUdyaWRTaXplOiBudW1iZXIgPSAxNjtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIHdpZHRoICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoZWlnaHQnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhlaWdodDogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBzZWF0cyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LXNlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhTZWF0UmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIGJpY3ljbGUgcGxhY2VzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtYmljeWNsZS1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heEJpY3ljbGVSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBBbnkgY2xpY2sgZnVuY3Rpb25hbGl0eSBpcyBwcmV2ZW50ZWQgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXZlbnQtcGxhY2UtY2xpY2snLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmV2ZW50UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmVzZWxlY3QtY29hY2gtaW5kZXgnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXNlbGVjdENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiB0aXRsZSBpbmZvcm1hdGlvbiBhdCBwbGFjZS1jb250cm9scywgbmF2aWdhdGlvbi1jb2FjaGVzIGFuZCBuYXZpZ2F0aW9uLXNlcnZpY2VzIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Nob3ctdGl0bGUtaW5mbycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHNob3dUaXRsZUluZm86IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGhvdmVyZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBEZXNjcmliZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoZXMgPSA0O1xuICAvLyBUaGUgY2FsY3VsYXRlZCBjb2FjaEJvcmRlck9mZnNldCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBjb2FjaCBib3JkZXIgZ3JhcGhpYyxcbiAgLy8gYnV0IGFsc28gdG8gcG9zaXRpb24gb3RoZXIgZ3JhcGhpY3MgdGhhdCBhcmUgYWxpZ25lZCBkaXJlY3RseSB0byB0aGUgY29hY2ggYm9yZGVyLlxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGRlY2tzIGJ5IG11bHRpcGxlIGRlY2sgdmlzdWFsaXphdGlvblxuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSA0ODtcbiAgLy8gRGVzY3JpYmVzIHRoZSBmaXggd2lkdGggb2YgY29hY2ggbmF2aWdhdGlvbiBidXR0b25cbiAgcHJvdGVjdGVkIGNvYWNoTmF2QnV0dG9uRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzOiBDb2FjaEl0ZW1EZXRhaWxzW10gPSBbXTtcbiAgcHJvdGVjdGVkIGN1cnJTY3JvbGxEaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbiA9IFNjcm9sbERpcmVjdGlvbi5yaWdodDtcbiAgcHJvdGVjdGVkIG1heENhbGNDb2FjaGVzV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxDb2FjaGVzQXJlYVdpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW06IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCB0cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uOiBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludFtdID0gW107XG4gIHByb3RlY3RlZCBuYXZpZ2F0aW9uU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGNvYWNoU2Nyb2xsQXJlYTogSFRNTEVsZW1lbnQgPSBudWxsITtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkQ29hY2hJbmRleDogbnVtYmVyID0gLTE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWREZWNrSW5kZXg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyA9IHtcbiAgICBzZWF0czogW10sXG4gICAgYmljeWNsZXM6IFtdLFxuICB9O1xuICBwcm90ZWN0ZWQgc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNLZXlib2FyZE5hdmlnYXRpb24gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGhhc011bHRpcGxlRGVja3MgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBrZXlib2FyZE5hdmlnYXRpb25FdmVudHMgPSB7XG4gICAgQXJyb3dMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgICBBcnJvd1JpZ2h0OiAnQXJyb3dSaWdodCcsXG4gICAgQXJyb3dVcDogJ0Fycm93VXAnLFxuICAgIEFycm93RG93bjogJ0Fycm93RG93bicsXG4gICAgVGFiOiAnVGFiJyxcbiAgICBFbnRlcjogJ0VudGVyJyxcbiAgfSBhcyBjb25zdDtcblxuICAvLyBHcmFwaGljcyB0aGF0IHNob3VsZCBub3QgYmUgcmVuZGVyZWQgd2l0aCBhbiBhcmVhXG4gIHByb3RlY3RlZCBub3RBcmVhRWxlbWVudHMgPSBbXG4gICAgJ0RSSVZFUl9BUkVBJyxcbiAgICAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgJ0NPQUNIX1BBU1NBR0UnLFxuICAgICdDT0FDSF9XQUxMX05PX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9ISUdIJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9NSURETEUnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0xPVycsXG4gIF07XG5cbiAgcHJvdGVjdGVkIG92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uOiB7XG4gICAgY29hY2hJZDogc3RyaW5nO1xuICAgIG92ZXJoYW5naW5nUGxhY2VzOiBib29sZWFuO1xuICAgIG92ZXJoYW5naW5nR3JhcGhpY0FyZWFzOiBib29sZWFuO1xuICB9W10gPSBbXTtcblxuICBwcml2YXRlIF9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICBwcml2YXRlIF9zY3JvbGxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFN0YXJ0U2Nyb2xsUG9zID0gLTE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQWRkIGJsdXIgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVudGlyZSBjb21wb25lbnQgdG8gZGV0ZWN0IHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBjb21wb25lbnRcbiAgICAvLyBieSB1c2luZyB0YWIgbmF2aWdhdGlvbiBvciBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHJlc2V0IHRoZSBzZWxlY3RlZCBjb2FjaCBhbmQgcGxhY2UuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5fb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5fcHJlcGFyZUNvYWNoV2lkdGhBbmRHYXBDYWxjdWxhdGlvbnMoKTtcbiAgICAgIHRoaXMuX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdiYXNlR3JpZFNpemUnKSkge1xuICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemUnLCBgJHt0aGlzLmJhc2VHcmlkU2l6ZX1weGApO1xuXG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdXNlZCwgdGhlIGJhc2VHcmlkU2l6ZSBtdXN0IGJlIHJlY2FsY3VsYXRlZFxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hlaWdodCcpICYmICEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkxheWVyID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XSB8fCBudWxsO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvbkxheWVyPy5jb2FjaEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSA9IHRoaXMuaGVpZ2h0IC8gc2VhdFJlc2VydmF0aW9uTGF5ZXIuY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaDtcbiAgICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykgJiYgdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ByZXNlbGVjdENvYWNoSW5kZXgnKSkge1xuICAgICAgLy8gc2V0VGltZW91dCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aXRob3V0LCBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKSB3b3VsZCBmYWlsIHdpdGggTlBFIGJlY2F1c2VcbiAgICAgIC8vIHRoZSBjb2FjaFNjcm9sbEFyZWEgaXMgbm90IHlldCBpbml0aWFsaXplZFxuICAgICAgdGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaCh0aGlzLnByZXNlbGVjdENvYWNoSW5kZXgpLCAxKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbmF2aWdhdGVCeURpcmVjdGlvbkJ0bihidG5EaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIGxldCBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgbmF2aWdhdGVUb0NvYWNoSW5kZXggPiAwKSB7XG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPSAtMSA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAtIDEgOiAwO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4IDxcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XT8uY29hY2hJdGVtcy5sZW5ndGggLSAxXG4gICAgKSB7XG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPSAtMSA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCArIDEgOiAwO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5hdmlnYXRlVG9Db2FjaEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhIGNhbiBiZSBwcmVwYXJlZCBvbmNlIGZvciB0aGUgZW50aXJlIGNvbXBvbmVudFxuICAgKiBpbiBvcmRlciB0byBhdm9pZCByZWN1cnJpbmcgaXRlcmF0aW9uIHByb2Nlc3NlcyBpbiByZW5kZXJpbmcuXG4gICAqL1xuICBwcml2YXRlIF9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5fZGV0ZXJtaW5lQmFzZUZvbnRTaXplKCk7XG5cbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZURlY2tzKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVja3MsIHdlIG5lZWQgdG8gY2hlY2tcbiAgICAgIC8vIHdoZXRoZXIgZW1wdHkgY29hY2hlcyBuZWVkIHRvIGJlIGFkZGVkIG9uIGRpZmZlcmVudCBkZWNrIGxldmVsc1xuICAgICAgdGhpcy5faW5pdEVtcHR5Q29hY2hEZWNrT2Zmc2V0cygpO1xuICAgIH1cblxuICAgIHRoaXMuX3ByZXBhcmVDb2FjaEl0ZW1EZXRhaWxzRGF0YSgpO1xuICB9XG5cbiAgLyoqIEluaXQgc2Nyb2xsIGV2ZW50IGhhbmRsaW5nIGZvciBjb2FjaCBuYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBpbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fd3JhcHBlci1zY3JvbGxhcmVhJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnI3NiYi1zcl9fbmF2aWdhdGlvbi1saXN0LWNvYWNoZXMnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICA/IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF1cbiAgICAgIDogbnVsbDtcbiAgICBpZiAoc2VhdFJlc2VydmF0aW9uRGVjayAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgaGVpZ2h0IG9mIG9uZSBjb2FjaCBpbmNsdWRpbmcgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGNvbnN0IGNvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgPVxuICAgICAgICBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXNbMF0uZGltZW5zaW9uLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSArIHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgZWFjaCBnYXAgYmV0d2VlbiBtdWx0aXBsZSBjb2FjaCB0aGUgZGVja3MuXG4gICAgICAvLyBObyBnYXAgZXhpc3QgaWYganVzdCBvbmUgY29hY2ggZGVjayBleGlzdC5cbiAgICAgIGNvbnN0IGdhcEJldHdlZW5Db2FjaERlY2tzID0gKHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxKSAqIHRoaXMuZ2FwQmV0d2VlbkNvYWNoRGVja3M7XG5cbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KFxuICAgICAgICAnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1oZWlnaHQnLFxuICAgICAgICBgJHtjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nICogdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCArIGdhcEJldHdlZW5Db2FjaERlY2tzfWAsXG4gICAgICApO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZGVja3MnLCBgJHt0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBJbml0IHRoZSBjb2FjaE5hdkJ1dHRvbkRpbSBkaW1lbnNpb24sIHdoaWNoIGlzIG5lZWRlZCB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3Qgc2Nyb2xsIG5hdmlnYXRpb24gbGF0ZXJcbiAgICAgIGNvbnN0IG5hdkNvYWNoZXNMaXN0ID0gdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5xdWVyeVNlbGVjdG9yKCd1bCA+IGxpJykgYXMgSFRNTFVMaXN0RWxlbWVudDtcbiAgICAgIGlmIChuYXZDb2FjaGVzTGlzdCkge1xuICAgICAgICBjb25zdCBmaXJzdExpRWxlRGltZW5zaW9uID0gbmF2Q29hY2hlc0xpc3Q/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmNvYWNoTmF2QnV0dG9uRGltID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgPyBmaXJzdExpRWxlRGltZW5zaW9uLmhlaWdodFxuICAgICAgICAgIDogZmlyc3RMaUVsZURpbWVuc2lvbi53aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2FjaFNjcm9sbEFyZWEgJiYgc2VhdFJlc2VydmF0aW9uRGVjaykge1xuICAgICAgLy8gSW5pdCB0aGUgc3RhcnQgb2Zmc2V0IGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGNvYWNoIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uc1xuICAgICAgbGV0IGN1cnJDYWxjVHJpZ2dlclBvcyA9IDA7XG4gICAgICB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gUHJlY2FsY3VsYXRlIHRyaWdnZXIgc2Nyb2xsIHBvc2l0aW9uIGFycmF5IGRlcGVuZHMgb24gY29hY2ggd2lkdGhcbiAgICAgIHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbiA9IHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5tYXAoKGNvYWNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcbiAgICAgICAgY29uc3QgY29hY2hXaWR0aCA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihjb2FjaC5kaW1lbnNpb24pLnc7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRpb24gb2YgdGhlIGVuZCBzY3JvbGwgdHJpZ2dlciBwb3NpdGlvbiBvZiBhIGNvYWNoLCBpbmNsdWRpbmcgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzXG4gICAgICAgIC8vIFRoZSBnYXAgaXMgbWF5YmUgYWRqdXN0ZWQgaWYgb3ZlcmhhbmdpbmcgcGxhY2VzIG9yIGdyYXBoaWNzIGV4aXN0XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb2FjaE92ZXJoYW5naW5nSW5mbyA9IHRoaXMub3ZlckhhbmdpbmdFbGVtZW50SW5mb3JtYXRpb24uZmluZChcbiAgICAgICAgICAoZSkgPT4gZS5jb2FjaElkID09PSBjb2FjaC5pZCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgb3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQgPVxuICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJoYW5naW5nSW5mbz8ub3ZlcmhhbmdpbmdQbGFjZXMgfHxcbiAgICAgICAgICBjdXJyZW50Q29hY2hPdmVyaGFuZ2luZ0luZm8/Lm92ZXJoYW5naW5nR3JhcGhpY0FyZWFzO1xuICAgICAgICBjdXJyQ2FsY1RyaWdnZXJQb3MgKz1cbiAgICAgICAgICBjb2FjaFdpZHRoICtcbiAgICAgICAgICAoIW92ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50ID8gdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcyA6IDIgKiB0aGlzLmdhcEJldHdlZW5Db2FjaGVzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoV2lkdGgsXG4gICAgICAgIH0gYXMgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IG1heGltdW0gY2FsY3VsYXRlZCBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoID0gY3VyckNhbGNUcmlnZ2VyUG9zIC0gdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIGV2ZW50IGhhbmRsZXIgbWFuYWdlZCB0aGUgZW5kIG9mIHNjcm9sbGluZyBpbnNpZGUgdGhlIGNvYWNoIHNjcm9sbCBhcmVhLlxuICAgKiBUaW1lb3V0IGV2ZW50IGhhbmRsaW5nIHRvIGNoZWNrIGlmIHRoZSBzY3JvbGxpbmcgaGFzIGJlZW4gY29tcGxldGVkLlxuICAgKiBJdCBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBTYWZhcmkgYnJvd3NlciBkb2VzIG5vdCBoYW5kbGUgc2Nyb2xsZW5kIGV2ZW50LFxuICAgKiBhbmQgd2UgdGhlcmVmb3JlIGltaXRhdGUgdGhpcyBldmVudCAtPiBzY3JvbGxlbmQuXG4gICAqL1xuICBAZXZlbnRPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgY29hY2hBcmVhU2Nyb2xsZW5kKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zY3JvbGxUaW1lb3V0KSB7XG4gICAgICAvLyBGaXJzdCwgd2UgY2xlYXJlZCB0aGUgcmVnaXN0ZXJlZCB0aW1lb3V0LCBhcyB0aGUgc2Nyb2xsaW5nIGlzIHN0aWxsIHJ1bm5pbmdcbiAgICAgIC8vIGFuZCB0aHVzIHdlIHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IGZ1bmN0aW9uXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fc2Nyb2xsVGltZW91dCk7XG4gICAgfVxuICAgIC8vIElmIG5vIGZ1cnRoZXIgc2Nyb2xsIGV2ZW50IGlzIGZpcmVkLCB0aGUgbmV4dCB0aW1lb3V0IGNhbiBleGVjdXRlIHRoZSBpbm5lciBmdW5jdGlvbiBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQgd2l0aG91dCBjbGVhcmluZ1xuICAgIHRoaXMuX3Njcm9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50KCksIDE1MCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgbm8gbmF2aWdhdGlvbiBleGlzdHMgKHByb3BlcnR5IHNldHRpbmcgLT4gaGFzTmF2aWdhdGlvbikgYW5kIGEgdGFibGUgY29hY2ggZ2V0cyB0aGUgZm9jdXMsXG4gICAqIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2ggbXVzdCBiZSBhdXRvbWF0aWNhbGx5IHByZXNlbGVjdGVkIHRvIGNvbnRyb2wgdGhlIHBsYWNlIG5hdmlnYXRpb24gdmlhIGtleWJvYXJkXG4gICAqXG4gICAqIEBwYXJhbSBmb2N1c0NvYWNoSW5kZXhcbiAgICovXG4gIHByb3RlY3RlZCBvbkZvY3VzVGFibGVDb2FjaEFuZFByZXNlbGVjdFBsYWNlKGZvY3VzQ29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgJiYgIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgIGZvY3VzQ29hY2hJbmRleCA9PT0gMFxuICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgtMSlcbiAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoZm9jdXNDb2FjaEluZGV4KTtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdpbGwgYmUgdHJpZ2dlcmVkIGJ5IGZvY3VzIG5hdmlnYXRpb24gZGlyZWN0aW9uICovXG4gIHByb3RlY3RlZCBvbkZvY3VzTmF2RGlyZWN0aW9uQnV0dG9uKCk6IHZvaWQge1xuICAgIC8vIElmIGFueSBuYXZpZ2F0aW9uIGRpcmVjdGlvbiBidXR0b24gKHJpZ2h0fGxlZnQpIGdldCB0aGUgZm9jdXMsIHNvIHdlIGhhdmUgbWFudWFsIHJlc2V0IHRoZSBwcmV2aW91cyBmb2N1c0NvYWNoSW5kZXguXG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICB9XG5cbiAgLyoqIFRBQiBLZXkgRXZlbnQgaGFuZGxpbmcgZm9yIENvYWNoIE5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIG9uS2V5TmF2aWdhdGlvbk5hdkNvYWNoQnV0dG9uKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGN1cnJOYXZDb2FjaEJ1dHRvbkluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYikge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ25hdmlnYXRpb24nLCBjdXJyTmF2Q29hY2hCdXR0b25JbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQnkgdXNpbmcgYW55IG90aGVyIGtleSAobm8gVEFCKSBpbnNpZGUgdGhlIE5hdmlnYXRpb24gYXJlYSwgc28gd2UgY2FuIGhhbmRsZSB0aGlzIGJ5IHVzaW5nIHRoZSBsb2dpYyBmcm9tIGtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmdcbiAgICBpZiAoaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgdGhpcy5rZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKiogR2VuZXJhbCBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciB0YWIgbmF2aWdhdGlvbiBpbnNpZGUgdGhlIGNvYWNoIG5hdmlnYXRpb24gYXJlYSBhbmQgdGhlIHNlYXRtYXAgYXJlYSAqL1xuICBwcml2YXRlIF9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50LFxuICAgIGV2ZW50QXJlYTogc3RyaW5nLFxuICAgIGN1cnJUYWJJbmRleD86IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBwcmVzc2VkU2hpZnRUYWIgPSBldmVudC5zaGlmdEtleTtcblxuICAgIGlmIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIGNvYWNoIG5hdmlnYXRpb24gYXJlYS5cbiAgICAgIC8vIEZwciBjb2FjaCBuYXZpZ2F0aW9uIHdlIGp1c3QgY29udHJvbCB0aGUgZm9jdXMgaW5kZXggdG8gdmlzdWFsaXplIGZvY3VzIHN0eWxlIGZvciBuYXYgY29hY2ggYnV0dG9uXG4gICAgICBpZiAoZXZlbnRBcmVhID09ICduYXZpZ2F0aW9uJykge1xuICAgICAgICBpZiAoY3VyclRhYkluZGV4ID09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICAgICAgICAhcHJlc3NlZFNoaWZ0VGFiIHx8XG4gICAgICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1tjdXJyVGFiSW5kZXhdLmlzRHJpdmVyQXJlYSB8fFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PSAtMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXNzZWRTaGlmdFRhYiAmJiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgICAvL0lmIHRoZSBGb3IgYmFjayB0YWJiaW5nLCB3ZSBqdW1wXG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyclRhYkluZGV4ITtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKGN1cnJUYWJJbmRleCEpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIFRBQiBrZXkgZXZlbnQgbmF2aWdhdGlvbiBmb3Igc2VhdG1hcCBhcmVhXG4gICAgICBlbHNlIGlmIChldmVudEFyZWEgPT0gJ3NlYXRtYXAnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChwcmVzc2VkU2hpZnRUYWIpIHtcbiAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQoJ1BSRVZfVEFCJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdORVhUX1RBQicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2F0aW9uIG9mIEtleWJvYXJkIFNlYXRtYXAgZXZlbnQgaGFuZGxpbmcgdG8gbmF2aWdhdGlvbiBiZXR3ZWVuIGVhY2ggcGxhY2VzIGluc2lkZSBhIHNlbGVjdGVkIGNvYWNoIGJ5IHVzaW5nIFthcnJvd10ga2V5cy5cbiAgICogV2l0aCB0aGUgW1RBQl0ga2V5IHRoZSB1c2VyIG5hdmlnYXRpb24gZ29lcyB0byB0aGUgbmV4dCBjb2FjaCBuYXZpZ2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2UgaXMgYXV0b21hdGljYWxseSByZXNldC5cbiAgICovXG4gIHByb3RlY3RlZCBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaXNUYWJOZXh0ID0gZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWI7XG4gICAgY29uc3QgaXNUYWJQcmV2ID0gZXZlbnQuc2hpZnRLZXkgJiYgaXNUYWJOZXh0O1xuXG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCBhbmQgdGhlIGZpcnN0IG9yIGxhc3QgY29hY2ggaXMgc2VsZWN0ZWQsIHRoZSB0aGUgdXNlIHRyaWVzIHRvIGxlYXZlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCBieSB1c2luZyB0YWIsXG4gICAgLy8gc28gd2UgY2FuIHJldHVybiBoZXJlIGFuZCBhbGxvdyB0aGUgbmF0aXZlIGZvY3VzIHRvIGxlYXZlIHRoZSBjb21wb25lbnQuXG4gICAgaWYgKFxuICAgICAgKCF0aGlzLmhhc05hdmlnYXRpb24gJiYgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAwICYmIGlzVGFiUHJldikgfHxcbiAgICAgICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLmxlbmd0aCAtIDEgJiYgaXNUYWJOZXh0KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAvLyBDaGVjayBhbnkga2V5Ym9hcmQgZXZlbnQgd2FzIHRyaWdnZXJlZCBpbnNpZGUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50LFxuICAgIC8vIHNvIHdlIGNhbiBzYXkgdGhlIG5hdGl2ZSBicm93c2VyIGZvY3VzIGxpZXMgb24gdGhlIGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyAmJiAoaXNUYWJOZXh0IHx8IGlzVGFiUHJldikpIHtcbiAgICAgIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIGFueSBwbGFjZSBpcyBzZWxlY3RlZCBhbmQgVEFCIEtleSBjb21iaW5hdGlvbiBpc3QgcHJlc3NlZCxcbiAgICAvLyB0aGVuIHdlIGhhbmRsZSB0aGUgbmV4dCBvciBwcmV2aW91cyBjb2FjaCBzZWxlY3Rpb25cbiAgICBpZiAoaXNUYWJOZXh0KSB7XG4gICAgICB0aGlzLl9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKGV2ZW50LCAnc2VhdG1hcCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFycm93IEtleWJvYXJkIG5hdmlnYXRpb24gdG8gY29udHJvbCBwbGFjZXMgaW5zaWRlIHRoZSBzZWF0bWFwXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgJiYgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkKGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgc3dpdGNoIChwcmVzc2VkS2V5KSB7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRMZWZ0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZExlZnRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkUmlnaHRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwXG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFJpZ2h0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXA6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFVwS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZFVwS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkRG93bktleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkRG93bktleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHBsYWNlIGluc2lkZSB0aGUgY29hY2ggaWYgbmF2aWdhdGVkIHZpYSBrZXlib2FyZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBjb2FjaCBncmlkIGlzIHNlbGVjdGVkIChuZWNlc3NhcnkgZm9yIFNjcmVlblJlYWRlcilcbiAgICovXG4gIHByb3RlY3RlZCBwcmVzZWxlY3RQbGFjZUluQ29hY2goKTogdm9pZCB7XG4gICAgLy8gTm8gcHJlc2VsZWN0IHBsYWNlIGJ5IG1hbnVhbCBzZWF0bWFwIHNjcm9sbGluZ1xuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHJldHVybjtcblxuICAgIC8vIE5vIGF1dG8gcGxhY2UgcHJlc2VsZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIHByZXNlbGVjdCBjb2FjaCBpbmRleFxuICAgIGlmICh0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCkge1xuICAgICAgdGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3IgRHJpdmVyQXJlYSBvciBFbXB0eSBjb2FjaCAobm8gcGxhY2VzKSwgbm8gcGxhY2UgaXMgc2VsZWN0YWJsZSwgc28gd2UgcmV0dXJuIGRpcmVjdGx5XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XSAmJlxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5pc0RyaXZlckFyZWFcbiAgICApIHtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgd2hlbiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgYW5kIGNvYWNoZXMgYXJlIHNjcm9sbGVkIGJ5IGF1dG8gc2Nyb2xsaW5nLFxuICAgIC8vIHRoZW4gd2UgY2FuIHNldCB0aGUgZm9jdXMgb24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaC5cbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJiB0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgY29uc3QgY2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24oKTtcbiAgICAgIC8vSWYgY2xvc2VzdFBsYWNlIGV4aXN0LCB3ZSBoYXZlIHRvIHVuZm9jdXMgcHJldmlvdXMgZm9jdXNlZCBwbGFjZVxuICAgICAgaWYgKGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChjbG9zZXN0UGxhY2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBhIGNvYWNoIHdhcyBzZWxlY3RlZCB3aXRoIG5vIHBsYWNlcywgdGhlbiB3ZSBoYXZlIHRvIGZvY3VzIHRoZSBjb2FjaEdyaWRcbiAgICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwcmVzZWxlY3Rpb24gZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGJ5IG5vcm1hbCBjbGlja2luZyBvciB2aWEgc2NyZWVuIHJlYWRlciB2aWEgdGFiLFxuICAgIC8vIHdlIG9ubHkgZm9jdXMgdGhlIHRhYmxlIHdpdGhvdXQgZGlyZWN0bHkgZm9jdXNpbmcgdGhlIHBsYWNlLlxuICAgIGVsc2Uge1xuICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG5cbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChzZWxlY3RlZE5hdkNvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2lzVmFsaWRDb2FjaEluZGV4KHNlbGVjdGVkTmF2Q29hY2hJbmRleCkgJiZcbiAgICAgIHNlbGVjdGVkTmF2Q29hY2hJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgKSB7XG4gICAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHRoaXMuX2dldEV4aXN0aW5nQ29hY2hEZWNrSW5kZXgoKTtcbiAgICAgIHRoaXMuX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpO1xuXG4gICAgICBjb25zdCBzY3JvbGxUb0NvYWNoUG9zWCA9IHRoaXMuX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCAhPT0gLTEgfHwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gMDtcblxuICAgICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGFsbG93cyBzY3JvbGxpbmcgdG8gdGhlIG5leHQgd2Fnb24gb3Igbm90XG4gICAgICBpZiAoaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlICYmIHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICAgIHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbFRvQ29hY2hQb3NYIDogMCxcbiAgICAgICAgICBsZWZ0OiB0aGlzLmFsaWduVmVydGljYWwgPyAwIDogc2Nyb2xsVG9Db2FjaFBvc1gsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgY29hY2ggaW4gdGhlIG1haW4gbmF2aWdhdGlvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNQbGFjZUVsZW1lbnQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIGlmIChwbGFjZSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ2ZvY3VzJyk7XG5cbiAgICAgICAgLy9UcnkgdG8gc2Nyb2xsIGZvY3VzZWQgcGxhY2UgaW50byB0aGUgdmlld3BvcnRcbiAgICAgICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICAgIHBsYWNlLm51bWJlcixcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZUlkKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZGVsYXlTY3JvbGxJblZpZXdwb3J0KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHVuZm9jdXNQbGFjZUVsZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICBzZWxlY3RlZFBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJywgJ3VuZm9jdXMnKTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKG51bGwpO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWREaW1lbnNpb24oXG4gICAgZWxlbWVudERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICAgIGlzU3RyZXRjaEhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnREaW1lbnNpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiAhaXNPcmlnaW5IZWlnaHQpIHtcbiAgICAgIC8vIFNpbmNlIHRoZSBoZWlnaHQgb2YgdGhlIGNvYWNoIGhhcyBiZWVuIHZpc3VhbGx5IGV4cGFuZGVkIHRvIG1haW50YWluIGEgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyxcbiAgICAgIC8vIHNvbWUgZ3JhcGhpY3MgbXVzdCBhbHNvIGJlIGFkYXB0ZWQgdG8gdGhlIGhlaWdodCwgd2hpY2ggZW5kIHdpdGggdGhlIGJvcmRlcnMgb2YgdGhlIGNvYWNoXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZXRjaEhlaWdodCkge1xuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZ3JhcGhpY3MgYXJlIGFzc2lnbmVkIGRpcmVjdGx5IGF0IHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoLFxuICAgICAgLy8gdGhlc2UgZ3JhcGhpY3MgbXVzdCBiZSBleHBhbmRlZCBpbiBoZWlnaHQgYnkgYSBjb2FjaEJvcmRlck9mZnNldCBpbiBvcmRlciB0byByZWFjaCB0aGVpciBvcmlnaW5hbCB2aXN1YWwgcG9zaXRpb25cbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24udyxcbiAgICAgIGg6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi5oLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZFBvc2l0aW9uKFxuICAgIGVsZW1lbnRQb3NpdGlvbjogRWxlbWVudFBvc2l0aW9uLFxuICAgIGVsZW1lbnREaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICk6IEVsZW1lbnRQb3NpdGlvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmIGVsZW1lbnREaW1lbnNpb24pIHtcbiAgICAgIGNvbnN0IGVuZFBvc0hlaWdodCA9IGlzT3JpZ2luSGVpZ2h0XG4gICAgICAgID8gY29hY2hEaW1lbnNpb24uaFxuICAgICAgICA6IGNvYWNoRGltZW5zaW9uLmggKyB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgY29hY2gsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIFkgY29vcmRpbmF0ZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGJvcmRlciBwYWRkaW5nXG4gICAgICBpZiAoZWxlbWVudFBvc2l0aW9uLnkgPT09IDApIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFBvc2l0aW9uLnkgKyBlbGVtZW50RGltZW5zaW9uLmggPT09IGVuZFBvc0hlaWdodCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnRQb3NpdGlvbi54LFxuICAgICAgeTogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueSxcbiAgICAgIHo6IGVsZW1lbnRQb3NpdGlvbi56LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogZGV0ZWN0cyBpZiBhIChncmFwaGljYWwpIGVsZW1lbnQgaXMgb24gdGhlIGJvcmRlciB3aXRoIGl0cyBwb3NpdGlvbiAodXBwZXIgb3IgbG93ZXIgYm9yZGVyKS5cbiAgICogQHBhcmFtIGJhc2VFbGVtZW50XG4gICAqIEBwYXJhbSBjb2FjaERpbWVuc2lvblxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNFbGVtZW50RGlyZWN0bHlPbkJvcmRlcihcbiAgICBiYXNlRWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBiYXNlRWxlbWVudC5wb3NpdGlvbi55ID09PSAwIHx8XG4gICAgICBiYXNlRWxlbWVudC5wb3NpdGlvbi55ICsgYmFzZUVsZW1lbnQuZGltZW5zaW9uLmggPT09IGNvYWNoRGltZW5zaW9uLmhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbGwgYXZhaWxhYmxlIHNlYXRzIHRvZ2V0aGVyIGRlcGVuZGluZyBvbiB0aGUgc2VhdCB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZXNcbiAgICogQHJldHVybnMgQW4gT2JqZWN0IHdpdGggY291bnQgb2YgZnJlZSBzZWF0cyBhbmQgZnJlZSBiaWN5Y2xlIHBsYWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goXG4gICAgcGxhY2VzOiBQbGFjZVtdIHwgdW5kZWZpbmVkLFxuICApOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyB7XG4gICAgY29uc3QgYWNjdW11bGF0b3I6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzID0geyBzZWF0czogMCwgYmljeWNsZXM6IDAgfTtcbiAgICBjb25zdCBmcmVlUGxhY2VzID0gcGxhY2VzPy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyUGxhY2U6IFBsYWNlKSA9PiB7XG4gICAgICBpZiAoY3VyclBsYWNlLnN0YXRlICE9PSAnRlJFRScpIHtcbiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgICAgfVxuICAgICAgLy8gQ291bnQgdXAgZGVwZW5kaW5nIG9uIHNlYXQgdHlwZVxuICAgICAgaWYgKGN1cnJQbGFjZS50eXBlID09PSAnU0VBVCcpIHtcbiAgICAgICAgYWNjdW11bGF0b3Iuc2VhdHMrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLmJpY3ljbGVzKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgYWNjdW11bGF0b3IpO1xuICAgIHJldHVybiBmcmVlUGxhY2VzID8gZnJlZVBsYWNlcyA6IGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0IHRoZSBlbmQgb2YgYSBzY3JvbGwgRXZlbnQgZnJvbSB0aGUgY29hY2ggc2Nyb2xsYWJsZSBhcmVhLFxuICAgKiB0aGUgcmVhY2hlZCBjb2FjaCBpcyBtYXJrZWQgYXMgc2VsZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbmRTY3JvbGxDb2FjaEluZGV4ID0gdGhpcy5pc0F1dG9TY3JvbGxpbmdcbiAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICA6IHRoaXMuX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpO1xuXG4gICAgLy8gVElNTy00MzcwNVxuICAgIC8vIElmIGEgcGxhY2Ugd2FzIHNlbGVjdGVkIGJ5IG1vdXNlIGNsaWNrIChwcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIGJlZm9yZSB0cmlnZ2VyaW5nIHRoaXMgc2Nyb2xsZW5kIG1ldGhvZCxcbiAgICAvLyB0aGVuIHRoaXMgc2Nyb2xsaW5nIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIG1ldGhvZCBfc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0LCBhbmQgaXQgaXMgb25seSBhIHBsYWNlIGFkanVzdG1lbnQgc2Nyb2xsIChzY3JvbGxJbnRvVmlldyksXG4gICAgLy8gd2hlcmUgYSBsZXNzIHZpc2libGUgcGxhY2UgaGFzIGJlZW4gc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuIEluIGNhc2Ugb2YgYSBwbGFjZSBhZGp1c3RtZW50IGJ5IGNsaWNrLCB3ZSBjYW4gcmV0dXJuIGhlcmUuXG4gICAgaWYgKHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSB7XG4gICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBlbmRzY3JvbGxpbmcgaXMganVzdCBhIHBsYWNlIGFkanVzdG1lbnQgc2Nyb2xsaW5nIChwbGFjZSBoYXMgMiBncmlkIHNpemUgdW5pdHMpXG4gICAgICBjb25zdCBpc0NvYWNoU2Nyb2xsaW5nID1cbiAgICAgICAgTWF0aC5hYnModGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zIC0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdCkgPlxuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSAqIDI7XG4gICAgICBpZiAoaXNDb2FjaFNjcm9sbGluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyA9IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG5cbiAgICAvLyBBZnRlciBjb2FjaCBzY3JvbGxlbmQgZXZlbnQgd2UgY2FuIHJlc2V0IHRoZSBob3ZlcmVkIGNvYWNoIGluZGV4XG4gICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IC0xO1xuXG4gICAgLy8gSW4gY2FzZSB0aGUgdXNlciB1c2VzIHRoZSBzY3JvbGxiYXIgd2l0aG91dCBpbnRlcmFjdGluZyB3aXRoIHRoZSBzZWF0IHJlc2VydmF0aW9uLFxuICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW5kZXggaXMgLTEsIGFuZCB3ZSBoYXZlIHRvIHNldCB0aGlzIHZhbHVlIHdpdGggZmluZFNjcm9sbENvYWNoSW5kZXguXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgIGZpbmRTY3JvbGxDb2FjaEluZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA6IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIC8vV2hlbiB1c2VyIGlzIHNjcm9sbGluZyB2aWEgc2Nyb2xsYmFyLCBpdCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgdG8gdGhlIGZvY3VzZWQgY29hY2ggaW4gdGhlIG1haW4gbmF2aWdhdGlvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oZmluZFNjcm9sbENvYWNoSW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcblxuICAgIGlmICghdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgICAgdGhpcy5pc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gYXV0b21hdGljIG1haW4gbmF2aWdhdGlvbiBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBzZWxlY3RlZE5hdkNvYWNoSW5kZXguXG4gICAqIENhbGN1bGF0ZXMgdGhlIGNlbnRyYWwgc2Nyb2xsIG9mZnNldCBvZiB0aGUgbmF2IGNvYWNoIHRvIGJlIHNlbGVjdGVkLlxuICAgKiBAcGFyYW0gc2VsZWN0ZWROYXZDb2FjaEluZGV4XG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vVGltZSBkZWxheSB0byBub3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgZXhlY3V0aW5nIGNhbGxpbmcgc2Nyb2xsVG8gZnVuY3Rpb25zIChjb2FjaGVzIHNjcm9sbGluZylcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24gJiYgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCA9IHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gLyAyO1xuICAgICAgICBjb25zdCBzY3JvbGxCdXR0b25PZmZzZXRYID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4ICogdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsT2Zmc2V0WCA9XG4gICAgICAgICAgc2Nyb2xsQnV0dG9uT2Zmc2V0WCAtIG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYICsgdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxPZmZzZXRYIDogMCxcbiAgICAgICAgICBsZWZ0OiB0aGlzLmFsaWduVmVydGljYWwgPyAwIDogc2Nyb2xsT2Zmc2V0WCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuZXcgU2Nyb2xsRGlyZWN0aW9uIGJ5IHRoZSBuZXcgZ2l2ZW4gdGFyZ2V0IGNvYWNoIGluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA/IFNjcm9sbERpcmVjdGlvbi5yaWdodFxuICAgICAgICA6IFNjcm9sbERpcmVjdGlvbi5sZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjcm9sbCBzdGFydCBvciBlbmQgcG9zaXRpb24gWCBmcm9tIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogSW4gY2FzZSB0aGUgdXNlciBpcyBjdXJyZW50bHkgbmF2aWdhdGluZyB0aHJvdWdoIHBsYWNlcyBieSBrZXlib2FyZCBhbmQgZ29lcyB0byBwcmV2aW91cyBjb2FjaCxcbiAgICogdGhlbiB3ZSByZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY29hY2ggdG8gZ2V0IHRoZSBjbG9zZXN0IHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBmb2N1cyBwbGFjZS5cbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvYWNoVHJpZ2dlclBvaW50ID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvbiA9XG4gICAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmXG4gICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICBjb2FjaFRyaWdnZXJQb2ludC53aWR0aCA+IHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDtcblxuICAgIHJldHVybiBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uXG4gICAgICA/IGNvYWNoVHJpZ2dlclBvaW50LmVuZCAtIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aFxuICAgICAgOiBjb2FjaFRyaWdnZXJQb2ludC5zdGFydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmb2N1cyBvbiB0aGUgSFRNTCB0YWJsZSAoZ3JpZCkgY2FwdGlvbiBlbGVtZW50IHNvIHRoYXQgdGhlIGhlYWRpbmcgaXMgcmVhZCBvdXQgd2hlbiB1c2luZyBhIFNjcmVlblJlYWRlci5cbiAgICovXG4gIHByaXZhdGUgX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpOiB2b2lkIHtcbiAgICAvLyBXaGVuIHRoZSB1c2VyIHBlcmZvcm1zIGFuIGFjdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGNvYWNoIG5hdmlnYXRpb24sIHRoZW4gdGhlIG5hdmlnYXRlZCB0YWJsZSBpcyBmb2N1c2FibGUuXG4gICAgaWYgKHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgJiYgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cykge1xuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICAgICAgY29uc3QgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnI3NiYi1zci1jb2FjaC1jYXB0aW9uLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICApIGFzIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50O1xuICAgICAgaWYgKGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCkge1xuICAgICAgICBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcm9sbGVkIHBvc2l0aW9uIGNhbiBiZSB1c2VkIHRvIHNjcm9sbCB0byB0aGUgc2VsZWN0ZWQgd2Fnb25cbiAgICogQHJldHVybnMgYm9vbGVhblxuICAgKi9cbiAgcHJpdmF0ZSBfaXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJTY3JvbGxQb3NYID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvcFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IGNvYWNoU2Nyb2xsV2luZG93V2lkdGggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IG1heFNjcm9sbFdpZHRoQXJlYSA9IHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCAtIGNvYWNoU2Nyb2xsV2luZG93V2lkdGg7XG4gICAgY29uc3QgY3VyckNvYWNoVHJpZ2dlciA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zID1cbiAgICAgIGN1cnJTY3JvbGxQb3NYID09PSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5zdGFydDtcblxuICAgIHJldHVybiAoXG4gICAgICAoY3VyclNjcm9sbFBvc1ggPCBtYXhTY3JvbGxXaWR0aEFyZWEgfHwgY3VyclNjcm9sbFBvc1ggPiBjdXJyQ29hY2hUcmlnZ2VyLnN0YXJ0KSAmJlxuICAgICAgIWlzU2Nyb2xsUG9zU2FtZVRvQ3VyckNvYWNoUG9zXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2FjaCBpbmRleCB3aGljaCBpcyBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgc2Nyb2xsIGFyZWFcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxQb3MgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3Qgc2Nyb2xsT2Zmc2V0WCA9IHNjcm9sbFBvcyArIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCAvIDI7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbi5maW5kSW5kZXgoXG4gICAgICAoY29hY2hUcmlnZ2VyKSA9PiBzY3JvbGxPZmZzZXRYID49IGNvYWNoVHJpZ2dlci5zdGFydCAmJiBzY3JvbGxPZmZzZXRYIDw9IGNvYWNoVHJpZ2dlci5lbmQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpcnN0IHBsYWNlIG9mIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2ggYnkgdGFibGUgY2VsbCBjb29yZGluYXRlIDAtMCBpZC5cbiAgICogQHJldHVybnMgUGxhY2Ugb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RQbGFjZUluU2VsZWN0ZWRDb2FjaCgpOiBQbGFjZSB8IG51bGwge1xuICAgIGxldCBmaXJzdFBsYWNlOiBQbGFjZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGZpcnN0Q2VsbElkID1cbiAgICAgICdjZWxsLScgKyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArICctJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCArICctMC0wJztcbiAgICBjb25zdCBwbGFjZU51bWJlciA9XG4gICAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgICAgPy5xdWVyeVNlbGVjdG9yPEhUTUxUYWJsZUNlbGxFbGVtZW50PignIycgKyBmaXJzdENlbGxJZClcbiAgICAgICAgPy5xdWVyeVNlbGVjdG9yPFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQ+KCdzYmItc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sJylcbiAgICAgICAgPy5nZXRBdHRyaWJ1dGUoJ3RleHQnKSB8fCBudWxsO1xuXG4gICAgaWYgKGNvYWNoICYmIHBsYWNlTnVtYmVyKSB7XG4gICAgICBmaXJzdFBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBwbGFjZU51bWJlcikgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpcnN0UGxhY2U7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTd2l0Y2hlZENvYWNoRGVja0luZGV4QnlLZXlOYXZpZ2F0aW9uKFxuICAgIHByZXNzZWRLZXk6IHN0cmluZyxcbiAgICBjb2FjaDogQ29hY2hJdGVtLFxuICApOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCB8fFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0XG4gICAgKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAvL0NIRUNLIERFQ0sgU1dJVENIIERPV05cbiAgICBpZiAoXG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSArIDIgPT09IGNvYWNoLmRpbWVuc2lvbi5oICYmXG4gICAgICAhIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDFdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAxO1xuICAgIH1cbiAgICAvL0NIRUNLIERFQ0sgU1dJVENIIFVQXG4gICAgZWxzZSBpZiAoXG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwICYmXG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgPT09IDAgJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCAtIDE7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGdldCB0aGUgY29ycmVjdCBjbG9zZXN0IHBsYWNlIG9mIGN1cnJlbnQgcHJlc3NlZCBrZXkgYW5kIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlLFxuICAgKiB3ZSBoYXZlIHRvIGludmVzdGlnYXRlIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIHBsYWNlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgcGxhY2Ugb2YgdGhlIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkLlxuICAgKiBAcGFyYW0gcHJlc3NlZEtleVxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5Pzogc3RyaW5nKTogUGxhY2UgfCBudWxsIHtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBsZXQgY2xvc2VzdFBsYWNlID0gbnVsbDtcbiAgICBsZXQgY29hY2hQbGFjZXMgPSBjb2FjaC5wbGFjZXM7XG4gICAgbGV0IHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPSBudWxsO1xuXG4gICAgaWYgKGNvYWNoUGxhY2VzKSB7XG4gICAgICAvLyBJZiBubyBwbGFjZSBzZXQsIHRoZW4gd2UgdXNlIGluaXRpYWwgdGhlIGxlZnQtdG9wIHBsYWNlIG9uIHRoZSBjb2FjaFxuICAgICAgaWYgKCF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24gPSB7IC4uLnRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24gfTtcblxuICAgICAgICAgIGlmIChwcmVzc2VkS2V5KSB7XG4gICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIHVzZWQgdG8gc3dpdGNoIHRvIGFub3RoZXIgY29hY2ggZGVjayAoVXAgLT4gRG93biB8IERvd24gLT4gVXApLlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB0YWtlIHRoZSBjb2FjaCBwbGFjZXMgd2UgaGF2ZSB0byBjaGVja2VkIGZyb20gdGhlIHRhcmdldCBkZWNrIG5vdy5cbiAgICAgICAgICAgIHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPSB0aGlzLl9nZXRTd2l0Y2hlZENvYWNoRGVja0luZGV4QnlLZXlOYXZpZ2F0aW9uKFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5LFxuICAgICAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBBc3NpZ24gY2hlY2sgcGxhY2VzIGZyb20gdGhlIHRhcmdldCBzd2l0Y2ggZGVja1xuICAgICAgICAgICAgICBjb2FjaFBsYWNlcyA9XG4gICAgICAgICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3N3aXRjaGVkQ29hY2hEZWNrSW5kZXhdLmNvYWNoSXRlbXNbXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICAgICAgICBdLnBsYWNlcyB8fCBbXTtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byB1cGRhdGUgeSBjb29yZGluYXRlXG4gICAgICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSA9XG4gICAgICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID8gY29hY2guZGltZW5zaW9uLmggOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlIG9mIGNvYWNoUGxhY2VzKSB7XG4gICAgICAgICAgICAvLyBJZiBubyBrZXkgcHJlc3NlZCwgdGhlbiB3ZSB0cnkgdG8gZmluZCB0aGUgcGxhY2Ugb2YgdGhlIGN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvblxuICAgICAgICAgICAgaWYgKCFwcmVzc2VkS2V5KSB7XG4gICAgICAgICAgICAgIC8vIEZpbmQgcGxhY2UgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIFJJR0hUXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5yaWdodCAmJlxuICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9GaW5kIHBsYWNlIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgTEVGVFxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPT09IFNjcm9sbERpcmVjdGlvbi5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHBsYWNlLm51bWJlciAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZT8ubnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgLy9LZXkgW1JpZ2h0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPiBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbRG93bl0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtMZWZ0XSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHgtYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgKyAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA8IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtVcF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB5LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBhIHBsYWNlIGhhcyBiZWVuIGZvdW5kIGluIHRoZSBjaGFuZ2luZyBzd2l0Y2ggY29hY2gsXG4gICAgICAgICAgLy8gd2UgY2FuIHVwZGF0ZSB0aGUgY3VyclNlbGVjdGVkRGVja0luZGV4XG4gICAgICAgICAgaWYgKHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggIT09IG51bGwgJiYgY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHN3aXRjaGVkQ29hY2hEZWNrSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0UGxhY2U7XG4gIH1cblxuICAvLyBIYW5kbGluZyBmb3IgVGFiIG5hdmlnYXRpb24gaWYgYSBwbGFjZSBpcyBzZWxlY3RlZCBpbnNpZGUgdGhlIGNvYWNoLlxuICAvLyBUaGlzIGNvbnRyb2xzIHRoZSBmb2N1c2VkIGNvYWNoIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2guXG4gIHByaXZhdGUgX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCh0YWJEaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJGb2N1c0luZGV4ID1cbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgIDogdGhpcy5mb2N1c2VkQ29hY2hJbmRleDtcblxuICAgIC8vIENoZWNrIG5leHQgb3IgcHJldiB0YWIgaXMgcHJlc3NlZCwgdGhlbiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4IHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzXG4gICAgY29uc3QgbmV3Rm9jdXNhYmxlSW5kZXg6IG51bWJlciA9XG4gICAgICB0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQidcbiAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KVxuICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBjb25zdCBwbGFjZUluQ29hY2hIYXNGb2N1cyA9IHNlbGVjdGVkUGxhY2VFbGVtZW50XG4gICAgICAgID8gc2VsZWN0ZWRQbGFjZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdrZXlmb2N1cycpID09PSAnZm9jdXMnXG4gICAgICAgIDogZmFsc2U7XG5cbiAgICAgIC8vIElmIHdlIHRhYiBiYWNrIChQUkVWX1RBQikgYW5kIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgb24gcGxhY2UsXG4gICAgICAvLyB3ZSByZW1vdmUgdGhlIHNlbGVjdGVkIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGNvYWNoIGFuZCBvbmx5IHNldCB0aGUgZm9jdXMgc3RhdHVzIHRvIGl0XG4gICAgICBpZiAodGFiRGlyZWN0aW9uID09PSAnUFJFVl9UQUInICYmIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID09PSBjdXJyRm9jdXNJbmRleCkge1xuICAgICAgICAvLyBJZiB3ZSBUQUIgYmFjayBhbmQgaGF2ZSBhIHNlbGVjdGVkIHBsYWNlcyBpbnNpZGUgdGhlIGN1cnJlbnQgY29hY2gsIHRoZW4gd2UgbW92ZSBvdXQgZnJvbSB0aGUgc2VhdG1hcCBhbmQgc2V0IHRoZSBmb2N1cyB0byB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaFxuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMgfHwgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyRm9jdXNJbmRleDtcbiAgICAgICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGUgZmlyc3QgY29hY2ggaXMgc2VsZWN0ZWQgYW5kIHdlIFRBQiBiYWNrLCB3ZSBoYXZlIHRvIHNldCB0aGUgbmF0aXZlIGZvY3VzIG9uIHRoZSBmaXJzdCBjb2FjaCBpbiB0aGUgbmF2aWdhdGlvbiB0byBnZXQgYmFjayB0byB0aGUgbm9ybWFsIHRhYiBuYXZpZ2F0aW9uLlxuICAgICAgICAvLyBUbyBkbyB0aGlzLCB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgICBlbHNlIGlmIChjdXJyRm9jdXNJbmRleCA9PT0gMCkge1xuICAgICAgICAgIC8vIFJlZm9jdXMgdGhlIGZpcnN0IGNvYWNoXG4gICAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gT25seSBzZXRzIHRoZSBmb2N1cyBvbiB0aGUgbmV3IG5hdmlnYXRpb24gY29hY2hcbiAgICAgIGVsc2UgaWYgKG5ld0ZvY3VzYWJsZUluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGUgbGFzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCLCB3ZSBoYXZlIHRvIHNldCB0aGUgbmF0aXZlIGZvY3VzIG9uIHRoZSBsYXN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAvLyBUbyBkbyB0aGlzLCB3ZSBoYXZlICB0byByZW1vdmUgdGhlIGZvY3VzZWRJbmRleCBmcm9tIHRoZSBmaXJzdCBjb2FjaCBhbmQgc2V0IGl0IGFnYWluIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgIGVsc2UgaWYgKFxuICAgICAgICB0YWJEaXJlY3Rpb24gPT09ICdORVhUX1RBQicgJiZcbiAgICAgICAgbmV3Rm9jdXNhYmxlSW5kZXggPT09IHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICAvLyBSZWZvY3VzIHRoZSBsYXN0IGNvYWNoXG4gICAgICAgIHRoaXMuX3JlZm9jdXNDdXJyZW50Rm9jdXNlZE5hdkNvYWNoKGN1cnJGb2N1c0luZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgICAgLy8gSWYgYW55IHBsYWNlIHdhcyBmb2N1c2VkIGluIGNvYWNoLCBzbyB3ZSBzZXQgZm9jdXNlZCBhZ2FpblxuICAgICAgICBpZiAocGxhY2VJbkNvYWNoSGFzRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHBsYWNlIHdhcyBzZWxlY3RlZCwgdGhlbiB3ZSBzZWxlY3QgdGhlIGNvYWNoIGdyaWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQnkgVGFiIE5hdmlnYXRpb24sIHBlcmZvcm0gYXV0b21hdGljIHNjcm9sbGluZyB0byB0aGUgZm9jdXNlZCB3YWdvblxuICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24obmV3Rm9jdXNhYmxlSW5kZXgpO1xuICAgIH1cbiAgICAvLyBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0LCB3ZSBzY3JvbGwgZGlyZWN0bHkgdG8gdGhlIG5leHQgdGFiYWJsZSBjb2FjaFxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmV3Rm9jdXNhYmxlSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlZm9jdXNlZCB0aGUgY3VycmVudCBmb2N1c2VkICh2aXN1YWwpIG5hdiBjb2FjaCB0byBnZXQgdGhlIG5hdGl2ZSBmb2N1cyBiYWNrIHRvIHRoZSBuYXZpZ2F0aW9uXG4gIHByaXZhdGUgX3JlZm9jdXNDdXJyZW50Rm9jdXNlZE5hdkNvYWNoKGZvY3VzSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gZm9jdXNJbmRleCksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDb2FjaEluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcmV2ZW50UGxhY2VDbGljaykge1xuICAgICAgY29uc3QgZmluZENsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXkpO1xuXG4gICAgICBpZiAoZmluZENsb3Nlc3RQbGFjZSkge1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGZpbmRDbG9zZXN0UGxhY2UpO1xuICAgICAgfVxuICAgICAgLy8gTm8gY2xvc2VzdCBwbGFjZSBmb3VuZCBieSBrZXkgbmF2aWdhdGlvblxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0IHx8XG4gICAgICAgICAgKHRoaXMuYWxpZ25WZXJ0aWNhbCAmJlxuICAgICAgICAgICAgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgfHxcbiAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgdGhlIGN1cnJlbnQgcHJlc3NlZCBrZXkgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleFxuICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGVkQ29hY2hJbmRleCA9XG4gICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleCgpXG4gICAgICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleCgpO1xuXG4gICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmV3U2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyZW50SW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50SW5kZXggPz8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIHJldHVybiBzdGFydEluZGV4IDwgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zLmxlbmd0aCAtIDFcbiAgICAgID8gc3RhcnRJbmRleCArIDFcbiAgICAgIDogc3RhcnRJbmRleDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyZW50SW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50SW5kZXggPz8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIHJldHVybiBzdGFydEluZGV4ID4gMCA/IHN0YXJ0SW5kZXggLSAxIDogc3RhcnRJbmRleDtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZVR5cGVQcm9wID0gcGxhY2VTZWxlY3Rpb24ucGxhY2VUeXBlID09PSAnU0VBVCcgPyAnc2VhdHMnIDogJ2JpY3ljbGVzJztcbiAgICBjb25zdCBtYXhSZXNlcnZhdGlvbnMgPVxuICAgICAgcGxhY2VTZWxlY3Rpb24ucGxhY2VUeXBlID09PSAnU0VBVCcgPyB0aGlzLm1heFNlYXRSZXNlcnZhdGlvbnMgOiB0aGlzLm1heEJpY3ljbGVSZXNlcnZhdGlvbnM7XG4gICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VzID0gdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXTtcblxuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNbcGxhY2VUeXBlUHJvcF0gPSB0aGlzLl91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICAgIGN1cnJTZWxlY3RlZFBsYWNlcyxcbiAgICAgIG1heFJlc2VydmF0aW9ucyxcbiAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICk7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPn1cbiAgICAgKiBFbWl0cyB3aGVuIGEgcGxhY2Ugd2FzIHNlbGVjdGVkIGFuZCByZXR1cm5zIGEgUGxhY2UgYXJyYXkgd2l0aCBhbGwgc2VsZWN0ZWQgcGxhY2VzLlxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcz4oJ3NlbGVjdGVkcGxhY2VzJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdLFxuICAgIG1heFJlc2VydmF0aW9uczogbnVtYmVyLFxuICAgIHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy8gQWRkIHNlbGVjdGVkIHBsYWNlIHRvIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgaWYgKHBsYWNlU2VsZWN0aW9uLnN0YXRlID09PSAnU0VMRUNURUQnKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRGVja0luZGV4ID0gdGhpcy5fZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbiA9IHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgICAgICBwbGFjZVNlbGVjdGlvbixcbiAgICAgICAgc2VsZWN0ZWRQbGFjZURlY2tJbmRleCxcbiAgICAgICk7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uKSB7XG4gICAgICAgIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnB1c2goc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVtb3ZlIHNlbGVjdGVkIHBsYWNlIGZyb20gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBlbHNlIHtcbiAgICAgIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzID0gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIENoZWNrcyB3aGV0aGVyIG1heFJlc2VydmF0aW9uIGlzIGFjdGl2YXRlZCBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIHBsYWNlcyBpcyByZWFjaGVkXG4gICAgaWYgKG1heFJlc2VydmF0aW9ucyA+IC0xICYmIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmxlbmd0aCA+IG1heFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgcmVzZXRXaXRoUGxhY2VTZWxlY3Rpb24gPSBtYXhSZXNlcnZhdGlvbnMgPiAwID8gcGxhY2VTZWxlY3Rpb24gOiB1bmRlZmluZWQ7XG5cbiAgICAgIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzID0gdGhpcy5fcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgICAgIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLFxuICAgICAgICByZXNldFdpdGhQbGFjZVNlbGVjdGlvbixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcztcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDdXJyZW50U2VsZWN0ZWRQbGFjZUluQ29hY2gocGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgIGNvbnN0IGNvYWNoSW5kZXggPSBwbGFjZVNlbGVjdGlvbi5jb2FjaEluZGV4O1xuXG4gICAgaWYgKHBsYWNlRGVja0luZGV4ID09PSBudWxsKSByZXR1cm47XG5cbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1twbGFjZURlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHJldHVybjtcblxuICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gcGxhY2VEZWNrSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gY29hY2hJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9PSB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgIC8vIFRpbWUgZGVsYXkgdG8gd2FpdCBmb3Igc3RhdHVzIHVwZGF0ZSBwcm9jZXNzIGF0IGNsaWNrZWQgcGxhY2VcbiAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgICBjbGVhclRpbWVvdXQoZGVsYXlTY3JvbGxJblZpZXdwb3J0KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpOiB2b2lkIHtcbiAgICAvL09ubHkgaWYgdGhlIHNlbGVjdGVkQ29hY2hJbmRleCBoYXMgY2hhbmdlZCwgYW4gdXBkYXRlIG5lZWRzIHRvIGJlIGNhcnJpZWQgb3V0XG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PSB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCkgcmV0dXJuO1xuXG4gICAgLy8gSWYgYSBmb2N1c2luZGV4IGhhcyBiZWVuIHNldCAoIT0gLTEpLCBpdCBjYW4gYmUgdXBkYXRlZCB3aXRoIHRoZSBjdXJyZW50IHNlbGVjdGVkQ29hY2hJbmRleFxuICAgIGlmICh0aGlzLmZvY3VzZWRDb2FjaEluZGV4ICE9IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcblxuICAgIGNvbnN0IGNvYWNoU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCh0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgaWYgKGNvYWNoU2VsZWN0aW9uKSB7XG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoPn1cbiAgICAgICAqIEVtaXRzIHdoZW4gYSBjb2FjaCB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBDb2FjaFNlbGVjdGlvblxuICAgICAgICovXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoPignc2VsZWN0ZWRjb2FjaCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogY29hY2hTZWxlY3Rpb24sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGxhY2VFbGVtZW50SWQoXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlcixcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICAgcGxhY2VOdW1iZXI6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgJ3NlYXQtcmVzZXJ2YXRpb25fX3BsYWNlLWJ1dHRvbi0nICsgY29hY2hEZWNrSW5kZXggKyAnLScgKyBjb2FjaEluZGV4ICsgJy0nICsgcGxhY2VOdW1iZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIHRoZSBjYXNlIG9mIGNvYWNoIGxheW91dHMgd2l0aCBkaWZmZXJlbnQgZGVja3MsXG4gICAqIGl0IGlzIG5lY2Vzc2FyeSB0byBleHRlbmQgdGhlIG9mZnNldCB3aXRoIGVtcHR5IGNvYWNoZXNcbiAgICogaW4gb3JkZXIgdG8gY3JlYXRlIGEgc3RhYmxlIHZlaGljbGUgbGF5b3V0LlxuICAgKlxuICAgKiAgICAgICAgICAgICBbb29vXS1bb29vXS1bb29vXVxuICAgKiBbb29vXS1bb29vXS1bb29vXS1bb29vXS1bb29vXVxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdEVtcHR5Q29hY2hEZWNrT2Zmc2V0cygpOiB2b2lkIHtcbiAgICAvLyBQcmVmaWxsIG9mZnNldCBjb3VudGVycyB3aXRoIDAgc3RhcnQgaW5kZXhcbiAgICBjb25zdCBjb2FjaE9mZnNldEluZGV4Q291bnRlciA9IEFycmF5KHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxKS5maWxsKDApO1xuICAgIC8vIFRha2VzIHRoZSBsb3dlciBkZWNrIHdoaWNoIGNvbnRhaW5zIHRoZSBtYXggbnVtYmVycyBvZiBjb2FjaGVzXG4gICAgY29uc3QgbG93ZXJEZWNrID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXTtcblxuICAgIGxvd2VyRGVjay5jb2FjaEl0ZW1zLmZvckVhY2goKGxvd2VyQ29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBkZWNrQ29hY2hJdGVtID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2ldLmNvYWNoSXRlbXNbY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV1dO1xuICAgICAgICBpZiAobG93ZXJDb2FjaEl0ZW0uaWQgIT0gZGVja0NvYWNoSXRlbT8uaWQpIHtcbiAgICAgICAgICAvLyBBZGQgRW1wdHkgb2Zmc2V0IGNvYWNoIHRvIHNwZWNpZmllZCBpbmRleCBwb3NpdGlvblxuICAgICAgICAgIGNvbnN0IGVtcHR5T2Zmc2V0Q29hY2ggPSB7XG4gICAgICAgICAgICAuLi5sb3dlckNvYWNoSXRlbSxcbiAgICAgICAgICAgIHBsYWNlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJvcGVydHlJZHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNFbGVtZW50czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2VydmljZUVsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0cmF2ZWxDbGFzczogW10sXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtcy5zcGxpY2UoXG4gICAgICAgICAgICBjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBlbXB0eU9mZnNldENvYWNoLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXSsrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemF0aW9uIG9mIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIEFycmF5IGJhc2VkIG9uIHRoZSB0cmFuc2ZlcnJlZCBwbGFjZXNcbiAgICogdGhhdCBoYXZlIHRoZSBzdGF0ZSBTRUxFQ1RFRCB3aXRoaW4gdGhlIHNlYXRSZXNlcnZhdGlvbiBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBwbGFjZSBzZWxlY3Rpb25zXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuYmljeWNsZXMgPSBbXTtcblxuICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucz8uZm9yRWFjaCgoc2VhdFJlc2VydmF0aW9uOiBTZWF0UmVzZXJ2YXRpb24sIGNvYWNoRGVja0luZGV4OiBudW1iZXIpID0+XG4gICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtcy5tYXAoKGNvYWNoOiBDb2FjaEl0ZW0sIGNvYWNoSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb2FjaC5wbGFjZXNcbiAgICAgICAgICA/LmZpbHRlcigocGxhY2UpID0+IHBsYWNlLnN0YXRlID09PSAnU0VMRUNURUQnKVxuICAgICAgICAgID8uZm9yRWFjaCgocGxhY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKGNvYWNoRGVja0luZGV4LCBjb2FjaEluZGV4LCBwbGFjZS5udW1iZXIpO1xuICAgICAgICAgICAgY29uc3QgcHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24gPSBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICAgICAgcGxhY2UsXG4gICAgICAgICAgICAgIHBsYWNlSWQsXG4gICAgICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbi5kZWNrQ29hY2hJbmRleCxcbiAgICAgICAgICAgICAgY29hY2hJbmRleCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwgPVxuICAgICAgICAgICAgICB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uLCBjb2FjaERlY2tJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ucGxhY2VUeXBlID09PSAnU0VBVCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuYmljeWNsZXMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIHNlbGVjdGVkIHBsYWNlcyB3aWxsIGJlIHJlc2V0IG9yIHRoZSBjdXJyZW50U2VsZWN0ZWRQbGFjZSB3YXMgZ2l2ZW4sIHRoZW4gd2UgcmVzZXQgYWxsIGV4Y2VwdCBjdXJyZW50U2VsZWN0ZWRQbGFjZVxuICAgKiBAcGFyYW0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnNcbiAgICogQHBhcmFtIGN1cnJTZWxlY3RlZFBsYWNlXG4gICAqL1xuICBwcml2YXRlIF9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZT86IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvL0ZpbmQgYWxsIHBsYWNlcyB0byBiZSBuZWVkZWQgdW5zZWxlY3RcbiAgICBmb3IgKGNvbnN0IHBsYWNlU2VsZWN0aW9uIG9mIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zKSB7XG4gICAgICBpZiAoIWN1cnJTZWxlY3RlZFBsYWNlIHx8IGN1cnJTZWxlY3RlZFBsYWNlLmlkICE9PSBwbGFjZVNlbGVjdGlvbi5pZCkge1xuICAgICAgICBjb25zdCBwbGFjZUVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHBsYWNlU2VsZWN0aW9uLmlkKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHBsYWNlRWxlbWVudCkge1xuICAgICAgICAgIHBsYWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0YXRlJywgJ0ZSRUUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvL1JlbW92ZXMgYWxsIHNlbGVjdGVkIHBsYWNlcyBleGNlcHQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgIGlmIChjdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgPT09IGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlU2VsZWN0aW9uLFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIgfCBudWxsLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiB8IG51bGwge1xuICAgIGlmIChjb2FjaERlY2tJbmRleCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tjb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4XTtcbiAgICBjb25zdCBwbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gY3VyclNlbGVjdGVkUGxhY2UubnVtYmVyKTtcblxuICAgIHJldHVybiBwbGFjZVxuICAgICAgPyBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICBjb2FjaCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5kZWNrSW5kZXgsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleCxcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaChcbiAgICBjb2FjaEluZGV4OiBudW1iZXIsXG4gICk6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2ggfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaC5wbGFjZXMpO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCwgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBwbGFjZVxuICAgICAgPyB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJhdGlvbiBvZiB0aGUgdXNlZCBkb2N1bWVudHMgZm9udC1zaXplIHdoaWNoIG5lZWRzXG4gICAqIHRvIGJlIGRldGVybWluZWQgaW4gb3JkZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBDU1MgdmFsdWVzIHdpdGggcmVtXG4gICAqICovXG4gIHByaXZhdGUgX2RldGVybWluZUJhc2VGb250U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBjb25zdCBiYXNlRm9udFNpemUgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250U2l6ZSwgMTApO1xuICAgICAgLy9jYWxjdWxhdGUgcmVtIG9mIDFweFxuICAgICAgY29uc3Qgb25lUGl4ZWxJblJlbSA9IDEgLyBiYXNlRm9udFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtJywgYCR7b25lUGl4ZWxJblJlbSArICdyZW0nfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBkYXRhIGZvciBkaXNwbGF5aW5nIG5hdmlnYXRpb24gYXJlYS5cbiAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIHdoaWNoIGFyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGR1cmluZyB1c2Ugb2YgYSBjb21wb25lbnQ6XG4gICAqICAgIC0gY29hY2ggaWRcbiAgICogICAgLSBsaXN0IG9mIHNlcnZpY2UgaWNvbnNcbiAgICogICAgLSBjbGFzcyAoZmlyc3QsIHNlY29uZCwgYW55KVxuICAgKiAgICAtIHdoZXRoZXIgdGhlcmUgaXMgYSBkcml2ZXIgYXJlYSBsZWZ0IG9yIHJpZ2h0XG4gICAqICovXG4gIHByaXZhdGUgX3ByZXBhcmVDb2FjaEl0ZW1EZXRhaWxzRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBsb3dlckRlY2s6IENvYWNoSXRlbVtdID1cbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zO1xuXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cyA9IFtdO1xuXG4gICAgICBsb3dlckRlY2suZm9yRWFjaCgoY29hY2gsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUlkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGxhY2VzOiBQbGFjZVtdID0gW107XG5cbiAgICAgICAgLy8gQ29sbGVjdCBhbGwgaW1wb3J0YW50IG5hdmlnYXRpb24gZGF0YSB0byBiZSByZW5kZXJlZFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgICAubWFwKChzcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHNyLmNvYWNoSXRlbXNbaW5kZXhdO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZvckVhY2goKGNvYWNoOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRyYXZlbENsYXNzZXMucHVzaCguLi5jb2FjaC50cmF2ZWxDbGFzcyk7XG4gICAgICAgICAgICBwcm9wZXJ0eUlkcy5wdXNoKC4uLihjb2FjaC5wcm9wZXJ0eUlkcyA/IGNvYWNoLnByb3BlcnR5SWRzIDogW10pKTtcbiAgICAgICAgICAgIHBsYWNlcy5wdXNoKC4uLihjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMgOiBbXSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBjb2FjaC5pZCxcbiAgICAgICAgICB0cmF2ZWxDbGFzczogdGhpcy5fcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzKSxcbiAgICAgICAgICBwcm9wZXJ0eUlkczogdGhpcy5fcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24ocHJvcGVydHlJZHMpLFxuICAgICAgICAgIGlzRHJpdmVyQXJlYTogY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzLmxlbmd0aCA9PT0gMCA6IHRydWUsXG4gICAgICAgICAgZHJpdmVyQXJlYVNpZGU6IHRoaXMuX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oY29hY2gpLFxuICAgICAgICAgIGZyZWVQbGFjZXM6IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChwbGFjZXMpLFxuICAgICAgICAgIGRyaXZlckFyZWFFbGVtZW50czogdGhpcy5fc2V0RHJpdmVyQXJlYXNFbGVtZW50cyhjb2FjaCksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10pOiBQbGFjZVRyYXZlbENsYXNzIHtcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdGSVJTVCcpICE9PSAtMSkgcmV0dXJuICdGSVJTVCc7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignU0VDT05EJykgIT09IC0xKSByZXR1cm4gJ1NFQ09ORCc7XG4gICAgcmV0dXJuICdBTllfQ0xBU1MnO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvYWNoRHJpdmVyQXJlYXMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAoZ3JhcGhpY2FsRWxlbWVudHMpID0+IGdyYXBoaWNhbEVsZW1lbnRzLmljb24gPT09ICdEUklWRVJfQVJFQScsXG4gICAgKTtcblxuICAgIGlmIChjb2FjaERyaXZlckFyZWFzICYmIGNvYWNoRHJpdmVyQXJlYXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGRyaXZlciBhcmVhIHBvc2l0aW9uIHdoZXRoZXIgaXQgaXMgcHJlc2VudCBvbiB0aGUgbGVmdCBvciByaWdodCBzaWRlIGluIGEgY29hY2hcbiAgICAgIGNvbnN0IGhhc0xlZnREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCkgfHwgZmFsc2U7XG4gICAgICBjb25zdCBoYXNSaWdodERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID4gMCkgfHwgZmFsc2U7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICEhaGFzTGVmdERyaXZlckFyZWEsXG4gICAgICAgIHJpZ2h0OiAhIWhhc1JpZ2h0RHJpdmVyQXJlYSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbiA9IChwcm9wZXJ0eUlkczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKCFwcm9wZXJ0eUlkcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHNocnVua1Byb3BlcnR5SWRzID0gcHJvcGVydHlJZHNcbiAgICAgID8ubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eUlkOiBzdHJpbmcpOiB7XG4gICAgICAgIHBJZDogc3RyaW5nO1xuICAgICAgICBzdmdOYW1lOiBzdHJpbmc7XG4gICAgICB9IHtcbiAgICAgICAgLy8gcHJlcGFyZSB0ZW1wb3Jhcnkgb2JqZWN0IG1hcHBpbmcgcHJvcGVydHkgaWQgdG8gaXQncyBzdmdOYW1lIHNvIHRoYXQgd2UgY2FuIGNvbXBhcmUgaXQgdG8gdGhlIGxpc3Qgb2YgYWxsb3dlZCBpY29uc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBJZDogcHJvcGVydHlJZCxcbiAgICAgICAgICBzdmdOYW1lOiBtYXBJY29uVG9TdmdbcHJvcGVydHlJZF0/LnN2Z05hbWUgPyBtYXBJY29uVG9TdmdbcHJvcGVydHlJZF0/LnN2Z05hbWUgOiAnJyxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAvL2ZpbHRlciBvdXQgb2JqZWN0cyBzZXJ2aWNlIGljb25zIHdoaWNoIGFyZSBub3QgaW4gQUxMT1dFRF9TRVJWSUNFX0lDT05TXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eVRvU3ZnKSA9PiBBTExPV0VEX1NFUlZJQ0VfSUNPTlMuaW5kZXhPZihwcm9wZXJ0eVRvU3ZnLnN2Z05hbWUpICE9PSAtMSlcbiAgICAgIC8vbWFrZSBpdCBkaXN0aW5jdCBieSBzdmdOYW1lXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodmFsdWUsIGluZGV4LCBzZWxmKSA9PlxuICAgICAgICAgIHNlbGYubWFwKChwcm9wU3ZnKSA9PiBwcm9wU3ZnLnN2Z05hbWUpLmluZGV4T2YodmFsdWUuc3ZnTmFtZSkgPT09IGluZGV4LFxuICAgICAgKVxuICAgICAgLy8gZ28gYmFjayB0byBwcm9wZXJ0eUlkIHN0cmluZyBmcm9tIHRlbXBvcmFyeSBvYmplY3RcbiAgICAgIC5tYXAoKHByb3BlcnR5VG9TdmcpID0+IHByb3BlcnR5VG9TdmcucElkKVxuICAgICAgLy8gdGFrZSBmaXJzdCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IGZyb20gQmFja2VuZCwgb3RoZXJ3aXNlIHRoZSBsYXlvdXQgY291bGQgYmUgZGVzdHJveWVkXG4gICAgICAuc2xpY2UoMCwgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyk7XG4gICAgcmV0dXJuIHNocnVua1Byb3BlcnR5SWRzID8gc2hydW5rUHJvcGVydHlJZHMgOiBbXTtcbiAgfTtcblxuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hXaWR0aEFuZEdhcENhbGN1bGF0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBjb2FjaEl0ZW1zOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0/LmNvYWNoSXRlbXM7XG5cbiAgICAgIGNvYWNoSXRlbXM/LmZvckVhY2goKGNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc092ZXJoYW5naW5nUGxhY2VzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgY29hY2hJdGVtLnBsYWNlcyxcbiAgICAgICAgKTtcblxuICAgICAgICAvL011c3QgIGJlIGRvbmUgYWxzbyBmb3IgZ3JhcGhpY2FsIGVsZW1lbnRzLCBhcyB0aGV5IGNhbiBhbHNvIHByb3RydWRlIHRoZSBjb2FjaCBib3JkZXJcbiAgICAgICAgLy8gQ2hlY2sgb25seSBncmFwaGljYWwgZWxlbWVudHMgdGhhdCBhcmUgbm90IGFyZWEgZWxlbWVudHNcbiAgICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAoZSkgPT4gZS5pY29uICYmICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhlLmljb24pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGhhc092ZXJoYW5naW5nR3JhcGhpY0FyZWFzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgZmlsdGVyZWRFbGVtZW50cyxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uLnB1c2goe1xuICAgICAgICAgIGNvYWNoSWQ6IGNvYWNoSXRlbS5pZCxcbiAgICAgICAgICBvdmVyaGFuZ2luZ1BsYWNlczogaGFzT3ZlcmhhbmdpbmdQbGFjZXMsXG4gICAgICAgICAgb3ZlcmhhbmdpbmdHcmFwaGljQXJlYXM6IGhhc092ZXJoYW5naW5nR3JhcGhpY0FyZWFzLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyQXJlYXMgZm9yIG9uZSBjb2FjaFxuICAgKiBAcGFyYW0gY29hY2hJdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9zZXREcml2ZXJBcmVhc0VsZW1lbnRzKGNvYWNoSXRlbTogQ29hY2hJdGVtKToge1xuICAgIGRyaXZlckFyZWE6IEJhc2VFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbDogQmFzZUVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIH0ge1xuICAgIGlmIChjb2FjaEl0ZW0pIHtcbiAgICAgIGNvbnN0IGRyaXZlckFyZWEgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maW5kKFxuICAgICAgICAoZWxlbWVudDogQmFzZUVsZW1lbnQpID0+IGVsZW1lbnQuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBJyxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbCA9XG4gICAgICAgIGNvYWNoSXRlbS50eXBlID09PSAnTE9DT01PVElWRV9DT0FDSCdcbiAgICAgICAgICA/IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRyaXZlckFyZWE6IGRyaXZlckFyZWEsXG4gICAgICAgIGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbDogZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZHJpdmVyQXJlYTogdW5kZWZpbmVkLFxuICAgICAgZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgU2VhdFJlc2VydmF0aW9uIGxvc2VzIGZvY3VzLCB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdXNlciB0YWJzIG91dCBvciBjbGlja3Mgc29tZXdoZXJlIGVsc2UuXG4gICAqIFRoZW4gd2UgcmVzZXQgdGhlIGZvY3VzZWQgZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIF9vbkxlYXZlU2VhdFJlc2VydmF0aW9uQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTY3JvbGxEaXJlY3Rpb24iLCJhY2N1bXVsYXRvciIsInBsYWNlIiwiY29hY2giXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBOEJBLElBQUs7QUFBQSxDQUFMLFNBQUtBLGtCQUFlO0FBQ2xCQSxtQkFBQSxPQUFBLElBQUE7QUFDQUEsbUJBQUEsTUFBQSxJQUFBO0FBQ0YsR0FISyxvQkFBQSxrQkFBZSxDQUFBLEVBQUE7QUFXcEIsTUFBTSx5QkFB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
|
|
1310
|
+
//#endregion
|
|
1311
|
+
export { SeatReservationBaseElement };
|
|
1312
|
+
|
|
1313
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2Jhc2UtZWxlbWVudHMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlzU2VydmVyLCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGV2ZW50T3B0aW9ucywgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQge1xuICBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbixcbiAgbWFwSWNvblRvU3ZnLFxuICBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi9tYXBwZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBCYXNlRWxlbWVudCxcbiAgQ29hY2hJdGVtLFxuICBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudFBvc2l0aW9uLFxuICBDb2FjaEl0ZW1EZXRhaWxzLFxuICBQbGFjZSxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFBsYWNlVHJhdmVsQ2xhc3MsXG4gIFNlYXRSZXNlcnZhdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2gsXG4gIFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzLFxuICBUcmF2ZWxEaXJlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcy50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBjb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHM6IENvYWNoSXRlbURldGFpbHNbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY3VyclNjcm9sbERpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uID0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0O1xuICBwcm90ZWN0ZWQgbWF4Q2FsY0NvYWNoZXNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoZXNBcmVhV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxOYXZpZ2F0aW9uQXJlYURpbTogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb246IENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25TY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY29hY2hTY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZERlY2tJbmRleDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzID0ge1xuICAgIHNlYXRzOiBbXSxcbiAgICBiaWN5Y2xlczogW10sXG4gIH07XG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzTXVsdGlwbGVEZWNrcyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cyA9IHtcbiAgICBBcnJvd0xlZnQ6ICdBcnJvd0xlZnQnLFxuICAgIEFycm93UmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgICBBcnJvd1VwOiAnQXJyb3dVcCcsXG4gICAgQXJyb3dEb3duOiAnQXJyb3dEb3duJyxcbiAgICBUYWI6ICdUYWInLFxuICAgIEVudGVyOiAnRW50ZXInLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG5vdEFyZWFFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgXTtcblxuICBwcm90ZWN0ZWQgb3ZlckhhbmdpbmdFbGVtZW50SW5mb3JtYXRpb246IHtcbiAgICBjb2FjaElkOiBzdHJpbmc7XG4gICAgb3ZlcmhhbmdpbmdQbGFjZXM6IGJvb2xlYW47XG4gICAgb3ZlcmhhbmdpbmdHcmFwaGljQXJlYXM6IGJvb2xlYW47XG4gIH1bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gIHByaXZhdGUgX3Njcm9sbFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9sYXN0U3RhcnRTY3JvbGxQb3MgPSAtMTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBBZGQgYmx1ciBldmVudCBsaXN0ZW5lciBvbiB0aGUgZW50aXJlIGNvbXBvbmVudCB0byBkZXRlY3Qgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlIGNvbXBvbmVudFxuICAgIC8vIGJ5IHVzaW5nIHRhYiBuYXZpZ2F0aW9uIG9yIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudC4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gcmVzZXQgdGhlIHNlbGVjdGVkIGNvYWNoIGFuZCBwbGFjZS5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB0aGlzLl9vbkxlYXZlU2VhdFJlc2VydmF0aW9uQ29tcG9uZW50KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzZWF0UmVzZXJ2YXRpb25zJykpIHtcbiAgICAgIHRoaXMuaGFzTXVsdGlwbGVEZWNrcyA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucz8ubGVuZ3RoID4gMTtcblxuICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICB0aGlzLl9wcmVwYXJlQ29hY2hXaWR0aEFuZEdhcENhbGN1bGF0aW9ucygpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2FsaWduVmVydGljYWwnKSAmJiB0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygncHJlc2VsZWN0Q29hY2hJbmRleCcpKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdpdGhvdXQsIF9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpIHdvdWxkIGZhaWwgd2l0aCBOUEUgYmVjYXVzZVxuICAgICAgLy8gdGhlIGNvYWNoU2Nyb2xsQXJlYSBpcyBub3QgeWV0IGluaXRpYWxpemVkXG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHRoaXMucHJlc2VsZWN0Q29hY2hJbmRleCksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuYXZpZ2F0ZUJ5RGlyZWN0aW9uQnRuKGJ0bkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgbGV0IG5hdmlnYXRlVG9Db2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuICAgIGlmIChidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9MRUZUJyAmJiBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA+IDApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4IC0gMSA6IDA7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX1JJR0hUJyAmJlxuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdPy5jb2FjaEl0ZW1zLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4ID1cbiAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9IC0xID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgMSA6IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2gobmF2aWdhdGVUb0NvYWNoSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGEgY2FuIGJlIHByZXBhcmVkIG9uY2UgZm9yIHRoZSBlbnRpcmUgY29tcG9uZW50XG4gICAqIGluIG9yZGVyIHRvIGF2b2lkIHJlY3VycmluZyBpdGVyYXRpb24gcHJvY2Vzc2VzIGluIHJlbmRlcmluZy5cbiAgICovXG4gIHByaXZhdGUgX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTtcblxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlRGVja3MpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWNrcywgd2UgbmVlZCB0byBjaGVja1xuICAgICAgLy8gd2hldGhlciBlbXB0eSBjb2FjaGVzIG5lZWQgdG8gYmUgYWRkZWQgb24gZGlmZmVyZW50IGRlY2sgbGV2ZWxzXG4gICAgICB0aGlzLl9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJlcGFyZUNvYWNoSXRlbURldGFpbHNEYXRhKCk7XG4gIH1cblxuICAvKiogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlcycsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgID8gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGlmIChzZWF0UmVzZXJ2YXRpb25EZWNrICYmIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBoZWlnaHQgb2Ygb25lIGNvYWNoIGluY2x1ZGluZyBib3JkZXIgcGFkZGluZ1xuICAgICAgY29uc3QgY29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyA9XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaCAqIHRoaXMuYmFzZUdyaWRTaXplICsgdGhpcy5jb2FjaEJvcmRlclBhZGRpbmc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGdhcCBiZXR3ZWVuIG11bHRpcGxlIGNvYWNoIHRoZSBkZWNrcy5cbiAgICAgIC8vIE5vIGdhcCBleGlzdCBpZiBqdXN0IG9uZSBjb2FjaCBkZWNrIGV4aXN0LlxuICAgICAgY29uc3QgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSAodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hEZWNrcztcblxuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCcsXG4gICAgICAgIGAke2NvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgKiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoICsgZ2FwQmV0d2VlbkNvYWNoRGVja3N9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrcycsIGAke3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIEluaXQgdGhlIGNvYWNoTmF2QnV0dG9uRGltIGRpbWVuc2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgbmF2aWdhdGlvbiBsYXRlclxuICAgICAgY29uc3QgbmF2Q29hY2hlc0xpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVzTGlzdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICA/IGZpcnN0TGlFbGVEaW1lbnNpb24uaGVpZ2h0XG4gICAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uLndpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrKSB7XG4gICAgICAvLyBJbml0IHRoZSBzdGFydCBvZmZzZXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgY29hY2ggc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb25zXG4gICAgICBsZXQgY3VyckNhbGNUcmlnZ2VyUG9zID0gMDtcbiAgICAgIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoY29hY2gpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NYID0gY3VyckNhbGNUcmlnZ2VyUG9zO1xuICAgICAgICBjb25zdCBjb2FjaFdpZHRoID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKGNvYWNoLmRpbWVuc2lvbikudztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgLy8gVGhlIGdhcCBpcyBtYXliZSBhZGp1c3RlZCBpZiBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY3MgZXhpc3RcbiAgICAgICAgY29uc3QgY3VycmVudENvYWNoT3ZlcmhhbmdpbmdJbmZvID0gdGhpcy5vdmVySGFuZ2luZ0VsZW1lbnRJbmZvcm1hdGlvbi5maW5kKFxuICAgICAgICAgIChlKSA9PiBlLmNvYWNoSWQgPT09IGNvYWNoLmlkLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBvdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudCA9XG4gICAgICAgICAgY3VycmVudENvYWNoT3ZlcmhhbmdpbmdJbmZvPy5vdmVyaGFuZ2luZ1BsYWNlcyB8fFxuICAgICAgICAgIGN1cnJlbnRDb2FjaE92ZXJoYW5naW5nSW5mbz8ub3ZlcmhhbmdpbmdHcmFwaGljQXJlYXM7XG4gICAgICAgIGN1cnJDYWxjVHJpZ2dlclBvcyArPVxuICAgICAgICAgIGNvYWNoV2lkdGggK1xuICAgICAgICAgICghb3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQgPyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzIDogMiAqIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0UG9zWCxcbiAgICAgICAgICBlbmQ6IGN1cnJDYWxjVHJpZ2dlclBvcyxcbiAgICAgICAgICB3aWR0aDogY29hY2hXaWR0aCxcbiAgICAgICAgfSBhcyBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgbWF4aW11bSBjYWxjdWxhdGVkIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggPSBjdXJyQ2FsY1RyaWdnZXJQb3MgLSB0aGlzLmdhcEJldHdlZW5Db2FjaGVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgZXZlbnQgaGFuZGxlciBtYW5hZ2VkIHRoZSBlbmQgb2Ygc2Nyb2xsaW5nIGluc2lkZSB0aGUgY29hY2ggc2Nyb2xsIGFyZWEuXG4gICAqIFRpbWVvdXQgZXZlbnQgaGFuZGxpbmcgdG8gY2hlY2sgaWYgdGhlIHNjcm9sbGluZyBoYXMgYmVlbiBjb21wbGV0ZWQuXG4gICAqIEl0IGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIFNhZmFyaSBicm93c2VyIGRvZXMgbm90IGhhbmRsZSBzY3JvbGxlbmQgZXZlbnQsXG4gICAqIGFuZCB3ZSB0aGVyZWZvcmUgaW1pdGF0ZSB0aGlzIGV2ZW50IC0+IHNjcm9sbGVuZC5cbiAgICovXG4gIEBldmVudE9wdGlvbnMoeyBwYXNzaXZlOiB0cnVlIH0pXG4gIHByb3RlY3RlZCBjb2FjaEFyZWFTY3JvbGxlbmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Njcm9sbFRpbWVvdXQpIHtcbiAgICAgIC8vIEZpcnN0LCB3ZSBjbGVhcmVkIHRoZSByZWdpc3RlcmVkIHRpbWVvdXQsIGFzIHRoZSBzY3JvbGxpbmcgaXMgc3RpbGwgcnVubmluZ1xuICAgICAgLy8gYW5kIHRodXMgd2UgcHJldmVudCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQgZnVuY3Rpb25cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY3JvbGxUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gZnVydGhlciBzY3JvbGwgZXZlbnQgaXMgZmlyZWQsIHRoZSBuZXh0IHRpbWVvdXQgY2FuIGV4ZWN1dGUgdGhlIGlubmVyIGZ1bmN0aW9uIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCB3aXRob3V0IGNsZWFyaW5nXG4gICAgdGhpcy5fc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5faGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKSwgMTUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0cyAocHJvcGVydHkgc2V0dGluZyAtPiBoYXNOYXZpZ2F0aW9uKSBhbmQgYSB0YWJsZSBjb2FjaCBnZXRzIHRoZSBmb2N1cyxcbiAgICogdGhlIGZpcnN0IHBsYWNlIGluIHRoZSBjb2FjaCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgcHJlc2VsZWN0ZWQgdG8gY29udHJvbCB0aGUgcGxhY2UgbmF2aWdhdGlvbiB2aWEga2V5Ym9hcmRcbiAgICpcbiAgICogQHBhcmFtIGZvY3VzQ29hY2hJbmRleFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNUYWJsZUNvYWNoQW5kUHJlc2VsZWN0UGxhY2UoZm9jdXNDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyAmJiAhdGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZm9jdXNDb2FjaEluZGV4ID09PSAwXG4gICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KC0xKVxuICAgICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChmb2N1c0NvYWNoSW5kZXgpO1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2lsbCBiZSB0cmlnZ2VyZWQgYnkgZm9jdXMgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKi9cbiAgcHJvdGVjdGVkIG9uRm9jdXNOYXZEaXJlY3Rpb25CdXR0b24oKTogdm9pZCB7XG4gICAgLy8gSWYgYW55IG5hdmlnYXRpb24gZGlyZWN0aW9uIGJ1dHRvbiAocmlnaHR8bGVmdCkgZ2V0IHRoZSBmb2N1cywgc28gd2UgaGF2ZSBtYW51YWwgcmVzZXQgdGhlIHByZXZpb3VzIGZvY3VzQ29hY2hJbmRleC5cbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gIH1cblxuICAvKiogVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgQ29hY2ggTmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25LZXlOYXZpZ2F0aW9uTmF2Q29hY2hCdXR0b24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICB0aGlzLl9oYW5kbGVUYWJLZXlOYXZpZ2F0aW9uKGV2ZW50LCAnbmF2aWdhdGlvbicsIGN1cnJOYXZDb2FjaEJ1dHRvbkluZGV4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBCeSB1c2luZyBhbnkgb3RoZXIga2V5IChubyBUQUIpIGluc2lkZSB0aGUgTmF2aWdhdGlvbiBhcmVhLCBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgYnkgdXNpbmcgdGhlIGxvZ2ljIGZyb20ga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZ1xuICAgIGlmIChpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICB0aGlzLmtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZW5lcmFsIFRBQiBLZXkgRXZlbnQgaGFuZGxpbmcgZm9yIHRhYiBuYXZpZ2F0aW9uIGluc2lkZSB0aGUgY29hY2ggbmF2aWdhdGlvbiBhcmVhIGFuZCB0aGUgc2VhdG1hcCBhcmVhICovXG4gIHByaXZhdGUgX2hhbmRsZVRhYktleU5hdmlnYXRpb24oXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnQsXG4gICAgZXZlbnRBcmVhOiBzdHJpbmcsXG4gICAgY3VyclRhYkluZGV4PzogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIGNvbnN0IHByZXNzZWRTaGlmdFRhYiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgaWYgKHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYikge1xuICAgICAgLy8gSGFuZGxlIFRBQiBrZXkgZXZlbnQgbmF2aWdhdGlvbiBmb3IgY29hY2ggbmF2aWdhdGlvbiBhcmVhLlxuICAgICAgLy8gRnByIGNvYWNoIG5hdmlnYXRpb24gd2UganVzdCBjb250cm9sIHRoZSBmb2N1cyBpbmRleCB0byB2aXN1YWxpemUgZm9jdXMgc3R5bGUgZm9yIG5hdiBjb2FjaCBidXR0b25cbiAgICAgIGlmIChldmVudEFyZWEgPT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgIGlmIChjdXJyVGFiSW5kZXggPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgICAgICAgICFwcmVzc2VkU2hpZnRUYWIgfHxcbiAgICAgICAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW2N1cnJUYWJJbmRleF0uaXNEcml2ZXJBcmVhIHx8XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyclRhYkluZGV4O1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJlc3NlZFNoaWZ0VGFiICYmIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICAgIC8vSWYgdGhlIEZvciBiYWNrIHRhYmJpbmcsIHdlIGp1bXBcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXghO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oY3VyclRhYkluZGV4ISk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBzZWF0bWFwIGFyZWFcbiAgICAgIGVsc2UgaWYgKGV2ZW50QXJlYSA9PSAnc2VhdG1hcCcpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHByZXNzZWRTaGlmdFRhYikge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnUFJFVl9UQUInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQoJ05FWFRfVEFCJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzYXRpb24gb2YgS2V5Ym9hcmQgU2VhdG1hcCBldmVudCBoYW5kbGluZyB0byBuYXZpZ2F0aW9uIGJldHdlZW4gZWFjaCBwbGFjZXMgaW5zaWRlIGEgc2VsZWN0ZWQgY29hY2ggYnkgdXNpbmcgW2Fycm93XSBrZXlzLlxuICAgKiBXaXRoIHRoZSBbVEFCXSBrZXkgdGhlIHVzZXIgbmF2aWdhdGlvbiBnb2VzIHRvIHRoZSBuZXh0IGNvYWNoIG5hdmlnYXRpb24gZWxlbWVudCBhbmQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZSBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGtleWJvYXJkU2VhdG1hcEV2ZW50SGFuZGxpbmcoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpc1RhYk5leHQgPSBldmVudC5rZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLlRhYjtcbiAgICBjb25zdCBpc1RhYlByZXYgPSBldmVudC5zaGlmdEtleSAmJiBpc1RhYk5leHQ7XG5cbiAgICAvLyBJZiBubyBuYXZpZ2F0aW9uIGV4aXN0IGFuZCB0aGUgZmlyc3Qgb3IgbGFzdCBjb2FjaCBpcyBzZWxlY3RlZCwgdGhlIHRoZSB1c2UgdHJpZXMgdG8gbGVhdmUgdGhlIHNlYXQgcmVzZXJ2YXRpb24gY29tcG9uZW50IGJ5IHVzaW5nIHRhYixcbiAgICAvLyBzbyB3ZSBjYW4gcmV0dXJuIGhlcmUgYW5kIGFsbG93IHRoZSBuYXRpdmUgZm9jdXMgdG8gbGVhdmUgdGhlIGNvbXBvbmVudC5cbiAgICBpZiAoXG4gICAgICAoIXRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IDAgJiYgaXNUYWJQcmV2KSB8fFxuICAgICAgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMSAmJiBpc1RhYk5leHQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc3NlZEtleSA9IGV2ZW50LmtleTtcbiAgICB0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljayA9IGZhbHNlO1xuICAgIC8vIENoZWNrIGFueSBrZXlib2FyZCBldmVudCB3YXMgdHJpZ2dlcmVkIGluc2lkZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQsXG4gICAgLy8gc28gd2UgY2FuIHNheSB0aGUgbmF0aXZlIGJyb3dzZXIgZm9jdXMgbGllcyBvbiB0aGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzICYmIChpc1RhYk5leHQgfHwgaXNUYWJQcmV2KSkge1xuICAgICAgdGhpcy5oYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgYW55IHBsYWNlIGlzIHNlbGVjdGVkIGFuZCBUQUIgS2V5IGNvbWJpbmF0aW9uIGlzdCBwcmVzc2VkLFxuICAgIC8vIHRoZW4gd2UgaGFuZGxlIHRoZSBuZXh0IG9yIHByZXZpb3VzIGNvYWNoIHNlbGVjdGlvblxuICAgIGlmIChpc1RhYk5leHQpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICdzZWF0bWFwJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXJyb3cgS2V5Ym9hcmQgbmF2aWdhdGlvbiB0byBjb250cm9sIHBsYWNlcyBpbnNpZGUgdGhlIHNlYXRtYXBcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSAmJiBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBzd2l0Y2ggKHByZXNzZWRLZXkpIHtcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZExlZnRLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd25cbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkTGVmdEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRSaWdodEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXBcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkUmlnaHRLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkVXBLZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICAgICAgICAgICAgOiBwcmVzc2VkS2V5O1xuICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGVUb1BsYWNlQnlLZXlib2FyZChwcmVzc2VkVXBLZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWREb3duS2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWREb3duS2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgcGxhY2UgaW5zaWRlIHRoZSBjb2FjaCBpZiBuYXZpZ2F0ZWQgdmlhIGtleWJvYXJkLFxuICAgKiBvdGhlcndpc2UgdGhlIGNvYWNoIGdyaWQgaXMgc2VsZWN0ZWQgKG5lY2Vzc2FyeSBmb3IgU2NyZWVuUmVhZGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIHByZXNlbGVjdFBsYWNlSW5Db2FjaCgpOiB2b2lkIHtcbiAgICAvLyBObyBwcmVzZWxlY3QgcGxhY2UgYnkgbWFudWFsIHNlYXRtYXAgc2Nyb2xsaW5nXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykgcmV0dXJuO1xuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudERpbWVuc2lvbi53LFxuICAgICAgaDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLmgsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLngsXG4gICAgICB5OiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnRQb3NpdGlvbi55LFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+fVxuICAgICAqIEVtaXRzIHdoZW4gYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBQbGFjZSBhcnJheSB3aXRoIGFsbCBzZWxlY3RlZCBwbGFjZXMuXG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzPignc2VsZWN0ZWRwbGFjZXMnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3BsYWNlRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdLnBsYWNlcz8uZmluZChcbiAgICAgIChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09IHBsYWNlU2VsZWN0aW9uLm51bWJlcixcbiAgICApO1xuXG4gICAgaWYgKCFwbGFjZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBwbGFjZURlY2tJbmRleDtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBjb2FjaEluZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcblxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2UpO1xuXG4gICAgLy8gVGltZSBkZWxheSB0byB3YWl0IGZvciBzdGF0dXMgdXBkYXRlIHByb2Nlc3MgYXQgY2xpY2tlZCBwbGFjZVxuICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk6IHZvaWQge1xuICAgIC8vT25seSBpZiB0aGUgc2VsZWN0ZWRDb2FjaEluZGV4IGhhcyBjaGFuZ2VkLCBhbiB1cGRhdGUgbmVlZHMgdG8gYmUgY2FycmllZCBvdXRcbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KSByZXR1cm47XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgY29uc3QgY29hY2hTZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4KTtcbiAgICBpZiAoY29hY2hTZWxlY3Rpb24pIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+fVxuICAgICAgICogRW1pdHMgd2hlbiBhIGNvYWNoIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIENvYWNoU2VsZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2g+KCdzZWxlY3RlZGNvYWNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBjb2FjaFNlbGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQbGFjZUVsZW1lbnRJZChcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyLFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgICBwbGFjZU51bWJlcjogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnc2VhdC1yZXNlcnZhdGlvbl9fcGxhY2UtYnV0dG9uLScgKyBjb2FjaERlY2tJbmRleCArICctJyArIGNvYWNoSW5kZXggKyAnLScgKyBwbGFjZU51bWJlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIGNhc2Ugb2YgY29hY2ggbGF5b3V0cyB3aXRoIGRpZmZlcmVudCBkZWNrcyxcbiAgICogaXQgaXMgbmVjZXNzYXJ5IHRvIGV4dGVuZCB0aGUgb2Zmc2V0IHdpdGggZW1wdHkgY29hY2hlc1xuICAgKiBpbiBvcmRlciB0byBjcmVhdGUgYSBzdGFibGUgdmVoaWNsZSBsYXlvdXQuXG4gICAqXG4gICAqICAgICAgICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqL1xuICBwcml2YXRlIF9pbml0RW1wdHlDb2FjaERlY2tPZmZzZXRzKCk6IHZvaWQge1xuICAgIC8vIFByZWZpbGwgb2Zmc2V0IGNvdW50ZXJzIHdpdGggMCBzdGFydCBpbmRleFxuICAgIGNvbnN0IGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyID0gQXJyYXkodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpLmZpbGwoMCk7XG4gICAgLy8gVGFrZXMgdGhlIGxvd2VyIGRlY2sgd2hpY2ggY29udGFpbnMgdGhlIG1heCBudW1iZXJzIG9mIGNvYWNoZXNcbiAgICBjb25zdCBsb3dlckRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdO1xuXG4gICAgbG93ZXJEZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgobG93ZXJDb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlY2tDb2FjaEl0ZW0gPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbaV0uY29hY2hJdGVtc1tjb2FjaE9mZnNldEluZGV4Q291bnRlcltpXV07XG4gICAgICAgIGlmIChsb3dlckNvYWNoSXRlbS5pZCAhPSBkZWNrQ29hY2hJdGVtPy5pZCkge1xuICAgICAgICAgIC8vIEFkZCBFbXB0eSBvZmZzZXQgY29hY2ggdG8gc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgZW1wdHlPZmZzZXRDb2FjaCA9IHtcbiAgICAgICAgICAgIC4uLmxvd2VyQ29hY2hJdGVtLFxuICAgICAgICAgICAgcGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9wZXJ0eUlkczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY0VsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRyYXZlbENsYXNzOiBbXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zLnNwbGljZShcbiAgICAgICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVtcHR5T2Zmc2V0Q29hY2gsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldKys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gb2YgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gQXJyYXkgYmFzZWQgb24gdGhlIHRyYW5zZmVycmVkIHBsYWNlc1xuICAgKiB0aGF0IGhhdmUgdGhlIHN0YXRlIFNFTEVDVEVEIHdpdGhpbiB0aGUgc2VhdFJlc2VydmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IHBsYWNlIHNlbGVjdGlvbnNcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLnNlYXRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcyA9IFtdO1xuXG4gICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgY29hY2hEZWNrSW5kZXg6IG51bWJlcikgPT5cbiAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zLm1hcCgoY29hY2g6IENvYWNoSXRlbSwgY29hY2hJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvYWNoLnBsYWNlc1xuICAgICAgICAgID8uZmlsdGVyKChwbGFjZSkgPT4gcGxhY2Uuc3RhdGUgPT09ICdTRUxFQ1RFRCcpXG4gICAgICAgICAgPy5mb3JFYWNoKChwbGFjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VJZCA9IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoY29hY2hEZWNrSW5kZXgsIGNvYWNoSW5kZXgsIHBsYWNlLm51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBwcmVzZWxlY3RlZFBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbiA9IG1hcFBsYWNlSW5mb3NUb1BsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgICAgICBwbGFjZSxcbiAgICAgICAgICAgICAgcGxhY2VJZCxcbiAgICAgICAgICAgICAgc2VhdFJlc2VydmF0aW9uLmRlY2tDb2FjaEluZGV4LFxuICAgICAgICAgICAgICBjb2FjaEluZGV4LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb246IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCA9XG4gICAgICAgICAgICAgIHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb24sIGNvYWNoRGVja0luZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMucHVzaChzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5iaWN5Y2xlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgc2VsZWN0ZWQgcGxhY2VzIHdpbGwgYmUgcmVzZXQgb3IgdGhlIGN1cnJlbnRTZWxlY3RlZFBsYWNlIHdhcyBnaXZlbiwgdGhlbiB3ZSByZXNldCBhbGwgZXhjZXB0IGN1cnJlbnRTZWxlY3RlZFBsYWNlXG4gICAqIEBwYXJhbSByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uc1xuICAgKiBAcGFyYW0gY3VyclNlbGVjdGVkUGxhY2VcbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdLFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlPzogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vRmluZCBhbGwgcGxhY2VzIHRvIGJlIG5lZWRlZCB1bnNlbGVjdFxuICAgIGZvciAoY29uc3QgcGxhY2VTZWxlY3Rpb24gb2YgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMpIHtcbiAgICAgIGlmICghY3VyclNlbGVjdGVkUGxhY2UgfHwgY3VyclNlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQocGxhY2VTZWxlY3Rpb24uaWQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAocGxhY2VFbGVtZW50KSB7XG4gICAgICAgICAgcGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3RhdGUnLCAnRlJFRScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcGxhY2VzIGV4Y2VwdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgaWYgKGN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCA9PT0gY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2VTZWxlY3Rpb24sXG4gICAgY29hY2hEZWNrSW5kZXg6IG51bWJlciB8IG51bGwsXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKGNvYWNoRGVja0luZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2NvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmRlY2tJbmRleCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4LFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzID0gdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKGNvYWNoLnBsYWNlcyk7XG4gICAgcmV0dXJuIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uKGNvYWNoSW5kZXgsIGNvYWNoLCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCA9IHBsYWNlXG4gICAgICA/IHRoaXMuZ2V0UGxhY2VFbGVtZW50SWQoXG4gICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgIHBsYWNlLm51bWJlcixcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmF0aW9uIG9mIHRoZSB1c2VkIGRvY3VtZW50cyBmb250LXNpemUgd2hpY2ggbmVlZHNcbiAgICogdG8gYmUgZGV0ZXJtaW5lZCBpbiBvcmRlciB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIENTUyB2YWx1ZXMgd2l0aCByZW1cbiAgICogKi9cbiAgcHJpdmF0ZSBfZGV0ZXJtaW5lQmFzZUZvbnRTaXplKCk6IHZvaWQge1xuICAgIGlmICghaXNTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGJhc2VGb250U2l6ZSA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmZvbnRTaXplLCAxMCk7XG4gICAgICAvL2NhbGN1bGF0ZSByZW0gb2YgMXB4XG4gICAgICBjb25zdCBvbmVQaXhlbEluUmVtID0gMSAvIGJhc2VGb250U2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLW9uZS1weC1yZW0nLCBgJHtvbmVQaXhlbEluUmVtICsgJ3JlbSd9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGRhdGEgZm9yIGRpc3BsYXlpbmcgbmF2aWdhdGlvbiBhcmVhLlxuICAgKiBDYWxjdWxhdGVzIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBnb2luZyB0byBjaGFuZ2UgZHVyaW5nIHVzZSBvZiBhIGNvbXBvbmVudDpcbiAgICogICAgLSBjb2FjaCBpZFxuICAgKiAgICAtIGxpc3Qgb2Ygc2VydmljZSBpY29uc1xuICAgKiAgICAtIGNsYXNzIChmaXJzdCwgc2Vjb25kLCBhbnkpXG4gICAqICAgIC0gd2hldGhlciB0aGVyZSBpcyBhIGRyaXZlciBhcmVhIGxlZnQgb3IgcmlnaHRcbiAgICogKi9cbiAgcHJpdmF0ZSBfcHJlcGFyZUNvYWNoSXRlbURldGFpbHNEYXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxvd2VyRGVjazogQ29hY2hJdGVtW10gPVxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXM7XG5cbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzID0gW107XG5cbiAgICAgIGxvd2VyRGVjay5mb3JFYWNoKChjb2FjaCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdID0gW107XG4gICAgICAgIGNvbnN0IHByb3BlcnR5SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBwbGFjZXM6IFBsYWNlW10gPSBbXTtcblxuICAgICAgICAvLyBDb2xsZWN0IGFsbCBpbXBvcnRhbnQgbmF2aWdhdGlvbiBkYXRhIHRvIGJlIHJlbmRlcmVkXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5tYXAoKHNyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3IuY29hY2hJdGVtc1tpbmRleF07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaCgoY29hY2g6IENvYWNoSXRlbSkgPT4ge1xuICAgICAgICAgICAgdHJhdmVsQ2xhc3Nlcy5wdXNoKC4uLmNvYWNoLnRyYXZlbENsYXNzKTtcbiAgICAgICAgICAgIHByb3BlcnR5SWRzLnB1c2goLi4uKGNvYWNoLnByb3BlcnR5SWRzID8gY29hY2gucHJvcGVydHlJZHMgOiBbXSkpO1xuICAgICAgICAgICAgcGxhY2VzLnB1c2goLi4uKGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcyA6IFtdKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGNvYWNoLmlkLFxuICAgICAgICAgIHRyYXZlbENsYXNzOiB0aGlzLl9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXMpLFxuICAgICAgICAgIHByb3BlcnR5SWRzOiB0aGlzLl9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbihwcm9wZXJ0eUlkcyksXG4gICAgICAgICAgaXNEcml2ZXJBcmVhOiBjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMubGVuZ3RoID09PSAwIDogdHJ1ZSxcbiAgICAgICAgICBkcml2ZXJBcmVhU2lkZTogdGhpcy5fcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihjb2FjaCksXG4gICAgICAgICAgZnJlZVBsYWNlczogdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKHBsYWNlcyksXG4gICAgICAgICAgZHJpdmVyQXJlYUVsZW1lbnRzOiB0aGlzLl9zZXREcml2ZXJBcmVhc0VsZW1lbnRzKGNvYWNoKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSk6IFBsYWNlVHJhdmVsQ2xhc3Mge1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ0ZJUlNUJykgIT09IC0xKSByZXR1cm4gJ0ZJUlNUJztcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdTRUNPTkQnKSAhPT0gLTEpIHJldHVybiAnU0VDT05EJztcbiAgICByZXR1cm4gJ0FOWV9DTEFTUyc7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKFxuICAgIGNvYWNoSXRlbTogQ29hY2hJdGVtLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29hY2hEcml2ZXJBcmVhcyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgIChncmFwaGljYWxFbGVtZW50cykgPT4gZ3JhcGhpY2FsRWxlbWVudHMuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBJyxcbiAgICApO1xuXG4gICAgaWYgKGNvYWNoRHJpdmVyQXJlYXMgJiYgY29hY2hEcml2ZXJBcmVhcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDaGVja2luZyB0aGUgZHJpdmVyIGFyZWEgcG9zaXRpb24gd2hldGhlciBpdCBpcyBwcmVzZW50IG9uIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgaW4gYSBjb2FjaFxuICAgICAgY29uc3QgaGFzTGVmdERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB8fCBmYWxzZTtcbiAgICAgIGNvbnN0IGhhc1JpZ2h0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPiAwKSB8fCBmYWxzZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogISFoYXNMZWZ0RHJpdmVyQXJlYSxcbiAgICAgICAgcmlnaHQ6ICEhaGFzUmlnaHREcml2ZXJBcmVhLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uID0gKHByb3BlcnR5SWRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgICBpZiAoIXByb3BlcnR5SWRzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc2hydW5rUHJvcGVydHlJZHMgPSBwcm9wZXJ0eUlkc1xuICAgICAgPy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5SWQ6IHN0cmluZyk6IHtcbiAgICAgICAgcElkOiBzdHJpbmc7XG4gICAgICAgIHN2Z05hbWU6IHN0cmluZztcbiAgICAgIH0ge1xuICAgICAgICAvLyBwcmVwYXJlIHRlbXBvcmFyeSBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBpZCB0byBpdCdzIHN2Z05hbWUgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgbGlzdCBvZiBhbGxvd2VkIGljb25zXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcElkOiBwcm9wZXJ0eUlkLFxuICAgICAgICAgIHN2Z05hbWU6IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA/IG1hcEljb25Ub1N2Z1twcm9wZXJ0eUlkXT8uc3ZnTmFtZSA6ICcnLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC8vZmlsdGVyIG91dCBvYmplY3RzIHNlcnZpY2UgaWNvbnMgd2hpY2ggYXJlIG5vdCBpbiBBTExPV0VEX1NFUlZJQ0VfSUNPTlNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5VG9TdmcpID0+IEFMTE9XRURfU0VSVklDRV9JQ09OUy5pbmRleE9mKHByb3BlcnR5VG9Tdmcuc3ZnTmFtZSkgIT09IC0xKVxuICAgICAgLy9tYWtlIGl0IGRpc3RpbmN0IGJ5IHN2Z05hbWVcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgc2VsZi5tYXAoKHByb3BTdmcpID0+IHByb3BTdmcuc3ZnTmFtZSkuaW5kZXhPZih2YWx1ZS5zdmdOYW1lKSA9PT0gaW5kZXgsXG4gICAgICApXG4gICAgICAvLyBnbyBiYWNrIHRvIHByb3BlcnR5SWQgc3RyaW5nIGZyb20gdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgLm1hcCgocHJvcGVydHlUb1N2ZykgPT4gcHJvcGVydHlUb1N2Zy5wSWQpXG4gICAgICAvLyB0YWtlIGZpcnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZnJvbSBCYWNrZW5kLCBvdGhlcndpc2UgdGhlIGxheW91dCBjb3VsZCBiZSBkZXN0cm95ZWRcbiAgICAgIC5zbGljZSgwLCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTKTtcbiAgICByZXR1cm4gc2hydW5rUHJvcGVydHlJZHMgPyBzaHJ1bmtQcm9wZXJ0eUlkcyA6IFtdO1xuICB9O1xuXG4gIHByaXZhdGUgX3ByZXBhcmVDb2FjaFdpZHRoQW5kR2FwQ2FsY3VsYXRpb25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGNvYWNoSXRlbXM6IENvYWNoSXRlbVtdID1cbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXT8uY29hY2hJdGVtcztcblxuICAgICAgY29hY2hJdGVtcz8uZm9yRWFjaCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgaGFzT3ZlcmhhbmdpbmdQbGFjZXMgPSB0aGlzLl9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24udyxcbiAgICAgICAgICBjb2FjaEl0ZW0ucGxhY2VzLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vTXVzdCAgYmUgZG9uZSBhbHNvIGZvciBncmFwaGljYWwgZWxlbWVudHMsIGFzIHRoZXkgY2FuIGFsc28gcHJvdHJ1ZGUgdGhlIGNvYWNoIGJvcmRlclxuICAgICAgICAvLyBDaGVjayBvbmx5IGdyYXBoaWNhbCBlbGVtZW50cyB0aGF0IGFyZSBub3QgYXJlYSBlbGVtZW50c1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgICAgIChlKSA9PiBlLmljb24gJiYgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGUuaWNvbiksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaGFzT3ZlcmhhbmdpbmdHcmFwaGljQXJlYXMgPSB0aGlzLl9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24udyxcbiAgICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3ZlckhhbmdpbmdFbGVtZW50SW5mb3JtYXRpb24ucHVzaCh7XG4gICAgICAgICAgY29hY2hJZDogY29hY2hJdGVtLmlkLFxuICAgICAgICAgIG92ZXJoYW5naW5nUGxhY2VzOiBoYXNPdmVyaGFuZ2luZ1BsYWNlcyxcbiAgICAgICAgICBvdmVyaGFuZ2luZ0dyYXBoaWNBcmVhczogaGFzT3ZlcmhhbmdpbmdHcmFwaGljQXJlYXMsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UgSFRNTCBlbGVtZW50IGJ5IGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkLlxuICAgKiBAcmV0dXJucyBIVE1MRWxlbWVudCBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRQbGFjZUh0bWxFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWRcbiAgICAgID8gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKSB8fCBudWxsXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXh0cmFjdGVkIGNvYWNoIGRlY2sgaW5kZXggZnJvbSBwbGFjZSBpZFxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZUlkOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBkZWNrSW5kZXggPSB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8ucXVlcnlTZWxlY3RvcignIycgKyBwbGFjZUlkKVxuICAgICAgPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGVjay1pbmRleCcpO1xuICAgIGlmIChkZWNrSW5kZXggJiYgIWlzTmFOKCtkZWNrSW5kZXgpKSB7XG4gICAgICByZXR1cm4gK2RlY2tJbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pc1ZhbGlkQ29hY2hJbmRleChjb2FjaEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJbmRleCA+PSAwICYmXG4gICAgICBjb2FjaEluZGV4IDw9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcy5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZXhpc3RpbmcgY29hY2ggZGVjayBpbmRleCBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBuZWNlc3NhcnkgdG8gZ2V0IGFuIGF2YWlsYWJsZSBjb2FjaCBkZWNrIGluZGV4IGR1cmluZyBrZXlib2FyZCBuYXZpZ2F0aW9uLCB3aGljaCBjYW4gdmFyeSBiZXR3ZWVuIGNvYWNoZXMgd2l0aCBkaWZmZXJlbnQgZGVja3MuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIG5hdmlnYXRpbmcgZnJvbSBhIGNvYWNoIHdpdGggdHdvIGRlY2tzIHRvIGEgY29hY2ggd2l0aCBvbmUgZGVjay5cbiAgICpcbiAgICogICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICpcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF1cbiAgICAgICAgLnBsYWNlcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXg7XG4gICAgfVxuXG4gICAgLy8gRmluZCBuZXh0IHBvc3NpYmxlIGNvYWNoIGRlY2sgaW5kZXggd2hlcmUgcGxhY2VzIGV4aXN0XG4gICAgY29uc3QgbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4ID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZpbmRJbmRleChcbiAgICAgIChzZWF0UmVzZXJ2YXRpb24pID0+XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbi5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0ucGxhY2VzICE9PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPj0gbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4XG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XG4gICAgICA6IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIHNlbGVjdGVkIHBsYWNlIGlzIHNsaWdodGx5IGhpZGRlbiBieSB0aGUgb3ZlcmZsb3cgc2Nyb2xsIGNvbnRlbnQgYW5kIGlzIHN0aWxsIGNsaWNrZWQsXG4gICAqIHRoZSBtZXRob2QgdHJpZXMgdG8gc2Nyb2xsIHRoZSBzZWxlY3RlZCBwbGFjZSBpbnRvIHRoZSBuZWFyZXN0IHZpZXdwb3J0LCBzbyB0aGF0IGl0IGlzIGNvbXBsZXRlbHkgdmlzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHBsYWNlSWRcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydChwbGFjZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3RcbiAgICAgID8uZ2V0RWxlbWVudEJ5SWQocGxhY2VJZClcbiAgICAgID8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcsIGlubGluZTogJ25lYXJlc3QnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrcyBpZiBhbnkgcGxhY2VzIG9yIGdyYXBoaWNhbCBlbGVtZW50cyAoZS5nLiB0b2lsZXQgYXJlYSwgZXRjLikgYXJlIG92ZXJoYW5naW5nIHRoZSBjb2FjaCBib3JkZXJzXG4gICAqIEBwYXJhbSBjb2FjaEl0ZW1XaWR0aFxuICAgKiBAcGFyYW0gZWxlbWVudHNcbiAgICovXG4gIHByaXZhdGUgX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgY29hY2hJdGVtV2lkdGg6IG51bWJlcixcbiAgICBlbGVtZW50czogKFBsYWNlIHwgQmFzZUVsZW1lbnQpW10gfCB1bmRlZmluZWQsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlbGVtZW50cz8uc29tZShcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC5wb3NpdGlvbi54ID09PSAwIHx8IGVsZW1lbnQucG9zaXRpb24ueCArIGVsZW1lbnQuZGltZW5zaW9uLncgPj0gY29hY2hJdGVtV2lkdGgsXG4gICAgICApID8/IGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXJBcmVhcyBmb3Igb25lIGNvYWNoXG4gICAqIEBwYXJhbSBjb2FjaEl0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX3NldERyaXZlckFyZWFzRWxlbWVudHMoY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiB7XG4gICAgZHJpdmVyQXJlYTogQmFzZUVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsOiBCYXNlRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgfSB7XG4gICAgaWYgKGNvYWNoSXRlbSkge1xuICAgICAgY29uc3QgZHJpdmVyQXJlYSA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsID1cbiAgICAgICAgY29hY2hJdGVtLnR5cGUgPT09ICdMT0NPTU9USVZFX0NPQUNIJ1xuICAgICAgICAgID8gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmluZChcbiAgICAgICAgICAgICAgKGVsZW1lbnQ6IEJhc2VFbGVtZW50KSA9PiBlbGVtZW50Lmljb24gPT09ICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZHJpdmVyQXJlYTogZHJpdmVyQXJlYSxcbiAgICAgICAgZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsOiBkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkcml2ZXJBcmVhOiB1bmRlZmluZWQsXG4gICAgICBkcml2ZXJBcmVhTm9WZXJ0aWNhbFdhbGw6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGNhbGxlZCB3aGVuIHRoZSBTZWF0UmVzZXJ2YXRpb24gbG9zZXMgZm9jdXMsIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHRhYnMgb3V0IG9yIGNsaWNrcyBzb21ld2hlcmUgZWxzZS5cbiAgICogVGhlbiB3ZSByZXNldCB0aGUgZm9jdXNlZCBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQThCQSxJQUFLO0NBQUwsU0FBSyxpQkFBZTtBQUNsQixpQkFBQSxXQUFBO0FBQ0EsaUJBQUEsVUFBQTtHQUZHLG9CQUFBLGtCQUFlLEVBQUEsRUFBQTtBQVdwQixJQUFNLHlCQUF5QjtBQUMvQixJQUFNLHdCQUFrQztDQUN0QztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0lBRVksb0NBQTBCO21CQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FBbkMsbUNBQW1DLFlBQVU7OzttQ0FPdkQsU0FBUztJQUFFLFdBQVc7SUFBcUIsTUFBTTtJQUFPLENBQUMsQ0FBQTtrQ0FJekQsU0FBUztJQUFFLFdBQVc7SUFBb0IsTUFBTTtJQUFRLENBQUMsQ0FBQTtnQ0FJekQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQWtCLE1BQU07SUFBUyxDQUFDLENBQUE7Z0NBSXhELFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVMsU0FBUztJQUFNLFlBQVk7SUFBTSxDQUFDLENBQUE7K0JBSXpGLFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVEsQ0FBQyxDQUFBO3lCQUl2RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBVSxNQUFNO0lBQVEsQ0FBQyxDQUFBO3NDQUkvQyxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBeUIsTUFBTTtJQUFRLENBQUMsQ0FBQTt5Q0FJOUQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQTRCLE1BQU07SUFBUSxDQUFDLENBQUE7b0NBSWpFLFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUF1QixNQUFNO0lBQVMsQ0FBQyxDQUFBO3NDQUc3RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBeUIsTUFBTTtJQUFRLENBQUMsQ0FBQTtnQ0FJOUQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQW1CLE1BQU07SUFBUyxDQUFDLENBQUE7cUNBR3pELE9BQU8sQ0FBQTtvQ0FDUCxPQUFPLENBQUE7b0NBQ1AsT0FBTyxDQUFBO3FDQTRPUCxhQUFhLEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FBQTtBQWhTaEMsZ0JBQUEsTUFBQSxNQUFBLDhCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsc0JBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBZ0IsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFoQixtQkFBZ0I7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxnQ0FBQSxvQ0FBQTtBQUloQyxnQkFBQSxNQUFBLE1BQUEsNkJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxxQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFlLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBZixrQkFBZTs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLCtCQUFBLG1DQUFBO0FBSy9CLGdCQUFBLE1BQUEsTUFBQSwyQkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLG1CQUFBO0tBQUEsTUFBQSxRQUFBLElBQWdCO0tBQWEsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFiLGdCQUFhOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsNkJBQUEsaUNBQUE7QUFLN0IsZ0JBQUEsTUFBQSxNQUFBLDJCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsbUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBYSxNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQWIsZ0JBQWE7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSw2QkFBQSxpQ0FBQTtBQUs3QixnQkFBQSxNQUFBLE1BQUEsMEJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxrQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFZLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBWixlQUFZOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsNEJBQUEsZ0NBQUE7QUFLNUIsZ0JBQUEsTUFBQSxNQUFBLG9CQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsWUFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFNLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBTixTQUFNOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsc0JBQUEsMEJBQUE7QUFLdEIsZ0JBQUEsTUFBQSxNQUFBLGlDQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEseUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBbUIsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFuQixzQkFBbUI7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxtQ0FBQSx1Q0FBQTtBQUtuQyxnQkFBQSxNQUFBLE1BQUEsb0NBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSw0QkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFzQixNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQXRCLHlCQUFzQjs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLHNDQUFBLDBDQUFBO0FBS3RDLGdCQUFBLE1BQUEsTUFBQSwrQkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLHVCQUFBO0tBQUEsTUFBQSxRQUFBLElBQWdCO0tBQWlCLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBakIsb0JBQWlCOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsaUNBQUEscUNBQUE7QUFJakMsZ0JBQUEsTUFBQSxNQUFBLGlDQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEseUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBZ0I7S0FBbUIsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFuQixzQkFBbUI7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxtQ0FBQSx1Q0FBQTtBQUtuQyxnQkFBQSxNQUFBLE1BQUEsMkJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxtQkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFhLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBYixnQkFBYTs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLDZCQUFBLGlDQUFBO0FBRXBCLGdCQUFBLE1BQUEsTUFBQSxnQ0FBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLHdCQUFBO0tBQUEsTUFBQSxRQUFBLElBQW1CO0tBQWtCLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBbEIscUJBQWtCOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsa0NBQUEsc0NBQUE7QUFDckMsZ0JBQUEsTUFBQSxNQUFBLCtCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsdUJBQUE7S0FBQSxNQUFBLFFBQUEsSUFBbUI7S0FBaUIsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFqQixvQkFBaUI7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxpQ0FBQSxxQ0FBQTtBQUNwQyxnQkFBQSxNQUFBLE1BQUEsK0JBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSx1QkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFtQjtLQUFpQixNQUFBLEtBQUEsVUFBQTtBQUFBLFVBQWpCLG9CQUFpQjs7S0FBQTtJQUFBLFVBQUE7SUFBQSxFQUFBLGlDQUFBLHFDQUFBO0FBNk83QyxnQkFBQSxNQUFBLE1BQUEsZ0NBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSx3QkFBQTtLQUFBLE1BQUEsUUFBQSxJQUFVO0tBQWtCO0lBQUEsVUFBQTtJQUFBLEVBQUEsTUFBQSwyQkFBQTs7Ozs7Ozs7O0FBeFNMLFFBQUEsU0FBUztJQUM5QixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNQOztFQUlWOztFQUFBLElBQWdCLG1CQUFnQjtBQUFBLFVBQUEsTUFBQTs7RUFBaEMsSUFBZ0IsaUJBQWdCLE9BQUE7QUFBQSxTQUFBLG9DQUFBOztFQUloQzs7RUFBQSxJQUFnQixrQkFBZTtBQUFBLFVBQUEsTUFBQTs7RUFBL0IsSUFBZ0IsZ0JBQWUsT0FBQTtBQUFBLFNBQUEsbUNBQUE7O0VBSy9COztFQUFBLElBQWdCLGdCQUFhO0FBQUEsVUFBQSxNQUFBOztFQUE3QixJQUFnQixjQUFhLE9BQUE7QUFBQSxTQUFBLGlDQUFBOztFQUs3Qjs7RUFBQSxJQUFnQixnQkFBYTtBQUFBLFVBQUEsTUFBQTs7RUFBN0IsSUFBZ0IsY0FBYSxPQUFBO0FBQUEsU0FBQSxpQ0FBQTs7RUFLN0I7O0VBQUEsSUFBZ0IsZUFBWTtBQUFBLFVBQUEsTUFBQTs7RUFBNUIsSUFBZ0IsYUFBWSxPQUFBO0FBQUEsU0FBQSxnQ0FBQTs7RUFLNUI7O0VBQUEsSUFBZ0IsU0FBTTtBQUFBLFVBQUEsTUFBQTs7RUFBdEIsSUFBZ0IsT0FBTSxPQUFBO0FBQUEsU0FBQSwwQkFBQTs7RUFLdEI7O0VBQUEsSUFBZ0Isc0JBQW1CO0FBQUEsVUFBQSxNQUFBOztFQUFuQyxJQUFnQixvQkFBbUIsT0FBQTtBQUFBLFNBQUEsdUNBQUE7O0VBS25DOztFQUFBLElBQWdCLHlCQUFzQjtBQUFBLFVBQUEsTUFBQTs7RUFBdEMsSUFBZ0IsdUJBQXNCLE9BQUE7QUFBQSxTQUFBLDBDQUFBOztFQUt0Qzs7RUFBQSxJQUFnQixvQkFBaUI7QUFBQSxVQUFBLE1BQUE7O0VBQWpDLElBQWdCLGtCQUFpQixPQUFBO0FBQUEsU0FBQSxxQ0FBQTs7RUFJakM7RUFBQSxJQUFnQixzQkFBbUI7QUFBQSxVQUFBLE1BQUE7O0VBQW5DLElBQWdCLG9CQUFtQixPQUFBO0FBQUEsU0FBQSx1Q0FBQTs7RUFLbkM7O0VBQUEsSUFBZ0IsZ0JBQWE7QUFBQSxVQUFBLE1BQUE7O0VBQTdCLElBQWdCLGNBQWEsT0FBQTtBQUFBLFNBQUEsaUNBQUE7O0VBRXBCO0VBQUEsSUFBbUIscUJBQWtCO0FBQUEsVUFBQSxNQUFBOztFQUFyQyxJQUFtQixtQkFBa0IsT0FBQTtBQUFBLFNBQUEsc0NBQUE7O0VBQ3JDO0VBQUEsSUFBbUIsb0JBQWlCO0FBQUEsVUFBQSxNQUFBOztFQUFwQyxJQUFtQixrQkFBaUIsT0FBQTtBQUFBLFNBQUEscUNBQUE7O0VBQ3BDO0VBQUEsSUFBbUIsb0JBQWlCO0FBQUEsVUFBQSxNQUFBOztFQUFwQyxJQUFtQixrQkFBaUIsT0FBQTtBQUFBLFNBQUEscUNBQUE7O0VBbUU3QyxjQUFBO0FBQ0UsVUFBTztBQXhITyxTQUFBLHFDQVJMLGtCQUFBLE1BQUEsMkJBQTBCLEVBQUEsa0JBQUEsTUFBQSxnQ0FRaUIsS0FBSztBQUkzQyxTQUFBLG9DQUFBLGtCQUFBLE1BQUEsb0NBQUEsRUFBQSxrQkFBQSxNQUFBLCtCQUFtQyxPQUFNO0FBS3pDLFNBQUEsa0NBQUEsa0JBQUEsTUFBQSxtQ0FBQSxFQUFBLGtCQUFBLE1BQUEsNkJBQXlCLEtBQUk7QUFLN0IsU0FBQSxrQ0FBQSxrQkFBQSxNQUFBLGlDQUFBLEVBQUEsa0JBQUEsTUFBQSw2QkFBeUIsTUFBSztBQUs5QixTQUFBLGlDQUFBLGtCQUFBLE1BQUEsaUNBQUEsRUFBQSxrQkFBQSxNQUFBLDRCQUF1QixHQUFFO0FBS3pCLFNBQUEsMkJBQUEsa0JBQUEsTUFBQSxnQ0FBQSxFQUFBLGtCQUFBLE1BQUEsc0JBQWlCLEtBQUs7QUFLdEIsU0FBQSx3Q0FBQSxrQkFBQSxNQUFBLDBCQUFBLEVBQUEsa0JBQUEsTUFBQSxtQ0FBOEIsR0FBRTtBQUtoQyxTQUFBLDJDQUFBLGtCQUFBLE1BQUEsdUNBQUEsRUFBQSxrQkFBQSxNQUFBLHNDQUFpQyxHQUFFO0FBS25DLFNBQUEsc0NBQUEsa0JBQUEsTUFBQSwwQ0FBQSxFQUFBLGtCQUFBLE1BQUEsaUNBQTZCLE1BQUs7QUFJbEMsU0FBQSx3Q0FBQSxrQkFBQSxNQUFBLHFDQUFBLEVBQUEsa0JBQUEsTUFBQSxtQ0FBOEIsR0FBRTtBQUtoQyxTQUFBLGtDQUFBLGtCQUFBLE1BQUEsdUNBQUEsRUFBQSxrQkFBQSxNQUFBLDZCQUF5QixNQUFLO0FBRWxCLFNBQUEsdUNBQUEsa0JBQUEsTUFBQSxpQ0FBQSxFQUFBLGtCQUFBLE1BQUEsa0NBQTZCLEdBQUU7QUFDL0IsU0FBQSxzQ0FBQSxrQkFBQSxNQUFBLHNDQUFBLEVBQUEsa0JBQUEsTUFBQSxpQ0FBNEIsR0FBRTtBQUM5QixTQUFBLHNDQUFBLGtCQUFBLE1BQUEscUNBQUEsRUFBQSxrQkFBQSxNQUFBLGlDQUE0QixHQUFFO0FBR2hELFFBQUEsc0JBQWtCLGtCQUFBLE1BQUEscUNBQUEsRUFBRztBQUVyQixRQUFBLG9CQUFvQjtBQUdwQixRQUFBLG9CQUFvQixLQUFLLHFCQUFxQixLQUFLO0FBRW5ELFFBQUEsdUJBQXVCO0FBRXZCLFFBQUEsb0JBQTRCO0FBQzVCLFFBQUEsMkJBQStDLEVBQUU7QUFDakQsUUFBQSxzQkFBdUMsZ0JBQWdCO0FBQ3ZELFFBQUEsc0JBQThCO0FBQzlCLFFBQUEseUJBQWlDO0FBQ2pDLFFBQUEsMEJBQWtDO0FBQ2xDLFFBQUEsa0NBQTZELEVBQUU7QUFDL0QsUUFBQSx1QkFBb0M7QUFDcEMsUUFBQSxrQkFBK0I7QUFDL0IsUUFBQSxvQkFBa0M7QUFDbEMsUUFBQSw2QkFBNEM7QUFDNUMsUUFBQSx5QkFBaUM7QUFDakMsUUFBQSx3QkFBZ0M7QUFDaEMsUUFBQSxpQ0FBMEM7QUFDMUMsUUFBQSxnQ0FBK0Q7SUFDdkUsT0FBTyxFQUFFO0lBQ1QsVUFBVSxFQUFBO0lBQ1g7QUFDUyxRQUFBLDJDQUEyQztBQUMzQyxRQUFBLHVCQUF1QjtBQUN2QixRQUFBLGtCQUFrQjtBQUNsQixRQUFBLHVCQUF1QjtBQUN2QixRQUFBLG1CQUFtQjtBQUNuQixRQUFBLGdDQUFnQztBQUNoQyxRQUFBLDJCQUEyQjtJQUNuQyxXQUFXO0lBQ1gsWUFBWTtJQUNaLFNBQVM7SUFDVCxXQUFXO0lBQ1gsS0FBSztJQUNMLE9BQU87SUFDQztBQUdBLFFBQUEsa0JBQWtCO0lBQzFCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDRDtBQUVTLFFBQUEsZ0NBSUosRUFBRTtBQUVBLFFBQUEsb0NBQW9DO0FBRXBDLFFBQUEsc0JBQXNCO0FBdzBDdEIsUUFBQSxrQ0FBa0MsZ0JBQW1DO0FBQzNFLFFBQUksQ0FBQyxZQUNILFFBQU8sRUFBRTtJQUdYLE1BQU0sb0JBQW9CLGFBQ3RCLElBQUksU0FBVSxZQUFrQjtBQUtoQyxZQUFPO01BQ0wsS0FBSztNQUNMLFNBQVMsYUFBYSxhQUFhLFVBQVUsYUFBYSxhQUFhLFVBQVU7TUFDbEY7TUFDRCxDQUVELFFBQVEsa0JBQWtCLHNCQUFzQixRQUFRLGNBQWMsUUFBUSxLQUFLLEdBQUcsQ0FFdEYsUUFDRSxPQUFPLE9BQU8sU0FDYixLQUFLLEtBQUssWUFBWSxRQUFRLFFBQVEsQ0FBQyxRQUFRLE1BQU0sUUFBUSxLQUFLLE1BQ3JFLENBRUEsS0FBSyxrQkFBa0IsY0FBYyxJQUFJLENBRXpDLE1BQU0sR0FBRyx1QkFBdUI7QUFDbkMsV0FBTyxvQkFBb0Isb0JBQW9CLEVBQUU7O0FBNzFDakQsUUFBSyxpQkFBaUIsY0FBYyxLQUFLLGtDQUFrQyxDQUFDOztFQUczRCxXQUFXLG1CQUF1QztBQUNuRSxTQUFNLFdBQVcsa0JBQWtCO0FBRW5DLE9BQUksa0JBQWtCLElBQUksbUJBQW1CLEVBQUU7QUFDN0MsU0FBSyxtQkFBbUIsS0FBSyxrQkFBa0IsU0FBUztBQUV4RCxTQUFLLGlDQUFpQztBQUN0QyxTQUFLLHNDQUFzQztBQUMzQyxTQUFLLG9DQUFvQztBQUN6QyxTQUFLLHNDQUFzQzs7QUFHN0MsT0FBSSxrQkFBa0IsSUFBSSxlQUFlLEVBQUU7QUFDekMsU0FBSyxvQkFBb0IsS0FBSyxxQkFBcUIsS0FBSztBQUN4RCxTQUFLLE9BQU8sWUFBWSxvQ0FBb0MsR0FBRyxLQUFLLGFBQVksSUFBSztBQUVyRixTQUFLLHNDQUFzQzs7QUFJN0MsT0FBSSxrQkFBa0IsSUFBSSxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssUUFBUTtJQUNwRCxNQUFNLHVCQUF1QixLQUFLLGlCQUFpQixLQUFLLDBCQUEwQjtBQUNsRixRQUFJLHNCQUFzQixXQUFXLFFBQVE7QUFDM0MsVUFBSyxlQUFlLEtBQUssU0FBUyxxQkFBcUIsV0FBVyxHQUFHLFVBQVU7QUFDL0UsVUFBSyxvQkFBb0IsS0FBSyxxQkFBcUIsS0FBSztBQUN4RCxVQUFLLE9BQU8sWUFBWSxvQ0FBb0MsR0FBRyxLQUFLLGFBQVksSUFBSztBQUVyRixVQUFLLHNDQUFzQzs7O0FBSS9DLE9BQUksa0JBQWtCLElBQUksZ0JBQWdCLElBQUksS0FBSyxjQUNqRCxNQUFLLHNDQUFzQztBQUc3QyxPQUFJLGtCQUFrQixJQUFJLHNCQUFzQixFQUFFO0FBR2hELFNBQUssb0NBQW9DO0FBQ3pDLHFCQUFpQixLQUFLLHlCQUF5QixLQUFLLG9CQUFvQixFQUFFLEVBQUU7OztFQUl0RSx1QkFBdUIsY0FBb0I7QUFDbkQsUUFBSyxxQkFBcUI7R0FDMUIsSUFBSSx1QkFBdUIsS0FBSztBQUNoQyxPQUFJLGdCQUFnQixvQkFBb0IsdUJBQXVCLEVBQzdELHdCQUNFLEtBQUssMEJBQTBCLEtBQUssS0FBSyx5QkFBeUIsSUFBSTtZQUV4RSxnQkFBZ0IscUJBQ2hCLHVCQUNFLEtBQUssaUJBQWlCLEtBQUssd0JBQXdCLFdBQVcsU0FBUyxFQUV6RSx3QkFDRSxLQUFLLDBCQUEwQixLQUFLLEtBQUsseUJBQXlCLElBQUk7QUFHMUUsUUFBSyx5QkFBeUIscUJBQXFCOzs7Ozs7RUFPN0Msa0NBQStCO0FBQ3JDLFFBQUssd0JBQXdCO0FBRTdCLE9BQUksS0FBSyxpQkFHUCxNQUFLLDRCQUE0QjtBQUduQyxRQUFLLDhCQUE4Qjs7O0VBSTNCLHVDQUFvQztBQUM1QyxRQUFLLGtCQUFrQixLQUFLLFlBQVksY0FDdEMsOEJBQ2M7QUFDaEIsUUFBSyx1QkFBdUIsS0FBSyxZQUFZLGNBQzNDLG1DQUNjO0dBRWhCLE1BQU0sc0JBQXNCLEtBQUssbUJBQzdCLEtBQUssaUJBQWlCLEtBQUsseUJBQzNCO0FBQ0osT0FBSSx1QkFBdUIsb0JBQW9CLFdBQVcsU0FBUyxHQUFHO0lBRXBFLE1BQU0sK0JBQ0osb0JBQW9CLFdBQVcsR0FBRyxVQUFVLElBQUksS0FBSyxlQUFlLEtBQUs7SUFJM0UsTUFBTSx3QkFBd0IsS0FBSyxpQkFBaUIsU0FBUyxLQUFLLEtBQUs7QUFFdkUsU0FBSyxPQUFPLFlBQ1YsaUNBQ0EsR0FBRywrQkFBK0IsS0FBSyxpQkFBaUIsU0FBUyx1QkFDbEU7QUFDRCxTQUFLLE9BQU8sWUFBWSxnQ0FBZ0MsR0FBRyxLQUFLLGlCQUFpQixTQUFTOztBQUc1RixPQUFJLEtBQUssc0JBQXNCO0FBQzdCLFNBQUssMEJBQTBCLEtBQUssZ0JBQ2hDLEtBQUsscUJBQXFCLHVCQUF1QixDQUFDLFNBQ2xELEtBQUsscUJBQXFCLHVCQUF1QixDQUFDO0lBR3RELE1BQU0saUJBQWlCLEtBQUsscUJBQXFCLGNBQWMsVUFBOEI7QUFDN0YsUUFBSSxnQkFBZ0I7S0FDbEIsTUFBTSxzQkFBc0IsZ0JBQWdCLHVCQUF1QjtBQUNuRSxVQUFLLG9CQUFvQixLQUFLLGdCQUMxQixvQkFBb0IsU0FDcEIsb0JBQW9COzs7QUFJNUIsT0FBSSxLQUFLLG1CQUFtQixxQkFBcUI7SUFFL0MsSUFBSSxxQkFBcUI7QUFDekIsU0FBSyx5QkFBeUIsS0FBSyxnQkFDL0IsS0FBSyxnQkFBZ0IsdUJBQXVCLENBQUMsU0FDN0MsS0FBSyxnQkFBZ0IsdUJBQXVCLENBQUM7QUFHakQsU0FBSyxrQ0FBa0Msb0JBQW9CLFdBQVcsS0FBSyxVQUFTO0tBQ2xGLE1BQU0sWUFBWTtLQUNsQixNQUFNLGFBQWEsS0FBSyx1QkFBdUIsTUFBTSxVQUFVLENBQUM7S0FJaEUsTUFBTSw4QkFBOEIsS0FBSyw4QkFBOEIsTUFDcEUsTUFBTSxFQUFFLFlBQVksTUFBTSxHQUM1QjtLQUNELE1BQU0sNkJBQ0osNkJBQTZCLHFCQUM3Qiw2QkFBNkI7QUFDL0IsMkJBQ0UsY0FDQyxDQUFDLDZCQUE2QixLQUFLLG9CQUFvQixJQUFJLEtBQUs7QUFFbkUsWUFBTztNQUNMLE9BQU87TUFDUCxLQUFLO01BQ0wsT0FBTztNQUNtQjtNQUM1QjtBQUdGLFNBQUssc0JBQXNCLHFCQUFxQixLQUFLOzs7Ozs7Ozs7RUFXL0MscUJBQWtCO0FBQzFCLE9BQUksS0FBSyxlQUdQLGNBQWEsS0FBSyxlQUFlO0FBR25DLFFBQUssaUJBQWlCLGlCQUFpQixLQUFLLGdDQUFnQyxFQUFFLElBQUk7Ozs7Ozs7O0VBUzFFLG1DQUFtQyxpQkFBdUI7QUFDbEUsT0FBSSxDQUFDLEtBQUssNENBQTRDLENBQUMsS0FBSyxlQUFlO0FBQ3pFLFNBQUssMkNBQTJDO0FBQ2hELFNBQUsseUJBQ0gsb0JBQW9CLElBQ2hCLEtBQUssMkJBQTJCLEdBQUcsR0FDbkMsS0FBSywyQkFBMkIsZ0JBQWdCO0FBQ3RELFNBQUssdUJBQXVCOzs7O0VBS3RCLDRCQUF5QjtBQUVqQyxRQUFLLG9CQUFvQjs7O0VBSWpCLDhCQUNSLE9BQ0EseUJBQStCO0FBRS9CLE9BQUksTUFBTSxRQUFRLEtBQUsseUJBQXlCLEtBQUs7QUFDbkQsU0FBSyx3QkFBd0IsT0FBTyxjQUFjLHdCQUF3QjtBQUMxRTs7QUFJRixPQUFJLDRCQUE0QixNQUFNLENBQ3BDLE1BQUssNkJBQTZCLE1BQU07OztFQUtwQyx3QkFDTixPQUNBLFdBQ0EsY0FBcUI7R0FFckIsTUFBTSxhQUFhLE1BQU07R0FDekIsTUFBTSxrQkFBa0IsTUFBTTtBQUU5QixPQUFJLGVBQWUsS0FBSyx5QkFBeUI7UUFHM0MsYUFBYSxjQUFjO0FBQzdCLFNBQUksZ0JBQWdCLEtBQUs7VUFFckIsQ0FBQyxLQUFLLHFCQUNOLENBQUMsbUJBQ0QsS0FBSyx5QkFBeUIsY0FBYyxnQkFDNUMsS0FBSyxxQkFBcUIsR0FFMUIsTUFBSyxvQkFBb0I7ZUFDaEIsbUJBQW1CLEtBQUssbUJBQW1CO0FBRXBELFlBQUssb0JBQW9CO0FBQ3pCLFlBQUssa0JBQWtCLEtBQUssa0JBQWtCOztXQUdoRCxNQUFLLG9CQUFvQjtBQUczQixVQUFLLGtDQUFrQyxhQUFjO2VBRzlDLGFBQWEsV0FBVztBQUMvQixXQUFNLGdCQUFnQjtBQUN0QixTQUFJLGdCQUNGLE1BQUssbUNBQW1DLFdBQVc7U0FFbkQsTUFBSyxtQ0FBbUMsV0FBVzs7Ozs7Ozs7RUFVakQsNkJBQTZCLE9BQW9CO0dBQ3pELE1BQU0sWUFBWSxNQUFNLFFBQVEsS0FBSyx5QkFBeUI7R0FDOUQsTUFBTSxZQUFZLE1BQU0sWUFBWTtBQUlwQyxPQUNHLENBQUMsS0FBSyxpQkFBaUIsS0FBSywyQkFBMkIsS0FBSyxhQUM1RCxLQUFLLDJCQUEyQixLQUFLLHlCQUF5QixTQUFTLEtBQUssVUFFN0U7R0FHRixNQUFNLGFBQWEsTUFBTTtBQUN6QixRQUFLLGlDQUFpQztBQUd0QyxPQUFJLENBQUMsS0FBSyxrQ0FBa0MsYUFBYSxXQUN2RCxNQUFLLGdDQUFnQztBQUt2QyxPQUFJLFdBQVc7QUFDYixTQUFLLHdCQUF3QixPQUFPLFVBQVU7QUFDOUM7O0FBSUYsT0FBSSxLQUFLLDJCQUEyQixNQUFNLDRCQUE0QixNQUFNLEVBQUU7QUFDNUUsVUFBTSxnQkFBZ0I7QUFFdEIsWUFBUSxZQUFSO0tBQ0UsS0FBSyxLQUFLLHlCQUF5QjtNQUNqQztPQUNFLE1BQU0sd0JBQWdDLEtBQUssZ0JBQ3ZDLEtBQUsseUJBQXlCLFlBQzlCO0FBQ0osWUFBSywyQkFBMkIsc0JBQXNCOztBQUV4RDtLQUNGLEtBQUssS0FBSyx5QkFBeUI7TUFDakM7T0FDRSxNQUFNLHlCQUFpQyxLQUFLLGdCQUN4QyxLQUFLLHlCQUF5QixVQUM5QjtBQUNKLFlBQUssMkJBQTJCLHVCQUF1Qjs7QUFFekQ7S0FDRixLQUFLLEtBQUsseUJBQXlCO01BQ2pDO09BQ0UsTUFBTSxzQkFBOEIsS0FBSyxnQkFDckMsS0FBSyx5QkFBeUIsWUFDOUI7QUFDSixZQUFLLDJCQUEyQixvQkFBb0I7O0FBRXREO0tBQ0YsS0FBSyxLQUFLLHlCQUF5QjtNQUNqQztPQUNFLE1BQU0sd0JBQWdDLEtBQUssZ0JBQ3ZDLEtBQUsseUJBQXlCLGFBQzlCO0FBQ0osWUFBSywyQkFBMkIsc0JBQXNCOztBQUV4RDtLQUNGLFFBQ0U7Ozs7Ozs7O0VBU0Usd0JBQXFCO0FBRTdCLE9BQUksQ0FBQyxLQUFLLGdCQUFpQjtBQUczQixPQUFJLEtBQUssbUNBQW1DO0FBQzFDLFNBQUssb0NBQW9DO0FBQ3pDOztBQUlGLE9BQ0UsS0FBSyx5QkFBeUIsS0FBSywyQkFDbkMsS0FBSyx5QkFBeUIsS0FBSyx3QkFBd0IsY0FDM0Q7QUFDQSxTQUFLLDhCQUE4QjtBQUNuQzs7QUFLRixPQUFJLEtBQUssd0JBQXdCLEtBQUssaUJBQWlCO0lBQ3JELE1BQU0sZUFBZSxLQUFLLGdDQUFnQztBQUUxRCxRQUFJLGNBQWM7QUFDaEIsVUFBSyxxQkFBcUI7QUFDMUIsVUFBSyxrQkFBa0IsYUFBYTtBQUNwQyxVQUFLLG9CQUFvQjtVQUd6QixNQUFLLDhCQUE4QjtVQUtsQztBQUNILFNBQUsscUJBQXFCO0FBRTFCLFNBQUssdUJBQXVCO0FBQzVCLFNBQUssOEJBQThCOzs7RUFJN0IseUJBQXlCLHVCQUE2QjtBQUM5RCxPQUNFLEtBQUssbUJBQW1CLHNCQUFzQixJQUM5QywwQkFBMEIsS0FBSyx3QkFDL0I7QUFDQSxTQUFLLG9CQUFvQjtBQUN6QixTQUFLLGtCQUFrQjtBQUN2QixTQUFLLHVCQUF1QjtBQUM1QixTQUFLLHlCQUF5QjtBQUM5QixTQUFLLHdCQUF3QixLQUFLLDRCQUE0QjtBQUM5RCxTQUFLLGlDQUFpQztJQUV0QyxNQUFNLG9CQUFvQixLQUFLLDBCQUEwQjtBQUt6RCxTQUhFLEtBQUssdUJBQXVCLE1BQU0sS0FBSyx5QkFBeUIsTUFHNUIsS0FBSyw4QkFBOEIsRUFBRTtBQUN6RSxVQUFLLHNCQUFzQixLQUFLLGdCQUFnQjtBQUNoRCxVQUFLLGdCQUFnQixTQUFTO01BQzVCLEtBQUssS0FBSyxnQkFBZ0Isb0JBQW9CO01BQzlDLE1BQU0sS0FBSyxnQkFBZ0IsSUFBSTtNQUMvQixVQUFVO01BQ1gsQ0FBQztVQUVGLE1BQUssNEJBQTRCO0FBSW5DLFNBQUssa0NBQWtDLHNCQUFzQjs7O0VBSXZELGtCQUFrQixPQUFtQjtBQUM3QyxRQUFLLHFCQUFxQjtBQUMxQixPQUFJLE9BQU87QUFDVCxTQUFLLG9CQUFvQjtBQUN6QixTQUFLLCtCQUErQixNQUFNO0lBRTFDLE1BQU0sdUJBQXVCLEtBQUssc0JBQXNCO0FBQ3hELFFBQUksc0JBQXNCO0FBQ3hCLDBCQUFxQixhQUFhLFlBQVksUUFBUTtLQUd0RCxNQUFNLHdCQUF3QixpQkFBZ0I7TUFDNUMsTUFBTSxVQUFVLEtBQUssa0JBQ25CLEtBQUssdUJBQ0wsS0FBSyx3QkFDTCxNQUFNLE9BQ1A7QUFDRCxXQUFLLGdDQUFnQyxRQUFRO0FBQzdDLG1CQUFhLHNCQUFzQjtRQUNsQyxFQUFFOzs7O0VBS0Qsc0JBQW1CO0dBQzNCLE1BQU0sdUJBQXVCLEtBQUssc0JBQXNCO0FBQ3hELE9BQUksc0JBQXNCO0FBQ3hCLHlCQUFxQixhQUFhLFlBQVksVUFBVTtBQUN4RCxTQUFLLCtCQUErQixLQUFLO0FBQ3pDLFNBQUssb0JBQW9COzs7RUFJbkIsdUJBQ1Isa0JBQ0EsZ0JBQ0EsZ0JBQ0EsaUJBQXlCO0FBRXpCLE9BQUksa0JBQWtCLENBQUMsZUFHckIsa0JBQWlCLEtBQUssS0FBSyxvQkFBb0I7QUFHakQsT0FBSSxnQkFHRixrQkFBaUIsS0FBSyxLQUFLO0FBRzdCLFVBQU87SUFDTCxHQUFHLEtBQUssZUFBZSxpQkFBaUI7SUFDeEMsR0FBRyxLQUFLLGVBQWUsaUJBQWlCO0lBQ3pDOztFQUdPLHNCQUNSLGlCQUNBLGtCQUNBLGdCQUNBLGdCQUF3QjtBQUV4QixPQUFJLGtCQUFrQixrQkFBa0I7SUFDdEMsTUFBTSxlQUFlLGlCQUNqQixlQUFlLElBQ2YsZUFBZSxJQUFJLEtBQUs7QUFFNUIsUUFBSSxnQkFBZ0IsTUFBTSxFQUN4QixpQkFBZ0IsS0FBSyxLQUFLO2FBQ2pCLGdCQUFnQixJQUFJLGlCQUFpQixNQUFNLGFBQ3BELGlCQUFnQixLQUFLLEtBQUs7O0FBSTlCLFVBQU87SUFDTCxHQUFHLEtBQUssZUFBZSxnQkFBZ0I7SUFDdkMsR0FBRyxLQUFLLGVBQWUsZ0JBQWdCO0lBQ3ZDLEdBQUcsZ0JBQWdCO0lBQ3BCOzs7Ozs7OztFQVNPLDBCQUNSLGFBQ0EsZ0JBQWdDO0FBRWhDLFVBQ0UsWUFBWSxTQUFTLE1BQU0sS0FDM0IsWUFBWSxTQUFTLElBQUksWUFBWSxVQUFVLE1BQU0sZUFBZTs7Ozs7Ozs7RUFVOUQsbUNBQ1IsUUFBMkI7R0FFM0IsTUFBTSxjQUF1QztJQUFFLE9BQU87SUFBRyxVQUFVO0lBQUc7R0FDdEUsTUFBTSxhQUFhLFFBQVEsUUFBUSxhQUFhLGNBQW9CO0FBQ2xFLFFBQUksVUFBVSxVQUFVLE9BQ3RCLFFBQU87QUFHVCxRQUFJLFVBQVUsU0FBUyxPQUNyQixhQUFZO1FBRVosYUFBWTtBQUVkLFdBQU87TUFDTixZQUFZO0FBQ2YsVUFBTyxhQUFhLGFBQWE7Ozs7OztFQU8zQixpQ0FBOEI7R0FDcEMsTUFBTSx1QkFBdUIsS0FBSyxrQkFDOUIsS0FBSyx5QkFDTCxLQUFLLHVDQUF1QztBQU1oRCxPQUFJLEtBQUssZ0NBQWdDO0FBS3ZDLFFBRkUsS0FBSyxJQUFJLEtBQUssc0JBQXNCLEtBQUssZ0JBQWdCLFdBQVcsR0FDcEUsS0FBSyxlQUFlLEVBRXBCLE1BQUsscUJBQXFCO0FBRzVCLFNBQUssaUNBQWlDO0FBQ3RDOztBQUdGLFFBQUssc0JBQXNCLEtBQUssZ0JBQWdCO0FBR2hELFFBQUssb0JBQW9CO0FBSXpCLE9BQUksS0FBSywyQkFBMkIsR0FDbEMsTUFBSyx5QkFBeUI7QUFHaEMsT0FBSSxLQUFLLDhCQUE4QixDQUNyQyxNQUFLLHlCQUF5QjtPQUU5QixNQUFLLHlCQUNILHVCQUF1QixLQUFLLHlCQUN4QixLQUFLLHlCQUNMO0FBR1IsT0FBSSxDQUFDLEtBQUssZ0JBRVIsTUFBSyxrQ0FBa0MscUJBQXFCO0FBRTlELFFBQUssaUNBQWlDO0FBQ3RDLFFBQUssNEJBQTRCO0FBRWpDLE9BQUksQ0FBQyxLQUFLLGVBQWU7QUFDdkIsU0FBSyx1QkFBdUI7QUFDNUIsU0FBSyxrQkFBa0I7Ozs7Ozs7O0VBU25CLGtDQUFrQyx1QkFBNkI7QUFFckUsb0JBQWdCO0FBQ2QsUUFBSSxLQUFLLGlCQUFpQixLQUFLLHNCQUFzQjtLQUNuRCxNQUFNLDZCQUE2QixLQUFLLDBCQUEwQjtLQUVsRSxNQUFNLGdCQURzQix3QkFBd0IsS0FBSyxvQkFFakMsNkJBQTZCLEtBQUs7QUFDMUQsVUFBSyxxQkFBcUIsU0FBUztNQUNqQyxLQUFLLEtBQUssZ0JBQWdCLGdCQUFnQjtNQUMxQyxNQUFNLEtBQUssZ0JBQWdCLElBQUk7TUFDL0IsVUFBVTtNQUNYLENBQUM7O01BRUgsR0FBRzs7Ozs7RUFNQSxrQ0FBK0I7QUFDckMsUUFBSyxzQkFDSCxLQUFLLHlCQUF5QixLQUFLLHFCQUMvQixnQkFBZ0IsUUFDaEIsZ0JBQWdCOzs7Ozs7OztFQVNoQiwyQkFBd0I7R0FDOUIsTUFBTSxvQkFBb0IsS0FBSyxnQ0FBZ0MsS0FBSztBQU1wRSxVQUpFLEtBQUssd0JBQ0wsS0FBSyx3QkFBd0IsZ0JBQWdCLFFBQzdDLGtCQUFrQixRQUFRLEtBQUsseUJBRzdCLGtCQUFrQixNQUFNLEtBQUsseUJBQzdCLGtCQUFrQjs7Ozs7RUFNaEIsK0JBQTRCO0FBRWxDLE9BQUksS0FBSyx3QkFBd0IsS0FBSywrQkFBK0I7QUFDbkUsU0FBSyx1QkFBdUI7SUFDNUIsTUFBTSwyQkFBMkIsS0FBSyxZQUFZLGNBQ2hELDJCQUEyQixLQUFLLHVCQUNOO0FBQzVCLFFBQUkseUJBQ0YsMEJBQXlCLE9BQU87Ozs7Ozs7RUFTOUIsK0JBQTRCO0dBQ2xDLE1BQU0saUJBQWlCLEtBQUssZ0JBQ3hCLEtBQUssZ0JBQWdCLFlBQ3JCLEtBQUssZ0JBQWdCO0dBQ3pCLE1BQU0seUJBQXlCLEtBQUssZ0JBQ2hDLEtBQUssZ0JBQWdCLHVCQUF1QixDQUFDLFNBQzdDLEtBQUssZ0JBQWdCLHVCQUF1QixDQUFDO0dBQ2pELE1BQU0scUJBQXFCLEtBQUssc0JBQXNCO0dBQ3RELE1BQU0sbUJBQW1CLEtBQUssZ0NBQWdDLEtBQUs7R0FDbkUsTUFBTSxnQ0FDSixtQkFBbUIsS0FBSyxnQ0FBZ0MsS0FBSyx3QkFBd0I7QUFFdkYsV0FDRyxpQkFBaUIsc0JBQXNCLGlCQUFpQixpQkFBaUIsVUFDMUUsQ0FBQzs7Ozs7O0VBUUcsd0NBQXFDO0dBSTNDLE1BQU0saUJBSFksS0FBSyxnQkFDbkIsS0FBSyxnQkFBZ0IsWUFDckIsS0FBSyxnQkFBZ0IsY0FDUyxLQUFLLHlCQUF5QjtBQUNoRSxVQUFPLEtBQUssZ0NBQWdDLFdBQ3pDLGlCQUFpQixpQkFBaUIsYUFBYSxTQUFTLGlCQUFpQixhQUFhLElBQ3hGOzs7Ozs7RUFPSyxnQ0FBNkI7R0FDbkMsSUFBSSxhQUEyQjtHQUMvQixNQUFNLFFBQ0osS0FBSyxpQkFBaUIsS0FBSyx1QkFBdUIsV0FBVyxLQUFLO0dBQ3BFLE1BQU0sY0FDSixVQUFVLEtBQUssd0JBQXdCLE1BQU0sS0FBSyx5QkFBeUI7R0FDN0UsTUFBTSxjQUNKLEtBQUssWUFDRCxjQUFvQyxNQUFNLFlBQVksRUFDdEQsY0FBcUQscUNBQXFDLEVBQzFGLGFBQWEsT0FBTyxJQUFJO0FBRTlCLE9BQUksU0FBUyxZQUNYLGNBQWEsTUFBTSxRQUFRLE1BQU0sVUFBVSxNQUFNLFdBQVcsWUFBWSxJQUFJO0FBRTlFLFVBQU87O0VBR0QsMENBQ04sWUFDQSxPQUFnQjtBQUVoQixPQUNFLENBQUMsS0FBSyxxQkFDTixlQUFlLEtBQUsseUJBQXlCLGNBQzdDLGVBQWUsS0FBSyx5QkFBeUIsVUFFN0MsUUFBTztBQUdULE9BQ0UsZUFBZSxLQUFLLHlCQUF5QixhQUM3QyxLQUFLLGtCQUFrQixTQUFTLElBQUksTUFBTSxNQUFNLFVBQVUsS0FDMUQsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEtBQUssd0JBQXdCLEdBRXJELFFBQU8sS0FBSyx3QkFBd0I7WUFJcEMsZUFBZSxLQUFLLHlCQUF5QixXQUM3QyxLQUFLLGtCQUFrQixTQUFTLE1BQU0sS0FDdEMsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEtBQUssd0JBQXdCLEdBRXJELFFBQU8sS0FBSyx3QkFBd0I7QUFFdEMsVUFBTzs7Ozs7Ozs7RUFTRCwrQkFBK0IsWUFBbUI7R0FDeEQsTUFBTSxRQUNKLEtBQUssaUJBQWlCLEtBQUssdUJBQXVCLFdBQVcsS0FBSztHQUNwRSxJQUFJLGVBQWU7R0FDbkIsSUFBSSxjQUFjLE1BQU07R0FDeEIsSUFBSSx5QkFBeUI7QUFFN0IsT0FBSTtRQUVFLENBQUMsS0FBSywyQkFDUixRQUFPLEtBQUssK0JBQStCO2FBRXZDLEtBQUssbUJBQW1CO0tBQzFCLE1BQU0sNEJBQTRCLEVBQUUsR0FBRyxLQUFLLGtCQUFrQixVQUFVO0FBRXhFLFNBQUksWUFBWTtBQUdkLCtCQUF5QixLQUFLLDBDQUM1QixZQUNBLE1BQ0Q7QUFDRCxVQUFJLDJCQUEyQixNQUFNO0FBRW5DLHFCQUNFLEtBQUssaUJBQWlCLHdCQUF3QixXQUM1QyxLQUFLLHdCQUNMLFVBQVUsRUFBRTtBQUVoQixpQ0FBMEIsSUFDeEIseUJBQXlCLEtBQUssd0JBQXdCLE1BQU0sVUFBVSxJQUFJOzs7QUFJaEYsVUFBSyxNQUFNLFNBQVMsWUFFbEIsS0FBSSxDQUFDO1VBR0QsS0FBSyx3QkFBd0IsZ0JBQWdCLFNBQzdDLE1BQU0sU0FBUyxNQUFNLDBCQUEwQixNQUM5QyxDQUFDLGdCQUFnQixNQUFNLFNBQVMsSUFBSSxhQUFhLFNBQVMsR0FFM0QsZ0JBQWU7ZUFJZixLQUFLLHdCQUF3QixnQkFBZ0IsUUFDN0MsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLE1BQzlDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxHQUUzRCxnQkFBZTtnQkFHYixNQUFNLFdBQVcsS0FBSyxtQkFBbUI7VUFHekMsZUFBZSxLQUFLLHlCQUF5QixlQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxHQUUzRCxnQkFBZTtlQUlmLGVBQWUsS0FBSyx5QkFBeUIsY0FDNUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLEtBQzlDLE1BQU0sU0FBUyxNQUFNLDBCQUEwQixJQUFJLE1BQ3JELE1BQU0sU0FBUyxJQUFJLDBCQUEwQixNQUM1QyxDQUFDLGdCQUFnQixNQUFNLFNBQVMsSUFBSSxhQUFhLFNBQVMsR0FFM0QsZ0JBQWU7ZUFJZixlQUFlLEtBQUsseUJBQXlCLGNBQzVDLE1BQU0sU0FBUyxNQUFNLDBCQUEwQixLQUM5QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsSUFBSSxNQUNyRCxNQUFNLFNBQVMsSUFBSSwwQkFBMEIsTUFDNUMsQ0FBQyxnQkFBZ0IsTUFBTSxTQUFTLElBQUksYUFBYSxTQUFTLEdBRTNELGdCQUFlO2VBSWYsZUFBZSxLQUFLLHlCQUF5QixZQUM1QyxNQUFNLFNBQVMsTUFBTSwwQkFBMEIsS0FDOUMsTUFBTSxTQUFTLE1BQU0sMEJBQTBCLElBQUksTUFDckQsTUFBTSxTQUFTLElBQUksMEJBQTBCLE1BQzVDLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxJQUFJLGFBQWEsU0FBUyxHQUUzRCxnQkFBZTs7QUFRdkIsU0FBSSwyQkFBMkIsUUFBUSxhQUNyQyxNQUFLLHdCQUF3Qjs7O0FBS3JDLFVBQU87O0VBS0QsbUNBQW1DLGNBQW9CO0dBQzdELE1BQU0saUJBQ0osS0FBSyxzQkFBc0IsS0FDdkIsS0FBSywyQkFBMkIsS0FDOUIsSUFDQSxLQUFLLHlCQUNQLEtBQUs7R0FHWCxNQUFNLG9CQUNKLGlCQUFpQixhQUNiLEtBQUssMkJBQTJCLGVBQWUsR0FDL0MsS0FBSywyQkFBMkIsZUFBZTtBQUVyRCxPQUFJLEtBQUssZUFBZTtJQUN0QixNQUFNLHVCQUF1QixLQUFLLHNCQUFzQjtJQUN4RCxNQUFNLHVCQUF1Qix1QkFDekIscUJBQXFCLGFBQWEsV0FBVyxLQUFLLFVBQ2xEO0FBSUosUUFBSSxpQkFBaUIsY0FBYyxLQUFLLHVCQUF1QixlQUU3RCxLQUFJLHdCQUF3QixLQUFLLHNCQUFzQixNQUFNO0FBQzNELFVBQUssb0JBQW9CO0FBQ3pCLFVBQUsscUJBQXFCO0FBQzFCO2VBSU8sbUJBQW1CLEVBRTFCLE1BQUssK0JBQStCLGVBQWU7UUFFbkQsTUFBSyxvQkFBb0I7YUFJcEIsc0JBQXNCLEtBQUssdUJBQ2xDLE1BQUssb0JBQW9CO2FBS3pCLGlCQUFpQixjQUNqQixzQkFBc0IsS0FBSyx5QkFBeUIsU0FBUyxFQUc3RCxNQUFLLCtCQUErQixlQUFlO1NBQzlDO0FBQ0wsVUFBSyxvQkFBb0I7QUFDekIsVUFBSyxxQkFBcUI7QUFFMUIsU0FBSSxxQkFDRixNQUFLLGtCQUFrQixLQUFLLGtCQUFrQjtVQUczQztBQUNILFdBQUssdUJBQXVCO0FBQzVCLFdBQUssOEJBQThCOzs7QUFLdkMsU0FBSyxrQ0FBa0Msa0JBQWtCO1NBSXpELE1BQUsseUJBQXlCLGtCQUFrQjs7RUFLNUMsK0JBQStCLFlBQWtCO0FBQ3ZELFFBQUssb0JBQW9CO0FBQ3pCLG9CQUFrQixLQUFLLG9CQUFvQixZQUFhLEVBQUU7O0VBR3BELDJCQUEyQixZQUFrQjtBQUNuRCxRQUFLLHVCQUF1QjtBQUU1QixPQUFJLEtBQUssc0JBQXNCLEdBQzdCLE1BQUssb0JBQW9CO0FBRzNCLE9BQUksQ0FBQyxLQUFLLG1CQUFtQjtJQUMzQixNQUFNLG1CQUFtQixLQUFLLCtCQUErQixXQUFXO0FBRXhFLFFBQUksaUJBQ0YsTUFBSyxrQkFBa0IsaUJBQWlCO2FBS3RDLGVBQWUsS0FBSyx5QkFBeUIsY0FDN0MsZUFBZSxLQUFLLHlCQUF5QixhQUM1QyxLQUFLLGtCQUNILGVBQWUsS0FBSyx5QkFBeUIsV0FDNUMsZUFBZSxLQUFLLHlCQUF5QixZQUNqRDtLQUVBLE1BQU0sd0JBQ0osZUFBZSxLQUFLLHlCQUF5QixhQUN6QyxLQUFLLDRCQUE0QixHQUNqQyxLQUFLLDRCQUE0QjtBQUV2QyxVQUFLLHlCQUF5QixzQkFBc0I7Ozs7RUFNbEQsMkJBQTJCLGNBQXFCO0dBQ3hELE1BQU0sYUFBYSxnQkFBZ0IsS0FBSztBQUN4QyxVQUFPLGFBQWEsS0FBSyxpQkFBaUIsS0FBSyx1QkFBdUIsV0FBVyxTQUFTLElBQ3RGLGFBQWEsSUFDYjs7RUFHSSwyQkFBMkIsY0FBcUI7R0FDeEQsTUFBTSxhQUFhLGdCQUFnQixLQUFLO0FBQ3hDLFVBQU8sYUFBYSxJQUFJLGFBQWEsSUFBSTs7RUFHakMsb0NBQW9DLGdCQUE4QjtHQUMxRSxNQUFNLGdCQUFnQixlQUFlLGNBQWMsU0FBUyxVQUFVO0dBQ3RFLE1BQU0sa0JBQ0osZUFBZSxjQUFjLFNBQVMsS0FBSyxzQkFBc0IsS0FBSztHQUN4RSxNQUFNLHFCQUFxQixLQUFLLDhCQUE4QjtBQUU5RCxRQUFLLDhCQUE4QixpQkFBaUIsS0FBSyxxQ0FDdkQsb0JBQ0EsaUJBQ0EsZUFDRDs7Ozs7QUFLRCxRQUFLLGNBQ0gsSUFBSSxZQUEyQyxrQkFBa0I7SUFDL0QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRLEtBQUs7SUFDZCxDQUFDLENBQ0g7O0VBR0sscUNBQ04sK0JBQ0EsaUJBQ0EsZ0JBQThCO0FBRzlCLE9BQUksZUFBZSxVQUFVLFlBQVk7SUFDdkMsTUFBTSx5QkFBeUIsS0FBSyx1QkFBdUIsZUFBZSxHQUFHO0lBQzdFLE1BQU0sMkJBQTJCLEtBQUssa0NBQ3BDLGdCQUNBLHVCQUNEO0FBQ0QsUUFBSSx5QkFDRiwrQkFBOEIsS0FBSyx5QkFBeUI7U0FLOUQsaUNBQWdDLDhCQUE4QixRQUMzRCxtQkFBbUIsZUFBZSxPQUFPLGVBQWUsR0FDMUQ7QUFHSCxPQUFJLGtCQUFrQixNQUFNLDhCQUE4QixTQUFTLGlCQUFpQjtJQUNsRixNQUFNLDBCQUEwQixrQkFBa0IsSUFBSSxpQkFBaUIsS0FBQTtBQUV2RSxvQ0FBZ0MsS0FBSyx5QkFDbkMsK0JBQ0Esd0JBQ0Q7O0FBRUgsVUFBTzs7RUFHQyxrQ0FBa0MsZ0JBQThCO0dBQ3hFLE1BQU0saUJBQWlCLEtBQUssdUJBQXVCLGVBQWUsR0FBRztHQUNyRSxNQUFNLGFBQWEsZUFBZTtBQUVsQyxPQUFJLG1CQUFtQixLQUFNO0dBRTdCLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixnQkFBZ0IsV0FBVyxZQUFZLFFBQVEsTUFDaEYsVUFBVSxNQUFNLFVBQVUsZUFBZSxPQUMzQztBQUVELE9BQUksQ0FBQyxNQUFPO0FBRVosUUFBSyx3QkFBd0I7QUFDN0IsUUFBSyx5QkFBeUI7QUFDOUIsUUFBSyxvQkFBb0I7QUFFekIsT0FBSSxLQUFLLDJCQUEyQixLQUFLLG1CQUN2QyxNQUFLLDRCQUE0QjtBQUduQyxRQUFLLCtCQUErQixNQUFNO0dBRzFDLE1BQU0sd0JBQXdCLGlCQUFnQjtBQUM1QyxTQUFLLGdDQUFnQyxlQUFlLEdBQUc7QUFDdkQsaUJBQWEsc0JBQXNCO01BQ2xDLEVBQUU7O0VBR0csNkJBQTBCO0FBRWxDLE9BQUksS0FBSywwQkFBMEIsS0FBSyxtQkFBb0I7QUFHNUQsT0FBSSxLQUFLLHFCQUFxQixHQUM1QixNQUFLLG9CQUFvQixLQUFLO0FBRWhDLFFBQUsscUJBQXFCLEtBQUs7R0FFL0IsTUFBTSxpQkFBaUIsS0FBSyxpQ0FBaUMsS0FBSyxtQkFBbUI7QUFDckYsT0FBSTs7Ozs7QUFLRixRQUFLLGNBQ0gsSUFBSSxZQUEwQyxpQkFBaUI7SUFDN0QsU0FBUztJQUNULFVBQVU7SUFDVixRQUFRO0lBQ1QsQ0FBQyxDQUNIOztFQUlLLGtCQUNSLGdCQUNBLFlBQ0EsYUFBbUI7QUFFbkIsVUFDRSxvQ0FBb0MsaUJBQWlCLE1BQU0sYUFBYSxNQUFNOzs7Ozs7Ozs7O0VBWTFFLDZCQUEwQjtHQUVoQyxNQUFNLDBCQUEwQixNQUFNLEtBQUssaUJBQWlCLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRTtBQUU3RCxRQUFLLGlCQUFpQixLQUFLLGlCQUFpQixTQUFTLEdBRTdELFdBQVcsU0FBUyxtQkFBNkI7QUFDekQsU0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssaUJBQWlCLFNBQVMsR0FBRyxLQUFLO0tBQ3pELE1BQU0sZ0JBQWdCLEtBQUssaUJBQWlCLEdBQUcsV0FBVyx3QkFBd0I7QUFDbEYsU0FBSSxlQUFlLE1BQU0sZUFBZSxJQUFJO01BRTFDLE1BQU0sbUJBQW1CO09BQ3ZCLEdBQUc7T0FDSCxRQUFRLEtBQUE7T0FDUixhQUFhLEtBQUE7T0FDYixpQkFBaUIsS0FBQTtPQUNqQixpQkFBaUIsS0FBQTtPQUNqQixhQUFhLEVBQUE7T0FDZDtBQUNELFdBQUssaUJBQWlCLEdBQUcsV0FBVyxPQUNsQyx3QkFBd0IsSUFDeEIsR0FDQSxpQkFDRDs7QUFHSCw2QkFBd0I7O0tBRTFCOzs7Ozs7RUFPSSxxQ0FBa0M7QUFFeEMsUUFBSyw4QkFBOEIsUUFBUSxFQUFFO0FBQzdDLFFBQUssOEJBQThCLFdBQVcsRUFBRTtBQUVoRCxRQUFLLGtCQUFrQixTQUFTLGlCQUFrQyxtQkFDaEUsZ0JBQWdCLFdBQVcsS0FBSyxPQUFrQixlQUFzQjtBQUN0RSxVQUFNLFFBQ0YsUUFBUSxVQUFVLE1BQU0sVUFBVSxXQUFXLEVBQzdDLFNBQVMsVUFBUztLQUVsQixNQUFNLDRCQUE0Qyw4QkFDaEQsT0FGYyxLQUFLLGtCQUFrQixnQkFBZ0IsWUFBWSxNQUFNLE9BQU8sRUFJOUUsZ0JBQWdCLGdCQUNoQixXQUNEO0tBRUQsTUFBTSxnQ0FDSixLQUFLLGtDQUFrQywyQkFBMkIsZUFBZTtBQUVuRixTQUFJLDhCQUNGLEtBQUksOEJBQThCLGNBQWMsT0FDOUMsTUFBSyw4QkFBOEIsTUFBTSxLQUFLLDhCQUE4QjtTQUU1RSxNQUFLLDhCQUE4QixTQUFTLEtBQUssOEJBQThCO01BR25GO0tBQ0osQ0FDSDs7Ozs7OztFQVFLLHlCQUNOLDRCQUNBLG1CQUFrQztBQUdsQyxRQUFLLE1BQU0sa0JBQWtCLDJCQUMzQixLQUFJLENBQUMscUJBQXFCLGtCQUFrQixPQUFPLGVBQWUsSUFBSTtJQUNwRSxNQUFNLGVBQWUsS0FBSyxZQUFZLGVBQWUsZUFBZSxHQUFrQjtBQUN0RixRQUFJLGFBQ0YsY0FBYSxhQUFhLFNBQVMsT0FBTzs7QUFLaEQsT0FBSSxrQkFDRiw4QkFBNkIsMkJBQTJCLFFBQ3JELG1CQUFtQixlQUFlLE9BQU8sa0JBQWtCLEdBQzdEO09BRUQsOEJBQTZCLEVBQUU7QUFFakMsVUFBTzs7RUFHRCxrQ0FDTixtQkFDQSxnQkFBNkI7QUFFN0IsT0FBSSxtQkFBbUIsS0FBTSxRQUFPO0dBRXBDLE1BQU0sUUFBUSxLQUFLLGlCQUFpQixnQkFBZ0IsV0FBVyxrQkFBa0I7R0FDakYsTUFBTSxRQUFRLE1BQU0sUUFBUSxNQUFNLFVBQVUsTUFBTSxXQUFXLGtCQUFrQixPQUFPO0FBRXRGLFVBQU8sUUFDSCxnREFDRSxPQUNBLE9BQ0Esa0JBQWtCLElBQ2xCLGtCQUFrQixXQUNsQixrQkFBa0IsV0FDbkIsR0FDRDs7RUFHRSxpQ0FDTixZQUFrQjtBQUVsQixPQUFJLENBQUMsS0FBSyxpQkFBaUIsS0FBSyx1QkFBdUIsV0FBVyxZQUFhLFFBQU87R0FFdEYsTUFBTSxRQUFRLEtBQUssaUJBQWlCLEtBQUssdUJBQXVCLFdBQVc7QUFFM0UsVUFBTyw4QkFBOEIsWUFBWSxPQURqQixLQUFLLG1DQUFtQyxNQUFNLE9BQU8sQ0FDTDs7RUFHMUUsK0JBQStCLE9BQW1CO0FBQ3hELFFBQUssNkJBQTZCLFFBQzlCLEtBQUssa0JBQ0gsS0FBSyx1QkFDTCxLQUFLLHdCQUNMLE1BQU0sT0FDUCxHQUNEOzs7Ozs7RUFPRSx5QkFBc0I7QUFDNUIsT0FBSSxDQUFDLFVBQVU7SUFHYixNQUFNLGdCQUFnQixJQUZELFNBQVMsT0FBTyxpQkFBaUIsU0FBUyxLQUFLLENBQUMsVUFBVSxHQUFHO0FBR2xGLFNBQUssT0FBTyxZQUFZLHFDQUFxQyxHQUFHLGdCQUFnQixRQUFROzs7Ozs7Ozs7OztFQVlwRiwrQkFBNEI7QUFDbEMsT0FBSSxLQUFLLGtCQUFrQjtJQUN6QixNQUFNLFlBQ0osS0FBSyxpQkFBaUIsS0FBSyxpQkFBaUIsU0FBUyxHQUFHO0FBRTFELFNBQUssMkJBQTJCLEVBQUU7QUFFbEMsY0FBVSxTQUFTLE9BQU8sVUFBUztLQUNqQyxNQUFNLGdCQUFvQyxFQUFFO0tBQzVDLE1BQU0sY0FBd0IsRUFBRTtLQUNoQyxNQUFNLFNBQWtCLEVBQUU7QUFHMUIsVUFBSyxpQkFDRixLQUFLLE9BQU07QUFDVixhQUFPLEdBQUcsV0FBVztPQUNyQixDQUNELFNBQVMsVUFBb0I7QUFDNUIsb0JBQWMsS0FBSyxHQUFHLE1BQU0sWUFBWTtBQUN4QyxrQkFBWSxLQUFLLEdBQUksTUFBTSxjQUFjLE1BQU0sY0FBYyxFQUFFLENBQUU7QUFDakUsYUFBTyxLQUFLLEdBQUksTUFBTSxTQUFTLE1BQU0sU0FBUyxFQUFFLENBQUU7T0FDbEQ7QUFFSixVQUFLLHlCQUF5QixLQUFLO01BQ2pDLElBQUksTUFBTTtNQUNWLGFBQWEsS0FBSyw4QkFBOEIsY0FBYztNQUM5RCxhQUFhLEtBQUssK0JBQStCLFlBQVk7TUFDN0QsY0FBYyxNQUFNLFNBQVMsTUFBTSxPQUFPLFdBQVcsSUFBSTtNQUN6RCxnQkFBZ0IsS0FBSyxpQ0FBaUMsTUFBTTtNQUM1RCxZQUFZLEtBQUssbUNBQW1DLE9BQU87TUFDM0Qsb0JBQW9CLEtBQUssd0JBQXdCLE1BQUE7TUFDbEQsQ0FBQztNQUNGOzs7RUFJRSw4QkFBOEIsZUFBaUM7QUFDckUsT0FBSSxjQUFjLFFBQVEsUUFBUSxLQUFLLEdBQUksUUFBTztBQUNsRCxPQUFJLGNBQWMsUUFBUSxTQUFTLEtBQUssR0FBSSxRQUFPO0FBQ25ELFVBQU87O0VBR0QsaUNBQ04sV0FBb0I7R0FFcEIsTUFBTSxtQkFBbUIsVUFBVSxpQkFBaUIsUUFDakQsc0JBQXNCLGtCQUFrQixTQUFTLGNBQ25EO0FBRUQsT0FBSSxvQkFBb0IsaUJBQWlCLFNBQVMsR0FBRztJQUVuRCxNQUFNLG9CQUNKLGlCQUFpQixNQUFNLHNCQUFzQixrQkFBa0IsU0FBUyxNQUFNLEVBQUUsSUFBSTtJQUN0RixNQUFNLHFCQUNKLGlCQUFpQixNQUFNLHNCQUFzQixrQkFBa0IsU0FBUyxJQUFJLEVBQUUsSUFBSTtBQUVwRixXQUFPO0tBQ0wsTUFBTSxDQUFDLENBQUM7S0FDUixPQUFPLENBQUMsQ0FBQztLQUNWOzs7RUFtQ0csdUNBQW9DO0FBQzFDLE9BQUksS0FBSyxpQkFJUCxFQUZFLEtBQUssaUJBQWlCLEtBQUssaUJBQWlCLFNBQVMsSUFBSSxhQUUvQyxTQUFTLGNBQXdCO0lBQzNDLE1BQU0sdUJBQXVCLEtBQUssOEJBQ2hDLFVBQVUsVUFBVSxHQUNwQixVQUFVLE9BQ1g7SUFJRCxNQUFNLG1CQUFtQixVQUFVLGlCQUFpQixRQUNqRCxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssZ0JBQWdCLFNBQVMsRUFBRSxLQUFLLENBQ3hEO0lBRUQsTUFBTSw2QkFBNkIsS0FBSyw4QkFDdEMsVUFBVSxVQUFVLEdBQ3BCLGlCQUNEO0FBRUQsU0FBSyw4QkFBOEIsS0FBSztLQUN0QyxTQUFTLFVBQVU7S0FDbkIsbUJBQW1CO0tBQ25CLHlCQUF5QjtLQUMxQixDQUFDO0tBQ0Y7Ozs7OztFQVFFLHVCQUFvQjtBQUMxQixVQUFPLEtBQUssNkJBQ1IsS0FBSyxZQUFZLGVBQWUsS0FBSywyQkFBMkIsSUFBSSxPQUNwRTs7Ozs7O0VBT0UsdUJBQXVCLFNBQWU7R0FDNUMsTUFBTSxZQUFZLEtBQUssWUFDbkIsY0FBYyxNQUFNLFFBQVEsRUFDNUIsYUFBYSxrQkFBa0I7QUFDbkMsT0FBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FDakMsUUFBTyxDQUFDO0FBRVYsVUFBTzs7RUFHRCxtQkFBbUIsWUFBa0I7QUFDM0MsVUFDRSxjQUFjLEtBQ2QsY0FBYyxLQUFLLGlCQUFpQixLQUFLLGlCQUFpQixTQUFTLEdBQUcsV0FBVzs7Ozs7Ozs7Ozs7O0VBYzdFLDZCQUEwQjtBQUNoQyxPQUNFLEtBQUssaUJBQWlCLEtBQUssdUJBQXVCLFdBQVcsS0FBSyx3QkFDL0QsV0FBVyxLQUFBLEVBRWQsUUFBTyxLQUFLO0dBSWQsTUFBTSw4QkFBOEIsS0FBSyxpQkFBaUIsV0FDdkQsb0JBQ0MsZ0JBQWdCLFdBQVcsS0FBSyx3QkFBd0IsV0FBVyxLQUFBLEVBQ3RFO0FBQ0QsVUFBTyxLQUFLLHlCQUF5Qiw4QkFDakMsS0FBSyx3QkFDTDs7Ozs7Ozs7RUFTRSxnQ0FBZ0MsU0FBZTtBQUNyRCxRQUFLLFlBQ0QsZUFBZSxRQUFRLEVBQ3ZCLGVBQWU7SUFBRSxVQUFVO0lBQVUsT0FBTztJQUFXLFFBQVE7SUFBVyxDQUFDOzs7Ozs7O0VBUXpFLDhCQUNOLGdCQUNBLFVBQTZDO0FBRTdDLFVBQ0UsVUFBVSxNQUNQLFlBQ0MsUUFBUSxTQUFTLE1BQU0sS0FBSyxRQUFRLFNBQVMsSUFBSSxRQUFRLFVBQVUsS0FBSyxlQUMzRSxJQUFJOzs7Ozs7O0VBU0Qsd0JBQXdCLFdBQW9CO0FBSWxELE9BQUksVUFZRixRQUFPO0lBQ08sWUFaSyxVQUFVLGlCQUFpQixNQUMzQyxZQUF5QixRQUFRLFNBQVMsY0FDNUM7SUFXMkIsMEJBUjFCLFVBQVUsU0FBUyxxQkFDZixVQUFVLGlCQUFpQixNQUN4QixZQUF5QixRQUFRLFNBQVMsK0JBQzVDLEdBQ0QsS0FBQTtJQUtMO0FBR0gsVUFBTztJQUNMLFlBQVksS0FBQTtJQUNaLDBCQUEwQixLQUFBO0lBQzNCOzs7Ozs7RUFPSyxtQ0FBZ0M7QUFDdEMsT0FBSSxLQUFLLGNBQ1AsTUFBSyxvQkFBb0I7QUFFM0IsUUFBSyxxQkFBcUIifQ==
|