@almatar/smart-booking-dashboard 0.0.1 → 0.0.2-alpha.3
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/esm2022/lib/components/action-card/action-card.component.mjs +3 -3
- package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +3 -3
- package/esm2022/lib/components/almatar-aside/aside-back-button.service.mjs +24 -0
- package/esm2022/lib/components/almatar-aside/aside.component.mjs +122 -0
- package/esm2022/lib/components/booking-input/booking-input.component.mjs +4 -3
- package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +53 -4
- package/esm2022/lib/components/data-search/data-search.component.mjs +3 -3
- package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +544 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.mjs +43 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +296 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +88 -0
- 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 +242 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.mjs +48 -0
- package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +129 -0
- package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +321 -0
- package/esm2022/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.mjs +52 -0
- package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.mjs +9 -0
- package/esm2022/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.mjs +7 -0
- package/esm2022/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.mjs +2 -0
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +457 -0
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.mjs +55 -0
- package/esm2022/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.mjs +48 -0
- package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
- package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
- package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
- package/esm2022/lib/components/result-panel/result-panel.component.mjs +3 -3
- package/esm2022/lib/components/shared/components/confirm-modal/confirm-modal.component.mjs +75 -0
- package/esm2022/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.mjs +46 -0
- package/esm2022/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.mjs +9 -0
- package/esm2022/lib/components/shared/interfaces/i-flight-refund-details.mjs +86 -0
- package/esm2022/lib/components/shared/models/cancel-hotel-booking.model.mjs +7 -0
- package/esm2022/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.mjs +27 -0
- package/esm2022/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.mjs +17 -0
- package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
- package/esm2022/lib/config/dashboard.config.mjs +3 -1
- package/esm2022/lib/config/hotel-actions.config.mjs +21 -1
- package/esm2022/lib/models/booking.types.mjs +73 -2
- package/esm2022/lib/models/reissue.types.mjs +2 -0
- package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +31 -7
- package/esm2022/lib/services/booking.service.mjs +6 -2
- package/esm2022/lib/services/reissue.service.mjs +142 -0
- package/esm2022/lib/services/toast.service.mjs +15 -7
- package/esm2022/lib/shared/components/currency-code-icon/currency-code-icon.component.mjs +35 -0
- package/esm2022/lib/shared/enums/brand-enums.enum.mjs +7 -0
- package/esm2022/lib/shared/environments/environment.mjs +10 -0
- package/esm2022/lib/shared/models/index.mjs +6 -0
- package/esm2022/lib/shared/modules/almatar-icon/almatar-icon.module.mjs +36 -0
- package/esm2022/lib/shared/modules/loader/loader.module.mjs +43 -0
- package/esm2022/lib/shared/pipes/exchange.pipe.mjs +49 -0
- package/esm2022/lib/shared/services/api.service.mjs +42 -0
- package/esm2022/lib/shared/services/shared.service.mjs +34 -0
- package/esm2022/lib/shared/services/translation.service.mjs +61 -0
- package/esm2022/lib/shared/services/webengage-tracking.service.mjs +28 -0
- package/esm2022/lib/shared/store/selectors/currency.selectors.mjs +9 -0
- package/esm2022/lib/utils/reissue-format.mjs +64 -0
- package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/almatar-smart-booking-dashboard.mjs +5387 -395
- package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
- package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
- package/lib/components/almatar-aside/aside-back-button.service.d.ts +11 -0
- package/lib/components/almatar-aside/aside.component.d.ts +46 -0
- package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +7 -0
- package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +97 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-method/almatar-hotel-auto-cancellation-refund-method.component.d.ts +25 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +91 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.d.ts +39 -0
- package/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.d.ts +44 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-refundable-room/almatar-hotel-auto-cancellation-refundable-room.component.d.ts +19 -0
- package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +38 -0
- package/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.d.ts +142 -0
- package/lib/components/hotel-cancel/components/result-overlay/result-overlay.component.d.ts +23 -0
- package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-endpoints.enum.d.ts +7 -0
- package/lib/components/hotel-cancel/enums/almatar-hotel-auto-cancellation-step.enum.d.ts +5 -0
- package/lib/components/hotel-cancel/interfaces/i-almatar-hotel-auto-cancellation.interface.d.ts +252 -0
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +88 -0
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation.service.d.ts +21 -0
- package/lib/components/hotel-itinerary-card/hotel-itinerary-card.component.d.ts +16 -0
- package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
- package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
- package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
- package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
- package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
- package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
- package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
- package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
- package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
- package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
- package/lib/components/result-panel/result-panel.component.d.ts +1 -1
- package/lib/components/shared/components/confirm-modal/confirm-modal.component.d.ts +17 -0
- package/lib/components/shared/components/manage-booking-failed-modal/manage-booking-failed-modal.component.d.ts +10 -0
- package/lib/components/shared/enums/hotel-manage-booking-aside-tab.enum.d.ts +7 -0
- package/lib/components/shared/interfaces/i-flight-refund-details.d.ts +73 -0
- package/lib/components/shared/models/cancel-hotel-booking.model.d.ts +6 -0
- package/lib/components/shared/services/hotel-manage-booking/hotel-manage-booking.service.d.ts +11 -0
- package/lib/components/shared/services/hotel-manage-booking-endpoints/hotel-manage-booking-endpoints.service.d.ts +7 -0
- package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
- package/lib/config/dashboard.config.d.ts +29 -0
- package/lib/models/booking.types.d.ts +28 -0
- package/lib/models/reissue.types.d.ts +147 -0
- package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +5 -1
- package/lib/services/reissue.service.d.ts +45 -0
- package/lib/services/toast.service.d.ts +14 -1
- package/lib/shared/components/currency-code-icon/currency-code-icon.component.d.ts +13 -0
- package/lib/shared/enums/brand-enums.enum.d.ts +5 -0
- package/lib/shared/environments/environment.d.ts +7 -0
- package/lib/shared/models/index.d.ts +11 -0
- package/lib/shared/modules/almatar-icon/almatar-icon.module.d.ts +13 -0
- package/lib/shared/modules/loader/loader.module.d.ts +13 -0
- package/lib/shared/pipes/exchange.pipe.d.ts +17 -0
- package/lib/shared/services/api.service.d.ts +43 -0
- package/lib/shared/services/shared.service.d.ts +12 -0
- package/lib/shared/services/translation.service.d.ts +17 -0
- package/lib/shared/services/webengage-tracking.service.d.ts +8 -0
- package/lib/shared/store/selectors/currency.selectors.d.ts +2 -0
- package/lib/utils/reissue-format.d.ts +28 -0
- package/lib/utils/reissue-url.builder.d.ts +24 -0
- package/package.json +9 -24
- package/public-api.d.ts +5 -1
- package/LICENSE +0 -21
- package/README.md +0 -132
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class WebengageTrackingService {
|
|
4
|
+
addEvent(eventName, eventData) {
|
|
5
|
+
// Stub implementation - does nothing in library context
|
|
6
|
+
if (typeof eventName === 'string') {
|
|
7
|
+
console.log('WebengageTracking:', eventName, eventData);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
console.log('WebengageTracking:', eventName);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
setUserAttribute(attributeName, attributeValue) {
|
|
14
|
+
console.log('WebengageTracking setUserAttribute:', attributeName, attributeValue);
|
|
15
|
+
}
|
|
16
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebengageTrackingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
17
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebengageTrackingService, providedIn: 'root' }); }
|
|
18
|
+
}
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebengageTrackingService, decorators: [{
|
|
20
|
+
type: Injectable,
|
|
21
|
+
args: [{
|
|
22
|
+
providedIn: 'root'
|
|
23
|
+
}]
|
|
24
|
+
}] });
|
|
25
|
+
export function resolveMyTripsViewedEntrySourceFromQueryParams(params) {
|
|
26
|
+
return params?.source || 'unknown';
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZW5nYWdlLXRyYWNraW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy93ZWJlbmdhZ2UtdHJhY2tpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DLFFBQVEsQ0FBQyxTQUEyQyxFQUFFLFNBQWU7UUFDbkUsd0RBQXdEO1FBQ3hELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBcUIsRUFBRSxjQUFtQjtRQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNwRixDQUFDOytHQVpVLHdCQUF3QjttSEFBeEIsd0JBQXdCLGNBRnZCLE1BQU07OzRGQUVQLHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBZ0JELE1BQU0sVUFBVSw4Q0FBOEMsQ0FBQyxNQUFXO0lBQ3hFLE9BQU8sTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgV2ViZW5nYWdlVHJhY2tpbmdTZXJ2aWNlIHtcbiAgYWRkRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZXZlbnREYXRhPzogYW55KTogdm9pZCB7XG4gICAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbiAtIGRvZXMgbm90aGluZyBpbiBsaWJyYXJ5IGNvbnRleHRcbiAgICBpZiAodHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdXZWJlbmdhZ2VUcmFja2luZzonLCBldmVudE5hbWUsIGV2ZW50RGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdXZWJlbmdhZ2VUcmFja2luZzonLCBldmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldFVzZXJBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1dlYmVuZ2FnZVRyYWNraW5nIHNldFVzZXJBdHRyaWJ1dGU6JywgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTXlUcmlwc1ZpZXdlZEVudHJ5U291cmNlRnJvbVF1ZXJ5UGFyYW1zKHBhcmFtczogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmFtcz8uc291cmNlIHx8ICd1bmtub3duJztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createSelector } from '@ngrx/store';
|
|
2
|
+
// Stub selector for getCurrentCurrency
|
|
3
|
+
export const getCurrentCurrency = createSelector(() => ({}), () => ({
|
|
4
|
+
code: 'SAR',
|
|
5
|
+
name: 'Saudi Riyal',
|
|
6
|
+
symbol: 'SAR',
|
|
7
|
+
rate: 1
|
|
8
|
+
}));
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3kuc2VsZWN0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9zaGFyZWQvc3RvcmUvc2VsZWN0b3JzL2N1cnJlbmN5LnNlbGVjdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzdDLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQzlDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ1YsR0FBYyxFQUFFLENBQUMsQ0FBQztJQUNoQixJQUFJLEVBQUUsS0FBSztJQUNYLElBQUksRUFBRSxhQUFhO0lBQ25CLE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLENBQUM7Q0FDUixDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgSUN1cnJlbmN5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuLy8gU3R1YiBzZWxlY3RvciBmb3IgZ2V0Q3VycmVudEN1cnJlbmN5XG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudEN1cnJlbmN5ID0gY3JlYXRlU2VsZWN0b3IoXG4gICgpID0+ICh7fSksXG4gICgpOiBJQ3VycmVuY3kgPT4gKHtcbiAgICBjb2RlOiAnU0FSJyxcbiAgICBuYW1lOiAnU2F1ZGkgUml5YWwnLFxuICAgIHN5bWJvbDogJ1NBUicsXG4gICAgcmF0ZTogMVxuICB9KVxuKTtcbiJdfQ==
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** Today as `YYYY-MM-DD` in the agent's timezone (what `<input type="date">` compares against). */
|
|
2
|
+
export function todayIso() {
|
|
3
|
+
return new Date().toLocaleDateString('en-CA');
|
|
4
|
+
}
|
|
5
|
+
export function formatReissueDate(value) {
|
|
6
|
+
if (!value)
|
|
7
|
+
return '—';
|
|
8
|
+
const date = new Date(value);
|
|
9
|
+
return Number.isNaN(date.getTime())
|
|
10
|
+
? value
|
|
11
|
+
: date.toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' });
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Expiry of the payment link as epoch ms. The backend sends `YYYY-MM-DD HH:mm:ss` with no timezone, read as UTC (to
|
|
15
|
+
* be confirmed with the backend); a value that carries `Z` or an offset is read as it is. `null` when missing/invalid.
|
|
16
|
+
*/
|
|
17
|
+
export function parseLinkExpiry(value) {
|
|
18
|
+
if (!value)
|
|
19
|
+
return null;
|
|
20
|
+
const hasZone = /(Z|[+-]\d{2}:?\d{2})$/i.test(value.trim());
|
|
21
|
+
const ms = Date.parse(hasZone ? value : `${value.trim().replace(' ', 'T')}Z`);
|
|
22
|
+
return Number.isNaN(ms) ? null : ms;
|
|
23
|
+
}
|
|
24
|
+
/** `mm:ss` (or `h:mm:ss` from one hour up) for a countdown. */
|
|
25
|
+
export function formatCountdown(ms) {
|
|
26
|
+
const total = Math.max(0, Math.floor(ms / 1000));
|
|
27
|
+
const h = Math.floor(total / 3600);
|
|
28
|
+
const m = Math.floor((total % 3600) / 60);
|
|
29
|
+
const s = total % 60;
|
|
30
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
31
|
+
return h > 0 ? `${h}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`;
|
|
32
|
+
}
|
|
33
|
+
export function legTitle(leg) {
|
|
34
|
+
return `${leg.direction || 'Leg'} · ${leg.originCode} → ${leg.destinationCode}`;
|
|
35
|
+
}
|
|
36
|
+
export function airportOf(id, name, city, country) {
|
|
37
|
+
return { id, name: name || city || id, city_name: city || id, country_name: country, type: 'airport' };
|
|
38
|
+
}
|
|
39
|
+
export const originAirport = (l) => airportOf(l.originCode, l.originName, l.originCityName, l.originCountryName);
|
|
40
|
+
export const destinationAirport = (l) => airportOf(l.destinationCode, l.destinationName, l.destinationCityName, l.destinationCountryName);
|
|
41
|
+
export const compareAirports = (a, b) => a?.id === b?.id;
|
|
42
|
+
export function formatMoney(amount, currency) {
|
|
43
|
+
return `${amount.toLocaleString('en-US', { maximumFractionDigits: 2 })} ${currency}`.trim();
|
|
44
|
+
}
|
|
45
|
+
/** `21 Oct` — same short date the cancel dialog shows on a leg card. */
|
|
46
|
+
export function formatShortDate(value) {
|
|
47
|
+
if (!value)
|
|
48
|
+
return '—';
|
|
49
|
+
const date = new Date(value);
|
|
50
|
+
return Number.isNaN(date.getTime()) ? value : date.toLocaleDateString('en-GB', { day: '2-digit', month: 'short' });
|
|
51
|
+
}
|
|
52
|
+
/** `01:55` straight from the `YYYY-MM-DDTHH:mm:ss` string (no timezone conversion). */
|
|
53
|
+
export function formatTime(value) {
|
|
54
|
+
return value && value.length >= 16 && value[10] === 'T' ? value.slice(11, 16) : '—';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The leg already departed. The booking gives no timezone for `LegDepartureDateTime` (airport local time), so this
|
|
58
|
+
* compares with the agent's clock: it can be off by a few hours on the day of the flight, never by a day.
|
|
59
|
+
*/
|
|
60
|
+
export function isLegFlown(leg) {
|
|
61
|
+
const time = leg.departure ? Date.parse(leg.departure) : NaN;
|
|
62
|
+
return !Number.isNaN(time) && time < Date.now();
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL3V0aWxzL3JlaXNzdWUtZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLG1HQUFtRztBQUNuRyxNQUFNLFVBQVUsUUFBUTtJQUN0QixPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxDQUFDLENBQUMsS0FBSztRQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQzVGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQXFCO0lBQ25ELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FB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Q0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDckgsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN0RixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUEwQjtJQUNuRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlaXNzdWVBaXJwb3J0LCBSZWlzc3VlTGVnIH0gZnJvbSAnLi4vbW9kZWxzL3JlaXNzdWUudHlwZXMnO1xuXG4vKiogVG9kYXkgYXMgYFlZWVktTU0tRERgIGluIHRoZSBhZ2VudCdzIHRpbWV6b25lICh3aGF0IGA8aW5wdXQgdHlwZT1cImRhdGVcIj5gIGNvbXBhcmVzIGFnYWluc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZGF5SXNvKCk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tQ0EnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlaXNzdWVEYXRlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ+KAlCc7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpXG4gICAgPyB2YWx1ZVxuICAgIDogZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyBkYXk6ICcyLWRpZ2l0JywgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9KTtcbn1cblxuLyoqXG4gKiBFeHBpcnkgb2YgdGhlIHBheW1lbnQgbGluayBhcyBlcG9jaCBtcy4gVGhlIGJhY2tlbmQgc2VuZHMgYFlZWVktTU0tREQgSEg6bW06c3NgIHdpdGggbm8gdGltZXpvbmUsIHJlYWQgYXMgVVRDICh0b1xuICogYmUgY29uZmlybWVkIHdpdGggdGhlIGJhY2tlbmQpOyBhIHZhbHVlIHRoYXQgY2FycmllcyBgWmAgb3IgYW4gb2Zmc2V0IGlzIHJlYWQgYXMgaXQgaXMuIGBudWxsYCB3aGVuIG1pc3NpbmcvaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua0V4cGlyeSh2YWx1ZT86IHN0cmluZyB8IG51bGwpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGhhc1pvbmUgPSAvKFp8WystXVxcZHsyfTo/XFxkezJ9KSQvaS50ZXN0KHZhbHVlLnRyaW0oKSk7XG4gIGNvbnN0IG1zID0gRGF0ZS5wYXJzZShoYXNab25lID8gdmFsdWUgOiBgJHt2YWx1ZS50cmltKCkucmVwbGFjZSgnICcsICdUJyl9WmApO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKG1zKSA/IG51bGwgOiBtcztcbn1cblxuLyoqIGBtbTpzc2AgKG9yIGBoOm1tOnNzYCBmcm9tIG9uZSBob3VyIHVwKSBmb3IgYSBjb3VudGRvd24uICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q291bnRkb3duKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB0b3RhbCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IobXMgLyAxMDAwKSk7XG4gIGNvbnN0IGggPSBNYXRoLmZsb29yKHRvdGFsIC8gMzYwMCk7XG4gIGNvbnN0IG0gPSBNYXRoLmZsb29yKCh0b3RhbCAlIDM2MDApIC8gNjApO1xuICBjb25zdCBzID0gdG90YWwgJSA2MDtcbiAgY29uc3QgcGFkID0gKG46IG51bWJlcikgPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJyk7XG4gIHJldHVybiBoID4gMCA/IGAke2h9OiR7cGFkKG0pfToke3BhZChzKX1gIDogYCR7cGFkKG0pfToke3BhZChzKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGVnVGl0bGUobGVnOiBSZWlzc3VlTGVnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xlZy5kaXJlY3Rpb24gfHwgJ0xlZyd9IMK3ICR7bGVnLm9yaWdpbkNvZGV9IOKGkiAke2xlZy5kZXN0aW5hdGlvbkNvZGV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFpcnBvcnRPZihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNpdHk6IHN0cmluZywgY291bnRyeTogc3RyaW5nKTogUmVpc3N1ZUFpcnBvcnQge1xuICByZXR1cm4geyBpZCwgbmFtZTogbmFtZSB8fCBjaXR5IHx8IGlkLCBjaXR5X25hbWU6IGNpdHkgfHwgaWQsIGNvdW50cnlfbmFtZTogY291bnRyeSwgdHlwZTogJ2FpcnBvcnQnIH07XG59XG5cbmV4cG9ydCBjb25zdCBvcmlnaW5BaXJwb3J0ID0gKGw6IFJlaXNzdWVMZWcpOiBSZWlzc3VlQWlycG9ydCA9PlxuICBhaXJwb3J0T2YobC5vcmlnaW5Db2RlLCBsLm9yaWdpbk5hbWUsIGwub3JpZ2luQ2l0eU5hbWUsIGwub3JpZ2luQ291bnRyeU5hbWUpO1xuXG5leHBvcnQgY29uc3QgZGVzdGluYXRpb25BaXJwb3J0ID0gKGw6IFJlaXNzdWVMZWcpOiBSZWlzc3VlQWlycG9ydCA9PlxuICBhaXJwb3J0T2YobC5kZXN0aW5hdGlvbkNvZGUsIGwuZGVzdGluYXRpb25OYW1lLCBsLmRlc3RpbmF0aW9uQ2l0eU5hbWUsIGwuZGVzdGluYXRpb25Db3VudHJ5TmFtZSk7XG5cbmV4cG9ydCBjb25zdCBjb21wYXJlQWlycG9ydHMgPSAoYTogUmVpc3N1ZUFpcnBvcnQsIGI6IFJlaXNzdWVBaXJwb3J0KTogYm9vbGVhbiA9PiBhPy5pZCA9PT0gYj8uaWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNb25leShhbW91bnQ6IG51bWJlciwgY3VycmVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHthbW91bnQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSl9ICR7Y3VycmVuY3l9YC50cmltKCk7XG59XG5cbi8qKiBgMjEgT2N0YCDigJQgc2FtZSBzaG9ydCBkYXRlIHRoZSBjYW5jZWwgZGlhbG9nIHNob3dzIG9uIGEgbGVnIGNhcmQuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2hvcnREYXRlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ+KAlCc7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gdmFsdWUgOiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JyB9KTtcbn1cblxuLyoqIGAwMTo1NWAgc3RyYWlnaHQgZnJvbSB0aGUgYFlZWVktTU0tRERUSEg6bW06c3NgIHN0cmluZyAobm8gdGltZXpvbmUgY29udmVyc2lvbikuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+PSAxNiAmJiB2YWx1ZVsxMF0gPT09ICdUJyA/IHZhbHVlLnNsaWNlKDExLCAxNikgOiAn4oCUJztcbn1cblxuLyoqXG4gKiBUaGUgbGVnIGFscmVhZHkgZGVwYXJ0ZWQuIFRoZSBib29raW5nIGdpdmVzIG5vIHRpbWV6b25lIGZvciBgTGVnRGVwYXJ0dXJlRGF0ZVRpbWVgIChhaXJwb3J0IGxvY2FsIHRpbWUpLCBzbyB0aGlzXG4gKiBjb21wYXJlcyB3aXRoIHRoZSBhZ2VudCdzIGNsb2NrOiBpdCBjYW4gYmUgb2ZmIGJ5IGEgZmV3IGhvdXJzIG9uIHRoZSBkYXkgb2YgdGhlIGZsaWdodCwgbmV2ZXIgYnkgYSBkYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ0Zsb3duKGxlZzogeyBkZXBhcnR1cmU6IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gIGNvbnN0IHRpbWUgPSBsZWcuZGVwYXJ0dXJlID8gRGF0ZS5wYXJzZShsZWcuZGVwYXJ0dXJlKSA6IE5hTjtcbiAgcmV0dXJuICFOdW1iZXIuaXNOYU4odGltZSkgJiYgdGltZSA8IERhdGUubm93KCk7XG59XG4iXX0=
|
|
@@ -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
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -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
|
-
|
|
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=
|