@sabstravtech/obtservices 0.0.19020100 → 0.0.22041208
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/angular/components/with-component.d.ts +2 -1
- package/angular/fetchers.d.ts +17 -12
- package/angular/lib/vendor/classes/helpers.d.ts +8 -0
- package/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +7 -0
- package/angular/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/flight-quote.fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/search-airlines-fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
- package/angular/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
- package/angular/lib/vendor/services/my-bookings.service.d.ts +4 -3
- package/angular/lib/vendor/services/search.service.d.ts +15 -3
- package/angular/lib/vendor/services/user.service.d.ts +4 -3
- package/angular/lib/vendor/types/graphql.angular.types.d.ts +1062 -1062
- package/angular/lib/vendor/updaters/cancel-booking-updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/confirm-messages-updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/remove-favourite-search.updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/save-favourite-search.updater.d.ts +6 -0
- package/angular/sabstravtech-obtservices-angular.d.ts +14 -9
- package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
- package/angular/updaters.d.ts +3 -0
- package/base/classes.d.ts +1 -0
- package/base/fetchers.d.ts +27 -3
- package/base/interfaces.d.ts +3 -3
- package/base/lib/vendor/classes/base-enterprise.d.ts +5 -2
- package/base/lib/vendor/classes/bookable-basket.d.ts +1 -1
- package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +8 -7
- package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +11 -2
- package/base/lib/vendor/classes/enviroment.d.ts +2 -0
- package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +26 -69
- package/base/lib/vendor/classes/flight-enterprise-search.d.ts +39 -22
- package/base/lib/vendor/classes/helpers.d.ts +49 -6
- package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +19 -8
- package/base/lib/vendor/classes/irl-direction.enum.d.ts +4 -0
- package/base/lib/vendor/classes/irl-enterprise-search.d.ts +285 -30
- package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +7 -3
- package/base/lib/vendor/classes/management-info-and-valid.d.ts +1 -0
- package/base/lib/vendor/classes/modal-types.enum.d.ts +4 -0
- package/base/lib/vendor/classes/parking-enterprise-search.d.ts +7 -3
- package/base/lib/vendor/classes/rail-direction.enum.d.ts +2 -2
- package/base/lib/vendor/classes/rail-enterprise-search.d.ts +83 -54
- package/base/lib/vendor/classes/rail-index-to-ticket.d.ts +9 -0
- package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +1 -0
- package/base/lib/vendor/classes/user-favourite.enum.d.ts +3 -0
- package/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +23 -0
- package/base/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +21 -0
- package/base/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +6 -2
- package/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/list-fetchable-enterprise.d.ts +1 -1
- package/base/lib/vendor/fetchers/object-fetchable-enterprise.d.ts +3 -1
- package/base/lib/vendor/fetchers/search-airlines.fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
- package/base/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
- package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +3 -2
- package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +4 -1
- package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +4 -3
- package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +8 -4
- package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +15 -4
- package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +8 -22
- package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +15 -10
- package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +4 -2
- package/base/lib/vendor/interfaces/Imybookings.service.d.ts +2 -1
- package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +3 -2
- package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +31 -31
- package/base/lib/vendor/interfaces/Isearch.service.d.ts +12 -3
- package/base/lib/vendor/interfaces/Iuser.service.d.ts +3 -1
- package/base/lib/vendor/interfaces/cab-hire-search-arg.interface.d.ts +10 -0
- package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +42 -0
- package/base/lib/vendor/interfaces/enable-fresh-chat-interface.d.ts +7 -0
- package/base/lib/vendor/interfaces/eurostar-search-arg.interface.d.ts +6 -0
- package/base/lib/vendor/interfaces/flight-filters.interface.d.ts +1 -0
- package/base/lib/vendor/interfaces/flight-search-args.interface.d.ts +8 -0
- package/base/lib/vendor/interfaces/hotel-recent-search-args.interface.d.ts +4 -0
- package/base/lib/vendor/interfaces/irl-search-arg.interface.d.ts +5 -0
- package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +11 -5
- package/base/lib/vendor/interfaces/rail-recent-search-args.interface.d.ts +16 -11
- package/base/lib/vendor/interfaces/rail-selected-ticket.interface.d.ts +4 -9
- package/base/lib/vendor/interfaces/summary-interface.d.ts +23 -0
- package/base/lib/vendor/interfaces/terms-and-conditions.interface.d.ts +4 -0
- package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
- package/base/lib/vendor/services/enterprise-basket.service.d.ts +5 -3
- package/base/lib/vendor/services/hotel-avallibility.service.d.ts +5 -3
- package/base/lib/vendor/services/my-bookings.service.d.ts +6 -3
- package/base/lib/vendor/services/search.service.d.ts +46 -10
- package/base/lib/vendor/services/user.service.d.ts +9 -4
- package/base/lib/vendor/types/graphql.types.d.ts +982 -1051
- package/base/lib/vendor/types/types.d.ts +187 -14
- package/base/lib/vendor/updaters/cancel-booking-updater.d.ts +20 -0
- package/base/lib/vendor/updaters/confirm-messages-updater.d.ts +19 -0
- package/base/lib/vendor/updaters/remove-favourite-search-updater.d.ts +19 -0
- package/base/lib/vendor/updaters/save-favourite-search-updater.d.ts +20 -0
- package/base/sabstravtech-obtservices-base.metadata.json +1 -1
- package/base/updaters.d.ts +4 -0
- package/bundles/sabstravtech-obtservices-angular.umd.js +763 -158
- package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.js +8805 -7342
- package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
- package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
- package/esm2015/angular/components/basket-panel.js +9 -5
- package/esm2015/angular/components/with-component.js +7 -4
- package/esm2015/angular/fetchers.js +18 -13
- package/esm2015/angular/lib/vendor/classes/helpers.js +21 -4
- package/esm2015/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/apply-jit-flight-rules.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/basket-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/conferma-office.fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/flight-quote.fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/irl-discount-card-fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/search-airlines-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/search-airports-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/fetchers/user-fetcher.js +8 -5
- package/esm2015/angular/lib/vendor/services/my-bookings.service.js +8 -5
- package/esm2015/angular/lib/vendor/services/search.service.js +69 -33
- package/esm2015/angular/lib/vendor/services/user.service.js +9 -6
- package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1467 -2520
- package/esm2015/angular/lib/vendor/updaters/cancel-booking-updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/confirm-messages-updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/remove-favourite-search.updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/save-favourite-search.updater.js +22 -0
- package/esm2015/angular/obtservices.module.js +17 -1
- package/esm2015/angular/sabstravtech-obtservices-angular.js +15 -10
- package/esm2015/angular/updaters.js +4 -1
- package/esm2015/base/classes.js +2 -1
- package/esm2015/base/fetchers.js +28 -4
- package/esm2015/base/interfaces.js +4 -4
- package/esm2015/base/lib/vendor/classes/base-enterprise.js +14 -14
- package/esm2015/base/lib/vendor/classes/bookable-basket.js +11 -6
- package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +76 -103
- package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +121 -18
- package/esm2015/base/lib/vendor/classes/enviroment.js +3 -1
- package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +540 -677
- package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +676 -298
- package/esm2015/base/lib/vendor/classes/helpers.js +260 -70
- package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +289 -123
- package/esm2015/base/lib/vendor/classes/irl-direction.enum.js +6 -0
- package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +412 -694
- package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +98 -5
- package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +49 -30
- package/esm2015/base/lib/vendor/classes/modal-types.enum.js +5 -1
- package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +61 -5
- package/esm2015/base/lib/vendor/classes/rail-direction.enum.js +3 -3
- package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +1024 -682
- package/esm2015/base/lib/vendor/classes/rail-index-to-ticket.js +48 -0
- package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +16 -4
- package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +4 -1
- package/esm2015/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +22 -0
- package/esm2015/base/lib/vendor/fetchers/apply-jit-flight-rules.js +10 -0
- package/esm2015/base/lib/vendor/fetchers/basket-fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/conferma-office.fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/flight-fare-rules.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +12 -4
- package/esm2015/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +10 -0
- package/esm2015/base/lib/vendor/fetchers/irl-discount-card-fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/list-fetchable-enterprise.js +5 -3
- package/esm2015/base/lib/vendor/fetchers/object-fetchable-enterprise.js +4 -3
- package/esm2015/base/lib/vendor/fetchers/search-airlines.fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/search-airports-fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/search-conferma-cities.fetcher.js +3 -3
- package/esm2015/base/lib/vendor/fetchers/user-fetcher.js +3 -3
- package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +7 -1
- package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/cab-hire-search-arg.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +3 -0
- package/esm2015/base/lib/vendor/interfaces/enable-fresh-chat-interface.js +3 -0
- package/esm2015/base/lib/vendor/interfaces/eurostar-search-arg.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/flight-filters.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/flight-search-args.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/hotel-recent-search-args.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/irl-search-arg.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/rail-recent-search-args.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/rail-selected-ticket.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/summary-interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/terms-and-conditions.interface.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
- package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +107 -57
- package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +43 -5
- package/esm2015/base/lib/vendor/services/my-bookings.service.js +6 -2
- package/esm2015/base/lib/vendor/services/search.service.js +110 -46
- package/esm2015/base/lib/vendor/services/user.service.js +13 -2
- package/esm2015/base/lib/vendor/types/graphql.types.js +35 -28
- package/esm2015/base/lib/vendor/types/types.js +35 -2
- package/esm2015/base/lib/vendor/updaters/cancel-booking-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/confirm-messages-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/remove-favourite-search-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/save-favourite-search-updater.js +11 -0
- package/esm2015/base/updaters.js +5 -1
- package/fesm2015/sabstravtech-obtservices-angular.js +1554 -2350
- package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
- package/fesm2015/sabstravtech-obtservices-base.js +8088 -6752
- package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
- package/package.json +1 -1
- package/base/lib/vendor/interfaces/rail-journey-leg.interface.d.ts +0 -6
- package/base/lib/vendor/interfaces/rail-ticket-group.interface.d.ts +0 -26
- package/base/lib/vendor/interfaces/rail-ticket-groups.interface.d.ts +0 -4
- package/esm2015/base/lib/vendor/interfaces/rail-journey-leg.interface.js +0 -2
- package/esm2015/base/lib/vendor/interfaces/rail-ticket-group.interface.js +0 -2
- package/esm2015/base/lib/vendor/interfaces/rail-ticket-groups.interface.js +0 -2
|
@@ -4,34 +4,60 @@ import { map } from 'rxjs/operators';
|
|
|
4
4
|
import { BaseEnterpriseSearch } from './base-enterprise';
|
|
5
5
|
import { IrlClass, ServiceType, IrlJourneyType } from '../types/graphql.types';
|
|
6
6
|
import { ages } from '../models/traveller.object';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
import { SortMethod } from './eurostar-enterprise-search';
|
|
8
|
+
export var SortTypesIrl;
|
|
9
|
+
(function (SortTypesIrl) {
|
|
10
|
+
SortTypesIrl["CheapestFirst"] = "C";
|
|
11
|
+
SortTypesIrl["EarliestFirst"] = "E";
|
|
12
|
+
SortTypesIrl["LatestFirst"] = "L";
|
|
13
|
+
})(SortTypesIrl || (SortTypesIrl = {}));
|
|
14
|
+
export var ClassType;
|
|
15
|
+
(function (ClassType) {
|
|
16
|
+
ClassType["Class_1"] = "1";
|
|
17
|
+
ClassType["Class_2"] = "2";
|
|
18
|
+
// ! these 2 shopuld be removed later
|
|
19
|
+
ClassType["Second_Class"] = "2nd Class";
|
|
20
|
+
ClassType["First_Class"] = "1st Class";
|
|
21
|
+
})(ClassType || (ClassType = {}));
|
|
12
22
|
export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
13
|
-
constructor(Irlfetcher,
|
|
14
|
-
super(storageService);
|
|
23
|
+
constructor(Irlfetcher, irlDiscountCardsFetcher, helpers, basketService, storageService, searchService) {
|
|
24
|
+
super(storageService, helpers);
|
|
15
25
|
this.Irlfetcher = Irlfetcher;
|
|
16
|
-
this.
|
|
17
|
-
this.helpers = helpers;
|
|
26
|
+
this.irlDiscountCardsFetcher = irlDiscountCardsFetcher;
|
|
18
27
|
this.basketService = basketService;
|
|
19
28
|
this.searchService = searchService;
|
|
20
29
|
this.resultsSessionName = IRLEnterpriseSearch.STORAGE_SESSION_RESULTS;
|
|
21
30
|
this.multiResultsSessionName = IRLEnterpriseSearch.STORAGE_SESSION_RESULTS;
|
|
31
|
+
this._sortArray = [
|
|
32
|
+
{
|
|
33
|
+
title: 'Price',
|
|
34
|
+
methodRef: SortMethod.sortByPrice,
|
|
35
|
+
icon: 'ico-dollar'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
title: 'Time',
|
|
39
|
+
methodRef: SortMethod.sortByDate,
|
|
40
|
+
icon: 'ico-calendar'
|
|
41
|
+
}
|
|
42
|
+
];
|
|
22
43
|
this.searchTypes = [
|
|
23
44
|
{ display: 'Return', value: IrlJourneyType.ReturnJourney },
|
|
24
45
|
{ display: 'One-Way', value: IrlJourneyType.SingleJourney }
|
|
25
|
-
// { display: 'Open Return', value: IrlJourneyType.OpenReturnJourney },
|
|
26
|
-
// { display: 'Dual Singles', value: IrlJourneyType.DualSingleJourney },
|
|
27
46
|
];
|
|
28
47
|
this.classTypes = [
|
|
29
48
|
{ display: 'Any', value: IrlClass.All },
|
|
30
49
|
{ display: 'Standard', value: IrlClass.Standard },
|
|
31
50
|
{ display: 'First', value: IrlClass.First }
|
|
32
51
|
];
|
|
33
|
-
this.ageRanges = [
|
|
34
|
-
|
|
52
|
+
this.ageRanges = [
|
|
53
|
+
{ key: ages.Child, value: 'Child (0-3)' },
|
|
54
|
+
{ key: ages.Child, value: 'Child (4-5)' },
|
|
55
|
+
{ key: ages.Child, value: 'Child (6-11)' },
|
|
56
|
+
{ key: ages.Youth, value: 'Youth (12-14)' },
|
|
57
|
+
{ key: ages.Youth, value: 'Youth (15-25)' },
|
|
58
|
+
{ key: ages.Adult, value: 'Adult (26-59)' },
|
|
59
|
+
{ key: ages.Youth, value: 'Senior (60+)' }
|
|
60
|
+
];
|
|
35
61
|
this.travelCards = [
|
|
36
62
|
{ display: 'Young persons railcard', value: 'YNG' },
|
|
37
63
|
{ display: 'Disability railcard', value: 'DIS' },
|
|
@@ -58,16 +84,20 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
58
84
|
this._arrivalLocationId = null;
|
|
59
85
|
this._adults = 0;
|
|
60
86
|
this._children = 0;
|
|
87
|
+
this._cheapestStandard = null;
|
|
88
|
+
this._cheapestFirst = null;
|
|
61
89
|
this._returnDepartureDateTime = null;
|
|
62
90
|
this._ageRange = null;
|
|
91
|
+
this._priceDir = false;
|
|
92
|
+
this._dateDir = false;
|
|
93
|
+
this._irlDiscountCardsArray = [];
|
|
63
94
|
// !date and time is handled differently for LU
|
|
64
95
|
this._outbound_date = null;
|
|
65
96
|
this._outbound_time = null;
|
|
66
97
|
this._return_date = null;
|
|
67
98
|
this._return_time = null;
|
|
68
|
-
this.
|
|
69
|
-
this.
|
|
70
|
-
this._irlClass = null;
|
|
99
|
+
this._offline = false;
|
|
100
|
+
this._irlClass = IrlClass.All;
|
|
71
101
|
this._journeytype = IrlJourneyType.SingleJourney;
|
|
72
102
|
const data = storageService.getSessionItem(IRLEnterpriseSearch.STORAGE_SESSION_PARAMS) || {
|
|
73
103
|
query: {},
|
|
@@ -97,54 +127,18 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
97
127
|
this._cheapestResultPrice = this.updateLowestPrice(results);
|
|
98
128
|
this.results.next(results || []);
|
|
99
129
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// this._chosenOutboundTicket.price + this._chosenInboundTicket.price
|
|
113
|
-
// );
|
|
114
|
-
// }
|
|
115
|
-
// return this._chosenOutboundTicket.price;
|
|
116
|
-
// }
|
|
117
|
-
// return 0;
|
|
118
|
-
// }
|
|
119
|
-
// get chosenTickets(): any {
|
|
120
|
-
// return {
|
|
121
|
-
// Outbound: this._chosenOutboundTicket,
|
|
122
|
-
// Inbound: this._chosenInboundTicket
|
|
123
|
-
// };
|
|
124
|
-
// }
|
|
125
|
-
// get chosenOutboundJourney(): RecursivePartial<RailJourneyOption> {
|
|
126
|
-
// return this._chosenOutboundJourney;
|
|
127
|
-
// }
|
|
128
|
-
// get chosenInboundJourney(): RecursivePartial<RailJourneyOption> {
|
|
129
|
-
// return this._chosenInboundJourney;
|
|
130
|
-
// }
|
|
131
|
-
// get openReturn(): boolean {
|
|
132
|
-
// return this.tempParams.openReturn;
|
|
133
|
-
// }
|
|
134
|
-
// set openReturn(newVal: boolean) {
|
|
135
|
-
// this.tempParams.openReturn = newVal;
|
|
136
|
-
// if (newVal) {
|
|
137
|
-
// this.tempParams.chosenSearchType = IrlJourneyType.OpenReturnJourney;
|
|
138
|
-
// }
|
|
139
|
-
// this._isValid();
|
|
140
|
-
// }
|
|
141
|
-
// get chosenSearchType(): IrlJourneyType {
|
|
142
|
-
// return this.tempParams.chosenSearchType;
|
|
143
|
-
// }
|
|
144
|
-
// set chosenSearchType(newType: IrlJourneyType) {
|
|
145
|
-
// this.tempParams.chosenSearchType = newType;
|
|
146
|
-
// this._isValid();
|
|
147
|
-
// }
|
|
130
|
+
get outboundJourneyOptions() {
|
|
131
|
+
return this._outboundJourneyOptions;
|
|
132
|
+
}
|
|
133
|
+
set outboundJourneyOptions(data) {
|
|
134
|
+
this._outboundJourneyOptions = data;
|
|
135
|
+
}
|
|
136
|
+
get outboundTicket() {
|
|
137
|
+
return this._outboundTicket;
|
|
138
|
+
}
|
|
139
|
+
set outboundTicket(data) {
|
|
140
|
+
this._outboundTicket = data;
|
|
141
|
+
}
|
|
148
142
|
get noOfAdults() {
|
|
149
143
|
return this.tempParams.adults;
|
|
150
144
|
}
|
|
@@ -181,6 +175,9 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
181
175
|
if ((_a = tt === null || tt === void 0 ? void 0 : tt.railstation) === null || _a === void 0 ? void 0 : _a.id) {
|
|
182
176
|
this._travellingFrom = tt.railstation.id;
|
|
183
177
|
this.supplier = tt.railstation.supplier;
|
|
178
|
+
this.getIrlDiscountCards().subscribe((data) => {
|
|
179
|
+
this.irlDiscountCardsArray = data;
|
|
180
|
+
});
|
|
184
181
|
}
|
|
185
182
|
this._isValid();
|
|
186
183
|
}
|
|
@@ -206,11 +203,14 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
206
203
|
return this._outboundDepartureDateTime;
|
|
207
204
|
}
|
|
208
205
|
set outboundDepartureDateTime(newDateTime) {
|
|
209
|
-
this.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
206
|
+
this.tempParams.outboundDepartureDateTime = newDateTime;
|
|
207
|
+
if (newDateTime && newDateTime.isValid()) {
|
|
208
|
+
this._outboundDepartureDateTime = newDateTime;
|
|
209
|
+
this._outbound_date = this.helpers.momentToNgDate(newDateTime);
|
|
210
|
+
this._outbound_time = moment(newDateTime).format('HHmm')
|
|
211
|
+
? moment(newDateTime).format('HHmm')
|
|
212
|
+
: '0700';
|
|
213
|
+
}
|
|
214
214
|
this._updateOutboundDateTime();
|
|
215
215
|
}
|
|
216
216
|
get departureLocationId() {
|
|
@@ -237,15 +237,24 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
237
237
|
set children(data) {
|
|
238
238
|
this._children = data;
|
|
239
239
|
}
|
|
240
|
+
get cheapestStandard() {
|
|
241
|
+
return this._cheapestStandard;
|
|
242
|
+
}
|
|
243
|
+
get cheapestFirst() {
|
|
244
|
+
return this._cheapestFirst;
|
|
245
|
+
}
|
|
240
246
|
get returnDepartureDateTime() {
|
|
241
247
|
return this._returnDepartureDateTime;
|
|
242
248
|
}
|
|
243
249
|
set returnDepartureDateTime(newDateTime) {
|
|
244
|
-
this.
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
250
|
+
this.tempParams.returnDepartureDateTime = newDateTime;
|
|
251
|
+
if (newDateTime && newDateTime.isValid()) {
|
|
252
|
+
this._returnDepartureDateTime = newDateTime;
|
|
253
|
+
this._return_date = this.helpers.momentToNgDate(newDateTime);
|
|
254
|
+
this._return_time = moment(newDateTime).format('HHmm')
|
|
255
|
+
? moment(newDateTime).format('HHmm')
|
|
256
|
+
: '1600';
|
|
257
|
+
}
|
|
249
258
|
this._updateReturnDateTime();
|
|
250
259
|
}
|
|
251
260
|
get ageRange() {
|
|
@@ -254,9 +263,18 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
254
263
|
set ageRange(data) {
|
|
255
264
|
this._ageRange = data;
|
|
256
265
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
266
|
+
get priceDir() {
|
|
267
|
+
return this._priceDir;
|
|
268
|
+
}
|
|
269
|
+
set priceDir(data) {
|
|
270
|
+
this._priceDir = data;
|
|
271
|
+
}
|
|
272
|
+
get dateDir() {
|
|
273
|
+
return this._dateDir;
|
|
274
|
+
}
|
|
275
|
+
set dateDir(data) {
|
|
276
|
+
this._dateDir = data;
|
|
277
|
+
}
|
|
260
278
|
get chosenSearchClass() {
|
|
261
279
|
return this.tempParams.class;
|
|
262
280
|
}
|
|
@@ -264,6 +282,19 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
264
282
|
this.tempParams.class = classR;
|
|
265
283
|
this._isValid();
|
|
266
284
|
}
|
|
285
|
+
get discountCard() {
|
|
286
|
+
return this.tempParams.irlDiscountCards;
|
|
287
|
+
}
|
|
288
|
+
set discountCard(data) {
|
|
289
|
+
this.tempParams.irlDiscountCards = data;
|
|
290
|
+
this._isValid();
|
|
291
|
+
}
|
|
292
|
+
get irlDiscountCardsArray() {
|
|
293
|
+
return this._irlDiscountCardsArray;
|
|
294
|
+
}
|
|
295
|
+
set irlDiscountCardsArray(array) {
|
|
296
|
+
this._irlDiscountCardsArray = array;
|
|
297
|
+
}
|
|
267
298
|
get outBoundDateTime() {
|
|
268
299
|
return this.tempParams.outboundDepartureDateTime;
|
|
269
300
|
}
|
|
@@ -287,14 +318,6 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
287
318
|
}
|
|
288
319
|
this._isValid();
|
|
289
320
|
}
|
|
290
|
-
get outboundCriteria() {
|
|
291
|
-
return this.tempParams.outboundCriteria;
|
|
292
|
-
}
|
|
293
|
-
set outboundCriteria(newCrit) {
|
|
294
|
-
// console.warn(`+++ Setting New Criteria: ${newCrit} +++`);
|
|
295
|
-
this.tempParams.outboundCriteria = newCrit;
|
|
296
|
-
this._isValid();
|
|
297
|
-
}
|
|
298
321
|
get inBoundDateTime() {
|
|
299
322
|
return this.tempParams.returnDepartureDateTime;
|
|
300
323
|
}
|
|
@@ -336,38 +359,6 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
336
359
|
this._return_time = value;
|
|
337
360
|
this._updateReturnDateTime();
|
|
338
361
|
}
|
|
339
|
-
get returnCriteria() {
|
|
340
|
-
return this.tempParams.returnCriteria;
|
|
341
|
-
}
|
|
342
|
-
set returnCriteria(newCrit) {
|
|
343
|
-
this.tempParams.returnCriteria = newCrit;
|
|
344
|
-
this._isValid();
|
|
345
|
-
}
|
|
346
|
-
// set railCards(newRailCards: string[]) {
|
|
347
|
-
// this.tempParams.railCards = newRailCards;
|
|
348
|
-
// this._isValid();
|
|
349
|
-
// }
|
|
350
|
-
// get carnetTicket(): boolean {
|
|
351
|
-
// return this.tempParams.carnetTicket;
|
|
352
|
-
// }
|
|
353
|
-
// set carnetTicket(newCarnet: boolean) {
|
|
354
|
-
// this.tempParams.carnetTicket = newCarnet;
|
|
355
|
-
// this._isValid();
|
|
356
|
-
// }
|
|
357
|
-
// get disableAutoDiscounts(): boolean {
|
|
358
|
-
// return this.tempParams.disableAutoDiscounts;
|
|
359
|
-
// }
|
|
360
|
-
// set disableAutoDiscounts(newDis: boolean) {
|
|
361
|
-
// this.tempParams.disableAutoDiscounts = newDis;
|
|
362
|
-
// this._isValid();
|
|
363
|
-
// }
|
|
364
|
-
// get prioritiseByPrice(): boolean {
|
|
365
|
-
// return this.tempParams.prioritiseByPrice;
|
|
366
|
-
// }
|
|
367
|
-
// set prioritiseByPrice(newPriority: boolean) {
|
|
368
|
-
// this.tempParams.prioritiseByPrice = newPriority;
|
|
369
|
-
// this._isValid();
|
|
370
|
-
// }
|
|
371
362
|
get timeArray() {
|
|
372
363
|
this._timeArray =
|
|
373
364
|
this._timeArray ||
|
|
@@ -388,11 +379,11 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
388
379
|
});
|
|
389
380
|
return this._timeArray;
|
|
390
381
|
}
|
|
391
|
-
get
|
|
392
|
-
return this.
|
|
382
|
+
get offline() {
|
|
383
|
+
return this._offline;
|
|
393
384
|
}
|
|
394
|
-
|
|
395
|
-
|
|
385
|
+
set offline(data) {
|
|
386
|
+
this._offline = data;
|
|
396
387
|
}
|
|
397
388
|
get irlClass() {
|
|
398
389
|
return this._irlClass;
|
|
@@ -406,6 +397,22 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
406
397
|
set journeyType(data) {
|
|
407
398
|
this._journeytype = data;
|
|
408
399
|
}
|
|
400
|
+
get sortDropdownValues() {
|
|
401
|
+
return this._sortArray;
|
|
402
|
+
}
|
|
403
|
+
processResults(results) {
|
|
404
|
+
var _a;
|
|
405
|
+
(_a = results[0]) === null || _a === void 0 ? void 0 : _a.outbound.forEach((item) => {
|
|
406
|
+
item.providers[0].ticketOptions.map((ticket, index) => {
|
|
407
|
+
ticket.selected = false;
|
|
408
|
+
ticket.ShowDetail = false;
|
|
409
|
+
ticket.uid = `${ticket.identifiers.journeyIdentifier}_${index + 1}`;
|
|
410
|
+
return ticket;
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
Object.freeze(results);
|
|
414
|
+
return results;
|
|
415
|
+
}
|
|
409
416
|
resetQuery() {
|
|
410
417
|
this.updateTempParams(this.searchService.makeIrlQuery());
|
|
411
418
|
this._isValid();
|
|
@@ -451,19 +458,49 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
451
458
|
startSearch() {
|
|
452
459
|
this.results.next([]);
|
|
453
460
|
if (this.isValid.value) {
|
|
461
|
+
const query = this.getSearchQuery();
|
|
454
462
|
this._originalUserSearch = Object.freeze(Object.assign({}, this.tempParams));
|
|
455
463
|
this.storageService.setSessionItem(IRLEnterpriseSearch.STORAGE_SESSION_PARAMS, {
|
|
456
464
|
tempParams: this.tempParams,
|
|
457
465
|
originalUserSearch: this.originalUserSearch
|
|
458
466
|
});
|
|
459
|
-
|
|
467
|
+
this.searchService.saveRecentSearch(this.getRecentSearchQuery(query));
|
|
468
|
+
return this._startSearch(this.Irlfetcher.fetchList(query).pipe(map((result) => result)));
|
|
460
469
|
}
|
|
461
470
|
else {
|
|
462
471
|
return Promise.resolve(false);
|
|
463
472
|
}
|
|
464
473
|
}
|
|
474
|
+
getRecentSearchQuery(query) {
|
|
475
|
+
const recentSearchQuery = this.updateSerchQuery(query);
|
|
476
|
+
return {
|
|
477
|
+
serviceType: ServiceType.InternationalRail,
|
|
478
|
+
searchArgs: recentSearchQuery,
|
|
479
|
+
travelDate: this.outBoundDateTime.format(),
|
|
480
|
+
travellers: this.helpers.getTravellersId(this.travellers)
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
updateSerchQuery(query) {
|
|
484
|
+
const searchQuery = query;
|
|
485
|
+
if (this.travellingFrom) {
|
|
486
|
+
searchQuery.travellingFrom = this.travellingFrom;
|
|
487
|
+
}
|
|
488
|
+
if (this.travellingTo) {
|
|
489
|
+
searchQuery.travellingTo = this.travellingTo;
|
|
490
|
+
}
|
|
491
|
+
return searchQuery;
|
|
492
|
+
}
|
|
465
493
|
startRecentSearch(recentSearch) {
|
|
466
|
-
this.
|
|
494
|
+
this.journeyType = recentSearch.searchArgs.journeyType;
|
|
495
|
+
this.irlClass = recentSearch.searchArgs.class;
|
|
496
|
+
this.travellingTo = recentSearch.searchArgs.travellingTo;
|
|
497
|
+
this.travellingFrom = recentSearch.searchArgs.travellingFrom;
|
|
498
|
+
// get outBoundDateTime, inBoundDateTime
|
|
499
|
+
this.outBoundDateTime = moment(recentSearch.searchArgs.outboundDepartureDateTime);
|
|
500
|
+
if (recentSearch.searchArgs.journeyType === IrlJourneyType.ReturnJourney) {
|
|
501
|
+
this.inBoundDateTime = moment(recentSearch.searchArgs.returnDepartureDateTime);
|
|
502
|
+
}
|
|
503
|
+
this.searchService.startSearches();
|
|
467
504
|
}
|
|
468
505
|
_updateOutboundDateTime() {
|
|
469
506
|
if (this._outbound_date && this._outbound_time) {
|
|
@@ -481,12 +518,20 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
481
518
|
}
|
|
482
519
|
getSearchQuery() {
|
|
483
520
|
// this.travellers = travellers;
|
|
484
|
-
this.noOfAdults = this.travellers.filter((traveller) => traveller.ageType === ages.Adult ||
|
|
521
|
+
this.noOfAdults = this.travellers.filter((traveller) => traveller.ageType === ages.Adult ||
|
|
522
|
+
traveller.ageType === ages.Youth ||
|
|
523
|
+
traveller.ageType === ages.Senior).length;
|
|
485
524
|
this.noOfChildren = this.travellers.filter((traveller) => traveller.ageType === ages.Child).length;
|
|
525
|
+
if (!this.supplier && this.travellingFrom.name) {
|
|
526
|
+
this.supplier = this.travellingFrom.railstation.supplier;
|
|
527
|
+
this.getIrlDiscountCards().subscribe((data) => {
|
|
528
|
+
this.irlDiscountCardsArray = data;
|
|
529
|
+
});
|
|
530
|
+
}
|
|
486
531
|
const query = {
|
|
487
532
|
supplier: this.supplier,
|
|
488
533
|
countryCode: 'GB',
|
|
489
|
-
|
|
534
|
+
irlDiscountCards: this.discountCard ? this.discountCard.id : null,
|
|
490
535
|
class: this.irlClass,
|
|
491
536
|
outboundDepartureDateTime: this.tempParams.outboundDepartureDateTime,
|
|
492
537
|
departureLocationId: this._travellingFrom,
|
|
@@ -494,35 +539,11 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
494
539
|
adults: this.tempParams.adults,
|
|
495
540
|
children: this.tempParams.children,
|
|
496
541
|
returnDepartureDateTime: this.tempParams.returnDepartureDateTime,
|
|
497
|
-
journeyType: this.journeyType
|
|
542
|
+
journeyType: this.journeyType
|
|
498
543
|
};
|
|
499
544
|
if (this.tempParams.children === 0) {
|
|
500
545
|
query.children = null;
|
|
501
546
|
}
|
|
502
|
-
// switch (this.tempParams.outboundCriteria) {
|
|
503
|
-
// case IrlSearchCriteria.Depart:
|
|
504
|
-
// query.outboundDepartureDateTime = null;
|
|
505
|
-
// break;
|
|
506
|
-
// case IrlSearchCriteria.Arrive:
|
|
507
|
-
// query.outboundDepartureDateTime = null;
|
|
508
|
-
// break;
|
|
509
|
-
// default:
|
|
510
|
-
// console.warn(
|
|
511
|
-
// `+++ Unknown Criteria: ${this.tempParams.outboundCriteria} +++`
|
|
512
|
-
// );
|
|
513
|
-
// }
|
|
514
|
-
// switch (this.tempParams.returnCriteria) {
|
|
515
|
-
// case IrlSearchCriteria.Depart:
|
|
516
|
-
// query.returnDepartureDateTime = null;
|
|
517
|
-
// break;
|
|
518
|
-
// case IrlSearchCriteria.Arrive:
|
|
519
|
-
// query.returnDepartureDateTime = null;
|
|
520
|
-
// break;
|
|
521
|
-
// default:
|
|
522
|
-
// console.warn(
|
|
523
|
-
// `+++ Unknown Criteria: ${this.tempParams.returnCriteria} +++`
|
|
524
|
-
// );
|
|
525
|
-
// }
|
|
526
547
|
switch (this.tempParams.journeyType) {
|
|
527
548
|
case IrlJourneyType.SingleJourney:
|
|
528
549
|
query.returnDepartureDateTime = null;
|
|
@@ -530,163 +551,6 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
530
551
|
}
|
|
531
552
|
return this.helpers.removeNulls(query);
|
|
532
553
|
}
|
|
533
|
-
// createTicketGroups(results: IRLJourneyOptions[]): RailTicketGroups {
|
|
534
|
-
// let tickets: RailTicketGroups = {};
|
|
535
|
-
// let ticketId = '';
|
|
536
|
-
// this._canCombine = {};
|
|
537
|
-
// let ticketGroupsOutbound = this.setTicketsGroups(results[0].outbound);
|
|
538
|
-
// let ticketGroupsReturn = this.setTicketsGroups(results[0].return);
|
|
539
|
-
// ticketGroupsOutbound = this.sortTicketPrices(ticketGroupsOutbound);
|
|
540
|
-
// ticketGroupsReturn = this.sortTicketPrices(ticketGroupsReturn);
|
|
541
|
-
// Object.keys(ticketGroupsOutbound).map((key) => {
|
|
542
|
-
// ticketGroupsOutbound[key].map((tkt: RailTicketOption) => {
|
|
543
|
-
// ticketId = `${tkt.type}${tkt.singleOrReturn}`;
|
|
544
|
-
// const identifier = tkt.identifiers.journeyIdentifier;
|
|
545
|
-
// const identifierObj: RailResultIndifiers = {};
|
|
546
|
-
// identifierObj[identifier] = {
|
|
547
|
-
// price: tkt.price,
|
|
548
|
-
// isChild: false,
|
|
549
|
-
// fareIdentifier: tkt.identifiers.fareIdentifier
|
|
550
|
-
// };
|
|
551
|
-
// if (tickets[key]) {
|
|
552
|
-
// this.updateCanCombine(tkt);
|
|
553
|
-
// identifierObj[tkt.identifiers.journeyIdentifier].isChild = false;
|
|
554
|
-
// if (tickets[tkt.type].header.price === tkt.price) {
|
|
555
|
-
// tickets[tkt.type].resultIndifiers.push(identifier);
|
|
556
|
-
// tickets[tkt.type].resultIndifiersPrices = {
|
|
557
|
-
// ...tickets[tkt.type].resultIndifiersPrices,
|
|
558
|
-
// ...identifierObj
|
|
559
|
-
// };
|
|
560
|
-
// } else if (tkt.price) {
|
|
561
|
-
// identifierObj[identifier].isChild = true;
|
|
562
|
-
// const childTicket = {
|
|
563
|
-
// header: tkt,
|
|
564
|
-
// children: [],
|
|
565
|
-
// open: false,
|
|
566
|
-
// direction: RailDirection.Outbound,
|
|
567
|
-
// resultIndifiers: [identifier],
|
|
568
|
-
// resultIndifiersPrices: identifierObj,
|
|
569
|
-
// child: true,
|
|
570
|
-
// ticketId,
|
|
571
|
-
// selectedIndicies: [],
|
|
572
|
-
// disabledIndicies: []
|
|
573
|
-
// } as RailTicketGroup;
|
|
574
|
-
// tickets[tkt.type].children.push(childTicket);
|
|
575
|
-
// }
|
|
576
|
-
// } else {
|
|
577
|
-
// this._canCombine[tkt.type] = {};
|
|
578
|
-
// this.updateCanCombine(tkt);
|
|
579
|
-
// tickets[tkt.type] = {
|
|
580
|
-
// header: tkt,
|
|
581
|
-
// children: [],
|
|
582
|
-
// open: false,
|
|
583
|
-
// direction: RailDirection.Outbound,
|
|
584
|
-
// resultIndifiers: [identifier],
|
|
585
|
-
// resultIndifiersPrices: identifierObj,
|
|
586
|
-
// child: false,
|
|
587
|
-
// ticketId,
|
|
588
|
-
// selectedIndicies: [],
|
|
589
|
-
// disabledIndicies: []
|
|
590
|
-
// } as RailTicketGroup;
|
|
591
|
-
// }
|
|
592
|
-
// });
|
|
593
|
-
// });
|
|
594
|
-
// Object.keys(ticketGroupsReturn).map((key) => {
|
|
595
|
-
// ticketGroupsReturn[key].map((tkt: RailTicketOption) => {
|
|
596
|
-
// ticketId = `${tkt.type}${tkt.singleOrReturn}`;
|
|
597
|
-
// const identifier = tkt.identifiers.journeyIdentifier;
|
|
598
|
-
// const identifierObj: RailResultIndifiers = {};
|
|
599
|
-
// identifierObj[identifier] = {
|
|
600
|
-
// price: tkt.price,
|
|
601
|
-
// isChild: true,
|
|
602
|
-
// fareIdentifier: tkt.identifiers.fareIdentifier
|
|
603
|
-
// };
|
|
604
|
-
// if (
|
|
605
|
-
// tickets[tkt.type] &&
|
|
606
|
-
// tkt.price &&
|
|
607
|
-
// tkt.price !== tickets[tkt.type].header.price
|
|
608
|
-
// ) {
|
|
609
|
-
// this.updateCanCombine(tkt);
|
|
610
|
-
// identifierObj[identifier].isChild = true;
|
|
611
|
-
// const childTicket = {
|
|
612
|
-
// header: tkt,
|
|
613
|
-
// children: [],
|
|
614
|
-
// open: false,
|
|
615
|
-
// direction: RailDirection.Inbound,
|
|
616
|
-
// resultIndifiers: [identifier],
|
|
617
|
-
// resultIndifiersPrices: identifierObj,
|
|
618
|
-
// child: true,
|
|
619
|
-
// ticketId,
|
|
620
|
-
// selectedIndicies: [],
|
|
621
|
-
// disabledIndicies: []
|
|
622
|
-
// } as any;
|
|
623
|
-
// tickets[tkt.type].children.push(childTicket);
|
|
624
|
-
// } else if (!tickets[tkt.type]) {
|
|
625
|
-
// this.updateCanCombine(tkt);
|
|
626
|
-
// tickets[tkt.type] = {
|
|
627
|
-
// header: tkt,
|
|
628
|
-
// children: [],
|
|
629
|
-
// open: false,
|
|
630
|
-
// direction: RailDirection.Inbound,
|
|
631
|
-
// resultIndifiers: [identifier],
|
|
632
|
-
// resultIndifiersPrices: identifierObj,
|
|
633
|
-
// child: false,
|
|
634
|
-
// ticketId,
|
|
635
|
-
// selectedIndicies: [],
|
|
636
|
-
// disabledIndicies: []
|
|
637
|
-
// } as any;
|
|
638
|
-
// } else if (!tkt.price || tkt.price === tickets[tkt.type].header.price) {
|
|
639
|
-
// this.updateCanCombine(tkt);
|
|
640
|
-
// tickets[tkt.type].resultIndifiers.push(identifier);
|
|
641
|
-
// identifierObj[identifier].isChild = false;
|
|
642
|
-
// tickets[tkt.type].resultIndifiersPrices = {
|
|
643
|
-
// ...tickets[tkt.type].resultIndifiersPrices,
|
|
644
|
-
// ...identifierObj
|
|
645
|
-
// };
|
|
646
|
-
// }
|
|
647
|
-
// });
|
|
648
|
-
// });
|
|
649
|
-
// let combineTickets = { ...tickets };
|
|
650
|
-
// tickets = this.combineChildTickets(combineTickets);
|
|
651
|
-
// // console.log('groups: ', tickets);
|
|
652
|
-
// // console.log('Can Combine: ', this._canCombine);
|
|
653
|
-
// return tickets;
|
|
654
|
-
// }
|
|
655
|
-
combineChildTickets(tickets) {
|
|
656
|
-
const values = Object.values(tickets);
|
|
657
|
-
for (let i = 0; i < values.length; i++) {
|
|
658
|
-
const childObject = {};
|
|
659
|
-
for (let j = 0; j < values[i].children.length; j++) {
|
|
660
|
-
const child = values[i].children[j];
|
|
661
|
-
const fareIdentifier = child.header.identifiers.fareIdentifier;
|
|
662
|
-
if (childObject[fareIdentifier]) {
|
|
663
|
-
childObject[fareIdentifier].resultIndifiers.push(child.resultIndifiers[0]);
|
|
664
|
-
childObject[fareIdentifier].resultIndifiersPrices = Object.assign(Object.assign({}, childObject[fareIdentifier].resultIndifiersPrices), child.resultIndifiersPrices);
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
childObject[fareIdentifier] = child;
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
// console.log(childObject);
|
|
671
|
-
// console.log(values[i]['header']['type']);
|
|
672
|
-
tickets[values[i].header.type].children = Object.values(childObject);
|
|
673
|
-
}
|
|
674
|
-
// tickets = this.sortTicketChildrenPrices(tickets);
|
|
675
|
-
return tickets;
|
|
676
|
-
}
|
|
677
|
-
setTicketsGroups(results) {
|
|
678
|
-
let ticketGroups = {};
|
|
679
|
-
results.forEach((out) => {
|
|
680
|
-
out.providers.forEach((prov) => {
|
|
681
|
-
prov.ticketOptions.forEach((tkt) => {
|
|
682
|
-
ticketGroups[tkt.type]
|
|
683
|
-
? ticketGroups[tkt.type].push(tkt)
|
|
684
|
-
: (ticketGroups[tkt.type] = [tkt]);
|
|
685
|
-
});
|
|
686
|
-
});
|
|
687
|
-
});
|
|
688
|
-
return ticketGroups;
|
|
689
|
-
}
|
|
690
554
|
updateFromPreviousSearches(previousItems) { }
|
|
691
555
|
updateCanCombine(tkt) {
|
|
692
556
|
(tkt.identifiers.allowedWith || []).forEach((allowed) => {
|
|
@@ -700,211 +564,12 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
700
564
|
}
|
|
701
565
|
});
|
|
702
566
|
}
|
|
703
|
-
|
|
704
|
-
// ticket: IrlTicketGroup,
|
|
705
|
-
// way: 'departs' | 'returns',
|
|
706
|
-
// timeSlotId: string,
|
|
707
|
-
// ticketId: string,
|
|
708
|
-
// fareIdentifier: string,
|
|
709
|
-
// ticketsGroups: IrlTicketGroups
|
|
710
|
-
// ): IrlTicketGroups {
|
|
711
|
-
// if (!ticket) {
|
|
712
|
-
// return;
|
|
713
|
-
// }
|
|
714
|
-
// const keys = Object.keys(ticketsGroups);
|
|
715
|
-
// let selectedTicket = null;
|
|
716
|
-
// let departsTicket: IrlTicketOption[] = [];
|
|
717
|
-
// let returnTicket: IrlTicketOption[] = [];
|
|
718
|
-
// let isUnselected = false;
|
|
719
|
-
// keys.forEach((key) => {
|
|
720
|
-
// let group = ticketsGroups[key] as RailTicketGroup;
|
|
721
|
-
// if (
|
|
722
|
-
// group.ticketId === ticketId &&
|
|
723
|
-
// group.selectedIndicies.includes(timeSlotId)
|
|
724
|
-
// ) {
|
|
725
|
-
// if (way === 'departs') {
|
|
726
|
-
// group.selectedIndicies = [];
|
|
727
|
-
// departsTicket = [];
|
|
728
|
-
// returnTicket = [];
|
|
729
|
-
// this._chosenInboundTicket = null;
|
|
730
|
-
// this._chosenInboundJourney = null;
|
|
731
|
-
// group.children.forEach((child) => {
|
|
732
|
-
// child.selectedIndicies = [];
|
|
733
|
-
// });
|
|
734
|
-
// } else {
|
|
735
|
-
// group.selectedIndicies = group.selectedIndicies.filter(
|
|
736
|
-
// (Indicies) => Indicies !== timeSlotId
|
|
737
|
-
// );
|
|
738
|
-
// returnTicket = returnTicket.filter(
|
|
739
|
-
// (Indicies) => Indicies !== group.header
|
|
740
|
-
// );
|
|
741
|
-
// }
|
|
742
|
-
// } else {
|
|
743
|
-
// if (
|
|
744
|
-
// group.ticketId === ticketId &&
|
|
745
|
-
// group.header.identifiers.fareIdentifier === fareIdentifier &&
|
|
746
|
-
// way === 'departs'
|
|
747
|
-
// ) {
|
|
748
|
-
// group = this.clearUnneededTickets(way, group, timeSlotId);
|
|
749
|
-
// group.selectedIndicies.push(timeSlotId);
|
|
750
|
-
// way === 'departs'
|
|
751
|
-
// ? departsTicket.push(group.header)
|
|
752
|
-
// : returnTicket.push(group.header);
|
|
753
|
-
// selectedTicket = group.header;
|
|
754
|
-
// } else {
|
|
755
|
-
// // may have to modify this for dual singles
|
|
756
|
-
// if (way === 'departs') {
|
|
757
|
-
// group.selectedIndicies = [];
|
|
758
|
-
// } else {
|
|
759
|
-
// selectedTicket = group.header;
|
|
760
|
-
// }
|
|
761
|
-
// }
|
|
762
|
-
// group.children.forEach((child) => {
|
|
763
|
-
// if (child.selectedIndicies.includes(timeSlotId)) {
|
|
764
|
-
// if (way === 'departs') {
|
|
765
|
-
// child.selectedIndicies = [];
|
|
766
|
-
// departsTicket = [];
|
|
767
|
-
// returnTicket = [];
|
|
768
|
-
// this._chosenInboundTicket = null;
|
|
769
|
-
// this._chosenInboundJourney = null;
|
|
770
|
-
// isUnselected = true;
|
|
771
|
-
// } else {
|
|
772
|
-
// child.selectedIndicies = child.selectedIndicies.filter(
|
|
773
|
-
// (Indicies) => Indicies !== timeSlotId
|
|
774
|
-
// );
|
|
775
|
-
// returnTicket = returnTicket.filter(
|
|
776
|
-
// (Indicies) => Indicies !== group.header
|
|
777
|
-
// );
|
|
778
|
-
// }
|
|
779
|
-
// } else {
|
|
780
|
-
// if (
|
|
781
|
-
// child.ticketId === ticketId &&
|
|
782
|
-
// child.header.identifiers.fareIdentifier === fareIdentifier
|
|
783
|
-
// ) {
|
|
784
|
-
// if (
|
|
785
|
-
// (way === 'departs' &&
|
|
786
|
-
// child.direction !== RailDirection.Inbound) ||
|
|
787
|
-
// (way !== 'departs' && child.direction === RailDirection.Inbound)
|
|
788
|
-
// ) {
|
|
789
|
-
// child = this.clearUnneededTickets(way, child, timeSlotId);
|
|
790
|
-
// child.selectedIndicies.push(timeSlotId);
|
|
791
|
-
// way === 'departs'
|
|
792
|
-
// ? departsTicket.push(child.header)
|
|
793
|
-
// : returnTicket.push(child.header);
|
|
794
|
-
// selectedTicket = child.header;
|
|
795
|
-
// } else if (isUnselected) {
|
|
796
|
-
// child.selectedIndicies = [];
|
|
797
|
-
// }
|
|
798
|
-
// } else {
|
|
799
|
-
// child.selectedIndicies = [];
|
|
800
|
-
// }
|
|
801
|
-
// }
|
|
802
|
-
// });
|
|
803
|
-
// }
|
|
804
|
-
// });
|
|
805
|
-
// // now we need to mark tickets as disabled if they are returns that do not match the selected return
|
|
806
|
-
// // or on overlapping times
|
|
807
|
-
// if (way === 'departs') {
|
|
808
|
-
// this._chosenOutboundTicket = this.helpers.clone(selectedTicket);
|
|
809
|
-
// // now go over the full results and find the matching timeslot
|
|
810
|
-
// departsTicket.length
|
|
811
|
-
// ? (this._chosenOutboundJourney = this.results.value[0].outbound.find(
|
|
812
|
-
// (out: RailJourneyOption) => {
|
|
813
|
-
// return out.identifiers.journeyIdentifier === timeSlotId;
|
|
814
|
-
// }
|
|
815
|
-
// ))
|
|
816
|
-
// : (this._chosenOutboundJourney = null);
|
|
817
|
-
// if (
|
|
818
|
-
// this._chosenInboundTicket &&
|
|
819
|
-
// this._chosenOutboundTicket.singleOrReturn === 'Return' &&
|
|
820
|
-
// this._chosenOutboundTicket.identifiers.fareIdentifier !==
|
|
821
|
-
// this._chosenInboundTicket.identifiers.fareIdentifier
|
|
822
|
-
// ) {
|
|
823
|
-
// console.warn('+++ Cannot combine fares, clearing inbound... +++');
|
|
824
|
-
// this._chosenInboundTicket = null;
|
|
825
|
-
// this._chosenInboundJourney = null;
|
|
826
|
-
// }
|
|
827
|
-
// } else if (way === 'returns') {
|
|
828
|
-
// this._chosenInboundTicket = this.helpers.clone(selectedTicket);
|
|
829
|
-
// this._chosenInboundTicket
|
|
830
|
-
// ? (this._chosenInboundJourney = this.results.value[0].return.find(
|
|
831
|
-
// (inT: RailJourneyOption) => {
|
|
832
|
-
// return inT.identifiers.journeyIdentifier === timeSlotId;
|
|
833
|
-
// }
|
|
834
|
-
// ))
|
|
835
|
-
// : (this._chosenInboundJourney = null);
|
|
836
|
-
// }
|
|
837
|
-
// console.log(this.chosenOutboundJourney);
|
|
838
|
-
// console.log(this._chosenInboundJourney);
|
|
839
|
-
// return ticketsGroups;
|
|
840
|
-
// }
|
|
841
|
-
/**
|
|
842
|
-
* @description - determine if a fare can be combined with what we currently have selected
|
|
843
|
-
*/
|
|
844
|
-
// canCombine(journeyIdentifier: string, fareIdentifier: string): boolean {
|
|
845
|
-
// // may have to modify this for dual singles later on
|
|
846
|
-
// if (
|
|
847
|
-
// this._chosenOutboundTicket &&
|
|
848
|
-
// this._chosenOutboundTicket.singleOrReturn === 'Return' &&
|
|
849
|
-
// Number(journeyIdentifier) > 5
|
|
850
|
-
// ) {
|
|
851
|
-
// // greater than 5 only as we are not going to restrict outbounds
|
|
852
|
-
// if (
|
|
853
|
-
// this._canCombine[this._chosenOutboundTicket.type][
|
|
854
|
-
// Number(journeyIdentifier)
|
|
855
|
-
// ]?.includes(fareIdentifier) &&
|
|
856
|
-
// this._chosenOutboundTicket.identifiers.fareIdentifier === fareIdentifier
|
|
857
|
-
// ) {
|
|
858
|
-
// return true;
|
|
859
|
-
// }
|
|
860
|
-
// return false;
|
|
861
|
-
// }
|
|
862
|
-
// return false;
|
|
863
|
-
// }
|
|
864
|
-
clearUnneededTickets(way, group, timeSlotId) {
|
|
865
|
-
if (way === 'returns') {
|
|
866
|
-
group.selectedIndicies = group.selectedIndicies.filter((indicie) => {
|
|
867
|
-
return Number(indicie) <= 5 || indicie === timeSlotId;
|
|
868
|
-
});
|
|
869
|
-
}
|
|
870
|
-
else {
|
|
871
|
-
group.selectedIndicies = group.selectedIndicies.filter((indicie) => {
|
|
872
|
-
return Number(indicie) > 5 || indicie === timeSlotId;
|
|
873
|
-
});
|
|
874
|
-
}
|
|
875
|
-
return group;
|
|
876
|
-
}
|
|
877
|
-
// getRailStation(
|
|
878
|
-
// code: string,
|
|
879
|
-
// isLoading: BehaviorSubject<boolean>
|
|
880
|
-
// ): Observable<IrlStation> {
|
|
881
|
-
// if (code.length === 3) {
|
|
882
|
-
// isLoading?.next(true);
|
|
883
|
-
// return this.getRailStationFetcher.fetchList({ code }).pipe(
|
|
884
|
-
// tap(() => isLoading?.next(false)),
|
|
885
|
-
// take(1)
|
|
886
|
-
// );
|
|
887
|
-
// } else {
|
|
888
|
-
// return of();
|
|
889
|
-
// }
|
|
890
|
-
// }
|
|
891
|
-
// getSelectedirlTicketOption(
|
|
892
|
-
// irlJourneyOption: IrlJourneyOption,
|
|
893
|
-
// irlTicketGroup: IrlTicketGroup,
|
|
894
|
-
// providerIndex: number
|
|
895
|
-
// ): IrlTicketOption {
|
|
896
|
-
// return irlJourneyOption.providers[providerIndex].ticketOptions.find(
|
|
897
|
-
// (ticketOption) =>
|
|
898
|
-
// ticketOption.type === irlTicketGroup.header.type &&
|
|
899
|
-
// ticketOption.price === irlTicketGroup.header.price
|
|
900
|
-
// );
|
|
901
|
-
// }
|
|
902
|
-
getLegsFromRailJourneyOption(railJourneyOption) {
|
|
567
|
+
getLegsFromIrlJourneyOption(railJourneyOption) {
|
|
903
568
|
let legs = [];
|
|
904
569
|
if (railJourneyOption === null || railJourneyOption === void 0 ? void 0 : railJourneyOption.segments.length) {
|
|
905
570
|
legs = railJourneyOption.segments.map((segment) => {
|
|
906
571
|
return {
|
|
907
|
-
operator: segment.operator,
|
|
572
|
+
operator: segment.operator || railJourneyOption.providers[0].providerId,
|
|
908
573
|
departureDateTime: segment.departDateTime,
|
|
909
574
|
departureStationName: segment.depart,
|
|
910
575
|
arrivalDateTime: segment.arriveDateTime,
|
|
@@ -914,195 +579,138 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
914
579
|
}
|
|
915
580
|
return legs;
|
|
916
581
|
}
|
|
917
|
-
|
|
582
|
+
getSelectedIrlTicketOption(irlJourneyOption, irlTicketOption, providerIndex) {
|
|
583
|
+
return irlJourneyOption.providers[providerIndex].ticketOptions.find((ticketOption) => ticketOption.type === irlTicketOption.type &&
|
|
584
|
+
(ticketOption.price === irlTicketOption.price ||
|
|
585
|
+
ticketOption.identifiers.fareIdentifier ===
|
|
586
|
+
irlTicketOption.identifiers.fareIdentifier));
|
|
587
|
+
}
|
|
588
|
+
addSingleJourneyToBasket(serviceId, irlQuery, outbound, irlJourneyOption) {
|
|
589
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
590
|
+
// console.log(serviceId,railQuery,irlJourneyOption)
|
|
591
|
+
// // if (irlJourneyOption.unsellable) {
|
|
592
|
+
// // return Promise.resolve(false);
|
|
593
|
+
// // }
|
|
594
|
+
const intBasket = yield this.basketService.getDefaultBasket();
|
|
595
|
+
const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
|
|
596
|
+
if (basket) {
|
|
597
|
+
const selectedIrlTicketOption = this.getSelectedIrlTicketOption(irlJourneyOption, outbound, 0);
|
|
598
|
+
const legs = this.getLegsFromIrlJourneyOption(irlJourneyOption);
|
|
599
|
+
const termsAndConditions = this.getTermsAndCond(irlJourneyOption);
|
|
600
|
+
// selectedIrlTicketOption.identifiers.provider;
|
|
601
|
+
const basketItem = {
|
|
602
|
+
basket: basket.id,
|
|
603
|
+
service: serviceId,
|
|
604
|
+
detail: {
|
|
605
|
+
outwardDetail: {
|
|
606
|
+
arrivalDateTime: irlJourneyOption.arriveDateTime,
|
|
607
|
+
arrivalStationName: irlJourneyOption.to,
|
|
608
|
+
arrivalStationCode: irlJourneyOption.toCode,
|
|
609
|
+
departureDateTime: irlJourneyOption.departDateTime,
|
|
610
|
+
departureStationName: irlJourneyOption.from,
|
|
611
|
+
departureStationCode: irlJourneyOption.fromCode,
|
|
612
|
+
supplierTickets: [
|
|
613
|
+
{
|
|
614
|
+
supplierName: irlJourneyOption.providers[0].name,
|
|
615
|
+
ticketDescription: selectedIrlTicketOption.type,
|
|
616
|
+
price: selectedIrlTicketOption.price,
|
|
617
|
+
legs
|
|
618
|
+
}
|
|
619
|
+
]
|
|
620
|
+
},
|
|
621
|
+
transactionIdentifier: irlJourneyOption.identifiers.transactionIdentifier,
|
|
622
|
+
outbound: {
|
|
623
|
+
fareIdentifiers: [
|
|
624
|
+
selectedIrlTicketOption.identifiers.fareIdentifier
|
|
625
|
+
],
|
|
626
|
+
journeyIdentifier: selectedIrlTicketOption.identifiers.journeyIdentifier
|
|
627
|
+
},
|
|
628
|
+
supplier: irlJourneyOption.providers[0].providerId,
|
|
629
|
+
termsAndCond: termsAndConditions
|
|
630
|
+
},
|
|
631
|
+
adults: irlQuery.adults,
|
|
632
|
+
price: selectedIrlTicketOption.price,
|
|
633
|
+
currency: selectedIrlTicketOption.currency,
|
|
634
|
+
searchQuery: irlQuery,
|
|
635
|
+
// co2PerItem: irlJourneyOption.co2PerItem,
|
|
636
|
+
// co2PerPassenger: irlJourneyOption.co2PerPassenger,
|
|
637
|
+
outboundDate: irlJourneyOption.departDateTime
|
|
638
|
+
};
|
|
639
|
+
return this.basketService.addToBasket(basketItem, intBasket, this.searchService, this.travellers);
|
|
640
|
+
}
|
|
641
|
+
return Promise.resolve(false);
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
addReturnJourneyToBasket(serviceId, irlQuery, inbound, inJourneyOption) {
|
|
918
645
|
return __awaiter(this, void 0, void 0, function* () {
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
// return Promise.resolve(false);
|
|
922
|
-
// }
|
|
646
|
+
const outbound = this.outboundTicket;
|
|
647
|
+
const outJourneyOption = this.outboundJourneyOptions;
|
|
923
648
|
const intBasket = yield this.basketService.getDefaultBasket();
|
|
924
649
|
const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
|
|
925
650
|
if (basket) {
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
// }
|
|
986
|
-
// return this.basketService.addToBasket(
|
|
987
|
-
// basketItem,
|
|
988
|
-
// intBasket,
|
|
989
|
-
// this.searchService,
|
|
990
|
-
// this.travellers
|
|
991
|
-
// );
|
|
651
|
+
const selectedIrlTicketOption = this.getSelectedIrlTicketOption(outJourneyOption, outbound, 0);
|
|
652
|
+
const outboundLegs = this.getLegsFromIrlJourneyOption(outJourneyOption);
|
|
653
|
+
const inboundLegs = this.getLegsFromIrlJourneyOption(inJourneyOption);
|
|
654
|
+
const termsAndConditions = this.getTermsAndCond(outJourneyOption);
|
|
655
|
+
const basketItem = {
|
|
656
|
+
basket: basket.id,
|
|
657
|
+
service: serviceId,
|
|
658
|
+
detail: {
|
|
659
|
+
outwardDetail: {
|
|
660
|
+
arrivalDateTime: outJourneyOption.arriveDateTime,
|
|
661
|
+
arrivalStationName: outJourneyOption.to,
|
|
662
|
+
arrivalStationCode: outJourneyOption.toCode,
|
|
663
|
+
departureStationCode: outJourneyOption.fromCode,
|
|
664
|
+
departureDateTime: outJourneyOption.departDateTime,
|
|
665
|
+
departureStationName: outJourneyOption.from,
|
|
666
|
+
supplierTickets: [
|
|
667
|
+
{
|
|
668
|
+
supplierName: outJourneyOption.providers[0].name,
|
|
669
|
+
ticketDescription: selectedIrlTicketOption.type,
|
|
670
|
+
price: selectedIrlTicketOption.price,
|
|
671
|
+
legs: outboundLegs
|
|
672
|
+
}
|
|
673
|
+
]
|
|
674
|
+
},
|
|
675
|
+
inwardDetail: {
|
|
676
|
+
arrivalDateTime: inJourneyOption.arriveDateTime,
|
|
677
|
+
arrivalStationName: inJourneyOption.to,
|
|
678
|
+
arrivalStationCode: inJourneyOption.toCode,
|
|
679
|
+
departureStationCode: inJourneyOption.fromCode,
|
|
680
|
+
departureDateTime: inJourneyOption.departDateTime,
|
|
681
|
+
departureStationName: inJourneyOption.from,
|
|
682
|
+
supplierTickets: [
|
|
683
|
+
{
|
|
684
|
+
supplierName: inJourneyOption.providers[0].name,
|
|
685
|
+
ticketDescription: selectedIrlTicketOption.type,
|
|
686
|
+
legs: inboundLegs
|
|
687
|
+
}
|
|
688
|
+
]
|
|
689
|
+
},
|
|
690
|
+
transactionIdentifier: outbound.identifiers.transactionIdentifier,
|
|
691
|
+
outbound: {
|
|
692
|
+
fareIdentifiers: [
|
|
693
|
+
selectedIrlTicketOption.identifiers.fareIdentifier
|
|
694
|
+
],
|
|
695
|
+
journeyIdentifier: selectedIrlTicketOption.identifiers.journeyIdentifier
|
|
696
|
+
},
|
|
697
|
+
supplier: outJourneyOption.providers[0].providerId,
|
|
698
|
+
termsAndCond: termsAndConditions
|
|
699
|
+
},
|
|
700
|
+
adults: irlQuery.adults,
|
|
701
|
+
price: selectedIrlTicketOption.price,
|
|
702
|
+
currency: selectedIrlTicketOption.currency,
|
|
703
|
+
searchQuery: irlQuery,
|
|
704
|
+
outboundDate: outJourneyOption.departDateTime
|
|
705
|
+
// co2PerItem: outbound.co2PerItem,
|
|
706
|
+
// co2PerPassenger: outbound.co2PerPassenger
|
|
707
|
+
};
|
|
708
|
+
this.filterSelected();
|
|
709
|
+
return this.basketService.addToBasket(basketItem, intBasket, this.searchService, this.travellers);
|
|
992
710
|
}
|
|
993
711
|
return Promise.resolve(false);
|
|
994
712
|
});
|
|
995
713
|
}
|
|
996
|
-
// async addReturnJourneyToBasket(
|
|
997
|
-
// serviceId: string,
|
|
998
|
-
// railQuery: SearchRailQueryVariables,
|
|
999
|
-
// outbound: RailJourneyOption,
|
|
1000
|
-
// inbound: RailJourneyOption,
|
|
1001
|
-
// railTicketGroup: RailTicketGroup
|
|
1002
|
-
// ): Promise<boolean> {
|
|
1003
|
-
// if (outbound.unsellable) {
|
|
1004
|
-
// return Promise.resolve(false);
|
|
1005
|
-
// }
|
|
1006
|
-
// const intBasket: InternalBasketInterface =
|
|
1007
|
-
// await this.basketService.getDefaultBasket();
|
|
1008
|
-
// const basket = intBasket?.subject.value;
|
|
1009
|
-
// if (basket) {
|
|
1010
|
-
// const selectedRailTicketOption = this.getSelectedRailTicketOption(
|
|
1011
|
-
// outbound,
|
|
1012
|
-
// railTicketGroup,
|
|
1013
|
-
// 0
|
|
1014
|
-
// );
|
|
1015
|
-
// const outboundLegs = this.getLegsFromRailJourneyOption(outbound);
|
|
1016
|
-
// const inboundLegs = this.getLegsFromRailJourneyOption(inbound);
|
|
1017
|
-
// const ticketQueueList = selectedRailTicketOption.ticketQueueList.map(
|
|
1018
|
-
// (ticketQueueList1: RailTicketQueue) => {
|
|
1019
|
-
// return {
|
|
1020
|
-
// id: ticketQueueList1.id,
|
|
1021
|
-
// name: ticketQueueList1.name,
|
|
1022
|
-
// type: ticketQueueList1.type
|
|
1023
|
-
// };
|
|
1024
|
-
// }
|
|
1025
|
-
// );
|
|
1026
|
-
// return this.basketService.addToBasket(
|
|
1027
|
-
// {
|
|
1028
|
-
// basket: basket.id,
|
|
1029
|
-
// service: serviceId,
|
|
1030
|
-
// detail: {
|
|
1031
|
-
// outwardDetail: {
|
|
1032
|
-
// arrivalDateTime: outbound.arriveDateTime,
|
|
1033
|
-
// arrivalStationName: outbound.to,
|
|
1034
|
-
// departureDateTime: outbound.departDateTime,
|
|
1035
|
-
// departureStationName: outbound.from,
|
|
1036
|
-
// supplierTickets: [
|
|
1037
|
-
// {
|
|
1038
|
-
// supplierName: outbound.providers[0].name,
|
|
1039
|
-
// ticketDescription: selectedRailTicketOption.type,
|
|
1040
|
-
// price: selectedRailTicketOption.price,
|
|
1041
|
-
// legs: outboundLegs
|
|
1042
|
-
// }
|
|
1043
|
-
// ]
|
|
1044
|
-
// },
|
|
1045
|
-
// inwardDetail: {
|
|
1046
|
-
// arrivalDateTime: inbound.arriveDateTime,
|
|
1047
|
-
// arrivalStationName: inbound.to,
|
|
1048
|
-
// departureDateTime: inbound.departDateTime,
|
|
1049
|
-
// departureStationName: inbound.from,
|
|
1050
|
-
// supplierTickets: [
|
|
1051
|
-
// {
|
|
1052
|
-
// supplierName: inbound.providers[0].name,
|
|
1053
|
-
// ticketDescription: selectedRailTicketOption.type,
|
|
1054
|
-
// legs: inboundLegs
|
|
1055
|
-
// }
|
|
1056
|
-
// ]
|
|
1057
|
-
// },
|
|
1058
|
-
// transactionIdentifier: outbound.identifiers.transactionIdentifier,
|
|
1059
|
-
// outbound: {
|
|
1060
|
-
// fareIdentifiers: [
|
|
1061
|
-
// selectedRailTicketOption.identifiers.fareIdentifier
|
|
1062
|
-
// ],
|
|
1063
|
-
// journeyIdentifier:
|
|
1064
|
-
// selectedRailTicketOption.identifiers.journeyIdentifier
|
|
1065
|
-
// },
|
|
1066
|
-
// ticketQueueList
|
|
1067
|
-
// },
|
|
1068
|
-
// adults: railQuery.adults,
|
|
1069
|
-
// price: railTicketGroup.header.price,
|
|
1070
|
-
// currency: selectedRailTicketOption.currency as CurrencyCode,
|
|
1071
|
-
// searchQuery: railQuery,
|
|
1072
|
-
// co2PerItem: outbound.co2PerItem,
|
|
1073
|
-
// co2PerPassenger: outbound.co2PerPassenger
|
|
1074
|
-
// },
|
|
1075
|
-
// intBasket,
|
|
1076
|
-
// this.searchService,
|
|
1077
|
-
// this.travellers
|
|
1078
|
-
// );
|
|
1079
|
-
// }
|
|
1080
|
-
// return Promise.resolve(false);
|
|
1081
|
-
// }
|
|
1082
|
-
// sortTicketPrices(tickets: TicketGroups): TicketGroups {
|
|
1083
|
-
// const sortTicketPrices = { ...tickets };
|
|
1084
|
-
// Object.keys(sortTicketPrices).map((key) => {
|
|
1085
|
-
// sortTicketPrices[key].sort((a: IrlTicketOption, b: IrlTicketOption) => {
|
|
1086
|
-
// const priceA = a.price,
|
|
1087
|
-
// priceB = b.price;
|
|
1088
|
-
// return priceA < priceB ? -1 : priceA > priceB ? 1 : 0;
|
|
1089
|
-
// });
|
|
1090
|
-
// });
|
|
1091
|
-
// return sortTicketPrices;
|
|
1092
|
-
// // }
|
|
1093
|
-
// sortTicketChildrenPrices(tickets: RailTicketGroups): RailTicketGroups {
|
|
1094
|
-
// const sortTicketPrices = { ...tickets };
|
|
1095
|
-
// Object.keys(sortTicketPrices).map((key) => {
|
|
1096
|
-
// sortTicketPrices[key].children.sort(
|
|
1097
|
-
// (a: RailTicketGroup, b: RailTicketGroup) => {
|
|
1098
|
-
// const priceA = a.header.price,
|
|
1099
|
-
// priceB = b.header.price;
|
|
1100
|
-
// return priceA < priceB ? -1 : priceA > priceB ? 1 : 0;
|
|
1101
|
-
// }
|
|
1102
|
-
// );
|
|
1103
|
-
// });
|
|
1104
|
-
// return sortTicketPrices;
|
|
1105
|
-
// }
|
|
1106
714
|
updateLowestPrice(results) {
|
|
1107
715
|
if (!results.length)
|
|
1108
716
|
return null;
|
|
@@ -1118,15 +726,15 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1118
726
|
this._cheapestStandard = null;
|
|
1119
727
|
if (!results.length)
|
|
1120
728
|
return null;
|
|
1121
|
-
|
|
729
|
+
const cheapestArr = [];
|
|
1122
730
|
results.map((result) => {
|
|
1123
731
|
result.outbound.map((out) => {
|
|
1124
732
|
out.providers.map((tkt) => {
|
|
1125
|
-
|
|
733
|
+
const cheapestTicket = tkt.cheapestTicket.price;
|
|
1126
734
|
tkt.ticketOptions.map((tktOption) => {
|
|
1127
735
|
var _a, _b;
|
|
1128
|
-
|
|
1129
|
-
|
|
736
|
+
const tktPrice = tktOption.price;
|
|
737
|
+
const tktClass = tktOption.class;
|
|
1130
738
|
if (tktClass === 'First' &&
|
|
1131
739
|
(((_a = this._cheapestFirst) === null || _a === void 0 ? void 0 : _a.price) > tktPrice || !this._cheapestFirst)) {
|
|
1132
740
|
this._cheapestFirst = tktOption;
|
|
@@ -1145,8 +753,118 @@ export class IRLEnterpriseSearch extends BaseEnterpriseSearch {
|
|
|
1145
753
|
});
|
|
1146
754
|
return Math.min(...cheapestArr);
|
|
1147
755
|
}
|
|
756
|
+
/**
|
|
757
|
+
* Sort results by price
|
|
758
|
+
*
|
|
759
|
+
* @returns
|
|
760
|
+
* @memberof irl-enterprise-search
|
|
761
|
+
*/
|
|
762
|
+
sortByPrice() {
|
|
763
|
+
this.priceDir = !this.priceDir;
|
|
764
|
+
const results = this.filterSelected(this._isFiltered);
|
|
765
|
+
const byPrice = (a, b) => {
|
|
766
|
+
return this.priceDir
|
|
767
|
+
? a.providers[0].cheapestTicket.price -
|
|
768
|
+
b.providers[0].cheapestTicket.price
|
|
769
|
+
: b.providers[0].cheapestTicket.price -
|
|
770
|
+
a.providers[0].cheapestTicket.price;
|
|
771
|
+
};
|
|
772
|
+
results[0].outbound = results[0].outbound.sort(byPrice);
|
|
773
|
+
results[0].return = results[0].return.sort(byPrice);
|
|
774
|
+
this.results.next(results);
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
777
|
+
* Sort results by departure time
|
|
778
|
+
*
|
|
779
|
+
* @returns
|
|
780
|
+
* @memberof irl-enterprise-search
|
|
781
|
+
*/
|
|
782
|
+
sortByDate() {
|
|
783
|
+
this.dateDir = !this.dateDir;
|
|
784
|
+
const results = this.filterSelected(this._isFiltered);
|
|
785
|
+
const byDate = (a, b) => {
|
|
786
|
+
return this.dateDir
|
|
787
|
+
? moment(a.departDateTime).unix() - moment(b.departDateTime).unix()
|
|
788
|
+
: moment(b.departDateTime).unix() - moment(a.departDateTime).unix();
|
|
789
|
+
};
|
|
790
|
+
results[0].outbound = results[0].outbound.sort(byDate);
|
|
791
|
+
results[0].return = results[0].return.sort(byDate);
|
|
792
|
+
this.results.next(results);
|
|
793
|
+
}
|
|
794
|
+
addOutboundAndFilter(ticket, fullTicket) {
|
|
795
|
+
this.outboundJourneyOptions = fullTicket;
|
|
796
|
+
this.outboundTicket = ticket;
|
|
797
|
+
this.filterSelected(true);
|
|
798
|
+
}
|
|
799
|
+
filterSelected(filterOutbound = false) {
|
|
800
|
+
const results = this.helpers.clone(this.fullResults);
|
|
801
|
+
if (filterOutbound) {
|
|
802
|
+
this._isFiltered = true;
|
|
803
|
+
results[0].outbound = [
|
|
804
|
+
results[0].outbound.find((item) => {
|
|
805
|
+
return (item.departDateTime ===
|
|
806
|
+
this._outboundJourneyOptions.departDateTime &&
|
|
807
|
+
item.arriveDateTime === this._outboundJourneyOptions.arriveDateTime);
|
|
808
|
+
})
|
|
809
|
+
];
|
|
810
|
+
results[0].outbound[0].providers[0].ticketOptions =
|
|
811
|
+
results[0].outbound[0].providers[0].ticketOptions.reduce((acc, ticket) => {
|
|
812
|
+
if (ticket.uid === this._outboundTicket.uid) {
|
|
813
|
+
ticket.selected = true;
|
|
814
|
+
acc.push(ticket);
|
|
815
|
+
}
|
|
816
|
+
return acc;
|
|
817
|
+
}, []);
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
this._isFiltered = false;
|
|
821
|
+
this.outboundJourneyOptions = null;
|
|
822
|
+
this.outboundTicket = null;
|
|
823
|
+
results[0].outbound.forEach((item) => {
|
|
824
|
+
item.providers[0].ticketOptions.map((ticket) => {
|
|
825
|
+
ticket.selected = false;
|
|
826
|
+
ticket.ShowDetail = false;
|
|
827
|
+
return ticket;
|
|
828
|
+
});
|
|
829
|
+
});
|
|
830
|
+
}
|
|
831
|
+
this.results.next(results);
|
|
832
|
+
return results;
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* @description - get irl station locations
|
|
836
|
+
* @param term - the term to search
|
|
837
|
+
* @param isLoading - BehaviorSubject so we know something is happening
|
|
838
|
+
*/
|
|
839
|
+
getIrlDiscountCards() {
|
|
840
|
+
const supplier = this.supplier;
|
|
841
|
+
return this.irlDiscountCardsFetcher.fetchList({
|
|
842
|
+
supplier
|
|
843
|
+
});
|
|
844
|
+
}
|
|
845
|
+
getTermsAndCond(inJourneyOption) {
|
|
846
|
+
var _a, _b;
|
|
847
|
+
return [
|
|
848
|
+
{
|
|
849
|
+
name: 'Fare Rules',
|
|
850
|
+
value: (_b = (_a = inJourneyOption === null || inJourneyOption === void 0 ? void 0 : inJourneyOption.providers[0]) === null || _a === void 0 ? void 0 : _a.ticketOptions[0]) === null || _b === void 0 ? void 0 : _b.fareRules
|
|
851
|
+
}
|
|
852
|
+
];
|
|
853
|
+
}
|
|
854
|
+
saveSearch() {
|
|
855
|
+
if (this.isValid.value) {
|
|
856
|
+
const query = this.getSearchQuery();
|
|
857
|
+
const favouriteSearchQuery = this.updateSerchQuery(query);
|
|
858
|
+
const searchInfo = {
|
|
859
|
+
name: `${moment()}`,
|
|
860
|
+
serviceType: ServiceType.InternationalRail,
|
|
861
|
+
searchArgs: favouriteSearchQuery
|
|
862
|
+
};
|
|
863
|
+
return this.searchService.saveFavouriteSearch(searchInfo);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
1148
866
|
}
|
|
1149
867
|
IRLEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_irl';
|
|
1150
868
|
IRLEnterpriseSearch.STORAGE_SESSION_RESULTS = 'irl_results';
|
|
1151
869
|
IRLEnterpriseSearch.PASSING_POINT = 'Passing';
|
|
1152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJsLWVudGVycHJpc2Utc2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2J0c2VydmljZXMvYmFzZS9zcmMvbGliL3ZlbmRvci9jbGFzc2VzL2lybC1lbnRlcnByaXNlLXNlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFrQixNQUFNLFFBQVEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsR0FBRyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFpQnpELE9BQU8sRUFHTCxRQUFRLEVBTVIsV0FBVyxFQUNYLGNBQWMsRUFDZixNQUFNLHdCQUF3QixDQUFDO0FBa0JoQyxPQUFPLEVBQWEsSUFBSSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHN0QsTUFBTSxDQUFOLElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQiw0Q0FBdUIsQ0FBQTtJQUN2Qiw2Q0FBd0IsQ0FBQTtBQUMxQixDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QjtBQUVELE1BQU0sT0FBTyxtQkFJWCxTQUFRLG9CQUlQO0lBc2RELFlBQ1UsVUFBa0MsRUFDbEMsd0JBQTZELEVBQzdELE9BQTJCLEVBQzNCLGFBQStDLEVBQ3ZELGNBQWtDLEVBQzFCLGFBQStDO1FBRXZELEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQVBkLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBcUM7UUFDN0QsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBRS9DLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQXJkL0MsdUJBQWtCLEdBQUcsbUJBQW1CLENBQUMsdUJBQXVCLENBQUM7UUFDakUsNEJBQXVCLEdBQUcsbUJBQW1CLENBQUMs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QUFFO29CQUN4QixJQUFJLGNBQWMsR0FBVyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztvQkFDdEQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7d0JBQ2xDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7d0JBQy9CLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7d0JBQy9CLElBQ0UsUUFBUSxLQUFLLE9BQU87NEJBQ3BCLENBQUMsT0FBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxLQUFLLElBQUcsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUMvRDs0QkFDQSxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQzt5QkFDakM7NkJBQU0sSUFDTCxRQUFRLEtBQUssVUFBVTs0QkFDdkIsQ0FBQyxPQUFBLElBQUksQ0FBQyxpQkFBaUIsMENBQUUsS0FBSyxJQUFHLFFBQVE7Z0NBQ3ZDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQzFCOzRCQUNBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7eUJBQ3BDO3dCQUNELElBQUksUUFBUSxLQUFLLGNBQWMsRUFBRTs0QkFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzt5QkFDbEM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFDbEMsQ0FBQzs7QUE5MENlLDBDQUFzQixHQUFHLFlBQVksQ0FBQztBQUN0QywyQ0FBdUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsaUNBQWEsR0FBRyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50LCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IG9mLCBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBSYWlsVGlja2V0R3JvdXBzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yYWlsLXRpY2tldC1ncm91cHMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBSYWlsUmVzdWx0SW5kaWZpZXJzLFxyXG4gIFJhaWxUaWNrZXRHcm91cCxcclxuICBUaWNrZXRHcm91cHNcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JhaWwtdGlja2V0LWdyb3VwLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFJhaWxEaXJlY3Rpb24gfSBmcm9tICcuL3JhaWwtZGlyZWN0aW9uLmVudW0nO1xyXG5pbXBvcnQgeyBWYWx1ZURpc3BsYXkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ZhbHVlLWRpc3BsYXknO1xyXG5pbXBvcnQge1xyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgSXJsUXVvdGVSZXN1bHRBcnJheSxcclxuICBSZWN1cnNpdmVQYXJ0aWFsLFxyXG4gIFJlY2VudFNlYXJjaFxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBCYXNrZXRJdGVtLFxyXG4gIEN1cnJlbmN5Q29kZSxcclxuICBJcmxDbGFzcyxcclxuICBJcmxKb3VybmV5T3B0aW9uLFxyXG4gIElybEpvdXJuZXlPcHRpb25zLFxyXG4gIElybFByb3ZpZGVyLFxyXG4gIElybFRpY2tldE9wdGlvbixcclxuICBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZSxcclxuICBJcmxKb3VybmV5VHlwZSwgSXJsU3VwcGxpZXIsIElybFRpY2tldFxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VJcmxRdW90ZUZldGNoZXIsXHJcbiAgSXJsUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2lybC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoSXJsU3RhdGlvbnNGZXRjaGVyLFxyXG4gIFNlYXJjaElybFN0YXRpb25zRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtaXJsLXN0YXRpb25zLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIElSTEVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgSXJsVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWlybC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciwgYWdlcyB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgSUNoZWFwZXN0UHJpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoZWFwZXN0LXByaWNlJztcclxuXHJcbmV4cG9ydCBlbnVtIElybFNlYXJjaENyaXRlcmlhIHtcclxuICBEZXBhcnQgPSAnRGVwYXJ0IEFmdGVyJyxcclxuICBBcnJpdmUgPSAnQXJyaXZlIEJlZm9yZSdcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIElSTEVudGVycHJpc2VTZWFyY2g8XHJcbiAgUSBleHRlbmRzIElybFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0lTX1EgZXh0ZW5kcyBTZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgSXJsVGVtcFBhcmFtcyxcclxuICBJcmxRdW90ZVJlc3VsdEFycmF5LFxyXG4gIElybFF1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBJUkxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlIHtcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyA9ICdzZWFyY2hfaXJsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAnaXJsX3Jlc3VsdHMnO1xyXG4gIHN0YXRpYyByZWFkb25seSBQQVNTSU5HX1BPSU5UID0gJ1Bhc3NpbmcnO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPSBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG4gIHByb3RlY3RlZCBtdWx0aVJlc3VsdHNTZXNzaW9uTmFtZSA9IElSTEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcblxyXG5cclxuICBwdWJsaWMgc2VhcmNoVHlwZXMgPSBbXHJcbiAgICB7IGRpc3BsYXk6ICdSZXR1cm4nLCB2YWx1ZTogSXJsSm91cm5leVR5cGUuUmV0dXJuSm91cm5leSB9LFxyXG4gICAgeyBkaXNwbGF5OiAnT25lLVdheScsIHZhbHVlOiBJcmxKb3VybmV5VHlwZS5TaW5nbGVKb3VybmV5IH1cclxuICAgIC8vIHsgZGlzcGxheTogJ09wZW4gUmV0dXJuJywgdmFsdWU6IElybEpvdXJuZXlUeXBlLk9wZW5SZXR1cm5Kb3VybmV5IH0sXHJcbiAgICAvLyB7IGRpc3BsYXk6ICdEdWFsIFNpbmdsZXMnLCB2YWx1ZTogSXJsSm91cm5leVR5cGUuRHVhbFNpbmdsZUpvdXJuZXkgfSxcclxuICBdO1xyXG5cclxuICBwdWJsaWMgY2xhc3NUeXBlcyA9IFtcclxuICAgIHsgZGlzcGxheTogJ0FueScsIHZhbHVlOiBJcmxDbGFzcy5BbGwgfSxcclxuICAgIHsgZGlzcGxheTogJ1N0YW5kYXJkJywgdmFsdWU6IElybENsYXNzLlN0YW5kYXJkIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdGaXJzdCcsIHZhbHVlOiBJcmxDbGFzcy5GaXJzdCB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIGFnZVJhbmdlczoge1xyXG4gICAga2V5OiBhZ2VzO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W10gPSBbeyBrZXk6IGFnZXMuQ2hpbGQsIHZhbHVlOiAnQ2hpbGQgKDAtMyknIH0sIHsga2V5OiBhZ2VzLkNoaWxkLCB2YWx1ZTogJ0NoaWxkICg0LTUpJyB9LCB7IGtleTogYWdlcy5DaGlsZCwgdmFsdWU6ICdDaGlsZCAoNi0xMSknIH0sIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1lvdXRoICgxMi0xNCknIH0sIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1lvdXRoICgxNS0yNSknIH0sIHsga2V5OiBhZ2VzLkFkdWx0LCB2YWx1ZTogJ0FkdWx0ICgyNi01OSknIH0sIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1NlbmlvciAoNjArKScgfV07XHJcblxyXG5cclxuXHJcbiAgcHVibGljIGlybENyaXRlcmlhID0gW0lybFNlYXJjaENyaXRlcmlhLkRlcGFydCwgSXJsU2VhcmNoQ3JpdGVyaWEuQXJyaXZlXTtcclxuXHJcbiAgcHVibGljIHRyYXZlbENhcmRzID0gW1xyXG4gICAgeyBkaXNwbGF5OiAnWW91bmcgcGVyc29ucyByYWlsY2FyZCcsIHZhbHVlOiAnWU5HJyB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRGlzYWJpbGl0eSByYWlsY2FyZCcsIHZhbHVlOiAnRElTJyB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRmFtaWx5IHJhaWxjYXJkJywgdmFsdWU6ICdGQU0nIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdGb3JjZXMgcmFpbGNhcmQnLCB2YWx1ZTogJ0hNRicgfSxcclxuICAgIHsgZGlzcGxheTogJ1RyYXZlbCBhZ2VuY3kgZGlzY291bnQnLCB2YWx1ZTogJ1RBRCcgfVxyXG4gIF07XHJcblxyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbDtcclxuICBwdWJsaWMgbWluT3V0Ym91bmREYXRlOiBOZ2JEYXRlU3RydWN0ID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG4gIHB1YmxpYyBtaW5JbmJvdW5kRGF0ZTogTmdiRGF0ZVN0cnVjdCA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSxcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpXHJcbiAgfTtcclxuICBwcml2YXRlIF90aW1lQXJyYXk6IFZhbHVlRGlzcGxheVtdO1xyXG4gIHByaXZhdGUgX2NhbkNvbWJpbmU6IGFueTtcclxuICAvLyBwcml2YXRlIF9jaG9zZW5PdXRib3VuZFRpY2tldDogUmVjdXJzaXZlUGFydGlhbDxJcmxUaWNrZXRPcHRpb24+O1xyXG4gIC8vIHByaXZhdGUgX2Nob3NlbkluYm91bmRUaWNrZXQ6IFJlY3Vyc2l2ZVBhcnRpYWw8SXJsVGlja2V0T3B0aW9uPjtcclxuICAvLyBwcml2YXRlIF9jaG9zZW5PdXRib3VuZEpvdXJuZXk6IFJlY3Vyc2l2ZVBhcnRpYWw8SXJsSm91cm5leU9wdGlvbj47XHJcbiAgLy8gcHJpdmF0ZSBfY2hvc2VuSW5ib3VuZEpvdXJuZXk6IFJlY3Vyc2l2ZVBhcnRpYWw8SXJsSm91cm5leU9wdGlvbj47XHJcbiAgcHJpdmF0ZSBfdmlhTG9jYXRpb246IGFueTtcclxuICBwcml2YXRlIF90cmF2ZWxsaW5nRnJvbTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3RyYXZlbGxpbmdUbzogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfb3JpZ2luYWxVc2VyU2VhcmNoOiBJcmxUZW1wUGFyYW1zO1xyXG5cclxuICAvLyBnZXQgY2hvc2VuVG90YWxQcmljZSgpOiBudW1iZXIge1xyXG4gIC8vICAgaWYgKHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0KSB7XHJcbiAgLy8gICAgIGlmICh0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0KSB7XHJcbiAgLy8gICAgICAgLy8gbm93IGNoZWNrIGlmIHRoZXkgYXJlIHJldHVybnMgb3IgZHVhbFxyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0LnNpbmdsZU9yUmV0dXJuID09PSAnUmV0dXJuJyAmJlxyXG4gIC8vICAgICAgICAgdGhpcy5fY2hvc2VuSW5ib3VuZFRpY2tldC5zaW5nbGVPclJldHVybiA9PT0gJ1JldHVybidcclxuICAvLyAgICAgICApIHtcclxuICAvLyAgICAgICAgIC8vIHRoZXkgc2hvdWxkIGJvdGggaGF2ZSB0aGUgc2FtZSBwcmljZVxyXG4gIC8vICAgICAgICAgcmV0dXJuIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0LnByaWNlO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICByZXR1cm4gKFxyXG4gIC8vICAgICAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQucHJpY2UgKyB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0LnByaWNlXHJcbiAgLy8gICAgICAgKTtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgcmV0dXJuIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0LnByaWNlO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHJldHVybiAwO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGNob3NlblRpY2tldHMoKTogYW55IHtcclxuICAvLyAgIHJldHVybiB7XHJcbiAgLy8gICAgIE91dGJvdW5kOiB0aGlzLl9jaG9zZW5PdXRib3VuZFRpY2tldCxcclxuICAvLyAgICAgSW5ib3VuZDogdGhpcy5fY2hvc2VuSW5ib3VuZFRpY2tldFxyXG4gIC8vICAgfTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBjaG9zZW5PdXRib3VuZEpvdXJuZXkoKTogUmVjdXJzaXZlUGFydGlhbDxSYWlsSm91cm5leU9wdGlvbj4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2Nob3Nlbk91dGJvdW5kSm91cm5leTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBjaG9zZW5JbmJvdW5kSm91cm5leSgpOiBSZWN1cnNpdmVQYXJ0aWFsPFJhaWxKb3VybmV5T3B0aW9uPiB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5fY2hvc2VuSW5ib3VuZEpvdXJuZXk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgb3BlblJldHVybigpOiBib29sZWFuIHtcclxuICAvLyAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMub3BlblJldHVybjtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBvcGVuUmV0dXJuKG5ld1ZhbDogYm9vbGVhbikge1xyXG4gIC8vICAgdGhpcy50ZW1wUGFyYW1zLm9wZW5SZXR1cm4gPSBuZXdWYWw7XHJcblxyXG4gIC8vICAgaWYgKG5ld1ZhbCkge1xyXG4gIC8vICAgICB0aGlzLnRlbXBQYXJhbXMuY2hvc2VuU2VhcmNoVHlwZSA9IElybEpvdXJuZXlUeXBlLk9wZW5SZXR1cm5Kb3VybmV5O1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGNob3NlblNlYXJjaFR5cGUoKTogSXJsSm91cm5leVR5cGUge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hUeXBlO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGNob3NlblNlYXJjaFR5cGUobmV3VHlwZTogSXJsSm91cm5leVR5cGUpIHtcclxuICAvLyAgIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hUeXBlID0gbmV3VHlwZTtcclxuICAvLyAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAvLyB9XHJcblxyXG4gIGdldCBub09mQWR1bHRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFkdWx0cztcclxuICB9XHJcblxyXG4gIHNldCBub09mQWR1bHRzKGFkdWx0czogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gYWR1bHRzO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vT2ZDaGlsZHJlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHNldCBub09mQ2hpbGRyZW4oY2hpbGRyZW46IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJhdmVsbGluZ1RvKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFycml2YWxMb2NhdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgc2V0IHRyYXZlbGxpbmdUbyh0dDogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbExvY2F0aW9uSWQgPSB0dDtcclxuXHJcbiAgICB0aGlzLl90cmF2ZWxsaW5nVG8gPSAnJztcclxuICAgIGlmICh0dD8ucmFpbHN0YXRpb24/LmlkKSB7XHJcbiAgICAgIHRoaXMuX3RyYXZlbGxpbmdUbyA9IHR0LnJhaWxzdGF0aW9uLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCB0cmF2ZWxsaW5nRnJvbSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kZXBhcnR1cmVMb2NhdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgc2V0IHRyYXZlbGxpbmdGcm9tKHR0OiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5kZXBhcnR1cmVMb2NhdGlvbklkID0gdHQ7XHJcbiAgICB0aGlzLl90cmF2ZWxsaW5nRnJvbSA9ICcnO1xyXG4gICAgaWYgKHR0Py5yYWlsc3RhdGlvbj8uaWQpIHtcclxuICAgICAgdGhpcy5fdHJhdmVsbGluZ0Zyb20gPSB0dC5yYWlsc3RhdGlvbi5pZDtcclxuICAgICAgdGhpcy5zdXBwbGllciA9IHR0LnJhaWxzdGF0aW9uLnN1cHBsaWVyO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N1cHBsaWVyOiBJcmxTdXBwbGllciA9IG51bGxcclxuICBnZXQgc3VwcGxpZXIoKTogSXJsU3VwcGxpZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1cHBsaWVyO1xyXG4gIH1cclxuICBzZXQgc3VwcGxpZXIoZGF0YTogSXJsU3VwcGxpZXIpIHtcclxuICAgIHRoaXMuX3N1cHBsaWVyID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvdW50cnlDb2RlOiBzdHJpbmcgPSBudWxsXHJcbiAgZ2V0IGNvdW50cnlDb2RlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRyeUNvZGU7XHJcbiAgfVxyXG4gIHNldCBjb3VudHJ5Q29kZShkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2NvdW50cnlDb2RlID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsYXNzOiBJcmxDbGFzcyA9IG51bGxcclxuICBnZXQgY2xhc3MoKTogSXJsQ2xhc3Mge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzO1xyXG4gIH1cclxuICBzZXQgY2xhc3MoZGF0YTogSXJsQ2xhc3MpIHtcclxuICAgIHRoaXMuX2NsYXNzID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQgPSBudWxsXHJcbiAgZ2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcbiAgc2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMuX291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZVxyXG4gICAgdGhpcy5fb3V0Ym91bmRfZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlVGltZSk7XHJcbiAgICB0aGlzLl9vdXRib3VuZF90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgOiAnMDcwMCc7XHJcbiAgICB0aGlzLl91cGRhdGVPdXRib3VuZERhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kZXBhcnR1cmVMb2NhdGlvbklkOiBzdHJpbmcgPSBudWxsXHJcbiAgZ2V0IGRlcGFydHVyZUxvY2F0aW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9kZXBhcnR1cmVMb2NhdGlvbklkO1xyXG4gIH1cclxuICBzZXQgZGVwYXJ0dXJlTG9jYXRpb25JZChkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2RlcGFydHVyZUxvY2F0aW9uSWQgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXJyaXZhbExvY2F0aW9uSWQ6IHN0cmluZyA9IG51bGxcclxuICBnZXQgYXJyaXZhbExvY2F0aW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9hcnJpdmFsTG9jYXRpb25JZDtcclxuICB9XHJcbiAgc2V0IGFycml2YWxMb2NhdGlvbklkKGRhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYXJyaXZhbExvY2F0aW9uSWQgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWR1bHRzOiBudW1iZXIgPSAwXHJcbiAgZ2V0IGFkdWx0cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FkdWx0cztcclxuICB9XHJcbiAgc2V0IGFkdWx0cyhkYXRhOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2FkdWx0cyA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaGlsZHJlbjogbnVtYmVyID0gMFxyXG4gIGdldCBjaGlsZHJlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xyXG4gIH1cclxuICBzZXQgY2hpbGRyZW4oZGF0YTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jaGlsZHJlbiA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXR1cm5EZXBhcnR1cmVEYXRlVGltZTogbW9tZW50Lk1vbWVudCA9IG51bGxcclxuICBnZXQgcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWU7XHJcbiAgfVxyXG4gIHNldCByZXR1cm5EZXBhcnR1cmVEYXRlVGltZShuZXdEYXRlVGltZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdGhpcy5fcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgIHRoaXMuX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGVUaW1lKTtcclxuICAgIHRoaXMuX3JldHVybl90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgOiAnMDcwMCc7XHJcbiAgICB0aGlzLl91cGRhdGVSZXR1cm5EYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWdlUmFuZ2U6IHN0cmluZyA9IG51bGxcclxuICBnZXQgYWdlUmFuZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9hZ2VSYW5nZTtcclxuICB9XHJcbiAgc2V0IGFnZVJhbmdlKGRhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYWdlUmFuZ2UgPSBkYXRhO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgLy8gZ2V0IGNob3NlblJhaWxDbGFzcygpOiBSYWlsQ2xhc3Mge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hDbGFzcztcclxuICAvLyB9XHJcblxyXG4gIGdldCBjaG9zZW5TZWFyY2hDbGFzcygpOiBJcmxDbGFzcyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNsYXNzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNob3NlblNlYXJjaENsYXNzKGNsYXNzUjogSXJsQ2xhc3MpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5jbGFzcyA9IGNsYXNzUjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBvdXRCb3VuZERhdGVUaW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dEJvdW5kRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKTtcclxuXHJcbiAgICB0aGlzLm1pbkluYm91bmREYXRlID0ge1xyXG4gICAgICB5ZWFyOiBuZXdEYXRlVGltZS55ZWFyKCksXHJcbiAgICAgIG1vbnRoOiBuZXdEYXRlVGltZS5tb250aCgpICsgMSxcclxuICAgICAgZGF5OiBuZXdEYXRlVGltZS5kYXRlKClcclxuICAgIH07XHJcblxyXG4gICAgaWYgKG5ld0RhdGVUaW1lICYmIG5ld0RhdGVUaW1lLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLl9vdXRib3VuZF9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGVUaW1lKTtcclxuICAgICAgdGhpcy5fb3V0Ym91bmRfdGltZSA9IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA6ICcwNzAwJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZSAmJlxyXG4gICAgICB0aGlzLmluQm91bmREYXRlVGltZSAmJlxyXG4gICAgICB0aGlzLm91dEJvdW5kRGF0ZVRpbWUuaXNBZnRlcih0aGlzLmluQm91bmREYXRlVGltZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmluQm91bmREYXRlVGltZSA9IHRoaXMub3V0Qm91bmREYXRlVGltZS5jbG9uZSgpLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG91dGJvdW5kQ3JpdGVyaWEoKTogSXJsU2VhcmNoQ3JpdGVyaWEge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZENyaXRlcmlhO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kQ3JpdGVyaWEobmV3Q3JpdDogSXJsU2VhcmNoQ3JpdGVyaWEpIHtcclxuICAgIC8vIGNvbnNvbGUud2FybihgKysrIFNldHRpbmcgTmV3IENyaXRlcmlhOiAke25ld0NyaXR9ICsrK2ApO1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kQ3JpdGVyaWEgPSBuZXdDcml0O1xyXG5cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBpbkJvdW5kRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLnJldHVybkRlcGFydHVyZURhdGVUaW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IGluQm91bmREYXRlVGltZShuZXdEYXRlVGltZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnJldHVybkRlcGFydHVyZURhdGVUaW1lID0gbmV3RGF0ZVRpbWU7XHJcbiAgICBpZiAobmV3RGF0ZVRpbWUgJiYgbmV3RGF0ZVRpbWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMuX3JldHVybl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKG5ld0RhdGVUaW1lKTtcclxuICAgICAgdGhpcy5fcmV0dXJuX3RpbWUgPSBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgPyBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgOiAnMTYwMCc7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICAvLyAhZGF0ZSBhbmQgdGltZSBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IGZvciBMVVxyXG4gIHByaXZhdGUgX291dGJvdW5kX2RhdGU6IE5nYkRhdGVTdHJ1Y3QgPSBudWxsO1xyXG5cclxuICBnZXQgb3V0Ym91bmRfZGF0ZSgpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRib3VuZF9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kX2RhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX291dGJvdW5kX2RhdGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZU91dGJvdW5kRGF0ZVRpbWUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX291dGJvdW5kX3RpbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IG91dGJvdW5kX3RpbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRib3VuZF90aW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kX3RpbWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fb3V0Ym91bmRfdGltZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fdXBkYXRlT3V0Ym91bmREYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmV0dXJuX2RhdGU6IE5nYkRhdGVTdHJ1Y3QgPSBudWxsO1xyXG5cclxuICBnZXQgcmV0dXJuX2RhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmV0dXJuX2RhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgcmV0dXJuX2RhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX3JldHVybl9kYXRlID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVSZXR1cm5EYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmV0dXJuX3RpbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IHJldHVybl90aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmV0dXJuX3RpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgcmV0dXJuX3RpbWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcmV0dXJuX3RpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcmV0dXJuQ3JpdGVyaWEoKTogSXJsU2VhcmNoQ3JpdGVyaWEge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5Dcml0ZXJpYTtcclxuICB9XHJcblxyXG4gIHNldCByZXR1cm5Dcml0ZXJpYShuZXdDcml0OiBJcmxTZWFyY2hDcml0ZXJpYSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnJldHVybkNyaXRlcmlhID0gbmV3Q3JpdDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIC8vIHNldCByYWlsQ2FyZHMobmV3UmFpbENhcmRzOiBzdHJpbmdbXSkge1xyXG4gIC8vICAgdGhpcy50ZW1wUGFyYW1zLnJhaWxDYXJkcyA9IG5ld1JhaWxDYXJkcztcclxuICAvLyAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBjYXJuZXRUaWNrZXQoKTogYm9vbGVhbiB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNhcm5ldFRpY2tldDtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBjYXJuZXRUaWNrZXQobmV3Q2FybmV0OiBib29sZWFuKSB7XHJcbiAgLy8gICB0aGlzLnRlbXBQYXJhbXMuY2FybmV0VGlja2V0ID0gbmV3Q2FybmV0O1xyXG4gIC8vICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGRpc2FibGVBdXRvRGlzY291bnRzKCk6IGJvb2xlYW4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kaXNhYmxlQXV0b0Rpc2NvdW50cztcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkaXNhYmxlQXV0b0Rpc2NvdW50cyhuZXdEaXM6IGJvb2xlYW4pIHtcclxuICAvLyAgIHRoaXMudGVtcFBhcmFtcy5kaXNhYmxlQXV0b0Rpc2NvdW50cyA9IG5ld0RpcztcclxuICAvLyAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBwcmlvcml0aXNlQnlQcmljZSgpOiBib29sZWFuIHtcclxuICAvLyAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMucHJpb3JpdGlzZUJ5UHJpY2U7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgcHJpb3JpdGlzZUJ5UHJpY2UobmV3UHJpb3JpdHk6IGJvb2xlYW4pIHtcclxuICAvLyAgIHRoaXMudGVtcFBhcmFtcy5wcmlvcml0aXNlQnlQcmljZSA9IG5ld1ByaW9yaXR5O1xyXG4gIC8vICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXQgdGltZUFycmF5KCk6IFZhbHVlRGlzcGxheVtdIHtcclxuICAgIHRoaXMuX3RpbWVBcnJheSA9XHJcbiAgICAgIHRoaXMuX3RpbWVBcnJheSB8fFxyXG4gICAgICBBcnJheSg0OClcclxuICAgICAgICAuZmlsbCgwKVxyXG4gICAgICAgIC5tYXAoKF8sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOlxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoaW5kZXggLyAyKVxyXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5wYWRTdGFydCgyLCAnMCcpICtcclxuICAgICAgICAgICAgICAoKGluZGV4ICUgMikgKiAzMCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxyXG4gICAgICAgICAgICBkaXNwbGF5OlxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoaW5kZXggLyAyKVxyXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIC5wYWRTdGFydCgyLCAnMCcpICtcclxuICAgICAgICAgICAgICAnOicgK1xyXG4gICAgICAgICAgICAgICgoaW5kZXggJSAyKSAqIDMwKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5fdGltZUFycmF5O1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2NoZWFwZXN0U3RhbmRhcmQ6IElybFRpY2tldE9wdGlvbiA9IG51bGw7XHJcbiAgZ2V0IGNoZWFwZXN0U3RhbmRhcmQoKTogSXJsVGlja2V0T3B0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVhcGVzdFN0YW5kYXJkO1xyXG4gIH1cclxuICBwcml2YXRlIF9jaGVhcGVzdEZpcnN0OiBJcmxUaWNrZXRPcHRpb24gPSBudWxsO1xyXG4gIGdldCBjaGVhcGVzdEZpcnN0KCk6IElybFRpY2tldE9wdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hlYXBlc3RGaXJzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lybENsYXNzOiBJcmxDbGFzcyA9IG51bGw7XHJcbiAgZ2V0IGlybENsYXNzKCk6IElybENsYXNzIHtcclxuICAgIHJldHVybiB0aGlzLl9pcmxDbGFzc1xyXG4gIH1cclxuXHJcbiAgc2V0IGlybENsYXNzKGRhdGE6IElybENsYXNzKSB7XHJcbiAgICB0aGlzLl9pcmxDbGFzcyA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9qb3VybmV5dHlwZTogSXJsSm91cm5leVR5cGUgPSBJcmxKb3VybmV5VHlwZS5TaW5nbGVKb3VybmV5O1xyXG4gIGdldCBqb3VybmV5VHlwZSgpOiBJcmxKb3VybmV5VHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fam91cm5leXR5cGVcclxuICB9XHJcblxyXG4gIHNldCBqb3VybmV5VHlwZShkYXRhOiBJcmxKb3VybmV5VHlwZSkge1xyXG4gICAgdGhpcy5fam91cm5leXR5cGUgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIElybGZldGNoZXI6IEJhc2VJcmxRdW90ZUZldGNoZXI8UT4sXHJcbiAgICBwcml2YXRlIHNlYXJjaElybFN0YXRpb25zRmV0Y2hlcjogQmFzZVNlYXJjaElybFN0YXRpb25zRmV0Y2hlcjxTSVNfUT4sXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBzdG9yYWdlU2VydmljZTogQmFzZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZVxyXG4gICkge1xyXG4gICAgc3VwZXIoc3RvcmFnZVNlcnZpY2UpO1xyXG5cclxuICAgIGNvbnN0IGRhdGE6IHtcclxuICAgICAgcXVlcnk6IHt9O1xyXG4gICAgICB0ZW1wUGFyYW1zOiBJcmxUZW1wUGFyYW1zO1xyXG4gICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IElybFRlbXBQYXJhbXM7XHJcbiAgICB9ID0gc3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIElSTEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNU1xyXG4gICAgKSB8fCB7XHJcbiAgICAgICAgcXVlcnk6IHt9LFxyXG4gICAgICAgIHRlbXBQYXJhbXM6IHt9IGFzIElybFRlbXBQYXJhbXMsXHJcbiAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB7fSBhcyBJcmxUZW1wUGFyYW1zXHJcbiAgICAgIH07XHJcblxyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlSXJsUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcbiAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBkYXRhLm9yaWdpbmFsVXNlclNlYXJjaDtcclxuXHJcbiAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKSkge1xyXG4gICAgICBzZWFyY2hTZXJ2aWNlLnRyYXZlbGxlckluZm9ybWF0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAodHJhdmVsbGVyczogVHJhdmVsbGVyW10pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICBpZiAodGhpcy50cmF2ZWxsZXJzWzBdICYmICF0aGlzLnRyYXZlbGxlcnNbMF0uYWdlVHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYXZlbGxlcnNbMF0uYWdlVHlwZSA9IGFnZXMuQWR1bHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgPSBzcGxpdFRyYXZlbGxlcnMuYWR1bHRzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbiA9IHNwbGl0VHJhdmVsbGVycy5jaGlsZHJlbi5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxJcmxRdW90ZVJlc3VsdEFycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG4gICAgLy8gaWYgKHJlc3VsdHMgPT0gbnVsbCAmJiB0aGlzLmlzVmFsaWQpIHtcclxuICAgIC8vICAgc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLl9jaGVhcGVzdFJlc3VsdFByaWNlID0gdGhpcy51cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMgfHwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0UXVlcnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VJcmxRdWVyeSgpKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmFsaWQoKSB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXMsXHJcbiAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgY29uc3Qgbm93ID0gbW9tZW50KCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl90cmF2ZWxsaW5nRnJvbSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgRW50ZXIgYSBGcm9tIExvY2F0aW9uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fdHJhdmVsbGluZ1RvKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBFbnRlciBhIFRvIExvY2F0aW9uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm91dEJvdW5kRGF0ZVRpbWU/LmlzQmVmb3JlKG5vdykpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAnRGVwYXJ0dXJlIERhdGUvVGltZSBjYW5ub3QgYmUgaW4gdGhlIHBhc3QuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIChcclxuICAgIC8vICAgdGhpcy5jaG9zZW5TZWFyY2hUeXBlID09PSBJcmxKb3VybmV5VHlwZS5SZXR1cm5Kb3VybmV5XHJcbiAgICAvLyApIHtcclxuICAgIC8vICAgLy8gY2hlY2sgZm9yIHJldHVybiBzcGVjaWZpYyB2YWxpZGF0aW9ucyBpbiBoZXJlXHJcblxyXG4gICAgLy8gICBpZiAodGhpcy5pbkJvdW5kRGF0ZVRpbWU/LmlzU2FtZU9yQmVmb3JlKHRoaXMub3V0Qm91bmREYXRlVGltZSkpIHtcclxuICAgIC8vICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgLy8gICAgICAgJ1JldHVybiBEYXRlL1RpbWUgbXVzdCBiZSBhZnRlciBEZXBhcnR1cmUgRGF0ZS9UaW1lJ1xyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy52aWEpIHtcclxuICAgIC8vICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMudmlhTG9jYXRpb24pIHtcclxuICAgIC8vICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgZW50ZXIgYSB2aWEgbG9jYXRpb24uJyk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAodGhpcy50ZW1wUGFyYW1zLmFkdWx0cyArIHRoaXMudGVtcFBhcmFtcy5jaGlsZHJlbiA8IDEpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAxIHRyYXZlbGxlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNWYWxpZC5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB0aGlzLm1lc3NhZ2VzLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2goKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChbXSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbFVzZXJTZWFyY2ggPSBPYmplY3QuZnJlZXplKHsgLi4udGhpcy50ZW1wUGFyYW1zIH0pO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICAgIElSTEVudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXMsXHJcbiAgICAgICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy5JcmxmZXRjaGVyLmZldGNoTGlzdCh0aGlzLmdldFNlYXJjaFF1ZXJ5KCkpLnBpcGUoXHJcbiAgICAgICAgICBtYXAocmVzdWx0ID0+IHJlc3VsdClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydFJlY2VudFNlYXJjaChyZWNlbnRTZWFyY2g6IFJlY2VudFNlYXJjaCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGFydFNlYXJjaCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlT3V0Ym91bmREYXRlVGltZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9vdXRib3VuZF9kYXRlICYmIHRoaXMuX291dGJvdW5kX3RpbWUpIHtcclxuICAgICAgY29uc3QgdGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9vdXRib3VuZF9kYXRlLFxyXG4gICAgICAgIHRoaXMuX291dGJvdW5kX3RpbWVcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZSA9IHRpbWUuaXNWYWxpZCgpID8gdGltZSA6IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JldHVybl9kYXRlICYmIHRoaXMuX3JldHVybl90aW1lKSB7XHJcbiAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX2RhdGUsXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX3RpbWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5pbkJvdW5kRGF0ZVRpbWUgPSB0aW1lLmlzVmFsaWQoKSA/IHRpbWUgOiBudWxsO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeSgpOiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICAvLyB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgdGhpcy5ub09mQWR1bHRzID0gdGhpcy50cmF2ZWxsZXJzLmZpbHRlcigodHJhdmVsbGVyOiBUcmF2ZWxsZXIpPT5cclxuICAgIHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLkFkdWx0IHx8IHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLllvdXRoIHx8IHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLlNlbmlvcikubGVuZ3RoO1xyXG4gICAgdGhpcy5ub09mQ2hpbGRyZW4gPSB0aGlzLnRyYXZlbGxlcnMuZmlsdGVyKCh0cmF2ZWxsZXI6IFRyYXZlbGxlcik9PlxyXG4gICAgdHJhdmVsbGVyLmFnZVR5cGUgPT09IGFnZXMuQ2hpbGQpLmxlbmd0aDtcclxuICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyA9IHtcclxuICAgICAgc3VwcGxpZXI6IHRoaXMuc3VwcGxpZXIsIC8vIElSTFN1cHBsaWVyIVxyXG4gICAgICBjb3VudHJ5Q29kZTogJ0dCJyxcclxuICAgICAgLy8gam91cm5leVR5cGU6IHRoaXMuam91cm5leVR5cGUsIC8vIElSTEpvdXJuZXlUeXBlIVxyXG4gICAgICBjbGFzczogdGhpcy5pcmxDbGFzcywgLy8gSVJMQ2xhc3NcclxuICAgICAgb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTogdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcbiAgICAgIGRlcGFydHVyZUxvY2F0aW9uSWQ6IHRoaXMuX3RyYXZlbGxpbmdGcm9tLFxyXG4gICAgICBhcnJpdmFsTG9jYXRpb25JZDogdGhpcy5fdHJhdmVsbGluZ1RvLFxyXG4gICAgICBhZHVsdHM6IHRoaXMudGVtcFBhcmFtcy5hZHVsdHMsXHJcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4sXHJcbiAgICAgIHJldHVybkRlcGFydHVyZURhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcblxyXG4gICAgICBqb3VybmV5VHlwZTogdGhpcy5qb3VybmV5VHlwZSxcclxuICAgICAgLy8gY2xhc3M6IHRoaXMudGVtcFBhcmFtcy5jaG9zZW5TZWFyY2hDbGFzcyxcclxuICAgICAgLy8gZXh0cmFUaW1lVG9DaGFuZ2U6IHRoaXMudGVtcFBhcmFtcy5leHRyYVRpbWUsXHJcbiAgICAgIC8vIG91dGJvdW5kQXJyaXZhbERhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMub3V0Qm91bmREYXRlVGltZSxcclxuICAgICAgLy8gcmV0dXJuQXJyaXZhbERhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMuaW5Cb3VuZERhdGVUaW1lLFxyXG4gICAgICAvLyB2aWFMb2NhdGlvbkNvZGU6IHRoaXMudGVtcFBhcmFtcy52aWFMb2NhdGlvblxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID09PSAwKSB7XHJcbiAgICAgIHF1ZXJ5LmNoaWxkcmVuID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzd2l0Y2ggKHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZENyaXRlcmlhKSB7XHJcbiAgICAvLyAgIGNhc2UgSXJsU2VhcmNoQ3JpdGVyaWEuRGVwYXJ0OlxyXG4gICAgLy8gICAgIHF1ZXJ5Lm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBudWxsO1xyXG4gICAgLy8gICAgIGJyZWFrO1xyXG4gICAgLy8gICBjYXNlIElybFNlYXJjaENyaXRlcmlhLkFycml2ZTpcclxuICAgIC8vICAgICBxdWVyeS5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lID0gbnVsbDtcclxuICAgIC8vICAgICBicmVhaztcclxuICAgIC8vICAgZGVmYXVsdDpcclxuICAgIC8vICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAvLyAgICAgICBgKysrIFVua25vd24gQ3JpdGVyaWE6ICR7dGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kQ3JpdGVyaWF9ICsrK2BcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHN3aXRjaCAodGhpcy50ZW1wUGFyYW1zLnJldHVybkNyaXRlcmlhKSB7XHJcbiAgICAvLyAgIGNhc2UgSXJsU2VhcmNoQ3JpdGVyaWEuRGVwYXJ0OlxyXG4gICAgLy8gICAgIHF1ZXJ5LnJldHVybkRlcGFydHVyZURhdGVUaW1lID0gbnVsbDtcclxuICAgIC8vICAgICBicmVhaztcclxuICAgIC8vICAgY2FzZSBJcmxTZWFyY2hDcml0ZXJpYS5BcnJpdmU6XHJcbiAgICAvLyAgICAgcXVlcnkucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBudWxsO1xyXG4gICAgLy8gICAgIGJyZWFrO1xyXG4gICAgLy8gICBkZWZhdWx0OlxyXG4gICAgLy8gICAgIGNvbnNvbGUud2FybihcclxuICAgIC8vICAgICAgIGArKysgVW5rbm93biBDcml0ZXJpYTogJHt0aGlzLnRlbXBQYXJhbXMucmV0dXJuQ3JpdGVyaWF9ICsrK2BcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy50ZW1wUGFyYW1zLmpvdXJuZXlUeXBlKSB7XHJcbiAgICAgIGNhc2UgSXJsSm91cm5leVR5cGUuU2luZ2xlSm91cm5leTpcclxuICAgICAgICBxdWVyeS5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZSA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzPFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzPihxdWVyeSk7XHJcbiAgfVxyXG5cclxuICAvLyBjcmVhdGVUaWNrZXRHcm91cHMocmVzdWx0czogSVJMSm91cm5leU9wdGlvbnNbXSk6IFJhaWxUaWNrZXRHcm91cHMge1xyXG4gIC8vICAgbGV0IHRpY2tldHM6IFJhaWxUaWNrZXRHcm91cHMgPSB7fTtcclxuICAvLyAgIGxldCB0aWNrZXRJZCA9ICcnO1xyXG4gIC8vICAgdGhpcy5fY2FuQ29tYmluZSA9IHt9O1xyXG5cclxuICAvLyAgIGxldCB0aWNrZXRHcm91cHNPdXRib3VuZCA9IHRoaXMuc2V0VGlja2V0c0dyb3VwcyhyZXN1bHRzWzBdLm91dGJvdW5kKTtcclxuICAvLyAgIGxldCB0aWNrZXRHcm91cHNSZXR1cm4gPSB0aGlzLnNldFRpY2tldHNHcm91cHMocmVzdWx0c1swXS5yZXR1cm4pO1xyXG4gIC8vICAgdGlja2V0R3JvdXBzT3V0Ym91bmQgPSB0aGlzLnNvcnRUaWNrZXRQcmljZXModGlja2V0R3JvdXBzT3V0Ym91bmQpO1xyXG4gIC8vICAgdGlja2V0R3JvdXBzUmV0dXJuID0gdGhpcy5zb3J0VGlja2V0UHJpY2VzKHRpY2tldEdyb3Vwc1JldHVybik7XHJcblxyXG4gIC8vICAgT2JqZWN0LmtleXModGlja2V0R3JvdXBzT3V0Ym91bmQpLm1hcCgoa2V5KSA9PiB7XHJcbiAgLy8gICAgIHRpY2tldEdyb3Vwc091dGJvdW5kW2tleV0ubWFwKCh0a3Q6IFJhaWxUaWNrZXRPcHRpb24pID0+IHtcclxuICAvLyAgICAgICB0aWNrZXRJZCA9IGAke3RrdC50eXBlfSR7dGt0LnNpbmdsZU9yUmV0dXJufWA7XHJcbiAgLy8gICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRrdC5pZGVudGlmaWVycy5qb3VybmV5SWRlbnRpZmllcjtcclxuICAvLyAgICAgICBjb25zdCBpZGVudGlmaWVyT2JqOiBSYWlsUmVzdWx0SW5kaWZpZXJzID0ge307XHJcbiAgLy8gICAgICAgaWRlbnRpZmllck9ialtpZGVudGlmaWVyXSA9IHtcclxuICAvLyAgICAgICAgIHByaWNlOiB0a3QucHJpY2UsXHJcbiAgLy8gICAgICAgICBpc0NoaWxkOiBmYWxzZSxcclxuICAvLyAgICAgICAgIGZhcmVJZGVudGlmaWVyOiB0a3QuaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICAgIGlmICh0aWNrZXRzW2tleV0pIHtcclxuICAvLyAgICAgICAgIHRoaXMudXBkYXRlQ2FuQ29tYmluZSh0a3QpO1xyXG4gIC8vICAgICAgICAgaWRlbnRpZmllck9ialt0a3QuaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJdLmlzQ2hpbGQgPSBmYWxzZTtcclxuICAvLyAgICAgICAgIGlmICh0aWNrZXRzW3RrdC50eXBlXS5oZWFkZXIucHJpY2UgPT09IHRrdC5wcmljZSkge1xyXG4gIC8vICAgICAgICAgICB0aWNrZXRzW3RrdC50eXBlXS5yZXN1bHRJbmRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcclxuICAvLyAgICAgICAgICAgdGlja2V0c1t0a3QudHlwZV0ucmVzdWx0SW5kaWZpZXJzUHJpY2VzID0ge1xyXG4gIC8vICAgICAgICAgICAgIC4uLnRpY2tldHNbdGt0LnR5cGVdLnJlc3VsdEluZGlmaWVyc1ByaWNlcyxcclxuICAvLyAgICAgICAgICAgICAuLi5pZGVudGlmaWVyT2JqXHJcbiAgLy8gICAgICAgICAgIH07XHJcbiAgLy8gICAgICAgICB9IGVsc2UgaWYgKHRrdC5wcmljZSkge1xyXG4gIC8vICAgICAgICAgICBpZGVudGlmaWVyT2JqW2lkZW50aWZpZXJdLmlzQ2hpbGQgPSB0cnVlO1xyXG4gIC8vICAgICAgICAgICBjb25zdCBjaGlsZFRpY2tldCA9IHtcclxuICAvLyAgICAgICAgICAgICBoZWFkZXI6IHRrdCxcclxuICAvLyAgICAgICAgICAgICBjaGlsZHJlbjogW10sXHJcbiAgLy8gICAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgICAgZGlyZWN0aW9uOiBSYWlsRGlyZWN0aW9uLk91dGJvdW5kLFxyXG4gIC8vICAgICAgICAgICAgIHJlc3VsdEluZGlmaWVyczogW2lkZW50aWZpZXJdLFxyXG4gIC8vICAgICAgICAgICAgIHJlc3VsdEluZGlmaWVyc1ByaWNlczogaWRlbnRpZmllck9iaixcclxuICAvLyAgICAgICAgICAgICBjaGlsZDogdHJ1ZSxcclxuICAvLyAgICAgICAgICAgICB0aWNrZXRJZCxcclxuICAvLyAgICAgICAgICAgICBzZWxlY3RlZEluZGljaWVzOiBbXSxcclxuICAvLyAgICAgICAgICAgICBkaXNhYmxlZEluZGljaWVzOiBbXVxyXG4gIC8vICAgICAgICAgICB9IGFzIFJhaWxUaWNrZXRHcm91cDtcclxuICAvLyAgICAgICAgICAgdGlja2V0c1t0a3QudHlwZV0uY2hpbGRyZW4ucHVzaChjaGlsZFRpY2tldCk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHRoaXMuX2NhbkNvbWJpbmVbdGt0LnR5cGVdID0ge307XHJcbiAgLy8gICAgICAgICB0aGlzLnVwZGF0ZUNhbkNvbWJpbmUodGt0KTtcclxuICAvLyAgICAgICAgIHRpY2tldHNbdGt0LnR5cGVdID0ge1xyXG4gIC8vICAgICAgICAgICBoZWFkZXI6IHRrdCxcclxuICAvLyAgICAgICAgICAgY2hpbGRyZW46IFtdLFxyXG4gIC8vICAgICAgICAgICBvcGVuOiBmYWxzZSxcclxuICAvLyAgICAgICAgICAgZGlyZWN0aW9uOiBSYWlsRGlyZWN0aW9uLk91dGJvdW5kLFxyXG4gIC8vICAgICAgICAgICByZXN1bHRJbmRpZmllcnM6IFtpZGVudGlmaWVyXSxcclxuICAvLyAgICAgICAgICAgcmVzdWx0SW5kaWZpZXJzUHJpY2VzOiBpZGVudGlmaWVyT2JqLFxyXG4gIC8vICAgICAgICAgICBjaGlsZDogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIHRpY2tldElkLFxyXG4gIC8vICAgICAgICAgICBzZWxlY3RlZEluZGljaWVzOiBbXSxcclxuICAvLyAgICAgICAgICAgZGlzYWJsZWRJbmRpY2llczogW11cclxuICAvLyAgICAgICAgIH0gYXMgUmFpbFRpY2tldEdyb3VwO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9KTtcclxuXHJcbiAgLy8gICBPYmplY3Qua2V5cyh0aWNrZXRHcm91cHNSZXR1cm4pLm1hcCgoa2V5KSA9PiB7XHJcbiAgLy8gICAgIHRpY2tldEdyb3Vwc1JldHVybltrZXldLm1hcCgodGt0OiBSYWlsVGlja2V0T3B0aW9uKSA9PiB7XHJcbiAgLy8gICAgICAgdGlja2V0SWQgPSBgJHt0a3QudHlwZX0ke3RrdC5zaW5nbGVPclJldHVybn1gO1xyXG4gIC8vICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0a3QuaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXI7XHJcbiAgLy8gICAgICAgY29uc3QgaWRlbnRpZmllck9iajogUmFpbFJlc3VsdEluZGlmaWVycyA9IHt9O1xyXG4gIC8vICAgICAgIGlkZW50aWZpZXJPYmpbaWRlbnRpZmllcl0gPSB7XHJcbiAgLy8gICAgICAgICBwcmljZTogdGt0LnByaWNlLFxyXG4gIC8vICAgICAgICAgaXNDaGlsZDogdHJ1ZSxcclxuICAvLyAgICAgICAgIGZhcmVJZGVudGlmaWVyOiB0a3QuaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIHRpY2tldHNbdGt0LnR5cGVdICYmXHJcbiAgLy8gICAgICAgICB0a3QucHJpY2UgJiZcclxuICAvLyAgICAgICAgIHRrdC5wcmljZSAhPT0gdGlja2V0c1t0a3QudHlwZV0uaGVhZGVyLnByaWNlXHJcbiAgLy8gICAgICAgKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLnVwZGF0ZUNhbkNvbWJpbmUodGt0KTtcclxuICAvLyAgICAgICAgIGlkZW50aWZpZXJPYmpbaWRlbnRpZmllcl0uaXNDaGlsZCA9IHRydWU7XHJcbiAgLy8gICAgICAgICBjb25zdCBjaGlsZFRpY2tldCA9IHtcclxuICAvLyAgICAgICAgICAgaGVhZGVyOiB0a3QsXHJcbiAgLy8gICAgICAgICAgIGNoaWxkcmVuOiBbXSxcclxuICAvLyAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIGRpcmVjdGlvbjogUmFpbERpcmVjdGlvbi5JbmJvdW5kLFxyXG4gIC8vICAgICAgICAgICByZXN1bHRJbmRpZmllcnM6IFtpZGVudGlmaWVyXSxcclxuICAvLyAgICAgICAgICAgcmVzdWx0SW5kaWZpZXJzUHJpY2VzOiBpZGVudGlmaWVyT2JqLFxyXG4gIC8vICAgICAgICAgICBjaGlsZDogdHJ1ZSxcclxuICAvLyAgICAgICAgICAgdGlja2V0SWQsXHJcbiAgLy8gICAgICAgICAgIHNlbGVjdGVkSW5kaWNpZXM6IFtdLFxyXG4gIC8vICAgICAgICAgICBkaXNhYmxlZEluZGljaWVzOiBbXVxyXG4gIC8vICAgICAgICAgfSBhcyBhbnk7XHJcbiAgLy8gICAgICAgICB0aWNrZXRzW3RrdC50eXBlXS5jaGlsZHJlbi5wdXNoKGNoaWxkVGlja2V0KTtcclxuICAvLyAgICAgICB9IGVsc2UgaWYgKCF0aWNrZXRzW3RrdC50eXBlXSkge1xyXG4gIC8vICAgICAgICAgdGhpcy51cGRhdGVDYW5Db21iaW5lKHRrdCk7XHJcbiAgLy8gICAgICAgICB0aWNrZXRzW3RrdC50eXBlXSA9IHtcclxuICAvLyAgICAgICAgICAgaGVhZGVyOiB0a3QsXHJcbiAgLy8gICAgICAgICAgIGNoaWxkcmVuOiBbXSxcclxuICAvLyAgICAgICAgICAgb3BlbjogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIGRpcmVjdGlvbjogUmFpbERpcmVjdGlvbi5JbmJvdW5kLFxyXG4gIC8vICAgICAgICAgICByZXN1bHRJbmRpZmllcnM6IFtpZGVudGlmaWVyXSxcclxuICAvLyAgICAgICAgICAgcmVzdWx0SW5kaWZpZXJzUHJpY2VzOiBpZGVudGlmaWVyT2JqLFxyXG4gIC8vICAgICAgICAgICBjaGlsZDogZmFsc2UsXHJcbiAgLy8gICAgICAgICAgIHRpY2tldElkLFxyXG4gIC8vICAgICAgICAgICBzZWxlY3RlZEluZGljaWVzOiBbXSxcclxuICAvLyAgICAgICAgICAgZGlzYWJsZWRJbmRpY2llczogW11cclxuICAvLyAgICAgICAgIH0gYXMgYW55O1xyXG4gIC8vICAgICAgIH0gZWxzZSBpZiAoIXRrdC5wcmljZSB8fCB0a3QucHJpY2UgPT09IHRpY2tldHNbdGt0LnR5cGVdLmhlYWRlci5wcmljZSkge1xyXG4gIC8vICAgICAgICAgdGhpcy51cGRhdGVDYW5Db21iaW5lKHRrdCk7XHJcbiAgLy8gICAgICAgICB0aWNrZXRzW3RrdC50eXBlXS5yZXN1bHRJbmRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcclxuICAvLyAgICAgICAgIGlkZW50aWZpZXJPYmpbaWRlbnRpZmllcl0uaXNDaGlsZCA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgdGlja2V0c1t0a3QudHlwZV0ucmVzdWx0SW5kaWZpZXJzUHJpY2VzID0ge1xyXG4gIC8vICAgICAgICAgICAuLi50aWNrZXRzW3RrdC50eXBlXS5yZXN1bHRJbmRpZmllcnNQcmljZXMsXHJcbiAgLy8gICAgICAgICAgIC4uLmlkZW50aWZpZXJPYmpcclxuICAvLyAgICAgICAgIH07XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIGxldCBjb21iaW5lVGlja2V0cyA9IHsgLi4udGlja2V0cyB9O1xyXG4gIC8vICAgdGlja2V0cyA9IHRoaXMuY29tYmluZUNoaWxkVGlja2V0cyhjb21iaW5lVGlja2V0cyk7XHJcblxyXG4gIC8vICAgLy8gY29uc29sZS5sb2coJ2dyb3VwczogJywgdGlja2V0cyk7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZygnQ2FuIENvbWJpbmU6ICcsIHRoaXMuX2NhbkNvbWJpbmUpO1xyXG4gIC8vICAgcmV0dXJuIHRpY2tldHM7XHJcbiAgLy8gfVxyXG5cclxuICBjb21iaW5lQ2hpbGRUaWNrZXRzKHRpY2tldHM6IFJhaWxUaWNrZXRHcm91cHMpOiBSYWlsVGlja2V0R3JvdXBzIHtcclxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXModGlja2V0cyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjaGlsZE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBSYWlsVGlja2V0R3JvdXAgfSA9IHt9O1xyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXNbaV0uY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IHZhbHVlc1tpXS5jaGlsZHJlbltqXTtcclxuICAgICAgICBjb25zdCBmYXJlSWRlbnRpZmllciA9IGNoaWxkLmhlYWRlci5pZGVudGlmaWVycy5mYXJlSWRlbnRpZmllcjtcclxuICAgICAgICBpZiAoY2hpbGRPYmplY3RbZmFyZUlkZW50aWZpZXJdKSB7XHJcbiAgICAgICAgICBjaGlsZE9iamVjdFtmYXJlSWRlbnRpZmllcl0ucmVzdWx0SW5kaWZpZXJzLnB1c2goXHJcbiAgICAgICAgICAgIGNoaWxkLnJlc3VsdEluZGlmaWVyc1swXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNoaWxkT2JqZWN0W2ZhcmVJZGVudGlmaWVyXS5yZXN1bHRJbmRpZmllcnNQcmljZXMgPSB7XHJcbiAgICAgICAgICAgIC4uLmNoaWxkT2JqZWN0W2ZhcmVJZGVudGlmaWVyXS5yZXN1bHRJbmRpZmllcnNQcmljZXMsXHJcbiAgICAgICAgICAgIC4uLmNoaWxkLnJlc3VsdEluZGlmaWVyc1ByaWNlc1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2hpbGRPYmplY3RbZmFyZUlkZW50aWZpZXJdID0gY2hpbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGNoaWxkT2JqZWN0KTtcclxuICAgICAgLy8gY29uc29sZS5sb2codmFsdWVzW2ldWydoZWFkZXInXVsndHlwZSddKTtcclxuICAgICAgdGlja2V0c1t2YWx1ZXNbaV0uaGVhZGVyLnR5cGVdLmNoaWxkcmVuID0gT2JqZWN0LnZhbHVlcyhjaGlsZE9iamVjdCk7XHJcbiAgICB9XHJcbiAgICAvLyB0aWNrZXRzID0gdGhpcy5zb3J0VGlja2V0Q2hpbGRyZW5QcmljZXModGlja2V0cyk7XHJcbiAgICByZXR1cm4gdGlja2V0cztcclxuICB9XHJcbiAgc2V0VGlja2V0c0dyb3VwcyhyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uW10pOiBhbnkge1xyXG4gICAgbGV0IHRpY2tldEdyb3VwczogYW55ID0ge307XHJcbiAgICByZXN1bHRzLmZvckVhY2goKG91dDogSXJsSm91cm5leU9wdGlvbikgPT4ge1xyXG4gICAgICBvdXQucHJvdmlkZXJzLmZvckVhY2goKHByb3Y6IElybFByb3ZpZGVyKSA9PiB7XHJcbiAgICAgICAgcHJvdi50aWNrZXRPcHRpb25zLmZvckVhY2goKHRrdDogSXJsVGlja2V0T3B0aW9uKSA9PiB7XHJcbiAgICAgICAgICB0aWNrZXRHcm91cHNbdGt0LnR5cGVdXHJcbiAgICAgICAgICAgID8gdGlja2V0R3JvdXBzW3RrdC50eXBlXS5wdXNoKHRrdClcclxuICAgICAgICAgICAgOiAodGlja2V0R3JvdXBzW3RrdC50eXBlXSA9IFt0a3RdKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aWNrZXRHcm91cHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHsgfVxyXG5cclxuICB1cGRhdGVDYW5Db21iaW5lKHRrdDogSXJsVGlja2V0T3B0aW9uKTogdm9pZCB7XHJcbiAgICAodGt0LmlkZW50aWZpZXJzLmFsbG93ZWRXaXRoIHx8IFtdKS5mb3JFYWNoKChhbGxvd2VkKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5fY2FuQ29tYmluZVt0a3QudHlwZV1bYWxsb3dlZC5qb3VybmV5SWRlbnRpZmllcl0pIHtcclxuICAgICAgICB0aGlzLl9jYW5Db21iaW5lW3RrdC50eXBlXVthbGxvd2VkLmpvdXJuZXlJZGVudGlmaWVyXSA9IFtcclxuICAgICAgICAgIGFsbG93ZWQuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICBdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2NhbkNvbWJpbmVbdGt0LnR5cGVdW2FsbG93ZWQuam91cm5leUlkZW50aWZpZXJdLnB1c2goXHJcbiAgICAgICAgICBhbGxvd2VkLmZhcmVJZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyB0b2dnbGVUaWNrZXRTZWxlY3QoXHJcbiAgLy8gICB0aWNrZXQ6IElybFRpY2tldEdyb3VwLFxyXG4gIC8vICAgd2F5OiAnZGVwYXJ0cycgfCAncmV0dXJucycsXHJcbiAgLy8gICB0aW1lU2xvdElkOiBzdHJpbmcsXHJcbiAgLy8gICB0aWNrZXRJZDogc3RyaW5nLFxyXG4gIC8vICAgZmFyZUlkZW50aWZpZXI6IHN0cmluZyxcclxuICAvLyAgIHRpY2tldHNHcm91cHM6IElybFRpY2tldEdyb3Vwc1xyXG4gIC8vICk6IElybFRpY2tldEdyb3VwcyB7XHJcbiAgLy8gICBpZiAoIXRpY2tldCkge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGlja2V0c0dyb3Vwcyk7XHJcbiAgLy8gICBsZXQgc2VsZWN0ZWRUaWNrZXQgPSBudWxsO1xyXG4gIC8vICAgbGV0IGRlcGFydHNUaWNrZXQ6IElybFRpY2tldE9wdGlvbltdID0gW107XHJcbiAgLy8gICBsZXQgcmV0dXJuVGlja2V0OiBJcmxUaWNrZXRPcHRpb25bXSA9IFtdO1xyXG4gIC8vICAgbGV0IGlzVW5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gIC8vICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAvLyAgICAgbGV0IGdyb3VwID0gdGlja2V0c0dyb3Vwc1trZXldIGFzIFJhaWxUaWNrZXRHcm91cDtcclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICBncm91cC50aWNrZXRJZCA9PT0gdGlja2V0SWQgJiZcclxuICAvLyAgICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzLmluY2x1ZGVzKHRpbWVTbG90SWQpXHJcbiAgLy8gICAgICkge1xyXG4gIC8vICAgICAgIGlmICh3YXkgPT09ICdkZXBhcnRzJykge1xyXG4gIC8vICAgICAgICAgZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcyA9IFtdO1xyXG4gIC8vICAgICAgICAgZGVwYXJ0c1RpY2tldCA9IFtdO1xyXG4gIC8vICAgICAgICAgcmV0dXJuVGlja2V0ID0gW107XHJcbiAgLy8gICAgICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0ID0gbnVsbDtcclxuICAvLyAgICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbDtcclxuICAvLyAgICAgICAgIGdyb3VwLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNoaWxkLnNlbGVjdGVkSW5kaWNpZXMgPSBbXTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzID0gZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcy5maWx0ZXIoXHJcbiAgLy8gICAgICAgICAgIChJbmRpY2llcykgPT4gSW5kaWNpZXMgIT09IHRpbWVTbG90SWRcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICByZXR1cm5UaWNrZXQgPSByZXR1cm5UaWNrZXQuZmlsdGVyKFxyXG4gIC8vICAgICAgICAgICAoSW5kaWNpZXMpID0+IEluZGljaWVzICE9PSBncm91cC5oZWFkZXJcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIGdyb3VwLnRpY2tldElkID09PSB0aWNrZXRJZCAmJlxyXG4gIC8vICAgICAgICAgZ3JvdXAuaGVhZGVyLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyID09PSBmYXJlSWRlbnRpZmllciAmJlxyXG4gIC8vICAgICAgICAgd2F5ID09PSAnZGVwYXJ0cydcclxuICAvLyAgICAgICApIHtcclxuICAvLyAgICAgICAgIGdyb3VwID0gdGhpcy5jbGVhclVubmVlZGVkVGlja2V0cyh3YXksIGdyb3VwLCB0aW1lU2xvdElkKTtcclxuICAvLyAgICAgICAgIGdyb3VwLnNlbGVjdGVkSW5kaWNpZXMucHVzaCh0aW1lU2xvdElkKTtcclxuICAvLyAgICAgICAgIHdheSA9PT0gJ2RlcGFydHMnXHJcbiAgLy8gICAgICAgICAgID8gZGVwYXJ0c1RpY2tldC5wdXNoKGdyb3VwLmhlYWRlcilcclxuICAvLyAgICAgICAgICAgOiByZXR1cm5UaWNrZXQucHVzaChncm91cC5oZWFkZXIpO1xyXG4gIC8vICAgICAgICAgc2VsZWN0ZWRUaWNrZXQgPSBncm91cC5oZWFkZXI7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIC8vIG1heSBoYXZlIHRvIG1vZGlmeSB0aGlzIGZvciBkdWFsIHNpbmdsZXNcclxuICAvLyAgICAgICAgIGlmICh3YXkgPT09ICdkZXBhcnRzJykge1xyXG4gIC8vICAgICAgICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzID0gW107XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICBzZWxlY3RlZFRpY2tldCA9IGdyb3VwLmhlYWRlcjtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGdyb3VwLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoY2hpbGQuc2VsZWN0ZWRJbmRpY2llcy5pbmNsdWRlcyh0aW1lU2xvdElkKSkge1xyXG4gIC8vICAgICAgICAgICBpZiAod2F5ID09PSAnZGVwYXJ0cycpIHtcclxuICAvLyAgICAgICAgICAgICBjaGlsZC5zZWxlY3RlZEluZGljaWVzID0gW107XHJcbiAgLy8gICAgICAgICAgICAgZGVwYXJ0c1RpY2tldCA9IFtdO1xyXG4gIC8vICAgICAgICAgICAgIHJldHVyblRpY2tldCA9IFtdO1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRUaWNrZXQgPSBudWxsO1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbDtcclxuICAvLyAgICAgICAgICAgICBpc1Vuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIGNoaWxkLnNlbGVjdGVkSW5kaWNpZXMgPSBjaGlsZC5zZWxlY3RlZEluZGljaWVzLmZpbHRlcihcclxuICAvLyAgICAgICAgICAgICAgIChJbmRpY2llcykgPT4gSW5kaWNpZXMgIT09IHRpbWVTbG90SWRcclxuICAvLyAgICAgICAgICAgICApO1xyXG4gIC8vICAgICAgICAgICAgIHJldHVyblRpY2tldCA9IHJldHVyblRpY2tldC5maWx0ZXIoXHJcbiAgLy8gICAgICAgICAgICAgICAoSW5kaWNpZXMpID0+IEluZGljaWVzICE9PSBncm91cC5oZWFkZXJcclxuICAvLyAgICAgICAgICAgICApO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAgICAgY2hpbGQudGlja2V0SWQgPT09IHRpY2tldElkICYmXHJcbiAgLy8gICAgICAgICAgICAgY2hpbGQuaGVhZGVyLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyID09PSBmYXJlSWRlbnRpZmllclxyXG4gIC8vICAgICAgICAgICApIHtcclxuICAvLyAgICAgICAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAgICAgICAod2F5ID09PSAnZGVwYXJ0cycgJiZcclxuICAvLyAgICAgICAgICAgICAgICAgY2hpbGQuZGlyZWN0aW9uICE9PSBSYWlsRGlyZWN0aW9uLkluYm91bmQpIHx8XHJcbiAgLy8gICAgICAgICAgICAgICAod2F5ICE9PSAnZGVwYXJ0cycgJiYgY2hpbGQuZGlyZWN0aW9uID09PSBSYWlsRGlyZWN0aW9uLkluYm91bmQpXHJcbiAgLy8gICAgICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2xlYXJVbm5lZWRlZFRpY2tldHMod2F5LCBjaGlsZCwgdGltZVNsb3RJZCk7XHJcbiAgLy8gICAgICAgICAgICAgICBjaGlsZC5zZWxlY3RlZEluZGljaWVzLnB1c2godGltZVNsb3RJZCk7XHJcbiAgLy8gICAgICAgICAgICAgICB3YXkgPT09ICdkZXBhcnRzJ1xyXG4gIC8vICAgICAgICAgICAgICAgICA/IGRlcGFydHNUaWNrZXQucHVzaChjaGlsZC5oZWFkZXIpXHJcbiAgLy8gICAgICAgICAgICAgICAgIDogcmV0dXJuVGlja2V0LnB1c2goY2hpbGQuaGVhZGVyKTtcclxuICAvLyAgICAgICAgICAgICAgIHNlbGVjdGVkVGlja2V0ID0gY2hpbGQuaGVhZGVyO1xyXG4gIC8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNVbnNlbGVjdGVkKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjaGlsZC5zZWxlY3RlZEluZGljaWVzID0gW107XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIGNoaWxkLnNlbGVjdGVkSW5kaWNpZXMgPSBbXTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuXHJcbiAgLy8gICAvLyBub3cgd2UgbmVlZCB0byBtYXJrIHRpY2tldHMgYXMgZGlzYWJsZWQgaWYgdGhleSBhcmUgcmV0dXJucyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgc2VsZWN0ZWQgcmV0dXJuXHJcbiAgLy8gICAvLyBvciBvbiBvdmVybGFwcGluZyB0aW1lc1xyXG4gIC8vICAgaWYgKHdheSA9PT0gJ2RlcGFydHMnKSB7XHJcbiAgLy8gICAgIHRoaXMuX2Nob3Nlbk91dGJvdW5kVGlja2V0ID0gdGhpcy5oZWxwZXJzLmNsb25lKHNlbGVjdGVkVGlja2V0KTtcclxuXHJcbiAgLy8gICAgIC8vIG5vdyBnbyBvdmVyIHRoZSBmdWxsIHJlc3VsdHMgYW5kIGZpbmQgdGhlIG1hdGNoaW5nIHRpbWVzbG90XHJcbiAgLy8gICAgIGRlcGFydHNUaWNrZXQubGVuZ3RoXHJcbiAgLy8gICAgICAgPyAodGhpcy5fY2hvc2VuT3V0Ym91bmRKb3VybmV5ID0gdGhpcy5yZXN1bHRzLnZhbHVlWzBdLm91dGJvdW5kLmZpbmQoXHJcbiAgLy8gICAgICAgICAgIChvdXQ6IFJhaWxKb3VybmV5T3B0aW9uKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIG91dC5pZGVudGlmaWVycy5qb3VybmV5SWRlbnRpZmllciA9PT0gdGltZVNsb3RJZDtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgKSlcclxuICAvLyAgICAgICA6ICh0aGlzLl9jaG9zZW5PdXRib3VuZEpvdXJuZXkgPSBudWxsKTtcclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0ICYmXHJcbiAgLy8gICAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQuc2luZ2xlT3JSZXR1cm4gPT09ICdSZXR1cm4nICYmXHJcbiAgLy8gICAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQuaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXIgIT09XHJcbiAgLy8gICAgICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0LmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyXHJcbiAgLy8gICAgICkge1xyXG4gIC8vICAgICAgIGNvbnNvbGUud2FybignKysrIENhbm5vdCBjb21iaW5lIGZhcmVzLCBjbGVhcmluZyBpbmJvdW5kLi4uICsrKycpO1xyXG4gIC8vICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRUaWNrZXQgPSBudWxsO1xyXG4gIC8vICAgICAgIHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSBlbHNlIGlmICh3YXkgPT09ICdyZXR1cm5zJykge1xyXG4gIC8vICAgICB0aGlzLl9jaG9zZW5JbmJvdW5kVGlja2V0ID0gdGhpcy5oZWxwZXJzLmNsb25lKHNlbGVjdGVkVGlja2V0KTtcclxuXHJcbiAgLy8gICAgIHRoaXMuX2Nob3NlbkluYm91bmRUaWNrZXRcclxuICAvLyAgICAgICA/ICh0aGlzLl9jaG9zZW5JbmJvdW5kSm91cm5leSA9IHRoaXMucmVzdWx0cy52YWx1ZVswXS5yZXR1cm4uZmluZChcclxuICAvLyAgICAgICAgICAgKGluVDogUmFpbEpvdXJuZXlPcHRpb24pID0+IHtcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gaW5ULmlkZW50aWZpZXJzLmpvdXJuZXlJZGVudGlmaWVyID09PSB0aW1lU2xvdElkO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICApKVxyXG4gIC8vICAgICAgIDogKHRoaXMuX2Nob3NlbkluYm91bmRKb3VybmV5ID0gbnVsbCk7XHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgY29uc29sZS5sb2codGhpcy5jaG9zZW5PdXRib3VuZEpvdXJuZXkpO1xyXG4gIC8vICAgY29uc29sZS5sb2codGhpcy5fY2hvc2VuSW5ib3VuZEpvdXJuZXkpO1xyXG4gIC8vICAgcmV0dXJuIHRpY2tldHNHcm91cHM7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBkZXRlcm1pbmUgaWYgYSBmYXJlIGNhbiBiZSBjb21iaW5lZCB3aXRoIHdoYXQgd2UgY3VycmVudGx5IGhhdmUgc2VsZWN0ZWRcclxuICAgKi9cclxuICAvLyBjYW5Db21iaW5lKGpvdXJuZXlJZGVudGlmaWVyOiBzdHJpbmcsIGZhcmVJZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAvLyAgIC8vIG1heSBoYXZlIHRvIG1vZGlmeSB0aGlzIGZvciBkdWFsIHNpbmdsZXMgbGF0ZXIgb25cclxuICAvLyAgIGlmIChcclxuICAvLyAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQgJiZcclxuICAvLyAgICAgdGhpcy5fY2hvc2VuT3V0Ym91bmRUaWNrZXQuc2luZ2xlT3JSZXR1cm4gPT09ICdSZXR1cm4nICYmXHJcbiAgLy8gICAgIE51bWJlcihqb3VybmV5SWRlbnRpZmllcikgPiA1XHJcbiAgLy8gICApIHtcclxuICAvLyAgICAgLy8gZ3JlYXRlciB0aGFuIDUgb25seSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHJlc3RyaWN0IG91dGJvdW5kc1xyXG4gIC8vICAgICBpZiAoXHJcbiAgLy8gICAgICAgdGhpcy5fY2FuQ29tYmluZVt0aGlzLl9jaG9zZW5PdXRib3VuZFRpY2tldC50eXBlXVtcclxuICAvLyAgICAgICAgIE51bWJlcihqb3VybmV5SWRlbnRpZmllcilcclxuICAvLyAgICAgICBdPy5pbmNsdWRlcyhmYXJlSWRlbnRpZmllcikgJiZcclxuICAvLyAgICAgICB0aGlzLl9jaG9zZW5PdXRib3VuZFRpY2tldC5pZGVudGlmaWVycy5mYXJlSWRlbnRpZmllciA9PT0gZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIGNsZWFyVW5uZWVkZWRUaWNrZXRzKFxyXG4gICAgd2F5OiBzdHJpbmcsXHJcbiAgICBncm91cDogUmFpbFRpY2tldEdyb3VwLFxyXG4gICAgdGltZVNsb3RJZDogc3RyaW5nXHJcbiAgKTogUmFpbFRpY2tldEdyb3VwIHtcclxuICAgIGlmICh3YXkgPT09ICdyZXR1cm5zJykge1xyXG4gICAgICBncm91cC5zZWxlY3RlZEluZGljaWVzID0gZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcy5maWx0ZXIoXHJcbiAgICAgICAgKGluZGljaWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIE51bWJlcihpbmRpY2llKSA8PSA1IHx8IGluZGljaWUgPT09IHRpbWVTbG90SWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JvdXAuc2VsZWN0ZWRJbmRpY2llcyA9IGdyb3VwLnNlbGVjdGVkSW5kaWNpZXMuZmlsdGVyKFxyXG4gICAgICAgIChpbmRpY2llOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHJldHVybiBOdW1iZXIoaW5kaWNpZSkgPiA1IHx8IGluZGljaWUgPT09IHRpbWVTbG90SWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBncm91cDtcclxuICB9XHJcblxyXG4gIC8vIGdldFJhaWxTdGF0aW9uKFxyXG4gIC8vICAgY29kZTogc3RyaW5nLFxyXG4gIC8vICAgaXNMb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICAvLyApOiBPYnNlcnZhYmxlPElybFN0YXRpb24+IHtcclxuICAvLyAgIGlmIChjb2RlLmxlbmd0aCA9PT0gMykge1xyXG4gIC8vICAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmdldFJhaWxTdGF0aW9uRmV0Y2hlci5mZXRjaExpc3QoeyBjb2RlIH0pLnBpcGUoXHJcbiAgLy8gICAgICAgdGFwKCgpID0+IGlzTG9hZGluZz8ubmV4dChmYWxzZSkpLFxyXG4gIC8vICAgICAgIHRha2UoMSlcclxuICAvLyAgICAgKTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHJldHVybiBvZigpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0U2VsZWN0ZWRpcmxUaWNrZXRPcHRpb24oXHJcbiAgLy8gICBpcmxKb3VybmV5T3B0aW9uOiBJcmxKb3VybmV5T3B0aW9uLFxyXG4gIC8vICAgaXJsVGlja2V0R3JvdXA6IElybFRpY2tldEdyb3VwLFxyXG4gIC8vICAgcHJvdmlkZXJJbmRleDogbnVtYmVyXHJcbiAgLy8gKTogSXJsVGlja2V0T3B0aW9uIHtcclxuICAvLyAgIHJldHVybiBpcmxKb3VybmV5T3B0aW9uLnByb3ZpZGVyc1twcm92aWRlckluZGV4XS50aWNrZXRPcHRpb25zLmZpbmQoXHJcbiAgLy8gICAgICh0aWNrZXRPcHRpb24pID0+XHJcbiAgLy8gICAgICAgdGlja2V0T3B0aW9uLnR5cGUgPT09IGlybFRpY2tldEdyb3VwLmhlYWRlci50eXBlICYmXHJcbiAgLy8gICAgICAgdGlja2V0T3B0aW9uLnByaWNlID09PSBpcmxUaWNrZXRHcm91cC5oZWFkZXIucHJpY2VcclxuICAvLyAgICk7XHJcbiAgLy8gfVxyXG5cclxuICBnZXRMZWdzRnJvbVJhaWxKb3VybmV5T3B0aW9uKHJhaWxKb3VybmV5T3B0aW9uOiBJcmxKb3VybmV5T3B0aW9uKTogYW55W10ge1xyXG4gICAgbGV0IGxlZ3M6IGFueVtdID0gW107XHJcbiAgICBpZiAocmFpbEpvdXJuZXlPcHRpb24/LnNlZ21lbnRzLmxlbmd0aCkge1xyXG4gICAgICBsZWdzID0gcmFpbEpvdXJuZXlPcHRpb24uc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIG9wZXJhdG9yOiBzZWdtZW50Lm9wZXJhdG9yLFxyXG4gICAgICAgICAgZGVwYXJ0dXJlRGF0ZVRpbWU6IHNlZ21lbnQuZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uTmFtZTogc2VnbWVudC5kZXBhcnQsXHJcbiAgICAgICAgICBhcnJpdmFsRGF0ZVRpbWU6IHNlZ21lbnQuYXJyaXZlRGF0ZVRpbWUsXHJcbiAgICAgICAgICBhcnJpdmFsU3RhdGlvbk5hbWU6IHNlZ21lbnQuYXJyaXZlXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGVncztcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFNpbmdsZUpvdXJuZXlUb0Jhc2tldChcclxuICAgIHNlcnZpY2VJZDogc3RyaW5nLFxyXG4gICAgcmFpbFF1ZXJ5OiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyxcclxuICAgIGlybEpvdXJuZXlPcHRpb246IElybFRpY2tldCxcclxuICAgIC8vIHJhaWxUaWNrZXRHcm91cDogSXJsVGlja2V0R3JvdXBcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKHNlcnZpY2VJZCxyYWlsUXVlcnksaXJsSm91cm5leU9wdGlvbilcclxuICAgIC8vIGlmIChpcmxKb3VybmV5T3B0aW9uLnVuc2VsbGFibGUpIHtcclxuICAgIC8vICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAvLyB9XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgLy8gY29uc3Qgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24gPSB0aGlzLmdldFNlbGVjdGVkSXJsVGlja2V0T3B0aW9uKFxyXG4gICAgICAvLyAgIGlybEpvdXJuZXlPcHRpb24sXHJcbiAgICAgIC8vICAgcmFpbFRpY2tldEdyb3VwLFxyXG4gICAgICAvLyAgIDBcclxuICAgICAgLy8gKTtcclxuICAgICAgLy8gY29uc3QgbGVncyA9IHRoaXMuZ2V0TGVnc0Zyb21SYWlsSm91cm5leU9wdGlvbihyYWlsSm91cm5leU9wdGlvbik7XHJcbiAgICAgIC8vIGNvbnN0IHRpY2tldFF1ZXVlTGlzdCA9IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLnRpY2tldFF1ZXVlTGlzdC5tYXAoXHJcbiAgICAgIC8vICAgKHRpY2tldFF1ZXVlTGlzdCkgPT4ge1xyXG4gICAgICAvLyAgICAgcmV0dXJuIHtcclxuICAgICAgLy8gICAgICAgaWQ6IHRpY2tldFF1ZXVlTGlzdC5pZCxcclxuICAgICAgLy8gICAgICAgbmFtZTogdGlja2V0UXVldWVMaXN0Lm5hbWUsXHJcbiAgICAgIC8vICAgICAgIHR5cGU6IHRpY2tldFF1ZXVlTGlzdC50eXBlXHJcbiAgICAgIC8vICAgICB9O1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gKTtcclxuICAgIC8vICAgY29uc3QgYmFza2V0SXRlbSA9IHtcclxuICAgIC8vICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgIC8vICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWQsXHJcbiAgICAvLyAgICAgZGV0YWlsOiB7XHJcbiAgICAvLyAgICAgICAvLyBhY2NvdW50c0xpc3Q6IGlybEpvdXJuZXlPcHRpb24uYWNjb3VudHNMaXN0Lm1hcChcclxuICAgIC8vICAgICAgIC8vICAgKGFjY291bnQ6IFJhaWxBY2NvdW50KSA9PiB7XHJcbiAgICAvLyAgICAgICAvLyAgICAgcmV0dXJuIHsgaWQ6IGFjY291bnQuaWQsIGRlc2NyaXB0aW9uOiBhY2NvdW50LmRlc2NyaXB0aW9uIH07XHJcbiAgICAvLyAgICAgICAvLyAgIH1cclxuICAgIC8vICAgICAgIC8vICksXHJcbiAgICAvLyAgICAgICBvdXR3YXJkRGV0YWlsOiB7XHJcbiAgICAvLyAgICAgICAgIGFycml2YWxEYXRlVGltZTogcmFpbEpvdXJuZXlPcHRpb24uYXJyaXZlRGF0ZVRpbWUsXHJcbiAgICAvLyAgICAgICAgIGFycml2YWxTdGF0aW9uTmFtZTogcmFpbEpvdXJuZXlPcHRpb24udG8sXHJcbiAgICAvLyAgICAgICAgIGRlcGFydHVyZURhdGVUaW1lOiByYWlsSm91cm5leU9wdGlvbi5kZXBhcnREYXRlVGltZSxcclxuICAgIC8vICAgICAgICAgZGVwYXJ0dXJlU3RhdGlvbk5hbWU6IHJhaWxKb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAvLyAgICAgICAgIHN1cHBsaWVyVGlja2V0czogW1xyXG4gICAgLy8gICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogcmFpbEpvdXJuZXlPcHRpb24ucHJvdmlkZXJzWzBdLm5hbWUsXHJcbiAgICAvLyAgICAgICAgICAgICB0aWNrZXREZXNjcmlwdGlvbjogc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnR5cGUsXHJcbiAgICAvLyAgICAgICAgICAgICBwcmljZTogc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnByaWNlLFxyXG4gICAgLy8gICAgICAgICAgICAgbGVnc1xyXG4gICAgLy8gICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgXVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHRyYW5zYWN0aW9uSWRlbnRpZmllcjpcclxuICAgIC8vICAgICAgICAgcmFpbEpvdXJuZXlPcHRpb24uaWRlbnRpZmllcnMudHJhbnNhY3Rpb25JZGVudGlmaWVyLFxyXG4gICAgLy8gICAgICAgb3V0Ym91bmQ6IHtcclxuICAgIC8vICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgICAvLyAgICAgICAgICAgc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyXHJcbiAgICAvLyAgICAgICAgIF0sXHJcbiAgICAvLyAgICAgICAgIGpvdXJuZXlJZGVudGlmaWVyOiBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJcclxuICAgIC8vICAgICAgIH0sXHJcbiAgICAvLyAgICAgICB0aWNrZXRRdWV1ZUxpc3RcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICAgIGFkdWx0czogcmFpbFF1ZXJ5LmFkdWx0cyxcclxuICAgIC8vICAgICBwcmljZTogc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnByaWNlLFxyXG4gICAgLy8gICAgIGN1cnJlbmN5OiBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24uY3VycmVuY3kgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgLy8gICAgIHNlYXJjaFF1ZXJ5OiByYWlsUXVlcnksXHJcbiAgICAvLyAgICAgLy8gY28yUGVySXRlbTogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJJdGVtLFxyXG4gICAgLy8gICAgIC8vIGNvMlBlclBhc3NlbmdlcjogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJQYXNzZW5nZXIsXHJcbiAgICAvLyAgICAgb3V0Ym91bmREYXRlOiBpcmxKb3VybmV5T3B0aW9uLlxyXG4gICAgLy8gICB9XHJcblxyXG4gICAgLy8gICAvLyBpZiBvdXRUaWNrZXRFeHRyYXMgZXhpc3RzIGFkZCB0aGUgb2JqZWN0IHRvIGJhc2tldEl0ZW1cclxuICAgIC8vICAgaWYgKG91dFRpY2tldEV4dHJhcykge1xyXG4gICAgLy8gICAgIGJhc2tldEl0ZW0uZGV0YWlsLm91dGJvdW5kLnRpY2tldEV4dHJhcyA9IG91dFRpY2tldEV4dHJhcztcclxuICAgIC8vICAgfVxyXG5cclxuICAgIC8vICAgcmV0dXJuIHRoaXMuYmFza2V0U2VydmljZS5hZGRUb0Jhc2tldChcclxuICAgIC8vICAgICBiYXNrZXRJdGVtLFxyXG4gICAgLy8gICAgIGludEJhc2tldCxcclxuICAgIC8vICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAvLyAgICAgdGhpcy50cmF2ZWxsZXJzXHJcbiAgICAvLyAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vIGFzeW5jIGFkZFJldHVybkpvdXJuZXlUb0Jhc2tldChcclxuICAvLyAgIHNlcnZpY2VJZDogc3RyaW5nLFxyXG4gIC8vICAgcmFpbFF1ZXJ5OiBTZWFyY2hSYWlsUXVlcnlWYXJpYWJsZXMsXHJcbiAgLy8gICBvdXRib3VuZDogUmFpbEpvdXJuZXlPcHRpb24sXHJcbiAgLy8gICBpbmJvdW5kOiBSYWlsSm91cm5leU9wdGlvbixcclxuICAvLyAgIHJhaWxUaWNrZXRHcm91cDogUmFpbFRpY2tldEdyb3VwXHJcbiAgLy8gKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgLy8gICBpZiAob3V0Ym91bmQudW5zZWxsYWJsZSkge1xyXG4gIC8vICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UgPVxyXG4gIC8vICAgICBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuZ2V0RGVmYXVsdEJhc2tldCgpO1xyXG4gIC8vICAgY29uc3QgYmFza2V0ID0gaW50QmFza2V0Py5zdWJqZWN0LnZhbHVlO1xyXG4gIC8vICAgaWYgKGJhc2tldCkge1xyXG4gIC8vICAgICBjb25zdCBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24gPSB0aGlzLmdldFNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbihcclxuICAvLyAgICAgICBvdXRib3VuZCxcclxuICAvLyAgICAgICByYWlsVGlja2V0R3JvdXAsXHJcbiAgLy8gICAgICAgMFxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgICBjb25zdCBvdXRib3VuZExlZ3MgPSB0aGlzLmdldExlZ3NGcm9tUmFpbEpvdXJuZXlPcHRpb24ob3V0Ym91bmQpO1xyXG4gIC8vICAgICBjb25zdCBpbmJvdW5kTGVncyA9IHRoaXMuZ2V0TGVnc0Zyb21SYWlsSm91cm5leU9wdGlvbihpbmJvdW5kKTtcclxuICAvLyAgICAgY29uc3QgdGlja2V0UXVldWVMaXN0ID0gc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLnRpY2tldFF1ZXVlTGlzdC5tYXAoXHJcbiAgLy8gICAgICAgKHRpY2tldFF1ZXVlTGlzdDE6IFJhaWxUaWNrZXRRdWV1ZSkgPT4ge1xyXG4gIC8vICAgICAgICAgcmV0dXJuIHtcclxuICAvLyAgICAgICAgICAgaWQ6IHRpY2tldFF1ZXVlTGlzdDEuaWQsXHJcbiAgLy8gICAgICAgICAgIG5hbWU6IHRpY2tldFF1ZXVlTGlzdDEubmFtZSxcclxuICAvLyAgICAgICAgICAgdHlwZTogdGlja2V0UXVldWVMaXN0MS50eXBlXHJcbiAgLy8gICAgICAgICB9O1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgKTtcclxuXHJcbiAgLy8gICAgIHJldHVybiB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgLy8gICAgICAge1xyXG4gIC8vICAgICAgICAgYmFza2V0OiBiYXNrZXQuaWQsXHJcbiAgLy8gICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWQsXHJcbiAgLy8gICAgICAgICBkZXRhaWw6IHtcclxuICAvLyAgICAgICAgICAgb3V0d2FyZERldGFpbDoge1xyXG4gIC8vICAgICAgICAgICAgIGFycml2YWxEYXRlVGltZTogb3V0Ym91bmQuYXJyaXZlRGF0ZVRpbWUsXHJcbiAgLy8gICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBvdXRib3VuZC50byxcclxuICAvLyAgICAgICAgICAgICBkZXBhcnR1cmVEYXRlVGltZTogb3V0Ym91bmQuZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgLy8gICAgICAgICAgICAgZGVwYXJ0dXJlU3RhdGlvbk5hbWU6IG91dGJvdW5kLmZyb20sXHJcbiAgLy8gICAgICAgICAgICAgc3VwcGxpZXJUaWNrZXRzOiBbXHJcbiAgLy8gICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogb3V0Ym91bmQucHJvdmlkZXJzWzBdLm5hbWUsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHRpY2tldERlc2NyaXB0aW9uOiBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24udHlwZSxcclxuICAvLyAgICAgICAgICAgICAgICAgcHJpY2U6IHNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbi5wcmljZSxcclxuICAvLyAgICAgICAgICAgICAgICAgbGVnczogb3V0Ym91bmRMZWdzXHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgXVxyXG4gIC8vICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICBpbndhcmREZXRhaWw6IHtcclxuICAvLyAgICAgICAgICAgICBhcnJpdmFsRGF0ZVRpbWU6IGluYm91bmQuYXJyaXZlRGF0ZVRpbWUsXHJcbiAgLy8gICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBpbmJvdW5kLnRvLFxyXG4gIC8vICAgICAgICAgICAgIGRlcGFydHVyZURhdGVUaW1lOiBpbmJvdW5kLmRlcGFydERhdGVUaW1lLFxyXG4gIC8vICAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25OYW1lOiBpbmJvdW5kLmZyb20sXHJcbiAgLy8gICAgICAgICAgICAgc3VwcGxpZXJUaWNrZXRzOiBbXHJcbiAgLy8gICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogaW5ib3VuZC5wcm92aWRlcnNbMF0ubmFtZSxcclxuICAvLyAgICAgICAgICAgICAgICAgdGlja2V0RGVzY3JpcHRpb246IHNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbi50eXBlLFxyXG4gIC8vICAgICAgICAgICAgICAgICBsZWdzOiBpbmJvdW5kTGVnc1xyXG4gIC8vICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIF1cclxuICAvLyAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgdHJhbnNhY3Rpb25JZGVudGlmaWVyOiBvdXRib3VuZC5pZGVudGlmaWVycy50cmFuc2FjdGlvbklkZW50aWZpZXIsXHJcbiAgLy8gICAgICAgICAgIG91dGJvdW5kOiB7XHJcbiAgLy8gICAgICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgLy8gICAgICAgICAgICAgICBzZWxlY3RlZFJhaWxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAvLyAgICAgICAgICAgICBdLFxyXG4gIC8vICAgICAgICAgICAgIGpvdXJuZXlJZGVudGlmaWVyOlxyXG4gIC8vICAgICAgICAgICAgICAgc2VsZWN0ZWRSYWlsVGlja2V0T3B0aW9uLmlkZW50aWZpZXJzLmpvdXJuZXlJZGVudGlmaWVyXHJcbiAgLy8gICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgIHRpY2tldFF1ZXVlTGlzdFxyXG4gIC8vICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIGFkdWx0czogcmFpbFF1ZXJ5LmFkdWx0cyxcclxuICAvLyAgICAgICAgIHByaWNlOiByYWlsVGlja2V0R3JvdXAuaGVhZGVyLnByaWNlLFxyXG4gIC8vICAgICAgICAgY3VycmVuY3k6IHNlbGVjdGVkUmFpbFRpY2tldE9wdGlvbi5jdXJyZW5jeSBhcyBDdXJyZW5jeUNvZGUsXHJcbiAgLy8gICAgICAgICBzZWFyY2hRdWVyeTogcmFpbFF1ZXJ5LFxyXG4gIC8vICAgICAgICAgY28yUGVySXRlbTogb3V0Ym91bmQuY28yUGVySXRlbSxcclxuICAvLyAgICAgICAgIGNvMlBlclBhc3Nlbmdlcjogb3V0Ym91bmQuY28yUGVyUGFzc2VuZ2VyXHJcbiAgLy8gICAgICAgfSxcclxuICAvLyAgICAgICBpbnRCYXNrZXQsXHJcbiAgLy8gICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gIC8vICAgICAgIHRoaXMudHJhdmVsbGVyc1xyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzb3J0VGlja2V0UHJpY2VzKHRpY2tldHM6IFRpY2tldEdyb3Vwcyk6IFRpY2tldEdyb3VwcyB7XHJcbiAgLy8gICBjb25zdCBzb3J0VGlja2V0UHJpY2VzID0geyAuLi50aWNrZXRzIH07XHJcbiAgLy8gICBPYmplY3Qua2V5cyhzb3J0VGlja2V0UHJpY2VzKS5tYXAoKGtleSkgPT4ge1xyXG4gIC8vICAgICBzb3J0VGlja2V0UHJpY2VzW2tleV0uc29ydCgoYTogSXJsVGlja2V0T3B0aW9uLCBiOiBJcmxUaWNrZXRPcHRpb24pID0+IHtcclxuICAvLyAgICAgICBjb25zdCBwcmljZUEgPSBhLnByaWNlLFxyXG4gIC8vICAgICAgICAgcHJpY2VCID0gYi5wcmljZTtcclxuICAvLyAgICAgICByZXR1cm4gcHJpY2VBIDwgcHJpY2VCID8gLTEgOiBwcmljZUEgPiBwcmljZUIgPyAxIDogMDtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9KTtcclxuICAvLyAgIHJldHVybiBzb3J0VGlja2V0UHJpY2VzO1xyXG4gIC8vIC8vIH1cclxuICAvLyBzb3J0VGlja2V0Q2hpbGRyZW5QcmljZXModGlja2V0czogUmFpbFRpY2tldEdyb3Vwcyk6IFJhaWxUaWNrZXRHcm91cHMge1xyXG4gIC8vICAgY29uc3Qgc29ydFRpY2tldFByaWNlcyA9IHsgLi4udGlja2V0cyB9O1xyXG4gIC8vICAgT2JqZWN0LmtleXMoc29ydFRpY2tldFByaWNlcykubWFwKChrZXkpID0+IHtcclxuICAvLyAgICAgc29ydFRpY2tldFByaWNlc1trZXldLmNoaWxkcmVuLnNvcnQoXHJcbiAgLy8gICAgICAgKGE6IFJhaWxUaWNrZXRHcm91cCwgYjogUmFpbFRpY2tldEdyb3VwKSA9PiB7XHJcbiAgLy8gICAgICAgICBjb25zdCBwcmljZUEgPSBhLmhlYWRlci5wcmljZSxcclxuICAvLyAgICAgICAgICAgcHJpY2VCID0gYi5oZWFkZXIucHJpY2U7XHJcbiAgLy8gICAgICAgICByZXR1cm4gcHJpY2VBIDwgcHJpY2VCID8gLTEgOiBwcmljZUEgPiBwcmljZUIgPyAxIDogMDtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICk7XHJcbiAgLy8gICB9KTtcclxuICAvLyAgIHJldHVybiBzb3J0VGlja2V0UHJpY2VzO1xyXG4gIC8vIH1cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogSUNoZWFwZXN0UHJpY2Uge1xyXG4gICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBjdXJyZW5jeSA9XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LmN1cnJlbmN5O1xyXG4gICAgY29uc3QgcHJpY2UgPSB0aGlzLmZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFtb3VudDogcHJpY2UsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogY3VycmVuY3lcclxuICAgIH07XHJcbiAgfVxyXG4gIGZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NoZWFwZXN0Rmlyc3QgPSBudWxsO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RTdGFuZGFyZCA9IG51bGw7XHJcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBjaGVhcGVzdEFycjogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgIHJlc3VsdC5vdXRib3VuZC5tYXAoKG91dCkgPT4ge1xyXG4gICAgICAgIG91dC5wcm92aWRlcnMubWFwKCh0a3QpID0+IHtcclxuICAgICAgICAgIGxldCBjaGVhcGVzdFRpY2tldDogbnVtYmVyID0gdGt0LmNoZWFwZXN0VGlja2V0LnByaWNlO1xyXG4gICAgICAgICAgdGt0LnRpY2tldE9wdGlvbnMubWFwKCh0a3RPcHRpb24pID0+IHtcclxuICAgICAgICAgICAgbGV0IHRrdFByaWNlID0gdGt0T3B0aW9uLnByaWNlO1xyXG4gICAgICAgICAgICBsZXQgdGt0Q2xhc3MgPSB0a3RPcHRpb24uY2xhc3M7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICB0a3RDbGFzcyA9PT0gJ0ZpcnN0JyAmJlxyXG4gICAgICAgICAgICAgICh0aGlzLl9jaGVhcGVzdEZpcnN0Py5wcmljZSA+IHRrdFByaWNlIHx8ICF0aGlzLl9jaGVhcGVzdEZpcnN0KVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICB0aGlzLl9jaGVhcGVzdEZpcnN0ID0gdGt0T3B0aW9uO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgIHRrdENsYXNzID09PSAnU3RhbmRhcmQnICYmXHJcbiAgICAgICAgICAgICAgKHRoaXMuX2NoZWFwZXN0U3RhbmRhcmQ/LnByaWNlID4gdGt0UHJpY2UgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLl9jaGVhcGVzdFN0YW5kYXJkKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICB0aGlzLl9jaGVhcGVzdFN0YW5kYXJkID0gdGt0T3B0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0a3RQcmljZSA9PT0gY2hlYXBlc3RUaWNrZXQpIHtcclxuICAgICAgICAgICAgICBjaGVhcGVzdEFyci5wdXNoKGNoZWFwZXN0VGlja2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gTWF0aC5taW4oLi4uY2hlYXBlc3RBcnIpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
870
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJsLWVudGVycHJpc2Utc2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2J0c2VydmljZXMvYmFzZS9zcmMvbGliL3ZlbmRvci9jbGFzc2VzL2lybC1lbnRlcnByaXNlLXNlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVd6RCxPQUFPLEVBR0wsUUFBUSxFQU1SLFdBQVcsRUFDWCxjQUFjLEVBSWYsTUFBTSx3QkFBd0IsQ0FBQztBQWtCaEMsT0FBTyxFQUFhLElBQUksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUcxRCxNQUFNLENBQU4sSUFBWSxZQUlYO0FBSkQsV0FBWSxZQUFZO0lBQ3RCLG1DQUFtQixDQUFBO0lBQ25CLG1DQUFtQixDQUFBO0lBQ25CLGlDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxZQUFZLEtBQVosWUFBWSxRQUl2QjtBQVdELE1BQU0sQ0FBTixJQUFZLFNBTVg7QUFORCxXQUFZLFNBQVM7SUFDbkIsMEJBQWEsQ0FBQTtJQUNiLDBCQUFhLENBQUE7SUFDYixxQ0FBcUM7SUFDckMsdUNBQTBCLENBQUE7SUFDMUIsc0NBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQU5XLFNBQVMsS0FBVCxTQUFTLFFBTXBCO0FBRUQsTUFBTSxPQUFPLG1CQUlYLFNBQVEsb0JBSVA7SUFpYkQsWUFDVSxVQUFrQyxFQUNsQyx1QkFBMkQsRUFDbkUsT0FBMkIsRUFDbkIsYUFBK0MsRUFDdkQsY0FBa0MsRUFDMUIsYUFBK0M7UUFFdkQsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMs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NUMsUUFBUTtTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsZUFBaUM7O1FBQy9DLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsS0FBSyxjQUFFLGVBQWUsYUFBZixlQUFlLHVCQUFmLGVBQWUsQ0FBRSxTQUFTLENBQUMsQ0FBQywyQ0FBRyxhQUFhLENBQUMsQ0FBQywyQ0FBRyxTQUFTO2FBQ2xFO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUN0QixNQUFNLEtBQUssR0FBNEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdELE1BQU0sb0JBQW9CLEdBQW1CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRSxNQUFNLFVBQVUsR0FBRztnQkFDakIsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUU7Z0JBQ25CLFdBQVcsRUFBRSxXQUFXLENBQUMsaUJBQWlCO2dCQUMxQyxVQUFVLEVBQUUsb0JBQW9CO2FBQ2pDLENBQUE7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDOztBQTlpQ2UsMENBQXNCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLDJDQUF1QixHQUFHLGFBQWEsQ0FBQztBQUN4QyxpQ0FBYSxHQUFHLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBWYWx1ZURpc3BsYXkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ZhbHVlLWRpc3BsYXknO1xyXG5pbXBvcnQge1xyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgSXJsUXVvdGVSZXN1bHRBcnJheSxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgSXJsVGlja2V0T3B0aW9uV2l0aFNlbGVjdGVkLFxyXG4gIFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFza2V0SXRlbSxcclxuICBDdXJyZW5jeUNvZGUsXHJcbiAgSXJsQ2xhc3MsXHJcbiAgSXJsSm91cm5leU9wdGlvbixcclxuICBJcmxKb3VybmV5T3B0aW9ucyxcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgSXJsVGlja2V0T3B0aW9uLFxyXG4gIFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlcnZpY2VUeXBlLFxyXG4gIElybEpvdXJuZXlUeXBlLFxyXG4gIElybFN1cHBsaWVyLFxyXG4gIElybFRyYXZlbENhcmQsXHJcbiAgSXJsU2VnbWVudFxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VJcmxEaXNjb3VudENhcmRGZXRjaGVyLFxyXG4gIElybERpc2NvdW50Q2FyZEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvaXJsLWRpc2NvdW50LWNhcmQtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUlybFF1b3RlRmV0Y2hlcixcclxuICBJcmxRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvaXJsLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIElSTEVudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgSXJsVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWlybC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciwgYWdlcyB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgSUNoZWFwZXN0UHJpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoZWFwZXN0LXByaWNlJztcclxuaW1wb3J0IHsgU29ydE1ldGhvZCB9IGZyb20gJy4vZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBJSXJsU2VhcmNoQXJncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXJsLXNlYXJjaC1hcmcuaW50ZXJmYWNlJztcclxuXHJcbmV4cG9ydCBlbnVtIFNvcnRUeXBlc0lybCB7XHJcbiAgQ2hlYXBlc3RGaXJzdCA9ICdDJyxcclxuICBFYXJsaWVzdEZpcnN0ID0gJ0UnLFxyXG4gIExhdGVzdEZpcnN0ID0gJ0wnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU29ydFR5cGVJcmwge1xyXG4gIC8qKiBUaXRsZSBkaXNwbGF5ZWQgb24gZHJvcGRvd24gKi9cclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIC8qKiBNZXRob2QgbmFtZSB1c2VkIGJ5IGNvbXBvbmVudCB0byBzb3J0IHJlc3VsdHMgKi9cclxuICBtZXRob2RSZWY6IFNvcnRNZXRob2Q7XHJcbiAgLyoqIEljb24gZGlzcGxheWVkIG9uIGRyb3AgZG93biAqL1xyXG4gIGljb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQ2xhc3NUeXBlIHtcclxuICBDbGFzc18xID0gJzEnLFxyXG4gIENsYXNzXzIgPSAnMicsXHJcbiAgLy8gISB0aGVzZSAyIHNob3B1bGQgYmUgcmVtb3ZlZCBsYXRlclxyXG4gIFNlY29uZF9DbGFzcyA9ICcybmQgQ2xhc3MnLFxyXG4gIEZpcnN0X0NsYXNzID0gJzFzdCBDbGFzcydcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIElSTEVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBRIGV4dGVuZHMgSXJsUXVvdGVGZXRjaGVyVHlwZSxcclxuICAgIEdJREZfUSBleHRlbmRzIElybERpc2NvdW50Q2FyZEZldGNoZXJUeXBlXHJcbiAgPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBJcmxUZW1wUGFyYW1zLFxyXG4gICAgSXJsUXVvdGVSZXN1bHRBcnJheSxcclxuICAgIElybFF1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBJUkxFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlXHJcbntcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyA9ICdzZWFyY2hfaXJsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAnaXJsX3Jlc3VsdHMnO1xyXG4gIHN0YXRpYyByZWFkb25seSBQQVNTSU5HX1BPSU5UID0gJ1Bhc3NpbmcnO1xyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPSBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG4gIHByb3RlY3RlZCBtdWx0aVJlc3VsdHNTZXNzaW9uTmFtZSA9XHJcbiAgICBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBwcml2YXRlIF9zb3J0QXJyYXk6IFNvcnRUeXBlSXJsW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIHRpdGxlOiAnUHJpY2UnLFxyXG4gICAgICBtZXRob2RSZWY6IFNvcnRNZXRob2Quc29ydEJ5UHJpY2UsXHJcbiAgICAgIGljb246ICdpY28tZG9sbGFyJ1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdUaW1lJyxcclxuICAgICAgbWV0aG9kUmVmOiBTb3J0TWV0aG9kLnNvcnRCeURhdGUsXHJcbiAgICAgIGljb246ICdpY28tY2FsZW5kYXInXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIHNlYXJjaFR5cGVzID0gW1xyXG4gICAgeyBkaXNwbGF5OiAnUmV0dXJuJywgdmFsdWU6IElybEpvdXJuZXlUeXBlLlJldHVybkpvdXJuZXkgfSxcclxuICAgIHsgZGlzcGxheTogJ09uZS1XYXknLCB2YWx1ZTogSXJsSm91cm5leVR5cGUuU2luZ2xlSm91cm5leSB9XHJcbiAgXTtcclxuXHJcbiAgcHVibGljIGNsYXNzVHlwZXMgPSBbXHJcbiAgICB7IGRpc3BsYXk6ICdBbnknLCB2YWx1ZTogSXJsQ2xhc3MuQWxsIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdTdGFuZGFyZCcsIHZhbHVlOiBJcmxDbGFzcy5TdGFuZGFyZCB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRmlyc3QnLCB2YWx1ZTogSXJsQ2xhc3MuRmlyc3QgfVxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyBhZ2VSYW5nZXM6IHtcclxuICAgIGtleTogYWdlcztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBrZXk6IGFnZXMuQ2hpbGQsIHZhbHVlOiAnQ2hpbGQgKDAtMyknIH0sXHJcbiAgICB7IGtleTogYWdlcy5DaGlsZCwgdmFsdWU6ICdDaGlsZCAoNC01KScgfSxcclxuICAgIHsga2V5OiBhZ2VzLkNoaWxkLCB2YWx1ZTogJ0NoaWxkICg2LTExKScgfSxcclxuICAgIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1lvdXRoICgxMi0xNCknIH0sXHJcbiAgICB7IGtleTogYWdlcy5Zb3V0aCwgdmFsdWU6ICdZb3V0aCAoMTUtMjUpJyB9LFxyXG4gICAgeyBrZXk6IGFnZXMuQWR1bHQsIHZhbHVlOiAnQWR1bHQgKDI2LTU5KScgfSxcclxuICAgIHsga2V5OiBhZ2VzLllvdXRoLCB2YWx1ZTogJ1NlbmlvciAoNjArKScgfVxyXG4gIF07XHJcblxyXG4gIHB1YmxpYyB0cmF2ZWxDYXJkcyA9IFtcclxuICAgIHsgZGlzcGxheTogJ1lvdW5nIHBlcnNvbnMgcmFpbGNhcmQnLCB2YWx1ZTogJ1lORycgfSxcclxuICAgIHsgZGlzcGxheTogJ0Rpc2FiaWxpdHkgcmFpbGNhcmQnLCB2YWx1ZTogJ0RJUycgfSxcclxuICAgIHsgZGlzcGxheTogJ0ZhbWlseSByYWlsY2FyZCcsIHZhbHVlOiAnRkFNJyB9LFxyXG4gICAgeyBkaXNwbGF5OiAnRm9yY2VzIHJhaWxjYXJkJywgdmFsdWU6ICdITUYnIH0sXHJcbiAgICB7IGRpc3BsYXk6ICdUcmF2ZWwgYWdlbmN5IGRpc2NvdW50JywgdmFsdWU6ICdUQUQnIH1cclxuICBdO1xyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbDtcclxuICBwdWJsaWMgbWluT3V0Ym91bmREYXRlOiBOZ2JEYXRlU3RydWN0ID0ge1xyXG4gICAgeWVhcjogbW9tZW50KCkueWVhcigpLFxyXG4gICAgbW9udGg6IG1vbWVudCgpLm1vbnRoKCkgKyAxLFxyXG4gICAgZGF5OiBtb21lbnQoKS5kYXRlKClcclxuICB9O1xyXG4gIHB1YmxpYyBtaW5JbmJvdW5kRGF0ZTogTmdiRGF0ZVN0cnVjdCA9IHtcclxuICAgIHllYXI6IG1vbWVudCgpLnllYXIoKSxcclxuICAgIG1vbnRoOiBtb21lbnQoKS5tb250aCgpICsgMSxcclxuICAgIGRheTogbW9tZW50KCkuZGF0ZSgpXHJcbiAgfTtcclxuICBwcml2YXRlIF90aW1lQXJyYXk6IFZhbHVlRGlzcGxheVtdO1xyXG4gIHByaXZhdGUgX2NhbkNvbWJpbmU6IGFueTtcclxuICBwcml2YXRlIF90cmF2ZWxsaW5nRnJvbTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3RyYXZlbGxpbmdUbzogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfb3JpZ2luYWxVc2VyU2VhcmNoOiBJcmxUZW1wUGFyYW1zO1xyXG4gIHByaXZhdGUgX291dGJvdW5kSm91cm5leU9wdGlvbnM6IElybEpvdXJuZXlPcHRpb247XHJcbiAgcHJpdmF0ZSBfaXNGaWx0ZXJlZDogYm9vbGVhbjtcclxuICBnZXQgb3V0Ym91bmRKb3VybmV5T3B0aW9ucygpOiBJcmxKb3VybmV5T3B0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9vdXRib3VuZEpvdXJuZXlPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kSm91cm5leU9wdGlvbnMoZGF0YTogSXJsSm91cm5leU9wdGlvbikge1xyXG4gICAgdGhpcy5fb3V0Ym91bmRKb3VybmV5T3B0aW9ucyA9IGRhdGE7XHJcbiAgfVxyXG4gIF9vdXRib3VuZFRpY2tldDogSXJsVGlja2V0T3B0aW9uV2l0aFNlbGVjdGVkO1xyXG4gIGdldCBvdXRib3VuZFRpY2tldCgpOiBJcmxUaWNrZXRPcHRpb25XaXRoU2VsZWN0ZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX291dGJvdW5kVGlja2V0O1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dGJvdW5kVGlja2V0KGRhdGE6IElybFRpY2tldE9wdGlvbldpdGhTZWxlY3RlZCkge1xyXG4gICAgdGhpcy5fb3V0Ym91bmRUaWNrZXQgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vT2ZBZHVsdHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vT2ZBZHVsdHMoYWR1bHRzOiBudW1iZXIpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgPSBhZHVsdHM7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbm9PZkNoaWxkcmVuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgc2V0IG5vT2ZDaGlsZHJlbihjaGlsZHJlbjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCB0cmF2ZWxsaW5nVG8oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbExvY2F0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgdHJhdmVsbGluZ1RvKHR0OiBhbnkpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsTG9jYXRpb25JZCA9IHR0O1xyXG5cclxuICAgIHRoaXMuX3RyYXZlbGxpbmdUbyA9ICcnO1xyXG4gICAgaWYgKHR0Py5yYWlsc3RhdGlvbj8uaWQpIHtcclxuICAgICAgdGhpcy5fdHJhdmVsbGluZ1RvID0gdHQucmFpbHN0YXRpb24uaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRyYXZlbGxpbmdGcm9tKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmRlcGFydHVyZUxvY2F0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgdHJhdmVsbGluZ0Zyb20odHQ6IGFueSkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmRlcGFydHVyZUxvY2F0aW9uSWQgPSB0dDtcclxuICAgIHRoaXMuX3RyYXZlbGxpbmdGcm9tID0gJyc7XHJcbiAgICBpZiAodHQ/LnJhaWxzdGF0aW9uPy5pZCkge1xyXG4gICAgICB0aGlzLl90cmF2ZWxsaW5nRnJvbSA9IHR0LnJhaWxzdGF0aW9uLmlkO1xyXG4gICAgICB0aGlzLnN1cHBsaWVyID0gdHQucmFpbHN0YXRpb24uc3VwcGxpZXI7XHJcbiAgICAgIHRoaXMuZ2V0SXJsRGlzY291bnRDYXJkcygpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXJsRGlzY291bnRDYXJkc0FycmF5ID0gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc3VwcGxpZXI6IElybFN1cHBsaWVyID0gbnVsbDtcclxuICBnZXQgc3VwcGxpZXIoKTogSXJsU3VwcGxpZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N1cHBsaWVyO1xyXG4gIH1cclxuICBzZXQgc3VwcGxpZXIoZGF0YTogSXJsU3VwcGxpZXIpIHtcclxuICAgIHRoaXMuX3N1cHBsaWVyID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvdW50cnlDb2RlOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBjb3VudHJ5Q29kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvdW50cnlDb2RlO1xyXG4gIH1cclxuICBzZXQgY291bnRyeUNvZGUoZGF0YTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jb3VudHJ5Q29kZSA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGFzczogSXJsQ2xhc3MgPSBudWxsO1xyXG4gIGdldCBjbGFzcygpOiBJcmxDbGFzcyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xhc3M7XHJcbiAgfVxyXG4gIHNldCBjbGFzcyhkYXRhOiBJcmxDbGFzcykge1xyXG4gICAgdGhpcy5fY2xhc3MgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTogbW9tZW50Lk1vbWVudCA9IG51bGw7XHJcbiAgZ2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcbiAgc2V0IG91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lID0gbmV3RGF0ZVRpbWU7XHJcbiAgICBpZiAobmV3RGF0ZVRpbWUgJiYgbmV3RGF0ZVRpbWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMuX291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgICAgdGhpcy5fb3V0Ym91bmRfZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlVGltZSk7XHJcbiAgICAgIHRoaXMuX291dGJvdW5kX3RpbWUgPSBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgPyBtb21lbnQobmV3RGF0ZVRpbWUpLmZvcm1hdCgnSEhtbScpXHJcbiAgICAgICAgOiAnMDcwMCc7XHJcbiAgICB9XHJcbiAgICB0aGlzLl91cGRhdGVPdXRib3VuZERhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kZXBhcnR1cmVMb2NhdGlvbklkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBkZXBhcnR1cmVMb2NhdGlvbklkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVwYXJ0dXJlTG9jYXRpb25JZDtcclxuICB9XHJcbiAgc2V0IGRlcGFydHVyZUxvY2F0aW9uSWQoZGF0YTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9kZXBhcnR1cmVMb2NhdGlvbklkID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Fycml2YWxMb2NhdGlvbklkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBhcnJpdmFsTG9jYXRpb25JZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Fycml2YWxMb2NhdGlvbklkO1xyXG4gIH1cclxuICBzZXQgYXJyaXZhbExvY2F0aW9uSWQoZGF0YTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9hcnJpdmFsTG9jYXRpb25JZCA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hZHVsdHM6IG51bWJlciA9IDA7XHJcbiAgZ2V0IGFkdWx0cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FkdWx0cztcclxuICB9XHJcbiAgc2V0IGFkdWx0cyhkYXRhOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2FkdWx0cyA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaGlsZHJlbjogbnVtYmVyID0gMDtcclxuICBnZXQgY2hpbGRyZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcclxuICB9XHJcbiAgc2V0IGNoaWxkcmVuKGRhdGE6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY2hpbGRyZW4gPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2hlYXBlc3RTdGFuZGFyZDogSXJsVGlja2V0T3B0aW9uID0gbnVsbDtcclxuICBnZXQgY2hlYXBlc3RTdGFuZGFyZCgpOiBJcmxUaWNrZXRPcHRpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoZWFwZXN0U3RhbmRhcmQ7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NoZWFwZXN0Rmlyc3Q6IElybFRpY2tldE9wdGlvbiA9IG51bGw7XHJcbiAgZ2V0IGNoZWFwZXN0Rmlyc3QoKTogSXJsVGlja2V0T3B0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVhcGVzdEZpcnN0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQgPSBudWxsO1xyXG4gIGdldCByZXR1cm5EZXBhcnR1cmVEYXRlVGltZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLl9yZXR1cm5EZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcbiAgc2V0IHJldHVybkRlcGFydHVyZURhdGVUaW1lKG5ld0RhdGVUaW1lOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgIGlmIChuZXdEYXRlVGltZSAmJiBuZXdEYXRlVGltZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5fcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUgPSBuZXdEYXRlVGltZTtcclxuICAgICAgdGhpcy5fcmV0dXJuX2RhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUobmV3RGF0ZVRpbWUpO1xyXG4gICAgICB0aGlzLl9yZXR1cm5fdGltZSA9IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA/IG1vbWVudChuZXdEYXRlVGltZSkuZm9ybWF0KCdISG1tJylcclxuICAgICAgICA6ICcxNjAwJztcclxuICAgIH1cclxuICAgIHRoaXMuX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hZ2VSYW5nZTogc3RyaW5nID0gbnVsbDtcclxuICBnZXQgYWdlUmFuZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9hZ2VSYW5nZTtcclxuICB9XHJcbiAgc2V0IGFnZVJhbmdlKGRhdGE6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYWdlUmFuZ2UgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJpY2VEaXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgcHJpY2VEaXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJpY2VEaXI7XHJcbiAgfVxyXG4gIHNldCBwcmljZURpcihkYXRhOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9wcmljZURpciA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kYXRlRGlyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ2V0IGRhdGVEaXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZURpcjtcclxuICB9XHJcbiAgc2V0IGRhdGVEaXIoZGF0YTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGF0ZURpciA9IGRhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hvc2VuU2VhcmNoQ2xhc3MoKTogSXJsQ2xhc3Mge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5jbGFzcztcclxuICB9XHJcblxyXG4gIHNldCBjaG9zZW5TZWFyY2hDbGFzcyhjbGFzc1I6IElybENsYXNzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuY2xhc3MgPSBjbGFzc1I7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzY291bnRDYXJkKCk6IElybFRyYXZlbENhcmQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5pcmxEaXNjb3VudENhcmRzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc2NvdW50Q2FyZChkYXRhOiBJcmxUcmF2ZWxDYXJkKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuaXJsRGlzY291bnRDYXJkcyA9IGRhdGE7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pcmxEaXNjb3VudENhcmRzQXJyYXk6IElybFRyYXZlbENhcmRbXSA9IFtdO1xyXG4gIGdldCBpcmxEaXNjb3VudENhcmRzQXJyYXkoKTogSXJsVHJhdmVsQ2FyZFtdIHtcclxuICAgIHJldHVybiB0aGlzLl9pcmxEaXNjb3VudENhcmRzQXJyYXk7XHJcbiAgfVxyXG5cclxuICBzZXQgaXJsRGlzY291bnRDYXJkc0FycmF5KGFycmF5OiBJcmxUcmF2ZWxDYXJkW10pIHtcclxuICAgIHRoaXMuX2lybERpc2NvdW50Q2FyZHNBcnJheSA9IGFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG91dEJvdW5kRGF0ZVRpbWUoKTogbW9tZW50Lk1vbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgb3V0Qm91bmREYXRlVGltZShuZXdEYXRlVGltZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUgPSBtb21lbnQobmV3RGF0ZVRpbWUpO1xyXG5cclxuICAgIHRoaXMubWluSW5ib3VuZERhdGUgPSB7XHJcbiAgICAgIHllYXI6IG5ld0RhdGVUaW1lLnllYXIoKSxcclxuICAgICAgbW9udGg6IG5ld0RhdGVUaW1lLm1vbnRoKCkgKyAxLFxyXG4gICAgICBkYXk6IG5ld0RhdGVUaW1lLmRhdGUoKVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAobmV3RGF0ZVRpbWUgJiYgbmV3RGF0ZVRpbWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMuX291dGJvdW5kX2RhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUobmV3RGF0ZVRpbWUpO1xyXG4gICAgICB0aGlzLl9vdXRib3VuZF90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgID8gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgIDogJzA3MDAnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vdXRCb3VuZERhdGVUaW1lICYmXHJcbiAgICAgIHRoaXMuaW5Cb3VuZERhdGVUaW1lICYmXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZS5pc0FmdGVyKHRoaXMuaW5Cb3VuZERhdGVUaW1lKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaW5Cb3VuZERhdGVUaW1lID0gdGhpcy5vdXRCb3VuZERhdGVUaW1lLmNsb25lKCkuYWRkKDEsICdkYXknKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5Cb3VuZERhdGVUaW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZTtcclxuICB9XHJcblxyXG4gIHNldCBpbkJvdW5kRGF0ZVRpbWUobmV3RGF0ZVRpbWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZSA9IG5ld0RhdGVUaW1lO1xyXG4gICAgaWYgKG5ld0RhdGVUaW1lICYmIG5ld0RhdGVUaW1lLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLl9yZXR1cm5fZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZShuZXdEYXRlVGltZSk7XHJcbiAgICAgIHRoaXMuX3JldHVybl90aW1lID0gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgID8gbW9tZW50KG5ld0RhdGVUaW1lKS5mb3JtYXQoJ0hIbW0nKVxyXG4gICAgICAgIDogJzE2MDAnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gIWRhdGUgYW5kIHRpbWUgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBmb3IgTFVcclxuICBwcml2YXRlIF9vdXRib3VuZF9kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgZ2V0IG91dGJvdW5kX2RhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmRfZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBvdXRib3VuZF9kYXRlKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9vdXRib3VuZF9kYXRlID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVPdXRib3VuZERhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vdXRib3VuZF90aW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBvdXRib3VuZF90aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0Ym91bmRfdGltZTtcclxuICB9XHJcblxyXG4gIHNldCBvdXRib3VuZF90aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX291dGJvdW5kX3RpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZU91dGJvdW5kRGF0ZVRpbWUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JldHVybl9kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgZ2V0IHJldHVybl9kYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JldHVybl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJldHVybl9kYXRlKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9yZXR1cm5fZGF0ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fdXBkYXRlUmV0dXJuRGF0ZVRpbWUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JldHVybl90aW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCByZXR1cm5fdGltZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JldHVybl90aW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJldHVybl90aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3JldHVybl90aW1lID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVSZXR1cm5EYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0aW1lQXJyYXkoKTogVmFsdWVEaXNwbGF5W10ge1xyXG4gICAgdGhpcy5fdGltZUFycmF5ID1cclxuICAgICAgdGhpcy5fdGltZUFycmF5IHx8XHJcbiAgICAgIEFycmF5KDQ4KVxyXG4gICAgICAgIC5maWxsKDApXHJcbiAgICAgICAgLm1hcCgoXywgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihpbmRleCAvIDIpXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJykgK1xyXG4gICAgICAgICAgICAgICgoaW5kZXggJSAyKSAqIDMwKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXHJcbiAgICAgICAgICAgIGRpc3BsYXk6XHJcbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihpbmRleCAvIDIpXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJykgK1xyXG4gICAgICAgICAgICAgICc6JyArXHJcbiAgICAgICAgICAgICAgKChpbmRleCAlIDIpICogMzApLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLl90aW1lQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vZmZsaW5lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ2V0IG9mZmxpbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb2ZmbGluZTtcclxuICB9XHJcblxyXG4gIHNldCBvZmZsaW5lKGRhdGE6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX29mZmxpbmUgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXJsQ2xhc3M6IElybENsYXNzID0gSXJsQ2xhc3MuQWxsO1xyXG4gIGdldCBpcmxDbGFzcygpOiBJcmxDbGFzcyB7XHJcbiAgICByZXR1cm4gdGhpcy5faXJsQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBzZXQgaXJsQ2xhc3MoZGF0YTogSXJsQ2xhc3MpIHtcclxuICAgIHRoaXMuX2lybENsYXNzID0gZGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2pvdXJuZXl0eXBlOiBJcmxKb3VybmV5VHlwZSA9IElybEpvdXJuZXlUeXBlLlNpbmdsZUpvdXJuZXk7XHJcbiAgZ2V0IGpvdXJuZXlUeXBlKCk6IElybEpvdXJuZXlUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9qb3VybmV5dHlwZTtcclxuICB9XHJcblxyXG4gIHNldCBqb3VybmV5VHlwZShkYXRhOiBJcmxKb3VybmV5VHlwZSkge1xyXG4gICAgdGhpcy5fam91cm5leXR5cGUgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNvcnREcm9wZG93blZhbHVlcygpOiBTb3J0VHlwZUlybFtdIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0QXJyYXk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgSXJsZmV0Y2hlcjogQmFzZUlybFF1b3RlRmV0Y2hlcjxRPixcclxuICAgIHByaXZhdGUgaXJsRGlzY291bnRDYXJkc0ZldGNoZXI6IEJhc2VJcmxEaXNjb3VudENhcmRGZXRjaGVyPEdJREZfUT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U6IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2VcclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHF1ZXJ5OiB7fTtcclxuICAgICAgdGVtcFBhcmFtczogSXJsVGVtcFBhcmFtcztcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiBJcmxUZW1wUGFyYW1zO1xyXG4gICAgfSA9IHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtKFxyXG4gICAgICBJUkxFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVNcclxuICAgICkgfHwge1xyXG4gICAgICBxdWVyeToge30sXHJcbiAgICAgIHRlbXBQYXJhbXM6IHt9IGFzIElybFRlbXBQYXJhbXMsXHJcbiAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDoge30gYXMgSXJsVGVtcFBhcmFtc1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXModGhpcy5zZWFyY2hTZXJ2aWNlLm1ha2VJcmxRdWVyeShkYXRhLnRlbXBQYXJhbXMpKTtcclxuICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IGRhdGEub3JpZ2luYWxVc2VyU2VhcmNoO1xyXG5cclxuICAgIGlmIChzZWFyY2hTZXJ2aWNlLnNob3VsZEFkZFRyYXZlbGxlclN1YnNjcmlwdGlvbigpKSB7XHJcbiAgICAgIHNlYXJjaFNlcnZpY2UudHJhdmVsbGVySW5mb3JtYXRpb24uc3Vic2NyaWJlKFxyXG4gICAgICAgICh0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJzID0gdHJhdmVsbGVycztcclxuICAgICAgICAgIGlmICh0aGlzLnRyYXZlbGxlcnNbMF0gJiYgIXRoaXMudHJhdmVsbGVyc1swXS5hZ2VUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhdmVsbGVyc1swXS5hZ2VUeXBlID0gYWdlcy5BZHVsdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHNwbGl0VHJhdmVsbGVycyA9IHRoaXMuaGVscGVycy5zZWxlY3RlZFRyYXZlbGxlcnMoXHJcbiAgICAgICAgICAgIHRyYXZlbGxlcnMsXHJcbiAgICAgICAgICAgIFNlcnZpY2VUeXBlLkludGVybmF0aW9uYWxSYWlsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHNwbGl0VHJhdmVsbGVycy5hZHVsdHMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gc3BsaXRUcmF2ZWxsZXJzLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcbiAgICAgICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgY29uc3QgcmVzdWx0cyA9XHJcbiAgICAgIHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PElybFF1b3RlUmVzdWx0QXJyYXk+KFxyXG4gICAgICAgIHRoaXMucmVzdWx0c1Nlc3Npb25OYW1lXHJcbiAgICAgICkgfHwgW107XHJcbiAgICAvLyBpZiAocmVzdWx0cyA9PSBudWxsICYmIHRoaXMuaXNWYWxpZCkge1xyXG4gICAgLy8gICBzZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgIC8vIH1cclxuICAgIHRoaXMuX2NoZWFwZXN0UmVzdWx0UHJpY2UgPSB0aGlzLnVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHMpO1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyB8fCBbXSk7XHJcbiAgfVxyXG4gIGlybERpc2NvdW50Q2FyZHM6IElybFRyYXZlbENhcmQ7XHJcblxyXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0cyhyZXN1bHRzOiBJcmxRdW90ZVJlc3VsdEFycmF5KSB7XHJcbiAgICByZXN1bHRzWzBdPy5vdXRib3VuZC5mb3JFYWNoKChpdGVtOiBJcmxKb3VybmV5T3B0aW9uKSA9PiB7XHJcbiAgICAgIGl0ZW0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMubWFwKFxyXG4gICAgICAgICh0aWNrZXQ6IElybFRpY2tldE9wdGlvbldpdGhTZWxlY3RlZCwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgdGlja2V0LnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aWNrZXQuU2hvd0RldGFpbCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGlja2V0LnVpZCA9IGAke3RpY2tldC5pZGVudGlmaWVycy5qb3VybmV5SWRlbnRpZmllcn1fJHtpbmRleCArIDF9YDtcclxuICAgICAgICAgIHJldHVybiB0aWNrZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZnJlZXplKHJlc3VsdHMpO1xyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlSXJsUXVlcnkoKSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgSVJMRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TLFxyXG4gICAgICB7XHJcbiAgICAgICAgdGVtcFBhcmFtczogdGhpcy50ZW1wUGFyYW1zLFxyXG4gICAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2hcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xyXG5cclxuICAgIGNvbnN0IG5vdyA9IG1vbWVudCgpO1xyXG5cclxuICAgIGlmICghdGhpcy5fdHJhdmVsbGluZ0Zyb20pIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIEVudGVyIGEgRnJvbSBMb2NhdGlvbi4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX3RyYXZlbGxpbmdUbykge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgRW50ZXIgYSBUbyBMb2NhdGlvbi4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vdXRCb3VuZERhdGVUaW1lPy5pc0JlZm9yZShub3cpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgJ0RlcGFydHVyZSBEYXRlL1RpbWUgY2Fubm90IGJlIGluIHRoZSBwYXN0LidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoXHJcbiAgICAvLyAgIHRoaXMuY2hvc2VuU2VhcmNoVHlwZSA9PT0gSXJsSm91cm5leVR5cGUuUmV0dXJuSm91cm5leVxyXG4gICAgLy8gKSB7XHJcbiAgICAvLyAgIC8vIGNoZWNrIGZvciByZXR1cm4gc3BlY2lmaWMgdmFsaWRhdGlvbnMgaW4gaGVyZVxyXG5cclxuICAgIC8vICAgaWYgKHRoaXMuaW5Cb3VuZERhdGVUaW1lPy5pc1NhbWVPckJlZm9yZSh0aGlzLm91dEJvdW5kRGF0ZVRpbWUpKSB7XHJcbiAgICAvLyAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgIC8vICAgICAgICdSZXR1cm4gRGF0ZS9UaW1lIG11c3QgYmUgYWZ0ZXIgRGVwYXJ0dXJlIERhdGUvVGltZSdcclxuICAgIC8vICAgICApO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKHRoaXMudmlhKSB7XHJcbiAgICAvLyAgIGlmICghdGhpcy50ZW1wUGFyYW1zLnZpYUxvY2F0aW9uKSB7XHJcbiAgICAvLyAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIGVudGVyIGEgdmlhIGxvY2F0aW9uLicpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgKyB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPCAxKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1RoZXJlIG11c3QgYmUgYXQgbGVhc3QgMSB0cmF2ZWxsZXInKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzVmFsaWQubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDApO1xyXG4gICAgdGhpcy5tZXNzYWdlcy5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoW10pO1xyXG5cclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IE9iamVjdC5mcmVlemUoeyAuLi50aGlzLnRlbXBQYXJhbXMgfSk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgICAgSVJMRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtcyxcclxuICAgICAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogdGhpcy5vcmlnaW5hbFVzZXJTZWFyY2hcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zYXZlUmVjZW50U2VhcmNoKHRoaXMuZ2V0UmVjZW50U2VhcmNoUXVlcnkocXVlcnkpKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0U2VhcmNoKFxyXG4gICAgICAgIHRoaXMuSXJsZmV0Y2hlci5mZXRjaExpc3QocXVlcnkpLnBpcGUobWFwKChyZXN1bHQpID0+IHJlc3VsdCkpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzXHJcbiAgKTogU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHJlY2VudFNlYXJjaFF1ZXJ5OiBJSXJsU2VhcmNoQXJncyA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSlcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWwsXHJcbiAgICAgIHNlYXJjaEFyZ3M6IHJlY2VudFNlYXJjaFF1ZXJ5LFxyXG4gICAgICB0cmF2ZWxEYXRlOiB0aGlzLm91dEJvdW5kRGF0ZVRpbWUuZm9ybWF0KCksXHJcbiAgICAgIHRyYXZlbGxlcnM6IHRoaXMuaGVscGVycy5nZXRUcmF2ZWxsZXJzSWQodGhpcy50cmF2ZWxsZXJzKVxyXG4gICAgfTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlcmNoUXVlcnkocXVlcnk6IFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzKTogSUlybFNlYXJjaEFyZ3N7XHJcbiAgICBjb25zdCBzZWFyY2hRdWVyeTogSUlybFNlYXJjaEFyZ3MgID0gcXVlcnk7XHJcbiAgICBpZiAodGhpcy50cmF2ZWxsaW5nRnJvbSkge1xyXG4gICAgICBzZWFyY2hRdWVyeS50cmF2ZWxsaW5nRnJvbSA9IHRoaXMudHJhdmVsbGluZ0Zyb207XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHJhdmVsbGluZ1RvKSB7XHJcbiAgICAgIHNlYXJjaFF1ZXJ5LnRyYXZlbGxpbmdUbyA9IHRoaXMudHJhdmVsbGluZ1RvO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0UmVjZW50U2VhcmNoKHJlY2VudFNlYXJjaDogUmVjZW50U2VhcmNoKTogdm9pZCB7XHJcbiAgICB0aGlzLmpvdXJuZXlUeXBlID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Muam91cm5leVR5cGU7XHJcbiAgICB0aGlzLmlybENsYXNzID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MuY2xhc3M7XHJcbiAgICB0aGlzLnRyYXZlbGxpbmdUbyA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRyYXZlbGxpbmdUbztcclxuICAgIHRoaXMudHJhdmVsbGluZ0Zyb20gPSByZWNlbnRTZWFyY2guc2VhcmNoQXJncy50cmF2ZWxsaW5nRnJvbTtcclxuXHJcbiAgICAvLyBnZXQgb3V0Qm91bmREYXRlVGltZSwgaW5Cb3VuZERhdGVUaW1lXHJcbiAgICB0aGlzLm91dEJvdW5kRGF0ZVRpbWUgPSBtb21lbnQoXHJcbiAgICAgIHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWVcclxuICAgICk7XHJcbiAgICBpZiAocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Muam91cm5leVR5cGUgPT09IElybEpvdXJuZXlUeXBlLlJldHVybkpvdXJuZXkpIHtcclxuICAgICAgdGhpcy5pbkJvdW5kRGF0ZVRpbWUgPSBtb21lbnQoXHJcbiAgICAgICAgcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWVcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlT3V0Ym91bmREYXRlVGltZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9vdXRib3VuZF9kYXRlICYmIHRoaXMuX291dGJvdW5kX3RpbWUpIHtcclxuICAgICAgY29uc3QgdGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9vdXRib3VuZF9kYXRlLFxyXG4gICAgICAgIHRoaXMuX291dGJvdW5kX3RpbWVcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMub3V0Qm91bmREYXRlVGltZSA9IHRpbWUuaXNWYWxpZCgpID8gdGltZSA6IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVJldHVybkRhdGVUaW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JldHVybl9kYXRlICYmIHRoaXMuX3JldHVybl90aW1lKSB7XHJcbiAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX2RhdGUsXHJcbiAgICAgICAgdGhpcy5fcmV0dXJuX3RpbWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5pbkJvdW5kRGF0ZVRpbWUgPSB0aW1lLmlzVmFsaWQoKSA/IHRpbWUgOiBudWxsO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hRdWVyeSgpOiBTZWFyY2hJcmxRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICAvLyB0aGlzLnRyYXZlbGxlcnMgPSB0cmF2ZWxsZXJzO1xyXG4gICAgdGhpcy5ub09mQWR1bHRzID0gdGhpcy50cmF2ZWxsZXJzLmZpbHRlcihcclxuICAgICAgKHRyYXZlbGxlcjogVHJhdmVsbGVyKSA9PlxyXG4gICAgICAgIHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLkFkdWx0IHx8XHJcbiAgICAgICAgdHJhdmVsbGVyLmFnZVR5cGUgPT09IGFnZXMuWW91dGggfHxcclxuICAgICAgICB0cmF2ZWxsZXIuYWdlVHlwZSA9PT0gYWdlcy5TZW5pb3JcclxuICAgICkubGVuZ3RoO1xyXG4gICAgdGhpcy5ub09mQ2hpbGRyZW4gPSB0aGlzLnRyYXZlbGxlcnMuZmlsdGVyKFxyXG4gICAgICAodHJhdmVsbGVyOiBUcmF2ZWxsZXIpID0+IHRyYXZlbGxlci5hZ2VUeXBlID09PSBhZ2VzLkNoaWxkXHJcbiAgICApLmxlbmd0aDtcclxuICAgIGlmICghdGhpcy5zdXBwbGllciAmJiB0aGlzLnRyYXZlbGxpbmdGcm9tLm5hbWUpIHtcclxuICAgICAgdGhpcy5zdXBwbGllciA9IHRoaXMudHJhdmVsbGluZ0Zyb20ucmFpbHN0YXRpb24uc3VwcGxpZXI7XHJcbiAgICAgIHRoaXMuZ2V0SXJsRGlzY291bnRDYXJkcygpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXJsRGlzY291bnRDYXJkc0FycmF5ID0gZGF0YTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBxdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMgPSB7XHJcbiAgICAgIHN1cHBsaWVyOiB0aGlzLnN1cHBsaWVyLCAvLyBJUkxTdXBwbGllciFcclxuICAgICAgY291bnRyeUNvZGU6ICdHQicsXHJcbiAgICAgIGlybERpc2NvdW50Q2FyZHM6IHRoaXMuZGlzY291bnRDYXJkID8gdGhpcy5kaXNjb3VudENhcmQuaWQgOiBudWxsLFxyXG4gICAgICBjbGFzczogdGhpcy5pcmxDbGFzcywgLy8gSVJMQ2xhc3NcclxuICAgICAgb3V0Ym91bmREZXBhcnR1cmVEYXRlVGltZTogdGhpcy50ZW1wUGFyYW1zLm91dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcbiAgICAgIGRlcGFydHVyZUxvY2F0aW9uSWQ6IHRoaXMuX3RyYXZlbGxpbmdGcm9tLFxyXG4gICAgICBhcnJpdmFsTG9jYXRpb25JZDogdGhpcy5fdHJhdmVsbGluZ1RvLFxyXG4gICAgICBhZHVsdHM6IHRoaXMudGVtcFBhcmFtcy5hZHVsdHMsXHJcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4sXHJcbiAgICAgIHJldHVybkRlcGFydHVyZURhdGVUaW1lOiB0aGlzLnRlbXBQYXJhbXMucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcbiAgICAgIGpvdXJuZXlUeXBlOiB0aGlzLmpvdXJuZXlUeXBlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnRlbXBQYXJhbXMuY2hpbGRyZW4gPT09IDApIHtcclxuICAgICAgcXVlcnkuY2hpbGRyZW4gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy50ZW1wUGFyYW1zLmpvdXJuZXlUeXBlKSB7XHJcbiAgICAgIGNhc2UgSXJsSm91cm5leVR5cGUuU2luZ2xlSm91cm5leTpcclxuICAgICAgICBxdWVyeS5yZXR1cm5EZXBhcnR1cmVEYXRlVGltZSA9IG51bGw7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzPFNlYXJjaElybFF1ZXJ5VmFyaWFibGVzPihxdWVyeSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHt9XHJcblxyXG4gIHVwZGF0ZUNhbkNvbWJpbmUodGt0OiBJcmxUaWNrZXRPcHRpb24pOiB2b2lkIHtcclxuICAgICh0a3QuaWRlbnRpZmllcnMuYWxsb3dlZFdpdGggfHwgW10pLmZvckVhY2goKGFsbG93ZWQpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLl9jYW5Db21iaW5lW3RrdC50eXBlXVthbGxvd2VkLmpvdXJuZXlJZGVudGlmaWVyXSkge1xyXG4gICAgICAgIHRoaXMuX2NhbkNvbWJpbmVbdGt0LnR5cGVdW2FsbG93ZWQuam91cm5leUlkZW50aWZpZXJdID0gW1xyXG4gICAgICAgICAgYWxsb3dlZC5mYXJlSWRlbnRpZmllclxyXG4gICAgICAgIF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fY2FuQ29tYmluZVt0a3QudHlwZV1bYWxsb3dlZC5qb3VybmV5SWRlbnRpZmllcl0ucHVzaChcclxuICAgICAgICAgIGFsbG93ZWQuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldExlZ3NGcm9tSXJsSm91cm5leU9wdGlvbihyYWlsSm91cm5leU9wdGlvbjogSXJsSm91cm5leU9wdGlvbik6IGFueVtdIHtcclxuICAgIGxldCBsZWdzOiBhbnlbXSA9IFtdO1xyXG4gICAgaWYgKHJhaWxKb3VybmV5T3B0aW9uPy5zZWdtZW50cy5sZW5ndGgpIHtcclxuICAgICAgbGVncyA9IHJhaWxKb3VybmV5T3B0aW9uLnNlZ21lbnRzLm1hcCgoc2VnbWVudDogSXJsU2VnbWVudCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBvcGVyYXRvcjpcclxuICAgICAgICAgICAgc2VnbWVudC5vcGVyYXRvciB8fCByYWlsSm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ucHJvdmlkZXJJZCxcclxuICAgICAgICAgIGRlcGFydHVyZURhdGVUaW1lOiBzZWdtZW50LmRlcGFydERhdGVUaW1lLFxyXG4gICAgICAgICAgZGVwYXJ0dXJlU3RhdGlvbk5hbWU6IHNlZ21lbnQuZGVwYXJ0LFxyXG4gICAgICAgICAgYXJyaXZhbERhdGVUaW1lOiBzZWdtZW50LmFycml2ZURhdGVUaW1lLFxyXG4gICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBzZWdtZW50LmFycml2ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlZ3M7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZElybFRpY2tldE9wdGlvbihcclxuICAgIGlybEpvdXJuZXlPcHRpb246IElybEpvdXJuZXlPcHRpb24sXHJcbiAgICBpcmxUaWNrZXRPcHRpb246IElybFRpY2tldE9wdGlvbixcclxuICAgIHByb3ZpZGVySW5kZXg6IG51bWJlclxyXG4gICk6IElybFRpY2tldE9wdGlvbiB7XHJcbiAgICByZXR1cm4gaXJsSm91cm5leU9wdGlvbi5wcm92aWRlcnNbcHJvdmlkZXJJbmRleF0udGlja2V0T3B0aW9ucy5maW5kKFxyXG4gICAgICAodGlja2V0T3B0aW9uKSA9PlxyXG4gICAgICAgIHRpY2tldE9wdGlvbi50eXBlID09PSBpcmxUaWNrZXRPcHRpb24udHlwZSAmJlxyXG4gICAgICAgICh0aWNrZXRPcHRpb24ucHJpY2UgPT09IGlybFRpY2tldE9wdGlvbi5wcmljZSB8fFxyXG4gICAgICAgICAgdGlja2V0T3B0aW9uLmlkZW50aWZpZXJzLmZhcmVJZGVudGlmaWVyID09PVxyXG4gICAgICAgICAgICBpcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkU2luZ2xlSm91cm5leVRvQmFza2V0KFxyXG4gICAgc2VydmljZUlkOiBzdHJpbmcsXHJcbiAgICBpcmxRdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMsXHJcbiAgICBvdXRib3VuZDogSXJsVGlja2V0T3B0aW9uLFxyXG4gICAgaXJsSm91cm5leU9wdGlvbjogSXJsSm91cm5leU9wdGlvblxyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhzZXJ2aWNlSWQscmFpbFF1ZXJ5LGlybEpvdXJuZXlPcHRpb24pXHJcbiAgICAvLyAgIC8vIGlmIChpcmxKb3VybmV5T3B0aW9uLnVuc2VsbGFibGUpIHtcclxuICAgIC8vICAgLy8gICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIC8vICAgLy8gfVxyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5nZXREZWZhdWx0QmFza2V0KCk7XHJcbiAgICBjb25zdCBiYXNrZXQgPSBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWU7XHJcbiAgICBpZiAoYmFza2V0KSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uID0gdGhpcy5nZXRTZWxlY3RlZElybFRpY2tldE9wdGlvbihcclxuICAgICAgICBpcmxKb3VybmV5T3B0aW9uLFxyXG4gICAgICAgIG91dGJvdW5kLFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgbGVncyA9IHRoaXMuZ2V0TGVnc0Zyb21JcmxKb3VybmV5T3B0aW9uKGlybEpvdXJuZXlPcHRpb24pO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChpcmxKb3VybmV5T3B0aW9uKTtcclxuICAgICAgLy8gc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMucHJvdmlkZXI7XHJcbiAgICAgIGNvbnN0IGJhc2tldEl0ZW0gPSB7XHJcbiAgICAgICAgYmFza2V0OiBiYXNrZXQuaWQsXHJcbiAgICAgICAgc2VydmljZTogc2VydmljZUlkLFxyXG4gICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgb3V0d2FyZERldGFpbDoge1xyXG4gICAgICAgICAgICBhcnJpdmFsRGF0ZVRpbWU6IGlybEpvdXJuZXlPcHRpb24uYXJyaXZlRGF0ZVRpbWUsXHJcbiAgICAgICAgICAgIGFycml2YWxTdGF0aW9uTmFtZTogaXJsSm91cm5leU9wdGlvbi50byxcclxuICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25Db2RlOiBpcmxKb3VybmV5T3B0aW9uLnRvQ29kZSxcclxuICAgICAgICAgICAgZGVwYXJ0dXJlRGF0ZVRpbWU6IGlybEpvdXJuZXlPcHRpb24uZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25OYW1lOiBpcmxKb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25Db2RlOiBpcmxKb3VybmV5T3B0aW9uLmZyb21Db2RlLFxyXG4gICAgICAgICAgICBzdXBwbGllclRpY2tldHM6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdXBwbGllck5hbWU6IGlybEpvdXJuZXlPcHRpb24ucHJvdmlkZXJzWzBdLm5hbWUsXHJcbiAgICAgICAgICAgICAgICB0aWNrZXREZXNjcmlwdGlvbjogc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24udHlwZSxcclxuICAgICAgICAgICAgICAgIHByaWNlOiBzZWxlY3RlZElybFRpY2tldE9wdGlvbi5wcmljZSxcclxuICAgICAgICAgICAgICAgIGxlZ3NcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0cmFuc2FjdGlvbklkZW50aWZpZXI6XHJcbiAgICAgICAgICAgIGlybEpvdXJuZXlPcHRpb24uaWRlbnRpZmllcnMudHJhbnNhY3Rpb25JZGVudGlmaWVyLFxyXG4gICAgICAgICAgb3V0Ym91bmQ6IHtcclxuICAgICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgam91cm5leUlkZW50aWZpZXI6XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdXBwbGllcjogaXJsSm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ucHJvdmlkZXJJZCxcclxuICAgICAgICAgIHRlcm1zQW5kQ29uZDogdGVybXNBbmRDb25kaXRpb25zXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhZHVsdHM6IGlybFF1ZXJ5LmFkdWx0cyxcclxuICAgICAgICBwcmljZTogc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24ucHJpY2UsXHJcbiAgICAgICAgY3VycmVuY3k6IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLmN1cnJlbmN5IGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgICBzZWFyY2hRdWVyeTogaXJsUXVlcnksXHJcbiAgICAgICAgLy8gY28yUGVySXRlbTogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJJdGVtLFxyXG4gICAgICAgIC8vIGNvMlBlclBhc3NlbmdlcjogaXJsSm91cm5leU9wdGlvbi5jbzJQZXJQYXNzZW5nZXIsXHJcbiAgICAgICAgb3V0Ym91bmREYXRlOiBpcmxKb3VybmV5T3B0aW9uLmRlcGFydERhdGVUaW1lXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgIGJhc2tldEl0ZW0sXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmV0dXJuSm91cm5leVRvQmFza2V0KFxyXG4gICAgc2VydmljZUlkOiBzdHJpbmcsXHJcbiAgICBpcmxRdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMsXHJcbiAgICBpbmJvdW5kOiBJcmxUaWNrZXRPcHRpb24sXHJcbiAgICBpbkpvdXJuZXlPcHRpb246IElybEpvdXJuZXlPcHRpb25cclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG91dGJvdW5kID0gdGhpcy5vdXRib3VuZFRpY2tldDtcclxuICAgIGNvbnN0IG91dEpvdXJuZXlPcHRpb24gPSB0aGlzLm91dGJvdW5kSm91cm5leU9wdGlvbnM7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID1cclxuICAgICAgYXdhaXQgdGhpcy5iYXNrZXRTZXJ2aWNlLmdldERlZmF1bHRCYXNrZXQoKTtcclxuICAgIGNvbnN0IGJhc2tldCA9IGludEJhc2tldD8uc3ViamVjdC52YWx1ZTtcclxuICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24gPSB0aGlzLmdldFNlbGVjdGVkSXJsVGlja2V0T3B0aW9uKFxyXG4gICAgICAgIG91dEpvdXJuZXlPcHRpb24sXHJcbiAgICAgICAgb3V0Ym91bmQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBvdXRib3VuZExlZ3MgPSB0aGlzLmdldExlZ3NGcm9tSXJsSm91cm5leU9wdGlvbihvdXRKb3VybmV5T3B0aW9uKTtcclxuICAgICAgY29uc3QgaW5ib3VuZExlZ3MgPSB0aGlzLmdldExlZ3NGcm9tSXJsSm91cm5leU9wdGlvbihpbkpvdXJuZXlPcHRpb24pO1xyXG4gICAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChvdXRKb3VybmV5T3B0aW9uKTtcclxuICAgICAgY29uc3QgYmFza2V0SXRlbSA9IHtcclxuICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWQsXHJcbiAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICBvdXR3YXJkRGV0YWlsOiB7XHJcbiAgICAgICAgICAgIGFycml2YWxEYXRlVGltZTogb3V0Sm91cm5leU9wdGlvbi5hcnJpdmVEYXRlVGltZSxcclxuICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25OYW1lOiBvdXRKb3VybmV5T3B0aW9uLnRvLFxyXG4gICAgICAgICAgICBhcnJpdmFsU3RhdGlvbkNvZGU6IG91dEpvdXJuZXlPcHRpb24udG9Db2RlLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uQ29kZTogb3V0Sm91cm5leU9wdGlvbi5mcm9tQ29kZSxcclxuICAgICAgICAgICAgZGVwYXJ0dXJlRGF0ZVRpbWU6IG91dEpvdXJuZXlPcHRpb24uZGVwYXJ0RGF0ZVRpbWUsXHJcbiAgICAgICAgICAgIGRlcGFydHVyZVN0YXRpb25OYW1lOiBvdXRKb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAgICAgICAgIHN1cHBsaWVyVGlja2V0czogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogb3V0Sm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ubmFtZSxcclxuICAgICAgICAgICAgICAgIHRpY2tldERlc2NyaXB0aW9uOiBzZWxlY3RlZElybFRpY2tldE9wdGlvbi50eXBlLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLnByaWNlLFxyXG4gICAgICAgICAgICAgICAgbGVnczogb3V0Ym91bmRMZWdzXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaW53YXJkRGV0YWlsOiB7XHJcbiAgICAgICAgICAgIGFycml2YWxEYXRlVGltZTogaW5Kb3VybmV5T3B0aW9uLmFycml2ZURhdGVUaW1lLFxyXG4gICAgICAgICAgICBhcnJpdmFsU3RhdGlvbk5hbWU6IGluSm91cm5leU9wdGlvbi50byxcclxuICAgICAgICAgICAgYXJyaXZhbFN0YXRpb25Db2RlOiBpbkpvdXJuZXlPcHRpb24udG9Db2RlLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uQ29kZTogaW5Kb3VybmV5T3B0aW9uLmZyb21Db2RlLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVEYXRlVGltZTogaW5Kb3VybmV5T3B0aW9uLmRlcGFydERhdGVUaW1lLFxyXG4gICAgICAgICAgICBkZXBhcnR1cmVTdGF0aW9uTmFtZTogaW5Kb3VybmV5T3B0aW9uLmZyb20sXHJcbiAgICAgICAgICAgIHN1cHBsaWVyVGlja2V0czogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN1cHBsaWVyTmFtZTogaW5Kb3VybmV5T3B0aW9uLnByb3ZpZGVyc1swXS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgdGlja2V0RGVzY3JpcHRpb246IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLnR5cGUsXHJcbiAgICAgICAgICAgICAgICBsZWdzOiBpbmJvdW5kTGVnc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRyYW5zYWN0aW9uSWRlbnRpZmllcjogb3V0Ym91bmQuaWRlbnRpZmllcnMudHJhbnNhY3Rpb25JZGVudGlmaWVyLFxyXG4gICAgICAgICAgb3V0Ym91bmQ6IHtcclxuICAgICAgICAgICAgZmFyZUlkZW50aWZpZXJzOiBbXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuZmFyZUlkZW50aWZpZXJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgam91cm5leUlkZW50aWZpZXI6XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24uaWRlbnRpZmllcnMuam91cm5leUlkZW50aWZpZXJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdXBwbGllcjogb3V0Sm91cm5leU9wdGlvbi5wcm92aWRlcnNbMF0ucHJvdmlkZXJJZCxcclxuICAgICAgICAgIHRlcm1zQW5kQ29uZDogdGVybXNBbmRDb25kaXRpb25zXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhZHVsdHM6IGlybFF1ZXJ5LmFkdWx0cyxcclxuICAgICAgICBwcmljZTogc2VsZWN0ZWRJcmxUaWNrZXRPcHRpb24ucHJpY2UsXHJcbiAgICAgICAgY3VycmVuY3k6IHNlbGVjdGVkSXJsVGlja2V0T3B0aW9uLmN1cnJlbmN5IGFzIEN1cnJlbmN5Q29kZSxcclxuICAgICAgICBzZWFyY2hRdWVyeTogaXJsUXVlcnksXHJcbiAgICAgICAgb3V0Ym91bmREYXRlOiBvdXRKb3VybmV5T3B0aW9uLmRlcGFydERhdGVUaW1lXHJcbiAgICAgICAgLy8gY28yUGVySXRlbTogb3V0Ym91bmQuY28yUGVySXRlbSxcclxuICAgICAgICAvLyBjbzJQZXJQYXNzZW5nZXI6IG91dGJvdW5kLmNvMlBlclBhc3NlbmdlclxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmZpbHRlclNlbGVjdGVkKCk7XHJcbiAgICAgIHJldHVybiB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgICAgICAgYmFza2V0SXRlbSxcclxuICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMudHJhdmVsbGVyc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogSUNoZWFwZXN0UHJpY2Uge1xyXG4gICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBjdXJyZW5jeSA9XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LmN1cnJlbmN5O1xyXG4gICAgY29uc3QgcHJpY2UgPSB0aGlzLmZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFtb3VudDogcHJpY2UsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogY3VycmVuY3lcclxuICAgIH07XHJcbiAgfVxyXG4gIGZpbmRDaGVhcGVzdFRpY2tldChyZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2NoZWFwZXN0Rmlyc3QgPSBudWxsO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RTdGFuZGFyZCA9IG51bGw7XHJcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IGNoZWFwZXN0QXJyOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgIHJlc3VsdHMubWFwKChyZXN1bHQpID0+IHtcclxuICAgICAgcmVzdWx0Lm91dGJvdW5kLm1hcCgob3V0KSA9PiB7XHJcbiAgICAgICAgb3V0LnByb3ZpZGVycy5tYXAoKHRrdCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2hlYXBlc3RUaWNrZXQ6IG51bWJlciA9IHRrdC5jaGVhcGVzdFRpY2tldC5wcmljZTtcclxuICAgICAgICAgIHRrdC50aWNrZXRPcHRpb25zLm1hcCgodGt0T3B0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRrdFByaWNlID0gdGt0T3B0aW9uLnByaWNlO1xyXG4gICAgICAgICAgICBjb25zdCB0a3RDbGFzcyA9IHRrdE9wdGlvbi5jbGFzcztcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHRrdENsYXNzID09PSAnRmlyc3QnICYmXHJcbiAgICAgICAgICAgICAgKHRoaXMuX2NoZWFwZXN0Rmlyc3Q/LnByaWNlID4gdGt0UHJpY2UgfHwgIXRoaXMuX2NoZWFwZXN0Rmlyc3QpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NoZWFwZXN0Rmlyc3QgPSB0a3RPcHRpb247XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgdGt0Q2xhc3MgPT09ICdTdGFuZGFyZCcgJiZcclxuICAgICAgICAgICAgICAodGhpcy5fY2hlYXBlc3RTdGFuZGFyZD8ucHJpY2UgPiB0a3RQcmljZSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuX2NoZWFwZXN0U3RhbmRhcmQpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NoZWFwZXN0U3RhbmRhcmQgPSB0a3RPcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRrdFByaWNlID09PSBjaGVhcGVzdFRpY2tldCkge1xyXG4gICAgICAgICAgICAgIGNoZWFwZXN0QXJyLnB1c2goY2hlYXBlc3RUaWNrZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBNYXRoLm1pbiguLi5jaGVhcGVzdEFycik7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNvcnQgcmVzdWx0cyBieSBwcmljZVxyXG4gICAqXHJcbiAgICogQHJldHVybnNcclxuICAgKiBAbWVtYmVyb2YgaXJsLWVudGVycHJpc2Utc2VhcmNoXHJcbiAgICovXHJcbiAgc29ydEJ5UHJpY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnByaWNlRGlyID0gIXRoaXMucHJpY2VEaXI7XHJcbiAgICBjb25zdCByZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdID0gdGhpcy5maWx0ZXJTZWxlY3RlZCh0aGlzLl9pc0ZpbHRlcmVkKTtcclxuXHJcbiAgICBjb25zdCBieVByaWNlID0gKGE6IElybEpvdXJuZXlPcHRpb24sIGI6IElybEpvdXJuZXlPcHRpb24pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMucHJpY2VEaXJcclxuICAgICAgICA/IGEucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LnByaWNlIC1cclxuICAgICAgICAgICAgYi5wcm92aWRlcnNbMF0uY2hlYXBlc3RUaWNrZXQucHJpY2VcclxuICAgICAgICA6IGIucHJvdmlkZXJzWzBdLmNoZWFwZXN0VGlja2V0LnByaWNlIC1cclxuICAgICAgICAgICAgYS5wcm92aWRlcnNbMF0uY2hlYXBlc3RUaWNrZXQucHJpY2U7XHJcbiAgICB9O1xyXG4gICAgcmVzdWx0c1swXS5vdXRib3VuZCA9IHJlc3VsdHNbMF0ub3V0Ym91bmQuc29ydChieVByaWNlKTtcclxuICAgIHJlc3VsdHNbMF0ucmV0dXJuID0gcmVzdWx0c1swXS5yZXR1cm4uc29ydChieVByaWNlKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCByZXN1bHRzIGJ5IGRlcGFydHVyZSB0aW1lXHJcbiAgICpcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqIEBtZW1iZXJvZiBpcmwtZW50ZXJwcmlzZS1zZWFyY2hcclxuICAgKi9cclxuICBzb3J0QnlEYXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRlRGlyID0gIXRoaXMuZGF0ZURpcjtcclxuXHJcbiAgICBjb25zdCByZXN1bHRzOiBJcmxKb3VybmV5T3B0aW9uc1tdID0gdGhpcy5maWx0ZXJTZWxlY3RlZCh0aGlzLl9pc0ZpbHRlcmVkKTtcclxuICAgIGNvbnN0IGJ5RGF0ZSA9IChhOiBJcmxKb3VybmV5T3B0aW9uLCBiOiBJcmxKb3VybmV5T3B0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGVEaXJcclxuICAgICAgICA/IG1vbWVudChhLmRlcGFydERhdGVUaW1lKS51bml4KCkgLSBtb21lbnQoYi5kZXBhcnREYXRlVGltZSkudW5peCgpXHJcbiAgICAgICAgOiBtb21lbnQoYi5kZXBhcnREYXRlVGltZSkudW5peCgpIC0gbW9tZW50KGEuZGVwYXJ0RGF0ZVRpbWUpLnVuaXgoKTtcclxuICAgIH07XHJcbiAgICByZXN1bHRzWzBdLm91dGJvdW5kID0gcmVzdWx0c1swXS5vdXRib3VuZC5zb3J0KGJ5RGF0ZSk7XHJcbiAgICByZXN1bHRzWzBdLnJldHVybiA9IHJlc3VsdHNbMF0ucmV0dXJuLnNvcnQoYnlEYXRlKTtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgYWRkT3V0Ym91bmRBbmRGaWx0ZXIoXHJcbiAgICB0aWNrZXQ6IElybFRpY2tldE9wdGlvbldpdGhTZWxlY3RlZCxcclxuICAgIGZ1bGxUaWNrZXQ6IElybEpvdXJuZXlPcHRpb25cclxuICApOiB2b2lkIHtcclxuICAgIHRoaXMub3V0Ym91bmRKb3VybmV5T3B0aW9ucyA9IGZ1bGxUaWNrZXQ7XHJcbiAgICB0aGlzLm91dGJvdW5kVGlja2V0ID0gdGlja2V0O1xyXG4gICAgdGhpcy5maWx0ZXJTZWxlY3RlZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIGZpbHRlclNlbGVjdGVkKGZpbHRlck91dGJvdW5kOiBib29sZWFuID0gZmFsc2UpOiBJcmxKb3VybmV5T3B0aW9uc1tdIHtcclxuICAgIGNvbnN0IHJlc3VsdHM6IElybEpvdXJuZXlPcHRpb25zW10gPSB0aGlzLmhlbHBlcnMuY2xvbmUoXHJcbiAgICAgIHRoaXMuZnVsbFJlc3VsdHMgYXMgSXJsSm91cm5leU9wdGlvbnNbXVxyXG4gICAgKTtcclxuICAgIGlmIChmaWx0ZXJPdXRib3VuZCkge1xyXG4gICAgICB0aGlzLl9pc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgICAgcmVzdWx0c1swXS5vdXRib3VuZCA9IFtcclxuICAgICAgICByZXN1bHRzWzBdLm91dGJvdW5kLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGl0ZW0uZGVwYXJ0RGF0ZVRpbWUgPT09XHJcbiAgICAgICAgICAgICAgdGhpcy5fb3V0Ym91bmRKb3VybmV5T3B0aW9ucy5kZXBhcnREYXRlVGltZSAmJlxyXG4gICAgICAgICAgICBpdGVtLmFycml2ZURhdGVUaW1lID09PSB0aGlzLl9vdXRib3VuZEpvdXJuZXlPcHRpb25zLmFycml2ZURhdGVUaW1lXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIF07XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMgPVxyXG4gICAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmRbMF0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYywgdGlja2V0OiBJcmxUaWNrZXRPcHRpb25XaXRoU2VsZWN0ZWQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRpY2tldC51aWQgPT09IHRoaXMuX291dGJvdW5kVGlja2V0LnVpZCkge1xyXG4gICAgICAgICAgICAgIHRpY2tldC5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYWNjLnB1c2godGlja2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2lzRmlsdGVyZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5vdXRib3VuZEpvdXJuZXlPcHRpb25zID0gbnVsbDtcclxuICAgICAgdGhpcy5vdXRib3VuZFRpY2tldCA9IG51bGw7XHJcbiAgICAgIHJlc3VsdHNbMF0ub3V0Ym91bmQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGl0ZW0ucHJvdmlkZXJzWzBdLnRpY2tldE9wdGlvbnMubWFwKFxyXG4gICAgICAgICAgKHRpY2tldDogSXJsVGlja2V0T3B0aW9uV2l0aFNlbGVjdGVkKSA9PiB7XHJcbiAgICAgICAgICAgIHRpY2tldC5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aWNrZXQuU2hvd0RldGFpbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4gdGlja2V0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBnZXQgaXJsIHN0YXRpb24gbG9jYXRpb25zXHJcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgdGVybSB0byBzZWFyY2hcclxuICAgKiBAcGFyYW0gaXNMb2FkaW5nIC0gQmVoYXZpb3JTdWJqZWN0IHNvIHdlIGtub3cgc29tZXRoaW5nIGlzIGhhcHBlbmluZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SXJsRGlzY291bnRDYXJkcygpOiBPYnNlcnZhYmxlPElybFRyYXZlbENhcmRbXT4ge1xyXG4gICAgY29uc3Qgc3VwcGxpZXIgPSB0aGlzLnN1cHBsaWVyO1xyXG4gICAgcmV0dXJuIHRoaXMuaXJsRGlzY291bnRDYXJkc0ZldGNoZXIuZmV0Y2hMaXN0KHtcclxuICAgICAgc3VwcGxpZXJcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKGluSm91cm5leU9wdGlvbjogSXJsSm91cm5leU9wdGlvbikge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdGYXJlIFJ1bGVzJyxcclxuICAgICAgICB2YWx1ZTogaW5Kb3VybmV5T3B0aW9uPy5wcm92aWRlcnNbMF0/LnRpY2tldE9wdGlvbnNbMF0/LmZhcmVSdWxlc1xyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlYXJjaCgpOiBPYnNlcnZhYmxlPFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQ+e1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICBjb25zdCBxdWVyeTogU2VhcmNoSXJsUXVlcnlWYXJpYWJsZXMgPSB0aGlzLmdldFNlYXJjaFF1ZXJ5KCk7XHJcbiAgICAgIGNvbnN0IGZhdm91cml0ZVNlYXJjaFF1ZXJ5OiBJSXJsU2VhcmNoQXJncyA9IHRoaXMudXBkYXRlU2VyY2hRdWVyeShxdWVyeSk7XHJcbiAgICAgIGNvbnN0IHNlYXJjaEluZm8gPSB7XHJcbiAgICAgICAgbmFtZTogYCR7bW9tZW50KCl9YCxcclxuICAgICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWwsXHJcbiAgICAgICAgc2VhcmNoQXJnczogZmF2b3VyaXRlU2VhcmNoUXVlcnlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVGYXZvdXJpdGVTZWFyY2goc2VhcmNoSW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|