@almatar/smart-booking-dashboard 0.0.2-alpha.2 → 0.0.2-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/esm2022/lib/components/almatar-aside/aside.component.mjs +6 -7
  2. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +17 -12
  3. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +9 -3
  4. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.mjs +210 -0
  5. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +3 -3
  6. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +4 -4
  7. package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +11 -4
  8. package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +23 -21
  9. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +42 -34
  10. package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
  11. package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
  12. package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
  13. package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
  14. package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
  15. package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
  16. package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
  17. package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
  18. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
  19. package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
  20. package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
  21. package/esm2022/lib/config/dashboard.config.mjs +3 -1
  22. package/esm2022/lib/models/reissue.types.mjs +2 -0
  23. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +9 -3
  24. package/esm2022/lib/services/reissue.service.mjs +142 -0
  25. package/esm2022/lib/services/toast.service.mjs +15 -7
  26. package/esm2022/lib/utils/reissue-format.mjs +64 -0
  27. package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
  28. package/esm2022/public-api.mjs +3 -1
  29. package/fesm2022/almatar-smart-booking-dashboard.mjs +2211 -102
  30. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  31. package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
  32. package/lib/components/almatar-aside/aside.component.d.ts +1 -2
  33. package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +3 -0
  34. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +1 -0
  35. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.d.ts +46 -0
  36. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +2 -1
  37. package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +6 -0
  38. package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
  39. package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
  40. package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
  41. package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
  42. package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
  43. package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
  44. package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
  45. package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
  46. package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
  47. package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
  48. package/lib/components/result-panel/result-panel.component.d.ts +1 -1
  49. package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
  50. package/lib/config/dashboard.config.d.ts +29 -0
  51. package/lib/models/reissue.types.d.ts +147 -0
  52. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +4 -1
  53. package/lib/services/reissue.service.d.ts +45 -0
  54. package/lib/services/toast.service.d.ts +14 -1
  55. package/lib/utils/reissue-format.d.ts +28 -0
  56. package/lib/utils/reissue-url.builder.d.ts +24 -0
  57. package/package.json +9 -7
  58. package/public-api.d.ts +5 -1
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Port of the web's `FlightManageBookingService.navigateToOnlineBooking()`
3
+ * (almatar-consumer-apps) — builds the query params of
4
+ * `/flights/manage-booking/list`, where the web continues the reissue
5
+ * (search -> view-price -> choose-flight -> payment).
6
+ * Keep the param names/values identical to the web.
7
+ */
8
+ export const REISSUE_WEB_PATH = '/flights/manage-booking/list/';
9
+ /** Same strings as the web's `FlightManageBookingAsideTabEnum`. */
10
+ const SERVICE_NAME = {
11
+ change_date: 'change-travel-date-time',
12
+ change_route: 'change-flight-route',
13
+ };
14
+ // ── date helpers ────────────────────────────────────────────────────────────
15
+ /** `moment.utc(str).valueOf()` — strings without a timezone are read as UTC. */
16
+ function utcMs(value) {
17
+ const hasTz = /[zZ]$|[+-]\d{2}:?\d{2}$/.test(value);
18
+ return new Date(hasTz ? value : `${value}Z`).getTime();
19
+ }
20
+ /** Web's `getAbsoluteDate(date)` -> `YYYY-MM-DD` of the date part. */
21
+ function dateOnly(value) {
22
+ return value.slice(0, 10);
23
+ }
24
+ /** Web's `getAbsoluteDate(date, true)` -> UTC midnight of that calendar day. */
25
+ function absoluteMs(value) {
26
+ const [y, m, d] = dateOnly(value).split('-').map(Number);
27
+ return Date.UTC(y, m - 1, d);
28
+ }
29
+ function capitalize(value) {
30
+ return value ? value.charAt(0).toUpperCase() + value.slice(1).toLowerCase() : value;
31
+ }
32
+ // ── booking_info -> context ─────────────────────────────────────────────────
33
+ function inferTripType(bi, legs) {
34
+ const explicit = bi?.IteneraryTripType;
35
+ if (explicit === 'OneWay' || explicit === 'RoundTrip' || explicit === 'MultiCity')
36
+ return explicit;
37
+ if (legs.length <= 1)
38
+ return 'OneWay';
39
+ if (legs.length === 2 && legs[1].direction === 'Return')
40
+ return 'RoundTrip';
41
+ return 'MultiCity';
42
+ }
43
+ function countPassengers(bi, type) {
44
+ const list = bi?.passenger_info?.passengers ?? [];
45
+ return list.filter(p => p?.type === type).length;
46
+ }
47
+ /**
48
+ * Normalizes the dashboard's `booking_info` (from `/v1/fcr/booking/information`)
49
+ * into what the URL builder needs. Reads defensively: any field missing in the
50
+ * BO response falls back to an empty value.
51
+ */
52
+ export function buildReissueBookingContext(bookingData, bookingId) {
53
+ const bi = bookingData?.data?.booking_info;
54
+ const legsRaw = bi?.leg_info ?? [];
55
+ if (!legsRaw.length)
56
+ return null;
57
+ const airline = bi?.airline_info ?? [];
58
+ const legs = legsRaw.map((l, i) => {
59
+ const segs = airline[i]?.Segments ?? [];
60
+ const first = segs[0] ?? {};
61
+ const last = segs[segs.length - 1] ?? first;
62
+ // Some bookings come back with a sparse `leg_info` — fall back to the
63
+ // first/last segment (airline_info, then duration/terminal) for the route and times.
64
+ const durSegs = bi?.duration?.legs?.[i]?.Segments ?? [];
65
+ const termSegs = bi?.terminal?.[i]?.Segments ?? [];
66
+ const firstAny = { ...(termSegs[0] ?? {}), ...(durSegs[0] ?? {}), ...first };
67
+ const lastAny = {
68
+ ...(termSegs[termSegs.length - 1] ?? {}),
69
+ ...(durSegs[durSegs.length - 1] ?? {}),
70
+ ...last,
71
+ };
72
+ const originCode = l.LegDepartureAirportCode ?? firstAny.DepartureAirportCode ?? firstAny.SegmentDepartureAirportCode ?? '';
73
+ const destinationCode = l.LegArrivalAirportCode ?? lastAny.ArrivalAirportCode ?? lastAny.SegmentArrivalAirportCode ?? '';
74
+ return {
75
+ // No id in the response -> a positional placeholder so the dialog still works.
76
+ legId: l.LegID ?? l.legId ?? l.LegId ?? `leg-${i}`,
77
+ direction: l.LegDirectionality ?? '',
78
+ originCode,
79
+ originName: l.LegDepartureAirportName ?? firstAny.DepartureAirportName ?? '',
80
+ originCityName: l.LegDepartureCityName ?? firstAny.SegmentDepartureCityName ?? firstAny.DepartureAirportName ?? originCode,
81
+ originCountryName: l.LegDepartureCountryName ?? firstAny.SegmentDepartureCountryName ?? '',
82
+ destinationCode,
83
+ destinationName: l.LegArrivalAirportName ?? lastAny.ArrivalAirportName ?? '',
84
+ destinationCityName: l.LegArrivalCityName ?? lastAny.SegmentArrivalCityName ?? lastAny.ArrivalAirportName ?? destinationCode,
85
+ destinationCountryName: l.LegArrivalCountryName ?? lastAny.SegmentArrivalCountryName ?? '',
86
+ departure: l.LegDepartureDateTime ?? firstAny.DepartureDateTime ?? firstAny.SegmentDepartureDateTime ?? firstAny.DepartureTime ?? '',
87
+ arrival: l.LegArrivalDateTime ?? lastAny.ArrivalDateTime ?? lastAny.SegmentArrivalDateTime ?? lastAny.ArrivalTime ?? '',
88
+ airline: (l.LegAirlinesNames ?? [])[0] ?? first.AirlineName ?? '',
89
+ stops: (l.Stops ?? []).length,
90
+ flightNo: first.AirlineCode ? `${first.AirlineCode}${first.FlightNumber ?? ''}` : '',
91
+ };
92
+ });
93
+ const firstLegRaw = legsRaw[0];
94
+ const firstSeg = airline[0]?.Segments?.[0] ?? {};
95
+ return {
96
+ bookingId: String(bookingId),
97
+ tripType: inferTripType(bi, legs),
98
+ legs,
99
+ adults: countPassengers(bi, 'ADT'),
100
+ children: countPassengers(bi, 'CNN'),
101
+ infants: countPassengers(bi, 'INF'),
102
+ // The BO response may carry no cabin at all (sparse bookings) — default so the web search still gets a class.
103
+ cabinName: firstLegRaw.LegCabins?.[0]?.Name ?? 'Economy',
104
+ cabinCode: firstLegRaw.LegCabins?.[0]?.Code ?? 'Y',
105
+ currency: bi?.currency ?? bi?.payment_status?.currency ?? '',
106
+ airlineCode: firstSeg.AirlineCode ?? '',
107
+ flightNumber: String(firstSeg.FlightNumber ?? ''),
108
+ airlineName: (firstLegRaw.LegAirlinesNames ?? [])[0] ?? firstSeg.AirlineName ?? '',
109
+ totalStops: (firstLegRaw.Stops ?? []).length,
110
+ };
111
+ }
112
+ // ── URL builder ─────────────────────────────────────────────────────────────
113
+ function airportCityLabel(name, country, code) {
114
+ return `${name || code}${country ? ', ' + country : ''}(${code})`;
115
+ }
116
+ function otherLegOf(ctx, legId) {
117
+ const other = ctx.legs.find(l => l.legId !== legId);
118
+ return other
119
+ ? {
120
+ legId: other.legId,
121
+ departDateTime: other.departure,
122
+ destinationCode: other.destinationCode,
123
+ originCode: other.originCode,
124
+ isReturn: other.direction === 'Return',
125
+ }
126
+ : undefined;
127
+ }
128
+ export function buildReissueSearchParams(rawCtx, selection, postBookingId) {
129
+ // The BO booking information may carry no leg dates at all. Without an original date the
130
+ // web's `departure` / `return` / `updatingLegs` would be NaN, so fall back to the date the
131
+ // agent picked (or today) — only affects sparse bookings; real ones have `LegDepartureDateTime`.
132
+ const fallbackDate = `${selection.legs.find(c => c.departDate)?.departDate ?? new Date().toLocaleDateString('en-CA')}T00:00:00`;
133
+ const ctx = {
134
+ ...rawCtx,
135
+ legs: rawCtx.legs.map(l => (l.departure ? l : { ...l, departure: fallbackDate })),
136
+ };
137
+ const isDate = selection.service === 'change_date';
138
+ const leg0 = ctx.legs[0];
139
+ const changes = selection.legs;
140
+ const legOf = (c) => ctx.legs.find(l => l.legId === c.legId) ?? leg0;
141
+ // `config.legs` in the web.
142
+ const legsPayload = changes.map(c => {
143
+ const orig = legOf(c);
144
+ if (isDate) {
145
+ return {
146
+ legId: c.legId,
147
+ ...(ctx.tripType === 'MultiCity' ? { touched: true } : {}),
148
+ departDateTime: dateOnly(c.departDate ?? orig.departure),
149
+ destinationCode: orig.destinationCode,
150
+ originCode: orig.originCode,
151
+ };
152
+ }
153
+ return {
154
+ legId: c.legId,
155
+ originCode: c.origin?.id ?? orig.originCode,
156
+ originCityName: c.origin?.city_name || c.origin?.name || orig.originCityName,
157
+ destinationCode: c.destination?.id ?? orig.destinationCode,
158
+ destinationCityName: c.destination?.city_name || c.destination?.name || orig.destinationCityName,
159
+ departDateTime: orig.departure,
160
+ };
161
+ });
162
+ // `routeConfig` in the web.
163
+ const first = changes[0];
164
+ const routeOrigin = !isDate ? first?.origin : undefined;
165
+ const routeDest = !isDate ? first?.destination : undefined;
166
+ const routeDeparture = isDate ? `${dateOnly(changes[0].departDate ?? leg0.departure)}T00:00:00` : undefined;
167
+ const routeReturn = isDate && changes.length > 1
168
+ ? `${dateOnly(changes[1].departDate ?? ctx.legs[1]?.departure ?? '')}T00:00:00`
169
+ : undefined;
170
+ const origin = routeOrigin?.id ?? leg0.originCode;
171
+ const destination = routeDest?.id ?? leg0.destinationCode;
172
+ const className = ctx.cabinName.toUpperCase().includes('ECONOMY')
173
+ ? capitalize(ctx.cabinName.replace(/\s+/g, ''))
174
+ : ctx.cabinName;
175
+ const params = {
176
+ flightSearchId: ctx.bookingId,
177
+ category: 'flights',
178
+ id: `${ctx.airlineCode}-${ctx.flightNumber}`,
179
+ origin,
180
+ originCity: routeOrigin
181
+ ? routeOrigin.name || `${routeOrigin.city_name}, ${routeOrigin.country_name}`
182
+ : airportCityLabel(leg0.originName, leg0.originCountryName, leg0.originCode),
183
+ originCityName: routeOrigin?.city_name ?? leg0.originCityName,
184
+ originCountryName: routeOrigin?.country_name ?? leg0.originCountryName,
185
+ destinationCityName: routeDest?.city_name ?? leg0.destinationCityName,
186
+ destinationCity: routeDest
187
+ ? routeDest.name || `${routeDest.city_name}, ${routeDest.country_name}`
188
+ : airportCityLabel(leg0.destinationName, leg0.destinationCountryName, leg0.destinationCode),
189
+ destinationCountryName: routeDest?.country_name ?? leg0.destinationCountryName,
190
+ destination,
191
+ departureFlightAirlines: ctx.airlineName,
192
+ adult: ctx.adults,
193
+ child: ctx.children,
194
+ lapinfant: ctx.infants,
195
+ class: className,
196
+ className: ctx.cabinCode,
197
+ departure: utcMs(routeDeparture ?? leg0.departure),
198
+ infantonchair: 0,
199
+ originType: routeOrigin?.type ?? 'city',
200
+ destinationType: routeDest?.type ?? 'city',
201
+ isDirect: 'false',
202
+ serviceName: SERVICE_NAME[selection.service],
203
+ currency: ctx.currency,
204
+ classType: ctx.cabinCode,
205
+ connection: ctx.tripType,
206
+ directFlights: ctx.totalStops === 0,
207
+ flexibleDates: false,
208
+ legs: JSON.stringify(legsPayload),
209
+ // Lets the results page show an "UPDATING NOW" banner per changed leg.
210
+ updatingLegs: JSON.stringify(changes.map(c => {
211
+ const o = legOf(c);
212
+ return {
213
+ legId: o.legId,
214
+ direction: o.direction,
215
+ originCode: o.originCode,
216
+ destinationCode: o.destinationCode,
217
+ originCityName: o.originCityName,
218
+ destinationCityName: o.destinationCityName,
219
+ originalDeparture: utcMs(o.departure),
220
+ };
221
+ })),
222
+ };
223
+ if (ctx.tripType === 'RoundTrip') {
224
+ const secondLeg = ctx.legs[1];
225
+ params['return'] = routeReturn
226
+ ? utcMs(routeReturn)
227
+ : secondLeg
228
+ ? utcMs(secondLeg.departure) // the web parses this one in the customer's timezone; read as UTC here so it doesn't depend on the agent's timezone
229
+ : utcMs(String(legsPayload[0].departDateTime));
230
+ if (changes.length === 1) {
231
+ const other = otherLegOf(ctx, changes[0].legId);
232
+ if (isDate && other && !other.isReturn) {
233
+ params['departure'] = utcMs(other.departDateTime);
234
+ params['return'] = utcMs(String(legsPayload[0].departDateTime));
235
+ }
236
+ if (other)
237
+ params['extraLeg'] = JSON.stringify(other);
238
+ }
239
+ }
240
+ if (ctx.tripType === 'MultiCity') {
241
+ let cities;
242
+ if (isDate) {
243
+ const changedDate = new Map(changes.map(c => [c.legId, c.departDate]));
244
+ cities = ctx.legs.map(l => ({
245
+ departure: absoluteMs(changedDate.get(l.legId) || l.departure),
246
+ destination: l.destinationCode,
247
+ destinationType: l.destinationCode,
248
+ origin: l.originCode,
249
+ originType: l.originCode,
250
+ destinationCity: l.destinationCityName,
251
+ destinationCityName: l.destinationCityName,
252
+ destinationName: l.destinationCityName,
253
+ destinationCountryName: l.destinationCountryName,
254
+ originCity: l.originCityName,
255
+ originCityName: l.originCityName,
256
+ originName: l.originCityName,
257
+ originCountryName: l.originCountryName,
258
+ }));
259
+ }
260
+ else {
261
+ cities = changes.map(c => {
262
+ const o = legOf(c);
263
+ const from = c.origin;
264
+ const to = c.destination;
265
+ return {
266
+ departure: utcMs(o.departure),
267
+ destination: to?.id ?? o.destinationCode,
268
+ destinationType: to?.type ?? o.destinationCode,
269
+ origin: from?.id ?? o.originCode,
270
+ originType: from?.id ?? o.originCode,
271
+ destinationCity: to?.name ?? o.destinationCityName,
272
+ destinationCityName: to?.name ?? o.destinationCityName,
273
+ destinationName: to?.name ?? o.destinationCityName,
274
+ destinationCountryName: to?.country_name ?? o.destinationCountryName,
275
+ originCity: from?.name ?? o.originCityName,
276
+ originCityName: from?.name ?? o.originCityName,
277
+ originName: from?.name ?? o.originCityName,
278
+ originCountryName: from?.country_name ?? o.originCountryName,
279
+ };
280
+ });
281
+ }
282
+ params['departure'] = cities[0].departure;
283
+ params['cities'] = JSON.stringify(cities);
284
+ }
285
+ params['bookingId'] = ctx.bookingId;
286
+ params['postBookingId'] = postBookingId;
287
+ return Object.fromEntries(Object.entries(params)
288
+ .filter(([, v]) => v !== undefined && v !== null)
289
+ .map(([k, v]) => [k, String(v)]));
290
+ }
291
+ export function buildReissueSearchUrl(webBaseUrl, ctx, selection, postBookingId) {
292
+ const qs = new URLSearchParams(buildReissueSearchParams(ctx, selection, postBookingId));
293
+ return `${webBaseUrl.replace(/\/+$/, '')}${REISSUE_WEB_PATH}?${qs.toString()}`;
294
+ }
295
+ /**
296
+ * Adds the host's auth parameters (for example its token) to the web link: in the query string, or in the `#fragment`
297
+ * (which browsers do not send to servers or in the Referer). Empty values are skipped.
298
+ */
299
+ export function appendAuthParams(url, params, where = 'query') {
300
+ const entries = Object.entries(params ?? {}).filter(([, value]) => !!value);
301
+ if (!entries.length)
302
+ return url;
303
+ const target = new URL(url);
304
+ if (where === 'hash') {
305
+ const hash = new URLSearchParams(target.hash.replace(/^#/, ''));
306
+ entries.forEach(([name, value]) => hash.set(name, value));
307
+ target.hash = hash.toString();
308
+ }
309
+ else {
310
+ entries.forEach(([name, value]) => target.searchParams.set(name, value));
311
+ }
312
+ return target.toString();
313
+ }
314
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS11cmwuYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvdXRpbHMvcmVpc3N1ZS11cmwuYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQTs7Ozs7O0dBTUc7QUFFSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRywrQkFBK0IsQ0FBQztBQUVoRSxtRUFBbUU7QUFDbkUsTUFBTSxZQUFZLEdBQUc7SUFDbkIsV0FBVyxFQUFFLHlCQUF5QjtJQUN0QyxZQUFZLEVBQUUscUJBQXFCO0NBQzNCLENBQUM7QUFLWCwrRUFBK0U7QUFFL0UsZ0ZBQWdGO0FBQ2hGLFNBQVMsS0FBSyxDQUFDLEtBQWE7SUFDMUIsTUFBTSxLQUFLLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLFNBQVMsUUFBUSxDQUFDLEtBQWE7SUFDN0IsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFhO0lBQy9CLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN0RixDQUFDO0FBRUQsK0VBQStFO0FBRS9FLFNBQVMsYUFBYSxDQUFDLEVBQU8sRUFBRSxJQUFrQjtJQUNoRCxNQUFNLFFBQVEsR0FBRyxFQUFFLEVBQUUsaUJBQWlCLENBQUM7SUFDdkMsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxXQUFXLElBQUksUUFBUSxLQUFLLFdBQVc7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNuRyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3RDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDNUUsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEVBQU8sRUFBRSxJQUFZO0lBQzVDLE1BQU0sSUFBSSxHQUFVLEVBQUUsRUFBRSxjQUFjLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztJQUN6RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxXQUFnQixFQUFFLFNBQWlCO0lBQzVFLE1BQU0sRUFBRSxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUFVLEVBQUUsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO0lBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sT0FBTyxHQUFVLEVBQUUsRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDO0lBQzlDLE1BQU0sSUFBSSxHQUFpQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzlDLE1BQU0sSUFBSSxHQUFVLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO1FBQzVDLHNFQUFzRTtRQUN0RSxxRkFBcUY7UUFDckYsTUFBTSxPQUFPLEdBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO1FBQy9ELE1BQU0sUUFBUSxHQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO1FBQzFELE1BQU0sUUFBUSxHQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDbEYsTUFBTSxPQUFPLEdBQVE7WUFDbkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUks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QUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJlaXNzdWVBaXJwb3J0LFxuICBSZWlzc3VlQm9va2luZ0NvbnRleHQsXG4gIFJlaXNzdWVMZWcsXG4gIFJlaXNzdWVMZWdDaGFuZ2UsXG4gIFJlaXNzdWVTZWxlY3Rpb24sXG4gIFJlaXNzdWVUcmlwVHlwZSxcbn0gZnJvbSAnLi4vbW9kZWxzL3JlaXNzdWUudHlwZXMnO1xuXG4vKipcbiAqIFBvcnQgb2YgdGhlIHdlYidzIGBGbGlnaHRNYW5hZ2VCb29raW5nU2VydmljZS5uYXZpZ2F0ZVRvT25saW5lQm9va2luZygpYFxuICogKGFsbWF0YXItY29uc3VtZXItYXBwcykg4oCUIGJ1aWxkcyB0aGUgcXVlcnkgcGFyYW1zIG9mXG4gKiBgL2ZsaWdodHMvbWFuYWdlLWJvb2tpbmcvbGlzdGAsIHdoZXJlIHRoZSB3ZWIgY29udGludWVzIHRoZSByZWlzc3VlXG4gKiAoc2VhcmNoIC0+IHZpZXctcHJpY2UgLT4gY2hvb3NlLWZsaWdodCAtPiBwYXltZW50KS5cbiAqIEtlZXAgdGhlIHBhcmFtIG5hbWVzL3ZhbHVlcyBpZGVudGljYWwgdG8gdGhlIHdlYi5cbiAqL1xuXG5leHBvcnQgY29uc3QgUkVJU1NVRV9XRUJfUEFUSCA9ICcvZmxpZ2h0cy9tYW5hZ2UtYm9va2luZy9saXN0Lyc7XG5cbi8qKiBTYW1lIHN0cmluZ3MgYXMgdGhlIHdlYidzIGBGbGlnaHRNYW5hZ2VCb29raW5nQXNpZGVUYWJFbnVtYC4gKi9cbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IHtcbiAgY2hhbmdlX2RhdGU6ICdjaGFuZ2UtdHJhdmVsLWRhdGUtdGltZScsXG4gIGNoYW5nZV9yb3V0ZTogJ2NoYW5nZS1mbGlnaHQtcm91dGUnLFxufSBhcyBjb25zdDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgUmF3ID0gYW55O1xuXG4vLyDilIDilIAgZGF0ZSBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogYG1vbWVudC51dGMoc3RyKS52YWx1ZU9mKClgIOKAlCBzdHJpbmdzIHdpdGhvdXQgYSB0aW1lem9uZSBhcmUgcmVhZCBhcyBVVEMuICovXG5mdW5jdGlvbiB1dGNNcyh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaGFzVHogPSAvW3paXSR8WystXVxcZHsyfTo/XFxkezJ9JC8udGVzdCh2YWx1ZSk7XG4gIHJldHVybiBuZXcgRGF0ZShoYXNUeiA/IHZhbHVlIDogYCR7dmFsdWV9WmApLmdldFRpbWUoKTtcbn1cblxuLyoqIFdlYidzIGBnZXRBYnNvbHV0ZURhdGUoZGF0ZSlgIC0+IGBZWVlZLU1NLUREYCBvZiB0aGUgZGF0ZSBwYXJ0LiAqL1xuZnVuY3Rpb24gZGF0ZU9ubHkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5zbGljZSgwLCAxMCk7XG59XG5cbi8qKiBXZWIncyBgZ2V0QWJzb2x1dGVEYXRlKGRhdGUsIHRydWUpYCAtPiBVVEMgbWlkbmlnaHQgb2YgdGhhdCBjYWxlbmRhciBkYXkuICovXG5mdW5jdGlvbiBhYnNvbHV0ZU1zKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbeSwgbSwgZF0gPSBkYXRlT25seSh2YWx1ZSkuc3BsaXQoJy0nKS5tYXAoTnVtYmVyKTtcbiAgcmV0dXJuIERhdGUuVVRDKHksIG0gLSAxLCBkKTtcbn1cblxuZnVuY3Rpb24gY2FwaXRhbGl6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XG59XG5cbi8vIOKUgOKUgCBib29raW5nX2luZm8gLT4gY29udGV4dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gaW5mZXJUcmlwVHlwZShiaTogUmF3LCBsZWdzOiBSZWlzc3VlTGVnW10pOiBSZWlzc3VlVHJpcFR5cGUge1xuICBjb25zdCBleHBsaWNpdCA9IGJpPy5JdGVuZXJhcnlUcmlwVHlwZTtcbiAgaWYgKGV4cGxpY2l0ID09PSAnT25lV2F5JyB8fCBleHBsaWNpdCA9PT0gJ1JvdW5kVHJpcCcgfHwgZXhwbGljaXQgPT09ICdNdWx0aUNpdHknKSByZXR1cm4gZXhwbGljaXQ7XG4gIGlmIChsZWdzLmxlbmd0aCA8PSAxKSByZXR1cm4gJ09uZVdheSc7XG4gIGlmIChsZWdzLmxlbmd0aCA9PT0gMiAmJiBsZWdzWzFdLmRpcmVjdGlvbiA9PT0gJ1JldHVybicpIHJldHVybiAnUm91bmRUcmlwJztcbiAgcmV0dXJuICdNdWx0aUNpdHknO1xufVxuXG5mdW5jdGlvbiBjb3VudFBhc3NlbmdlcnMoYmk6IFJhdywgdHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgbGlzdDogUmF3W10gPSBiaT8ucGFzc2VuZ2VyX2luZm8/LnBhc3NlbmdlcnMgPz8gW107XG4gIHJldHVybiBsaXN0LmZpbHRlcihwID0+IHA/LnR5cGUgPT09IHR5cGUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBkYXNoYm9hcmQncyBgYm9va2luZ19pbmZvYCAoZnJvbSBgL3YxL2Zjci9ib29raW5nL2luZm9ybWF0aW9uYClcbiAqIGludG8gd2hhdCB0aGUgVVJMIGJ1aWxkZXIgbmVlZHMuIFJlYWRzIGRlZmVuc2l2ZWx5OiBhbnkgZmllbGQgbWlzc2luZyBpbiB0aGVcbiAqIEJPIHJlc3BvbnNlIGZhbGxzIGJhY2sgdG8gYW4gZW1wdHkgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlaXNzdWVCb29raW5nQ29udGV4dChib29raW5nRGF0YTogUmF3LCBib29raW5nSWQ6IHN0cmluZyk6IFJlaXNzdWVCb29raW5nQ29udGV4dCB8IG51bGwge1xuICBjb25zdCBiaSA9IGJvb2tpbmdEYXRhPy5kYXRhPy5ib29raW5nX2luZm87XG4gIGNvbnN0IGxlZ3NSYXc6IFJhd1tdID0gYmk/LmxlZ19pbmZvID8/IFtdO1xuICBpZiAoIWxlZ3NSYXcubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBhaXJsaW5lOiBSYXdbXSA9IGJpPy5haXJsaW5lX2luZm8gPz8gW107XG4gIGNvbnN0IGxlZ3M6IFJlaXNzdWVMZWdbXSA9IGxlZ3NSYXcubWFwKChsLCBpKSA9PiB7XG4gICAgY29uc3Qgc2VnczogUmF3W10gPSBhaXJsaW5lW2ldPy5TZWdtZW50cyA/PyBbXTtcbiAgICBjb25zdCBmaXJzdCA9IHNlZ3NbMF0gPz8ge307XG4gICAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXSA/PyBmaXJzdDtcbiAgICAvLyBTb21lIGJvb2tpbmdzIGNvbWUgYmFjayB3aXRoIGEgc3BhcnNlIGBsZWdfaW5mb2Ag4oCUIGZhbGwgYmFjayB0byB0aGVcbiAgICAvLyBmaXJzdC9sYXN0IHNlZ21lbnQgKGFpcmxpbmVfaW5mbywgdGhlbiBkdXJhdGlvbi90ZXJtaW5hbCkgZm9yIHRoZSByb3V0ZSBhbmQgdGltZXMuXG4gICAgY29uc3QgZHVyU2VnczogUmF3W10gPSBiaT8uZHVyYXRpb24/LmxlZ3M/LltpXT8uU2VnbWVudHMgPz8gW107XG4gICAgY29uc3QgdGVybVNlZ3M6IFJhd1tdID0gYmk/LnRlcm1pbmFsPy5baV0/LlNlZ21lbnRzID8/IFtdO1xuICAgIGNvbnN0IGZpcnN0QW55OiBSYXcgPSB7IC4uLih0ZXJtU2Vnc1swXSA/PyB7fSksIC4uLihkdXJTZWdzWzBdID8/IHt9KSwgLi4uZmlyc3QgfTtcbiAgICBjb25zdCBsYXN0QW55OiBSYXcgPSB7XG4gICAgICAuLi4odGVybVNlZ3NbdGVybVNlZ3MubGVuZ3RoIC0gMV0gPz8ge30pLFxuICAgICAgLi4uKGR1clNlZ3NbZHVyU2Vncy5sZW5ndGggLSAxXSA/PyB7fSksXG4gICAgICAuLi5sYXN0LFxuICAgIH07XG4gICAgY29uc3Qgb3JpZ2luQ29kZTogc3RyaW5nID0gbC5MZWdEZXBhcnR1cmVBaXJwb3J0Q29kZSA/PyBmaXJzdEFueS5EZXBhcnR1cmVBaXJwb3J0Q29kZSA/PyBmaXJzdEFueS5TZWdtZW50RGVwYXJ0dXJlQWlycG9ydENvZGUgPz8gJyc7XG4gICAgY29uc3QgZGVzdGluYXRpb25Db2RlOiBzdHJpbmcgPSBsLkxlZ0Fycml2YWxBaXJwb3J0Q29kZSA/PyBsYXN0QW55LkFycml2YWxBaXJwb3J0Q29kZSA/PyBsYXN0QW55LlNlZ21lbnRBcnJpdmFsQWlycG9ydENvZGUgPz8gJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIE5vIGlkIGluIHRoZSByZXNwb25zZSAtPiBhIHBvc2l0aW9uYWwgcGxhY2Vob2xkZXIgc28gdGhlIGRpYWxvZyBzdGlsbCB3b3Jrcy5cbiAgICAgIGxlZ0lkOiBsLkxlZ0lEID8/IGwubGVnSWQgPz8gbC5MZWdJZCA/PyBgbGVnLSR7aX1gLFxuICAgICAgZGlyZWN0aW9uOiBsLkxlZ0RpcmVjdGlvbmFsaXR5ID8/ICcnLFxuICAgICAgb3JpZ2luQ29kZSxcbiAgICAgIG9yaWdpbk5hbWU6IGwuTGVnRGVwYXJ0dXJlQWlycG9ydE5hbWUgPz8gZmlyc3RBbnkuRGVwYXJ0dXJlQWlycG9ydE5hbWUgPz8gJycsXG4gICAgICBvcmlnaW5DaXR5TmFtZTogbC5MZWdEZXBhcnR1cmVDaXR5TmFtZSA/PyBmaXJzdEFueS5TZWdtZW50RGVwYXJ0dXJlQ2l0eU5hbWUgPz8gZmlyc3RBbnkuRGVwYXJ0dXJlQWlycG9ydE5hbWUgPz8gb3JpZ2luQ29kZSxcbiAgICAgIG9yaWdpbkNvdW50cnlOYW1lOiBsLkxlZ0RlcGFydHVyZUNvdW50cnlOYW1lID8/IGZpcnN0QW55LlNlZ21lbnREZXBhcnR1cmVDb3VudHJ5TmFtZSA/PyAnJyxcbiAgICAgIGRlc3RpbmF0aW9uQ29kZSxcbiAgICAgIGRlc3RpbmF0aW9uTmFtZTogbC5MZWdBcnJpdmFsQWlycG9ydE5hbWUgPz8gbGFzdEFueS5BcnJpdmFsQWlycG9ydE5hbWUgPz8gJycsXG4gICAgICBkZXN0aW5hdGlvbkNpdHlOYW1lOiBsLkxlZ0Fycml2YWxDaXR5TmFtZSA/PyBsYXN0QW55LlNlZ21lbnRBcnJpdmFsQ2l0eU5hbWUgPz8gbGFzdEFueS5BcnJpdmFsQWlycG9ydE5hbWUgPz8gZGVzdGluYXRpb25Db2RlLFxuICAgICAgZGVzdGluYXRpb25Db3VudHJ5TmFtZTogbC5MZWdBcnJpdmFsQ291bnRyeU5hbWUgPz8gbGFzdEFueS5TZWdtZW50QXJyaXZhbENvdW50cnlOYW1lID8/ICcnLFxuICAgICAgZGVwYXJ0dXJlOlxuICAgICAgICBsLkxlZ0RlcGFydHVyZURhdGVUaW1lID8/IGZpcnN0QW55LkRlcGFydHVyZURhdGVUaW1lID8/IGZpcnN0QW55LlNlZ21lbnREZXBhcnR1cmVEYXRlVGltZSA/PyBmaXJzdEFueS5EZXBhcnR1cmVUaW1lID8/ICcnLFxuICAgICAgYXJyaXZhbDpcbiAgICAgICAgbC5MZWdBcnJpdmFsRGF0ZVRpbWUgPz8gbGFzdEFueS5BcnJpdmFsRGF0ZVRpbWUgPz8gbGFzdEFueS5TZWdtZW50QXJyaXZhbERhdGVUaW1lID8/IGxhc3RBbnkuQXJyaXZhbFRpbWUgPz8gJycsXG4gICAgICBhaXJsaW5lOiAobC5MZWdBaXJsaW5lc05hbWVzID8/IFtdKVswXSA/PyBmaXJzdC5BaXJsaW5lTmFtZSA/PyAnJyxcbiAgICAgIHN0b3BzOiAobC5TdG9wcyA/PyBbXSkubGVuZ3RoLFxuICAgICAgZmxpZ2h0Tm86IGZpcnN0LkFpcmxpbmVDb2RlID8gYCR7Zmlyc3QuQWlybGluZUNvZGV9JHtmaXJzdC5GbGlnaHROdW1iZXIgPz8gJyd9YCA6ICcnLFxuICAgIH07XG4gIH0pO1xuXG4gIGNvbnN0IGZpcnN0TGVnUmF3ID0gbGVnc1Jhd1swXTtcbiAgY29uc3QgZmlyc3RTZWc6IFJhdyA9IGFpcmxpbmVbMF0/LlNlZ21lbnRzPy5bMF0gPz8ge307XG4gIHJldHVybiB7XG4gICAgYm9va2luZ0lkOiBTdHJpbmcoYm9va2luZ0lkKSxcbiAgICB0cmlwVHlwZTogaW5mZXJUcmlwVHlwZShiaSwgbGVncyksXG4gICAgbGVncyxcbiAgICBhZHVsdHM6IGNvdW50UGFzc2VuZ2VycyhiaSwgJ0FEVCcpLFxuICAgIGNoaWxkcmVuOiBjb3VudFBhc3NlbmdlcnMoYmksICdDTk4nKSxcbiAgICBpbmZhbnRzOiBjb3VudFBhc3NlbmdlcnMoYmksICdJTkYnKSxcbiAgICAvLyBUaGUgQk8gcmVzcG9uc2UgbWF5IGNhcnJ5IG5vIGNhYmluIGF0IGFsbCAoc3BhcnNlIGJvb2tpbmdzKSDigJQgZGVmYXVsdCBzbyB0aGUgd2ViIHNlYXJjaCBzdGlsbCBnZXRzIGEgY2xhc3MuXG4gICAgY2FiaW5OYW1lOiBmaXJzdExlZ1Jhdy5MZWdDYWJpbnM/LlswXT8uTmFtZSA/PyAnRWNvbm9teScsXG4gICAgY2FiaW5Db2RlOiBmaXJzdExlZ1Jhdy5MZWdDYWJpbnM/LlswXT8uQ29kZSA/PyAnWScsXG4gICAgY3VycmVuY3k6IGJpPy5jdXJyZW5jeSA/PyBiaT8ucGF5bWVudF9zdGF0dXM/LmN1cnJlbmN5ID8/ICcnLFxuICAgIGFpcmxpbmVDb2RlOiBmaXJzdFNlZy5BaXJsaW5lQ29kZSA/PyAnJyxcbiAgICBmbGlnaHROdW1iZXI6IFN0cmluZyhmaXJzdFNlZy5GbGlnaHROdW1iZXIgPz8gJycpLFxuICAgIGFpcmxpbmVOYW1lOiAoZmlyc3RMZWdSYXcuTGVnQWlybGluZXNOYW1lcyA/PyBbXSlbMF0gPz8gZmlyc3RTZWcuQWlybGluZU5hbWUgPz8gJycsXG4gICAgdG90YWxTdG9wczogKGZpcnN0TGVnUmF3LlN0b3BzID8/IFtdKS5sZW5ndGgsXG4gIH07XG59XG5cbi8vIOKUgOKUgCBVUkwgYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gYWlycG9ydENpdHlMYWJlbChuYW1lOiBzdHJpbmcsIGNvdW50cnk6IHN0cmluZywgY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWUgfHwgY29kZX0ke2NvdW50cnkgPyAnLCAnICsgY291bnRyeSA6ICcnfSgke2NvZGV9KWA7XG59XG5cbmZ1bmN0aW9uIG90aGVyTGVnT2YoY3R4OiBSZWlzc3VlQm9va2luZ0NvbnRleHQsIGxlZ0lkOiBzdHJpbmcpIHtcbiAgY29uc3Qgb3RoZXIgPSBjdHgubGVncy5maW5kKGwgPT4gbC5sZWdJZCAhPT0gbGVnSWQpO1xuICByZXR1cm4gb3RoZXJcbiAgICA/IHtcbiAgICAgICAgbGVnSWQ6IG90aGVyLmxlZ0lkLFxuICAgICAgICBkZXBhcnREYXRlVGltZTogb3RoZXIuZGVwYXJ0dXJlLFxuICAgICAgICBkZXN0aW5hdGlvbkNvZGU6IG90aGVyLmRlc3RpbmF0aW9uQ29kZSxcbiAgICAgICAgb3JpZ2luQ29kZTogb3RoZXIub3JpZ2luQ29kZSxcbiAgICAgICAgaXNSZXR1cm46IG90aGVyLmRpcmVjdGlvbiA9PT0gJ1JldHVybicsXG4gICAgICB9XG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlaXNzdWVTZWFyY2hQYXJhbXMoXG4gIHJhd0N0eDogUmVpc3N1ZUJvb2tpbmdDb250ZXh0LFxuICBzZWxlY3Rpb246IFJlaXNzdWVTZWxlY3Rpb24sXG4gIHBvc3RCb29raW5nSWQ6IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAvLyBUaGUgQk8gYm9va2luZyBpbmZvcm1hdGlvbiBtYXkgY2Fycnkgbm8gbGVnIGRhdGVzIGF0IGFsbC4gV2l0aG91dCBhbiBvcmlnaW5hbCBkYXRlIHRoZVxuICAvLyB3ZWIncyBgZGVwYXJ0dXJlYCAvIGByZXR1cm5gIC8gYHVwZGF0aW5nTGVnc2Agd291bGQgYmUgTmFOLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGRhdGUgdGhlXG4gIC8vIGFnZW50IHBpY2tlZCAob3IgdG9kYXkpIOKAlCBvbmx5IGFmZmVjdHMgc3BhcnNlIGJvb2tpbmdzOyByZWFsIG9uZXMgaGF2ZSBgTGVnRGVwYXJ0dXJlRGF0ZVRpbWVgLlxuICBjb25zdCBmYWxsYmFja0RhdGUgPSBgJHtzZWxlY3Rpb24ubGVncy5maW5kKGMgPT4gYy5kZXBhcnREYXRlKT8uZGVwYXJ0RGF0ZSA/PyBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tQ0EnKX1UMDA6MDA6MDBgO1xuICBjb25zdCBjdHg6IFJlaXNzdWVCb29raW5nQ29udGV4dCA9IHtcbiAgICAuLi5yYXdDdHgsXG4gICAgbGVnczogcmF3Q3R4LmxlZ3MubWFwKGwgPT4gKGwuZGVwYXJ0dXJlID8gbCA6IHsgLi4ubCwgZGVwYXJ0dXJlOiBmYWxsYmFja0RhdGUgfSkpLFxuICB9O1xuICBjb25zdCBpc0RhdGUgPSBzZWxlY3Rpb24uc2VydmljZSA9PT0gJ2NoYW5nZV9kYXRlJztcbiAgY29uc3QgbGVnMCA9IGN0eC5sZWdzWzBdO1xuICBjb25zdCBjaGFuZ2VzID0gc2VsZWN0aW9uLmxlZ3M7XG4gIGNvbnN0IGxlZ09mID0gKGM6IFJlaXNzdWVMZWdDaGFuZ2UpID0+IGN0eC5sZWdzLmZpbmQobCA9PiBsLmxlZ0lkID09PSBjLmxlZ0lkKSA/PyBsZWcwO1xuXG4gIC8vIGBjb25maWcubGVnc2AgaW4gdGhlIHdlYi5cbiAgY29uc3QgbGVnc1BheWxvYWQgPSBjaGFuZ2VzLm1hcChjID0+IHtcbiAgICBjb25zdCBvcmlnID0gbGVnT2YoYyk7XG4gICAgaWYgKGlzRGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVnSWQ6IGMubGVnSWQsXG4gICAgICAgIC4uLihjdHgudHJpcFR5cGUgPT09ICdNdWx0aUNpdHknID8geyB0b3VjaGVkOiB0cnVlIH0gOiB7fSksXG4gICAgICAgIGRlcGFydERhdGVUaW1lOiBkYXRlT25seShjLmRlcGFydERhdGUgPz8gb3JpZy5kZXBhcnR1cmUpLFxuICAgICAgICBkZXN0aW5hdGlvbkNvZGU6IG9yaWcuZGVzdGluYXRpb25Db2RlLFxuICAgICAgICBvcmlnaW5Db2RlOiBvcmlnLm9yaWdpbkNvZGUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVnSWQ6IGMubGVnSWQsXG4gICAgICBvcmlnaW5Db2RlOiBjLm9yaWdpbj8uaWQgPz8gb3JpZy5vcmlnaW5Db2RlLFxuICAgICAgb3JpZ2luQ2l0eU5hbWU6IGMub3JpZ2luPy5jaXR5X25hbWUgfHwgYy5vcmlnaW4/Lm5hbWUgfHwgb3JpZy5vcmlnaW5DaXR5TmFtZSxcbiAgICAgIGRlc3RpbmF0aW9uQ29kZTogYy5kZXN0aW5hdGlvbj8uaWQgPz8gb3JpZy5kZXN0aW5hdGlvbkNvZGUsXG4gICAgICBkZXN0aW5hdGlvbkNpdHlOYW1lOiBjLmRlc3RpbmF0aW9uPy5jaXR5X25hbWUgfHwgYy5kZXN0aW5hdGlvbj8ubmFtZSB8fCBvcmlnLmRlc3RpbmF0aW9uQ2l0eU5hbWUsXG4gICAgICBkZXBhcnREYXRlVGltZTogb3JpZy5kZXBhcnR1cmUsXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gYHJvdXRlQ29uZmlnYCBpbiB0aGUgd2ViLlxuICBjb25zdCBmaXJzdCA9IGNoYW5nZXNbMF07XG4gIGNvbnN0IHJvdXRlT3JpZ2luOiBSZWlzc3VlQWlycG9ydCB8IHVuZGVmaW5lZCA9ICFpc0RhdGUgPyBmaXJzdD8ub3JpZ2luIDogdW5kZWZpbmVkO1xuICBjb25zdCByb3V0ZURlc3Q6IFJlaXNzdWVBaXJwb3J0IHwgdW5kZWZpbmVkID0gIWlzRGF0ZSA/IGZpcnN0Py5kZXN0aW5hdGlvbiA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgcm91dGVEZXBhcnR1cmUgPSBpc0RhdGUgPyBgJHtkYXRlT25seShjaGFuZ2VzWzBdLmRlcGFydERhdGUgPz8gbGVnMC5kZXBhcnR1cmUpfVQwMDowMDowMGAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJvdXRlUmV0dXJuID1cbiAgICBpc0RhdGUgJiYgY2hhbmdlcy5sZW5ndGggPiAxXG4gICAgICA/IGAke2RhdGVPbmx5KGNoYW5nZXNbMV0uZGVwYXJ0RGF0ZSA/PyBjdHgubGVnc1sxXT8uZGVwYXJ0dXJlID8/ICcnKX1UMDA6MDA6MDBgXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBvcmlnaW4gPSByb3V0ZU9yaWdpbj8uaWQgPz8gbGVnMC5vcmlnaW5Db2RlO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IHJvdXRlRGVzdD8uaWQgPz8gbGVnMC5kZXN0aW5hdGlvbkNvZGU7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGN0eC5jYWJpbk5hbWUudG9VcHBlckNhc2UoKS5pbmNsdWRlcygnRUNPTk9NWScpXG4gICAgPyBjYXBpdGFsaXplKGN0eC5jYWJpbk5hbWUucmVwbGFjZSgvXFxzKy9nLCAnJykpXG4gICAgOiBjdHguY2FiaW5OYW1lO1xuXG4gIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgZmxpZ2h0U2VhcmNoSWQ6IGN0eC5ib29raW5nSWQsXG4gICAgY2F0ZWdvcnk6ICdmbGlnaHRzJyxcbiAgICBpZDogYCR7Y3R4LmFpcmxpbmVDb2RlfS0ke2N0eC5mbGlnaHROdW1iZXJ9YCxcbiAgICBvcmlnaW4sXG4gICAgb3JpZ2luQ2l0eTogcm91dGVPcmlnaW5cbiAgICAgID8gcm91dGVPcmlnaW4ubmFtZSB8fCBgJHtyb3V0ZU9yaWdpbi5jaXR5X25hbWV9LCAke3JvdXRlT3JpZ2luLmNvdW50cnlfbmFtZX1gXG4gICAgICA6IGFpcnBvcnRDaXR5TGFiZWwobGVnMC5vcmlnaW5OYW1lLCBsZWcwLm9yaWdpbkNvdW50cnlOYW1lLCBsZWcwLm9yaWdpbkNvZGUpLFxuICAgIG9yaWdpbkNpdHlOYW1lOiByb3V0ZU9yaWdpbj8uY2l0eV9uYW1lID8/IGxlZzAub3JpZ2luQ2l0eU5hbWUsXG4gICAgb3JpZ2luQ291bnRyeU5hbWU6IHJvdXRlT3JpZ2luPy5jb3VudHJ5X25hbWUgPz8gbGVnMC5vcmlnaW5Db3VudHJ5TmFtZSxcbiAgICBkZXN0aW5hdGlvbkNpdHlOYW1lOiByb3V0ZURlc3Q/LmNpdHlfbmFtZSA/PyBsZWcwLmRlc3RpbmF0aW9uQ2l0eU5hbWUsXG4gICAgZGVzdGluYXRpb25DaXR5OiByb3V0ZURlc3RcbiAgICAgID8gcm91dGVEZXN0Lm5hbWUgfHwgYCR7cm91dGVEZXN0LmNpdHlfbmFtZX0sICR7cm91dGVEZXN0LmNvdW50cnlfbmFtZX1gXG4gICAgICA6IGFpcnBvcnRDaXR5TGFiZWwobGVnMC5kZXN0aW5hdGlvbk5hbWUsIGxlZzAuZGVzdGluYXRpb25Db3VudHJ5TmFtZSwgbGVnMC5kZXN0aW5hdGlvbkNvZGUpLFxuICAgIGRlc3RpbmF0aW9uQ291bnRyeU5hbWU6IHJvdXRlRGVzdD8uY291bnRyeV9uYW1lID8/IGxlZzAuZGVzdGluYXRpb25Db3VudHJ5TmFtZSxcbiAgICBkZXN0aW5hdGlvbixcbiAgICBkZXBhcnR1cmVGbGlnaHRBaXJsaW5lczogY3R4LmFpcmxpbmVOYW1lLFxuICAgIGFkdWx0OiBjdHguYWR1bHRzLFxuICAgIGNoaWxkOiBjdHguY2hpbGRyZW4sXG4gICAgbGFwaW5mYW50OiBjdHguaW5mYW50cyxcbiAgICBjbGFzczogY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZTogY3R4LmNhYmluQ29kZSxcbiAgICBkZXBhcnR1cmU6IHV0Y01zKHJvdXRlRGVwYXJ0dXJlID8/IGxlZzAuZGVwYXJ0dXJlKSxcbiAgICBpbmZhbnRvbmNoYWlyOiAwLFxuICAgIG9yaWdpblR5cGU6IHJvdXRlT3JpZ2luPy50eXBlID8/ICdjaXR5JyxcbiAgICBkZXN0aW5hdGlvblR5cGU6IHJvdXRlRGVzdD8udHlwZSA/PyAnY2l0eScsXG4gICAgaXNEaXJlY3Q6ICdmYWxzZScsXG4gICAgc2VydmljZU5hbWU6IFNFUlZJQ0VfTkFNRVtzZWxlY3Rpb24uc2VydmljZV0sXG4gICAgY3VycmVuY3k6IGN0eC5jdXJyZW5jeSxcbiAgICBjbGFzc1R5cGU6IGN0eC5jYWJpbkNvZGUsXG4gICAgY29ubmVjdGlvbjogY3R4LnRyaXBUeXBlLFxuICAgIGRpcmVjdEZsaWdodHM6IGN0eC50b3RhbFN0b3BzID09PSAwLFxuICAgIGZsZXhpYmxlRGF0ZXM6IGZhbHNlLFxuICAgIGxlZ3M6IEpTT04uc3RyaW5naWZ5KGxlZ3NQYXlsb2FkKSxcbiAgICAvLyBMZXRzIHRoZSByZXN1bHRzIHBhZ2Ugc2hvdyBhbiBcIlVQREFUSU5HIE5PV1wiIGJhbm5lciBwZXIgY2hhbmdlZCBsZWcuXG4gICAgdXBkYXRpbmdMZWdzOiBKU09OLnN0cmluZ2lmeShcbiAgICAgIGNoYW5nZXMubWFwKGMgPT4ge1xuICAgICAgICBjb25zdCBvID0gbGVnT2YoYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGVnSWQ6IG8ubGVnSWQsXG4gICAgICAgICAgZGlyZWN0aW9uOiBvLmRpcmVjdGlvbixcbiAgICAgICAgICBvcmlnaW5Db2RlOiBvLm9yaWdpbkNvZGUsXG4gICAgICAgICAgZGVzdGluYXRpb25Db2RlOiBvLmRlc3RpbmF0aW9uQ29kZSxcbiAgICAgICAgICBvcmlnaW5DaXR5TmFtZTogby5vcmlnaW5DaXR5TmFtZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkNpdHlOYW1lOiBvLmRlc3RpbmF0aW9uQ2l0eU5hbWUsXG4gICAgICAgICAgb3JpZ2luYWxEZXBhcnR1cmU6IHV0Y01zKG8uZGVwYXJ0dXJlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICksXG4gIH07XG5cbiAgaWYgKGN0eC50cmlwVHlwZSA9PT0gJ1JvdW5kVHJpcCcpIHtcbiAgICBjb25zdCBzZWNvbmRMZWcgPSBjdHgubGVnc1sxXTtcbiAgICBwYXJhbXNbJ3JldHVybiddID0gcm91dGVSZXR1cm5cbiAgICAgID8gdXRjTXMocm91dGVSZXR1cm4pXG4gICAgICA6IHNlY29uZExlZ1xuICAgICAgICA/IHV0Y01zKHNlY29uZExlZy5kZXBhcnR1cmUpIC8vIHRoZSB3ZWIgcGFyc2VzIHRoaXMgb25lIGluIHRoZSBjdXN0b21lcidzIHRpbWV6b25lOyByZWFkIGFzIFVUQyBoZXJlIHNvIGl0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBhZ2VudCdzIHRpbWV6b25lXG4gICAgICAgIDogdXRjTXMoU3RyaW5nKChsZWdzUGF5bG9hZFswXSBhcyBSYXcpLmRlcGFydERhdGVUaW1lKSk7XG5cbiAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG90aGVyID0gb3RoZXJMZWdPZihjdHgsIGNoYW5nZXNbMF0ubGVnSWQpO1xuICAgICAgaWYgKGlzRGF0ZSAmJiBvdGhlciAmJiAhb3RoZXIuaXNSZXR1cm4pIHtcbiAgICAgICAgcGFyYW1zWydkZXBhcnR1cmUnXSA9IHV0Y01zKG90aGVyLmRlcGFydERhdGVUaW1lKTtcbiAgICAgICAgcGFyYW1zWydyZXR1cm4nXSA9IHV0Y01zKFN0cmluZygobGVnc1BheWxvYWRbMF0gYXMgUmF3KS5kZXBhcnREYXRlVGltZSkpO1xuICAgICAgfVxuICAgICAgaWYgKG90aGVyKSBwYXJhbXNbJ2V4dHJhTGVnJ10gPSBKU09OLnN0cmluZ2lmeShvdGhlcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN0eC50cmlwVHlwZSA9PT0gJ011bHRpQ2l0eScpIHtcbiAgICBsZXQgY2l0aWVzOiBSYXdbXTtcbiAgICBpZiAoaXNEYXRlKSB7XG4gICAgICBjb25zdCBjaGFuZ2VkRGF0ZSA9IG5ldyBNYXAoY2hhbmdlcy5tYXAoYyA9PiBbYy5sZWdJZCwgYy5kZXBhcnREYXRlXSkpO1xuICAgICAgY2l0aWVzID0gY3R4LmxlZ3MubWFwKGwgPT4gKHtcbiAgICAgICAgZGVwYXJ0dXJlOiBhYnNvbHV0ZU1zKGNoYW5nZWREYXRlLmdldChsLmxlZ0lkKSB8fCBsLmRlcGFydHVyZSksXG4gICAgICAgIGRlc3RpbmF0aW9uOiBsLmRlc3RpbmF0aW9uQ29kZSxcbiAgICAgICAgZGVzdGluYXRpb25UeXBlOiBsLmRlc3RpbmF0aW9uQ29kZSxcbiAgICAgICAgb3JpZ2luOiBsLm9yaWdpbkNvZGUsXG4gICAgICAgIG9yaWdpblR5cGU6IGwub3JpZ2luQ29kZSxcbiAgICAgICAgZGVzdGluYXRpb25DaXR5OiBsLmRlc3RpbmF0aW9uQ2l0eU5hbWUsXG4gICAgICAgIGRlc3RpbmF0aW9uQ2l0eU5hbWU6IGwuZGVzdGluYXRpb25DaXR5TmFtZSxcbiAgICAgICAgZGVzdGluYXRpb25OYW1lOiBsLmRlc3RpbmF0aW9uQ2l0eU5hbWUsXG4gICAgICAgIGRlc3RpbmF0aW9uQ291bnRyeU5hbWU6IGwuZGVzdGluYXRpb25Db3VudHJ5TmFtZSxcbiAgICAgICAgb3JpZ2luQ2l0eTogbC5vcmlnaW5DaXR5TmFtZSxcbiAgICAgICAgb3JpZ2luQ2l0eU5hbWU6IGwub3JpZ2luQ2l0eU5hbWUsXG4gICAgICAgIG9yaWdpbk5hbWU6IGwub3JpZ2luQ2l0eU5hbWUsXG4gICAgICAgIG9yaWdpbkNvdW50cnlOYW1lOiBsLm9yaWdpbkNvdW50cnlOYW1lLFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaXRpZXMgPSBjaGFuZ2VzLm1hcChjID0+IHtcbiAgICAgICAgY29uc3QgbyA9IGxlZ09mKGMpO1xuICAgICAgICBjb25zdCBmcm9tID0gYy5vcmlnaW47XG4gICAgICAgIGNvbnN0IHRvID0gYy5kZXN0aW5hdGlvbjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZXBhcnR1cmU6IHV0Y01zKG8uZGVwYXJ0dXJlKSxcbiAgICAgICAgICBkZXN0aW5hdGlvbjogdG8/LmlkID8/IG8uZGVzdGluYXRpb25Db2RlLFxuICAgICAgICAgIGRlc3RpbmF0aW9uVHlwZTogdG8/LnR5cGUgPz8gby5kZXN0aW5hdGlvbkNvZGUsXG4gICAgICAgICAgb3JpZ2luOiBmcm9tPy5pZCA/PyBvLm9yaWdpbkNvZGUsXG4gICAgICAgICAgb3JpZ2luVHlwZTogZnJvbT8uaWQgPz8gby5vcmlnaW5Db2RlLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQ2l0eTogdG8/Lm5hbWUgPz8gby5kZXN0aW5hdGlvbkNpdHlOYW1lLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQ2l0eU5hbWU6IHRvPy5uYW1lID8/IG8uZGVzdGluYXRpb25DaXR5TmFtZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbk5hbWU6IHRvPy5uYW1lID8/IG8uZGVzdGluYXRpb25DaXR5TmFtZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkNvdW50cnlOYW1lOiB0bz8uY291bnRyeV9uYW1lID8/IG8uZGVzdGluYXRpb25Db3VudHJ5TmFtZSxcbiAgICAgICAgICBvcmlnaW5DaXR5OiBmcm9tPy5uYW1lID8/IG8ub3JpZ2luQ2l0eU5hbWUsXG4gICAgICAgICAgb3JpZ2luQ2l0eU5hbWU6IGZyb20/Lm5hbWUgPz8gby5vcmlnaW5DaXR5TmFtZSxcbiAgICAgICAgICBvcmlnaW5OYW1lOiBmcm9tPy5uYW1lID8/IG8ub3JpZ2luQ2l0eU5hbWUsXG4gICAgICAgICAgb3JpZ2luQ291bnRyeU5hbWU6IGZyb20/LmNvdW50cnlfbmFtZSA/PyBvLm9yaWdpbkNvdW50cnlOYW1lLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHBhcmFtc1snZGVwYXJ0dXJlJ10gPSBjaXRpZXNbMF0uZGVwYXJ0dXJlO1xuICAgIHBhcmFtc1snY2l0aWVzJ10gPSBKU09OLnN0cmluZ2lmeShjaXRpZXMpO1xuICB9XG5cbiAgcGFyYW1zWydib29raW5nSWQnXSA9IGN0eC5ib29raW5nSWQ7XG4gIHBhcmFtc1sncG9zdEJvb2tpbmdJZCddID0gcG9zdEJvb2tpbmdJZDtcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcylcbiAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbClcbiAgICAgIC5tYXAoKFtrLCB2XSkgPT4gW2ssIFN0cmluZyh2KV0pLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZWlzc3VlU2VhcmNoVXJsKFxuICB3ZWJCYXNlVXJsOiBzdHJpbmcsXG4gIGN0eDogUmVpc3N1ZUJvb2tpbmdDb250ZXh0LFxuICBzZWxlY3Rpb246IFJlaXNzdWVTZWxlY3Rpb24sXG4gIHBvc3RCb29raW5nSWQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhidWlsZFJlaXNzdWVTZWFyY2hQYXJhbXMoY3R4LCBzZWxlY3Rpb24sIHBvc3RCb29raW5nSWQpKTtcbiAgcmV0dXJuIGAke3dlYkJhc2VVcmwucmVwbGFjZSgvXFwvKyQvLCAnJyl9JHtSRUlTU1VFX1dFQl9QQVRIfT8ke3FzLnRvU3RyaW5nKCl9YDtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBob3N0J3MgYXV0aCBwYXJhbWV0ZXJzIChmb3IgZXhhbXBsZSBpdHMgdG9rZW4pIHRvIHRoZSB3ZWIgbGluazogaW4gdGhlIHF1ZXJ5IHN0cmluZywgb3IgaW4gdGhlIGAjZnJhZ21lbnRgXG4gKiAod2hpY2ggYnJvd3NlcnMgZG8gbm90IHNlbmQgdG8gc2VydmVycyBvciBpbiB0aGUgUmVmZXJlcikuIEVtcHR5IHZhbHVlcyBhcmUgc2tpcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZEF1dGhQYXJhbXModXJsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgd2hlcmU6ICdxdWVyeScgfCAnaGFzaCcgPSAncXVlcnknKTogc3RyaW5nIHtcbiAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHBhcmFtcyA/PyB7fSkuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICEhdmFsdWUpO1xuICBpZiAoIWVudHJpZXMubGVuZ3RoKSByZXR1cm4gdXJsO1xuICBjb25zdCB0YXJnZXQgPSBuZXcgVVJMKHVybCk7XG4gIGlmICh3aGVyZSA9PT0gJ2hhc2gnKSB7XG4gICAgY29uc3QgaGFzaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXModGFyZ2V0Lmhhc2gucmVwbGFjZSgvXiMvLCAnJykpO1xuICAgIGVudHJpZXMuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4gaGFzaC5zZXQobmFtZSwgdmFsdWUpKTtcbiAgICB0YXJnZXQuaGFzaCA9IGhhc2gudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICBlbnRyaWVzLmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+IHRhcmdldC5zZWFyY2hQYXJhbXMuc2V0KG5hbWUsIHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldC50b1N0cmluZygpO1xufVxuIl19
@@ -6,4 +6,6 @@ export { SmartBookingDashboardComponent } from './lib/pages/smart-booking-dashbo
6
6
  export { smartBookingDashboardRoutes } from './lib/smart-booking-dashboard.routes';
7
7
  export { SmartBookingDashboardModule } from './lib/smart-booking-dashboard.module';
8
8
  export { SBD_CONFIG, SBD_DEFAULT_CONFIG, provideSmartBookingDashboard } from './lib/config/dashboard.config';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIG9mIHRoZSBTbWFydCBCb29raW5nIERhc2hib2FyZC5cbiAqIEhvc3QgYXBwcyBzaG91bGQgaW1wb3J0IG9ubHkgZnJvbSB0aGlzIGZpbGUuXG4gKi9cbmV4cG9ydCB7IFNtYXJ0Qm9va2luZ0Rhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJy4vbGliL3BhZ2VzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5leHBvcnQgeyBzbWFydEJvb2tpbmdEYXNoYm9hcmRSb3V0ZXMgfSBmcm9tICcuL2xpYi9zbWFydC1ib29raW5nLWRhc2hib2FyZC5yb3V0ZXMnO1xuZXhwb3J0IHsgU21hcnRCb29raW5nRGFzaGJvYXJkTW9kdWxlIH0gZnJvbSAnLi9saWIvc21hcnQtYm9va2luZy1kYXNoYm9hcmQubW9kdWxlJztcbmV4cG9ydCB7IFNCRF9DT05GSUcsIFNCRF9ERUZBVUxUX0NPTkZJRywgcHJvdmlkZVNtYXJ0Qm9va2luZ0Rhc2hib2FyZCB9IGZyb20gJy4vbGliL2NvbmZpZy9kYXNoYm9hcmQuY29uZmlnJztcbmV4cG9ydCB0eXBlIHsgU2JkQ29uZmlnIH0gZnJvbSAnLi9saWIvY29uZmlnL2Rhc2hib2FyZC5jb25maWcnO1xuIl19
9
+ export { buildReissueSearchUrl, buildReissueSearchParams, buildReissueBookingContext, appendAuthParams } from './lib/utils/reissue-url.builder';
10
+ export { SBD_TOAST_HANDLER } from './lib/services/toast.service';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU3RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoSixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIG9mIHRoZSBTbWFydCBCb29raW5nIERhc2hib2FyZC5cbiAqIEhvc3QgYXBwcyBzaG91bGQgaW1wb3J0IG9ubHkgZnJvbSB0aGlzIGZpbGUuXG4gKi9cbmV4cG9ydCB7IFNtYXJ0Qm9va2luZ0Rhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJy4vbGliL3BhZ2VzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5leHBvcnQgeyBzbWFydEJvb2tpbmdEYXNoYm9hcmRSb3V0ZXMgfSBmcm9tICcuL2xpYi9zbWFydC1ib29raW5nLWRhc2hib2FyZC5yb3V0ZXMnO1xuZXhwb3J0IHsgU21hcnRCb29raW5nRGFzaGJvYXJkTW9kdWxlIH0gZnJvbSAnLi9saWIvc21hcnQtYm9va2luZy1kYXNoYm9hcmQubW9kdWxlJztcbmV4cG9ydCB7IFNCRF9DT05GSUcsIFNCRF9ERUZBVUxUX0NPTkZJRywgcHJvdmlkZVNtYXJ0Qm9va2luZ0Rhc2hib2FyZCB9IGZyb20gJy4vbGliL2NvbmZpZy9kYXNoYm9hcmQuY29uZmlnJztcbmV4cG9ydCB0eXBlIHsgU2JkQ29uZmlnLCBTYmRSZWRpcmVjdEF1dGhQYXJhbXMgfSBmcm9tICcuL2xpYi9jb25maWcvZGFzaGJvYXJkLmNvbmZpZyc7XG5leHBvcnQgeyBidWlsZFJlaXNzdWVTZWFyY2hVcmwsIGJ1aWxkUmVpc3N1ZVNlYXJjaFBhcmFtcywgYnVpbGRSZWlzc3VlQm9va2luZ0NvbnRleHQsIGFwcGVuZEF1dGhQYXJhbXMgfSBmcm9tICcuL2xpYi91dGlscy9yZWlzc3VlLXVybC5idWlsZGVyJztcbmV4cG9ydCB0eXBlICogZnJvbSAnLi9saWIvbW9kZWxzL3JlaXNzdWUudHlwZXMnO1xuZXhwb3J0IHsgU0JEX1RPQVNUX0hBTkRMRVIgfSBmcm9tICcuL2xpYi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcbmV4cG9ydCB0eXBlIHsgU2JkVG9hc3RIYW5kbGVyIH0gZnJvbSAnLi9saWIvc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG4iXX0=