ca-components 1.0.76 → 1.0.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/ca-chart/ca-chart.component.mjs +200 -120
- package/esm2022/lib/components/ca-chart/enums/chart-annotation.enum.mjs +11 -0
- package/esm2022/lib/components/ca-chart/enums/chart-plugin-ids.enum.mjs +2 -1
- package/esm2022/lib/components/ca-chart/enums/index.mjs +2 -1
- package/esm2022/lib/components/ca-chart/models/chart-config.model.mjs +1 -1
- package/esm2022/lib/components/ca-chart/models/chart-legend-config.model.mjs +2 -0
- package/esm2022/lib/components/ca-chart/models/chart-legend-property.model.mjs +2 -0
- package/esm2022/lib/components/ca-chart/models/index.mjs +3 -1
- package/esm2022/lib/components/ca-chart/utils/helpers/chart.helper.mjs +2 -2
- package/esm2022/lib/components/ca-chart-manager/ca-chart-manager.component.mjs +4 -4
- package/esm2022/lib/components/ca-dropdown-menu/ca-dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/components/ca-input/ca-input.component.mjs +1 -1
- package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +21 -22
- package/esm2022/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.mjs +6 -0
- package/esm2022/lib/components/ca-map/ca-map.component.mjs +137 -210
- package/esm2022/lib/components/ca-map/enums/google-map.enum.mjs +2 -1
- package/esm2022/lib/components/ca-map/enums/map-marker-string.enum.mjs +2 -1
- package/esm2022/lib/components/ca-map/models/map.model.mjs +1 -1
- package/esm2022/lib/components/ca-map/utils/constants/index.mjs +2 -1
- package/esm2022/lib/components/ca-map/utils/constants/map-marker-icons.constants.mjs +119 -0
- package/esm2022/lib/components/ca-map/utils/constants/map-options.constants.mjs +1 -2
- package/esm2022/lib/components/ca-map/utils/helpers/map-marker-icon.helper.mjs +50 -12
- package/esm2022/lib/components/ca-map/utils/services/index.mjs +2 -0
- package/esm2022/lib/components/ca-map/utils/services/map-marker-icon.service.mjs +137 -0
- package/esm2022/lib/components/ca-map-dropdown/ca-map-dropdown.component.mjs +25 -11
- package/esm2022/lib/components/ca-progress-bar/ca-progress-bar.component.mjs +15 -15
- package/esm2022/lib/constants/map.constant.mjs +131 -131
- package/esm2022/lib/pipes/index.mjs +19 -0
- package/esm2022/lib/pipes/unit-position.pipe.mjs +24 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ca-components.mjs +993 -653
- package/fesm2022/ca-components.mjs.map +1 -1
- package/lib/components/ca-chart/ca-chart.component.d.ts +9 -4
- package/lib/components/ca-chart/enums/chart-annotation.enum.d.ts +10 -0
- package/lib/components/ca-chart/enums/chart-plugin-ids.enum.d.ts +2 -1
- package/lib/components/ca-chart/enums/index.d.ts +1 -0
- package/lib/components/ca-chart/models/chart-config.model.d.ts +1 -0
- package/lib/components/ca-chart/models/chart-legend-config.model.d.ts +6 -0
- package/lib/components/ca-chart/models/chart-legend-property.model.d.ts +7 -0
- package/lib/components/ca-chart/models/index.d.ts +2 -0
- package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
- package/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.d.ts +4 -0
- package/lib/components/ca-map/ca-map.component.d.ts +22 -25
- package/lib/components/ca-map/enums/google-map.enum.d.ts +2 -1
- package/lib/components/ca-map/enums/map-marker-string.enum.d.ts +2 -1
- package/lib/components/ca-map/models/map.model.d.ts +8 -3
- package/lib/components/ca-map/utils/constants/index.d.ts +1 -0
- package/lib/components/ca-map/utils/constants/map-marker-icons.constants.d.ts +6 -0
- package/lib/components/ca-map/utils/helpers/map-marker-icon.helper.d.ts +2 -0
- package/lib/components/ca-map/utils/services/index.d.ts +1 -0
- package/lib/components/ca-map/utils/services/map-marker-icon.service.d.ts +23 -0
- package/lib/components/ca-map-dropdown/ca-map-dropdown.component.d.ts +5 -3
- package/lib/components/ca-progress-bar/ca-progress-bar.component.d.ts +3 -1
- package/lib/pipes/index.d.ts +18 -0
- package/lib/pipes/unit-position.pipe.d.ts +7 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -1,36 +1,45 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
2
|
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
+
// Modules
|
|
4
5
|
import { AngularSvgIconModule } from 'angular-svg-icon';
|
|
5
6
|
import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
|
|
7
|
+
import { GoogleMap, GoogleMapsModule } from '@angular/google-maps';
|
|
6
8
|
// Components
|
|
7
9
|
import { CaMapDropdownComponent } from '../ca-map-dropdown/ca-map-dropdown.component';
|
|
8
10
|
import { CaAppTooltipV2Component } from '../ca-app-tooltip-v2/ca-app-tooltip-v2.component';
|
|
9
11
|
// Enums
|
|
10
12
|
import { GoogleMapEnum } from '../ca-map/enums/google-map.enum';
|
|
13
|
+
import { MapMarkerStringEnum } from './enums';
|
|
11
14
|
// Helpers
|
|
12
15
|
import { MapHelper } from '../ca-map/utils/helpers/map.helper';
|
|
13
16
|
// Constants
|
|
14
17
|
import { MapInfoWindowOptionsConstants, MapOptionsConstants, } from './utils/constants';
|
|
15
18
|
import { MapConstants } from '../../constants/map.constant';
|
|
16
19
|
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "
|
|
18
|
-
import * as i2 from "@angular/
|
|
19
|
-
import * as i3 from "angular
|
|
20
|
-
import * as i4 from "
|
|
20
|
+
import * as i1 from "./utils/services";
|
|
21
|
+
import * as i2 from "@angular/google-maps";
|
|
22
|
+
import * as i3 from "@angular/common";
|
|
23
|
+
import * as i4 from "angular-svg-icon";
|
|
24
|
+
import * as i5 from "@ng-bootstrap/ng-bootstrap";
|
|
21
25
|
export class CaMapComponent {
|
|
22
|
-
constructor(cd
|
|
26
|
+
constructor(cd, el, renderer,
|
|
27
|
+
// Services
|
|
28
|
+
markerIconService) {
|
|
23
29
|
this.cd = cd;
|
|
30
|
+
this.el = el;
|
|
31
|
+
this.renderer = renderer;
|
|
32
|
+
this.markerIconService = markerIconService;
|
|
24
33
|
this.resetSelectedMarkerItem = new EventEmitter();
|
|
25
34
|
this.clusterMarkerClick = new EventEmitter();
|
|
26
35
|
this.clusterListScrollEvent = new EventEmitter();
|
|
27
36
|
this.getInfoWindowData = new EventEmitter();
|
|
28
37
|
this.boundsChanged = new EventEmitter();
|
|
29
38
|
this.openInMapEvent = new EventEmitter();
|
|
39
|
+
this.destroy$ = new Subject();
|
|
40
|
+
this.currentlyOpenWindow = false;
|
|
30
41
|
this.directionService = new google.maps.DirectionsService();
|
|
31
42
|
this.directionsRenderers = [];
|
|
32
|
-
this.initialIcons = [];
|
|
33
|
-
this.initialMarkerIcons = [];
|
|
34
43
|
this.infoWindowOptions = MapInfoWindowOptionsConstants.mapInfoWindowOptions;
|
|
35
44
|
this.mapOptions = MapOptionsConstants.defaultMapOptions;
|
|
36
45
|
this.mapZoom = MapOptionsConstants.defaultMapZoom;
|
|
@@ -43,34 +52,25 @@ export class CaMapComponent {
|
|
|
43
52
|
this.openedInfoWindowData = null;
|
|
44
53
|
this.areaFilterData = MapOptionsConstants.areaFilterData;
|
|
45
54
|
this.isAreaFilterActive = false;
|
|
46
|
-
this.
|
|
55
|
+
this.mapStyles = MapConstants.GOOGLE_MAP_STYLES;
|
|
56
|
+
this.clusterMarkerIds = [];
|
|
57
|
+
this.routingMarkerIds = [];
|
|
58
|
+
this.isMarkerDropdownOpen = false;
|
|
59
|
+
this.isClusterDropdownOpen = false;
|
|
60
|
+
this.openDropdownTimeout = 0;
|
|
61
|
+
this.mapStyleId = 'd681904a390a8402';
|
|
47
62
|
}
|
|
48
63
|
set data(values) {
|
|
49
64
|
this.handleMapData(values);
|
|
50
65
|
}
|
|
51
66
|
ngOnInit() {
|
|
52
|
-
this.storeInitialIconForMarker();
|
|
53
|
-
this.storeInitialIconForRoutingMarker();
|
|
54
67
|
// Reset all icons to their initial state on page load
|
|
55
68
|
this.resetMarkersIcons();
|
|
56
|
-
this.
|
|
69
|
+
this.getServiceData();
|
|
57
70
|
}
|
|
58
|
-
|
|
59
|
-
this.
|
|
60
|
-
|
|
61
|
-
this.initialMarkerIcons[index] = {
|
|
62
|
-
url: marker.icon.url,
|
|
63
|
-
labelOrigin: marker.icon.labelOrigin,
|
|
64
|
-
zIndex: marker.options?.zIndex ?? 1,
|
|
65
|
-
};
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
storeInitialIconForRoutingMarker() {
|
|
69
|
-
this.mapData.routingMarkers?.forEach((marker, index) => {
|
|
70
|
-
this.initialIcons[index] = {
|
|
71
|
-
url: marker.icon.url,
|
|
72
|
-
labelOrigin: marker.icon.labelOrigin,
|
|
73
|
-
};
|
|
71
|
+
ngAfterViewInit() {
|
|
72
|
+
this.maps.googleMap?.addListener('click', () => {
|
|
73
|
+
this.closeInfoWindow();
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
76
|
onClusterMarkerClick(markerItem) {
|
|
@@ -111,20 +111,24 @@ export class CaMapComponent {
|
|
|
111
111
|
travelMode: google.maps.TravelMode.BICYCLING,
|
|
112
112
|
};
|
|
113
113
|
this.directionService.route(request, (result, status) => {
|
|
114
|
-
if (status === google.maps.DirectionsStatus.OK &&
|
|
114
|
+
if (status === google.maps.DirectionsStatus.OK &&
|
|
115
|
+
result?.routes[0]) {
|
|
115
116
|
const directionsRenderer = new google.maps.DirectionsRenderer({
|
|
116
117
|
suppressInfoWindows: true,
|
|
117
118
|
suppressMarkers: true,
|
|
118
119
|
preserveViewport: true,
|
|
119
120
|
polylineOptions: {
|
|
120
|
-
strokeColor: route.strokeColor ||
|
|
121
|
+
strokeColor: route.strokeColor ||
|
|
122
|
+
GoogleMapEnum.STROKE_COLOR,
|
|
121
123
|
strokeOpacity: !route.isDashed
|
|
122
|
-
? route.strokeOpacity ||
|
|
124
|
+
? route.strokeOpacity ||
|
|
125
|
+
GoogleMapEnum.STROKE_OPACITY
|
|
123
126
|
: 0,
|
|
124
|
-
strokeWeight: route.strokeWeight ||
|
|
127
|
+
strokeWeight: route.strokeWeight ||
|
|
128
|
+
GoogleMapEnum.STROKE_WEIGHT,
|
|
125
129
|
icons: route.isDashed
|
|
126
|
-
? route.dashedLineStyle ??
|
|
127
|
-
MapOptionsConstants.routingDashedLineIcon
|
|
130
|
+
? (route.dashedLineStyle ??
|
|
131
|
+
MapOptionsConstants.routingDashedLineIcon)
|
|
128
132
|
: null,
|
|
129
133
|
},
|
|
130
134
|
});
|
|
@@ -139,112 +143,31 @@ export class CaMapComponent {
|
|
|
139
143
|
return;
|
|
140
144
|
}
|
|
141
145
|
}
|
|
142
|
-
onRoutingMarkerClick(i, event, markeritem) {
|
|
143
|
-
// if (markeritem?.infoWindowContent) {
|
|
144
|
-
// if (
|
|
145
|
-
// this.currentlyOpenWindowIndexRouting === i &&
|
|
146
|
-
// this.currentlyOpenWindowRouting
|
|
147
|
-
// ) {
|
|
148
|
-
// const infoWindow = this.infoWindowsViewRouting.toArray()[i];
|
|
149
|
-
// // Close the currently open info window and reset the index
|
|
150
|
-
// this.mapData.routingMarkers!.map((item: IMapMarkers, index: number) => {
|
|
151
|
-
// if (index === i) {
|
|
152
|
-
// item.icon = {
|
|
153
|
-
// url: this.initialIcons[index]!.url,
|
|
154
|
-
// labelOrigin: this.initialIcons[index]!.labelOrigin,
|
|
155
|
-
// };
|
|
156
|
-
// }
|
|
157
|
-
// });
|
|
158
|
-
// infoWindow.close();
|
|
159
|
-
// this.currentlyOpenWindowIndexRouting = null;
|
|
160
|
-
// } else {
|
|
161
|
-
// const markerIndex = this.markerRouting.toArray()[i];
|
|
162
|
-
// const infoWindow = this.infoWindowsViewRouting.toArray()[i];
|
|
163
|
-
// if (this.currentlyOpenWindowRouting) {
|
|
164
|
-
// this.currentlyOpenWindowRouting.close();
|
|
165
|
-
// }
|
|
166
|
-
// if (infoWindow) {
|
|
167
|
-
// // Restore the previous icon for the previously focused routing marker
|
|
168
|
-
// if (
|
|
169
|
-
// this.focusedIconRouting !== undefined &&
|
|
170
|
-
// this.focusedIconRouting !== i
|
|
171
|
-
// ) {
|
|
172
|
-
// const previousFocusedItem =
|
|
173
|
-
// this.mapData.routingMarkers![this.focusedIconRouting];
|
|
174
|
-
// if (previousFocusedItem) {
|
|
175
|
-
// previousFocusedItem.icon = {
|
|
176
|
-
// url: this.initialIcons[this.focusedIconRouting].url,
|
|
177
|
-
// labelOrigin:
|
|
178
|
-
// this.initialIcons[this.focusedIconRouting].labelOrigin,
|
|
179
|
-
// };
|
|
180
|
-
// }
|
|
181
|
-
// }
|
|
182
|
-
// // Update the current marker
|
|
183
|
-
// this.mapData.routingMarkers!.map(
|
|
184
|
-
// (item: IMapMarkers, index: number) => {
|
|
185
|
-
// if (index === i) {
|
|
186
|
-
// this.previousIconUrlRouting = item.icon ? item.icon.url : '';
|
|
187
|
-
// this.focusedIconRouting = i;
|
|
188
|
-
// this.showLabel = false;
|
|
189
|
-
// item.icon = {
|
|
190
|
-
// url:
|
|
191
|
-
// this.mapData.isUnitViewStops || this.mapData.isDriverMiles
|
|
192
|
-
// ? item.icon!.url
|
|
193
|
-
// : MapSvgRoutes.markerSvgRoute,
|
|
194
|
-
// };
|
|
195
|
-
// } else {
|
|
196
|
-
// this.showLabel = true;
|
|
197
|
-
// }
|
|
198
|
-
// }
|
|
199
|
-
// );
|
|
200
|
-
// infoWindow.open(markerIndex);
|
|
201
|
-
// this.currentlyOpenWindowRouting = infoWindow;
|
|
202
|
-
// this.currentlyOpenWindowIndexRouting = i;
|
|
203
|
-
// }
|
|
204
|
-
// }
|
|
205
|
-
// this.markerClick.emit(markeritem);
|
|
206
|
-
// } else {
|
|
207
|
-
// return;
|
|
208
|
-
// }
|
|
209
|
-
}
|
|
210
|
-
ngAfterViewInit() {
|
|
211
|
-
this.maps.googleMap?.addListener('click', () => {
|
|
212
|
-
this.closeInfoWindow();
|
|
213
|
-
this.mapData.routingMarkers?.map((item, i) => {
|
|
214
|
-
if (i === this.focusedIconRouting) {
|
|
215
|
-
item.icon = {
|
|
216
|
-
url: this.initialIcons[i].url,
|
|
217
|
-
};
|
|
218
|
-
this.cd.detectChanges();
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
146
|
resetMarkersIcons() {
|
|
224
147
|
this.mapData.markers?.map((marker, index) => {
|
|
148
|
+
const markerIcon = this.el.nativeElement.querySelector('#marker-' + marker.id);
|
|
149
|
+
this.renderer.removeClass(markerIcon, MapMarkerStringEnum.SELECTED);
|
|
150
|
+
this.isMarkerDropdownOpen = false;
|
|
225
151
|
return {
|
|
226
152
|
...marker,
|
|
227
|
-
icon: {
|
|
228
|
-
...marker.icon,
|
|
229
|
-
scaledSize: marker.isLargeMarker
|
|
230
|
-
? MapOptionsConstants.largeMarkerSize
|
|
231
|
-
: MapOptionsConstants.defaultMarkerSize,
|
|
232
|
-
},
|
|
233
153
|
options: { zIndex: index + 1 },
|
|
234
154
|
};
|
|
235
155
|
});
|
|
236
|
-
this.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
url: marker.icon.url,
|
|
242
|
-
labelOrigin: marker.icon.labelOrigin,
|
|
243
|
-
};
|
|
156
|
+
this.mapData.clusterMarkers?.map((clusterMarker, index) => {
|
|
157
|
+
const clusterId = this.getClusterId(clusterMarker);
|
|
158
|
+
const markerIcon = this.el.nativeElement.querySelector('#cluster-' + clusterId);
|
|
159
|
+
this.renderer.removeClass(markerIcon, MapMarkerStringEnum.SELECTED);
|
|
160
|
+
this.isClusterDropdownOpen = false;
|
|
244
161
|
});
|
|
162
|
+
this.cd.detectChanges();
|
|
245
163
|
}
|
|
246
164
|
onMapReady(mapInstance) {
|
|
247
165
|
this.map = mapInstance;
|
|
166
|
+
if (this.mapData?.darkMode) {
|
|
167
|
+
const styledMapType = new google.maps.StyledMapType(MapConstants.GOOGLE_MAP_DARK_STYLES);
|
|
168
|
+
this.map.mapTypes.set(GoogleMapEnum.DARK_MAP, styledMapType);
|
|
169
|
+
this.map.setMapTypeId(GoogleMapEnum.DARK_MAP);
|
|
170
|
+
}
|
|
248
171
|
if (this.mapData.stateBoundariesUrl) {
|
|
249
172
|
const stateBoundariesUrl = this.mapData.stateBoundariesUrl.url;
|
|
250
173
|
this.maps.googleMap?.data.loadGeoJson(stateBoundariesUrl);
|
|
@@ -302,63 +225,54 @@ export class CaMapComponent {
|
|
|
302
225
|
onClusterBackButtonClick() {
|
|
303
226
|
this.resetSelectedMarkerItem.emit(true);
|
|
304
227
|
}
|
|
305
|
-
getNewData(data) {
|
|
306
|
-
const newMarkers = data?.markers?.map((marker) => {
|
|
307
|
-
const isSelectedMarker = this.checkInfoWindowPosition(marker, this.openedInfoWindowData);
|
|
308
|
-
if (isSelectedMarker) {
|
|
309
|
-
const newMarkerData = {
|
|
310
|
-
...marker,
|
|
311
|
-
icon: {
|
|
312
|
-
...marker.icon,
|
|
313
|
-
scaledSize: MapOptionsConstants.largeMarkerSize,
|
|
314
|
-
},
|
|
315
|
-
options: { zIndex: 999 },
|
|
316
|
-
};
|
|
317
|
-
return newMarkerData;
|
|
318
|
-
}
|
|
319
|
-
return marker;
|
|
320
|
-
});
|
|
321
|
-
return {
|
|
322
|
-
...data,
|
|
323
|
-
markers: newMarkers,
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
228
|
openMarkerInfoWindow(markerItem) {
|
|
327
229
|
const isInfoWindowOpened = this.checkInfoWindowPosition(markerItem, this.openedInfoWindowData);
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
this.mapData.
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
230
|
+
const combinedMarkers = [
|
|
231
|
+
...this.mapData.markers,
|
|
232
|
+
...this.mapData.clusterMarkers,
|
|
233
|
+
];
|
|
234
|
+
combinedMarkers.forEach((item, index) => {
|
|
235
|
+
const isSelectedMarker = this.checkInfoWindowPosition(item, markerItem);
|
|
236
|
+
const isClusterMarker = item?.data?.count > 1;
|
|
237
|
+
const clusterId = isClusterMarker ? this.getClusterId(item) : null;
|
|
238
|
+
const markerIconId = isClusterMarker
|
|
239
|
+
? '#cluster-' + clusterId
|
|
240
|
+
: '#marker-' + item.id;
|
|
241
|
+
const dropdownElement = isClusterMarker
|
|
242
|
+
? this.clusterDropdown.nativeElement
|
|
243
|
+
: this.markerDropdown.nativeElement;
|
|
244
|
+
if (isSelectedMarker) {
|
|
245
|
+
item.options = { zIndex: 999 };
|
|
246
|
+
if (isClusterMarker)
|
|
247
|
+
this.isMarkerDropdownOpen = false;
|
|
248
|
+
else
|
|
249
|
+
this.isClusterDropdownOpen = false;
|
|
250
|
+
clearTimeout(this.openDropdownTimeout);
|
|
251
|
+
this.openDropdownTimeout = setTimeout(() => {
|
|
252
|
+
const markerIcon = this.el.nativeElement.querySelector(markerIconId);
|
|
253
|
+
if (!(markerIcon?.previousSibling === dropdownElement))
|
|
254
|
+
this.renderer.insertBefore(markerIcon?.parentNode, dropdownElement, markerIcon);
|
|
255
|
+
if (markerIcon &&
|
|
256
|
+
!markerIcon.classList.contains(MapMarkerStringEnum.SELECTED))
|
|
257
|
+
this.renderer.addClass(markerIcon, MapMarkerStringEnum.SELECTED);
|
|
258
|
+
this.isMarkerDropdownOpen = !isClusterMarker;
|
|
259
|
+
this.isClusterDropdownOpen = isClusterMarker;
|
|
260
|
+
this.cd.detectChanges();
|
|
261
|
+
}, 50);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const markerIcon = this.el.nativeElement.querySelector(markerIconId);
|
|
265
|
+
if (markerIcon?.classList.contains(MapMarkerStringEnum.SELECTED))
|
|
266
|
+
this.renderer.removeClass(markerIcon, MapMarkerStringEnum.SELECTED);
|
|
353
267
|
setTimeout(() => {
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
position: markerItem.position,
|
|
357
|
-
};
|
|
358
|
-
this.infoWindowsView.open();
|
|
359
|
-
}, 0);
|
|
268
|
+
item.options = { zIndex: index + 1 };
|
|
269
|
+
}, 50);
|
|
360
270
|
}
|
|
361
|
-
}
|
|
271
|
+
});
|
|
272
|
+
this.currentlyOpenWindow = true;
|
|
273
|
+
this.openedInfoWindowData = markerItem;
|
|
274
|
+
if (!isInfoWindowOpened)
|
|
275
|
+
this.map.panTo(markerItem.position);
|
|
362
276
|
}
|
|
363
277
|
checkInfoWindowPosition(markerItem, markerItem2) {
|
|
364
278
|
return (markerItem.position.lat === markerItem2?.position?.lat &&
|
|
@@ -366,13 +280,15 @@ export class CaMapComponent {
|
|
|
366
280
|
}
|
|
367
281
|
closeInfoWindow() {
|
|
368
282
|
this.resetMarkersIcons();
|
|
369
|
-
this.openedInfoWindowData = null;
|
|
370
|
-
this.
|
|
371
|
-
this.
|
|
283
|
+
setTimeout(() => (this.openedInfoWindowData = null), 250);
|
|
284
|
+
clearTimeout(this.openDropdownTimeout);
|
|
285
|
+
this.isMarkerDropdownOpen = false;
|
|
286
|
+
this.isClusterDropdownOpen = false;
|
|
287
|
+
this.currentlyOpenWindow = false;
|
|
372
288
|
this.resetSelectedMarkerItem.emit();
|
|
373
289
|
}
|
|
374
290
|
handleMapData(newData) {
|
|
375
|
-
this.mapData =
|
|
291
|
+
this.mapData = { ...newData };
|
|
376
292
|
if (this.mapData.selectedMarkerData)
|
|
377
293
|
this.openMarkerInfoWindow(this.mapData.selectedMarkerData);
|
|
378
294
|
else if (this.currentlyOpenWindow)
|
|
@@ -387,26 +303,20 @@ export class CaMapComponent {
|
|
|
387
303
|
this.calculateAndDisplayRoute();
|
|
388
304
|
this.cd.detectChanges();
|
|
389
305
|
}
|
|
306
|
+
getClusterId(clusterData) {
|
|
307
|
+
const clusterId = this.clusterMarkerIds.find((item) => clusterData.position.lat === item.position.lat &&
|
|
308
|
+
clusterData.position.lng === item.position.lng)?.id;
|
|
309
|
+
return clusterId || null;
|
|
310
|
+
}
|
|
311
|
+
getRoutingId(markerData) {
|
|
312
|
+
const routingId = this.routingMarkerIds.find((item) => markerData.position.lat === item.position.lat &&
|
|
313
|
+
markerData.position.lng === item.position.lng)?.id;
|
|
314
|
+
return routingId || null;
|
|
315
|
+
}
|
|
390
316
|
onClusterListScrollToEnd() {
|
|
391
317
|
if (this.openedInfoWindowData)
|
|
392
318
|
this.clusterListScrollEvent.emit(this.openedInfoWindowData);
|
|
393
319
|
}
|
|
394
|
-
checkClusterDataChanges(newData, previousData) {
|
|
395
|
-
return newData.infoWindowContent?.clusterData
|
|
396
|
-
? newData.infoWindowContent?.selectedClusterItemData?.data?.id !==
|
|
397
|
-
previousData?.infoWindowContent?.selectedClusterItemData?.data?.id ||
|
|
398
|
-
newData.infoWindowContent?.clusterData?.length !==
|
|
399
|
-
previousData?.infoWindowContent?.clusterData?.length
|
|
400
|
-
: false;
|
|
401
|
-
}
|
|
402
|
-
onMarkerMouseover(markerItem) {
|
|
403
|
-
if (markerItem?.label?.isShowOnHover)
|
|
404
|
-
this.hoveredMarkerId = markerItem?.data?.id;
|
|
405
|
-
}
|
|
406
|
-
onMarkerMouseout(markerItem) {
|
|
407
|
-
if (markerItem?.label?.isShowOnHover)
|
|
408
|
-
this.hoveredMarkerId = null;
|
|
409
|
-
}
|
|
410
320
|
onZoomChange(isMinusClick) {
|
|
411
321
|
const currentZoomLevel = this.map?.getZoom();
|
|
412
322
|
if (currentZoomLevel) {
|
|
@@ -419,6 +329,18 @@ export class CaMapComponent {
|
|
|
419
329
|
onOpenInMap() {
|
|
420
330
|
this.openInMapEvent.emit();
|
|
421
331
|
}
|
|
332
|
+
getServiceData() {
|
|
333
|
+
this.markerIconService.clusterMarkerIds$
|
|
334
|
+
.pipe(takeUntil(this.destroy$))
|
|
335
|
+
.subscribe((clusterIds) => {
|
|
336
|
+
this.clusterMarkerIds = clusterIds;
|
|
337
|
+
});
|
|
338
|
+
this.markerIconService.routingMarkerIds$
|
|
339
|
+
.pipe(takeUntil(this.destroy$))
|
|
340
|
+
.subscribe((routingIds) => {
|
|
341
|
+
this.routingMarkerIds = routingIds;
|
|
342
|
+
});
|
|
343
|
+
}
|
|
422
344
|
trackById(index, marker) {
|
|
423
345
|
return marker.data.id;
|
|
424
346
|
}
|
|
@@ -430,11 +352,13 @@ export class CaMapComponent {
|
|
|
430
352
|
}
|
|
431
353
|
ngOnDestroy() {
|
|
432
354
|
this.directionsRenderers.forEach((renderer) => renderer.setMap(null));
|
|
355
|
+
this.destroy$.next();
|
|
356
|
+
this.destroy$.complete();
|
|
433
357
|
}
|
|
434
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaMapComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
435
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CaMapComponent, isStandalone: true, selector: "app-ca-map", inputs: { data: "data" }, outputs: { resetSelectedMarkerItem: "resetSelectedMarkerItem", clusterMarkerClick: "clusterMarkerClick", clusterListScrollEvent: "clusterListScrollEvent", getInfoWindowData: "getInfoWindowData", boundsChanged: "boundsChanged", openInMapEvent: "openInMapEvent" }, viewQueries: [{ propertyName: "maps", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "infoWindowsView", first: true, predicate: MapInfoWindow, descendants: true }], ngImport: i0, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n <map-marker\n #marker=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.markers;\n let i = index;\n trackBy: trackById\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"\n (openedInfoWindowData?.position?.lat === markeritem?.position?.lat &&\n openedInfoWindowData?.position?.lng === markeritem?.position?.lng) ||\n (markeritem.label?.isShowOnHover &&\n hoveredMarkerId !== markeritem.data.id)\n ? ''\n : markeritem.label!\n \"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onMarkerClick(markeritem)\"\n (mapMouseover)=\"onMarkerMouseover(markeritem)\"\n (mapMouseout)=\"onMarkerMouseout(markeritem)\"\n >\n </map-marker>\n\n <map-info-window\n #infoWindowsView=\"mapInfoWindow\"\n [options]=\"infoWindowOptions\"\n >\n <ng-container *ngIf=\"openedInfoWindowData !== null\">\n <app-ca-map-dropdown\n [infoWindowContent]=\"openedInfoWindowData.infoWindowContent\"\n [markerData]=\"openedInfoWindowData.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </ng-container>\n </map-info-window>\n\n <map-marker\n #markerCluster=\"mapMarker\"\n *ngFor=\"\n let marker of mapData.clusterMarkers;\n let i = index;\n trackBy: trackByPosition\n \"\n [position]=\"marker.position\"\n [icon]=\"marker.icon\"\n (mapClick)=\"onClusterMarkerClick(marker)\"\n >\n </map-marker>\n\n <ng-container *ngIf=\"isAreaFilterActive\">\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n </ng-container>\n\n <map-marker\n #markerRouting=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.routingMarkers;\n let i = index;\n trackBy: identity\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"focusedIconRouting !== i ? markeritem.label! : ''\"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onRoutingMarkerClick(i, $event, markeritem)\"\n >\n <map-info-window #infoWindowsViewRouting=\"mapInfoWindow\">\n <app-ca-map-dropdown></app-ca-map-dropdown>\n </map-info-window>\n </map-marker>\n\n <ng-container *ngIf=\"mapData.isOpenInMapShown\">\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"mapData.isZoomShown\">\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom\n }\"\n >\n <div class=\"map-zoom-buttons d-flex align-items-center\" [class.flex-column]=\"mapData.isVerticalZoom\">\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n </ng-container>\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true]{width:100px;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true]{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}\n"], dependencies: [{ kind: "ngmodule", type:
|
|
358
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaMapComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.MapMarkerIconService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
359
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CaMapComponent, isStandalone: true, selector: "app-ca-map", inputs: { data: "data" }, outputs: { resetSelectedMarkerItem: "resetSelectedMarkerItem", clusterMarkerClick: "clusterMarkerClick", clusterListScrollEvent: "clusterListScrollEvent", getInfoWindowData: "getInfoWindowData", boundsChanged: "boundsChanged", openInMapEvent: "openInMapEvent" }, viewQueries: [{ propertyName: "maps", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "markerDropdown", first: true, predicate: ["markerDropdown"], descendants: true }, { propertyName: "clusterDropdown", first: true, predicate: ["clusterDropdown"], descendants: true }], ngImport: i0, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n [mapId]=\"mapStyleId\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track trackByPosition($index, clusterMarker)\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (isAreaFilterActive) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (\n routingMarker of mapData.routingMarkers;\n let i = $index;\n track trackByPosition($index, routingMarker)\n ) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true],.marker-label{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px;pointer-events:none}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}\n"], dependencies: [{ kind: "ngmodule", type:
|
|
436
360
|
// Modules
|
|
437
|
-
GoogleMapsModule }, { kind: "component", type:
|
|
361
|
+
GoogleMapsModule }, { kind: "component", type: i2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i2.MapCircle, selector: "map-circle", inputs: ["options", "center", "radius"], outputs: ["centerChanged", "circleClick", "circleDblclick", "circleDrag", "circleDragend", "circleDragstart", "circleMousedown", "circleMousemove", "circleMouseout", "circleMouseover", "circleMouseup", "radiusChanged", "circleRightclick", "circleInitialized"], exportAs: ["mapCircle"] }, { kind: "directive", type: i2.MapAdvancedMarker, selector: "map-advanced-marker", inputs: ["title", "position", "content", "gmpDraggable", "options", "zIndex"], outputs: ["mapClick", "mapDrag", "mapDragend", "mapDragstart", "markerInitialized"], exportAs: ["mapAdvancedMarker"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i4.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type:
|
|
438
362
|
// Components
|
|
439
363
|
CaMapDropdownComponent, selector: "app-ca-map-dropdown", inputs: ["infoWindowContent", "markerData"], outputs: ["onClusterItemClick", "onClusterListScrollToEnd", "onBackButtonClick", "bodyActions"] }, { kind: "component", type: CaAppTooltipV2Component, selector: "mainCaTooltip, [mainCaTooltip]", inputs: ["mainCaTooltip", "position", "openTooltipDelay", "tooltipBackground", "tooltipColor", "tooltipTextAlign", "tooltipMarginTop", "disableTooltip"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
440
364
|
}
|
|
@@ -449,8 +373,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
449
373
|
// Components
|
|
450
374
|
CaMapDropdownComponent,
|
|
451
375
|
CaAppTooltipV2Component,
|
|
452
|
-
], encapsulation: ViewEncapsulation.None, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n>\n <map-marker\n #marker=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.markers;\n let i = index;\n trackBy: trackById\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"\n (openedInfoWindowData?.position?.lat === markeritem?.position?.lat &&\n openedInfoWindowData?.position?.lng === markeritem?.position?.lng) ||\n (markeritem.label?.isShowOnHover &&\n hoveredMarkerId !== markeritem.data.id)\n ? ''\n : markeritem.label!\n \"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onMarkerClick(markeritem)\"\n (mapMouseover)=\"onMarkerMouseover(markeritem)\"\n (mapMouseout)=\"onMarkerMouseout(markeritem)\"\n >\n </map-marker>\n\n <map-info-window\n #infoWindowsView=\"mapInfoWindow\"\n [options]=\"infoWindowOptions\"\n >\n <ng-container *ngIf=\"openedInfoWindowData !== null\">\n <app-ca-map-dropdown\n [infoWindowContent]=\"openedInfoWindowData.infoWindowContent\"\n [markerData]=\"openedInfoWindowData.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </ng-container>\n </map-info-window>\n\n <map-marker\n #markerCluster=\"mapMarker\"\n *ngFor=\"\n let marker of mapData.clusterMarkers;\n let i = index;\n trackBy: trackByPosition\n \"\n [position]=\"marker.position\"\n [icon]=\"marker.icon\"\n (mapClick)=\"onClusterMarkerClick(marker)\"\n >\n </map-marker>\n\n <ng-container *ngIf=\"isAreaFilterActive\">\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n </ng-container>\n\n <map-marker\n #markerRouting=\"mapMarker\"\n *ngFor=\"\n let markeritem of mapData.routingMarkers;\n let i = index;\n trackBy: identity\n \"\n [position]=\"markeritem.position\"\n [icon]=\"markeritem.icon!\"\n [label]=\"focusedIconRouting !== i ? markeritem.label! : ''\"\n [options]=\"markeritem.options!\"\n (mapClick)=\"onRoutingMarkerClick(i, $event, markeritem)\"\n >\n <map-info-window #infoWindowsViewRouting=\"mapInfoWindow\">\n <app-ca-map-dropdown></app-ca-map-dropdown>\n </map-info-window>\n </map-marker>\n\n <ng-container *ngIf=\"mapData.isOpenInMapShown\">\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"mapData.isZoomShown\">\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom\n }\"\n >\n <div class=\"map-zoom-buttons d-flex align-items-center\" [class.flex-column]=\"mapData.isVerticalZoom\">\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n </ng-container>\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true]{width:100px;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true]{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}\n"] }]
|
|
453
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { data: [{
|
|
376
|
+
], encapsulation: ViewEncapsulation.None, template: "<google-map\n class=\"position-relative\"\n [class.dark-mode-map]=\"mapData.darkMode\"\n height=\"100%\"\n width=\"100%\"\n [zoom]=\"mapZoom\"\n [center]=\"mapCenter\"\n [options]=\"mapOptions\"\n (mapInitialized)=\"onMapReady($event)\"\n [mapId]=\"mapStyleId\"\n>\n @for (marker of mapData.markers; let i = $index; track marker.data.id) {\n <map-advanced-marker\n [position]=\"marker.position\"\n [content]=\"marker.content\"\n [zIndex]=\"\n openedInfoWindowData?.data?.id === marker.data.id ? 999 : i\n \"\n (mapClick)=\"onMarkerClick(marker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #markerDropdown\n class=\"marker-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isMarkerDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isClusterDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @for (\n clusterMarker of mapData.clusterMarkers;\n let i = $index;\n track trackByPosition($index, clusterMarker)\n ) {\n <map-advanced-marker\n [position]=\"clusterMarker.position\"\n [content]=\"clusterMarker.content\"\n [zIndex]=\"\n checkInfoWindowPosition(clusterMarker, openedInfoWindowData)\n ? 999\n : i\n \"\n (mapClick)=\"onClusterMarkerClick(clusterMarker)\"\n >\n </map-advanced-marker>\n }\n\n <div\n #clusterDropdown\n class=\"marker-dropdown cluster-dropdown dropdown-hidden\"\n [ngClass]=\"{ 'dropdown-hidden': !isClusterDropdownOpen }\"\n >\n <app-ca-map-dropdown\n [infoWindowContent]=\"\n !isMarkerDropdownOpen\n ? openedInfoWindowData?.infoWindowContent\n : null\n \"\n [markerData]=\"openedInfoWindowData?.data\"\n (onClusterItemClick)=\"getMarkerInfoWindow($event)\"\n (onClusterListScrollToEnd)=\"onClusterListScrollToEnd()\"\n (onBackButtonClick)=\"onClusterBackButtonClick()\"\n ></app-ca-map-dropdown>\n </div>\n\n @if (isAreaFilterActive) {\n <map-circle\n [options]=\"areaFilterData.options\"\n [center]=\"areaFilterData.center\"\n [radius]=\"areaFilterData.radius\"\n ></map-circle>\n }\n\n @for (\n routingMarker of mapData.routingMarkers;\n let i = $index;\n track trackByPosition($index, routingMarker)\n ) {\n <map-advanced-marker\n [position]=\"routingMarker.position\"\n [content]=\"routingMarker.content\"\n >\n </map-advanced-marker>\n }\n\n @if (mapData.isOpenInMapShown) {\n <div\n class=\"open-in-map-container d-flex align-items-center justify-content-center\"\n ngbTooltip\n mainCaTooltip=\"Open in Map\"\n tooltipBackground=\"#424242\"\n position=\"bottom\"\n (click)=\"onOpenInMap()\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_location_map.svg\"\n [svgStyle]=\"{ 'width.px': 18, 'height.px': 18 }\"\n ></svg-icon>\n </div>\n }\n\n @if (mapData.isZoomShown) {\n <div\n class=\"map-zoom-container d-flex flex-column align-items-end gap-1\"\n [ngClass]=\"{\n 'flex-column': !mapData.isVerticalZoom,\n 'vertical-zoom-buttons': mapData.isVerticalZoom,\n }\"\n >\n <div\n class=\"map-zoom-buttons d-flex align-items-center\"\n [class.flex-column]=\"mapData.isVerticalZoom\"\n >\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(true)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/popup/Minus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n <div\n class=\"zoom-button-container d-flex align-items-center justify-content-center flex-1\"\n (click)=\"onZoomChange(false)\"\n >\n <svg-icon\n class=\"d-flex\"\n src=\"assets/ca-components/svg/common/ic_plus.svg\"\n [svgStyle]=\"{ 'width.px': 14, 'height.px': 14 }\"\n ></svg-icon>\n </div>\n </div>\n <div class=\"map-zoom-range d-flex align-items-center\">\n <div class=\"range-line\"></div>\n <div class=\"range-text ca-font-medium\">50 mi</div>\n <div class=\"range-line\"></div>\n </div>\n </div>\n }\n</google-map>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.gm-style-iw-a .gm-style-iw-t .gm-style-iw.gm-style-iw-c{padding:0!important;border-radius:3px!important;top:70px!important;transform:translate(-50%)!important}.gm-style-iw-a .gm-style-iw-t .gm-style-iw-tc{display:none!important}.gm-style div[aria-hidden=true],.marker-label{position:absolute;left:100%;top:50%;transform:translateY(-50%);width:100px;opacity:1;transition:opacity .2s ease-in-out;text-shadow:1px 1px 0px #ffffff,1px -1px 0px #ffffff,-1px -1px 0px #ffffff,-1px 1px 0px #ffffff;font-size:11px;line-height:12px;text-align:left;font-weight:500;font-family:Montserrat,sans-serif!important;color:#424242;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:none;user-select:none}@supports (-webkit-line-clamp: 2){.gm-style div[aria-hidden=true],.marker-label{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.map-zoom-container{position:absolute;right:8px;bottom:16px}.map-zoom-container .map-zoom-buttons{width:52px;min-height:26px;background:#fff;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-buttons .zoom-button-container{height:100%}.map-zoom-container .map-zoom-buttons .zoom-button-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#919191}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover{cursor:pointer}.map-zoom-container .map-zoom-buttons .zoom-button-container:hover svg-icon svg path{fill:#424242}.map-zoom-container .map-zoom-range{gap:2px;background:#fff;padding:0 4px;border-width:3px;border-style:solid;border-color:#eee;border-radius:2px}.map-zoom-container .map-zoom-range .range-text{min-width:fit-content;font-size:8px;line-height:10px;color:#424242;-webkit-user-select:none;user-select:none}.map-zoom-container .map-zoom-range .range-line{width:38px;height:2px;border-radius:1px;background:#919191}.map-zoom-container.vertical-zoom-buttons .map-zoom-range{order:1}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons{order:2;width:26px;min-height:52px}.map-zoom-container.vertical-zoom-buttons .map-zoom-buttons .zoom-button-container:first-child{order:2}.open-in-map-container{position:absolute;top:4px;right:4px;width:30px;height:30px;background:#6c6c6ce6;border-radius:1px}.open-in-map-container svg-icon svg path{transition:fill .2s ease-in-out;fill:#dadada}.open-in-map-container:hover{cursor:pointer}.open-in-map-container:hover svg-icon svg path{fill:#fff}.dark-mode-map .map-zoom-container .map-zoom-buttons,.dark-mode-map .map-zoom-range{background:#2f2f2f;border-color:#1d1d1d}.dark-mode-map .map-zoom-range .range-text{color:#fff}.marker-icon{position:relative}.marker-icon .marker-svg{transform:scale(1);transform-origin:center 30px;transition:transform .2s ease-in-out}.marker-icon .marker-svg .outside-circle,.marker-icon .marker-svg .white-circle,.marker-icon .marker-svg .inside-shape{transform-origin:center;transition:transform .2s ease-in-out}.marker-icon .marker-svg .shadow-circle{transition:transform .2s ease-in-out;transform-origin:14px 30px}.marker-icon.selected .marker-svg,.marker-icon.selected-permanently .marker-svg{transform:scale(1.5);transition:transform .2s ease-in-out}.marker-icon.selected .marker-svg .outside-circle,.marker-icon.selected-permanently .marker-svg .outside-circle{transform:scale(1.074)}.marker-icon.selected .marker-svg .white-circle,.marker-icon.selected-permanently .marker-svg .white-circle{transform:scale(.8665)}.marker-icon.selected .marker-svg .shadow-circle,.marker-icon.selected-permanently .marker-svg .shadow-circle{transform:scale(.889,.667)}.marker-icon.selected .marker-label,.marker-icon.selected-permanently .marker-label{opacity:0;pointer-events:none!important}.marker-icon.selected-permanently .marker-label{top:8px;left:calc(100% + 4px)}.marker-icon.selected-permanently:hover .marker-label{opacity:1!important}.marker-dropdown{position:absolute;top:35px;left:50%;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transform:translate(-50%) scale(1);opacity:1;width:360px;min-height:64px;padding:0;background:#fff;box-shadow:0 0 4px #00000026;border-radius:3px;pointer-events:none}.marker-dropdown.dropdown-hidden{transform:translate(-50%) scale(.5);opacity:0;pointer-events:none!important}.marker-dropdown.cluster-dropdown{top:55px}.cluster-icon{position:relative}.cluster-icon .marker-svg g path{fill:#fff;transition:all .2s ease-in-out}.cluster-icon.selected .marker-svg g path{fill:#fab15c}\n"] }]
|
|
377
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.MapMarkerIconService }], propDecorators: { data: [{
|
|
454
378
|
type: Input
|
|
455
379
|
}], resetSelectedMarkerItem: [{
|
|
456
380
|
type: Output
|
|
@@ -467,8 +391,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
467
391
|
}], maps: [{
|
|
468
392
|
type: ViewChild,
|
|
469
393
|
args: [GoogleMap, { static: false }]
|
|
470
|
-
}],
|
|
394
|
+
}], markerDropdown: [{
|
|
395
|
+
type: ViewChild,
|
|
396
|
+
args: ['markerDropdown']
|
|
397
|
+
}], clusterDropdown: [{
|
|
471
398
|
type: ViewChild,
|
|
472
|
-
args: [
|
|
399
|
+
args: ['clusterDropdown']
|
|
473
400
|
}] } });
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLW1hcC9jYS1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtbWFwL2NhLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FHZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTlELGFBQWE7QUFDYixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUUzRixRQUFRO0FBQ1IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBYWhFLFVBQVU7QUFDVixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFLL0QsWUFBWTtBQUNaLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsbUJBQW1CLEdBQ3BCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7QUFvQjVELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLFlBQW1CLEVBQXFCO1FBQXJCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBSTlCLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUNyRCwyQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ3pELHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDL0Msa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUNuRCxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFRdEMscUJBQWdCLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsd0JBQW1CLEdBQXFDLEVBQUUsQ0FBQztRQUMzRCxpQkFBWSxHQUdiLEVBQUUsQ0FBQztRQUNGLHVCQUFrQixHQUluQixFQUFFLENBQUM7UUFDRixzQkFBaUIsR0FDdEIsNkJBQTZCLENBQUMsb0JBQW9CLENBQUM7UUFDOUMsZUFBVSxHQUFnQixtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRSxZQUFPLEdBQVcsbUJBQW1CLENBQUMsY0FBYyxDQUFDO1FBQ3JELGNBQVMsR0FBZSxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3RCxRQUFHLEdBQTJCLElBQUksQ0FBQztRQUNuQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyx1QkFBa0IsR0FBa0IsRUFBRSxDQUFDO1FBQ3ZDLGdCQUFXLEdBQWtCLEVBQUUsQ0FBQztRQUNoQyxZQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUMxQix5QkFBb0IsR0FBdUIsSUFBSSxDQUFDO1FBQ2hELG1CQUFjLEdBQUcsbUJBQW1CLENBQUMsY0FBYyxDQUFDO1FBQ3BELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxvQkFBZSxHQUFrQixJQUFJLENBQUM7SUF6Q0YsQ0FBQztJQUM1QyxJQUFhLElBQUksQ0FBQyxNQUFtQjtRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUF3Q0QsUUFBUTtRQUNOLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3hDLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0seUJBQXlCO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFN0IsSUFBSSxDQUFDLE9BQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBbUIsRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUNwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQy9CLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSyxDQUFDLEdBQUc7Z0JBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSyxDQUFDLFdBQVc7Z0JBQ3JDLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO2FBQ3BDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxnQ0FBZ0M7UUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUNsQyxDQUFDLE1BQW1CLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDekIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFLLENBQUMsR0FBRztnQkFDckIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFLLENBQUMsV0FBVzthQUN0QyxDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sb0JBQW9CLENBQUMsVUFBdUI7UUFDakQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQ3JELFVBQVUsRUFDVixJQUFJLENBQUMsb0JBQW9CLENBQzFCLENBQUM7UUFFRixJQUFJLENBQUMsa0JBQWtCO1lBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7WUFDN0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxRQUFnQjtRQUN6QyxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxhQUFhLENBQUMsVUFBdUI7UUFDMUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQ3JELFVBQVUsRUFDVixJQUFJLENBQUMsb0JBQW9CLENBQzFCLENBQUM7UUFFRixJQUFJLENBQUMsa0JBQWtCO1lBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7O1lBQ2pFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDNUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVUsQ0FBQyxDQUN2QyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVCLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztZQUU5QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUU7Z0JBQ3hELE1BQU0sT0FBTyxHQUFrQztvQkFDN0MsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNyQixXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQzlDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTt5QkFDbEIsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7eUJBQy9CLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUM5QyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUztpQkFDN0MsQ0FBQztnQkFFRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDdEQsSUFBSSxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNwRSxNQUFNLGtCQUFrQixHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs0QkFDNUQsbUJBQW1CLEVBQUUsSUFBSTs0QkFDekIsZUFBZSxFQUFFLElBQUk7NEJBQ3JCLGdCQUFnQixFQUFFLElBQUk7NEJBQ3RCLGVBQWUsRUFBRTtnQ0FDZixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsWUFBWTtnQ0FDNUQsYUFBYSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVE7b0NBQzVCLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxjQUFjO29DQUNyRCxDQUFDLENBQUMsQ0FBQztnQ0FDTCxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsYUFBYTtnQ0FDL0QsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRO29DQUNuQixDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWU7d0NBQ3JCLG1CQUFtQixDQUFDLHFCQUFxQjtvQ0FDM0MsQ0FBQyxDQUFDLElBQUk7NkJBQ1Q7eUJBQ0YsQ0FBQyxDQUFDO3dCQUNILGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDekMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUNsRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFFTSxvQkFBb0IsQ0FDekIsQ0FBUyxFQUNULEtBQWdDLEVBQ2hDLFVBQXVCO1FBRXZCLHVDQUF1QztRQUN2QyxTQUFTO1FBQ1Qsb0RBQW9EO1FBQ3BELHNDQUFzQztRQUN0QyxRQUFRO1FBQ1IsbUVBQW1FO1FBQ25FLGtFQUFrRTtRQUNsRSwrRUFBK0U7UUFDL0UsMkJBQTJCO1FBQzNCLHdCQUF3QjtRQUN4QixnREFBZ0Q7UUFDaEQsZ0VBQWdFO1FBQ2hFLGFBQWE7UUFDYixVQUFVO1FBQ1YsVUFBVTtRQUNWLDBCQUEwQjtRQUMxQixtREFBbUQ7UUFDbkQsYUFBYTtRQUNiLDJEQUEyRDtRQUMzRCxtRUFBbUU7UUFDbkUsNkNBQTZDO1FBQzdDLGlEQUFpRDtRQUNqRCxRQUFRO1FBQ1Isd0JBQXdCO1FBQ3hCLCtFQUErRTtRQUMvRSxhQUFhO1FBQ2IsbURBQW1EO1FBQ25ELHdDQUF3QztRQUN4QyxZQUFZO1FBQ1osc0NBQXNDO1FBQ3RDLG1FQUFtRTtRQUNuRSxxQ0FBcUM7UUFDckMseUNBQXlDO1FBQ3pDLG1FQUFtRTtRQUNuRSwyQkFBMkI7UUFDM0Isd0VBQXdFO1FBQ3hFLGVBQWU7UUFDZixZQUFZO1FBQ1osVUFBVTtRQUNWLHFDQUFxQztRQUNyQywwQ0FBMEM7UUFDMUMsa0RBQWtEO1FBQ2xELCtCQUErQjtRQUMvQiw0RUFBNEU7UUFDNUUsMkNBQTJDO1FBQzNDLHNDQUFzQztRQUN0Qyw0QkFBNEI7UUFDNUIscUJBQXFCO1FBQ3JCLDZFQUE2RTtRQUM3RSxxQ0FBcUM7UUFDckMsbURBQW1EO1FBQ25ELGlCQUFpQjtRQUNqQixxQkFBcUI7UUFDckIscUNBQXFDO1FBQ3JDLGNBQWM7UUFDZCxZQUFZO1FBQ1osV0FBVztRQUNYLHNDQUFzQztRQUN0QyxzREFBc0Q7UUFDdEQsa0RBQWtEO1FBQ2xELFFBQVE7UUFDUixNQUFNO1FBQ04sdUNBQXVDO1FBQ3ZDLFdBQVc7UUFDWCxZQUFZO1FBQ1osSUFBSTtJQUNOLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRXZCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQWlCLEVBQUUsQ0FBUyxFQUFFLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHO3dCQUNWLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7cUJBQzlCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQW1CLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDL0QsT0FBTztnQkFDTCxHQUFHLE1BQU07Z0JBQ1QsSUFBSSxFQUFFO29CQUNKLEdBQUcsTUFBTSxDQUFDLElBQUk7b0JBQ2QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxhQUFhO3dCQUM5QixDQUFDLENBQUMsbUJBQW1CLENBQUMsZUFBZTt3QkFDckMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQjtpQkFDMUM7Z0JBQ0QsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUU7YUFDL0IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FDbEMsQ0FBQyxNQUFtQixFQUFFLEtBQWEsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sQ0FBQyxJQUFJLEdBQUc7Z0JBQ1osR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFLLENBQUMsR0FBRztnQkFDckIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFLLENBQUMsV0FBVzthQUN0QyxDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sVUFBVSxDQUFDLFdBQTRCO1FBTTVDLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBRXZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7WUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRTFELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDN0MsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxTQUFTLENBQUMsb0JBQW9CLENBQy9ELFlBQXNCLEVBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FDeEIsQ0FBQztnQkFDRixPQUFPO29CQUNMLFNBQVMsRUFBRSxTQUFTO29CQUNwQixXQUFXLEVBQUUsU0FBUztvQkFDdEIsWUFBWSxFQUFFLEdBQUc7b0JBQ2pCLFdBQVcsRUFBRSxXQUFXO2lCQUN6QixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVE7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRztnQkFDaEIsR0FBRyxJQUFJLENBQUMsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxzQkFBc0I7YUFDNUMsQ0FBQztRQUVKLE1BQU0sa0JBQWtCLEdBQUc7WUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDaEMsQ0FBQztRQUVGLElBQUksa0JBQWtCLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDL0IsTUFBTSxrQkFBa0IsR0FDdEIsU0FBUyxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFcEQsSUFBSSxDQUFDLEdBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNO2dCQUMzQixJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRCxJQUFJLGtCQUFrQixDQUFDLE9BQU87Z0JBQzVCLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWhELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRU0sZUFBZSxDQUFDLEdBQW9CO1FBQ3pDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFbkMsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sWUFBWSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLHdCQUF3QjtRQUM3QixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxVQUFVLENBQUMsSUFBaUI7UUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFtQixFQUFFLEVBQUU7WUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQ25ELE1BQU0sRUFDTixJQUFJLENBQUMsb0JBQW9CLENBQzFCLENBQUM7WUFFRixJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sYUFBYSxHQUFHO29CQUNwQixHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFO3dCQUNKLEdBQUcsTUFBTSxDQUFDLElBQUk7d0JBQ2QsVUFBVSxFQUFFLG1CQUFtQixDQUFDLGVBQWU7cUJBQ2hEO29CQUNELE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7aUJBQ3pCLENBQUM7Z0JBRUYsT0FBTyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLEdBQUcsSUFBSTtZQUNQLE9BQU8sRUFBRSxVQUFVO1NBQ3BCLENBQUM7SUFDSixDQUFDO0lBRU0sb0JBQW9CLENBQUMsVUFBa0M7UUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQ3JELFVBQVUsRUFDVixJQUFJLENBQUMsb0JBQW9CLENBQzFCLENBQUM7UUFFRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDdkQsVUFBVSxFQUNWLElBQUksQ0FBQyxvQkFBb0IsQ0FDMUIsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsa0JBQWtCLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQWlCLEVBQUUsS0FBYSxFQUFFLEVBQUU7Z0JBQzdELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHO3dCQUNWLEdBQUcsSUFBSSxDQUFDLElBQUk7d0JBQ1osVUFBVSxFQUFFLG1CQUFtQixDQUFDLGVBQWU7cUJBQ2hELENBQUM7b0JBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDakMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxJQUFJLEdBQUc7d0JBQ1YsR0FBRyxJQUFJLENBQUMsSUFBSTt3QkFDWixVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWE7NEJBQzVCLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlOzRCQUNyQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCO3FCQUMxQyxDQUFDO29CQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUNoRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDO1lBRXZDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsR0FBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRXJDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLGlCQUFpQixHQUFHO3dCQUN2QixHQUFHLElBQUksQ0FBQyxpQkFBaUI7d0JBQ3pCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtxQkFDOUIsQ0FBQztvQkFDRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM5QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSx1QkFBdUIsQ0FDNUIsVUFBdUIsRUFDdkIsV0FBZ0M7UUFFaEMsT0FBTyxDQUNMLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxRQUFRLEVBQUUsR0FBRztZQUN0RCxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FDdkQsQ0FBQztJQUNKLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sYUFBYSxDQUFDLE9BQW9CO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1lBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDeEQsSUFBSSxJQUFJLENBQUMsbUJBQW1CO1lBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTFELElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEQsSUFDRSxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU07Z0JBQ3ZCLE9BQU8sQ0FBQyxjQUFjLEVBQUUsTUFBTTtnQkFDOUIsT0FBTyxDQUFDLGNBQWMsRUFBRSxNQUFNO2dCQUU5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVoQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CO1lBQzNCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLHVCQUF1QixDQUM1QixPQUFvQixFQUNwQixZQUFpQztRQUVqQyxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxXQUFXO1lBQzNDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQzFELFlBQVksRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDbEUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNO29CQUM1QyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU07WUFDMUQsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxVQUF1QjtRQUM5QyxJQUFJLFVBQVUsRUFBRSxLQUFLLEVBQUUsYUFBYTtZQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxVQUF1QjtRQUM3QyxJQUFJLFVBQVUsRUFBRSxLQUFLLEVBQUUsYUFBYTtZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3BFLENBQUM7SUFFTSxZQUFZLENBQUMsWUFBc0I7UUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTdDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixNQUFNLGFBQWEsR0FBRyxZQUFZO2dCQUNoQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQWEsRUFBRSxNQUFtQjtRQUNqRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxlQUFlLENBQUMsS0FBYSxFQUFFLE1BQW1CO1FBQ3ZELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDbkQsQ0FBQztJQUVNLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQzsrR0ExZ0JVLGNBQWM7bUdBQWQsY0FBYyw2WUFXZCxTQUFTLGtGQUNULGFBQWEsZ0RDakYxQiw4a0pBK0lBO2dCRHRGSSxVQUFVO2dCQUNWLGdCQUFnQixzckRBQ2hCLFlBQVksNlZBQ1osb0JBQW9CLGdPQUNwQixnQkFBZ0I7Z0JBRWhCLGFBQWE7Z0JBQ2Isc0JBQXNCLDhNQUN0Qix1QkFBdUI7OzRGQUlkLGNBQWM7a0JBbEIxQixTQUFTOytCQUNFLFlBQVksY0FHVixJQUFJLFdBQ1A7d0JBQ1AsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBRWhCLGFBQWE7d0JBQ2Isc0JBQXNCO3dCQUN0Qix1QkFBdUI7cUJBQ3hCLGlCQUNjLGlCQUFpQixDQUFDLElBQUk7c0ZBSXhCLElBQUk7c0JBQWhCLEtBQUs7Z0JBR0ksdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDa0MsSUFBSTtzQkFBNUMsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNiLGVBQWU7c0JBQXhDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgR29vZ2xlTWFwLFxuICBHb29nbGVNYXBzTW9kdWxlLFxuICBNYXBJbmZvV2luZG93LFxuICBNYXBNYXJrZXIsXG4gIE1hcENpcmNsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvZ29vZ2xlLW1hcHMnO1xuaW1wb3J0IHsgQW5ndWxhclN2Z0ljb25Nb2R1bGUgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCB7IE5nYlRvb2x0aXBNb2R1bGUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbi8vIENvbXBvbmVudHNcbmltcG9ydCB7IENhTWFwRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi9jYS1tYXAtZHJvcGRvd24vY2EtbWFwLWRyb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCB9IGZyb20gJy4uL2NhLWFwcC10b29sdGlwLXYyL2NhLWFwcC10b29sdGlwLXYyLmNvbXBvbmVudCc7XG5cbi8vIEVudW1zXG5pbXBvcnQgeyBHb29nbGVNYXBFbnVtIH0gZnJvbSAnLi4vY2EtbWFwL2VudW1zL2dvb2dsZS1tYXAuZW51bSc7XG5cbi8vIE1vZGVsc1xuaW1wb3J0IHtcbiAgSU1hcE1hcmtlcnMsXG4gIElNYXBSb3V0ZVBhdGgsXG4gIElDYU1hcFByb3BzLFxuICBJTWFwT3B0aW9ucyxcbiAgSVJvdXRlUGF0aCxcbiAgSU1hcEJvdW5kc1pvb20sXG4gIElNYXBTZWxlY3RlZE1hcmtlckRhdGEsXG59IGZyb20gJy4uL2NhLW1hcC9tb2RlbHMvbWFwLm1vZGVsJztcblxuLy8gSGVscGVyc1xuaW1wb3J0IHsgTWFwSGVscGVyIH0gZnJvbSAnLi4vY2EtbWFwL3V0aWxzL2hlbHBlcnMvbWFwLmhlbHBlcic7XG5cbi8vIFN2Zy1yb3V0ZXNcbmltcG9ydCB7IE1hcFN2Z1JvdXRlcyB9IGZyb20gJy4vdXRpbHMvc3ZnLXJvdXRlcyc7XG5cbi8vIENvbnN0YW50c1xuaW1wb3J0IHtcbiAgTWFwSW5mb1dpbmRvd09wdGlvbnNDb25zdGFudHMsXG4gIE1hcE9wdGlvbnNDb25zdGFudHMsXG59IGZyb20gJy4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE1hcENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9tYXAuY29uc3RhbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY2EtbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhLW1hcC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgLy8gTW9kdWxlc1xuICAgIEdvb2dsZU1hcHNNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFuZ3VsYXJTdmdJY29uTW9kdWxlLFxuICAgIE5nYlRvb2x0aXBNb2R1bGUsXG5cbiAgICAvLyBDb21wb25lbnRzXG4gICAgQ2FNYXBEcm9wZG93bkNvbXBvbmVudCxcbiAgICBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCxcbiAgXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQ2FNYXBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuICBASW5wdXQoKSBzZXQgZGF0YSh2YWx1ZXM6IElDYU1hcFByb3BzKSB7XG4gICAgdGhpcy5oYW5kbGVNYXBEYXRhKHZhbHVlcyk7XG4gIH1cbiAgQE91dHB1dCgpIHJlc2V0U2VsZWN0ZWRNYXJrZXJJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgY2x1c3Rlck1hcmtlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJTWFwTWFya2Vycz4oKTtcbiAgQE91dHB1dCgpIGNsdXN0ZXJMaXN0U2Nyb2xsRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBNYXJrZXJzPigpO1xuICBAT3V0cHV0KCkgZ2V0SW5mb1dpbmRvd0RhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGJvdW5kc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBCb3VuZHNab29tPigpO1xuICBAT3V0cHV0KCkgb3BlbkluTWFwRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBWaWV3Q2hpbGQoR29vZ2xlTWFwLCB7IHN0YXRpYzogZmFsc2UgfSkgbWFwcyE6IEdvb2dsZU1hcDtcbiAgQFZpZXdDaGlsZChNYXBJbmZvV2luZG93KSBpbmZvV2luZG93c1ZpZXchOiBNYXBJbmZvV2luZG93O1xuICBwdWJsaWMgY3VycmVudGx5T3BlbldpbmRvdyE6IE1hcEluZm9XaW5kb3cgfCBudWxsO1xuICBwdWJsaWMgY3VycmVudGx5T3BlbldpbmRvd1JvdXRpbmchOiBNYXBJbmZvV2luZG93IHwgbnVsbDtcbiAgcHVibGljIHByZXZpb3VzSWNvblVybCE6IHN0cmluZztcbiAgcHVibGljIHByZXZpb3VzSWNvblVybFJvdXRpbmchOiBzdHJpbmc7XG4gIHB1YmxpYyBmb2N1c2VkSWNvblJvdXRpbmchOiBudW1iZXI7XG4gIHByaXZhdGUgZGlyZWN0aW9uU2VydmljZSA9IG5ldyBnb29nbGUubWFwcy5EaXJlY3Rpb25zU2VydmljZSgpO1xuICBwdWJsaWMgZGlyZWN0aW9uc1JlbmRlcmVyczogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlbmRlcmVyW10gPSBbXTtcbiAgcHVibGljIGluaXRpYWxJY29uczoge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGxhYmVsT3JpZ2luPzogZ29vZ2xlLm1hcHMuUG9pbnQ7XG4gIH1bXSA9IFtdO1xuICBwdWJsaWMgaW5pdGlhbE1hcmtlckljb25zOiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbGFiZWxPcmlnaW4/OiBnb29nbGUubWFwcy5Qb2ludDtcbiAgICB6SW5kZXg/OiBudW1iZXI7XG4gIH1bXSA9IFtdO1xuICBwdWJsaWMgaW5mb1dpbmRvd09wdGlvbnM6IGdvb2dsZS5tYXBzLkluZm9XaW5kb3dPcHRpb25zID1cbiAgICBNYXBJbmZvV2luZG93T3B0aW9uc0NvbnN0YW50cy5tYXBJbmZvV2luZG93T3B0aW9ucztcbiAgcHVibGljIG1hcE9wdGlvbnM6IElNYXBPcHRpb25zID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwT3B0aW9ucztcbiAgcHVibGljIG1hcFpvb206IG51bWJlciA9IE1hcE9wdGlvbnNDb25zdGFudHMuZGVmYXVsdE1hcFpvb207XG4gIHB1YmxpYyBtYXBDZW50ZXI6IElSb3V0ZVBhdGggPSBNYXBPcHRpb25zQ29uc3RhbnRzLmRlZmF1bHRNYXBDZW50ZXI7XG4gIHB1YmxpYyBtYXA6IGdvb2dsZS5tYXBzLk1hcCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgaXNNYXBDZW50ZXJTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNsdXN0ZXJNYXJrZXJzRGF0YTogSU1hcE1hcmtlcnNbXSA9IFtdO1xuICBwdWJsaWMgbWFya2Vyc0RhdGE6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgcHVibGljIG1hcERhdGE6IElDYU1hcFByb3BzID0ge307XG4gIHB1YmxpYyBvcGVuZWRJbmZvV2luZG93RGF0YTogSU1hcE1hcmtlcnMgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGFyZWFGaWx0ZXJEYXRhID0gTWFwT3B0aW9uc0NvbnN0YW50cy5hcmVhRmlsdGVyRGF0YTtcbiAgcHVibGljIGlzQXJlYUZpbHRlckFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaG92ZXJlZE1hcmtlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN0b3JlSW5pdGlhbEljb25Gb3JNYXJrZXIoKTtcbiAgICB0aGlzLnN0b3JlSW5pdGlhbEljb25Gb3JSb3V0aW5nTWFya2VyKCk7XG4gICAgLy8gUmVzZXQgYWxsIGljb25zIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUgb24gcGFnZSBsb2FkXG4gICAgdGhpcy5yZXNldE1hcmtlcnNJY29ucygpO1xuICAgIHRoaXMucmVzZXRSb3V0aW5nTWFya2VycygpO1xuICB9XG5cbiAgcHVibGljIHN0b3JlSW5pdGlhbEljb25Gb3JNYXJrZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsTWFya2VySWNvbnMgPSBbXTtcblxuICAgIHRoaXMubWFwRGF0YSEubWFya2Vycz8uZm9yRWFjaCgobWFya2VyOiBJTWFwTWFya2VycywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5pbml0aWFsTWFya2VySWNvbnNbaW5kZXhdID0ge1xuICAgICAgICB1cmw6IG1hcmtlci5pY29uIS51cmwsXG4gICAgICAgIGxhYmVsT3JpZ2luOiBtYXJrZXIuaWNvbiEubGFiZWxPcmlnaW4sXG4gICAgICAgIHpJbmRleDogbWFya2VyLm9wdGlvbnM/LnpJbmRleCA/PyAxLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9yZUluaXRpYWxJY29uRm9yUm91dGluZ01hcmtlcigpOiB2b2lkIHtcbiAgICB0aGlzLm1hcERhdGEucm91dGluZ01hcmtlcnM/LmZvckVhY2goXG4gICAgICAobWFya2VyOiBJTWFwTWFya2VycywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICB0aGlzLmluaXRpYWxJY29uc1tpbmRleF0gPSB7XG4gICAgICAgICAgdXJsOiBtYXJrZXIuaWNvbiEudXJsLFxuICAgICAgICAgIGxhYmVsT3JpZ2luOiBtYXJrZXIuaWNvbiEubGFiZWxPcmlnaW4sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsdXN0ZXJNYXJrZXJDbGljayhtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgIGNvbnN0IGlzSW5mb1dpbmRvd09wZW5lZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICBtYXJrZXJJdGVtLFxuICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICk7XG5cbiAgICBpZiAoIWlzSW5mb1dpbmRvd09wZW5lZCkgdGhpcy5jbHVzdGVyTWFya2VyQ2xpY2suZW1pdChtYXJrZXJJdGVtKTtcbiAgICBlbHNlIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya2VySW5mb1dpbmRvdyhtYXJrZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKG1hcmtlcklkKSB0aGlzLmdldEluZm9XaW5kb3dEYXRhLmVtaXQobWFya2VySWQpO1xuICB9XG5cbiAgcHVibGljIG9uTWFya2VyQ2xpY2sobWFya2VySXRlbTogSU1hcE1hcmtlcnMpOiB2b2lkIHtcbiAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgbWFya2VySXRlbSxcbiAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICApO1xuXG4gICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHRoaXMuZ2V0TWFya2VySW5mb1dpbmRvdyhtYXJrZXJJdGVtLmRhdGEuaWQpO1xuICAgIGVsc2UgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXJlY3Rpb25zT25NYXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwcz8uZ29vZ2xlTWFwKSB7XG4gICAgICB0aGlzLmRpcmVjdGlvbnNSZW5kZXJlcnMuZm9yRWFjaCgocmVuZGVyZXIpID0+XG4gICAgICAgIHJlbmRlcmVyLnNldE1hcCh0aGlzLm1hcHM/Lmdvb2dsZU1hcCEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVBbmREaXNwbGF5Um91dGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwRGF0YS5yb3V0ZVBhdGhzKSB7XG4gICAgICAvLyBDbGVhciBwcmV2aW91cyBkaXJlY3Rpb25zIHJlbmRlcmVyc1xuICAgICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyZXJzLmZvckVhY2goKHJlbmRlcmVyKSA9PiByZW5kZXJlci5zZXRNYXAobnVsbCkpO1xuICAgICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyZXJzID0gW107XG5cbiAgICAgIHRoaXMubWFwRGF0YS5yb3V0ZVBhdGhzIS5mb3JFYWNoKChyb3V0ZTogSU1hcFJvdXRlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVxdWVzdCA9IHtcbiAgICAgICAgICBvcmlnaW46IHJvdXRlLnBhdGhbMF0sXG4gICAgICAgICAgZGVzdGluYXRpb246IHJvdXRlLnBhdGhbcm91dGUucGF0aC5sZW5ndGggLSAxXSxcbiAgICAgICAgICB3YXlwb2ludHM6IHJvdXRlLnBhdGhcbiAgICAgICAgICAgIC5zbGljZSgxLCByb3V0ZS5wYXRoLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAubWFwKChwb3NpdGlvbikgPT4gKHsgbG9jYXRpb246IHBvc2l0aW9uIH0pKSxcbiAgICAgICAgICB0cmF2ZWxNb2RlOiBnb29nbGUubWFwcy5UcmF2ZWxNb2RlLkJJQ1lDTElORyxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpcmVjdGlvblNlcnZpY2Uucm91dGUocmVxdWVzdCwgKHJlc3VsdCwgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1N0YXR1cy5PSyAmJiByZXN1bHQ/LnJvdXRlc1swXSkge1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uc1JlbmRlcmVyID0gbmV3IGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNSZW5kZXJlcih7XG4gICAgICAgICAgICAgIHN1cHByZXNzSW5mb1dpbmRvd3M6IHRydWUsXG4gICAgICAgICAgICAgIHN1cHByZXNzTWFya2VyczogdHJ1ZSxcbiAgICAgICAgICAgICAgcHJlc2VydmVWaWV3cG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgcG9seWxpbmVPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6IHJvdXRlLnN0cm9rZUNvbG9yIHx8IEdvb2dsZU1hcEVudW0uU1RST0tFX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZU9wYWNpdHk6ICFyb3V0ZS5pc0Rhc2hlZFxuICAgICAgICAgICAgICAgICAgPyByb3V0ZS5zdHJva2VPcGFjaXR5IHx8IEdvb2dsZU1hcEVudW0uU1RST0tFX09QQUNJVFlcbiAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICBzdHJva2VXZWlnaHQ6IHJvdXRlLnN0cm9rZVdlaWdodCB8fCBHb29nbGVNYXBFbnVtLlNUUk9LRV9XRUlHSFQsXG4gICAgICAgICAgICAgICAgaWNvbnM6IHJvdXRlLmlzRGFzaGVkXG4gICAgICAgICAgICAgICAgICA/IHJvdXRlLmRhc2hlZExpbmVTdHlsZSA/P1xuICAgICAgICAgICAgICAgICAgICBNYXBPcHRpb25zQ29uc3RhbnRzLnJvdXRpbmdEYXNoZWRMaW5lSWNvblxuICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaXJlY3Rpb25zUmVuZGVyZXIuc2V0RGlyZWN0aW9ucyhyZXN1bHQpO1xuICAgICAgICAgICAgdGhpcy5kaXJlY3Rpb25zUmVuZGVyZXJzLnB1c2goZGlyZWN0aW9uc1JlbmRlcmVyKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uc09uTWFwKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUm91dGluZ01hcmtlckNsaWNrKFxuICAgIGk6IG51bWJlcixcbiAgICBldmVudDogZ29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudCxcbiAgICBtYXJrZXJpdGVtOiBJTWFwTWFya2Vyc1xuICApOiB2b2lkIHtcbiAgICAvLyBpZiAobWFya2VyaXRlbT8uaW5mb1dpbmRvd0NvbnRlbnQpIHtcbiAgICAvLyAgIGlmIChcbiAgICAvLyAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93SW5kZXhSb3V0aW5nID09PSBpICYmXG4gICAgLy8gICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvd1JvdXRpbmdcbiAgICAvLyAgICkge1xuICAgIC8vICAgICBjb25zdCBpbmZvV2luZG93ID0gdGhpcy5pbmZvV2luZG93c1ZpZXdSb3V0aW5nLnRvQXJyYXkoKVtpXTtcbiAgICAvLyAgICAgLy8gQ2xvc2UgdGhlIGN1cnJlbnRseSBvcGVuIGluZm8gd2luZG93IGFuZCByZXNldCB0aGUgaW5kZXhcbiAgICAvLyAgICAgdGhpcy5tYXBEYXRhLnJvdXRpbmdNYXJrZXJzIS5tYXAoKGl0ZW06IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgLy8gICAgICAgaWYgKGluZGV4ID09PSBpKSB7XG4gICAgLy8gICAgICAgICBpdGVtLmljb24gPSB7XG4gICAgLy8gICAgICAgICAgIHVybDogdGhpcy5pbml0aWFsSWNvbnNbaW5kZXhdIS51cmwsXG4gICAgLy8gICAgICAgICAgIGxhYmVsT3JpZ2luOiB0aGlzLmluaXRpYWxJY29uc1tpbmRleF0hLmxhYmVsT3JpZ2luLFxuICAgIC8vICAgICAgICAgfTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICBpbmZvV2luZG93LmNsb3NlKCk7XG4gICAgLy8gICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvd0luZGV4Um91dGluZyA9IG51bGw7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBjb25zdCBtYXJrZXJJbmRleCA9IHRoaXMubWFya2VyUm91dGluZy50b0FycmF5KClbaV07XG4gICAgLy8gICAgIGNvbnN0IGluZm9XaW5kb3cgPSB0aGlzLmluZm9XaW5kb3dzVmlld1JvdXRpbmcudG9BcnJheSgpW2ldO1xuICAgIC8vICAgICBpZiAodGhpcy5jdXJyZW50bHlPcGVuV2luZG93Um91dGluZykge1xuICAgIC8vICAgICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvd1JvdXRpbmcuY2xvc2UoKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZiAoaW5mb1dpbmRvdykge1xuICAgIC8vICAgICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIGljb24gZm9yIHRoZSBwcmV2aW91c2x5IGZvY3VzZWQgcm91dGluZyBtYXJrZXJcbiAgICAvLyAgICAgICBpZiAoXG4gICAgLy8gICAgICAgICB0aGlzLmZvY3VzZWRJY29uUm91dGluZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgLy8gICAgICAgICB0aGlzLmZvY3VzZWRJY29uUm91dGluZyAhPT0gaVxuICAgIC8vICAgICAgICkge1xuICAgIC8vICAgICAgICAgY29uc3QgcHJldmlvdXNGb2N1c2VkSXRlbSA9XG4gICAgLy8gICAgICAgICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2VycyFbdGhpcy5mb2N1c2VkSWNvblJvdXRpbmddO1xuICAgIC8vICAgICAgICAgaWYgKHByZXZpb3VzRm9jdXNlZEl0ZW0pIHtcbiAgICAvLyAgICAgICAgICAgcHJldmlvdXNGb2N1c2VkSXRlbS5pY29uID0ge1xuICAgIC8vICAgICAgICAgICAgIHVybDogdGhpcy5pbml0aWFsSWNvbnNbdGhpcy5mb2N1c2VkSWNvblJvdXRpbmddLnVybCxcbiAgICAvLyAgICAgICAgICAgICBsYWJlbE9yaWdpbjpcbiAgICAvLyAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbEljb25zW3RoaXMuZm9jdXNlZEljb25Sb3V0aW5nXS5sYWJlbE9yaWdpbixcbiAgICAvLyAgICAgICAgICAgfTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IG1hcmtlclxuICAgIC8vICAgICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2VycyEubWFwKFxuICAgIC8vICAgICAgICAgKGl0ZW06IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgLy8gICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xuICAgIC8vICAgICAgICAgICAgIHRoaXMucHJldmlvdXNJY29uVXJsUm91dGluZyA9IGl0ZW0uaWNvbiA/IGl0ZW0uaWNvbi51cmwgOiAnJztcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmZvY3VzZWRJY29uUm91dGluZyA9IGk7XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93TGFiZWwgPSBmYWxzZTtcbiAgICAvLyAgICAgICAgICAgICBpdGVtLmljb24gPSB7XG4gICAgLy8gICAgICAgICAgICAgICB1cmw6XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMubWFwRGF0YS5pc1VuaXRWaWV3U3RvcHMgfHwgdGhpcy5tYXBEYXRhLmlzRHJpdmVyTWlsZXNcbiAgICAvLyAgICAgICAgICAgICAgICAgICA/IGl0ZW0uaWNvbiEudXJsXG4gICAgLy8gICAgICAgICAgICAgICAgICAgOiBNYXBTdmdSb3V0ZXMubWFya2VyU3ZnUm91dGUsXG4gICAgLy8gICAgICAgICAgICAgfTtcbiAgICAvLyAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3dMYWJlbCA9IHRydWU7XG4gICAgLy8gICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICApO1xuICAgIC8vICAgICAgIGluZm9XaW5kb3cub3BlbihtYXJrZXJJbmRleCk7XG4gICAgLy8gICAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93Um91dGluZyA9IGluZm9XaW5kb3c7XG4gICAgLy8gICAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93SW5kZXhSb3V0aW5nID0gaTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vICAgdGhpcy5tYXJrZXJDbGljay5lbWl0KG1hcmtlcml0ZW0pO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMubWFwcy5nb29nbGVNYXA/LmFkZExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG5cbiAgICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2Vycz8ubWFwKChpdGVtOiBJTWFwTWFya2VycywgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChpID09PSB0aGlzLmZvY3VzZWRJY29uUm91dGluZykge1xuICAgICAgICAgIGl0ZW0uaWNvbiA9IHtcbiAgICAgICAgICAgIHVybDogdGhpcy5pbml0aWFsSWNvbnNbaV0udXJsLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0TWFya2Vyc0ljb25zKCk6IHZvaWQge1xuICAgIHRoaXMubWFwRGF0YS5tYXJrZXJzPy5tYXAoKG1hcmtlcjogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm1hcmtlcixcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIC4uLm1hcmtlci5pY29uLFxuICAgICAgICAgIHNjYWxlZFNpemU6IG1hcmtlci5pc0xhcmdlTWFya2VyXG4gICAgICAgICAgICA/IE1hcE9wdGlvbnNDb25zdGFudHMubGFyZ2VNYXJrZXJTaXplXG4gICAgICAgICAgICA6IE1hcE9wdGlvbnNDb25zdGFudHMuZGVmYXVsdE1hcmtlclNpemUsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnM6IHsgekluZGV4OiBpbmRleCArIDEgfSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFJvdXRpbmdNYXJrZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2Vycz8uZm9yRWFjaChcbiAgICAgIChtYXJrZXI6IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIG1hcmtlci5pY29uID0ge1xuICAgICAgICAgIHVybDogbWFya2VyLmljb24hLnVybCxcbiAgICAgICAgICBsYWJlbE9yaWdpbjogbWFya2VyLmljb24hLmxhYmVsT3JpZ2luLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25NYXBSZWFkeShtYXBJbnN0YW5jZTogZ29vZ2xlLm1hcHMuTWFwKToge1xuICAgIGZpbGxDb2xvcj86IHN0cmluZztcbiAgICBzdHJva2VDb2xvcj86IHN0cmluZztcbiAgICBzdHJva2VXZWlnaHQ/OiBudW1iZXI7XG4gICAgZmlsbE9wYWNpdHk/OiBudW1iZXI7XG4gIH0gfCB2b2lkIHtcbiAgICB0aGlzLm1hcCA9IG1hcEluc3RhbmNlO1xuXG4gICAgaWYgKHRoaXMubWFwRGF0YS5zdGF0ZUJvdW5kYXJpZXNVcmwpIHtcbiAgICAgIGNvbnN0IHN0YXRlQm91bmRhcmllc1VybCA9IHRoaXMubWFwRGF0YS5zdGF0ZUJvdW5kYXJpZXNVcmwudXJsO1xuICAgICAgdGhpcy5tYXBzLmdvb2dsZU1hcD8uZGF0YS5sb2FkR2VvSnNvbihzdGF0ZUJvdW5kYXJpZXNVcmwpO1xuXG4gICAgICB0aGlzLm1hcHMuZ29vZ2xlTWFwPy5kYXRhLnNldFN0eWxlKChmZWF0dXJlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlRGVuc2l0eSA9IGZlYXR1cmUuZ2V0UHJvcGVydHkoJ2RlbnNpdHknKTtcbiAgICAgICAgY29uc3QgeyBmaWxsQ29sb3IsIGZpbGxPcGFjaXR5IH0gPSBNYXBIZWxwZXIuZ2V0RmlsbENvbG9yRm9yU3RhdGUoXG4gICAgICAgICAgc3RhdGVEZW5zaXR5IGFzIG51bWJlcixcbiAgICAgICAgICB0aGlzLm1hcERhdGEudmlldyB8fCAnJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpbGxDb2xvcjogZmlsbENvbG9yLFxuICAgICAgICAgIHN0cm9rZUNvbG9yOiAnI0VFRUVFRScsXG4gICAgICAgICAgc3Ryb2tlV2VpZ2h0OiAwLjYsXG4gICAgICAgICAgZmlsbE9wYWNpdHk6IGZpbGxPcGFjaXR5LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZW5kQm91bmRzQ2hhbmdlZEV2ZW50KCk7XG4gICAgdGhpcy5zZXRNYXBTdHlsZXMoKTtcbiAgICB0aGlzLmdldE1hcElkbGVFdmVudChtYXBJbnN0YW5jZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0TWFwU3R5bGVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcERhdGE/LmRhcmtNb2RlKVxuICAgICAgdGhpcy5tYXBPcHRpb25zID0ge1xuICAgICAgICAuLi50aGlzLm1hcE9wdGlvbnMsXG4gICAgICAgIHN0eWxlczogTWFwQ29uc3RhbnRzLkdPT0dMRV9NQVBfREFSS19TVFlMRVMsXG4gICAgICB9O1xuXG4gICAgY29uc3QgYWxsTWFya2Vyc0NvbWJpbmVkID0gW1xuICAgICAgLi4uKHRoaXMubWFwRGF0YS5yb3V0aW5nTWFya2VycyA/PyBbXSksXG4gICAgICAuLi4odGhpcy5tYXBEYXRhLmNsdXN0ZXJNYXJrZXJzID8/IFtdKSxcbiAgICAgIC4uLih0aGlzLm1hcERhdGEubWFya2VycyA/PyBbXSksXG4gICAgXTtcblxuICAgIGlmIChhbGxNYXJrZXJzQ29tYmluZWQ/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbWFwQ2VudGVyQW5kQm91bmRzID1cbiAgICAgICAgTWFwSGVscGVyLmdldE1hcENlbnRlckFuZFpvb20oYWxsTWFya2Vyc0NvbWJpbmVkKTtcblxuICAgICAgdGhpcy5tYXAhLnBhblRvKG1hcENlbnRlckFuZEJvdW5kcy5tYXBDZW50ZXIpO1xuICAgICAgaWYgKG1hcENlbnRlckFuZEJvdW5kcy5ib3VuZHMpXG4gICAgICAgIHRoaXMubWFwPy5maXRCb3VuZHMobWFwQ2VudGVyQW5kQm91bmRzLmJvdW5kcyk7XG4gICAgICBpZiAobWFwQ2VudGVyQW5kQm91bmRzLm1hcFpvb20pXG4gICAgICAgIHRoaXMubWFwPy5zZXRab29tKG1hcENlbnRlckFuZEJvdW5kcy5tYXBab29tKTtcblxuICAgICAgdGhpcy5pc01hcENlbnRlclNldCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1hcElkbGVFdmVudChtYXA6IGdvb2dsZS5tYXBzLk1hcCk6IHZvaWQge1xuICAgIG1hcC5hZGRMaXN0ZW5lcignaWRsZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmRCb3VuZHNDaGFuZ2VkRXZlbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICBjb25zdCBtYXBCb3VuZHMgPSB0aGlzLm1hcC5nZXRCb3VuZHMoKTtcbiAgICAgIGNvbnN0IG1hcFpvb20gPSB0aGlzLm1hcC5nZXRab29tKCk7XG5cbiAgICAgIGlmIChtYXBCb3VuZHMgJiYgbWFwWm9vbSkge1xuICAgICAgICBjb25zdCBib3VuZHNPYmplY3QgPSB7IGJvdW5kczogbWFwQm91bmRzLCB6b29tOiBtYXBab29tIH07XG4gICAgICAgIHRoaXMuYm91bmRzQ2hhbmdlZC5lbWl0KGJvdW5kc09iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0U2VsZWN0ZWRNYXJrZXJJdGVtLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE5ld0RhdGEoZGF0YTogSUNhTWFwUHJvcHMpOiBJQ2FNYXBQcm9wcyB7XG4gICAgY29uc3QgbmV3TWFya2VycyA9IGRhdGE/Lm1hcmtlcnM/Lm1hcCgobWFya2VyOiBJTWFwTWFya2VycykgPT4ge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZE1hcmtlciA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgIG1hcmtlcixcbiAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICAgKTtcblxuICAgICAgaWYgKGlzU2VsZWN0ZWRNYXJrZXIpIHtcbiAgICAgICAgY29uc3QgbmV3TWFya2VyRGF0YSA9IHtcbiAgICAgICAgICAuLi5tYXJrZXIsXG4gICAgICAgICAgaWNvbjoge1xuICAgICAgICAgICAgLi4ubWFya2VyLmljb24sXG4gICAgICAgICAgICBzY2FsZWRTaXplOiBNYXBPcHRpb25zQ29uc3RhbnRzLmxhcmdlTWFya2VyU2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnM6IHsgekluZGV4OiA5OTkgfSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV3TWFya2VyRGF0YTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcmtlcjtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgbWFya2VyczogbmV3TWFya2VycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIG9wZW5NYXJrZXJJbmZvV2luZG93KG1hcmtlckl0ZW06IElNYXBTZWxlY3RlZE1hcmtlckRhdGEpOiB2b2lkIHtcbiAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgbWFya2VySXRlbSxcbiAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICApO1xuXG4gICAgY29uc3QgaXNDbHVzdGVySXRlbUNoYW5nZWQgPSB0aGlzLmNoZWNrQ2x1c3RlckRhdGFDaGFuZ2VzKFxuICAgICAgbWFya2VySXRlbSxcbiAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvd3NWaWV3ICYmICghaXNJbmZvV2luZG93T3BlbmVkIHx8IGlzQ2x1c3Rlckl0ZW1DaGFuZ2VkKSkge1xuICAgICAgdGhpcy5tYXBEYXRhLm1hcmtlcnMhLm1hcCgoaXRlbTogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZE1hcmtlciA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oaXRlbSwgbWFya2VySXRlbSk7XG4gICAgICAgIGlmIChpc1NlbGVjdGVkTWFya2VyKSB7XG4gICAgICAgICAgaXRlbS5pY29uID0ge1xuICAgICAgICAgICAgLi4uaXRlbS5pY29uLFxuICAgICAgICAgICAgc2NhbGVkU2l6ZTogTWFwT3B0aW9uc0NvbnN0YW50cy5sYXJnZU1hcmtlclNpemUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVtLm9wdGlvbnMgPSB7IHpJbmRleDogOTk5IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbS5pY29uID0ge1xuICAgICAgICAgICAgLi4uaXRlbS5pY29uLFxuICAgICAgICAgICAgc2NhbGVkU2l6ZTogaXRlbS5pc0xhcmdlTWFya2VyXG4gICAgICAgICAgICAgID8gTWFwT3B0aW9uc0NvbnN0YW50cy5sYXJnZU1hcmtlclNpemVcbiAgICAgICAgICAgICAgOiBNYXBPcHRpb25zQ29uc3RhbnRzLmRlZmF1bHRNYXJrZXJTaXplLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaXRlbS5vcHRpb25zID0geyB6SW5kZXg6IGluZGV4ICsgMSB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50bHlPcGVuV2luZG93ID0gdGhpcy5pbmZvV2luZG93c1ZpZXc7XG4gICAgICB0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhID0gbWFya2VySXRlbTtcblxuICAgICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHtcbiAgICAgICAgdGhpcy5tYXAhLnBhblRvKG1hcmtlckl0ZW0ucG9zaXRpb24pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5mb1dpbmRvd09wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmluZm9XaW5kb3dPcHRpb25zLFxuICAgICAgICAgICAgcG9zaXRpb246IG1hcmtlckl0ZW0ucG9zaXRpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmluZm9XaW5kb3dzVmlldy5vcGVuKCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICBtYXJrZXJJdGVtOiBJTWFwTWFya2VycyxcbiAgICBtYXJrZXJJdGVtMj86IElNYXBNYXJrZXJzIHwgbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgbWFya2VySXRlbS5wb3NpdGlvbi5sYXQgPT09IG1hcmtlckl0ZW0yPy5wb3NpdGlvbj8ubGF0ICYmXG4gICAgICBtYXJrZXJJdGVtLnBvc2l0aW9uLmxuZyA9PT0gbWFya2VySXRlbTI/LnBvc2l0aW9uPy5sbmdcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsb3NlSW5mb1dpbmRvdygpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0TWFya2Vyc0ljb25zKCk7XG5cbiAgICB0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cgPSBudWxsO1xuICAgIHRoaXMuaW5mb1dpbmRvd3NWaWV3LmNsb3NlKCk7XG4gICAgdGhpcy5yZXNldFNlbGVjdGVkTWFya2VySXRlbS5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTWFwRGF0YShuZXdEYXRhOiBJQ2FNYXBQcm9wcyk6IHZvaWQge1xuICAgIHRoaXMubWFwRGF0YSA9IHRoaXMuZ2V0TmV3RGF0YShuZXdEYXRhKTtcblxuICAgIGlmICh0aGlzLm1hcERhdGEuc2VsZWN0ZWRNYXJrZXJEYXRhKVxuICAgICAgdGhpcy5vcGVuTWFya2VySW5mb1dpbmRvdyh0aGlzLm1hcERhdGEuc2VsZWN0ZWRNYXJrZXJEYXRhKTtcbiAgICBlbHNlIGlmICh0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cpIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG5cbiAgICBpZiAobmV3RGF0YSAmJiAhdGhpcy5pc01hcENlbnRlclNldCAmJiB0aGlzLm1hcCkge1xuICAgICAgaWYgKFxuICAgICAgICBuZXdEYXRhLm1hcmtlcnM/Lmxlbmd0aCB8fFxuICAgICAgICBuZXdEYXRhLmNsdXN0ZXJNYXJrZXJzPy5sZW5ndGggfHxcbiAgICAgICAgbmV3RGF0YS5yb3V0aW5nTWFya2Vycz8ubGVuZ3RoXG4gICAgICApXG4gICAgICAgIHRoaXMuc2V0TWFwU3R5bGVzKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIERpc3BsYXkgcm91dGVzIGZvciByb3V0aW5nTWFya2Vyc1xuICAgIHRoaXMuY2FsY3VsYXRlQW5kRGlzcGxheVJvdXRlKCk7XG5cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEpXG4gICAgICB0aGlzLmNsdXN0ZXJMaXN0U2Nyb2xsRXZlbnQuZW1pdCh0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0NsdXN0ZXJEYXRhQ2hhbmdlcyhcbiAgICBuZXdEYXRhOiBJTWFwTWFya2VycyxcbiAgICBwcmV2aW91c0RhdGE/OiBJTWFwTWFya2VycyB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5ld0RhdGEuaW5mb1dpbmRvd0NvbnRlbnQ/LmNsdXN0ZXJEYXRhXG4gICAgICA/IG5ld0RhdGEuaW5mb1dpbmRvd0NvbnRlbnQ/LnNlbGVjdGVkQ2x1c3Rlckl0ZW1EYXRhPy5kYXRhPy5pZCAhPT1cbiAgICAgICAgICBwcmV2aW91c0RhdGE/LmluZm9XaW5kb3dDb250ZW50Py5zZWxlY3RlZENsdXN0ZXJJdGVtRGF0YT8uZGF0YT8uaWQgfHxcbiAgICAgICAgICBuZXdEYXRhLmluZm9XaW5kb3dDb250ZW50Py5jbHVzdGVyRGF0YT8ubGVuZ3RoICE9PVxuICAgICAgICAgICAgcHJldmlvdXNEYXRhPy5pbmZvV2luZG93Q29udGVudD8uY2x1c3RlckRhdGE/Lmxlbmd0aFxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1hcmtlck1vdXNlb3ZlcihtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgIGlmIChtYXJrZXJJdGVtPy5sYWJlbD8uaXNTaG93T25Ib3ZlcilcbiAgICAgIHRoaXMuaG92ZXJlZE1hcmtlcklkID0gbWFya2VySXRlbT8uZGF0YT8uaWQ7XG4gIH1cblxuICBwdWJsaWMgb25NYXJrZXJNb3VzZW91dChtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgIGlmIChtYXJrZXJJdGVtPy5sYWJlbD8uaXNTaG93T25Ib3ZlcikgdGhpcy5ob3ZlcmVkTWFya2VySWQgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uWm9vbUNoYW5nZShpc01pbnVzQ2xpY2s/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFpvb21MZXZlbCA9IHRoaXMubWFwPy5nZXRab29tKCk7XG5cbiAgICBpZiAoY3VycmVudFpvb21MZXZlbCkge1xuICAgICAgY29uc3QgbmV4dFpvb21MZXZlbCA9IGlzTWludXNDbGlja1xuICAgICAgICA/IGN1cnJlbnRab29tTGV2ZWwgLSAxXG4gICAgICAgIDogY3VycmVudFpvb21MZXZlbCArIDE7XG4gICAgICB0aGlzLm1hcD8uc2V0Wm9vbShuZXh0Wm9vbUxldmVsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25PcGVuSW5NYXAoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuSW5NYXBFdmVudC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIG1hcmtlcjogSU1hcE1hcmtlcnMpOiBudW1iZXIge1xuICAgIHJldHVybiBtYXJrZXIuZGF0YS5pZDtcbiAgfVxuXG4gIHB1YmxpYyB0cmFja0J5UG9zaXRpb24oaW5kZXg6IG51bWJlciwgbWFya2VyOiBJTWFwTWFya2Vycyk6IG51bWJlciB7XG4gICAgcmV0dXJuIG1hcmtlci5wb3NpdGlvbi5sYXQgKyBtYXJrZXIucG9zaXRpb24ubG5nO1xuICB9XG5cbiAgcHVibGljIGlkZW50aXR5KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT4gcmVuZGVyZXIuc2V0TWFwKG51bGwpKTtcbiAgfVxufVxuIiwiPGdvb2dsZS1tYXBcbiAgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiXG4gIFtjbGFzcy5kYXJrLW1vZGUtbWFwXT1cIm1hcERhdGEuZGFya01vZGVcIlxuICBoZWlnaHQ9XCIxMDAlXCJcbiAgd2lkdGg9XCIxMDAlXCJcbiAgW3pvb21dPVwibWFwWm9vbVwiXG4gIFtjZW50ZXJdPVwibWFwQ2VudGVyXCJcbiAgW29wdGlvbnNdPVwibWFwT3B0aW9uc1wiXG4gIChtYXBJbml0aWFsaXplZCk9XCJvbk1hcFJlYWR5KCRldmVudClcIlxuPlxuICA8bWFwLW1hcmtlclxuICAgICNtYXJrZXI9XCJtYXBNYXJrZXJcIlxuICAgICpuZ0Zvcj1cIlxuICAgICAgbGV0IG1hcmtlcml0ZW0gb2YgbWFwRGF0YS5tYXJrZXJzO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHRyYWNrQnk6IHRyYWNrQnlJZFxuICAgIFwiXG4gICAgW3Bvc2l0aW9uXT1cIm1hcmtlcml0ZW0ucG9zaXRpb25cIlxuICAgIFtpY29uXT1cIm1hcmtlcml0ZW0uaWNvbiFcIlxuICAgIFtsYWJlbF09XCJcbiAgICAgIChvcGVuZWRJbmZvV2luZG93RGF0YT8ucG9zaXRpb24/LmxhdCA9PT0gbWFya2VyaXRlbT8ucG9zaXRpb24/LmxhdCAmJlxuICAgICAgICBvcGVuZWRJbmZvV2luZG93RGF0YT8ucG9zaXRpb24/LmxuZyA9PT0gbWFya2VyaXRlbT8ucG9zaXRpb24/LmxuZykgfHxcbiAgICAgIChtYXJrZXJpdGVtLmxhYmVsPy5pc1Nob3dPbkhvdmVyICYmXG4gICAgICAgIGhvdmVyZWRNYXJrZXJJZCAhPT0gbWFya2VyaXRlbS5kYXRhLmlkKVxuICAgICAgICA/ICcnXG4gICAgICAgIDogbWFya2VyaXRlbS5sYWJlbCFcbiAgICBcIlxuICAgIFtvcHRpb25zXT1cIm1hcmtlcml0ZW0ub3B0aW9ucyFcIlxuICAgIChtYXBDbGljayk9XCJvbk1hcmtlckNsaWNrKG1hcmtlcml0ZW0pXCJcbiAgICAobWFwTW91c2VvdmVyKT1cIm9uTWFya2VyTW91c2VvdmVyKG1hcmtlcml0ZW0pXCJcbiAgICAobWFwTW91c2VvdXQpPVwib25NYXJrZXJNb3VzZW91dChtYXJrZXJpdGVtKVwiXG4gID5cbiAgPC9tYXAtbWFya2VyPlxuXG4gIDxtYXAtaW5mby13aW5kb3dcbiAgICAjaW5mb1dpbmRvd3NWaWV3PVwibWFwSW5mb1dpbmRvd1wiXG4gICAgW29wdGlvbnNdPVwiaW5mb1dpbmRvd09wdGlvbnNcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZW5lZEluZm9XaW5kb3dEYXRhICE9PSBudWxsXCI+XG4gICAgICA8YXBwLWNhLW1hcC1kcm9wZG93blxuICAgICAgICBbaW5mb1dpbmRvd0NvbnRlbnRdPVwib3BlbmVkSW5mb1dpbmRvd0RhdGEuaW5mb1dpbmRvd0NvbnRlbnRcIlxuICAgICAgICBbbWFya2VyRGF0YV09XCJvcGVuZWRJbmZvV2luZG93RGF0YS5kYXRhXCJcbiAgICAgICAgKG9uQ2x1c3Rlckl0ZW1DbGljayk9XCJnZXRNYXJrZXJJbmZvV2luZG93KCRldmVudClcIlxuICAgICAgICAob25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKT1cIm9uQ2x1c3Rlckxpc3RTY3JvbGxUb0VuZCgpXCJcbiAgICAgICAgKG9uQmFja0J1dHRvbkNsaWNrKT1cIm9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpXCJcbiAgICAgID48L2FwcC1jYS1tYXAtZHJvcGRvd24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWFwLWluZm8td2luZG93PlxuXG4gIDxtYXAtbWFya2VyXG4gICAgI21hcmtlckNsdXN0ZXI9XCJtYXBNYXJrZXJcIlxuICAgICpuZ0Zvcj1cIlxuICAgICAgbGV0IG1hcmtlciBvZiBtYXBEYXRhLmNsdXN0ZXJNYXJrZXJzO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHRyYWNrQnk6IHRyYWNrQnlQb3NpdGlvblxuICAgIFwiXG4gICAgW3Bvc2l0aW9uXT1cIm1hcmtlci5wb3NpdGlvblwiXG4gICAgW2ljb25dPVwibWFya2VyLmljb25cIlxuICAgIChtYXBDbGljayk9XCJvbkNsdXN0ZXJNYXJrZXJDbGljayhtYXJrZXIpXCJcbiAgPlxuICA8L21hcC1tYXJrZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQXJlYUZpbHRlckFjdGl2ZVwiPlxuICAgIDxtYXAtY2lyY2xlXG4gICAgICBbb3B0aW9uc109XCJhcmVhRmlsdGVyRGF0YS5vcHRpb25zXCJcbiAgICAgIFtjZW50ZXJdPVwiYXJlYUZpbHRlckRhdGEuY2VudGVyXCJcbiAgICAgIFtyYWRpdXNdPVwiYXJlYUZpbHRlckRhdGEucmFkaXVzXCJcbiAgICA+PC9tYXAtY2lyY2xlPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bWFwLW1hcmtlclxuICAgICNtYXJrZXJSb3V0aW5nPVwibWFwTWFya2VyXCJcbiAgICAqbmdGb3I9XCJcbiAgICAgIGxldCBtYXJrZXJpdGVtIG9mIG1hcERhdGEucm91dGluZ01hcmtlcnM7XG4gICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgdHJhY2tCeTogaWRlbnRpdHlcbiAgICBcIlxuICAgIFtwb3NpdGlvbl09XCJtYXJrZXJpdGVtLnBvc2l0aW9uXCJcbiAgICBbaWNvbl09XCJtYXJrZXJpdGVtLmljb24hXCJcbiAgICBbbGFiZWxdPVwiZm9jdXNlZEljb25Sb3V0aW5nICE9PSBpID8gbWFya2VyaXRlbS5sYWJlbCEgOiAnJ1wiXG4gICAgW29wdGlvbnNdPVwibWFya2VyaXRlbS5vcHRpb25zIVwiXG4gICAgKG1hcENsaWNrKT1cIm9uUm91dGluZ01hcmtlckNsaWNrKGksICRldmVudCwgbWFya2VyaXRlbSlcIlxuICA+XG4gICAgPG1hcC1pbmZvLXdpbmRvdyAjaW5mb1dpbmRvd3NWaWV3Um91dGluZz1cIm1hcEluZm9XaW5kb3dcIj5cbiAgICAgIDxhcHAtY2EtbWFwLWRyb3Bkb3duPjwvYXBwLWNhLW1hcC1kcm9wZG93bj5cbiAgICA8L21hcC1pbmZvLXdpbmRvdz5cbiAgPC9tYXAtbWFya2VyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXBEYXRhLmlzT3BlbkluTWFwU2hvd25cIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIm9wZW4taW4tbWFwLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxuICAgICAgbmdiVG9vbHRpcFxuICAgICAgbWFpbkNhVG9vbHRpcD1cIk9wZW4gaW4gTWFwXCJcbiAgICAgIHRvb2x0aXBCYWNrZ3JvdW5kPVwiIzQyNDI0MlwiXG4gICAgICBwb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwib25PcGVuSW5NYXAoKVwiXG4gICAgPlxuICAgICAgPHN2Zy1pY29uXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgc3JjPVwiYXNzZXRzL2NhLWNvbXBvbmVudHMvc3ZnL2NvbW1vbi9pY19sb2NhdGlvbl9tYXAuc3ZnXCJcbiAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTgsICdoZWlnaHQucHgnOiAxOCB9XCJcbiAgICAgID48L3N2Zy1pY29uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwRGF0YS5pc1pvb21TaG93blwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibWFwLXpvb20tY29udGFpbmVyIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1lbmQgZ2FwLTFcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnZmxleC1jb2x1bW4nOiAhbWFwRGF0YS5pc1ZlcnRpY2FsWm9vbSxcbiAgICAgICAgJ3ZlcnRpY2FsLXpvb20tYnV0dG9ucyc6IG1hcERhdGEuaXNWZXJ0aWNhbFpvb21cbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXAtem9vbS1idXR0b25zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBbY2xhc3MuZmxleC1jb2x1bW5dPVwibWFwRGF0YS5pc1ZlcnRpY2FsWm9vbVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvbi1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGZsZXgtMVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uWm9vbUNoYW5nZSh0cnVlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9wb3B1cC9NaW51cy5zdmdcIlxuICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTQsICdoZWlnaHQucHgnOiAxNCB9XCJcbiAgICAgICAgICA+PC9zdmctaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZmxleC0xXCJcbiAgICAgICAgICAoY2xpY2spPVwib25ab29tQ2hhbmdlKGZhbHNlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9jb21tb24vaWNfcGx1cy5zdmdcIlxuICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTQsICdoZWlnaHQucHgnOiAxNCB9XCJcbiAgICAgICAgICA+PC9zdmctaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXAtem9vbS1yYW5nZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS10ZXh0IGNhLWZvbnQtbWVkaXVtXCI+NTAgbWk8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJhbmdlLWxpbmVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZ29vZ2xlLW1hcD5cbiJdfQ==
|
|
401
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLW1hcC9jYS1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtbWFwL2NhLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLFVBQVU7QUFDVixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkUsYUFBYTtBQUNiLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRTNGLFFBQVE7QUFDUixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBYTlDLFVBQVU7QUFDVixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFL0QsWUFBWTtBQUNaLE9BQU8sRUFDSCw2QkFBNkIsRUFD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TTtnQkFDa0MsSUFBSTtzQkFBNUMsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNWLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNHLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG4vLyBNb2R1bGVzXG5pbXBvcnQgeyBBbmd1bGFyU3ZnSWNvbk1vZHVsZSB9IGZyb20gJ2FuZ3VsYXItc3ZnLWljb24nO1xuaW1wb3J0IHsgTmdiVG9vbHRpcE1vZHVsZSB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEdvb2dsZU1hcCwgR29vZ2xlTWFwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2dvb2dsZS1tYXBzJztcblxuLy8gQ29tcG9uZW50c1xuaW1wb3J0IHsgQ2FNYXBEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2NhLW1hcC1kcm9wZG93bi9jYS1tYXAtZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IENhQXBwVG9vbHRpcFYyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2EtYXBwLXRvb2x0aXAtdjIvY2EtYXBwLXRvb2x0aXAtdjIuY29tcG9uZW50JztcblxuLy8gRW51bXNcbmltcG9ydCB7IEdvb2dsZU1hcEVudW0gfSBmcm9tICcuLi9jYS1tYXAvZW51bXMvZ29vZ2xlLW1hcC5lbnVtJztcbmltcG9ydCB7IE1hcE1hcmtlclN0cmluZ0VudW0gfSBmcm9tICcuL2VudW1zJztcblxuLy8gTW9kZWxzXG5pbXBvcnQge1xuICAgIElNYXBNYXJrZXJzLFxuICAgIElNYXBSb3V0ZVBhdGgsXG4gICAgSUNhTWFwUHJvcHMsXG4gICAgSU1hcE9wdGlvbnMsXG4gICAgSVJvdXRlUGF0aCxcbiAgICBJTWFwQm91bmRzWm9vbSxcbiAgICBJTWFwU2VsZWN0ZWRNYXJrZXJEYXRhLFxufSBmcm9tICcuLi9jYS1tYXAvbW9kZWxzL21hcC5tb2RlbCc7XG5cbi8vIEhlbHBlcnNcbmltcG9ydCB7IE1hcEhlbHBlciB9IGZyb20gJy4uL2NhLW1hcC91dGlscy9oZWxwZXJzL21hcC5oZWxwZXInO1xuXG4vLyBDb25zdGFudHNcbmltcG9ydCB7XG4gICAgTWFwSW5mb1dpbmRvd09wdGlvbnNDb25zdGFudHMsXG4gICAgTWFwT3B0aW9uc0NvbnN0YW50cyxcbn0gZnJvbSAnLi91dGlscy9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWFwQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL21hcC5jb25zdGFudCc7XG5cbi8vIFNlcnZpY2VzXG5pbXBvcnQgeyBNYXBNYXJrZXJJY29uU2VydmljZSB9IGZyb20gJy4vdXRpbHMvc2VydmljZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1jYS1tYXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYS1tYXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhLW1hcC5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICAvLyBNb2R1bGVzXG4gICAgICAgIEdvb2dsZU1hcHNNb2R1bGUsXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgQW5ndWxhclN2Z0ljb25Nb2R1bGUsXG4gICAgICAgIE5nYlRvb2x0aXBNb2R1bGUsXG5cbiAgICAgICAgLy8gQ29tcG9uZW50c1xuICAgICAgICBDYU1hcERyb3Bkb3duQ29tcG9uZW50LFxuICAgICAgICBDYUFwcFRvb2x0aXBWMkNvbXBvbmVudCxcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIENhTWFwQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuXG4gICAgICAgIC8vIFNlcnZpY2VzXG4gICAgICAgIHByaXZhdGUgbWFya2VySWNvblNlcnZpY2U6IE1hcE1hcmtlckljb25TZXJ2aWNlXG4gICAgKSB7fVxuICAgIEBJbnB1dCgpIHNldCBkYXRhKHZhbHVlczogSUNhTWFwUHJvcHMpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNYXBEYXRhKHZhbHVlcyk7XG4gICAgfVxuICAgIEBPdXRwdXQoKSByZXNldFNlbGVjdGVkTWFya2VySXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICBAT3V0cHV0KCkgY2x1c3Rlck1hcmtlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJTWFwTWFya2Vycz4oKTtcbiAgICBAT3V0cHV0KCkgY2x1c3Rlckxpc3RTY3JvbGxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8SU1hcE1hcmtlcnM+KCk7XG4gICAgQE91dHB1dCgpIGdldEluZm9XaW5kb3dEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgQE91dHB1dCgpIGJvdW5kc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElNYXBCb3VuZHNab29tPigpO1xuICAgIEBPdXRwdXQoKSBvcGVuSW5NYXBFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAVmlld0NoaWxkKEdvb2dsZU1hcCwgeyBzdGF0aWM6IGZhbHNlIH0pIG1hcHMhOiBHb29nbGVNYXA7XG4gICAgQFZpZXdDaGlsZCgnbWFya2VyRHJvcGRvd24nKSBtYXJrZXJEcm9wZG93biE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY2x1c3RlckRyb3Bkb3duJykgY2x1c3RlckRyb3Bkb3duITogRWxlbWVudFJlZjtcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwdWJsaWMgY3VycmVudGx5T3BlbldpbmRvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBwcmV2aW91c0ljb25VcmwhOiBzdHJpbmc7XG4gICAgcHVibGljIHByZXZpb3VzSWNvblVybFJvdXRpbmchOiBzdHJpbmc7XG4gICAgcHVibGljIGZvY3VzZWRJY29uUm91dGluZyE6IG51bWJlcjtcbiAgICBwcml2YXRlIGRpcmVjdGlvblNlcnZpY2UgPSBuZXcgZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1NlcnZpY2UoKTtcbiAgICBwdWJsaWMgZGlyZWN0aW9uc1JlbmRlcmVyczogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlbmRlcmVyW10gPSBbXTtcbiAgICBwdWJsaWMgaW5mb1dpbmRvd09wdGlvbnM6IGdvb2dsZS5tYXBzLkluZm9XaW5kb3dPcHRpb25zID1cbiAgICAgICAgTWFwSW5mb1dpbmRvd09wdGlvbnNDb25zdGFudHMubWFwSW5mb1dpbmRvd09wdGlvbnM7XG4gICAgcHVibGljIG1hcE9wdGlvbnM6IElNYXBPcHRpb25zID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwT3B0aW9ucztcbiAgICBwdWJsaWMgbWFwWm9vbTogbnVtYmVyID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwWm9vbTtcbiAgICBwdWJsaWMgbWFwQ2VudGVyOiBJUm91dGVQYXRoID0gTWFwT3B0aW9uc0NvbnN0YW50cy5kZWZhdWx0TWFwQ2VudGVyO1xuICAgIHB1YmxpYyBtYXA6IGdvb2dsZS5tYXBzLk1hcCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBpc01hcENlbnRlclNldDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjbHVzdGVyTWFya2Vyc0RhdGE6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgICBwdWJsaWMgbWFya2Vyc0RhdGE6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgICBwdWJsaWMgbWFwRGF0YTogSUNhTWFwUHJvcHMgPSB7fTtcbiAgICBwdWJsaWMgb3BlbmVkSW5mb1dpbmRvd0RhdGE6IElNYXBNYXJrZXJzIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGFyZWFGaWx0ZXJEYXRhID0gTWFwT3B0aW9uc0NvbnN0YW50cy5hcmVhRmlsdGVyRGF0YTtcbiAgICBwdWJsaWMgaXNBcmVhRmlsdGVyQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIG1hcFN0eWxlczogZ29vZ2xlLm1hcHMuTWFwVHlwZVN0eWxlW10gPVxuICAgICAgICBNYXBDb25zdGFudHMuR09PR0xFX01BUF9TVFlMRVM7XG4gICAgcHVibGljIGNsdXN0ZXJNYXJrZXJJZHM6IElNYXBNYXJrZXJzW10gPSBbXTtcbiAgICBwdWJsaWMgcm91dGluZ01hcmtlcklkczogSU1hcE1hcmtlcnNbXSA9IFtdO1xuICAgIHB1YmxpYyBpc01hcmtlckRyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc0NsdXN0ZXJEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgb3BlbkRyb3Bkb3duVGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBtYXBTdHlsZUlkOiBzdHJpbmcgPSAnZDY4MTkwNGEzOTBhODQwMic7XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gUmVzZXQgYWxsIGljb25zIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUgb24gcGFnZSBsb2FkXG4gICAgICAgIHRoaXMucmVzZXRNYXJrZXJzSWNvbnMoKTtcblxuICAgICAgICB0aGlzLmdldFNlcnZpY2VEYXRhKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm1hcHMuZ29vZ2xlTWFwPy5hZGRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlSW5mb1dpbmRvdygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbHVzdGVyTWFya2VyQ2xpY2sobWFya2VySXRlbTogSU1hcE1hcmtlcnMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNJbmZvV2luZG93T3BlbmVkID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgIG1hcmtlckl0ZW0sXG4gICAgICAgICAgICB0aGlzLm9wZW5lZEluZm9XaW5kb3dEYXRhXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFpc0luZm9XaW5kb3dPcGVuZWQpIHRoaXMuY2x1c3Rlck1hcmtlckNsaWNrLmVtaXQobWFya2VySXRlbSk7XG4gICAgICAgIGVsc2UgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFya2VySW5mb1dpbmRvdyhtYXJrZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChtYXJrZXJJZCkgdGhpcy5nZXRJbmZvV2luZG93RGF0YS5lbWl0KG1hcmtlcklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25NYXJrZXJDbGljayhtYXJrZXJJdGVtOiBJTWFwTWFya2Vycyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0luZm9XaW5kb3dPcGVuZWQgPSB0aGlzLmNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICAgICAgbWFya2VySXRlbSxcbiAgICAgICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGFcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWlzSW5mb1dpbmRvd09wZW5lZCkgdGhpcy5nZXRNYXJrZXJJbmZvV2luZG93KG1hcmtlckl0ZW0uZGF0YS5pZCk7XG4gICAgICAgIGVsc2UgdGhpcy5jbG9zZUluZm9XaW5kb3coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlyZWN0aW9uc09uTWFwKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tYXBzPy5nb29nbGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRNYXAodGhpcy5tYXBzPy5nb29nbGVNYXAhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVBbmREaXNwbGF5Um91dGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1hcERhdGEucm91dGVQYXRocykge1xuICAgICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgZGlyZWN0aW9ucyByZW5kZXJlcnNcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRNYXAobnVsbClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGlvbnNSZW5kZXJlcnMgPSBbXTtcblxuICAgICAgICAgICAgdGhpcy5tYXBEYXRhLnJvdXRlUGF0aHMhLmZvckVhY2goKHJvdXRlOiBJTWFwUm91dGVQYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdDogZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1JlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbjogcm91dGUucGF0aFswXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IHJvdXRlLnBhdGhbcm91dGUucGF0aC5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgd2F5cG9pbnRzOiByb3V0ZS5wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMSwgcm91dGUucGF0aC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocG9zaXRpb24pID0+ICh7IGxvY2F0aW9uOiBwb3NpdGlvbiB9KSksXG4gICAgICAgICAgICAgICAgICAgIHRyYXZlbE1vZGU6IGdvb2dsZS5tYXBzLlRyYXZlbE1vZGUuQklDWUNMSU5HLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvblNlcnZpY2Uucm91dGUocmVxdWVzdCwgKHJlc3VsdCwgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PT0gZ29vZ2xlLm1hcHMuRGlyZWN0aW9uc1N0YXR1cy5PSyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Py5yb3V0ZXNbMF1cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb25zUmVuZGVyZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVuZGVyZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc0luZm9XaW5kb3dzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc01hcmtlcnM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlVmlld3BvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlsaW5lT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQ29sb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuc3Ryb2tlQ29sb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGVNYXBFbnVtLlNUUk9LRV9DT0xPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZU9wYWNpdHk6ICFyb3V0ZS5pc0Rhc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcm91dGUuc3Ryb2tlT3BhY2l0eSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlTWFwRW51bS5TVFJPS0VfT1BBQ0lUWVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdlaWdodDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zdHJva2VXZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHb29nbGVNYXBFbnVtLlNUUk9LRV9XRUlHSFQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uczogcm91dGUuaXNEYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChyb3V0ZS5kYXNoZWRMaW5lU3R5bGUgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcE9wdGlvbnNDb25zdGFudHMucm91dGluZ0Rhc2hlZExpbmVJY29uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbnNSZW5kZXJlci5zZXREaXJlY3Rpb25zKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbnNSZW5kZXJlcnMucHVzaChkaXJlY3Rpb25zUmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXJlY3Rpb25zT25NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRNYXJrZXJzSWNvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFwRGF0YS5tYXJrZXJzPy5tYXAoKG1hcmtlcjogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnI21hcmtlci0nICsgbWFya2VyLmlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhtYXJrZXJJY29uLCBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEKTtcbiAgICAgICAgICAgIHRoaXMuaXNNYXJrZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5tYXJrZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogeyB6SW5kZXg6IGluZGV4ICsgMSB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXBEYXRhLmNsdXN0ZXJNYXJrZXJzPy5tYXAoXG4gICAgICAgICAgICAoY2x1c3Rlck1hcmtlcjogSU1hcE1hcmtlcnMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbHVzdGVySWQgPSB0aGlzLmdldENsdXN0ZXJJZChjbHVzdGVyTWFya2VyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgICcjY2x1c3Rlci0nICsgY2x1c3RlcklkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1hcFJlYWR5KG1hcEluc3RhbmNlOiBnb29nbGUubWFwcy5NYXApOiB7XG4gICAgICAgIGZpbGxDb2xvcj86IHN0cmluZztcbiAgICAgICAgc3Ryb2tlQ29sb3I/OiBzdHJpbmc7XG4gICAgICAgIHN0cm9rZVdlaWdodD86IG51bWJlcjtcbiAgICAgICAgZmlsbE9wYWNpdHk/OiBudW1iZXI7XG4gICAgfSB8IHZvaWQge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcEluc3RhbmNlO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcERhdGE/LmRhcmtNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZWRNYXBUeXBlID0gbmV3IGdvb2dsZS5tYXBzLlN0eWxlZE1hcFR5cGUoXG4gICAgICAgICAgICAgICAgTWFwQ29uc3RhbnRzLkdPT0dMRV9NQVBfREFSS19TVFlMRVNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm1hcCEubWFwVHlwZXMuc2V0KEdvb2dsZU1hcEVudW0uREFSS19NQVAsIHN0eWxlZE1hcFR5cGUpO1xuICAgICAgICAgICAgdGhpcy5tYXAhLnNldE1hcFR5cGVJZChHb29nbGVNYXBFbnVtLkRBUktfTUFQKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hcERhdGEuc3RhdGVCb3VuZGFyaWVzVXJsKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZUJvdW5kYXJpZXNVcmwgPSB0aGlzLm1hcERhdGEuc3RhdGVCb3VuZGFyaWVzVXJsLnVybDtcbiAgICAgICAgICAgIHRoaXMubWFwcy5nb29nbGVNYXA/LmRhdGEubG9hZEdlb0pzb24oc3RhdGVCb3VuZGFyaWVzVXJsKTtcblxuICAgICAgICAgICAgdGhpcy5tYXBzLmdvb2dsZU1hcD8uZGF0YS5zZXRTdHlsZSgoZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlRGVuc2l0eSA9IGZlYXR1cmUuZ2V0UHJvcGVydHkoJ2RlbnNpdHknKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpbGxDb2xvciwgZmlsbE9wYWNpdHkgfSA9XG4gICAgICAgICAgICAgICAgICAgIE1hcEhlbHBlci5nZXRGaWxsQ29sb3JGb3JTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlRGVuc2l0eSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcERhdGEudmlldyB8fCAnJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogZmlsbENvbG9yLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VDb2xvcjogJyNFRUVFRUUnLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXZWlnaHQ6IDAuNixcbiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IGZpbGxPcGFjaXR5LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpO1xuICAgICAgICB0aGlzLnNldE1hcFN0eWxlcygpO1xuICAgICAgICB0aGlzLmdldE1hcElkbGVFdmVudChtYXBJbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldE1hcFN0eWxlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YT8uZGFya01vZGUpXG4gICAgICAgICAgICB0aGlzLm1hcE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5tYXBPcHRpb25zLFxuICAgICAgICAgICAgICAgIHN0eWxlczogTWFwQ29uc3RhbnRzLkdPT0dMRV9NQVBfREFSS19TVFlMRVMsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFsbE1hcmtlcnNDb21iaW5lZCA9IFtcbiAgICAgICAgICAgIC4uLih0aGlzLm1hcERhdGEucm91dGluZ01hcmtlcnMgPz8gW10pLFxuICAgICAgICAgICAgLi4uKHRoaXMubWFwRGF0YS5jbHVzdGVyTWFya2VycyA/PyBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5tYXBEYXRhLm1hcmtlcnMgPz8gW10pLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChhbGxNYXJrZXJzQ29tYmluZWQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWFwQ2VudGVyQW5kQm91bmRzID1cbiAgICAgICAgICAgICAgICBNYXBIZWxwZXIuZ2V0TWFwQ2VudGVyQW5kWm9vbShhbGxNYXJrZXJzQ29tYmluZWQpO1xuXG4gICAgICAgICAgICB0aGlzLm1hcCEucGFuVG8obWFwQ2VudGVyQW5kQm91bmRzLm1hcENlbnRlcik7XG4gICAgICAgICAgICBpZiAobWFwQ2VudGVyQW5kQm91bmRzLmJvdW5kcylcbiAgICAgICAgICAgICAgICB0aGlzLm1hcD8uZml0Qm91bmRzKG1hcENlbnRlckFuZEJvdW5kcy5ib3VuZHMpO1xuICAgICAgICAgICAgaWYgKG1hcENlbnRlckFuZEJvdW5kcy5tYXBab29tKVxuICAgICAgICAgICAgICAgIHRoaXMubWFwPy5zZXRab29tKG1hcENlbnRlckFuZEJvdW5kcy5tYXBab29tKTtcblxuICAgICAgICAgICAgdGhpcy5pc01hcENlbnRlclNldCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFwSWRsZUV2ZW50KG1hcDogZ29vZ2xlLm1hcHMuTWFwKTogdm9pZCB7XG4gICAgICAgIG1hcC5hZGRMaXN0ZW5lcignaWRsZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZEJvdW5kc0NoYW5nZWRFdmVudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICBjb25zdCBtYXBCb3VuZHMgPSB0aGlzLm1hcC5nZXRCb3VuZHMoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcFpvb20gPSB0aGlzLm1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXBCb3VuZHMgJiYgbWFwWm9vbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kc09iamVjdCA9IHsgYm91bmRzOiBtYXBCb3VuZHMsIHpvb206IG1hcFpvb20gfTtcbiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kc0NoYW5nZWQuZW1pdChib3VuZHNPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkTWFya2VySXRlbS5lbWl0KHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuTWFya2VySW5mb1dpbmRvdyhtYXJrZXJJdGVtOiBJTWFwU2VsZWN0ZWRNYXJrZXJEYXRhKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzSW5mb1dpbmRvd09wZW5lZCA9IHRoaXMuY2hlY2tJbmZvV2luZG93UG9zaXRpb24oXG4gICAgICAgICAgICBtYXJrZXJJdGVtLFxuICAgICAgICAgICAgdGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkTWFya2VycyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMubWFwRGF0YS5tYXJrZXJzISxcbiAgICAgICAgICAgIC4uLnRoaXMubWFwRGF0YS5jbHVzdGVyTWFya2VycyEsXG4gICAgICAgIF07XG5cbiAgICAgICAgY29tYmluZWRNYXJrZXJzLmZvckVhY2goKGl0ZW06IElNYXBNYXJrZXJzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkTWFya2VyID0gdGhpcy5jaGVja0luZm9XaW5kb3dQb3NpdGlvbihcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIG1hcmtlckl0ZW1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQ2x1c3Rlck1hcmtlciA9IGl0ZW0/LmRhdGE/LmNvdW50ID4gMTtcblxuICAgICAgICAgICAgY29uc3QgY2x1c3RlcklkID0gaXNDbHVzdGVyTWFya2VyID8gdGhpcy5nZXRDbHVzdGVySWQoaXRlbSkgOiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJJY29uSWQgPSBpc0NsdXN0ZXJNYXJrZXJcbiAgICAgICAgICAgICAgICA/ICcjY2x1c3Rlci0nICsgY2x1c3RlcklkXG4gICAgICAgICAgICAgICAgOiAnI21hcmtlci0nICsgaXRlbS5pZDtcblxuICAgICAgICAgICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gaXNDbHVzdGVyTWFya2VyXG4gICAgICAgICAgICAgICAgPyB0aGlzLmNsdXN0ZXJEcm9wZG93bi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgOiB0aGlzLm1hcmtlckRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5vcHRpb25zID0geyB6SW5kZXg6IDk5OSB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2x1c3Rlck1hcmtlcikgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5pc0NsdXN0ZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9wZW5Ecm9wZG93blRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRHJvcGRvd25UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IobWFya2VySWNvbklkKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIShtYXJrZXJJY29uPy5wcmV2aW91c1NpYmxpbmcgPT09IGRyb3Bkb3duRWxlbWVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uPy5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckljb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFtYXJrZXJJY29uLmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBNYXJrZXJTdHJpbmdFbnVtLlNFTEVDVEVEXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNYXJrZXJEcm9wZG93bk9wZW4gPSAhaXNDbHVzdGVyTWFya2VyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGlzQ2x1c3Rlck1hcmtlcjtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckljb24gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihtYXJrZXJJY29uSWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uPy5jbGFzc0xpc3QuY29udGFpbnMoTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFya2VyU3RyaW5nRW51bS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ub3B0aW9ucyA9IHsgekluZGV4OiBpbmRleCArIDEgfTtcbiAgICAgICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY3VycmVudGx5T3BlbldpbmRvdyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEgPSBtYXJrZXJJdGVtO1xuXG4gICAgICAgIGlmICghaXNJbmZvV2luZG93T3BlbmVkKSB0aGlzLm1hcCEucGFuVG8obWFya2VySXRlbS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrSW5mb1dpbmRvd1Bvc2l0aW9uKFxuICAgICAgICBtYXJrZXJJdGVtOiBJTWFwTWFya2VycyxcbiAgICAgICAgbWFya2VySXRlbTI/OiBJTWFwTWFya2VycyB8IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG1hcmtlckl0ZW0ucG9zaXRpb24ubGF0ID09PSBtYXJrZXJJdGVtMj8ucG9zaXRpb24/LmxhdCAmJlxuICAgICAgICAgICAgbWFya2VySXRlbS5wb3NpdGlvbi5sbmcgPT09IG1hcmtlckl0ZW0yPy5wb3NpdGlvbj8ubG5nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlSW5mb1dpbmRvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldE1hcmtlcnNJY29ucygpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEgPSBudWxsKSwgMjUwKTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5vcGVuRHJvcGRvd25UaW1lb3V0KTtcbiAgICAgICAgdGhpcy5pc01hcmtlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ2x1c3RlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkTWFya2VySXRlbS5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZU1hcERhdGEobmV3RGF0YTogSUNhTWFwUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXBEYXRhID0geyAuLi5uZXdEYXRhIH07XG5cbiAgICAgICAgaWYgKHRoaXMubWFwRGF0YS5zZWxlY3RlZE1hcmtlckRhdGEpXG4gICAgICAgICAgICB0aGlzLm9wZW5NYXJrZXJJbmZvV2luZG93KHRoaXMubWFwRGF0YS5zZWxlY3RlZE1hcmtlckRhdGEpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmN1cnJlbnRseU9wZW5XaW5kb3cpIHRoaXMuY2xvc2VJbmZvV2luZG93KCk7XG5cbiAgICAgICAgaWYgKG5ld0RhdGEgJiYgIXRoaXMuaXNNYXBDZW50ZXJTZXQgJiYgdGhpcy5tYXApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBuZXdEYXRhLm1hcmtlcnM/Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIG5ld0RhdGEuY2x1c3Rlck1hcmtlcnM/Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIG5ld0RhdGEucm91dGluZ01hcmtlcnM/Lmxlbmd0aFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TWFwU3R5bGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNwbGF5IHJvdXRlcyBmb3Igcm91dGluZ01hcmtlcnNcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBbmREaXNwbGF5Um91dGUoKTtcblxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2x1c3RlcklkKGNsdXN0ZXJEYXRhOiBJTWFwTWFya2Vycyk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBjbHVzdGVySWQgPSB0aGlzLmNsdXN0ZXJNYXJrZXJJZHMuZmluZChcbiAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIGNsdXN0ZXJEYXRhLnBvc2l0aW9uLmxhdCA9PT0gaXRlbS5wb3NpdGlvbi5sYXQgJiZcbiAgICAgICAgICAgICAgICBjbHVzdGVyRGF0YS5wb3NpdGlvbi5sbmcgPT09IGl0ZW0ucG9zaXRpb24ubG5nXG4gICAgICAgICk/LmlkO1xuXG4gICAgICAgIHJldHVybiBjbHVzdGVySWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Um91dGluZ0lkKG1hcmtlckRhdGE6IElNYXBNYXJrZXJzKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJvdXRpbmdJZCA9IHRoaXMucm91dGluZ01hcmtlcklkcy5maW5kKFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgbWFya2VyRGF0YS5wb3NpdGlvbi5sYXQgPT09IGl0ZW0ucG9zaXRpb24ubGF0ICYmXG4gICAgICAgICAgICAgICAgbWFya2VyRGF0YS5wb3NpdGlvbi5sbmcgPT09IGl0ZW0ucG9zaXRpb24ubG5nXG4gICAgICAgICk/LmlkO1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nSWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcGVuZWRJbmZvV2luZG93RGF0YSlcbiAgICAgICAgICAgIHRoaXMuY2x1c3Rlckxpc3RTY3JvbGxFdmVudC5lbWl0KHRoaXMub3BlbmVkSW5mb1dpbmRvd0RhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblpvb21DaGFuZ2UoaXNNaW51c0NsaWNrPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50Wm9vbUxldmVsID0gdGhpcy5tYXA/LmdldFpvb20oKTtcblxuICAgICAgICBpZiAoY3VycmVudFpvb21MZXZlbCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFpvb21MZXZlbCA9IGlzTWludXNDbGlja1xuICAgICAgICAgICAgICAgID8gY3VycmVudFpvb21MZXZlbCAtIDFcbiAgICAgICAgICAgICAgICA6IGN1cnJlbnRab29tTGV2ZWwgKyAxO1xuICAgICAgICAgICAgdGhpcy5tYXA/LnNldFpvb20obmV4dFpvb21MZXZlbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25PcGVuSW5NYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3BlbkluTWFwRXZlbnQuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZXJ2aWNlRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZXJJY29uU2VydmljZS5jbHVzdGVyTWFya2VySWRzJFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2x1c3RlcklkcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2x1c3Rlck1hcmtlcklkcyA9IGNsdXN0ZXJJZHM7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1hcmtlckljb25TZXJ2aWNlLnJvdXRpbmdNYXJrZXJJZHMkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyb3V0aW5nSWRzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nTWFya2VySWRzID0gcm91dGluZ0lkcztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgbWFya2VyOiBJTWFwTWFya2Vycyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBtYXJrZXIuZGF0YS5pZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhY2tCeVBvc2l0aW9uKGluZGV4OiBudW1iZXIsIG1hcmtlcjogSU1hcE1hcmtlcnMpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gbWFya2VyLnBvc2l0aW9uLmxhdCArIG1hcmtlci5wb3NpdGlvbi5sbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGlkZW50aXR5KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uc1JlbmRlcmVycy5mb3JFYWNoKChyZW5kZXJlcikgPT4gcmVuZGVyZXIuc2V0TWFwKG51bGwpKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8Z29vZ2xlLW1hcFxuICAgIGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIlxuICAgIFtjbGFzcy5kYXJrLW1vZGUtbWFwXT1cIm1hcERhdGEuZGFya01vZGVcIlxuICAgIGhlaWdodD1cIjEwMCVcIlxuICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgW3pvb21dPVwibWFwWm9vbVwiXG4gICAgW2NlbnRlcl09XCJtYXBDZW50ZXJcIlxuICAgIFtvcHRpb25zXT1cIm1hcE9wdGlvbnNcIlxuICAgIChtYXBJbml0aWFsaXplZCk9XCJvbk1hcFJlYWR5KCRldmVudClcIlxuICAgIFttYXBJZF09XCJtYXBTdHlsZUlkXCJcbj5cbiAgICBAZm9yIChtYXJrZXIgb2YgbWFwRGF0YS5tYXJrZXJzOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgbWFya2VyLmRhdGEuaWQpIHtcbiAgICAgICAgPG1hcC1hZHZhbmNlZC1tYXJrZXJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJtYXJrZXIucG9zaXRpb25cIlxuICAgICAgICAgICAgW2NvbnRlbnRdPVwibWFya2VyLmNvbnRlbnRcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJcbiAgICAgICAgICAgICAgICBvcGVuZWRJbmZvV2luZG93RGF0YT8uZGF0YT8uaWQgPT09IG1hcmtlci5kYXRhLmlkID8gOTk5IDogaVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChtYXBDbGljayk9XCJvbk1hcmtlckNsaWNrKG1hcmtlcilcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWFwLWFkdmFuY2VkLW1hcmtlcj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgICNtYXJrZXJEcm9wZG93blxuICAgICAgICBjbGFzcz1cIm1hcmtlci1kcm9wZG93biBkcm9wZG93bi1oaWRkZW5cIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdkcm9wZG93bi1oaWRkZW4nOiAhaXNNYXJrZXJEcm9wZG93bk9wZW4gfVwiXG4gICAgPlxuICAgICAgICA8YXBwLWNhLW1hcC1kcm9wZG93blxuICAgICAgICAgICAgW2luZm9XaW5kb3dDb250ZW50XT1cIlxuICAgICAgICAgICAgICAgICFpc0NsdXN0ZXJEcm9wZG93bk9wZW5cbiAgICAgICAgICAgICAgICAgICAgPyBvcGVuZWRJbmZvV2luZG93RGF0YT8uaW5mb1dpbmRvd0NvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW21hcmtlckRhdGFdPVwib3BlbmVkSW5mb1dpbmRvd0RhdGE/LmRhdGFcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckl0ZW1DbGljayk9XCJnZXRNYXJrZXJJbmZvV2luZG93KCRldmVudClcIlxuICAgICAgICAgICAgKG9uQ2x1c3Rlckxpc3RTY3JvbGxUb0VuZCk9XCJvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQoKVwiXG4gICAgICAgICAgICAob25CYWNrQnV0dG9uQ2xpY2spPVwib25DbHVzdGVyQmFja0J1dHRvbkNsaWNrKClcIlxuICAgICAgICA+PC9hcHAtY2EtbWFwLWRyb3Bkb3duPlxuICAgIDwvZGl2PlxuXG4gICAgQGZvciAoXG4gICAgICAgIGNsdXN0ZXJNYXJrZXIgb2YgbWFwRGF0YS5jbHVzdGVyTWFya2VycztcbiAgICAgICAgbGV0IGkgPSAkaW5kZXg7XG4gICAgICAgIHRyYWNrIHRyYWNrQnlQb3NpdGlvbigkaW5kZXgsIGNsdXN0ZXJNYXJrZXIpXG4gICAgKSB7XG4gICAgICAgIDxtYXAtYWR2YW5jZWQtbWFya2VyXG4gICAgICAgICAgICBbcG9zaXRpb25dPVwiY2x1c3Rlck1hcmtlci5wb3NpdGlvblwiXG4gICAgICAgICAgICBbY29udGVudF09XCJjbHVzdGVyTWFya2VyLmNvbnRlbnRcIlxuICAgICAgICAgICAgW3pJbmRleF09XCJcbiAgICAgICAgICAgICAgICBjaGVja0luZm9XaW5kb3dQb3NpdGlvbihjbHVzdGVyTWFya2VyLCBvcGVuZWRJbmZvV2luZG93RGF0YSlcbiAgICAgICAgICAgICAgICAgICAgPyA5OTlcbiAgICAgICAgICAgICAgICAgICAgOiBpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKG1hcENsaWNrKT1cIm9uQ2x1c3Rlck1hcmtlckNsaWNrKGNsdXN0ZXJNYXJrZXIpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hcC1hZHZhbmNlZC1tYXJrZXI+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICAjY2x1c3RlckRyb3Bkb3duXG4gICAgICAgIGNsYXNzPVwibWFya2VyLWRyb3Bkb3duIGNsdXN0ZXItZHJvcGRvd24gZHJvcGRvd24taGlkZGVuXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnZHJvcGRvd24taGlkZGVuJzogIWlzQ2x1c3RlckRyb3Bkb3duT3BlbiB9XCJcbiAgICA+XG4gICAgICAgIDxhcHAtY2EtbWFwLWRyb3Bkb3duXG4gICAgICAgICAgICBbaW5mb1dpbmRvd0NvbnRlbnRdPVwiXG4gICAgICAgICAgICAgICAgIWlzTWFya2VyRHJvcGRvd25PcGVuXG4gICAgICAgICAgICAgICAgICAgID8gb3BlbmVkSW5mb1dpbmRvd0RhdGE/LmluZm9XaW5kb3dDb250ZW50XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFttYXJrZXJEYXRhXT1cIm9wZW5lZEluZm9XaW5kb3dEYXRhPy5kYXRhXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJJdGVtQ2xpY2spPVwiZ2V0TWFya2VySW5mb1dpbmRvdygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNsdXN0ZXJMaXN0U2Nyb2xsVG9FbmQpPVwib25DbHVzdGVyTGlzdFNjcm9sbFRvRW5kKClcIlxuICAgICAgICAgICAgKG9uQmFja0J1dHRvbkNsaWNrKT1cIm9uQ2x1c3RlckJhY2tCdXR0b25DbGljaygpXCJcbiAgICAgICAgPjwvYXBwLWNhLW1hcC1kcm9wZG93bj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoaXNBcmVhRmlsdGVyQWN0aXZlKSB7XG4gICAgICAgIDxtYXAtY2lyY2xlXG4gICAgICAgICAgICBbb3B0aW9uc109XCJhcmVhRmlsdGVyRGF0YS5vcHRpb25zXCJcbiAgICAgICAgICAgIFtjZW50ZXJdPVwiYXJlYUZpbHRlckRhdGEuY2VudGVyXCJcbiAgICAgICAgICAgIFtyYWRpdXNdPVwiYXJlYUZpbHRlckRhdGEucmFkaXVzXCJcbiAgICAgICAgPjwvbWFwLWNpcmNsZT5cbiAgICB9XG5cbiAgICBAZm9yIChcbiAgICAgICAgcm91dGluZ01hcmtlciBvZiBtYXBEYXRhLnJvdXRpbmdNYXJrZXJzO1xuICAgICAgICBsZXQgaSA9ICRpbmRleDtcbiAgICAgICAgdHJhY2sgdHJhY2tCeVBvc2l0aW9uKCRpbmRleCwgcm91dGluZ01hcmtlcilcbiAgICApIHtcbiAgICAgICAgPG1hcC1hZHZhbmNlZC1tYXJrZXJcbiAgICAgICAgICAgIFtwb3NpdGlvbl09XCJyb3V0aW5nTWFya2VyLnBvc2l0aW9uXCJcbiAgICAgICAgICAgIFtjb250ZW50XT1cInJvdXRpbmdNYXJrZXIuY29udGVudFwiXG4gICAgICAgID5cbiAgICAgICAgPC9tYXAtYWR2YW5jZWQtbWFya2VyPlxuICAgIH1cblxuICAgIEBpZiAobWFwRGF0YS5pc09wZW5Jbk1hcFNob3duKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwib3Blbi1pbi1tYXAtY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiXG4gICAgICAgICAgICBuZ2JUb29sdGlwXG4gICAgICAgICAgICBtYWluQ2FUb29sdGlwPVwiT3BlbiBpbiBNYXBcIlxuICAgICAgICAgICAgdG9vbHRpcEJhY2tncm91bmQ9XCIjNDI0MjQyXCJcbiAgICAgICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk9wZW5Jbk1hcCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHN2Zy1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXhcIlxuICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9jb21tb24vaWNfbG9jYXRpb25fbWFwLnN2Z1wiXG4gICAgICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTgsICdoZWlnaHQucHgnOiAxOCB9XCJcbiAgICAgICAgICAgID48L3N2Zy1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKG1hcERhdGEuaXNab29tU2hvd24pIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtYXAtem9vbS1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWVuZCBnYXAtMVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ2ZsZXgtY29sdW1uJzogIW1hcERhdGEuaXNWZXJ0aWNhbFpvb20sXG4gICAgICAgICAgICAgICAgJ3ZlcnRpY2FsLXpvb20tYnV0dG9ucyc6IG1hcERhdGEuaXNWZXJ0aWNhbFpvb20sXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWFwLXpvb20tYnV0dG9ucyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmxleC1jb2x1bW5dPVwibWFwRGF0YS5pc1ZlcnRpY2FsWm9vbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZmxleC0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uWm9vbUNoYW5nZSh0cnVlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9jYS1jb21wb25lbnRzL3N2Zy9wb3B1cC9NaW51cy5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N2Z1N0eWxlXT1cInsgJ3dpZHRoLnB4JzogMTQsICdoZWlnaHQucHgnOiAxNCB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc3ZnLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZmxleC0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uWm9vbUNoYW5nZShmYWxzZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHN2Zy1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvY2EtY29tcG9uZW50cy9zdmcvY29tbW9uL2ljX3BsdXMuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdmdTdHlsZV09XCJ7ICd3aWR0aC5weCc6IDE0LCAnaGVpZ2h0LnB4JzogMTQgfVwiXG4gICAgICAgICAgICAgICAgICAgID48L3N2Zy1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFwLXpvb20tcmFuZ2UgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhbmdlLXRleHQgY2EtZm9udC1tZWRpdW1cIj41MCBtaTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9nb29nbGUtbWFwPlxuIl19
|