@theseam/ui-common 0.4.1 → 0.4.2
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/esm2020/datatable/datatable-action-menu/datatable-action-menu.component.mjs +1 -1
- package/esm2020/datatable/datatable-column-preferences-button/datatable-column-preferences-button.component.mjs +1 -1
- package/esm2020/datatable/datatable-export-button/datatable-export-button.component.mjs +1 -1
- package/esm2020/datatable-dynamic/datatable-dynamic-action-menu/datatable-dynamic-action-menu.component.mjs +1 -1
- package/esm2020/framework/schema-form-controls/schema-form-submit-split/schema-form-submit-split.component.mjs +1 -1
- package/esm2020/framework/top-bar/top-bar.component.mjs +1 -1
- package/esm2020/google-maps/google-maps/google-maps.component.mjs +32 -8
- package/esm2020/google-maps/google-maps-feature-helpers.mjs +13 -1
- package/esm2020/google-maps/google-maps.module.mjs +4 -2
- package/esm2020/google-maps/google-maps.service.mjs +96 -25
- package/esm2020/menu/menu-item.component.mjs +43 -15
- package/esm2020/menu/menu-toggle.directive.mjs +202 -43
- package/esm2020/menu/menu.component.mjs +37 -14
- package/esm2020/utils/geo-json/close-polygons.mjs +38 -0
- package/esm2020/utils/public-api.mjs +2 -1
- package/esm2020/widget/widget/widget.component.mjs +54 -33
- package/fesm2015/theseam-ui-common-datatable-dynamic.mjs +1 -1
- package/fesm2015/theseam-ui-common-datatable-dynamic.mjs.map +1 -1
- package/fesm2015/theseam-ui-common-datatable.mjs +3 -3
- package/fesm2015/theseam-ui-common-datatable.mjs.map +1 -1
- package/fesm2015/theseam-ui-common-framework.mjs +2 -2
- package/fesm2015/theseam-ui-common-framework.mjs.map +1 -1
- package/fesm2015/theseam-ui-common-google-maps.mjs +138 -28
- package/fesm2015/theseam-ui-common-google-maps.mjs.map +1 -1
- package/fesm2015/theseam-ui-common-menu.mjs +442 -228
- package/fesm2015/theseam-ui-common-menu.mjs.map +1 -1
- package/fesm2015/theseam-ui-common-utils.mjs +39 -1
- package/fesm2015/theseam-ui-common-utils.mjs.map +1 -1
- package/fesm2015/theseam-ui-common-widget.mjs +53 -32
- package/fesm2015/theseam-ui-common-widget.mjs.map +1 -1
- package/fesm2020/theseam-ui-common-datatable-dynamic.mjs +1 -1
- package/fesm2020/theseam-ui-common-datatable-dynamic.mjs.map +1 -1
- package/fesm2020/theseam-ui-common-datatable.mjs +3 -3
- package/fesm2020/theseam-ui-common-datatable.mjs.map +1 -1
- package/fesm2020/theseam-ui-common-framework.mjs +2 -2
- package/fesm2020/theseam-ui-common-framework.mjs.map +1 -1
- package/fesm2020/theseam-ui-common-google-maps.mjs +141 -32
- package/fesm2020/theseam-ui-common-google-maps.mjs.map +1 -1
- package/fesm2020/theseam-ui-common-menu.mjs +432 -225
- package/fesm2020/theseam-ui-common-menu.mjs.map +1 -1
- package/fesm2020/theseam-ui-common-utils.mjs +39 -1
- package/fesm2020/theseam-ui-common-utils.mjs.map +1 -1
- package/fesm2020/theseam-ui-common-widget.mjs +53 -32
- package/fesm2020/theseam-ui-common-widget.mjs.map +1 -1
- package/google-maps/google-maps/google-maps.component.d.ts +8 -1
- package/google-maps/google-maps-feature-helpers.d.ts +3 -0
- package/google-maps/google-maps.module.d.ts +1 -1
- package/google-maps/google-maps.service.d.ts +7 -0
- package/menu/menu-item.component.d.ts +20 -9
- package/menu/menu-toggle.directive.d.ts +34 -11
- package/menu/menu.component.d.ts +16 -2
- package/package.json +1 -1
- package/utils/geo-json/close-polygons.d.ts +9 -0
- package/utils/public-api.d.ts +1 -0
- package/widget/widget/widget.component.d.ts +10 -11
- package/widget/widget/widget.component.scss +12 -1
|
@@ -31,7 +31,8 @@ TheSeamGoogleMapsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0",
|
|
|
31
31
|
TheSeamFormFieldModule,
|
|
32
32
|
GoogleMapsModule], exports: [TheSeamGoogleMapsComponent,
|
|
33
33
|
TheSeamGoogleMapsPlacesAutocompleteDirective,
|
|
34
|
-
TheSeamGoogleMapsPlacesAutoCompleteComponent
|
|
34
|
+
TheSeamGoogleMapsPlacesAutoCompleteComponent,
|
|
35
|
+
TheSeamMapsControlComponent] });
|
|
35
36
|
TheSeamGoogleMapsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TheSeamGoogleMapsModule, imports: [CommonModule,
|
|
36
37
|
ObserversModule,
|
|
37
38
|
TheSeamSharedModule,
|
|
@@ -64,7 +65,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
64
65
|
TheSeamGoogleMapsComponent,
|
|
65
66
|
TheSeamGoogleMapsPlacesAutocompleteDirective,
|
|
66
67
|
TheSeamGoogleMapsPlacesAutoCompleteComponent,
|
|
68
|
+
TheSeamMapsControlComponent,
|
|
67
69
|
]
|
|
68
70
|
}]
|
|
69
71
|
}] });
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL2dvb2dsZS1tYXBzL2dvb2dsZS1tYXBzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFDdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFL0QsT0FBTyxFQUFFLDRDQUE0QyxFQUFFLE1BQU0sNkVBQTZFLENBQUE7QUFDMUksT0FBTyxFQUFFLDRDQUE0QyxFQUFFLE1BQU0sNkVBQTZFLENBQUE7QUFDMUksT0FBTyxFQUFFLCtDQUErQyxFQUFFLE1BQU0scUZBQXFGLENBQUE7QUFDckosT0FBTyxFQUFFLDZDQUE2QyxFQUFFLE1BQU0saUZBQWlGLENBQUE7QUFDL0ksT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scUNBQXFDLENBQUE7QUFDaEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDckUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUNBQXlDLENBQUE7O0FBNEJyRixNQUFNLE9BQU8sdUJBQXVCOztvSEFBdkIsdUJBQXVCO3FIQUF2Qix1QkFBdUIsaUJBeEJoQywwQkFBMEI7UUFDMUIsMkJBQTJCO1FBQzNCLDZDQUE2QztRQUM3QywrQ0FBK0M7UUFDL0MsMkJBQTJCO1FBQzNCLDRDQUE0QztRQUM1Qyw0Q0FBNEMsYUFHNUMsWUFBWTtRQUNaLGVBQWU7UUFDZixtQkFBbUI7UUFDbkIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixzQkFBc0I7UUFDdEIsZ0JBQWdCLGFBR2hCLDBCQUEwQjtRQUMxQiw0Q0FBNEM7UUFDNUMsNENBQTRDO1FBQzVDLDJCQUEyQjtxSEFHbEIsdUJBQXVCLFlBZmhDLFlBQVk7UUFDWixlQUFlO1FBQ2YsbUJBQW1CO1FBQ25CLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsc0JBQXNCO1FBQ3RCLGdCQUFnQjsyRkFTUCx1QkFBdUI7a0JBMUJuQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWiwwQkFBMEI7d0JBQzFCLDJCQUEyQjt3QkFDM0IsNkNBQTZDO3dCQUM3QywrQ0FBK0M7d0JBQy9DLDJCQUEyQjt3QkFDM0IsNENBQTRDO3dCQUM1Qyw0Q0FBNEM7cUJBQzdDO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLGlCQUFpQjt3QkFDakIsc0JBQXNCO3dCQUN0QixnQkFBZ0I7cUJBQ2pCO29CQUNELE9BQU8sRUFBRTt3QkFDUCwwQkFBMEI7d0JBQzFCLDRDQUE0Qzt3QkFDNUMsNENBQTRDO3dCQUM1QywyQkFBMkI7cUJBQzVCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2ZXJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL29ic2VydmVycydcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxuaW1wb3J0IHsgR29vZ2xlTWFwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2dvb2dsZS1tYXBzJ1xuaW1wb3J0IHsgVGhlU2VhbUZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0B0aGVzZWFtL3VpLWNvbW1vbi9mb3JtLWZpZWxkJ1xuaW1wb3J0IHsgVGhlU2VhbUljb25Nb2R1bGUgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vaWNvbidcbmltcG9ydCB7IFRoZVNlYW1NZW51TW9kdWxlIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL21lbnUnXG5pbXBvcnQgeyBUaGVTZWFtU2hhcmVkTW9kdWxlIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL3NoYXJlZCdcblxuaW1wb3J0IHsgVGhlU2VhbUdvb2dsZU1hcHNQbGFjZXNBdXRvQ29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuL2dvb2dsZS1tYXBzLXBsYWNlcy1hdXRvY29tcGxldGUvZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQnXG5pbXBvcnQgeyBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmRpcmVjdGl2ZSdcbmltcG9ydCB7IFRoZVNlYW1Hb29nbGVNYXBzUmVjZW50ZXJCdXR0b25Db250cm9sQ29tcG9uZW50IH0gZnJvbSAnLi9nb29nbGUtbWFwcy1yZWNlbnRlci1idXR0b24tY29udHJvbC9nb29nbGUtbWFwcy1yZWNlbnRlci1idXR0b24tY29udHJvbC5jb21wb25lbnQnXG5pbXBvcnQgeyBUaGVTZWFtR29vZ2xlTWFwc1VwbG9hZEJ1dHRvbkNvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuL2dvb2dsZS1tYXBzLXVwbG9hZC1idXR0b24tY29udHJvbC9nb29nbGUtbWFwcy11cGxvYWQtYnV0dG9uLWNvbnRyb2wuY29tcG9uZW50J1xuaW1wb3J0IHsgVGhlU2VhbUdvb2dsZU1hcHNDb21wb25lbnQgfSBmcm9tICcuL2dvb2dsZS1tYXBzL2dvb2dsZS1tYXBzLmNvbXBvbmVudCdcbmltcG9ydCB7IFRoZVNlYW1NYXBzQ29udHJvbENvbXBvbmVudCB9IGZyb20gJy4vbWFwLWNvbnRyb2wuY29tcG9uZW50J1xuaW1wb3J0IHsgVGhlU2VhbU1hcEZpbGVEcm9wQ29tcG9uZW50IH0gZnJvbSAnLi9tYXAtZmlsZS1kcm9wL21hcC1maWxlLWRyb3AuY29tcG9uZW50J1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBUaGVTZWFtR29vZ2xlTWFwc0NvbXBvbmVudCxcbiAgICBUaGVTZWFtTWFwRmlsZURyb3BDb21wb25lbnQsXG4gICAgVGhlU2VhbUdvb2dsZU1hcHNVcGxvYWRCdXR0b25Db250cm9sQ29tcG9uZW50LFxuICAgIFRoZVNlYW1Hb29nbGVNYXBzUmVjZW50ZXJCdXR0b25Db250cm9sQ29tcG9uZW50LFxuICAgIFRoZVNlYW1NYXBzQ29udHJvbENvbXBvbmVudCxcbiAgICBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSxcbiAgICBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9Db21wbGV0ZUNvbXBvbmVudCxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBPYnNlcnZlcnNNb2R1bGUsXG4gICAgVGhlU2VhbVNoYXJlZE1vZHVsZSxcbiAgICBUaGVTZWFtTWVudU1vZHVsZSxcbiAgICBUaGVTZWFtSWNvbk1vZHVsZSxcbiAgICBUaGVTZWFtRm9ybUZpZWxkTW9kdWxlLFxuICAgIEdvb2dsZU1hcHNNb2R1bGUsXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBUaGVTZWFtR29vZ2xlTWFwc0NvbXBvbmVudCxcbiAgICBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSxcbiAgICBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9Db21wbGV0ZUNvbXBvbmVudCxcbiAgICBUaGVTZWFtTWFwc0NvbnRyb2xDb21wb25lbnQsXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVGhlU2VhbUdvb2dsZU1hcHNNb2R1bGUgeyB9XG4iXX0=
|
|
@@ -3,29 +3,28 @@ import { BehaviorSubject, from, Subject } from 'rxjs';
|
|
|
3
3
|
import { switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
4
4
|
import { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils';
|
|
5
5
|
import { GoogleMapsContextMenu } from './google-maps-contextmenu';
|
|
6
|
-
import { addInnerFeatureCutoutToExteriorFeature, createDataFeatureFromPolygon, createFeatureChangeObservable, getBoundsWithAllFeatures, getFeatureCenter, getFeaturesCount, getPossibleExteriorFeature, isFeatureSelected, polygonHasValidPathsLengths, removeAllFeatures, setFeatureSelected, stripAppFeaturePropertiesFromJson, } from './google-maps-feature-helpers';
|
|
6
|
+
import { addInnerFeatureCutoutToExteriorFeature, createDataFeatureFromPolygon, createFeatureChangeObservable, getBoundsWithAllFeatures, getFeatureCenter, getFeaturesCount, getHoveredStyleOptionsDefinedByFeature, getPossibleExteriorFeature, getStyleOptionsDefinedByFeature, isFeatureSelected, polygonHasValidPathsLengths, removeAllFeatures, setFeatureSelected, stripAppFeaturePropertiesFromJson, } from './google-maps-feature-helpers';
|
|
7
7
|
import { MapValueSource } from './map-value-manager.service';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "./map-value-manager.service";
|
|
10
|
-
const DEFAULT_POLYGON_OPTIONS = {
|
|
11
|
-
clickable:
|
|
12
|
-
draggable:
|
|
13
|
-
editable:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const DEFAULT_DRAWING_MANAGER_OPTIONS = () => ({
|
|
18
|
-
drawingControl: true,
|
|
10
|
+
const DEFAULT_POLYGON_OPTIONS = (editingEnabled) => ({
|
|
11
|
+
clickable: editingEnabled,
|
|
12
|
+
draggable: editingEnabled,
|
|
13
|
+
editable: editingEnabled,
|
|
14
|
+
});
|
|
15
|
+
const DEFAULT_DRAWING_MANAGER_OPTIONS = (editingEnabled) => ({
|
|
16
|
+
drawingControl: editingEnabled,
|
|
19
17
|
drawingControlOptions: {
|
|
20
18
|
drawingModes: [
|
|
21
19
|
google.maps.drawing.OverlayType.POLYGON,
|
|
22
20
|
],
|
|
23
21
|
},
|
|
24
|
-
polygonOptions: DEFAULT_POLYGON_OPTIONS,
|
|
22
|
+
polygonOptions: DEFAULT_POLYGON_OPTIONS(editingEnabled),
|
|
25
23
|
drawingMode: null,
|
|
26
24
|
});
|
|
27
|
-
const FEATURE_STYLE_OPTIONS_DEFAULT = {
|
|
25
|
+
const FEATURE_STYLE_OPTIONS_DEFAULT = (editingEnabled) => ({
|
|
28
26
|
clickable: true,
|
|
27
|
+
// clickable: editingEnabled,
|
|
29
28
|
visible: true,
|
|
30
29
|
// zIndex?: number;
|
|
31
30
|
// cursor?: string;
|
|
@@ -36,17 +35,34 @@ const FEATURE_STYLE_OPTIONS_DEFAULT = {
|
|
|
36
35
|
strokeColor: 'blue',
|
|
37
36
|
strokeOpacity: 1,
|
|
38
37
|
strokeWeight: 2,
|
|
39
|
-
};
|
|
40
|
-
const FEATURE_STYLE_OPTIONS_SELECTED = {
|
|
41
|
-
...FEATURE_STYLE_OPTIONS_DEFAULT,
|
|
42
|
-
draggable:
|
|
43
|
-
editable:
|
|
38
|
+
});
|
|
39
|
+
const FEATURE_STYLE_OPTIONS_SELECTED = (editingEnabled) => ({
|
|
40
|
+
...FEATURE_STYLE_OPTIONS_DEFAULT(editingEnabled),
|
|
41
|
+
draggable: editingEnabled,
|
|
42
|
+
editable: editingEnabled,
|
|
44
43
|
fillColor: 'green',
|
|
45
44
|
fillOpacity: 0.7,
|
|
46
45
|
strokeColor: 'limegreen',
|
|
47
46
|
strokeOpacity: 1,
|
|
48
47
|
strokeWeight: 2,
|
|
49
|
-
};
|
|
48
|
+
});
|
|
49
|
+
const FEATURE_STYLE_OVERRIDE_OPTIONS_HOVERED = (editingEnabled) => ({
|
|
50
|
+
strokeColor: 'black',
|
|
51
|
+
strokeOpacity: 1,
|
|
52
|
+
strokeWeight: 4,
|
|
53
|
+
});
|
|
54
|
+
const SUPPORTED_PROPERTY_STYLE_OPTIONS = [
|
|
55
|
+
'fillColor',
|
|
56
|
+
'fillOpacity',
|
|
57
|
+
'strokeColor',
|
|
58
|
+
'strokeOpacity',
|
|
59
|
+
'strokeWeight',
|
|
60
|
+
'label',
|
|
61
|
+
'opacity',
|
|
62
|
+
'icon',
|
|
63
|
+
'clickable',
|
|
64
|
+
'visible',
|
|
65
|
+
];
|
|
50
66
|
export class GoogleMapsService {
|
|
51
67
|
get mapReady() { return this._mapReadySubject.value; }
|
|
52
68
|
constructor(_mapValueManager, _ngZone, _vcr) {
|
|
@@ -55,9 +71,11 @@ export class GoogleMapsService {
|
|
|
55
71
|
this._vcr = _vcr;
|
|
56
72
|
this._ngUnsubscribe = new Subject();
|
|
57
73
|
this._mapReadySubject = new BehaviorSubject(false);
|
|
74
|
+
this._editingEnabledSubject = new BehaviorSubject(true);
|
|
58
75
|
this._featureContextMenu = null;
|
|
59
76
|
this._activeContextMenu = null;
|
|
60
77
|
this._allowDrawingHoleInPolygon = false;
|
|
78
|
+
this.editingEnabled$ = this._editingEnabledSubject.asObservable();
|
|
61
79
|
this.mapReady$ = this._mapReadySubject.asObservable();
|
|
62
80
|
}
|
|
63
81
|
ngOnDestroy() {
|
|
@@ -76,8 +94,35 @@ export class GoogleMapsService {
|
|
|
76
94
|
}
|
|
77
95
|
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
78
96
|
setFeatureContextMenu(menu) {
|
|
97
|
+
this.closeContextMenu();
|
|
79
98
|
this._featureContextMenu = menu;
|
|
80
99
|
}
|
|
100
|
+
setEditingEnabled(enabled) {
|
|
101
|
+
this._editingEnabledSubject.next(enabled);
|
|
102
|
+
if (this.mapReady) {
|
|
103
|
+
this._assertInitialized();
|
|
104
|
+
this.googleMap.data.revertStyle();
|
|
105
|
+
if (!enabled) {
|
|
106
|
+
this.stopDrawing();
|
|
107
|
+
const options = DEFAULT_DRAWING_MANAGER_OPTIONS(this.isEditingEnabled());
|
|
108
|
+
this._drawingManager?.setOptions(options);
|
|
109
|
+
this._drawingManager?.setMap(null);
|
|
110
|
+
this.googleMap.data.forEach(f => {
|
|
111
|
+
if (isFeatureSelected(f)) {
|
|
112
|
+
setFeatureSelected(f, false);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const options = DEFAULT_DRAWING_MANAGER_OPTIONS(this.isEditingEnabled());
|
|
118
|
+
this._drawingManager?.setOptions(options);
|
|
119
|
+
this._drawingManager?.setMap(this.googleMap);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
isEditingEnabled() {
|
|
124
|
+
return this._editingEnabledSubject.value;
|
|
125
|
+
}
|
|
81
126
|
getDiv() {
|
|
82
127
|
this._assertInitialized();
|
|
83
128
|
return this.googleMap.getDiv();
|
|
@@ -115,7 +160,7 @@ export class GoogleMapsService {
|
|
|
115
160
|
listener.remove();
|
|
116
161
|
});
|
|
117
162
|
// To fake canceling the current drawing, without disabling the drawing
|
|
118
|
-
// mode, the
|
|
163
|
+
// mode, the drawing mode is being unset then immediately set back. When
|
|
119
164
|
// the mode is unset the 'overlaycomplete' event will fire, which will
|
|
120
165
|
// give a reference to the current overlay to remove, then it is set back
|
|
121
166
|
// to the mode the user was using. To the user is should just seem like
|
|
@@ -135,7 +180,7 @@ export class GoogleMapsService {
|
|
|
135
180
|
throw Error(`DrawingManager is already initialized.`);
|
|
136
181
|
}
|
|
137
182
|
this._assertInitialized();
|
|
138
|
-
const options = DEFAULT_DRAWING_MANAGER_OPTIONS();
|
|
183
|
+
const options = DEFAULT_DRAWING_MANAGER_OPTIONS(this.isEditingEnabled());
|
|
139
184
|
const drawingManager = new google.maps.drawing.DrawingManager(options);
|
|
140
185
|
drawingManager.setMap(this.googleMap);
|
|
141
186
|
this._drawingManager = drawingManager;
|
|
@@ -197,10 +242,15 @@ export class GoogleMapsService {
|
|
|
197
242
|
});
|
|
198
243
|
// Determine what the style of the features are.
|
|
199
244
|
this.googleMap.data.setStyle(feature => {
|
|
245
|
+
let opts = FEATURE_STYLE_OPTIONS_DEFAULT(this.isEditingEnabled());
|
|
246
|
+
const options = getStyleOptionsDefinedByFeature(feature);
|
|
247
|
+
this._mergeStyleOptions(opts, options ?? {});
|
|
200
248
|
if (isFeatureSelected(feature)) {
|
|
201
|
-
|
|
249
|
+
const hoverOptions = getHoveredStyleOptionsDefinedByFeature(feature);
|
|
250
|
+
opts = FEATURE_STYLE_OPTIONS_SELECTED(this.isEditingEnabled());
|
|
251
|
+
this._mergeStyleOptions(opts, hoverOptions ?? {});
|
|
202
252
|
}
|
|
203
|
-
return
|
|
253
|
+
return opts;
|
|
204
254
|
});
|
|
205
255
|
// Select a feature when clicked.
|
|
206
256
|
this.googleMap.data.addListener('click', (event) => {
|
|
@@ -217,7 +267,7 @@ export class GoogleMapsService {
|
|
|
217
267
|
this._assertInitialized();
|
|
218
268
|
this.googleMap.data.revertStyle();
|
|
219
269
|
if (!this.isDrawing() && !isFeatureSelected(event.feature)) {
|
|
220
|
-
this.
|
|
270
|
+
this.setFeatureHoveredStyleOverride(event.feature);
|
|
221
271
|
}
|
|
222
272
|
});
|
|
223
273
|
// Remove any hover styles when mouse moves away.
|
|
@@ -226,6 +276,23 @@ export class GoogleMapsService {
|
|
|
226
276
|
this.googleMap.data.revertStyle();
|
|
227
277
|
});
|
|
228
278
|
}
|
|
279
|
+
setFeatureHoveredStyleOverride(feature) {
|
|
280
|
+
this._assertInitialized();
|
|
281
|
+
const overrideOpts = FEATURE_STYLE_OVERRIDE_OPTIONS_HOVERED(this.isEditingEnabled());
|
|
282
|
+
const hoverOptions = getHoveredStyleOptionsDefinedByFeature(feature);
|
|
283
|
+
this._mergeStyleOptions(overrideOpts, hoverOptions ?? {});
|
|
284
|
+
this.googleMap.data.overrideStyle(feature, overrideOpts);
|
|
285
|
+
}
|
|
286
|
+
_mergeStyleOptions(options, propertiesStyleOptions) {
|
|
287
|
+
if (Object.keys(propertiesStyleOptions).length === 0) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
for (const opt of SUPPORTED_PROPERTY_STYLE_OPTIONS) {
|
|
291
|
+
if (Object.prototype.hasOwnProperty.call(propertiesStyleOptions, opt)) {
|
|
292
|
+
options[opt] = propertiesStyleOptions[opt];
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
229
296
|
_initFeatureChangeListeners() {
|
|
230
297
|
this._assertInitialized();
|
|
231
298
|
createFeatureChangeObservable(this.googleMap.data, this._ngZone).pipe(switchMap(() => from(this.getGeoJson()).pipe(tap(geoJson => this._mapValueManager.setValue(geoJson, MapValueSource.FeatureChange)))), takeUntil(this._ngUnsubscribe)).subscribe();
|
|
@@ -314,11 +381,15 @@ export class GoogleMapsService {
|
|
|
314
381
|
}
|
|
315
382
|
}
|
|
316
383
|
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
317
|
-
|
|
384
|
+
closeContextMenu() {
|
|
318
385
|
if (this._activeContextMenu) {
|
|
319
386
|
this._activeContextMenu.close();
|
|
320
387
|
this._activeContextMenu = null;
|
|
321
388
|
}
|
|
389
|
+
}
|
|
390
|
+
// TODO: Refactor out of the service meant to just wrap the google maps api.
|
|
391
|
+
_openContextMenuForFeature(feature, position) {
|
|
392
|
+
this.closeContextMenu();
|
|
322
393
|
this._assertInitialized();
|
|
323
394
|
let _position = position;
|
|
324
395
|
if (!_position) {
|
|
@@ -352,4 +423,4 @@ GoogleMapsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", ve
|
|
|
352
423
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GoogleMapsService, decorators: [{
|
|
353
424
|
type: Injectable
|
|
354
425
|
}], ctorParameters: function () { return [{ type: i1.MapValueManagerService }, { type: i0.NgZone }, { type: i0.ViewContainerRef }]; } });
|
|
355
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9nb29nbGUtbWFwcy9nb29nbGUtbWFwcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQXVDLE1BQU0sZUFBZSxDQUFBO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUcxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUVoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNqRSxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLDRCQUE0QixFQUM1Qiw2QkFBNkIsRUFDN0Isd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLGlCQUFpQixFQUNqQiwyQkFBMkIsRUFDM0IsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQ0FBaUMsR0FDbEMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN0QyxPQUFPLEVBQTBCLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFBOzs7QUFJcEYsTUFBTSx1QkFBdUIsR0FBK0I7SUFDMUQsU0FBUyxFQUFFLElBQUk7SUFDZixTQUFTLEVBQUUsSUFBSTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2Qsa0NBQWtDO0lBQ2xDLG1DQUFtQztDQUNwQyxDQUFBO0FBRUQsTUFBTSwrQkFBK0IsR0FBc0QsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoRyxjQUFjLEVBQUUsSUFBSTtJQUNwQixxQkFBcUIsRUFBRTtRQUNyQixZQUFZLEVBQUU7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTztTQUN4QztLQUNGO0lBQ0QsY0FBYyxFQUFFLHVCQUF1QjtJQUN2QyxXQUFXLEVBQUUsSUFBSTtDQUNsQixDQUFDLENBQUE7QUFFRixNQUFNLDZCQUE2QixHQUFrQztJQUNuRSxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxJQUFJO0lBQ2IsbUJBQW1CO0lBRW5CLG1CQUFtQjtJQUNuQixTQUFTLEVBQUUsS0FBSztJQUNoQixRQUFRLEVBQUUsS0FBSztJQUNmLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFdBQVcsRUFBRSxNQUFNO0lBQ25CLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLFlBQVksRUFBRSxDQUFDO0NBQ2hCLENBQUE7QUFFRCxNQUFNLDhCQUE4QixHQUFrQztJQUNwRSxHQUFHLDZCQUE2QjtJQUNoQyxTQUFTLEVBQUUsSUFBSTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2QsU0FBUyxFQUFFLE9BQU87SUFDbEIsV0FBVyxFQUFFLEdBQUc7SUFDaEIsV0FBVyxFQUFFLFdBQVc7SUFDeEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsWUFBWSxFQUFFLENBQUM7Q0FDaEIsQ0FBQTtBQUtELE1BQU0sT0FBTyxpQkFBaUI7SUFvQjVCLElBQVcsUUFBUSxLQUFjLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUM7SUFFckUsWUFDbUIsZ0JBQXdDLEVBQ3hDLE9BQWUsRUFDZixJQUFzQjtRQUZ0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXdCO1FBQ3hDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixTQUFJLEdBQUosSUFBSSxDQUFrQjtRQXZCeEIsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO1FBRXBDLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFBO1FBRy9ELHdCQUFtQixHQUF5QixJQUFJLENBQUE7UUFDaEQsdUJBQWtCLEdBQWlDLElBQUksQ0FBQTtRQUd2RCwrQkFBMEIsR0FBRyxLQUFLLENBQUE7UUFnQnhDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3ZELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFTSxNQUFNLENBQUMsR0FBb0I7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUE7UUFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUMxQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUMxQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQTtJQUNwQyxDQUFDO0lBRU0sYUFBYSxDQUFDLEdBQVcsRUFBRSxHQUFXO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUE7SUFDakMsQ0FBQztJQUVELDRFQUE0RTtJQUNyRSxxQkFBcUIsQ0FBQyxJQUEwQjtRQUNyRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFBO0lBQ2pDLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFDekIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBb0IsQ0FBQTtJQUNsRCxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWtFLEVBQUUsT0FBc0M7UUFDekgsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWU7UUFDcEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUE7UUFDbkMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNsQixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUM3RixPQUFNO2FBQ1A7WUFFRCwwRUFBMEU7WUFDMUUsd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSxhQUFhO1lBQ2IsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUM1QyxJQUFJLENBQUMsZUFBZSxFQUNwQixpQkFBaUIsRUFDakIsQ0FBQyxLQUErQyxFQUFFLEVBQUU7Z0JBQ2xELEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUMzQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDbkIsQ0FBQyxDQUNGLENBQUE7WUFFRCx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSx5RUFBeUU7WUFDekUsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFBO1lBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRXpDLHNFQUFzRTtZQUN0RSwwRUFBMEU7WUFDMUUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDbkIsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDNUMsTUFBTSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtTQUN0RDtRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBRXpCLE1BQU0sT0FBTyxHQUFHLCtCQUErQixFQUFFLENBQUE7UUFFakQsTUFBTSxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUE7UUFFckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNyRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtnQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUM5QixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUN4QixrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7cUJBQzdCO2dCQUNILENBQUMsQ0FBQyxDQUFBO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTSxVQUFVLENBQUMsT0FBb0IsRUFBRSxRQUFxQztRQUMzRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBUztRQUM1QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUN6QixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDekUsQ0FBQztJQUVELDRFQUE0RTtJQUNyRSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFDekIsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsT0FBTTthQUNQO1lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3RDLE9BQU07U0FDUDtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUV2RSwwRUFBMEU7UUFDMUUscUNBQXFDO1FBQ3JDLDRFQUE0RTtJQUM5RSxDQUFDO0lBRU0seUJBQXlCLENBQUMsS0FBYztRQUM3QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFBO0lBQ3pDLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxPQUFrRDtRQUMzRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFBO0lBQ2xDLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUE7SUFDL0IsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUV6QiwrQ0FBK0M7UUFDL0MsRUFBRTtRQUNGLDRFQUE0RTtRQUM1RSxzRUFBc0U7UUFDdEUsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQTRELEVBQUUsRUFBRTtZQUNuRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNoRSxDQUFDLENBQUMsQ0FBQTtRQUVGLGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDOUIsT0FBTyw4QkFBOEIsQ0FBQTthQUN0QztZQUVELE9BQU8sNkJBQTZCLENBQUE7UUFDdEMsQ0FBQyxDQUFDLENBQUE7UUFFRixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQWtDLEVBQUUsRUFBRTtZQUM5RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUV6QixrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDL0Msa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFBO2lCQUM3QjtZQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFFRix3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQWtDLEVBQUUsRUFBRTtZQUNsRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRixpREFBaUQ7UUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQWtDLEVBQUUsRUFBRTtZQUNqRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFFekIsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDbkUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUN0RixDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FDL0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUViLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFrQyxFQUFFLEVBQUU7WUFDcEYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDckMsT0FBTTthQUNQO1lBRUQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQTtRQUMzRSxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGlCQUFpQixFQUFFLENBQUMsT0FBNEIsRUFBRSxFQUFFO2dCQUN0Ryx3RUFBd0U7Z0JBQ3hFLHdFQUF3RTtnQkFDeEUscUVBQXFFO2dCQUNyRSxzRUFBc0U7Z0JBQ3RFLDRDQUE0QztnQkFDNUMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDdkMsT0FBTTtpQkFDUDtnQkFFRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtnQkFFekIscUVBQXFFO2dCQUNyRSxxRUFBcUU7Z0JBQ3JFLGdFQUFnRTtnQkFDaEUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUN6Qyw0QkFBNEI7b0JBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQ3BCLGdCQUFnQjtvQkFDaEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzFDLE9BQU07aUJBQ1A7Z0JBRUQsNkNBQTZDO2dCQUM3QyxNQUFNLE9BQU8sR0FBRyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDckQsNEJBQTRCO2dCQUM1QixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUVwQixnQkFBZ0I7Z0JBQ2hCLElBQUksQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUUxQyxpRUFBaUU7Z0JBQ2pFLHdDQUF3QztnQkFDeEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsMEJBQTBCO29CQUM1RCxDQUFDLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO29CQUMxRCxDQUFDLENBQUMsU0FBUyxDQUFBO2dCQUNiLElBQUksc0JBQXNCLEVBQUU7b0JBQzFCLHNDQUFzQyxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFBO29CQUN2RSxrQkFBa0IsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDakQ7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUNoQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7aUJBQ2xDO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDSDtJQUNILENBQUM7SUFFTSxTQUFTO1FBQ2QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDM0MsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxJQUFJLENBQUE7SUFDdkQsQ0FBQztJQUVELDRFQUE0RTtJQUNyRSxrQkFBa0I7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFDekIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM5QixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixVQUFVLEdBQUcsSUFBSSxDQUFBO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsNEVBQTRFO0lBQ3JFLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUN6QixJQUFJLE9BQU8sR0FBb0MsSUFBSSxDQUFBO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM5QixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixPQUFPLEdBQUcsQ0FBQyxDQUFBO2FBQ1o7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFRCw0RUFBNEU7SUFDckUsZUFBZTtRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUN6QyxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtTQUN6QztJQUNILENBQUM7SUFFRCw0RUFBNEU7SUFDcEUsMEJBQTBCLENBQUMsT0FBaUMsRUFBRSxRQUE2QjtRQUNqRyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDL0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtTQUMvQjtRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBRXpCLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsU0FBUyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1NBQ3RDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUkscUJBQXFCLENBQ2pELElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLG1CQUFtQixFQUN4QixTQUFTLEVBQ1QsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUNuQixPQUFPLENBQ1IsQ0FBQTtTQUNGO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxzQkFBK0IsSUFBSTtRQUNuRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1lBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxtQkFBbUIsRUFBRTtvQkFDdkIsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQ3JDO2dCQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNaLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsaURBQWlEO0lBQ3pDLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLENBQUMsRUFBRTtZQUN0RSxNQUFNLEtBQUssQ0FDVCw0RUFBNEU7Z0JBQzFFLG9FQUFvRSxDQUN2RSxDQUFBO1NBQ0Y7SUFDSCxDQUFDOzs4R0FqWVUsaUJBQWlCO2tIQUFqQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95LCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vbWVudSdcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkLCBub3ROdWxsT3JVbmRlZmluZWQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vdXRpbHMnXG5cbmltcG9ydCB7IEdvb2dsZU1hcHNDb250ZXh0TWVudSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtY29udGV4dG1lbnUnXG5pbXBvcnQge1xuICBhZGRJbm5lckZlYXR1cmVDdXRvdXRUb0V4dGVyaW9yRmVhdHVyZSxcbiAgY3JlYXRlRGF0YUZlYXR1cmVGcm9tUG9seWdvbixcbiAgY3JlYXRlRmVhdHVyZUNoYW5nZU9ic2VydmFibGUsXG4gIGdldEJvdW5kc1dpdGhBbGxGZWF0dXJlcyxcbiAgZ2V0RmVhdHVyZUNlbnRlcixcbiAgZ2V0RmVhdHVyZXNDb3VudCxcbiAgZ2V0UG9zc2libGVFeHRlcmlvckZlYXR1cmUsXG4gIGlzRmVhdHVyZVNlbGVjdGVkLFxuICBwb2x5Z29uSGFzVmFsaWRQYXRoc0xlbmd0aHMsXG4gIHJlbW92ZUFsbEZlYXR1cmVzLFxuICBzZXRGZWF0dXJlU2VsZWN0ZWQsXG4gIHN0cmlwQXBwRmVhdHVyZVByb3BlcnRpZXNGcm9tSnNvbixcbn0gZnJvbSAnLi9nb29nbGUtbWFwcy1mZWF0dXJlLWhlbHBlcnMnXG5pbXBvcnQgeyBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLCBNYXBWYWx1ZVNvdXJjZSB9IGZyb20gJy4vbWFwLXZhbHVlLW1hbmFnZXIuc2VydmljZSdcblxuZGVjbGFyZSBjb25zdCBuZ0Rldk1vZGU6IGJvb2xlYW4gfCB1bmRlZmluZWRcblxuY29uc3QgREVGQVVMVF9QT0xZR09OX09QVElPTlM6IGdvb2dsZS5tYXBzLlBvbHlnb25PcHRpb25zID0ge1xuICBjbGlja2FibGU6IHRydWUsXG4gIGRyYWdnYWJsZTogdHJ1ZSxcbiAgZWRpdGFibGU6IHRydWUsXG4gIC8vIGZpbGxDb2xvcjogJ3JnYmEoNjAsMTUwLDYwLDEpJyxcbiAgLy8gc3Ryb2tlQ29sb3I6ICdyZ2JhKDE1NSwyNTUsMCwxKSdcbn1cblxuY29uc3QgREVGQVVMVF9EUkFXSU5HX01BTkFHRVJfT1BUSU9OUzogKCgpID0+IGdvb2dsZS5tYXBzLmRyYXdpbmcuRHJhd2luZ01hbmFnZXJPcHRpb25zKSA9ICgpID0+ICh7XG4gIGRyYXdpbmdDb250cm9sOiB0cnVlLFxuICBkcmF3aW5nQ29udHJvbE9wdGlvbnM6IHtcbiAgICBkcmF3aW5nTW9kZXM6IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuUE9MWUdPTixcbiAgICBdLFxuICB9LFxuICBwb2x5Z29uT3B0aW9uczogREVGQVVMVF9QT0xZR09OX09QVElPTlMsXG4gIGRyYXdpbmdNb2RlOiBudWxsLFxufSlcblxuY29uc3QgRkVBVFVSRV9TVFlMRV9PUFRJT05TX0RFRkFVTFQ6IGdvb2dsZS5tYXBzLkRhdGEuU3R5bGVPcHRpb25zID0ge1xuICBjbGlja2FibGU6IHRydWUsXG4gIHZpc2libGU6IHRydWUsXG4gIC8vIHpJbmRleD86IG51bWJlcjtcblxuICAvLyBjdXJzb3I/OiBzdHJpbmc7XG4gIGRyYWdnYWJsZTogZmFsc2UsXG4gIGVkaXRhYmxlOiBmYWxzZSxcbiAgZmlsbENvbG9yOiAndGVhbCcsXG4gIGZpbGxPcGFjaXR5OiAwLjMsXG4gIHN0cm9rZUNvbG9yOiAnYmx1ZScsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZVdlaWdodDogMixcbn1cblxuY29uc3QgRkVBVFVSRV9TVFlMRV9PUFRJT05TX1NFTEVDVEVEOiBnb29nbGUubWFwcy5EYXRhLlN0eWxlT3B0aW9ucyA9IHtcbiAgLi4uRkVBVFVSRV9TVFlMRV9PUFRJT05TX0RFRkFVTFQsXG4gIGRyYWdnYWJsZTogdHJ1ZSxcbiAgZWRpdGFibGU6IHRydWUsXG4gIGZpbGxDb2xvcjogJ2dyZWVuJyxcbiAgZmlsbE9wYWNpdHk6IDAuNyxcbiAgc3Ryb2tlQ29sb3I6ICdsaW1lZ3JlZW4nLFxuICBzdHJva2VPcGFjaXR5OiAxLFxuICBzdHJva2VXZWlnaHQ6IDIsXG59XG5cbnR5cGUgV2l0aFJlcXVpcmVkPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IFQgJiB7IFtQIGluIEtdLT86IFRbUF0gfVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR29vZ2xlTWFwc1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWFwUmVhZHlTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSlcblxuICBwcml2YXRlIF9kcmF3aW5nTWFuYWdlcj86IGdvb2dsZS5tYXBzLmRyYXdpbmcuRHJhd2luZ01hbmFnZXJcbiAgcHJpdmF0ZSBfZmVhdHVyZUNvbnRleHRNZW51OiBNZW51Q29tcG9uZW50IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBfYWN0aXZlQ29udGV4dE1lbnU6IEdvb2dsZU1hcHNDb250ZXh0TWVudSB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgX2Jhc2VMYXRMbmc/OiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsXG5cbiAgcHJpdmF0ZSBfYWxsb3dEcmF3aW5nSG9sZUluUG9seWdvbiA9IGZhbHNlXG5cbiAgLy8gVE9ETzogTW92ZSB0byBhIGJldHRlciBwbGFjZSB0aGFuIHRoZSBtYXAgd3JhcHBlciBzZXJ2aWNlLlxuICBwcml2YXRlIF9maWxlSW5wdXRIYW5kbGVyOiAoKGZpbGU6IEZpbGUpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHwgbnVsbFxuXG4gIHB1YmxpYyBnb29nbGVNYXA/OiBnb29nbGUubWFwcy5NYXBcblxuICBwdWJsaWMgcmVhZG9ubHkgbWFwUmVhZHkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+XG5cbiAgcHVibGljIGdldCBtYXBSZWFkeSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX21hcFJlYWR5U3ViamVjdC52YWx1ZSB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFwVmFsdWVNYW5hZ2VyOiBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgKSB7XG4gICAgdGhpcy5tYXBSZWFkeSQgPSB0aGlzLl9tYXBSZWFkeVN1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX25nVW5zdWJzY3JpYmUubmV4dCgpXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpXG4gIH1cblxuICBwdWJsaWMgc2V0TWFwKG1hcDogZ29vZ2xlLm1hcHMuTWFwKTogdm9pZCB7XG4gICAgdGhpcy5nb29nbGVNYXAgPSBtYXBcbiAgICB0aGlzLl9tYXBSZWFkeVN1YmplY3QubmV4dCh0cnVlKVxuICAgIHRoaXMuX2luaXREcmF3aW5nTWFuYWdlcigpXG4gICAgdGhpcy5faW5pdEZlYXR1cmVTdHlsaW5nKClcbiAgICB0aGlzLl9pbml0RmVhdHVyZUNoYW5nZUxpc3RlbmVycygpXG4gIH1cblxuICBwdWJsaWMgc2V0QmFzZUxhdExuZyhsYXQ6IG51bWJlciwgbG5nOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9iYXNlTGF0TG5nID0geyBsYXQsIGxuZyB9XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciBvdXQgb2YgdGhlIHNlcnZpY2UgbWVhbnQgdG8ganVzdCB3cmFwIHRoZSBnb29nbGUgbWFwcyBhcGkuXG4gIHB1YmxpYyBzZXRGZWF0dXJlQ29udGV4dE1lbnUobWVudTogTWVudUNvbXBvbmVudCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9mZWF0dXJlQ29udGV4dE1lbnUgPSBtZW51XG4gIH1cblxuICBwdWJsaWMgZ2V0RGl2KCk6IEhUTUxEaXZFbGVtZW50IHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgcmV0dXJuIHRoaXMuZ29vZ2xlTWFwLmdldERpdigpIGFzIEhUTUxEaXZFbGVtZW50XG4gIH1cblxuICBwdWJsaWMgZml0Qm91bmRzKGJvdW5kczogZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzIHwgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzTGl0ZXJhbCwgcGFkZGluZz86IG51bWJlciB8IGdvb2dsZS5tYXBzLlBhZGRpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgdGhpcy5nb29nbGVNYXAuZml0Qm91bmRzKGJvdW5kcywgcGFkZGluZylcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aGUgbWFwJ3MgZmVhdHVyZXMgYW5kIHJlbW92ZXMgYW55IHRoYXQgYXJlIHNlbGVjdGVkLlxuICAgKi9cbiAgcHVibGljIGRlbGV0ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgY29uc3QgbWFwRGF0YSA9IHRoaXMuZ29vZ2xlTWFwLmRhdGFcbiAgICBtYXBEYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICBpZiAoaXNGZWF0dXJlU2VsZWN0ZWQoZikpIHtcbiAgICAgICAgbWFwRGF0YS5yZW1vdmUoZilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBjdXJyZW50IGRyYXdpbmcuXG4gICAqL1xuICBwdWJsaWMgc3RvcERyYXdpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZCh0aGlzLl9kcmF3aW5nTWFuYWdlcikgfHwgdGhpcy5fZHJhd2luZ01hbmFnZXIuZ2V0RHJhd2luZ01vZGUoKSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuaW5nIGZvciB0aGUgY29tcGxldGlvbiBldmVudCBvZiB0aGUgb3ZlcmxheSBjdXJyZW50bHkgYmVpbmcgZHJhd25cbiAgICAgIC8vIGFuZCByZW1vdmluZyBpdC4gSSBoYXZlbid0IGZvdW5kIGEgd2F5IHRvIGNhbmNlbCB0aGUgY3VycmVudCBkcmF3aW5nLFxuICAgICAgLy8gd2l0aG91dCB0aGlzIGhhY2sgdGhhdCBhc3N1bWVzIG91ciBsaXN0ZW5lcnMgd2lsbCBub3QgcnVuIGludG8gYSByYWNlXG4gICAgICAvLyBjb25kaXRpb24uXG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGdvb2dsZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyKFxuICAgICAgICB0aGlzLl9kcmF3aW5nTWFuYWdlcixcbiAgICAgICAgJ292ZXJsYXljb21wbGV0ZScsXG4gICAgICAgIChldmVudDogZ29vZ2xlLm1hcHMuZHJhd2luZy5PdmVybGF5Q29tcGxldGVFdmVudCkgPT4ge1xuICAgICAgICAgIGV2ZW50Lm92ZXJsYXk/LnNldE1hcChudWxsKVxuICAgICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIC8vIFRvIGZha2UgY2FuY2VsaW5nIHRoZSBjdXJyZW50IGRyYXdpbmcsIHdpdGhvdXQgZGlzYWJsaW5nIHRoZSBkcmF3aW5nXG4gICAgICAvLyBtb2RlLCB0aGUgZHJhd2luIG1vZGUgaXMgYmVpbmcgdW5zZXQgdGhlbiBpbW1lZGlhdGVseSBzZXQgYmFjay4gV2hlblxuICAgICAgLy8gdGhlIG1vZGUgaXMgdW5zZXQgdGhlICdvdmVybGF5Y29tcGxldGUnIGV2ZW50IHdpbGwgZmlyZSwgd2hpY2ggd2lsbFxuICAgICAgLy8gZ2l2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBvdmVybGF5IHRvIHJlbW92ZSwgdGhlbiBpdCBpcyBzZXQgYmFja1xuICAgICAgLy8gdG8gdGhlIG1vZGUgdGhlIHVzZXIgd2FzIHVzaW5nLiBUbyB0aGUgdXNlciBpcyBzaG91bGQganVzdCBzZWVtIGxpa2VcbiAgICAgIC8vIHRoZSBjdXJyZW50IGRyYXdpbmcgd2FzIGNhbmNlbGVkIGFuZCB0aGV5IGNhbiBzdGFydCBkcmF3aW5nIGFnYWluLlxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuX2RyYXdpbmdNYW5hZ2VyLmdldERyYXdpbmdNb2RlKClcbiAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLnNldERyYXdpbmdNb2RlKG51bGwpXG4gICAgICB0aGlzLl9kcmF3aW5nTWFuYWdlci5zZXREcmF3aW5nTW9kZShtb2RlKVxuXG4gICAgICAvLyAnb3ZlcmxheWNvbXBsZXRlJyBzaG91bGQgZmlyZSBpbW1lZGlhdGVseSwgdW5sZXNzIGFuIG92ZXJsYXkgaGFkbid0XG4gICAgICAvLyBzdGFydGVkIGRyYXdpbmcuIFRoaXMgdGltZW91dCB3aWxsIG1ha2Ugc3VyZSB0aGUgbGlzdGVuZXIgZ2V0cyByZW1vdmVkLlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIF9pbml0RHJhd2luZ01hbmFnZXIoKTogdm9pZCB7XG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLl9kcmF3aW5nTWFuYWdlcikpIHtcbiAgICAgIHRocm93IEVycm9yKGBEcmF3aW5nTWFuYWdlciBpcyBhbHJlYWR5IGluaXRpYWxpemVkLmApXG4gICAgfVxuXG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IERFRkFVTFRfRFJBV0lOR19NQU5BR0VSX09QVElPTlMoKVxuXG4gICAgY29uc3QgZHJhd2luZ01hbmFnZXIgPSBuZXcgZ29vZ2xlLm1hcHMuZHJhd2luZy5EcmF3aW5nTWFuYWdlcihvcHRpb25zKVxuICAgIGRyYXdpbmdNYW5hZ2VyLnNldE1hcCh0aGlzLmdvb2dsZU1hcClcblxuICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyID0gZHJhd2luZ01hbmFnZXJcblxuICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLmFkZExpc3RlbmVyKCdkcmF3aW5nbW9kZV9jaGFuZ2VkJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGlmICh0aGlzLl9kcmF3aW5nTWFuYWdlcj8uZ2V0RHJhd2luZ01vZGUoKSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICBpZiAoaXNGZWF0dXJlU2VsZWN0ZWQoZikpIHtcbiAgICAgICAgICAgIHNldEZlYXR1cmVTZWxlY3RlZChmLCBmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhZGRDb250cm9sKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjogZ29vZ2xlLm1hcHMuQ29udHJvbFBvc2l0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHRoaXMuZ29vZ2xlTWFwLmNvbnRyb2xzW3Bvc2l0aW9uXS5wdXNoKGVsZW1lbnQpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0RGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgcmVtb3ZlQWxsRmVhdHVyZXModGhpcy5nb29nbGVNYXAuZGF0YSlcbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZEdlb0pzb24oZGF0YSlcbiAgICB0aGlzLmdvb2dsZU1hcC5maXRCb3VuZHMoZ2V0Qm91bmRzV2l0aEFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpKVxuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3Igb3V0IG9mIHRoZSBzZXJ2aWNlIG1lYW50IHRvIGp1c3Qgd3JhcCB0aGUgZ29vZ2xlIG1hcHMgYXBpLlxuICBwdWJsaWMgcmVDZW50ZXJPbkZlYXR1cmVzKCk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICBpZiAoZ2V0RmVhdHVyZXNDb3VudCh0aGlzLmdvb2dsZU1hcC5kYXRhKSA9PT0gMCkge1xuICAgICAgaWYgKCF0aGlzLl9iYXNlTGF0TG5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLmdvb2dsZU1hcC5wYW5Ubyh0aGlzLl9iYXNlTGF0TG5nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuZ29vZ2xlTWFwLmZpdEJvdW5kcyhnZXRCb3VuZHNXaXRoQWxsRmVhdHVyZXModGhpcy5nb29nbGVNYXAuZGF0YSkpXG5cbiAgICAvLyBUT0RPOiBGaXggdG8gcGFuIHRvIGNlbnRlci4gQ3VycmVudGx5IGZpdEJvdW5kcyByZXN1bHRzIGluIHRoZSBleHBlY3RlZFxuICAgIC8vIHJlc3VsdCwgYnV0IHBhbnRUb0JvdW5kcyBhbmltYXRlcy5cbiAgICAvLyB0aGlzLmdvb2dsZU1hcC5wYW5Ub0JvdW5kcyhnZXRCb3VuZHNXaXRoQWxsRmVhdHVyZXModGhpcy5nb29nbGVNYXAuZGF0YSkpXG4gIH1cblxuICBwdWJsaWMgYWxsb3dEcmF3aW5nSG9sZUluUG9seWdvbihhbGxvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2FsbG93RHJhd2luZ0hvbGVJblBvbHlnb24gPSBhbGxvd1xuICB9XG5cbiAgcHVibGljIHNldEZpbGVJbnB1dEhhbmRsZXIoaGFuZGxlcjogKChmaWxlOiBGaWxlKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9maWxlSW5wdXRIYW5kbGVyID0gaGFuZGxlclxuICB9XG5cbiAgcHVibGljIGdldEZpbGVJbnB1dEhhbmRsZXIoKTogKChmaWxlOiBGaWxlKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9maWxlSW5wdXRIYW5kbGVyXG4gIH1cblxuICBwcml2YXRlIF9pbml0RmVhdHVyZVN0eWxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgLy8gRGlzYWJsZSBhbnkgc2VsZWN0aW9uIHdoZW4gY2xpY2tpbmcgdGhlIG1hcC5cbiAgICAvL1xuICAgIC8vIFRPRE86IFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyB0aGF0IHdvdWxkIGJlIG1vcmUgYWNjdXJhdGUgb3JcbiAgICAvLyBhZGRpdGlvbmFsIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsaXN0ZW5lZCB0bywgc3VjaCBhcyB0aGUgZGlzYWJsaW5nXG4gICAgLy8gc2VsZWN0aW9uIHdoZW4gdGhlIG1hcCBsb29zZXMgZm9jdXMuXG4gICAgdGhpcy5nb29nbGVNYXAuYWRkTGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW46IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQgfCBnb29nbGUubWFwcy5JY29uTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5mb3JFYWNoKGYgPT4gc2V0RmVhdHVyZVNlbGVjdGVkKGYsIGZhbHNlKSlcbiAgICB9KVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoYXQgdGhlIHN0eWxlIG9mIHRoZSBmZWF0dXJlcyBhcmUuXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5zZXRTdHlsZShmZWF0dXJlID0+IHtcbiAgICAgIGlmIChpc0ZlYXR1cmVTZWxlY3RlZChmZWF0dXJlKSkge1xuICAgICAgICByZXR1cm4gRkVBVFVSRV9TVFlMRV9PUFRJT05TX1NFTEVDVEVEXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBGRUFUVVJFX1NUWUxFX09QVElPTlNfREVGQVVMVFxuICAgIH0pXG5cbiAgICAvLyBTZWxlY3QgYSBmZWF0dXJlIHdoZW4gY2xpY2tlZC5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdjbGljaycsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG5cbiAgICAgIHNldEZlYXR1cmVTZWxlY3RlZChldmVudC5mZWF0dXJlLCB0cnVlKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5mb3JFYWNoKGYgPT4ge1xuICAgICAgICBpZiAoZiAhPT0gZXZlbnQuZmVhdHVyZSAmJiBpc0ZlYXR1cmVTZWxlY3RlZChmKSkge1xuICAgICAgICAgIHNldEZlYXR1cmVTZWxlY3RlZChmLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgLy8gU2V0IGEgc3R5bGUgb24gaG92ZXJlZCBmZWF0dXJlcyB0aGF0IGNhbiBiZSBzZWxlY3RlZC5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdtb3VzZW92ZXInLCAoZXZlbnQ6IGdvb2dsZS5tYXBzLkRhdGEuTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5yZXZlcnRTdHlsZSgpXG4gICAgICBpZiAoIXRoaXMuaXNEcmF3aW5nKCkgJiYgIWlzRmVhdHVyZVNlbGVjdGVkKGV2ZW50LmZlYXR1cmUpKSB7XG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEub3ZlcnJpZGVTdHlsZShldmVudC5mZWF0dXJlLCB7IHN0cm9rZVdlaWdodDogNCB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBSZW1vdmUgYW55IGhvdmVyIHN0eWxlcyB3aGVuIG1vdXNlIG1vdmVzIGF3YXkuXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGRMaXN0ZW5lcignbW91c2VvdXQnLCAoZXZlbnQ6IGdvb2dsZS5tYXBzLkRhdGEuTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5yZXZlcnRTdHlsZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRGZWF0dXJlQ2hhbmdlTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcblxuICAgIGNyZWF0ZUZlYXR1cmVDaGFuZ2VPYnNlcnZhYmxlKHRoaXMuZ29vZ2xlTWFwLmRhdGEsIHRoaXMuX25nWm9uZSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBmcm9tKHRoaXMuZ2V0R2VvSnNvbigpKS5waXBlKFxuICAgICAgICB0YXAoZ2VvSnNvbiA9PiB0aGlzLl9tYXBWYWx1ZU1hbmFnZXIuc2V0VmFsdWUoZ2VvSnNvbiwgTWFwVmFsdWVTb3VyY2UuRmVhdHVyZUNoYW5nZSkpLFxuICAgICAgKSksXG4gICAgICB0YWtlVW50aWwodGhpcy5fbmdVbnN1YnNjcmliZSksXG4gICAgKS5zdWJzY3JpYmUoKVxuXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZXZlbnQ6IGdvb2dsZS5tYXBzLkRhdGEuTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc0ZlYXR1cmVTZWxlY3RlZChldmVudC5mZWF0dXJlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3BlbkNvbnRleHRNZW51Rm9yRmVhdHVyZShldmVudC5mZWF0dXJlLCBldmVudC5sYXRMbmcgPz8gdW5kZWZpbmVkKVxuICAgIH0pXG5cbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHRoaXMuX2RyYXdpbmdNYW5hZ2VyKSkge1xuICAgICAgZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIodGhpcy5fZHJhd2luZ01hbmFnZXIsICdwb2x5Z29uY29tcGxldGUnLCAocG9seWdvbjogZ29vZ2xlLm1hcHMuUG9seWdvbikgPT4ge1xuICAgICAgICAvLyBUaGUgRHJhd2luZ01hbmFnZXIgZG9lc24ndCBzZWVtIHRvIGhhdmUgYSB3YXkgdG8gYWNjZXNzIHRoZSBvdmVybGF5cyxcbiAgICAgICAgLy8gc28gaWYgdGhlIG1hcCBpcyBub3Qgc2V0IHRoZW4gaXQgc2hvdWxkbid5IGJlIGNvbnNpZGVyZWQgYSBzdWNjZXNzZnVsXG4gICAgICAgIC8vIGNvbXBsZXRpb24uIEkgYW0gY2FuY2VsaW5nIHRoZSBhY3RpdmUgZHJhd2luZyBieSBkaXNhYmxpbmcgZHJhd2luZ1xuICAgICAgICAvLyBtb2RlIGFuZCBzZXR0aW5nIHRoZSBtYXAgbnVsbCBpbiB0aGUgJ292ZXJsYXljb21wbGV0ZScgZXZlbnQsIHdoaWNoXG4gICAgICAgIC8vIGZpcmVzIGJlZm9yZSB0aGUgJ3BvbHlnb25jb21wbGV0ZScgZXZlbnQuXG4gICAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZChwb2x5Z29uLmdldE1hcCgpKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgICAgIC8vIFRPRE86IFNlZSBpZiB0aGVyZSBpcyBhIHdheSB0byBwcmV2ZW50IHRoZSBwb2x5Z29uIGZyb20gY29tcGxldGluZ1xuICAgICAgICAvLyB3aXRob3V0IGVub3VnaCBwb2ludHMuIFRoaXMgaXMgdmVyeSBsb3cgcHJpb3JpdHksIGJlY2F1c2Ugc3RhcnRpbmdcbiAgICAgICAgLy8gb3ZlciBhZnRlciBhZGRpbmcgYSBzaW5nbGUgcG9pbnQgaXNuJ3QgYSBtYWpvciBpbmNvbnZlbmllbmNlLlxuICAgICAgICBpZiAoIXBvbHlnb25IYXNWYWxpZFBhdGhzTGVuZ3Rocyhwb2x5Z29uKSkge1xuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZHJhd24gcG9seWdvbi5cbiAgICAgICAgICBwb2x5Z29uLnNldE1hcChudWxsKVxuICAgICAgICAgIC8vIFN0b3AgZHJhd2luZy5cbiAgICAgICAgICB0aGlzLl9kcmF3aW5nTWFuYWdlcj8uc2V0RHJhd2luZ01vZGUobnVsbClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIG1hcCBmZWF0dXJlIG9mIHRoZSBkcmF3biBwb2x5Z29uLlxuICAgICAgICBjb25zdCBmZWF0dXJlID0gY3JlYXRlRGF0YUZlYXR1cmVGcm9tUG9seWdvbihwb2x5Z29uKVxuICAgICAgICAvLyBSZW1vdmUgdGhlIGRyYXduIHBvbHlnb24uXG4gICAgICAgIHBvbHlnb24uc2V0TWFwKG51bGwpXG5cbiAgICAgICAgLy8gU3RvcCBkcmF3aW5nLlxuICAgICAgICB0aGlzLl9kcmF3aW5nTWFuYWdlcj8uc2V0RHJhd2luZ01vZGUobnVsbClcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmVhdHVyZSBzaG91bGQgYmUgdXNlZCBhcyBhIGN1dG91dCB0byBhbiBleGlzdGluZ1xuICAgICAgICAvLyBmZWF0dXJlIG9yIGFkZGVkIGFzIGl0J3Mgb3duIGZlYXR1cmUuXG4gICAgICAgIGNvbnN0IGV4dGVyaW9yUG9seWdvbkZlYXR1cmUgPSB0aGlzLl9hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uXG4gICAgICAgICAgPyBnZXRQb3NzaWJsZUV4dGVyaW9yRmVhdHVyZSh0aGlzLmdvb2dsZU1hcC5kYXRhLCBmZWF0dXJlKVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIGlmIChleHRlcmlvclBvbHlnb25GZWF0dXJlKSB7XG4gICAgICAgICAgYWRkSW5uZXJGZWF0dXJlQ3V0b3V0VG9FeHRlcmlvckZlYXR1cmUoZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZSwgZmVhdHVyZSlcbiAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZSwgdHJ1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZChmZWF0dXJlKVxuICAgICAgICAgIHNldEZlYXR1cmVTZWxlY3RlZChmZWF0dXJlLCB0cnVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0RyYXdpbmcoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuX2RyYXdpbmdNYW5hZ2VyKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZHJhd2luZ01hbmFnZXIuZ2V0RHJhd2luZ01vZGUoKSAhPT0gbnVsbFxuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3Igb3V0IG9mIHRoZSBzZXJ2aWNlIG1lYW50IHRvIGp1c3Qgd3JhcCB0aGUgZ29vZ2xlIG1hcHMgYXBpLlxuICBwdWJsaWMgaGFzU2VsZWN0ZWRGZWF0dXJlKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICBsZXQgaXNTZWxlY3RlZCA9IGZhbHNlXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5mb3JFYWNoKGYgPT4ge1xuICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgIGlzU2VsZWN0ZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gaXNTZWxlY3RlZFxuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3Igb3V0IG9mIHRoZSBzZXJ2aWNlIG1lYW50IHRvIGp1c3Qgd3JhcCB0aGUgZ29vZ2xlIG1hcHMgYXBpLlxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRGZWF0dXJlKCk6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZSB8IG51bGwge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICBsZXQgZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlIHwgbnVsbCA9IG51bGxcbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICBpZiAoaXNGZWF0dXJlU2VsZWN0ZWQoZikpIHtcbiAgICAgICAgZmVhdHVyZSA9IGZcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBmZWF0dXJlXG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciBvdXQgb2YgdGhlIHNlcnZpY2UgbWVhbnQgdG8ganVzdCB3cmFwIHRoZSBnb29nbGUgbWFwcyBhcGkuXG4gIHB1YmxpYyBvcGVuQ29udGV4dE1lbnUoKTogdm9pZCB7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuZ2V0U2VsZWN0ZWRGZWF0dXJlKClcbiAgICBpZiAoZmVhdHVyZSkge1xuICAgICAgdGhpcy5fb3BlbkNvbnRleHRNZW51Rm9yRmVhdHVyZShmZWF0dXJlKVxuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHJpdmF0ZSBfb3BlbkNvbnRleHRNZW51Rm9yRmVhdHVyZShmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUsIHBvc2l0aW9uPzogZ29vZ2xlLm1hcHMuTGF0TG5nKSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUNvbnRleHRNZW51KSB7XG4gICAgICB0aGlzLl9hY3RpdmVDb250ZXh0TWVudS5jbG9zZSgpXG4gICAgICB0aGlzLl9hY3RpdmVDb250ZXh0TWVudSA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG5cbiAgICBsZXQgX3Bvc2l0aW9uID0gcG9zaXRpb25cbiAgICBpZiAoIV9wb3NpdGlvbikge1xuICAgICAgX3Bvc2l0aW9uID0gZ2V0RmVhdHVyZUNlbnRlcihmZWF0dXJlKVxuICAgIH1cbiAgICBpZiAodGhpcy5fZmVhdHVyZUNvbnRleHRNZW51KSB7XG4gICAgICB0aGlzLl9hY3RpdmVDb250ZXh0TWVudSA9IG5ldyBHb29nbGVNYXBzQ29udGV4dE1lbnUoXG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwLFxuICAgICAgICB0aGlzLl9mZWF0dXJlQ29udGV4dE1lbnUsXG4gICAgICAgIF9wb3NpdGlvbixcbiAgICAgICAgdGhpcy5fdmNyLFxuICAgICAgICB0aGlzLl9uZ1pvbmUsXG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEsXG4gICAgICAgIGZlYXR1cmUsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEdlb0pzb24ocmVtb3ZlQXBwUHJvcGVydGllczogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLnRvR2VvSnNvbihmID0+IHtcbiAgICAgICAgaWYgKHJlbW92ZUFwcFByb3BlcnRpZXMpIHtcbiAgICAgICAgICBzdHJpcEFwcEZlYXR1cmVQcm9wZXJ0aWVzRnJvbUpzb24oZilcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGYpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQXNzZXJ0cyB0aGF0IHRoZSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICovXG4gIHByaXZhdGUgX2Fzc2VydEluaXRpYWxpemVkKCk6IGFzc2VydHMgdGhpcyBpcyBXaXRoUmVxdWlyZWQ8R29vZ2xlTWFwc1NlcnZpY2UsICdnb29nbGVNYXAnPiB7XG4gICAgaWYgKCF0aGlzLmdvb2dsZU1hcCAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgYWNjZXNzIEdvb2dsZSBNYXAgaW5mb3JtYXRpb24gYmVmb3JlIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICcgK1xuICAgICAgICAgICdQbGVhc2Ugd2FpdCBmb3IgdGhlIEFQSSB0byBsb2FkIGJlZm9yZSB0cnlpbmcgdG8gaW50ZXJhY3Qgd2l0aCBpdC4nLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG59XG4iXX0=
|
|
426
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9nb29nbGUtbWFwcy9nb29nbGUtbWFwcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQXVDLE1BQU0sZUFBZSxDQUFBO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUcxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUVoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNqRSxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLDRCQUE0QixFQUM1Qiw2QkFBNkIsRUFDN0Isd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsc0NBQXNDLEVBQ3RDLDBCQUEwQixFQUMxQiwrQkFBK0IsRUFDL0IsaUJBQWlCLEVBQ2pCLDJCQUEyQixFQUMzQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlDQUFpQyxHQUNsQyxNQUFNLCtCQUErQixDQUFBO0FBQ3RDLE9BQU8sRUFBMEIsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUE7OztBQUlwRixNQUFNLHVCQUF1QixHQUFHLENBQUMsY0FBdUIsRUFBOEIsRUFBRSxDQUFDLENBQUM7SUFDeEYsU0FBUyxFQUFFLGNBQWM7SUFDekIsU0FBUyxFQUFFLGNBQWM7SUFDekIsUUFBUSxFQUFFLGNBQWM7Q0FDekIsQ0FBQyxDQUFBO0FBRUYsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLGNBQXVCLEVBQTZDLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLGNBQWMsRUFBRSxjQUFj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K0IsSUFBSTtRQUNuRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1lBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxtQkFBbUIsRUFBRTtvQkFDdkIsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLENBQUE7aUJBQ3JDO2dCQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNaLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsaURBQWlEO0lBQ3pDLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLENBQUMsRUFBRTtZQUN0RSxNQUFNLEtBQUssQ0FDVCw0RUFBNEU7Z0JBQzFFLG9FQUFvRSxDQUN2RSxDQUFBO1NBQ0Y7SUFDSCxDQUFDOzs4R0FuY1UsaUJBQWlCO2tIQUFqQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95LCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vbWVudSdcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkLCBub3ROdWxsT3JVbmRlZmluZWQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vdXRpbHMnXG5cbmltcG9ydCB7IEdvb2dsZU1hcHNDb250ZXh0TWVudSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtY29udGV4dG1lbnUnXG5pbXBvcnQge1xuICBhZGRJbm5lckZlYXR1cmVDdXRvdXRUb0V4dGVyaW9yRmVhdHVyZSxcbiAgY3JlYXRlRGF0YUZlYXR1cmVGcm9tUG9seWdvbixcbiAgY3JlYXRlRmVhdHVyZUNoYW5nZU9ic2VydmFibGUsXG4gIGdldEJvdW5kc1dpdGhBbGxGZWF0dXJlcyxcbiAgZ2V0RmVhdHVyZUNlbnRlcixcbiAgZ2V0RmVhdHVyZXNDb3VudCxcbiAgZ2V0SG92ZXJlZFN0eWxlT3B0aW9uc0RlZmluZWRCeUZlYXR1cmUsXG4gIGdldFBvc3NpYmxlRXh0ZXJpb3JGZWF0dXJlLFxuICBnZXRTdHlsZU9wdGlvbnNEZWZpbmVkQnlGZWF0dXJlLFxuICBpc0ZlYXR1cmVTZWxlY3RlZCxcbiAgcG9seWdvbkhhc1ZhbGlkUGF0aHNMZW5ndGhzLFxuICByZW1vdmVBbGxGZWF0dXJlcyxcbiAgc2V0RmVhdHVyZVNlbGVjdGVkLFxuICBzdHJpcEFwcEZlYXR1cmVQcm9wZXJ0aWVzRnJvbUpzb24sXG59IGZyb20gJy4vZ29vZ2xlLW1hcHMtZmVhdHVyZS1oZWxwZXJzJ1xuaW1wb3J0IHsgTWFwVmFsdWVNYW5hZ2VyU2VydmljZSwgTWFwVmFsdWVTb3VyY2UgfSBmcm9tICcuL21hcC12YWx1ZS1tYW5hZ2VyLnNlcnZpY2UnXG5cbmRlY2xhcmUgY29uc3QgbmdEZXZNb2RlOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cbmNvbnN0IERFRkFVTFRfUE9MWUdPTl9PUFRJT05TID0gKGVkaXRpbmdFbmFibGVkOiBib29sZWFuKTogZ29vZ2xlLm1hcHMuUG9seWdvbk9wdGlvbnMgPT4gKHtcbiAgY2xpY2thYmxlOiBlZGl0aW5nRW5hYmxlZCxcbiAgZHJhZ2dhYmxlOiBlZGl0aW5nRW5hYmxlZCxcbiAgZWRpdGFibGU6IGVkaXRpbmdFbmFibGVkLFxufSlcblxuY29uc3QgREVGQVVMVF9EUkFXSU5HX01BTkFHRVJfT1BUSU9OUyA9IChlZGl0aW5nRW5hYmxlZDogYm9vbGVhbik6IGdvb2dsZS5tYXBzLmRyYXdpbmcuRHJhd2luZ01hbmFnZXJPcHRpb25zID0+ICh7XG4gIGRyYXdpbmdDb250cm9sOiBlZGl0aW5nRW5hYmxlZCxcbiAgZHJhd2luZ0NvbnRyb2xPcHRpb25zOiB7XG4gICAgZHJhd2luZ01vZGVzOiBbXG4gICAgICBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlUeXBlLlBPTFlHT04sXG4gICAgXSxcbiAgfSxcbiAgcG9seWdvbk9wdGlvbnM6IERFRkFVTFRfUE9MWUdPTl9PUFRJT05TKGVkaXRpbmdFbmFibGVkKSxcbiAgZHJhd2luZ01vZGU6IG51bGwsXG59KVxuXG5jb25zdCBGRUFUVVJFX1NUWUxFX09QVElPTlNfREVGQVVMVCA9IChlZGl0aW5nRW5hYmxlZDogYm9vbGVhbik6IGdvb2dsZS5tYXBzLkRhdGEuU3R5bGVPcHRpb25zID0+ICh7XG4gIGNsaWNrYWJsZTogdHJ1ZSxcbiAgLy8gY2xpY2thYmxlOiBlZGl0aW5nRW5hYmxlZCxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgLy8gekluZGV4PzogbnVtYmVyO1xuXG4gIC8vIGN1cnNvcj86IHN0cmluZztcbiAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgZWRpdGFibGU6IGZhbHNlLFxuICBmaWxsQ29sb3I6ICd0ZWFsJyxcbiAgZmlsbE9wYWNpdHk6IDAuMyxcbiAgc3Ryb2tlQ29sb3I6ICdibHVlJyxcbiAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgc3Ryb2tlV2VpZ2h0OiAyLFxufSlcblxuY29uc3QgRkVBVFVSRV9TVFlMRV9PUFRJT05TX1NFTEVDVEVEID0gKGVkaXRpbmdFbmFibGVkOiBib29sZWFuKTogZ29vZ2xlLm1hcHMuRGF0YS5TdHlsZU9wdGlvbnMgPT4gKHtcbiAgLi4uRkVBVFVSRV9TVFlMRV9PUFRJT05TX0RFRkFVTFQoZWRpdGluZ0VuYWJsZWQpLFxuICBkcmFnZ2FibGU6IGVkaXRpbmdFbmFibGVkLFxuICBlZGl0YWJsZTogZWRpdGluZ0VuYWJsZWQsXG4gIGZpbGxDb2xvcjogJ2dyZWVuJyxcbiAgZmlsbE9wYWNpdHk6IDAuNyxcbiAgc3Ryb2tlQ29sb3I6ICdsaW1lZ3JlZW4nLFxuICBzdHJva2VPcGFjaXR5OiAxLFxuICBzdHJva2VXZWlnaHQ6IDIsXG59KVxuXG5jb25zdCBGRUFUVVJFX1NUWUxFX09WRVJSSURFX09QVElPTlNfSE9WRVJFRCA9IChlZGl0aW5nRW5hYmxlZDogYm9vbGVhbik6IGdvb2dsZS5tYXBzLkRhdGEuU3R5bGVPcHRpb25zID0+ICh7XG4gIHN0cm9rZUNvbG9yOiAnYmxhY2snLFxuICBzdHJva2VPcGFjaXR5OiAxLFxuICBzdHJva2VXZWlnaHQ6IDQsXG59KVxuXG5jb25zdCBTVVBQT1JURURfUFJPUEVSVFlfU1RZTEVfT1BUSU9OUzogKGtleW9mIGdvb2dsZS5tYXBzLkRhdGEuU3R5bGVPcHRpb25zKVtdID0gW1xuICAnZmlsbENvbG9yJyxcbiAgJ2ZpbGxPcGFjaXR5JyxcbiAgJ3N0cm9rZUNvbG9yJyxcbiAgJ3N0cm9rZU9wYWNpdHknLFxuICAnc3Ryb2tlV2VpZ2h0JyxcbiAgJ2xhYmVsJyxcbiAgJ29wYWNpdHknLFxuICAnaWNvbicsXG4gICdjbGlja2FibGUnLFxuICAndmlzaWJsZScsXG5dXG5cbnR5cGUgV2l0aFJlcXVpcmVkPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IFQgJiB7IFtQIGluIEtdLT86IFRbUF0gfVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR29vZ2xlTWFwc1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWFwUmVhZHlTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSlcbiAgcHJpdmF0ZSByZWFkb25seSBfZWRpdGluZ0VuYWJsZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKVxuXG4gIHByaXZhdGUgX2RyYXdpbmdNYW5hZ2VyPzogZ29vZ2xlLm1hcHMuZHJhd2luZy5EcmF3aW5nTWFuYWdlclxuICBwcml2YXRlIF9mZWF0dXJlQ29udGV4dE1lbnU6IE1lbnVDb21wb25lbnQgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIF9hY3RpdmVDb250ZXh0TWVudTogR29vZ2xlTWFwc0NvbnRleHRNZW51IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBfYmFzZUxhdExuZz86IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWxcblxuICBwcml2YXRlIF9hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uID0gZmFsc2VcblxuICAvLyBUT0RPOiBNb3ZlIHRvIGEgYmV0dGVyIHBsYWNlIHRoYW4gdGhlIG1hcCB3cmFwcGVyIHNlcnZpY2UuXG4gIHByaXZhdGUgX2ZpbGVJbnB1dEhhbmRsZXI6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsXG5cbiAgcHVibGljIGdvb2dsZU1hcD86IGdvb2dsZS5tYXBzLk1hcFxuXG4gIHB1YmxpYyByZWFkb25seSBtYXBSZWFkeSQ6IE9ic2VydmFibGU8Ym9vbGVhbj5cblxuICBwdWJsaWMgZ2V0IG1hcFJlYWR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbWFwUmVhZHlTdWJqZWN0LnZhbHVlIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZWRpdGluZ0VuYWJsZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFwVmFsdWVNYW5hZ2VyOiBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgKSB7XG4gICAgdGhpcy5lZGl0aW5nRW5hYmxlZCQgPSB0aGlzLl9lZGl0aW5nRW5hYmxlZFN1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm1hcFJlYWR5JCA9IHRoaXMuX21hcFJlYWR5U3ViamVjdC5hc09ic2VydmFibGUoKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXAobWFwOiBnb29nbGUubWFwcy5NYXApOiB2b2lkIHtcbiAgICB0aGlzLmdvb2dsZU1hcCA9IG1hcFxuICAgIHRoaXMuX21hcFJlYWR5U3ViamVjdC5uZXh0KHRydWUpXG4gICAgdGhpcy5faW5pdERyYXdpbmdNYW5hZ2VyKClcbiAgICB0aGlzLl9pbml0RmVhdHVyZVN0eWxpbmcoKVxuICAgIHRoaXMuX2luaXRGZWF0dXJlQ2hhbmdlTGlzdGVuZXJzKClcbiAgfVxuXG4gIHB1YmxpYyBzZXRCYXNlTGF0TG5nKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Jhc2VMYXRMbmcgPSB7IGxhdCwgbG5nIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIHNldEZlYXR1cmVDb250ZXh0TWVudShtZW51OiBNZW51Q29tcG9uZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpXG4gICAgdGhpcy5fZmVhdHVyZUNvbnRleHRNZW51ID0gbWVudVxuICB9XG5cbiAgcHVibGljIHNldEVkaXRpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0aW5nRW5hYmxlZFN1YmplY3QubmV4dChlbmFibGVkKVxuXG4gICAgaWYgKHRoaXMubWFwUmVhZHkpIHtcbiAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEucmV2ZXJ0U3R5bGUoKVxuICAgICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc3RvcERyYXdpbmcoKVxuICAgICAgICBjb25zdCBvcHRpb25zID0gREVGQVVMVF9EUkFXSU5HX01BTkFHRVJfT1BUSU9OUyh0aGlzLmlzRWRpdGluZ0VuYWJsZWQoKSlcbiAgICAgICAgdGhpcy5fZHJhd2luZ01hbmFnZXI/LnNldE9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgdGhpcy5fZHJhd2luZ01hbmFnZXI/LnNldE1hcChudWxsKVxuICAgICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZiwgZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IERFRkFVTFRfRFJBV0lOR19NQU5BR0VSX09QVElPTlModGhpcy5pc0VkaXRpbmdFbmFibGVkKCkpXG4gICAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyPy5zZXRPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyPy5zZXRNYXAodGhpcy5nb29nbGVNYXApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzRWRpdGluZ0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRpbmdFbmFibGVkU3ViamVjdC52YWx1ZVxuICB9XG5cbiAgcHVibGljIGdldERpdigpOiBIVE1MRGl2RWxlbWVudCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHJldHVybiB0aGlzLmdvb2dsZU1hcC5nZXREaXYoKSBhcyBIVE1MRGl2RWxlbWVudFxuICB9XG5cbiAgcHVibGljIGZpdEJvdW5kcyhib3VuZHM6IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB8IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kc0xpdGVyYWwsIHBhZGRpbmc/OiBudW1iZXIgfCBnb29nbGUubWFwcy5QYWRkaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHRoaXMuZ29vZ2xlTWFwLmZpdEJvdW5kcyhib3VuZHMsIHBhZGRpbmcpXG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgdGhlIG1hcCdzIGZlYXR1cmVzIGFuZCByZW1vdmVzIGFueSB0aGF0IGFyZSBzZWxlY3RlZC5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIGNvbnN0IG1hcERhdGEgPSB0aGlzLmdvb2dsZU1hcC5kYXRhXG4gICAgbWFwRGF0YS5mb3JFYWNoKGYgPT4ge1xuICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgIG1hcERhdGEucmVtb3ZlKGYpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgY3VycmVudCBkcmF3aW5nLlxuICAgKi9cbiAgcHVibGljIHN0b3BEcmF3aW5nKCk6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fZHJhd2luZ01hbmFnZXIpIHx8IHRoaXMuX2RyYXdpbmdNYW5hZ2VyLmdldERyYXdpbmdNb2RlKCkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbmluZyBmb3IgdGhlIGNvbXBsZXRpb24gZXZlbnQgb2YgdGhlIG92ZXJsYXkgY3VycmVudGx5IGJlaW5nIGRyYXduXG4gICAgICAvLyBhbmQgcmVtb3ZpbmcgaXQuIEkgaGF2ZW4ndCBmb3VuZCBhIHdheSB0byBjYW5jZWwgdGhlIGN1cnJlbnQgZHJhd2luZyxcbiAgICAgIC8vIHdpdGhvdXQgdGhpcyBoYWNrIHRoYXQgYXNzdW1lcyBvdXIgbGlzdGVuZXJzIHdpbGwgbm90IHJ1biBpbnRvIGEgcmFjZVxuICAgICAgLy8gY29uZGl0aW9uLlxuICAgICAgY29uc3QgbGlzdGVuZXIgPSBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5fZHJhd2luZ01hbmFnZXIsXG4gICAgICAgICdvdmVybGF5Y29tcGxldGUnLFxuICAgICAgICAoZXZlbnQ6IGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheUNvbXBsZXRlRXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5vdmVybGF5Py5zZXRNYXAobnVsbClcbiAgICAgICAgICBsaXN0ZW5lci5yZW1vdmUoKVxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICAvLyBUbyBmYWtlIGNhbmNlbGluZyB0aGUgY3VycmVudCBkcmF3aW5nLCB3aXRob3V0IGRpc2FibGluZyB0aGUgZHJhd2luZ1xuICAgICAgLy8gbW9kZSwgdGhlIGRyYXdpbmcgbW9kZSBpcyBiZWluZyB1bnNldCB0aGVuIGltbWVkaWF0ZWx5IHNldCBiYWNrLiBXaGVuXG4gICAgICAvLyB0aGUgbW9kZSBpcyB1bnNldCB0aGUgJ292ZXJsYXljb21wbGV0ZScgZXZlbnQgd2lsbCBmaXJlLCB3aGljaCB3aWxsXG4gICAgICAvLyBnaXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG92ZXJsYXkgdG8gcmVtb3ZlLCB0aGVuIGl0IGlzIHNldCBiYWNrXG4gICAgICAvLyB0byB0aGUgbW9kZSB0aGUgdXNlciB3YXMgdXNpbmcuIFRvIHRoZSB1c2VyIGlzIHNob3VsZCBqdXN0IHNlZW0gbGlrZVxuICAgICAgLy8gdGhlIGN1cnJlbnQgZHJhd2luZyB3YXMgY2FuY2VsZWQgYW5kIHRoZXkgY2FuIHN0YXJ0IGRyYXdpbmcgYWdhaW4uXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5fZHJhd2luZ01hbmFnZXIuZ2V0RHJhd2luZ01vZGUoKVxuICAgICAgdGhpcy5fZHJhd2luZ01hbmFnZXIuc2V0RHJhd2luZ01vZGUobnVsbClcbiAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLnNldERyYXdpbmdNb2RlKG1vZGUpXG5cbiAgICAgIC8vICdvdmVybGF5Y29tcGxldGUnIHNob3VsZCBmaXJlIGltbWVkaWF0ZWx5LCB1bmxlc3MgYW4gb3ZlcmxheSBoYWRuJ3RcbiAgICAgIC8vIHN0YXJ0ZWQgZHJhd2luZy4gVGhpcyB0aW1lb3V0IHdpbGwgbWFrZSBzdXJlIHRoZSBsaXN0ZW5lciBnZXRzIHJlbW92ZWQuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGlzdGVuZXIucmVtb3ZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2luaXREcmF3aW5nTWFuYWdlcigpOiB2b2lkIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHRoaXMuX2RyYXdpbmdNYW5hZ2VyKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYERyYXdpbmdNYW5hZ2VyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuYClcbiAgICB9XG5cbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCBvcHRpb25zID0gREVGQVVMVF9EUkFXSU5HX01BTkFHRVJfT1BUSU9OUyh0aGlzLmlzRWRpdGluZ0VuYWJsZWQoKSlcblxuICAgIGNvbnN0IGRyYXdpbmdNYW5hZ2VyID0gbmV3IGdvb2dsZS5tYXBzLmRyYXdpbmcuRHJhd2luZ01hbmFnZXIob3B0aW9ucylcbiAgICBkcmF3aW5nTWFuYWdlci5zZXRNYXAodGhpcy5nb29nbGVNYXApXG5cbiAgICB0aGlzLl9kcmF3aW5nTWFuYWdlciA9IGRyYXdpbmdNYW5hZ2VyXG5cbiAgICB0aGlzLl9kcmF3aW5nTWFuYWdlci5hZGRMaXN0ZW5lcignZHJhd2luZ21vZGVfY2hhbmdlZCcsIChldmVudDogYW55KSA9PiB7XG4gICAgICBpZiAodGhpcy5fZHJhd2luZ01hbmFnZXI/LmdldERyYXdpbmdNb2RlKCkgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZiwgZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYWRkQ29udHJvbChlbGVtZW50OiBIVE1MRWxlbWVudCwgcG9zaXRpb246IGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICB0aGlzLmdvb2dsZU1hcC5jb250cm9sc1twb3NpdGlvbl0ucHVzaChlbGVtZW50KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldERhdGEoZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHJlbW92ZUFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGRHZW9Kc29uKGRhdGEpXG4gICAgdGhpcy5nb29nbGVNYXAuZml0Qm91bmRzKGdldEJvdW5kc1dpdGhBbGxGZWF0dXJlcyh0aGlzLmdvb2dsZU1hcC5kYXRhKSlcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIHJlQ2VudGVyT25GZWF0dXJlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgaWYgKGdldEZlYXR1cmVzQ291bnQodGhpcy5nb29nbGVNYXAuZGF0YSkgPT09IDApIHtcbiAgICAgIGlmICghdGhpcy5fYmFzZUxhdExuZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5nb29nbGVNYXAucGFuVG8odGhpcy5fYmFzZUxhdExuZylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLmdvb2dsZU1hcC5maXRCb3VuZHMoZ2V0Qm91bmRzV2l0aEFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpKVxuXG4gICAgLy8gVE9ETzogRml4IHRvIHBhbiB0byBjZW50ZXIuIEN1cnJlbnRseSBmaXRCb3VuZHMgcmVzdWx0cyBpbiB0aGUgZXhwZWN0ZWRcbiAgICAvLyByZXN1bHQsIGJ1dCBwYW50VG9Cb3VuZHMgYW5pbWF0ZXMuXG4gICAgLy8gdGhpcy5nb29nbGVNYXAucGFuVG9Cb3VuZHMoZ2V0Qm91bmRzV2l0aEFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpKVxuICB9XG5cbiAgcHVibGljIGFsbG93RHJhd2luZ0hvbGVJblBvbHlnb24oYWxsb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uID0gYWxsb3dcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWxlSW5wdXRIYW5kbGVyKGhhbmRsZXI6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsZUlucHV0SGFuZGxlciA9IGhhbmRsZXJcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWxlSW5wdXRIYW5kbGVyKCk6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZUlucHV0SGFuZGxlclxuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEZlYXR1cmVTdHlsaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcblxuICAgIC8vIERpc2FibGUgYW55IHNlbGVjdGlvbiB3aGVuIGNsaWNraW5nIHRoZSBtYXAuXG4gICAgLy9cbiAgICAvLyBUT0RPOiBUaGVyZSBtYXkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgdGhhdCB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlIG9yXG4gICAgLy8gYWRkaXRpb25hbCBldmVudHMgdGhhdCBzaG91bGQgYmUgbGlzdGVuZWQgdG8sIHN1Y2ggYXMgdGhlIGRpc2FibGluZ1xuICAgIC8vIHNlbGVjdGlvbiB3aGVuIHRoZSBtYXAgbG9vc2VzIGZvY3VzLlxuICAgIHRoaXMuZ29vZ2xlTWFwLmFkZExpc3RlbmVyKCdjbGljaycsIChldmVuOiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50IHwgZ29vZ2xlLm1hcHMuSWNvbk1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuZm9yRWFjaChmID0+IHNldEZlYXR1cmVTZWxlY3RlZChmLCBmYWxzZSkpXG4gICAgfSlcblxuICAgIC8vIERldGVybWluZSB3aGF0IHRoZSBzdHlsZSBvZiB0aGUgZmVhdHVyZXMgYXJlLlxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuc2V0U3R5bGUoZmVhdHVyZSA9PiB7XG4gICAgICBsZXQgb3B0cyA9IEZFQVRVUkVfU1RZTEVfT1BUSU9OU19ERUZBVUxUKHRoaXMuaXNFZGl0aW5nRW5hYmxlZCgpKVxuXG4gICAgICBjb25zdCBvcHRpb25zID0gZ2V0U3R5bGVPcHRpb25zRGVmaW5lZEJ5RmVhdHVyZShmZWF0dXJlKVxuICAgICAgdGhpcy5fbWVyZ2VTdHlsZU9wdGlvbnMob3B0cywgb3B0aW9ucyA/PyB7fSlcblxuICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGZlYXR1cmUpKSB7XG4gICAgICAgIGNvbnN0IGhvdmVyT3B0aW9ucyA9IGdldEhvdmVyZWRTdHlsZU9wdGlvbnNEZWZpbmVkQnlGZWF0dXJlKGZlYXR1cmUpXG4gICAgICAgIG9wdHMgPSBGRUFUVVJFX1NUWUxFX09QVElPTlNfU0VMRUNURUQodGhpcy5pc0VkaXRpbmdFbmFibGVkKCkpXG4gICAgICAgIHRoaXMuX21lcmdlU3R5bGVPcHRpb25zKG9wdHMsIGhvdmVyT3B0aW9ucyA/PyB7fSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdHNcbiAgICB9KVxuXG4gICAgLy8gU2VsZWN0IGEgZmVhdHVyZSB3aGVuIGNsaWNrZWQuXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQ6IGdvb2dsZS5tYXBzLkRhdGEuTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZXZlbnQuZmVhdHVyZSwgdHJ1ZSlcbiAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuZm9yRWFjaChmID0+IHtcbiAgICAgICAgaWYgKGYgIT09IGV2ZW50LmZlYXR1cmUgJiYgaXNGZWF0dXJlU2VsZWN0ZWQoZikpIHtcbiAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZiwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIFNldCBhIHN0eWxlIG9uIGhvdmVyZWQgZmVhdHVyZXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGRMaXN0ZW5lcignbW91c2VvdmVyJywgKGV2ZW50OiBnb29nbGUubWFwcy5EYXRhLk1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEucmV2ZXJ0U3R5bGUoKVxuXG4gICAgICBpZiAoIXRoaXMuaXNEcmF3aW5nKCkgJiYgIWlzRmVhdHVyZVNlbGVjdGVkKGV2ZW50LmZlYXR1cmUpKSB7XG4gICAgICAgIHRoaXMuc2V0RmVhdHVyZUhvdmVyZWRTdHlsZU92ZXJyaWRlKGV2ZW50LmZlYXR1cmUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIFJlbW92ZSBhbnkgaG92ZXIgc3R5bGVzIHdoZW4gbW91c2UgbW92ZXMgYXdheS5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdtb3VzZW91dCcsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLnJldmVydFN0eWxlKClcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIHNldEZlYXR1cmVIb3ZlcmVkU3R5bGVPdmVycmlkZShmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgY29uc3Qgb3ZlcnJpZGVPcHRzID0gRkVBVFVSRV9TVFlMRV9PVkVSUklERV9PUFRJT05TX0hPVkVSRUQodGhpcy5pc0VkaXRpbmdFbmFibGVkKCkpXG4gICAgY29uc3QgaG92ZXJPcHRpb25zID0gZ2V0SG92ZXJlZFN0eWxlT3B0aW9uc0RlZmluZWRCeUZlYXR1cmUoZmVhdHVyZSlcbiAgICB0aGlzLl9tZXJnZVN0eWxlT3B0aW9ucyhvdmVycmlkZU9wdHMsIGhvdmVyT3B0aW9ucyA/PyB7fSlcbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLm92ZXJyaWRlU3R5bGUoZmVhdHVyZSwgb3ZlcnJpZGVPcHRzKVxuICB9XG5cbiAgcHJpdmF0ZSBfbWVyZ2VTdHlsZU9wdGlvbnMob3B0aW9uczogZ29vZ2xlLm1hcHMuRGF0YS5TdHlsZU9wdGlvbnMsIHByb3BlcnRpZXNTdHlsZU9wdGlvbnM6IGdvb2dsZS5tYXBzLkRhdGEuU3R5bGVPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHByb3BlcnRpZXNTdHlsZU9wdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcHQgb2YgU1VQUE9SVEVEX1BST1BFUlRZX1NUWUxFX09QVElPTlMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvcGVydGllc1N0eWxlT3B0aW9ucywgb3B0KSkge1xuICAgICAgICBvcHRpb25zW29wdF0gPSBwcm9wZXJ0aWVzU3R5bGVPcHRpb25zW29wdF0gYXMgYW55XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEZlYXR1cmVDaGFuZ2VMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgY3JlYXRlRmVhdHVyZUNoYW5nZU9ic2VydmFibGUodGhpcy5nb29nbGVNYXAuZGF0YSwgdGhpcy5fbmdab25lKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IGZyb20odGhpcy5nZXRHZW9Kc29uKCkpLnBpcGUoXG4gICAgICAgIHRhcChnZW9Kc29uID0+IHRoaXMuX21hcFZhbHVlTWFuYWdlci5zZXRWYWx1ZShnZW9Kc29uLCBNYXBWYWx1ZVNvdXJjZS5GZWF0dXJlQ2hhbmdlKSksXG4gICAgICApKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9uZ1Vuc3Vic2NyaWJlKSxcbiAgICApLnN1YnNjcmliZSgpXG5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdjb250ZXh0bWVudScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzRmVhdHVyZVNlbGVjdGVkKGV2ZW50LmZlYXR1cmUpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnVGb3JGZWF0dXJlKGV2ZW50LmZlYXR1cmUsIGV2ZW50LmxhdExuZyA/PyB1bmRlZmluZWQpXG4gICAgfSlcblxuICAgIGlmIChub3ROdWxsT3JVbmRlZmluZWQodGhpcy5fZHJhd2luZ01hbmFnZXIpKSB7XG4gICAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcih0aGlzLl9kcmF3aW5nTWFuYWdlciwgJ3BvbHlnb25jb21wbGV0ZScsIChwb2x5Z29uOiBnb29nbGUubWFwcy5Qb2x5Z29uKSA9PiB7XG4gICAgICAgIC8vIFRoZSBEcmF3aW5nTWFuYWdlciBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhIHdheSB0byBhY2Nlc3MgdGhlIG92ZXJsYXlzLFxuICAgICAgICAvLyBzbyBpZiB0aGUgbWFwIGlzIG5vdCBzZXQgdGhlbiBpdCBzaG91bGRuJ3kgYmUgY29uc2lkZXJlZCBhIHN1Y2Nlc3NmdWxcbiAgICAgICAgLy8gY29tcGxldGlvbi4gSSBhbSBjYW5jZWxpbmcgdGhlIGFjdGl2ZSBkcmF3aW5nIGJ5IGRpc2FibGluZyBkcmF3aW5nXG4gICAgICAgIC8vIG1vZGUgYW5kIHNldHRpbmcgdGhlIG1hcCBudWxsIGluIHRoZSAnb3ZlcmxheWNvbXBsZXRlJyBldmVudCwgd2hpY2hcbiAgICAgICAgLy8gZmlyZXMgYmVmb3JlIHRoZSAncG9seWdvbmNvbXBsZXRlJyBldmVudC5cbiAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHBvbHlnb24uZ2V0TWFwKCkpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG5cbiAgICAgICAgLy8gVE9ETzogU2VlIGlmIHRoZXJlIGlzIGEgd2F5IHRvIHByZXZlbnQgdGhlIHBvbHlnb24gZnJvbSBjb21wbGV0aW5nXG4gICAgICAgIC8vIHdpdGhvdXQgZW5vdWdoIHBvaW50cy4gVGhpcyBpcyB2ZXJ5IGxvdyBwcmlvcml0eSwgYmVjYXVzZSBzdGFydGluZ1xuICAgICAgICAvLyBvdmVyIGFmdGVyIGFkZGluZyBhIHNpbmdsZSBwb2ludCBpc24ndCBhIG1ham9yIGluY29udmVuaWVuY2UuXG4gICAgICAgIGlmICghcG9seWdvbkhhc1ZhbGlkUGF0aHNMZW5ndGhzKHBvbHlnb24pKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkcmF3biBwb2x5Z29uLlxuICAgICAgICAgIHBvbHlnb24uc2V0TWFwKG51bGwpXG4gICAgICAgICAgLy8gU3RvcCBkcmF3aW5nLlxuICAgICAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyPy5zZXREcmF3aW5nTW9kZShudWxsKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbWFwIGZlYXR1cmUgb2YgdGhlIGRyYXduIHBvbHlnb24uXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjcmVhdGVEYXRhRmVhdHVyZUZyb21Qb2x5Z29uKHBvbHlnb24pXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZHJhd24gcG9seWdvbi5cbiAgICAgICAgcG9seWdvbi5zZXRNYXAobnVsbClcblxuICAgICAgICAvLyBTdG9wIGRyYXdpbmcuXG4gICAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyPy5zZXREcmF3aW5nTW9kZShudWxsKVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIGFzIGEgY3V0b3V0IHRvIGFuIGV4aXN0aW5nXG4gICAgICAgIC8vIGZlYXR1cmUgb3IgYWRkZWQgYXMgaXQncyBvd24gZmVhdHVyZS5cbiAgICAgICAgY29uc3QgZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZSA9IHRoaXMuX2FsbG93RHJhd2luZ0hvbGVJblBvbHlnb25cbiAgICAgICAgICA/IGdldFBvc3NpYmxlRXh0ZXJpb3JGZWF0dXJlKHRoaXMuZ29vZ2xlTWFwLmRhdGEsIGZlYXR1cmUpXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKGV4dGVyaW9yUG9seWdvbkZlYXR1cmUpIHtcbiAgICAgICAgICBhZGRJbm5lckZlYXR1cmVDdXRvdXRUb0V4dGVyaW9yRmVhdHVyZShleHRlcmlvclBvbHlnb25GZWF0dXJlLCBmZWF0dXJlKVxuICAgICAgICAgIHNldEZlYXR1cmVTZWxlY3RlZChleHRlcmlvclBvbHlnb25GZWF0dXJlLCB0cnVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuYWRkKGZlYXR1cmUpXG4gICAgICAgICAgc2V0RmVhdHVyZVNlbGVjdGVkKGZlYXR1cmUsIHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzRHJhd2luZygpOiBib29sZWFuIHtcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fZHJhd2luZ01hbmFnZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9kcmF3aW5nTWFuYWdlci5nZXREcmF3aW5nTW9kZSgpICE9PSBudWxsXG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciBvdXQgb2YgdGhlIHNlcnZpY2UgbWVhbnQgdG8ganVzdCB3cmFwIHRoZSBnb29nbGUgbWFwcyBhcGkuXG4gIHB1YmxpYyBoYXNTZWxlY3RlZEZlYXR1cmUoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIGxldCBpc1NlbGVjdGVkID0gZmFsc2VcbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICBpZiAoaXNGZWF0dXJlU2VsZWN0ZWQoZikpIHtcbiAgICAgICAgaXNTZWxlY3RlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBpc1NlbGVjdGVkXG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciBvdXQgb2YgdGhlIHNlcnZpY2UgbWVhbnQgdG8ganVzdCB3cmFwIHRoZSBnb29nbGUgbWFwcyBhcGkuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEZlYXR1cmUoKTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlIHwgbnVsbCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIGxldCBmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUgfCBudWxsID0gbnVsbFxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuZm9yRWFjaChmID0+IHtcbiAgICAgIGlmIChpc0ZlYXR1cmVTZWxlY3RlZChmKSkge1xuICAgICAgICBmZWF0dXJlID0gZlxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGZlYXR1cmVcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIG9wZW5Db250ZXh0TWVudSgpOiB2b2lkIHtcbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRTZWxlY3RlZEZlYXR1cmUoKVxuICAgIGlmIChmZWF0dXJlKSB7XG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnVGb3JGZWF0dXJlKGZlYXR1cmUpXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3Igb3V0IG9mIHRoZSBzZXJ2aWNlIG1lYW50IHRvIGp1c3Qgd3JhcCB0aGUgZ29vZ2xlIG1hcHMgYXBpLlxuICBwdWJsaWMgY2xvc2VDb250ZXh0TWVudSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQ29udGV4dE1lbnUpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUNvbnRleHRNZW51LmNsb3NlKClcbiAgICAgIHRoaXMuX2FjdGl2ZUNvbnRleHRNZW51ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHJpdmF0ZSBfb3BlbkNvbnRleHRNZW51Rm9yRmVhdHVyZShmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUsIHBvc2l0aW9uPzogZ29vZ2xlLm1hcHMuTGF0TG5nKSB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KClcblxuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcblxuICAgIGxldCBfcG9zaXRpb24gPSBwb3NpdGlvblxuICAgIGlmICghX3Bvc2l0aW9uKSB7XG4gICAgICBfcG9zaXRpb24gPSBnZXRGZWF0dXJlQ2VudGVyKGZlYXR1cmUpXG4gICAgfVxuICAgIGlmICh0aGlzLl9mZWF0dXJlQ29udGV4dE1lbnUpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUNvbnRleHRNZW51ID0gbmV3IEdvb2dsZU1hcHNDb250ZXh0TWVudShcbiAgICAgICAgdGhpcy5nb29nbGVNYXAsXG4gICAgICAgIHRoaXMuX2ZlYXR1cmVDb250ZXh0TWVudSxcbiAgICAgICAgX3Bvc2l0aW9uLFxuICAgICAgICB0aGlzLl92Y3IsXG4gICAgICAgIHRoaXMuX25nWm9uZSxcbiAgICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YSxcbiAgICAgICAgZmVhdHVyZSxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0R2VvSnNvbihyZW1vdmVBcHBQcm9wZXJ0aWVzOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEudG9HZW9Kc29uKGYgPT4ge1xuICAgICAgICBpZiAocmVtb3ZlQXBwUHJvcGVydGllcykge1xuICAgICAgICAgIHN0cmlwQXBwRmVhdHVyZVByb3BlcnRpZXNGcm9tSnNvbihmKVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBBc3NlcnRzIHRoYXQgdGhlIG1hcCBoYXMgYmVlbiBpbml0aWFsaXplZC4gKi9cbiAgcHJpdmF0ZSBfYXNzZXJ0SW5pdGlhbGl6ZWQoKTogYXNzZXJ0cyB0aGlzIGlzIFdpdGhSZXF1aXJlZDxHb29nbGVNYXBzU2VydmljZSwgJ2dvb2dsZU1hcCc+IHtcbiAgICBpZiAoIXRoaXMuZ29vZ2xlTWFwICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBhY2Nlc3MgR29vZ2xlIE1hcCBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZC4gJyArXG4gICAgICAgICAgJ1BsZWFzZSB3YWl0IGZvciB0aGUgQVBJIHRvIGxvYWQgYmVmb3JlIHRyeWluZyB0byBpbnRlcmFjdCB3aXRoIGl0LicsXG4gICAgICApXG4gICAgfVxuICB9XG5cbn1cbiJdfQ==
|