UNPKG

@ng-maps/google

Version:

**@ng-maps/google** is a simple, modular and tree-shakable library for displaying google-maps inside an angular application

180 lines 22.8 kB
import { Injectable, NgZone } from '@angular/core'; import { Observable } from 'rxjs'; import { MapsAPILoader, MapsApiWrapper, } from '@ng-maps/core'; import * as i0 from "@angular/core"; import * as i1 from "@ng-maps/core"; /** * Wrapper class that handles the communication with the Google Maps Javascript * API v3 */ export class GoogleMapsAPIWrapper extends MapsApiWrapper { constructor(_loader, _zone) { super(_loader, _zone); } createMap(el, center, options) { return this._zone.runOutsideAngular(async () => { await this._loader.load(); if (this._mapResolver) { this._mapResolver(new google.maps.Map(el, { center, ...options })); } return; }); } async setMapOptions(options) { const map = await this._api; map?.setOptions(options); } /** * Creates a google map drawing manager with the map context */ async createDrawingManager(options = {}, addToMap = true) { const map = await this._api; if (addToMap) { options.map = map; } return new google.maps.drawing.DrawingManager(options); } /** * Creates a google map marker with the map context */ async createMarker(position, options, addToMap = true) { const map = addToMap ? await this._api : null; return new google.maps.Marker({ position, map, ...options }); } async createInfoWindow(position, options) { await this._api; if (position === null) { return new google.maps.InfoWindow({ ...options }); } else { return new google.maps.InfoWindow({ position: position, ...options }); } } /** * Creates a google.map.Circle for the current map. * * @todo check how to improve type casting */ async createCircle(center, options) { const opt = { ...options, center, map: await this._api, }; if (typeof opt.strokePosition === 'string') { opt.strokePosition = google.maps.StrokePosition[opt.strokePosition]; } return new google.maps.Circle(opt); } /** * Creates a google.map.Rectangle for the current map. */ async createRectangle(bounds, options) { const map = await this._api; return new google.maps.Rectangle({ ...options, bounds, map, }); } async createPolyline(options) { return this.getNativeMap().then((map) => { const line = new google.maps.Polyline(options); if (map) { line.setMap(map); } return line; }); } createPolygon(options) { return this.getNativeMap().then((map) => { const polygon = new google.maps.Polygon(options); if (map) { polygon.setMap(map); } return polygon; }); } /** * Creates a new google.map.Data layer for the current map */ async createDataLayer(options) { return this._api?.then((m) => { const data = new google.maps.Data(options); data.setMap(m); return data; }); } /** * Determines if given coordinates are insite a Polygon path. */ containsLocation(latLng, polygon) { return google.maps.geometry.poly.containsLocation(latLng, polygon); } /** * @fixme typings */ subscribeToMapEvent(eventName) { return new Observable((observer) => { this._api?.then((m) => m.addListener(eventName, (...evArgs) => this._zone.run(() => observer.next(evArgs)))); }); } clearInstanceListeners() { this._api?.then((map) => { google.maps.event.clearInstanceListeners(map); }); } async setCenter(latLng) { return this._api?.then((map) => map.setCenter(latLng)); } async getZoom() { const map = await this._api; return map?.getZoom(); } async getBounds() { const map = await this._api; return map?.getBounds()?.toJSON(); } async getMapTypeId() { return this._api?.then((map) => map.getMapTypeId()); } async setZoom(zoom) { this._api?.then((map) => map.setZoom(zoom)); } async getCenter() { const map = await this._api; return map?.getCenter()?.toJSON(); } async panTo(latLng) { this._api?.then((map) => map.panTo(latLng)); } async panBy(x, y) { this._api?.then((map) => map.panBy(x, y)); } async fitBounds(latLng, padding) { const map = await this._api; map?.fitBounds(latLng, padding); } async panToBounds(latLng, padding) { const map = await this._api; return map?.panToBounds(latLng, padding); } /** * Triggers the given event name on the map instance. */ async triggerMapEvent(eventName) { const map = await this._api; if (map) { google.maps.event.trigger(map, eventName); } } _isLatLngBoundsLiteral(bounds) { return bounds != null && bounds.extend === undefined; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsAPIWrapper, deps: [{ token: i1.MapsAPILoader }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsAPIWrapper }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsAPIWrapper, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.MapsAPILoader }, { type: i0.NgZone }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtYXBpLXdyYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2dvb2dsZS9zcmMvbGliL2dvb2dsZS1tYXBzLWFwaS13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEMsT0FBTyxFQUtMLGFBQWEsRUFDYixjQUFjLEdBR2YsTUFBTSxlQUFlLENBQUM7OztBQUV2Qjs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FJekM7SUFDQyxZQUFZLE9BQXNCLEVBQUUsS0FBYTtRQUMvQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFLTSxTQUFTLENBQ2QsRUFBZSxFQUNmLE1BQWdCLEVBQ2hCLE9BQW1CO1FBRW5CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM3QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQStCO1FBQ3hELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QixHQUFHLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FDL0IsVUFBcUQsRUFBRSxFQUN2RCxXQUFvQixJQUFJO1FBRXhCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDcEIsQ0FBQztRQUNELE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FDdkIsUUFBa0IsRUFDbEIsT0FBc0IsRUFDdEIsV0FBb0IsSUFBSTtRQUV4QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQzNCLFFBQXlCLEVBQ3pCLE9BQXVDO1FBRXZDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNoQixJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUN2QixNQUFnQixFQUNoQixPQUFzQjtRQUV0QixNQUFNLEdBQUcsR0FBOEI7WUFDckMsR0FBRyxPQUFPO1lBQ1YsTUFBTTtZQUNOLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJO1NBQ3JCLENBQUM7UUFDRixJQUFJLE9BQU8sR0FBRyxDQUFDLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzQyxHQUFHLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUM3QyxHQUFHLENBQUMsY0FBYyxDQUNrQixDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGVBQWUsQ0FDMUIsTUFBcUIsRUFDckIsT0FBeUI7UUFFekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUMvQixHQUFHLE9BQU87WUFDVixNQUFNO1lBQ04sR0FBRztTQUNKLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYyxDQUN6QixPQUFvQztRQUVwQyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxhQUFhLENBQ2xCLE9BQW1DO1FBRW5DLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakQsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxlQUFlLENBQzFCLE9BQXNDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZ0JBQWdCLENBQ3JCLE1BQTBCLEVBQzFCLE9BQTRCO1FBRTVCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUIsQ0FBQyxTQUFpQjtRQUMxQyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNwQixDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsTUFBa0IsRUFBRSxFQUFFLENBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDNUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBb0IsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBaUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQW9CLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU87UUFDbEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVCLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUNwQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsT0FBTyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZO1FBR3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDL0IsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVM7UUFDcEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVCLE9BQU8sR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUNoQixNQUFzRDtRQUV0RCxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUNwQixNQUFxQixFQUNyQixPQUFzQztRQUV0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsR0FBRyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQ3RCLE1BQXFCLEVBQ3JCLE9BQXNDO1FBRXRDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QixPQUFPLEdBQUcsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBaUI7UUFDNUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRVMsc0JBQXNCLENBQzlCLE1BQWtFO1FBRWxFLE9BQU8sTUFBTSxJQUFJLElBQUksSUFBSyxNQUFjLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztJQUNoRSxDQUFDOzhHQWpQVSxvQkFBb0I7a0hBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBCb3VuZHNMaXRlcmFsLFxuICBDaXJjbGVPcHRpb25zLFxuICBHZW9Qb2ludCxcbiAgTWFwT3B0aW9ucyxcbiAgTWFwc0FQSUxvYWRlcixcbiAgTWFwc0FwaVdyYXBwZXIsXG4gIE1hcmtlck9wdGlvbnMsXG4gIFJlY3RhbmdsZU9wdGlvbnMsXG59IGZyb20gJ0BuZy1tYXBzL2NvcmUnO1xuXG4vKipcbiAqIFdyYXBwZXIgY2xhc3MgdGhhdCBoYW5kbGVzIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEdvb2dsZSBNYXBzIEphdmFzY3JpcHRcbiAqIEFQSSB2M1xuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR29vZ2xlTWFwc0FQSVdyYXBwZXIgZXh0ZW5kcyBNYXBzQXBpV3JhcHBlcjxcbiAgZ29vZ2xlLm1hcHMuTWFwLFxuICBnb29nbGUubWFwcy5DaXJjbGUsXG4gIGdvb2dsZS5tYXBzLlJlY3RhbmdsZVxuPiB7XG4gIGNvbnN0cnVjdG9yKF9sb2FkZXI6IE1hcHNBUElMb2FkZXIsIF96b25lOiBOZ1pvbmUpIHtcbiAgICBzdXBlcihfbG9hZGVyLCBfem9uZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2FwaT86IFByb21pc2U8Z29vZ2xlLm1hcHMuTWFwPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9tYXBSZXNvbHZlcj86ICh2YWx1ZTogZ29vZ2xlLm1hcHMuTWFwKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjcmVhdGVNYXAoXG4gICAgZWw6IEhUTUxFbGVtZW50LFxuICAgIGNlbnRlcjogR2VvUG9pbnQsXG4gICAgb3B0aW9uczogTWFwT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZGVyLmxvYWQoKTtcbiAgICAgIGlmICh0aGlzLl9tYXBSZXNvbHZlcikge1xuICAgICAgICB0aGlzLl9tYXBSZXNvbHZlcihuZXcgZ29vZ2xlLm1hcHMuTWFwKGVsLCB7IGNlbnRlciwgLi4ub3B0aW9ucyB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0TWFwT3B0aW9ucyhvcHRpb25zOiBnb29nbGUubWFwcy5NYXBPcHRpb25zKSB7XG4gICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5fYXBpO1xuICAgIG1hcD8uc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ29vZ2xlIG1hcCBkcmF3aW5nIG1hbmFnZXIgd2l0aCB0aGUgbWFwIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVEcmF3aW5nTWFuYWdlcihcbiAgICBvcHRpb25zOiBnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyT3B0aW9ucyA9IHt9LFxuICAgIGFkZFRvTWFwOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyPiB7XG4gICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5fYXBpO1xuICAgIGlmIChhZGRUb01hcCkge1xuICAgICAgb3B0aW9ucy5tYXAgPSBtYXA7XG4gICAgfVxuICAgIHJldHVybiBuZXcgZ29vZ2xlLm1hcHMuZHJhd2luZy5EcmF3aW5nTWFuYWdlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ29vZ2xlIG1hcCBtYXJrZXIgd2l0aCB0aGUgbWFwIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVNYXJrZXIoXG4gICAgcG9zaXRpb246IEdlb1BvaW50LFxuICAgIG9wdGlvbnM6IE1hcmtlck9wdGlvbnMsXG4gICAgYWRkVG9NYXA6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPGdvb2dsZS5tYXBzLk1hcmtlcj4ge1xuICAgIGNvbnN0IG1hcCA9IGFkZFRvTWFwID8gYXdhaXQgdGhpcy5fYXBpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7IHBvc2l0aW9uLCBtYXAsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlSW5mb1dpbmRvdyhcbiAgICBwb3NpdGlvbjogR2VvUG9pbnQgfCBudWxsLFxuICAgIG9wdGlvbnM/OiBnb29nbGUubWFwcy5JbmZvV2luZG93T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5JbmZvV2luZG93PiB7XG4gICAgYXdhaXQgdGhpcy5fYXBpO1xuICAgIGlmIChwb3NpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHsgLi4ub3B0aW9ucyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHsgcG9zaXRpb246IHBvc2l0aW9uLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ29vZ2xlLm1hcC5DaXJjbGUgZm9yIHRoZSBjdXJyZW50IG1hcC5cbiAgICpcbiAgICogQHRvZG8gY2hlY2sgaG93IHRvIGltcHJvdmUgdHlwZSBjYXN0aW5nXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2lyY2xlKFxuICAgIGNlbnRlcjogR2VvUG9pbnQsXG4gICAgb3B0aW9uczogQ2lyY2xlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5DaXJjbGU+IHtcbiAgICBjb25zdCBvcHQ6IGdvb2dsZS5tYXBzLkNpcmNsZU9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2VudGVyLFxuICAgICAgbWFwOiBhd2FpdCB0aGlzLl9hcGksXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdC5zdHJva2VQb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdC5zdHJva2VQb3NpdGlvbiA9IGdvb2dsZS5tYXBzLlN0cm9rZVBvc2l0aW9uW1xuICAgICAgICBvcHQuc3Ryb2tlUG9zaXRpb25cbiAgICAgIF0gYXMgYW55IGFzIGdvb2dsZS5tYXBzLlN0cm9rZVBvc2l0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IGdvb2dsZS5tYXBzLkNpcmNsZShvcHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnb29nbGUubWFwLlJlY3RhbmdsZSBmb3IgdGhlIGN1cnJlbnQgbWFwLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVJlY3RhbmdsZShcbiAgICBib3VuZHM6IEJvdW5kc0xpdGVyYWwsXG4gICAgb3B0aW9uczogUmVjdGFuZ2xlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5SZWN0YW5nbGU+IHtcbiAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLl9hcGk7XG4gICAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5SZWN0YW5nbGUoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGJvdW5kcyxcbiAgICAgIG1hcCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVQb2x5bGluZShcbiAgICBvcHRpb25zOiBnb29nbGUubWFwcy5Qb2x5bGluZU9wdGlvbnMsXG4gICk6IFByb21pc2U8Z29vZ2xlLm1hcHMuUG9seWxpbmU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVNYXAoKS50aGVuKChtYXApID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBuZXcgZ29vZ2xlLm1hcHMuUG9seWxpbmUob3B0aW9ucyk7XG4gICAgICBpZiAobWFwKSB7XG4gICAgICAgIGxpbmUuc2V0TWFwKG1hcCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVQb2x5Z29uKFxuICAgIG9wdGlvbnM6IGdvb2dsZS5tYXBzLlBvbHlnb25PcHRpb25zLFxuICApOiBQcm9taXNlPGdvb2dsZS5tYXBzLlBvbHlnb24+IHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVNYXAoKS50aGVuKChtYXApID0+IHtcbiAgICAgIGNvbnN0IHBvbHlnb24gPSBuZXcgZ29vZ2xlLm1hcHMuUG9seWdvbihvcHRpb25zKTtcbiAgICAgIGlmIChtYXApIHtcbiAgICAgICAgcG9seWdvbi5zZXRNYXAobWFwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb2x5Z29uO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZ29vZ2xlLm1hcC5EYXRhIGxheWVyIGZvciB0aGUgY3VycmVudCBtYXBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVEYXRhTGF5ZXIoXG4gICAgb3B0aW9ucz86IGdvb2dsZS5tYXBzLkRhdGEuRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Z29vZ2xlLm1hcHMuRGF0YSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGk/LnRoZW4oKG0pID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLm1hcHMuRGF0YShvcHRpb25zKTtcbiAgICAgIGRhdGEuc2V0TWFwKG0pO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBnaXZlbiBjb29yZGluYXRlcyBhcmUgaW5zaXRlIGEgUG9seWdvbiBwYXRoLlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zTG9jYXRpb24oXG4gICAgbGF0TG5nOiBnb29nbGUubWFwcy5MYXRMbmcsXG4gICAgcG9seWdvbjogZ29vZ2xlLm1hcHMuUG9seWdvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdvb2dsZS5tYXBzLmdlb21ldHJ5LnBvbHkuY29udGFpbnNMb2NhdGlvbihsYXRMbmcsIHBvbHlnb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBmaXhtZSB0eXBpbmdzXG4gICAqL1xuICBwdWJsaWMgc3Vic2NyaWJlVG9NYXBFdmVudChldmVudE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgdGhpcy5fYXBpPy50aGVuKChtKSA9PlxuICAgICAgICBtLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgKC4uLmV2QXJnczogQXJyYXk8YW55PikgPT5cbiAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiBvYnNlcnZlci5uZXh0KGV2QXJncykpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckluc3RhbmNlTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuX2FwaT8udGhlbigobWFwOiBnb29nbGUubWFwcy5NYXApID0+IHtcbiAgICAgIGdvb2dsZS5tYXBzLmV2ZW50LmNsZWFySW5zdGFuY2VMaXN0ZW5lcnMobWFwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRDZW50ZXIobGF0TG5nOiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaT8udGhlbigobWFwOiBnb29nbGUubWFwcy5NYXApID0+IG1hcC5zZXRDZW50ZXIobGF0TG5nKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Wm9vbSgpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMuX2FwaTtcbiAgICByZXR1cm4gbWFwPy5nZXRab29tKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Qm91bmRzKCk6IFByb21pc2U8Qm91bmRzTGl0ZXJhbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMuX2FwaTtcbiAgICByZXR1cm4gbWFwPy5nZXRCb3VuZHMoKT8udG9KU09OKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWFwVHlwZUlkKCk6IFByb21pc2U8XG4gICAgZ29vZ2xlLm1hcHMuTWFwVHlwZUlkIHwgc3RyaW5nIHwgdW5kZWZpbmVkXG4gID4ge1xuICAgIHJldHVybiB0aGlzLl9hcGk/LnRoZW4oKG1hcCkgPT4gbWFwLmdldE1hcFR5cGVJZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2FwaT8udGhlbigobWFwKSA9PiBtYXAuc2V0Wm9vbSh6b29tKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2VudGVyKCk6IFByb21pc2U8R2VvUG9pbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLl9hcGk7XG4gICAgcmV0dXJuIG1hcD8uZ2V0Q2VudGVyKCk/LnRvSlNPTigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHBhblRvKFxuICAgIGxhdExuZzogZ29vZ2xlLm1hcHMuTGF0TG5nIHwgZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fYXBpPy50aGVuKChtYXApID0+IG1hcC5wYW5UbyhsYXRMbmcpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwYW5CeSh4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2FwaT8udGhlbigobWFwKSA9PiBtYXAucGFuQnkoeCwgeSkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpdEJvdW5kcyhcbiAgICBsYXRMbmc6IEJvdW5kc0xpdGVyYWwsXG4gICAgcGFkZGluZz86IG51bWJlciB8IGdvb2dsZS5tYXBzLlBhZGRpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMuX2FwaTtcbiAgICBtYXA/LmZpdEJvdW5kcyhsYXRMbmcsIHBhZGRpbmcpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHBhblRvQm91bmRzKFxuICAgIGxhdExuZzogQm91bmRzTGl0ZXJhbCxcbiAgICBwYWRkaW5nPzogbnVtYmVyIHwgZ29vZ2xlLm1hcHMuUGFkZGluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5fYXBpO1xuICAgIHJldHVybiBtYXA/LnBhblRvQm91bmRzKGxhdExuZywgcGFkZGluZyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIGdpdmVuIGV2ZW50IG5hbWUgb24gdGhlIG1hcCBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmlnZ2VyTWFwRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLl9hcGk7XG4gICAgaWYgKG1hcCkge1xuICAgICAgZ29vZ2xlLm1hcHMuZXZlbnQudHJpZ2dlcihtYXAsIGV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9pc0xhdExuZ0JvdW5kc0xpdGVyYWwoXG4gICAgYm91bmRzOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsLFxuICApOiBib3VuZHMgaXMgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzTGl0ZXJhbCB7XG4gICAgcmV0dXJuIGJvdW5kcyAhPSBudWxsICYmIChib3VuZHMgYXMgYW55KS5leHRlbmQgPT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19