@boldadmin/angular-google-maps
Version:
Google Maps adapter for Angular Framework
352 lines • 23.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { EventPublisher } from '@boldadmin/event-publisher';
import { Coordinates } from '../value-object/coordinates';
import { Location } from '../value-object/location';
import { AngularGoogleMapsGeocoder } from './angular-google-maps-geocoder.service';
import { GoogleMapsFactory } from './google-maps-factory.service';
var AngularGoogleMapsBuilder = /** @class */ (function () {
function AngularGoogleMapsBuilder(googleMapsFactory, geocoder, eventPublisher) {
this.googleMapsFactory = googleMapsFactory;
this.geocoder = geocoder;
this.eventPublisher = eventPublisher;
}
/**
* @template THIS
* @this {THIS}
* @param {?} mapOptions
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.createMap = /**
* @template THIS
* @this {THIS}
* @param {?} mapOptions
* @return {THIS}
*/
function (mapOptions) {
(/** @type {?} */ (this)).map = (/** @type {?} */ (this)).googleMapsFactory.createMap(mapOptions);
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @param {?} markerOptions
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.addCenterMarker = /**
* @template THIS
* @this {THIS}
* @param {?} markerOptions
* @return {THIS}
*/
function (markerOptions) {
(/** @type {?} */ (this)).marker = (/** @type {?} */ (this)).googleMapsFactory.createMarker(markerOptions);
(/** @type {?} */ (this)).marker.setPosition((/** @type {?} */ (this)).map.getCenter());
(/** @type {?} */ (this)).marker.setMap((/** @type {?} */ (this)).map);
(/** @type {?} */ (this)).addMarkerListeners();
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @param {?} circleOptions
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.addCircle = /**
* @template THIS
* @this {THIS}
* @param {?} circleOptions
* @return {THIS}
*/
function (circleOptions) {
var _this = this;
(/** @type {?} */ (this)).circle = (/** @type {?} */ (this)).googleMapsFactory.createCircle(circleOptions);
(/** @type {?} */ (this)).circle.setMap((/** @type {?} */ (this)).map);
(/** @type {?} */ (this)).circle.addListener('radius_changed', (/**
* @return {?}
*/
function () { return (/** @type {?} */ (_this)).notifyLocationChange(); }));
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @param {?} polylineOptions
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.addPolyline = /**
* @template THIS
* @this {THIS}
* @param {?} polylineOptions
* @return {THIS}
*/
function (polylineOptions) {
/** @type {?} */
var polyline = (/** @type {?} */ (this)).googleMapsFactory.createPolyline(polylineOptions);
polyline.setMap((/** @type {?} */ (this)).map);
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @param {?} markerOptions
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.addMarker = /**
* @template THIS
* @this {THIS}
* @param {?} markerOptions
* @return {THIS}
*/
function (markerOptions) {
/** @type {?} */
var marker = (/** @type {?} */ (this)).googleMapsFactory.createMarker(markerOptions);
marker.setMap((/** @type {?} */ (this)).map);
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.bindCircleToMarker = /**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
(/** @type {?} */ (this)).circle.bindTo('center', (/** @type {?} */ (this)).marker, 'position');
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.hideMarker = /**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
(/** @type {?} */ (this)).marker.setMap(null);
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.hideCircle = /**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
(/** @type {?} */ (this)).circle.setMap(null);
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
AngularGoogleMapsBuilder.prototype.addSearchBox = /**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
var _this = this;
/** @type {?} */
var box = (/** @type {?} */ (this)).googleMapsFactory.createSearchBox();
box.addListener('places_changed', (/**
* @return {?}
*/
function () {
/** @type {?} */
var places = box.getPlaces();
if (places[0]) {
(/** @type {?} */ (_this)).changeMapLocationAndZoom(places[0].geometry.location);
(/** @type {?} */ (_this)).changeMarkerLocation(places[0].geometry.location);
/** @type {?} */
var loc = places[0].geometry.location;
/** @type {?} */
var coordinates = new Coordinates(loc.lat(), loc.lng());
(/** @type {?} */ (_this)).eventPublisher.notify('locationChanged', new Location(coordinates, (/** @type {?} */ (_this)).circle.getRadius()));
}
}));
return (/** @type {?} */ (this));
};
/**
* @private
* @return {?}
*/
AngularGoogleMapsBuilder.prototype.addMarkerListeners = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.marker.addListener('dragend', (/**
* @return {?}
*/
function () { return _this.notifyLocationChange(); }));
this.marker.addListener('dragend', (/**
* @param {?} mouseEvent
* @return {?}
*/
function (mouseEvent) { return _this.reverseGeocode(mouseEvent); }));
this.map.addListener('click', (/**
* @param {?} mouseEvent
* @return {?}
*/
function (mouseEvent) { return _this.changeMarkerLocation(mouseEvent.latLng); }));
this.map.addListener('click', (/**
* @return {?}
*/
function () { return _this.notifyLocationChange(); }));
this.map.addListener('click', (/**
* @param {?} mouseEvent
* @return {?}
*/
function (mouseEvent) { return _this.reverseGeocode(mouseEvent); }));
};
/**
* @private
* @return {?}
*/
AngularGoogleMapsBuilder.prototype.notifyLocationChange = /**
* @private
* @return {?}
*/
function () {
this.eventPublisher.notify('locationChanged', new Location(this.getCoordinates(), this.getRadius()));
};
/**
* @private
* @return {?}
*/
AngularGoogleMapsBuilder.prototype.getRadius = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var radiusInMeters = 0;
if (this.circle !== undefined)
radiusInMeters = this.circle.getRadius();
return radiusInMeters;
};
/**
* @private
* @return {?}
*/
AngularGoogleMapsBuilder.prototype.getCoordinates = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var coordinates = new Coordinates(0, 0);
if (this.marker !== undefined)
coordinates = new Coordinates(this.marker.getPosition().lat(), this.marker.getPosition().lng());
return coordinates;
};
/**
* @private
* @param {?} location
* @return {?}
*/
AngularGoogleMapsBuilder.prototype.changeMapLocationAndZoom = /**
* @private
* @param {?} location
* @return {?}
*/
function (location) {
this.map.panTo(location);
this.map.setZoom(16);
};
/**
* @private
* @param {?} location
* @return {?}
*/
AngularGoogleMapsBuilder.prototype.changeMarkerLocation = /**
* @private
* @param {?} location
* @return {?}
*/
function (location) {
this.circle.setMap(this.map);
this.marker.setMap(this.map);
this.marker.setPosition(location);
};
/**
* @private
* @param {?} e
* @return {?}
*/
AngularGoogleMapsBuilder.prototype.reverseGeocode = /**
* @private
* @param {?} e
* @return {?}
*/
function (e) {
var _this = this;
this.geocoder.reverseGeocode(new Coordinates(e.latLng.lat(), e.latLng.lng()), (/**
* @param {?} address
* @return {?}
*/
function (address) {
return _this.eventPublisher.notify('addressReverseGeocoded', address);
}));
};
AngularGoogleMapsBuilder.decorators = [
{ type: Injectable }
];
/** @nocollapse */
AngularGoogleMapsBuilder.ctorParameters = function () { return [
{ type: GoogleMapsFactory },
{ type: AngularGoogleMapsGeocoder },
{ type: EventPublisher }
]; };
return AngularGoogleMapsBuilder;
}());
export { AngularGoogleMapsBuilder };
if (false) {
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.map;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.marker;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.circle;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.googleMapsFactory;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.geocoder;
/**
* @type {?}
* @private
*/
AngularGoogleMapsBuilder.prototype.eventPublisher;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1nb29nbGUtbWFwcy1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYm9sZGFkbWluL2FuZ3VsYXItZ29vZ2xlLW1hcHMvIiwic291cmNlcyI6WyJzZXJ2aWNlL2FuZ3VsYXItZ29vZ2xlLW1hcHMtYnVpbGRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ25ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFBO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBWWpFO0lBT0ksa0NBQW9CLGlCQUFvQyxFQUNwQyxRQUFtQyxFQUNuQyxjQUE4QjtRQUY5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBQ25DLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUMvQyxDQUFDOzs7Ozs7O0lBRUosNENBQVM7Ozs7OztJQUFULFVBQVUsVUFBc0I7UUFDNUIsbUJBQUEsSUFBSSxFQUFBLENBQUMsR0FBRyxHQUFHLG1CQUFBLElBQUksRUFBQSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUV2RCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFBO0lBQ2YsQ0FBQzs7Ozs7OztJQUVELGtEQUFlOzs7Ozs7SUFBZixVQUFnQixhQUE0QjtRQUN4QyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxNQUFNLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFD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QUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDeEIsQ0FBQzs7Ozs7O0lBRU8sdURBQW9COzs7OztJQUE1QixVQUE2QixRQUFnQjtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7Ozs7OztJQUNPLGlEQUFjOzs7OztJQUF0QixVQUF1QixDQUFhO1FBQXBDLGlCQUlDO1FBSEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDOzs7O1FBQUUsVUFBQyxPQUFlO1lBQzFGLE9BQUEsS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDO1FBQTdELENBQTZELEVBQ2hFLENBQUE7SUFDTCxDQUFDOztnQkF0SEosVUFBVTs7OztnQkFaRixpQkFBaUI7Z0JBRGpCLHlCQUF5QjtnQkFIekIsY0FBYzs7SUF1SXZCLCtCQUFDO0NBQUEsQUF2SEQsSUF1SEM7U0F0SFksd0JBQXdCOzs7Ozs7SUFFakMsdUNBQWdCOzs7OztJQUNoQiwwQ0FBc0I7Ozs7O0lBQ3RCLDBDQUFzQjs7Ozs7SUFFVixxREFBNEM7Ozs7O0lBQzVDLDRDQUEyQzs7Ozs7SUFDM0Msa0RBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBFdmVudFB1Ymxpc2hlciB9IGZyb20gJ0Bib2xkYWRtaW4vZXZlbnQtcHVibGlzaGVyJ1xuaW1wb3J0IHsgQ29vcmRpbmF0ZXMgfSBmcm9tICcuLi92YWx1ZS1vYmplY3QvY29vcmRpbmF0ZXMnXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4uL3ZhbHVlLW9iamVjdC9sb2NhdGlvbidcbmltcG9ydCB7IEFuZ3VsYXJHb29nbGVNYXBzR2VvY29kZXIgfSBmcm9tICcuL2FuZ3VsYXItZ29vZ2xlLW1hcHMtZ2VvY29kZXIuc2VydmljZSdcbmltcG9ydCB7IEdvb2dsZU1hcHNGYWN0b3J5IH0gZnJvbSAnLi9nb29nbGUtbWFwcy1mYWN0b3J5LnNlcnZpY2UnXG5pbXBvcnQgQ2lyY2xlID0gZ29vZ2xlLm1hcHMuQ2lyY2xlXG5pbXBvcnQgQ2lyY2xlT3B0aW9ucyA9IGdvb2dsZS5tYXBzLkNpcmNsZU9wdGlvbnNcbmltcG9ydCBMYXRMbmcgPSBnb29nbGUubWFwcy5MYXRMbmdcbmltcG9ydCBNYXAgPSBnb29nbGUubWFwcy5NYXBcbmltcG9ydCBNYXBPcHRpb25zID0gZ29vZ2xlLm1hcHMuTWFwT3B0aW9uc1xuaW1wb3J0IE1hcmtlciA9IGdvb2dsZS5tYXBzLk1hcmtlclxuaW1wb3J0IE1hcmtlck9wdGlvbnMgPSBnb29nbGUubWFwcy5NYXJrZXJPcHRpb25zXG5pbXBvcnQgTW91c2VFdmVudCA9IGdvb2dsZS5tYXBzLk1vdXNlRXZlbnRcbmltcG9ydCBQb2x5bGluZU9wdGlvbnMgPSBnb29nbGUubWFwcy5Qb2x5bGluZU9wdGlvbnNcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5ndWxhckdvb2dsZU1hcHNCdWlsZGVyIHtcblxuICAgIHByaXZhdGUgbWFwOiBNYXBcbiAgICBwcml2YXRlIG1hcmtlcjogTWFya2VyXG4gICAgcHJpdmF0ZSBjaXJjbGU6IENpcmNsZVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBnb29nbGVNYXBzRmFjdG9yeTogR29vZ2xlTWFwc0ZhY3RvcnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBnZW9jb2RlcjogQW5ndWxhckdvb2dsZU1hcHNHZW9jb2RlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGV2ZW50UHVibGlzaGVyOiBFdmVudFB1Ymxpc2hlclxuICAgICkge31cblxuICAgIGNyZWF0ZU1hcChtYXBPcHRpb25zOiBNYXBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubWFwID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVNYXAobWFwT3B0aW9ucylcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZENlbnRlck1hcmtlcihtYXJrZXJPcHRpb25zOiBNYXJrZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubWFya2VyID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVNYXJrZXIobWFya2VyT3B0aW9ucylcbiAgICAgICAgdGhpcy5tYXJrZXIuc2V0UG9zaXRpb24odGhpcy5tYXAuZ2V0Q2VudGVyKCkpXG4gICAgICAgIHRoaXMubWFya2VyLnNldE1hcCh0aGlzLm1hcClcbiAgICAgICAgdGhpcy5hZGRNYXJrZXJMaXN0ZW5lcnMoKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZENpcmNsZShjaXJjbGVPcHRpb25zOiBDaXJjbGVPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY2lyY2xlID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVDaXJjbGUoY2lyY2xlT3B0aW9ucylcbiAgICAgICAgdGhpcy5jaXJjbGUuc2V0TWFwKHRoaXMubWFwKVxuICAgICAgICB0aGlzLmNpcmNsZS5hZGRMaXN0ZW5lcigncmFkaXVzX2NoYW5nZWQnLCAoKSA9PiB0aGlzLm5vdGlmeUxvY2F0aW9uQ2hhbmdlKCkpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgYWRkUG9seWxpbmUocG9seWxpbmVPcHRpb25zOiBQb2x5bGluZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLmdvb2dsZU1hcHNGYWN0b3J5LmNyZWF0ZVBvbHlsaW5lKHBvbHlsaW5lT3B0aW9ucylcbiAgICAgICAgcG9seWxpbmUuc2V0TWFwKHRoaXMubWFwKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZE1hcmtlcihtYXJrZXJPcHRpb25zOiBNYXJrZXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTWFya2VyKG1hcmtlck9wdGlvbnMpXG4gICAgICAgIG1hcmtlci5zZXRNYXAodGhpcy5tYXApXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgYmluZENpcmNsZVRvTWFya2VyKCkge1xuICAgICAgICB0aGlzLmNpcmNsZS5iaW5kVG8oJ2NlbnRlcicsIHRoaXMubWFya2VyLCAncG9zaXRpb24nKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGhpZGVNYXJrZXIoKSB7XG4gICAgICAgIHRoaXMubWFya2VyLnNldE1hcChudWxsKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGhpZGVDaXJjbGUoKSB7XG4gICAgICAgIHRoaXMuY2lyY2xlLnNldE1hcChudWxsKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZFNlYXJjaEJveCgpIHtcbiAgICAgICAgY29uc3QgYm94ID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVTZWFyY2hCb3goKVxuXG4gICAgICAgIGJveC5hZGRMaXN0ZW5lcigncGxhY2VzX2NoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZXMgPSBib3guZ2V0UGxhY2VzKClcbiAgICAgICAgICAgIGlmIChwbGFjZXNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZU1hcExvY2F0aW9uQW5kWm9vbShwbGFjZXNbMF0uZ2VvbWV0cnkubG9jYXRpb24pXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VNYXJrZXJMb2NhdGlvbihwbGFjZXNbMF0uZ2VvbWV0cnkubG9jYXRpb24pXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gcGxhY2VzWzBdLmdlb21ldHJ5LmxvY2F0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBuZXcgQ29vcmRpbmF0ZXMobG9jLmxhdCgpLCBsb2MubG5nKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudFB1Ymxpc2hlci5ub3RpZnkoJ2xvY2F0aW9uQ2hhbmdlZCcsIG5ldyBMb2NhdGlvbihjb29yZGluYXRlcywgdGhpcy5jaXJjbGUuZ2V0UmFkaXVzKCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTWFya2VyTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLm1hcmtlci5hZGRMaXN0ZW5lcignZHJhZ2VuZCcsICgpID0+IHRoaXMubm90aWZ5TG9jYXRpb25DaGFuZ2UoKSlcbiAgICAgICAgdGhpcy5tYXJrZXIuYWRkTGlzdGVuZXIoJ2RyYWdlbmQnLCBtb3VzZUV2ZW50ID0+IHRoaXMucmV2ZXJzZUdlb2NvZGUobW91c2VFdmVudCkpXG4gICAgICAgIHRoaXMubWFwLmFkZExpc3RlbmVyKCdjbGljaycsIG1vdXNlRXZlbnQgPT4gdGhpcy5jaGFuZ2VNYXJrZXJMb2NhdGlvbihtb3VzZUV2ZW50LmxhdExuZykpXG4gICAgICAgIHRoaXMubWFwLmFkZExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMubm90aWZ5TG9jYXRpb25DaGFuZ2UoKSlcbiAgICAgICAgdGhpcy5tYXAuYWRkTGlzdGVuZXIoJ2NsaWNrJywgbW91c2VFdmVudCA9PiB0aGlzLnJldmVyc2VHZW9jb2RlKG1vdXNlRXZlbnQpKVxuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5TG9jYXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRQdWJsaXNoZXIubm90aWZ5KCdsb2NhdGlvbkNoYW5nZWQnLCBuZXcgTG9jYXRpb24odGhpcy5nZXRDb29yZGluYXRlcygpLCB0aGlzLmdldFJhZGl1cygpKSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJhZGl1cygpIHtcbiAgICAgICAgbGV0IHJhZGl1c0luTWV0ZXJzID0gMFxuICAgICAgICBpZiAodGhpcy5jaXJjbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJhZGl1c0luTWV0ZXJzID0gdGhpcy5jaXJjbGUuZ2V0UmFkaXVzKClcblxuICAgICAgICByZXR1cm4gcmFkaXVzSW5NZXRlcnNcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvb3JkaW5hdGVzKCkge1xuICAgICAgICBsZXQgY29vcmRpbmF0ZXMgPSBuZXcgQ29vcmRpbmF0ZXMoMCwgMClcbiAgICAgICAgaWYgKHRoaXMubWFya2VyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb29yZGluYXRlcyA9IG5ldyBDb29yZGluYXRlcyh0aGlzLm1hcmtlci5nZXRQb3NpdGlvbigpLmxhdCgpLCB0aGlzLm1hcmtlci5nZXRQb3NpdGlvbigpLmxuZygpKVxuXG4gICAgICAgIHJldHVybiBjb29yZGluYXRlc1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hhbmdlTWFwTG9jYXRpb25BbmRab29tKGxvY2F0aW9uOiBMYXRMbmcpIHtcbiAgICAgICAgdGhpcy5tYXAucGFuVG8obG9jYXRpb24pXG4gICAgICAgIHRoaXMubWFwLnNldFpvb20oMTYpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VNYXJrZXJMb2NhdGlvbihsb2NhdGlvbjogTGF0TG5nKSB7XG4gICAgICAgIHRoaXMuY2lyY2xlLnNldE1hcCh0aGlzLm1hcClcbiAgICAgICAgdGhpcy5tYXJrZXIuc2V0TWFwKHRoaXMubWFwKVxuICAgICAgICB0aGlzLm1hcmtlci5zZXRQb3NpdGlvbihsb2NhdGlvbilcbiAgICB9XG4gICAgcHJpdmF0ZSByZXZlcnNlR2VvY29kZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZ2VvY29kZXIucmV2ZXJzZUdlb2NvZGUobmV3IENvb3JkaW5hdGVzKGUubGF0TG5nLmxhdCgpLCBlLmxhdExuZy5sbmcoKSksIChhZGRyZXNzOiBzdHJpbmcpID0+XG4gICAgICAgICAgICB0aGlzLmV2ZW50UHVibGlzaGVyLm5vdGlmeSgnYWRkcmVzc1JldmVyc2VHZW9jb2RlZCcsIGFkZHJlc3MpXG4gICAgICAgIClcbiAgICB9XG59XG4iXX0=