UNPKG

acdc-gis-utils

Version:

Requires following dependencies: <br/> "bootstrap": "^4.4.1" or "@angular/material": "^8.0.0" <br/> "leaflet": "^1.6.0", <br/> "terraformer": "^1.0.10", <br/> "terraformer-wkt-parser": "^1.2.1"

395 lines (394 loc) 35.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, TemplateRef, forwardRef, ElementRef, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as L from "leaflet"; import { AcdcGisUtilsService } from '../acdc-gis-utils.service'; var LocationPickerInputComponent = /** @class */ (function () { function LocationPickerInputComponent(acdcGisUtilsService) { this.acdcGisUtilsService = acdcGisUtilsService; this.mapHeight = '200px'; this.mapWidth = '100%'; this.configs = { showMap: true, map: null, expandOnInputClick: false }; this.propagateChange = function (_) { }; } Object.defineProperty(LocationPickerInputComponent.prototype, "defaultShowMap", { get: /** * @return {?} */ function () { return this._defaultShowMap; }, set: /** * @param {?} value * @return {?} */ function (value) { this._defaultShowMap = value; this.configs.showMap = value; }, enumerable: true, configurable: true }); Object.defineProperty(LocationPickerInputComponent.prototype, "locationValue", { get: /** * @return {?} */ function () { return this._locationValue; }, set: /** * @param {?} value * @return {?} */ function (value) { this._locationValue = value; this.propagateChange(this._locationValue); if (value) { /** @type {?} */ var center = this.acdcGisUtilsService.fromWkt(this.locationValue); /** @type {?} */ var latlng = L.latLng(center['coordinates'][1], center['coordinates'][0]); this.setMapView(latlng); } }, enumerable: true, configurable: true }); /** * @return {?} */ LocationPickerInputComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.configs.showMap = this.defaultShowMap; this.configs.expandOnInputClick = this.expandOnInputClick; this.initMap(); if (this.map) { setTimeout(function () { _this.map.invalidateSize(false); }, 100); this.configs.map = this.map; } }; /** * initialize map, set initial zoom, add osm layer, call map locate */ /** * initialize map, set initial zoom, add osm layer, call map locate * @return {?} */ LocationPickerInputComponent.prototype.initMap = /** * initialize map, set initial zoom, add osm layer, call map locate * @return {?} */ function () { /** @type {?} */ var initialLatLng; if (this.initialLongitude && this.initialLatitude) { initialLatLng = L.latLng(this.initialLatitude, this.initialLongitude); } else { initialLatLng = L.latLng(0, 0); } /** @type {?} */ var initialZoomLoc; if (this.initialZoom && this.initialZoom > 0 && this.initialZoom < 23) { initialZoomLoc = this.initialZoom; } else { initialZoomLoc = 1; } this.map = L.map(this.leafletMapDivRef.nativeElement, { drawControl: false }).setView(initialLatLng, initialZoomLoc); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' }).addTo(this.map); this.initMapLocate(); }; /** * start listening to click events for choosing location * @return {?} */ LocationPickerInputComponent.prototype.initMapLocate = /** * start listening to click events for choosing location * @return {?} */ function () { var _this = this; this.map.on('click', function (event) { if (!_this.readonly) { /** @type {?} */ var centerWkt = _this.acdcGisUtilsService.toWkt(event.latlng); _this._locationValue = centerWkt; _this.propagateChange(_this._locationValue); _this.setMapView(event.latlng); if (_this.closeOnChoose) { setTimeout(function () { _this.configs.showMap = false; }, 500); } } }); }; /** * unregister listening click event * @return {?} */ LocationPickerInputComponent.prototype.offMapLocate = /** * unregister listening click event * @return {?} */ function () { this.map.off('click'); }; /** * input field trigger (show/hide map) */ /** * input field trigger (show/hide map) * @param {?} props * @return {?} */ LocationPickerInputComponent.prototype.onChooseLocation = /** * input field trigger (show/hide map) * @param {?} props * @return {?} */ function (props) { props['configs'].showMap = !props['configs'].showMap; setTimeout(function () { props['configs'].map.invalidateSize(false); }); }; /** * input field click event handler */ /** * input field click event handler * @param {?} props * @return {?} */ LocationPickerInputComponent.prototype.onInputClick = /** * input field click event handler * @param {?} props * @return {?} */ function (props) { if (props['configs'].expandOnInputClick) { props['configs'].showMap = true; setTimeout(function () { props['configs'].map.invalidateSize(false); }); } }; /** * close map button click handler */ /** * close map button click handler * @return {?} */ LocationPickerInputComponent.prototype.onCloseMapBtnClick = /** * close map button click handler * @return {?} */ function () { var _this = this; this.configs.showMap = false; setTimeout(function () { _this.map.invalidateSize(false); }); }; /** * form field required functions * @param obj */ /** * form field required functions * @param {?} obj * @return {?} */ LocationPickerInputComponent.prototype.writeValue = /** * form field required functions * @param {?} obj * @return {?} */ function (obj) { this.locationValue = obj; }; /** * @param {?} fn * @return {?} */ LocationPickerInputComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.propagateChange = fn; }; /** * @param {?} fn * @return {?} */ LocationPickerInputComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { }; /** * @param {?} isDisabled * @return {?} */ LocationPickerInputComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { }; /** * zoom map to passed location and pin location with marker * @param {?} latlng * @return {?} */ LocationPickerInputComponent.prototype.setMapView = /** * zoom map to passed location and pin location with marker * @param {?} latlng * @return {?} */ function (latlng) { this.map.flyTo(latlng, this.map.getZoom(), { pan: { animate: true, duration: 3 }, zoom: { animate: true, duration: 3 } }); this.locateMarker(latlng); }; /** * locate marker at passed location * @param {?} latlng * @return {?} */ LocationPickerInputComponent.prototype.locateMarker = /** * locate marker at passed location * @param {?} latlng * @return {?} */ function (latlng) { if (this.marker) { this.marker.setLatLng(latlng); } else { /** @type {?} */ var defaultMarker = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII='; /** @type {?} */ var defaultMarkerShadow = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz/f9/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL/Th///dyQN2TH6f3y/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1/TM+04kkBiAAAAAElFTkSuQmCC'; /** @type {?} */ var defaultIcon = new L.Icon({ iconUrl: defaultMarker, iconAnchor: [12, 41], shadowUrl: defaultMarkerShadow, }); this.marker = L.marker(latlng, { icon: defaultIcon }).addTo(this.map); } }; /** * @return {?} */ LocationPickerInputComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.offMapLocate(); }; LocationPickerInputComponent.decorators = [ { type: Component, args: [{ selector: 'location-picker-input', template: "\n<!-- leaflet map -->\n<div [hidden]=\"!configs.showMap\" #leafletMapDivRef [style.width]=\"mapWidth\" [style.height]=\"mapHeight\">\n <div class=\"app-close-map-button\" *ngIf=\"showCloseBtn\" (click)=\"onCloseMapBtnClick();$event.stopPropagation();\">x</div>\n</div>\n\n<!-- container for input template -->\n<ng-container *ngTemplateOutlet=\"inputFIeldTpl || defaultInputFIeldTpl; context: {\n props: {locationValue: locationValue, configs: configs}, \n onChooseLocation: onChooseLocation,\n propagateChange: propagateChange,\n onInputClick: onInputClick\n}\"></ng-container>\n\n<!-- default template -->\n<ng-template #defaultInputFIeldTpl let-onInputClick=\"onInputClick\" let-props=\"props\" let-onChooseLocation=\"onChooseLocation\">\n <div class=\"input-group\">\n <input type=\"text\" class=\"form-control\" name=\"locationValue\" (click)=\"onInputClick(props)\" [(ngModel)]=\"props.locationValue\" placeholder=\"Click on map to choose location...\" aria-label=\"Location\" readonly>\n <div class=\"input-group-append\">\n <span class=\"input-group-text\" style=\"cursor: pointer;\" (click)=\"onChooseLocation(props)\">\n <svg aria-hidden=\"true\" class=\"acdc-svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M505.04 442.66l-99.71-99.69c-4.5-4.5-10.6-7-17-7h-16.3c27.6-35.3 44-79.69 44-127.99C416.03 93.09 322.92 0 208.02 0S0 93.09 0 207.98s93.11 207.98 208.02 207.98c48.3 0 92.71-16.4 128.01-44v16.3c0 6.4 2.5 12.5 7 17l99.71 99.69c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.59.1-33.99zm-297.02-90.7c-79.54 0-144-64.34-144-143.98 0-79.53 64.35-143.98 144-143.98 79.54 0 144 64.34 144 143.98 0 79.53-64.35 143.98-144 143.98zm.02-239.96c-40.78 0-73.84 33.05-73.84 73.83 0 32.96 48.26 93.05 66.75 114.86a9.24 9.24 0 0 0 14.18 0c18.49-21.81 66.75-81.89 66.75-114.86 0-40.78-33.06-73.83-73.84-73.83zm0 96c-13.26 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"></path></svg>\n </span>\n </div>\n </div>\n</ng-template>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return LocationPickerInputComponent; }), multi: true } ], styles: [":host ::ng-deep .acdc-svg{fill:#fff;width:16px;height:16px}.app-close-map-button{width:30px;height:30px;position:absolute;right:5px;top:5px;color:gray;z-index:1001;font-size:20px;background:0 0;font-weight:700;text-align:center;cursor:pointer;vertical-align:middle}"] }] } ]; /** @nocollapse */ LocationPickerInputComponent.ctorParameters = function () { return [ { type: AcdcGisUtilsService } ]; }; LocationPickerInputComponent.propDecorators = { leafletMapDivRef: [{ type: ViewChild, args: ["leafletMapDivRef", { static: true },] }], initialZoom: [{ type: Input }], initialLongitude: [{ type: Input }], initialLatitude: [{ type: Input }], closeOnChoose: [{ type: Input }], readonly: [{ type: Input }], expandOnInputClick: [{ type: Input }], showCloseBtn: [{ type: Input }], defaultShowMap: [{ type: Input }], mapHeight: [{ type: Input }], mapWidth: [{ type: Input }], _locationValue: [{ type: Input }], inputFIeldTpl: [{ type: Input }] }; return LocationPickerInputComponent; }()); export { LocationPickerInputComponent }; if (false) { /** @type {?} */ LocationPickerInputComponent.prototype.leafletMapDivRef; /** @type {?} */ LocationPickerInputComponent.prototype.map; /** @type {?} */ LocationPickerInputComponent.prototype.marker; /** @type {?} */ LocationPickerInputComponent.prototype.initialZoom; /** @type {?} */ LocationPickerInputComponent.prototype.initialLongitude; /** @type {?} */ LocationPickerInputComponent.prototype.initialLatitude; /** @type {?} */ LocationPickerInputComponent.prototype.closeOnChoose; /** @type {?} */ LocationPickerInputComponent.prototype.readonly; /** @type {?} */ LocationPickerInputComponent.prototype.expandOnInputClick; /** @type {?} */ LocationPickerInputComponent.prototype.showCloseBtn; /** @type {?} */ LocationPickerInputComponent.prototype._defaultShowMap; /** @type {?} */ LocationPickerInputComponent.prototype.mapHeight; /** @type {?} */ LocationPickerInputComponent.prototype.mapWidth; /** @type {?} */ LocationPickerInputComponent.prototype._locationValue; /** @type {?} */ LocationPickerInputComponent.prototype.configs; /** @type {?} */ LocationPickerInputComponent.prototype.inputFIeldTpl; /** @type {?} */ LocationPickerInputComponent.prototype.propagateChange; /** @type {?} */ LocationPickerInputComponent.prototype.acdcGisUtilsService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24tcGlja2VyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FjZGMtZ2lzLXV0aWxzLyIsInNvdXJjZXMiOlsibGliL2xvY2F0aW9uLXBpY2tlci1pbnB1dC9sb2NhdGlvbi1waWNrZXItaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztJQW9GOUQsc0NBQW9CLG1CQUF3QztRQUF4Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO3lCQTdCeEMsT0FBTzt3QkFHUixNQUFNO1FBaUJ6QixlQUFVO1lBQ1IsT0FBTyxFQUFFLElBQUk7WUFDYixHQUFHLEVBQUUsSUFBSTtZQUNULGtCQUFrQixFQUFFLEtBQUs7U0FDMUIsQ0FBQzsrQkE2SGdCLFVBQUMsQ0FBTSxLQUFPO0tBeEhpQztJQXZDakUsc0JBQ0ksd0RBQWM7Ozs7UUFJbEI7WUFDRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7U0FDN0I7Ozs7O1FBUEQsVUFDbUIsS0FBSztZQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7U0FDOUI7OztPQUFBO0lBYUQsc0JBQUksdURBQWE7Ozs7UUFBakI7WUFDRSxPQUFRLElBQUksQ0FBQyxjQUFjLENBQUM7U0FDN0I7Ozs7O1FBQ0QsVUFBa0IsS0FBSztZQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FB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QUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdkU7Ozs7O0lBR0gsa0RBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0tBQ3JCOztnQkE3UEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLHErREFBcUQ7b0JBRXJELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSw0QkFBNEIsRUFBNUIsQ0FBNEIsQ0FBQzs0QkFDM0QsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7O2lCQUNGOzs7O2dCQWJRLG1CQUFtQjs7O21DQWdCekIsU0FBUyxTQUFDLGtCQUFrQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQzs4QkFPNUMsS0FBSzttQ0FHTCxLQUFLO2tDQUdMLEtBQUs7Z0NBR0wsS0FBSzsyQkFHTCxLQUFLO3FDQUdMLEtBQUs7K0JBR0wsS0FBSztpQ0FJTCxLQUFLOzRCQVNMLEtBQUs7MkJBR0wsS0FBSztpQ0FHTCxLQUFLO2dDQXFCTCxLQUFLOzt1Q0FyRlI7O1NBa0JhLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVGVtcGxhdGVSZWYsIGZvcndhcmRSZWYsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCAqIGFzIEwgZnJvbSBcImxlYWZsZXRcIjtcbmltcG9ydCB7IEFjZGNHaXNVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9hY2RjLWdpcy11dGlscy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbG9jYXRpb24tcGlja2VyLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvY2F0aW9uLXBpY2tlci1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xvY2F0aW9uLXBpY2tlci1pbnB1dC5jb21wb25lbnQuY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHsgXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IExvY2F0aW9uUGlja2VySW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTG9jYXRpb25QaWNrZXJJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIFxuICBAVmlld0NoaWxkKFwibGVhZmxldE1hcERpdlJlZlwiLCB7c3RhdGljOiB0cnVlfSlcbiAgbGVhZmxldE1hcERpdlJlZjogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIG1hcDogYW55O1xuXG4gIHByaXZhdGUgbWFya2VyOiBhbnk7XG5cbiAgQElucHV0KClcbiAgaW5pdGlhbFpvb206IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBpbml0aWFsTG9uZ2l0dWRlOiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgaW5pdGlhbExhdGl0dWRlOiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgY2xvc2VPbkNob29zZTogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICByZWFkb25seTogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBleHBhbmRPbklucHV0Q2xpY2s6IGJvb2xlYW47XG4gIFxuICBASW5wdXQoKVxuICBzaG93Q2xvc2VCdG46IGJvb2xlYW47XG4gIFxuICBfZGVmYXVsdFNob3dNYXA6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0U2hvd01hcCh2YWx1ZSl7XG4gICAgdGhpcy5fZGVmYXVsdFNob3dNYXAgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbmZpZ3Muc2hvd01hcCA9IHZhbHVlO1xuICB9XG4gIGdldCBkZWZhdWx0U2hvd01hcCgpe1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0U2hvd01hcDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIG1hcEhlaWdodDogc3RyaW5nID0gJzIwMHB4JztcblxuICBASW5wdXQoKVxuICBtYXBXaWR0aDogc3RyaW5nID0gJzEwMCUnO1xuXG4gIEBJbnB1dCgpXG4gIF9sb2NhdGlvblZhbHVlOiBzdHJpbmc7XG4gIGdldCBsb2NhdGlvblZhbHVlKCkge1xuICAgIHJldHVybiAgdGhpcy5fbG9jYXRpb25WYWx1ZTtcbiAgfVxuICBzZXQgbG9jYXRpb25WYWx1ZSh2YWx1ZSkge1xuICAgIHRoaXMuX2xvY2F0aW9uVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLl9sb2NhdGlvblZhbHVlKTtcbiAgICBpZih2YWx1ZSl7XG4gICAgICBsZXQgY2VudGVyID0gdGhpcy5hY2RjR2lzVXRpbHNTZXJ2aWNlLmZyb21Xa3QodGhpcy5sb2NhdGlvblZhbHVlKTtcbiAgICAgIGxldCBsYXRsbmcgPSBMLmxhdExuZyhjZW50ZXJbJ2Nvb3JkaW5hdGVzJ11bMV0sIGNlbnRlclsnY29vcmRpbmF0ZXMnXVswXSk7XG4gICAgICB0aGlzLnNldE1hcFZpZXcobGF0bG5nKTtcbiAgICB9XG4gIH1cblxuICBjb25maWdzID0ge1xuICAgIHNob3dNYXA6IHRydWUsXG4gICAgbWFwOiBudWxsLFxuICAgIGV4cGFuZE9uSW5wdXRDbGljazogZmFsc2VcbiAgfTtcblxuICBASW5wdXQoKSBcbiAgaW5wdXRGSWVsZFRwbDogVGVtcGxhdGVSZWY8YW55PjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjZGNHaXNVdGlsc1NlcnZpY2U6IEFjZGNHaXNVdGlsc1NlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5jb25maWdzLnNob3dNYXAgPSB0aGlzLmRlZmF1bHRTaG93TWFwO1xuICAgIHRoaXMuY29uZmlncy5leHBhbmRPbklucHV0Q2xpY2sgPSB0aGlzLmV4cGFuZE9uSW5wdXRDbGljaztcblxuICAgIHRoaXMuaW5pdE1hcCgpXG5cbiAgICBpZih0aGlzLm1hcCl7XG4gICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgIHRoaXMubWFwLmludmFsaWRhdGVTaXplKGZhbHNlKTtcbiAgICAgIH0sMTAwKTtcbiAgICAgIHRoaXMuY29uZmlncy5tYXAgPSB0aGlzLm1hcDtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWFsaXplIG1hcCwgc2V0IGluaXRpYWwgem9vbSwgYWRkIG9zbSBsYXllciwgY2FsbCBtYXAgbG9jYXRlXG4gICAqL1xuICBpbml0TWFwKCl7XG5cbiAgICBsZXQgaW5pdGlhbExhdExuZztcbiAgICBpZih0aGlzLmluaXRpYWxMb25naXR1ZGUgJiYgdGhpcy5pbml0aWFsTGF0aXR1ZGUpe1xuICAgICAgaW5pdGlhbExhdExuZyA9IEwubGF0TG5nKCB0aGlzLmluaXRpYWxMYXRpdHVkZSwgdGhpcy5pbml0aWFsTG9uZ2l0dWRlICk7XG4gICAgfWVsc2V7XG4gICAgICBpbml0aWFsTGF0TG5nID0gTC5sYXRMbmcoIDAsIDAgKTtcbiAgICB9XG5cbiAgICBsZXQgaW5pdGlhbFpvb21Mb2M7XG4gICAgaWYodGhpcy5pbml0aWFsWm9vbSAmJiB0aGlzLmluaXRpYWxab29tPjAgJiYgdGhpcy5pbml0aWFsWm9vbTwyMyl7XG4gICAgICBpbml0aWFsWm9vbUxvYyA9IHRoaXMuaW5pdGlhbFpvb207XG4gICAgfWVsc2V7XG4gICAgICBpbml0aWFsWm9vbUxvYyA9IDE7XG4gICAgfVxuXG4gICAgdGhpcy5tYXAgPSBMLm1hcCh0aGlzLmxlYWZsZXRNYXBEaXZSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgZHJhd0NvbnRyb2w6IGZhbHNlXG4gICAgfSkuc2V0VmlldyhcbiAgICAgIGluaXRpYWxMYXRMbmcsIFxuICAgICAgaW5pdGlhbFpvb21Mb2NcbiAgICApO1xuXG4gICAgTC50aWxlTGF5ZXIoJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywge1xuICAgICAgICBhdHRyaWJ1dGlvbjogJyZjb3B5OyA8YSBocmVmPVwiaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJ1xuICAgIH0pLmFkZFRvKHRoaXMubWFwKTtcblxuICAgIHRoaXMuaW5pdE1hcExvY2F0ZSgpO1xuXG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgbGlzdGVuaW5nIHRvIGNsaWNrIGV2ZW50cyBmb3IgY2hvb3NpbmcgbG9jYXRpb25cbiAgICovXG4gIHByaXZhdGUgaW5pdE1hcExvY2F0ZSgpe1xuICAgIHRoaXMubWFwLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuXG4gICAgICAgIGlmKCF0aGlzLnJlYWRvbmx5KXtcblxuICAgICAgICAgIGxldCBjZW50ZXJXa3QgPSB0aGlzLmFjZGNHaXNVdGlsc1NlcnZpY2UudG9Xa3QoZXZlbnQubGF0bG5nKTtcbiAgICAgICAgICB0aGlzLl9sb2NhdGlvblZhbHVlID0gY2VudGVyV2t0O1xuICAgICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuX2xvY2F0aW9uVmFsdWUpO1xuICAgICAgICAgIHRoaXMuc2V0TWFwVmlldyhldmVudC5sYXRsbmcpO1xuICAgICAgICAgIGlmKHRoaXMuY2xvc2VPbkNob29zZSl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY29uZmlncy5zaG93TWFwID0gZmFsc2U7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogdW5yZWdpc3RlciBsaXN0ZW5pbmcgY2xpY2sgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgb2ZmTWFwTG9jYXRlKCl7XG4gICAgdGhpcy5tYXAub2ZmKCdjbGljaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIGlucHV0IGZpZWxkIHRyaWdnZXIgKHNob3cvaGlkZSBtYXApXG4gICAqL1xuICBvbkNob29zZUxvY2F0aW9uKHByb3BzKSB7XG4gICAgcHJvcHNbJ2NvbmZpZ3MnXS5zaG93TWFwID0gIXByb3BzWydjb25maWdzJ10uc2hvd01hcDtcbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICBwcm9wc1snY29uZmlncyddLm1hcC5pbnZhbGlkYXRlU2l6ZShmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogaW5wdXQgZmllbGQgY2xpY2sgZXZlbnQgaGFuZGxlclxuICAgKi9cbiAgb25JbnB1dENsaWNrKHByb3BzKXtcbiAgICBpZihwcm9wc1snY29uZmlncyddLmV4cGFuZE9uSW5wdXRDbGljayl7XG4gICAgICBwcm9wc1snY29uZmlncyddLnNob3dNYXAgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgICBwcm9wc1snY29uZmlncyddLm1hcC5pbnZhbGlkYXRlU2l6ZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2xvc2UgbWFwIGJ1dHRvbiBjbGljayBoYW5kbGVyXG4gICAqL1xuICBvbkNsb3NlTWFwQnRuQ2xpY2soKXtcbiAgICB0aGlzLmNvbmZpZ3Muc2hvd01hcCA9IGZhbHNlO1xuICAgIHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgIHRoaXMubWFwLmludmFsaWRhdGVTaXplKGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmb3JtIGZpZWxkIHJlcXVpcmVkIGZ1bmN0aW9uc1xuICAgKiBAcGFyYW0gb2JqIFxuICAgKi9cbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9jYXRpb25WYWx1ZSA9IG9iajtcbiAgfVxuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbikge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICB9XG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgfVxuXG4gIC8qKlxuICAgKiB6b29tIG1hcCB0byBwYXNzZWQgbG9jYXRpb24gYW5kIHBpbiBsb2NhdGlvbiB3aXRoIG1hcmtlclxuICAgKiBAcGFyYW0gbGF0bG5nIFxuICAgKi9cbiAgcHJpdmF0ZSBzZXRNYXBWaWV3KGxhdGxuZyl7XG5cbiAgICB0aGlzLm1hcC5mbHlUbyhsYXRsbmcsIHRoaXMubWFwLmdldFpvb20oKSwge1xuICAgICAgcGFuOiB7XG4gICAgICAgIGFuaW1hdGU6IHRydWUsXG4gICAgICAgIGR1cmF0aW9uOiAzXG4gICAgICB9LFxuICAgICAgem9vbToge1xuICAgICAgICBhbmltYXRlOiB0cnVlLFxuICAgICAgICBkdXJhdGlvbjogM1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubG9jYXRlTWFya2VyKGxhdGxuZyk7XG4gICAgXG4gIH1cbiAgLyoqXG4gICAqIGxvY2F0ZSBtYXJrZXIgYXQgcGFzc2VkIGxvY2F0aW9uXG4gICAqIEBwYXJhbSBsYXRsbmcgXG4gICAqL1xuICBwcml2YXRlIGxvY2F0ZU1hcmtlcihsYXRsbmcpe1xuICAgIGlmKHRoaXMubWFya2VyKXtcbiAgICAgIHRoaXMubWFya2VyLnNldExhdExuZyhsYXRsbmcpO1xuICAgIH1lbHNle1xuICAgICAgY29uc3QgZGVmYXVsdE1hcmtlciA9ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJrQUFBQXBDQVlBQUFEQWs0TE9BQUFGZ1VsRVFWUjRBYTFYQTVCaldSVE4yb1cxN2QzWWFadHIyOTYySFV6YkROcGpzelcyNG1SdDI4cDQ3djd6cS9iWFp0cnAvbFduWHIzMzdqM25QQ2U4NU5jeXBnU0ZkdWdDcFc1WW9EQU1SYUlNcVJpNmFLcTVFM1lxRFFPM3FBd2pWV3JEOE5jcS9SQnB5a2Q4b1pVYi9rYUp1dG93OHIxYVA5SUkwV21MS0xJc0p5djF3L2txdzlDaDJNWWRCKysxMk9ueGVlL1FNd3ZmNC9Eay9MZnAvaTRueFRYdE9vUTRwVzVBajd3cGljaTFBOWVyZEFOMk9INjR4OE9TUDlqM0Z0M2I3YVdrVGcvRm05MXNpVHJhMGY5b241c1FyOUlOZWpINkNVVVVwYXZqRk5xMUIrT2FkaHhtbmZhOFJmRW1OOFZOQXNRaFBxRjU1eEhrTXp6M2pTbUNoV1U2ZjcvWFpLTkgrOStoQkxPSFlvenVLUVB4eU1QVUtrclgvSzB1V25mRmFKR1MxUVBSdFpzT1B0cjNOc1cwdXloNk5OQ09rVTNZeitiWGJUM0k4RzN4RTVFWExYdENYYmJxd0NPOXpQUVlQUlRaNXZJRFhEN1UrdzdyRkRFb1VVZjdpYkhJUjR5NmJMVlBYcno4SlZaRXFsMTN0cnh3dWUvdURpdmQzZmtXUmJTNi9JQTJiSUQ0dWswVXBGMU44cUxsYkJsWHM0RWU3SExUZlYxajU0QVB2T0RuU2ZPV0JxdEtWdmpnTEt6RjVZZEVrNWV3UmtHbEswaTMzRW9mZmZjN0hUNTZqRDcvNlUrcUgzQ3g3U0JMTm50SDVZSVB2T0RueWZJWFpZUlZEUHFnSHRMczVBQkhEM1l6THVlc3BiN3Q3OUZZMzREak13clZyY1R1d2xUNTVZTVB2T0JuUnJKNFZYVGRObll1ZzV1Y0hMQmpFcHQzMDcwMUEzVHMrSEVhNzN1NmRUM0ZOV3dmbFk4NmVNSFBrK1l1K2k2cHpVcFJyVzdTTkRnNUpIUjRLYXBtTTVXdjJFOFRmY2IxSG9xcUhNSFUrdVdERDd6ZzU0bXo1LzJCU25pemk5VDFEZzRRUVhMVG9HTkNrYjZ0YjFOVStRQWxHcjErK2VBRHJ6aG4vdThRMllaaFFWbFo1K0NBT3RxZmJobWFVQ1MxZXpORlZtMmltRGJQbVBuZzV3bXorZ3doK29IRGNlMGVVdFE2T0dESXlSMHVVaFVzb08zdmZEbW1nT2V6SDBtWk41OXg3TUJpKytXREwxZy9lRWlVM2F2bGlkTzY3MWJrTGZ3Ync1WFYyUDhQem8weWR5NHQyLzBldTMzeFlTT01PRDhoVGY0Q3JCdEdNU29YZlBMY2hYK0owcnVTZVB3M0xaZUswanVQSmJZenJoa0gwaW83QjNrMTY0aGlHdmF3aE9LTUxrclFMeVZwWmc4ckhGVzdFMnVIT0w4ODhJQlBsTloxRlB6c3RTSk02OTRmV3I2UndwdmNKSzYwKzBIQ0lMVEJ6WkxGTmR0QXpKYW9oemU2MFQ4cUJ6eWg1WnVPZzVlN3V3UXBwb2ZFbWYyKytEWXZteVNxR0J1S2FpY0YxYmxRamh1SGR2Q0lNdnA4d2hUVGZaekk3UmxkcHd0U3pMK0YxK3drZFoyVEJPVzJnSUY4OFBCVHpEL2dwZVJFQU1FYnhuSmNhSkhOSHJwemppMGdRQ1M2aGRrRWVZdDlERi8ycVBjRUM4Uk0yOEh3bXIzc2ROeWh0MDBieUF1dDJrM2d1ZldOdGd0T0VPRkdVd2NYV05EYmROYnBnQkd4RXZLa09Rc3hpdkp4MzNpb3cwVnc1UzZTVlRycFZxMTF5c0EyUnA3Z1RmUGZrdGM2emh0WEJCQythZFJMc2hmNnNHMlJmSFBaNUVBYzRzVlo4M3lDTjAwRmsvNGtnZ3U0MFpUdklFbTVnMjRxdFU0S2pCcngvQlRUSDhpZlZBU0FHN2dLcm5XeEpEY1U3eDhYNkVjY3pobTNvNllpY3ZzTFhXZmgzQ2gxVzBrOHgwblhGKzBmRnhndDRwaHo4UXZ5cGl3Q0NGS01xWENucVhFeGpxMTBiZUgrVVVBNytuRzZtZEcvUHUwZjNMZ0ZjR3JsMnMwa05OanBtb0o5bzRCMjlDTU84ZE1UNFE1b3g4dWl0RjZmcXNySk9yOHFud05iUnp2NmhTbkc1d1ArNjRDN2g5bHAzMGhLTnRLZFdqdGRrYnVQQTE5bko3VHozelIvaWJnQVJiaGI0QWxoYXZjQmVibVRIY0ZsMmZ2WUVuVzBveDl4TXhLQlM4YnRKK0tpRWJxOXpBNFJ0aFFYRGhQYTBUOVRFZTY5Z1d1cHdjNnVCVXBocXVYZ2YrL0ZySWp3ZUhRUzQvcGR1TWU1RVJVTUhVZDl4djhaUjk4Q3hrUzRGMm4zRVVyVVoxMEVZTnc3QldtOXgxR2lQc3NpM0dnaUdSREtXUllaZlhsT04rZGZOYk0rR2dJd1lkd0FBQUFBU1VWT1JLNUNZSUk9JztcbiAgICAgIGNvbnN0IGRlZmF1bHRNYXJrZXJTaGFkb3cgPSAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDa0FBQUFwQ0FRQUFBQUNhY2g5QUFBQ01VbEVRVlI0QWUzU2hZN2pRQkFFMEFvei9mOS9IVE16aGcxenJkS1VySmJkeCtLZDJuRDhWTnVkZnNML1RoLy8vZHlRTjJUSDZmM3kvQkdwQzM3OXJWK1MrcXFldEJPeEltTlFYTDhKQ0FyMlY0aU1RWEhHTkp4ZUNmWlhoU1JCY1FNZnZrT1dVZHRmemxMZ0FFTm1aRGNtbzJUVm10OE9TTTJlWHhCcDNEakhTTUZ1dHFTN1NibWVtekJpUit4cEtDTlVJUmtka2tZeGhBa3lHb0J2eVFGRUpFZWZ3U21tdkJmSnVKNmFLcUtXbkFrdkdaT2FaWFRVZ0ZxWVVMV05TSFVja1p1UjFISUlpbVVFeHV0Unh3ek9MUk9JRzR2S21DS1F0MzY0bUlsaFN5ekFmMW05bEhaSEpacmxBT01NenRSUmlLaW1wL3JwZEpEYzlBd3J5NXhUWkN0ZTdGSHR1Uzh3SmdlWUdyZXgyOHhOVGQwODZEaWs3dlVNc2NRT2E4eTREb0d0Q0NTa0FLbE53cGdOdHBoanJDNk1JSFVrUjZZV3h4czZTYzV4cW4yMjJtbUNSRnpJdDhsRWRLeCtpa0N0ZzkxcVMyV3B3VmZCZWxKQ2lRSnd2eml4Zkk5Y3haUVdnaVNKZWxLbndCRWxLWXRET2IyTUZiaG1VaWdiUmVRQlYwQ2c0K3FNWFN4WFN5R1VuNFViRjhsKzdxZFNHblRDMFhMQ21haElnVUhMaExPaHBWQ3R3NEN6WVh2TFFXUWJKTm14b0NzT0tBeFNnQkpubzc1YXZvbGtSdzhpSUFGY3NkYzAyZTlpeUNkOHRId21lU1NvS1Rvd0lndnNjU0daVU9BN1B1Q041YjJCWDltUU03UzB3WWhNTlU3NHpnc1BCajNIVTd3Z3VBZm54eGpGUUdCRTZwd04rR2pNRTl6SFk3ekdwOHdWeE1TaFlYOU5YdkVXRDNIYndKZjRnaU80Q0ZJUXhYU2NIMS9UTSswNGtrQmlBQUFBQUVsRlRrU3VRbUNDJztcblxuICAgICAgdmFyIGRlZmF1bHRJY29uID0gbmV3IEwuSWNvbih7XG4gICAgICAgICAgaWNvblVybDogZGVmYXVsdE1hcmtlcixcbiAgICAgICAgICBpY29uQW5jaG9yOiBbMTIsIDQxXSxcbiAgICAgICAgICBzaGFkb3dVcmw6IGRlZmF1bHRNYXJrZXJTaGFkb3csXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5tYXJrZXIgPSBMLm1hcmtlcihsYXRsbmcsIHsgaWNvbjogZGVmYXVsdEljb24gfSkuYWRkVG8odGhpcy5tYXApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMub2ZmTWFwTG9jYXRlKCk7XG4gIH1cblxufVxuIl19