UNPKG

@boldadmin/angular-google-maps

Version:
247 lines 21.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Output } from '@angular/core'; import { EventPublisher } from '@boldadmin/event-publisher'; import * as moment from 'moment'; import { mapsText } from './angular-google-maps.constant'; import { AngularGoogleMapsBuilder } from './service/angular-google-maps-builder.service'; import { AngularGoogleMapsGeocoder } from './service/angular-google-maps-geocoder.service'; import { GoogleMapsFactory } from './service/google-maps-factory.service'; import { IconRegistry } from './service/icon-registry/icon-registry'; export class AngularGoogleMapsComponent { /** * @param {?} googleMapsFactory * @param {?} googleMapsBuilder * @param {?} googleMapsGeocoder * @param {?} eventPublisher * @param {?} iconRegistry */ constructor(googleMapsFactory, googleMapsBuilder, googleMapsGeocoder, eventPublisher, iconRegistry) { this.googleMapsFactory = googleMapsFactory; this.googleMapsBuilder = googleMapsBuilder; this.googleMapsGeocoder = googleMapsGeocoder; this.eventPublisher = eventPublisher; this.iconRegistry = iconRegistry; this.mapsText = mapsText; this.address = ''; this.mapOptions = { center: { lat: 0, lng: 0 }, mapTypeControlOptions: { mapTypeIds: ['roadmap', 'satellite'], position: this.googleMapsFactory.getGoogleMaps().ControlPosition.LEFT_BOTTOM }, zoom: 16, controlSize: 22, fullscreenControl: false }; this.markerOptions = { position: { lat: 0, lng: 0 }, draggable: true, animation: this.googleMapsFactory.getGoogleMaps().Animation.DROP }; this.circleOptions = { strokeColor: '#448aff', strokeOpacity: 0.8, strokeWeight: 2, fillColor: '#448aff', fillOpacity: 0.35, editable: true, radius: 70 }; this.previousMarkerIcon = { url: 'http://cdn.boldadmin.com.s3-website-eu-west-1.amazonaws.com/previous-marker.png' }; this.currentMarkerIcon = { url: 'http://cdn.boldadmin.com.s3-website-eu-west-1.amazonaws.com/current-marker.png' }; } /** * @return {?} */ ngOnInit() { this.eventPublisher.subscribe('addressReverseGeocoded', (/** * @param {?} address * @return {?} */ (address) => this.address = address)); this.iconRegistry.register('expand', './assets/expand.svg'); this.iconRegistry.register('collapse', './assets/collapse.svg'); } /** * @return {?} */ ngOnDestroy() { this.eventPublisher.unsubscribeAll('addressReverseGeocoded'); } /** * @param {?} focusLocation * @return {?} */ createMapByLocation(focusLocation) { this.googleMapsGeocoder.reverseGeocode(focusLocation.coordinates, (/** * @param {?} address * @return {?} */ (address) => this.address = address)); this.circleOptions.radius = focusLocation.radiusInMeters; this.changeMapCenter(focusLocation.coordinates); this.googleMapsBuilder .createMap(this.mapOptions) .addCenterMarker(this.markerOptions) .addCircle(this.circleOptions) .bindCircleToMarker() .addSearchBox(); } /** * @param {?} address * @return {?} */ createMapByAddress(address) { this.googleMapsGeocoder.geocode(address, (/** * @param {?} coordinates * @return {?} */ (coordinates) => { this.changeMapCenter(coordinates); this.googleMapsBuilder .createMap(this.mapOptions) .addCenterMarker(this.markerOptions) .addCircle(this.circleOptions) .bindCircleToMarker() .hideMarker() .hideCircle() .addSearchBox(); })); } /** * @return {?} */ notifyMapResize() { this.eventPublisher.notify('resizeMap'); } /** * @param {?} timestampCoordinatesList * @param {?} name * @return {?} */ addTravelPath(timestampCoordinatesList, name) { timestampCoordinatesList.forEach((/** * @param {?} timestampCoordinates * @param {?} index * @return {?} */ (timestampCoordinates, index) => { /** @type {?} */ const icon = index === 0 ? this.currentMarkerIcon : this.previousMarkerIcon; /** @type {?} */ const dateTime = moment.utc(timestampCoordinates.timestamp).format('YYYY.MM.DD HH:mm'); this.googleMapsBuilder.addMarker({ position: this.googleMapsFactory.createLatLng(timestampCoordinates.coordinates), title: `Name: ${name}, Time: ${dateTime}`, icon: icon }); })); /** @type {?} */ const latLngs = timestampCoordinatesList.map((/** * @param {?} value * @return {?} */ value => this.googleMapsFactory.createLatLng(value.coordinates))); this.addPolyline(latLngs, '#' + Math.random().toString(16).substr(2, 6)); } /** * @private * @param {?} path * @param {?} colorCode * @return {?} */ addPolyline(path, colorCode) { this.googleMapsBuilder.addPolyline({ geodesic: true, strokeOpacity: 0.8, strokeWeight: 1, path: path, strokeColor: colorCode }); } /** * @private * @param {?} coordinates * @return {?} */ changeMapCenter(coordinates) { this.mapOptions.center = { lat: coordinates.latitude, lng: coordinates.longitude }; } } AngularGoogleMapsComponent.decorators = [ { type: Component, args: [{ selector: 'google-maps', template: "<input id=\"search-input\" name=\"searchBox\" class=\"controls\" type=\"text\"\n placeholder=\"{{mapsText.searchBox}}\"\n [ngModelOptions]=\"{standalone: true}\"\n [(ngModel)]=\"address\"/>\n<mat-icon id=\"expand-icon\" class=\"resize-control\" svgIcon=\"expand\" (click)=\"notifyMapResize()\"></mat-icon>\n<mat-icon id=\"collapse-icon\" class=\"resize-control\" svgIcon=\"collapse\" (click)=\"notifyMapResize()\"></mat-icon>\n\n<div id=\"map\"></div>\n", providers: [AngularGoogleMapsBuilder] }] } ]; /** @nocollapse */ AngularGoogleMapsComponent.ctorParameters = () => [ { type: GoogleMapsFactory }, { type: AngularGoogleMapsBuilder }, { type: AngularGoogleMapsGeocoder }, { type: EventPublisher }, { type: IconRegistry } ]; AngularGoogleMapsComponent.propDecorators = { mapOptions: [{ type: Output }], markerOptions: [{ type: Output }], circleOptions: [{ type: Output }], previousMarkerIcon: [{ type: Output }], currentMarkerIcon: [{ type: Output }] }; if (false) { /** @type {?} */ AngularGoogleMapsComponent.prototype.mapsText; /** @type {?} */ AngularGoogleMapsComponent.prototype.address; /** @type {?} */ AngularGoogleMapsComponent.prototype.mapOptions; /** @type {?} */ AngularGoogleMapsComponent.prototype.markerOptions; /** @type {?} */ AngularGoogleMapsComponent.prototype.circleOptions; /** @type {?} */ AngularGoogleMapsComponent.prototype.previousMarkerIcon; /** @type {?} */ AngularGoogleMapsComponent.prototype.currentMarkerIcon; /** * @type {?} * @private */ AngularGoogleMapsComponent.prototype.googleMapsFactory; /** * @type {?} * @private */ AngularGoogleMapsComponent.prototype.googleMapsBuilder; /** * @type {?} * @private */ AngularGoogleMapsComponent.prototype.googleMapsGeocoder; /** * @type {?} * @private */ AngularGoogleMapsComponent.prototype.eventPublisher; /** * @type {?} * @private */ AngularGoogleMapsComponent.prototype.iconRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1nb29nbGUtbWFwcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYm9sZGFkbWluL2FuZ3VsYXItZ29vZ2xlLW1hcHMvIiwic291cmNlcyI6WyJhbmd1bGFyLWdvb2dsZS1tYXBzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUE7QUFDeEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0RBQWdELENBQUE7QUFDMUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUE7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBZXBFLE1BQU0sT0FBTywwQkFBMEI7Ozs7Ozs7O0lBOENuQyxZQUFvQixpQkFBb0MsRUFDcEMsaUJBQTJDLEVBQzNDLGtCQUE2QyxFQUM3QyxjQUE4QixFQUM5QixZQUEwQjtRQUoxQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFDM0MsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFoRDlDLGFBQVEsR0FBRyxRQUFRLENBQUE7UUFDbkIsWUFBTyxHQUFHLEVBQUUsQ0FBQTtRQUVGLGVBQVUsR0FBZTtZQUMvQixNQUFNLEVBQUU7Z0JBQ0osR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxF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QjtRQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1lBQy9CLFFBQVEsRUFBRSxJQUFJO1lBQ2QsYUFBYSxFQUFFLEdBQUc7WUFDbEIsWUFBWSxFQUFFLENBQUM7WUFDZixJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSxTQUFTO1NBQ3pCLENBQUMsQ0FBQTtJQUNOLENBQUM7Ozs7OztJQUVPLGVBQWUsQ0FBQyxXQUF3QjtRQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFDLENBQUE7SUFDcEYsQ0FBQzs7O1lBOUhKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsbWVBQXVDO2dCQUN2QyxTQUFTLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQzthQUN4Qzs7OztZQWZRLGlCQUFpQjtZQUZqQix3QkFBd0I7WUFDeEIseUJBQXlCO1lBSnpCLGNBQWM7WUFNZCxZQUFZOzs7eUJBb0JoQixNQUFNOzRCQWNOLE1BQU07NEJBU04sTUFBTTtpQ0FVTixNQUFNO2dDQUlOLE1BQU07Ozs7SUF4Q1AsOENBQW1COztJQUNuQiw2Q0FBWTs7SUFFWixnREFZQzs7SUFFRCxtREFPQzs7SUFFRCxtREFRQzs7SUFFRCx3REFFQzs7SUFFRCx1REFFQzs7Ozs7SUFFVyx1REFBNEM7Ozs7O0lBQzVDLHVEQUFtRDs7Ozs7SUFDbkQsd0RBQXFEOzs7OztJQUNyRCxvREFBc0M7Ozs7O0lBQ3RDLGtEQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBFdmVudFB1Ymxpc2hlciB9IGZyb20gJ0Bib2xkYWRtaW4vZXZlbnQtcHVibGlzaGVyJ1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IG1hcHNUZXh0IH0gZnJvbSAnLi9hbmd1bGFyLWdvb2dsZS1tYXBzLmNvbnN0YW50J1xuaW1wb3J0IHsgQW5ndWxhckdvb2dsZU1hcHNCdWlsZGVyIH0gZnJvbSAnLi9zZXJ2aWNlL2FuZ3VsYXItZ29vZ2xlLW1hcHMtYnVpbGRlci5zZXJ2aWNlJ1xuaW1wb3J0IHsgQW5ndWxhckdvb2dsZU1hcHNHZW9jb2RlciB9IGZyb20gJy4vc2VydmljZS9hbmd1bGFyLWdvb2dsZS1tYXBzLWdlb2NvZGVyLnNlcnZpY2UnXG5pbXBvcnQgeyBHb29nbGVNYXBzRmFjdG9yeSB9IGZyb20gJy4vc2VydmljZS9nb29nbGUtbWFwcy1mYWN0b3J5LnNlcnZpY2UnXG5pbXBvcnQgeyBJY29uUmVnaXN0cnkgfSBmcm9tICcuL3NlcnZpY2UvaWNvbi1yZWdpc3RyeS9pY29uLXJlZ2lzdHJ5J1xuaW1wb3J0IHsgQ29vcmRpbmF0ZXMgfSBmcm9tICcuL3ZhbHVlLW9iamVjdC9jb29yZGluYXRlcydcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi92YWx1ZS1vYmplY3QvbG9jYXRpb24nXG5pbXBvcnQgeyBUaW1lc3RhbXBDb29yZGluYXRlcyB9IGZyb20gJy4vdmFsdWUtb2JqZWN0L3RpbWVzdGFtcC1jb29yZGluYXRlcydcbmltcG9ydCBDaXJjbGVPcHRpb25zID0gZ29vZ2xlLm1hcHMuQ2lyY2xlT3B0aW9uc1xuaW1wb3J0IEljb24gPSBnb29nbGUubWFwcy5JY29uXG5pbXBvcnQgTGF0TG5nID0gZ29vZ2xlLm1hcHMuTGF0TG5nXG5pbXBvcnQgTWFwT3B0aW9ucyA9IGdvb2dsZS5tYXBzLk1hcE9wdGlvbnNcbmltcG9ydCBNYXJrZXJPcHRpb25zID0gZ29vZ2xlLm1hcHMuTWFya2VyT3B0aW9uc1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2dvb2dsZS1tYXBzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2FuZ3VsYXItZ29vZ2xlLW1hcHMuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbQW5ndWxhckdvb2dsZU1hcHNCdWlsZGVyXVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyR29vZ2xlTWFwc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIG1hcHNUZXh0ID0gbWFwc1RleHRcbiAgICBhZGRyZXNzID0gJydcblxuICAgIEBPdXRwdXQoKSBtYXBPcHRpb25zOiBNYXBPcHRpb25zID0ge1xuICAgICAgICBjZW50ZXI6IHtcbiAgICAgICAgICAgIGxhdDogMCxcbiAgICAgICAgICAgIGxuZzogMFxuICAgICAgICB9LFxuICAgICAgICBtYXBUeXBlQ29udHJvbE9wdGlvbnM6IHtcbiAgICAgICAgICAgIG1hcFR5cGVJZHM6IFsncm9hZG1hcCcsICdzYXRlbGxpdGUnXSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLmdvb2dsZU1hcHNGYWN0b3J5LmdldEdvb2dsZU1hcHMoKS5Db250cm9sUG9zaXRpb24uTEVGVF9CT1RUT01cbiAgICAgICAgfSxcbiAgICAgICAgem9vbTogMTYsXG4gICAgICAgIGNvbnRyb2xTaXplOiAyMixcbiAgICAgICAgZnVsbHNjcmVlbkNvbnRyb2w6IGZhbHNlXG4gICAgfVxuXG4gICAgQE91dHB1dCgpIG1hcmtlck9wdGlvbnM6IE1hcmtlck9wdGlvbnMgPSB7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICBsYXQ6IDAsXG4gICAgICAgICAgICBsbmc6IDBcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgICBhbmltYXRpb246IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuZ2V0R29vZ2xlTWFwcygpLkFuaW1hdGlvbi5EUk9QXG4gICAgfVxuXG4gICAgQE91dHB1dCgpIGNpcmNsZU9wdGlvbnM6IENpcmNsZU9wdGlvbnMgPSB7XG4gICAgICAgIHN0cm9rZUNvbG9yOiAnIzQ0OGFmZicsXG4gICAgICAgIHN0cm9rZU9wYWNpdHk6IDAuOCxcbiAgICAgICAgc3Ryb2tlV2VpZ2h0OiAyLFxuICAgICAgICBmaWxsQ29sb3I6ICcjNDQ4YWZmJyxcbiAgICAgICAgZmlsbE9wYWNpdHk6IDAuMzUsXG4gICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICByYWRpdXM6IDcwXG4gICAgfVxuXG4gICAgQE91dHB1dCgpIHByZXZpb3VzTWFya2VySWNvbjogSWNvbiA9IHtcbiAgICAgICAgdXJsOiAnaHR0cDovL2Nkbi5ib2xkYWRtaW4uY29tLnMzLXdlYnNpdGUtZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20vcHJldmlvdXMtbWFya2VyLnBuZydcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgY3VycmVudE1hcmtlckljb246IEljb24gPSB7XG4gICAgICAgIHVybDogJ2h0dHA6Ly9jZG4uYm9sZGFkbWluLmNvbS5zMy13ZWJzaXRlLWV1LXdlc3QtMS5hbWF6b25hd3MuY29tL2N1cnJlbnQtbWFya2VyLnBuZydcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdvb2dsZU1hcHNGYWN0b3J5OiBHb29nbGVNYXBzRmFjdG9yeSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGdvb2dsZU1hcHNCdWlsZGVyOiBBbmd1bGFyR29vZ2xlTWFwc0J1aWxkZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBnb29nbGVNYXBzR2VvY29kZXI6IEFuZ3VsYXJHb29nbGVNYXBzR2VvY29kZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBldmVudFB1Ymxpc2hlcjogRXZlbnRQdWJsaXNoZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBpY29uUmVnaXN0cnk6IEljb25SZWdpc3RyeSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmV2ZW50UHVibGlzaGVyLnN1YnNjcmliZSgnYWRkcmVzc1JldmVyc2VHZW9jb2RlZCcsIChhZGRyZXNzOiBzdHJpbmcpID0+IHRoaXMuYWRkcmVzcyA9IGFkZHJlc3MpXG4gICAgICAgIHRoaXMuaWNvblJlZ2lzdHJ5LnJlZ2lzdGVyKCdleHBhbmQnLCAnLi9hc3NldHMvZXhwYW5kLnN2ZycpXG4gICAgICAgIHRoaXMuaWNvblJlZ2lzdHJ5LnJlZ2lzdGVyKCdjb2xsYXBzZScsICcuL2Fzc2V0cy9jb2xsYXBzZS5zdmcnKVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmV2ZW50UHVibGlzaGVyLnVuc3Vic2NyaWJlQWxsKCdhZGRyZXNzUmV2ZXJzZUdlb2NvZGVkJylcbiAgICB9XG5cbiAgICBjcmVhdGVNYXBCeUxvY2F0aW9uKGZvY3VzTG9jYXRpb246IExvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwc0dlb2NvZGVyLnJldmVyc2VHZW9jb2RlKGZvY3VzTG9jYXRpb24uY29vcmRpbmF0ZXMsIChhZGRyZXNzOiBzdHJpbmcpID0+IHRoaXMuYWRkcmVzcyA9IGFkZHJlc3MpXG4gICAgICAgIHRoaXMuY2lyY2xlT3B0aW9ucy5yYWRpdXMgPSBmb2N1c0xvY2F0aW9uLnJhZGl1c0luTWV0ZXJzXG4gICAgICAgIHRoaXMuY2hhbmdlTWFwQ2VudGVyKGZvY3VzTG9jYXRpb24uY29vcmRpbmF0ZXMpXG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwc0J1aWxkZXJcbiAgICAgICAgICAgIC5jcmVhdGVNYXAodGhpcy5tYXBPcHRpb25zKVxuICAgICAgICAgICAgLmFkZENlbnRlck1hcmtlcih0aGlzLm1hcmtlck9wdGlvbnMpXG4gICAgICAgICAgICAuYWRkQ2lyY2xlKHRoaXMuY2lyY2xlT3B0aW9ucylcbiAgICAgICAgICAgIC5iaW5kQ2lyY2xlVG9NYXJrZXIoKVxuICAgICAgICAgICAgLmFkZFNlYXJjaEJveCgpXG4gICAgfVxuXG4gICAgY3JlYXRlTWFwQnlBZGRyZXNzKGFkZHJlc3M6IHN0cmluZykge1xuICAgICAgICB0aGlzLmdvb2dsZU1hcHNHZW9jb2Rlci5nZW9jb2RlKGFkZHJlc3MsIChjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZU1hcENlbnRlcihjb29yZGluYXRlcylcbiAgICAgICAgICAgICAgICB0aGlzLmdvb2dsZU1hcHNCdWlsZGVyXG4gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVNYXAodGhpcy5tYXBPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2VudGVyTWFya2VyKHRoaXMubWFya2VyT3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENpcmNsZSh0aGlzLmNpcmNsZU9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIC5iaW5kQ2lyY2xlVG9NYXJrZXIoKVxuICAgICAgICAgICAgICAgICAgICAuaGlkZU1hcmtlcigpXG4gICAgICAgICAgICAgICAgICAgIC5oaWRlQ2lyY2xlKClcbiAgICAgICAgICAgICAgICAgICAgLmFkZFNlYXJjaEJveCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBub3RpZnlNYXBSZXNpemUoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRQdWJsaXNoZXIubm90aWZ5KCdyZXNpemVNYXAnKVxuICAgIH1cblxuICAgIGFkZFRyYXZlbFBhdGgodGltZXN0YW1wQ29vcmRpbmF0ZXNMaXN0OiBBcnJheTxUaW1lc3RhbXBDb29yZGluYXRlcz4sIG5hbWU6IHN0cmluZykge1xuICAgICAgICB0aW1lc3RhbXBDb29yZGluYXRlc0xpc3QuZm9yRWFjaCgodGltZXN0YW1wQ29vcmRpbmF0ZXM6IFRpbWVzdGFtcENvb3JkaW5hdGVzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpY29uID0gaW5kZXggPT09IDAgPyB0aGlzLmN1cnJlbnRNYXJrZXJJY29uIDogdGhpcy5wcmV2aW91c01hcmtlckljb25cbiAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lID0gbW9tZW50LnV0Yyh0aW1lc3RhbXBDb29yZGluYXRlcy50aW1lc3RhbXApLmZvcm1hdCgnWVlZWS5NTS5ERCBISDptbScpXG4gICAgICAgICAgICB0aGlzLmdvb2dsZU1hcHNCdWlsZGVyLmFkZE1hcmtlcih7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTGF0TG5nKHRpbWVzdGFtcENvb3JkaW5hdGVzLmNvb3JkaW5hdGVzKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYE5hbWU6ICR7bmFtZX0sIFRpbWU6ICR7ZGF0ZVRpbWV9YCxcbiAgICAgICAgICAgICAgICBpY29uOiBpY29uXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGxhdExuZ3MgPSB0aW1lc3RhbXBDb29yZGluYXRlc0xpc3QubWFwKHZhbHVlID0+IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTGF0TG5nKHZhbHVlLmNvb3JkaW5hdGVzKSlcbiAgICAgICAgdGhpcy5hZGRQb2x5bGluZShsYXRMbmdzLCAnIycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMiwgNikpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRQb2x5bGluZShwYXRoOiBBcnJheTxMYXRMbmc+LCBjb2xvckNvZGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmdvb2dsZU1hcHNCdWlsZGVyLmFkZFBvbHlsaW5lKHtcbiAgICAgICAgICAgIGdlb2Rlc2ljOiB0cnVlLFxuICAgICAgICAgICAgc3Ryb2tlT3BhY2l0eTogMC44LFxuICAgICAgICAgICAgc3Ryb2tlV2VpZ2h0OiAxLFxuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBjb2xvckNvZGVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZU1hcENlbnRlcihjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpIHtcbiAgICAgICAgdGhpcy5tYXBPcHRpb25zLmNlbnRlciA9IHtsYXQ6IGNvb3JkaW5hdGVzLmxhdGl0dWRlLCBsbmc6IGNvb3JkaW5hdGVzLmxvbmdpdHVkZX1cbiAgICB9XG59XG4iXX0=