UNPKG

angular-cesium

Version:
135 lines 19.5 kB
import { Injectable, Optional } from '@angular/core'; import { CesiumService } from '../cesium/cesium.service'; import * as geodesy from 'geodesy'; import { LatLonEllipsoidal, Utm } from 'geodesy'; const LatLonVectors = geodesy['LatLonVectors']; // doesnt exists on typings window['geodesy'] = geodesy; /** * Given different types of coordinates, we provide you a service converting those types to the most common other types. * We are using the geodesy implementation of UTM conversion. see: https://github.com/chrisveness/geodesy. * * @example * import { Component, OnInit } from '@angular/core'; * import { CoordinateConverter } from 'angular2-cesium'; * * @Component({ * selector:'my-component', * template:'<div>{{showCartographic}}</div>', * providers:[CoordinateConverter] * }) * export class MyComponent implements OnInit { * showCartographic; * * constructor(private coordinateConverter:CoordinateConverter){ * } * * ngOnInit(){ * this.showCartographic = this.coordinateConverter.degreesToCartographic(5, 5, 5); * } * } * */ export class CoordinateConverter { constructor(cesiumService) { this.cesiumService = cesiumService; } static cartesian3ToLatLon(cartesian3, ellipsoid) { const cart = Cesium.Cartographic.fromCartesian(cartesian3, ellipsoid); return { lon: Cesium.Math.toDegrees(cart.longitude), lat: Cesium.Math.toDegrees(cart.latitude), height: cart.height }; } screenToCartesian3(screenPos, addMapCanvasBoundsToPos) { if (!this.cesiumService) { throw new Error('ANGULAR2-CESIUM - Cesium service should be provided in order' + ' to do screen position calculations'); } else { const screenPosition = Object.assign({}, screenPos); if (addMapCanvasBoundsToPos) { const mapBounds = this.cesiumService.getViewer().canvas.getBoundingClientRect(); screenPosition.x += mapBounds.left; screenPosition.y += mapBounds.top; } const camera = this.cesiumService.getViewer().camera; return camera.pickEllipsoid(screenPosition); } } screenToCartographic(screenPos, ellipsoid) { return this.cartesian3ToCartographic(this.screenToCartesian3(screenPos), ellipsoid); } cartesian3ToCartographic(cartesian, ellipsoid) { return Cesium.Cartographic.fromCartesian(cartesian, ellipsoid); } degreesToCartographic(longitude, latitude, height) { return Cesium.Cartographic.fromDegrees(longitude, latitude, height); } radiansToCartographic(longitude, latitude, height) { return Cesium.Cartographic.fromRadians(longitude, latitude, height); } degreesToUTM(longitude, latitude) { return new LatLonEllipsoidal(latitude, longitude).toUtm(); } UTMToDegrees(zone, hemisphereType, easting, northing) { return this.geodesyToCesiumObject(new Utm(zone, hemisphereType, easting, northing).toLatLonE()); } geodesyToCesiumObject(geodesyRadians) { return { longitude: geodesyRadians.lon, latitude: geodesyRadians.lat, height: geodesyRadians['height'] ? geodesyRadians['height'] : 0 }; } /** * middle point between two points * @param first (latitude,longitude) in radians * @param second (latitude,longitude) in radians */ midPointToCartesian3(first, second) { const toDeg = (rad) => Cesium.Math.toDegrees(rad); const firstPoint = new LatLonVectors(toDeg(first.latitude), toDeg(first.longitude)); const secondPoint = new LatLonVectors(toDeg(second.latitude), toDeg(second.longitude)); const middlePoint = firstPoint.midpointTo(secondPoint); return Cesium.Cartesian3.fromDegrees(middlePoint.lon, middlePoint.lat); } middlePointByScreen(position0, position1) { const scene = this.cesiumService.getScene(); const screenPosition1 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position0); const screenPosition2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position1); const middleScreenPoint = new Cesium.Cartesian2((screenPosition2.x + screenPosition1.x) / 2.0, (screenPosition2.y + screenPosition1.y) / 2.0); return scene.pickPosition(middleScreenPoint); } /** * initial bearing between two points * * * @return bearing in degrees * @param first - {latitude,longitude} in radians * @param second - {latitude,longitude} in radians */ bearingTo(first, second) { const toDeg = (rad) => Cesium.Math.toDegrees(rad); const firstPoint = new LatLonVectors(toDeg(first.latitude), toDeg(first.longitude)); const secondPoint = new LatLonVectors(toDeg(second.latitude), toDeg(second.longitude)); const bearing = firstPoint.bearingTo(secondPoint); return bearing; } /** * initial bearing between two points * * @return bearing in degrees */ bearingToCartesian(firstCartesian3, secondCartesian3) { const firstCart = Cesium.Cartographic.fromCartesian(firstCartesian3); const secondCart = Cesium.Cartographic.fromCartesian(secondCartesian3); return this.bearingTo(firstCart, secondCart); } } CoordinateConverter.decorators = [ { type: Injectable } ]; CoordinateConverter.ctorParameters = () => [ { type: CesiumService, decorators: [{ type: Optional }] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29vcmRpbmF0ZS1jb252ZXJ0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY2VzaXVtL3NyYy9saWIvYW5ndWxhci1jZXNpdW0vc2VydmljZXMvY29vcmRpbmF0ZS1jb252ZXJ0ZXIvY29vcmRpbmF0ZS1jb252ZXJ0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFzQixpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHckUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO0FBRTNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUVILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFBZ0MsYUFBNkI7UUFBN0Isa0JBQWEsR0FBYixhQUFhLENBQWdCO0lBQzdELENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBc0IsRUFBRSxTQUFlO1FBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RSxPQUFPO1lBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDMUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDekMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCLENBQUMsU0FBbUMsRUFBRSx1QkFBaUM7UUFDdkYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQ7Z0JBQzVFLHFDQUFxQyxDQUFDLENBQUM7U0FDMUM7YUFBTTtZQUNMLE1BQU0sY0FBYyxxQkFBUSxTQUFTLENBQUUsQ0FBQztZQUN4QyxJQUFJLHVCQUF1QixFQUFFO2dCQUMzQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNoRixjQUFjLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ25DLGNBQWMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQzthQUNuQztZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3JELE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxTQUFtQyxFQUFFLFNBQWU7UUFDdkUsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxTQUFxQixFQUFFLFNBQWU7UUFDN0QsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsRUFBRSxNQUFlO1FBQ3hFLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBaUIsRUFBRSxRQUFnQixFQUFFLE1BQWU7UUFDeEUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBaUIsRUFBRSxRQUFnQjtRQUM5QyxPQUFPLElBQUksaUJBQWlCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxZQUFZLENBQUMsSUFBWSxFQUFFLGNBQTBCLEVBQUUsT0FBZSxFQUFFLFFBQWdCO1FBQ3RGLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVPLHFCQUFxQixDQUFDLGNBQXNCO1FBQ2xELE9BQU87WUFDTCxTQUFTLEVBQUUsY0FBYyxDQUFDLEdBQUc7WUFDN0IsUUFBUSxFQUFFLGNBQWMsQ0FBQyxHQUFHO1lBQzVCLE1BQU0sRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxLQUE4QyxFQUFFLE1BQStDO1FBQ2xILE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RixNQUFNLFdBQVcsR0FBUSxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTVELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELG1CQUFtQixDQUFDLFNBQXFCLEVBQUUsU0FBcUI7UUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRixNQUFNLGlCQUFpQixHQUNyQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN0SCxPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsU0FBUyxDQUFDLEtBQThDLEVBQUUsTUFBK0M7UUFDdkcsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxlQUEyQixFQUFFLGdCQUE0QjtRQUMxRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7O1lBaEhGLFVBQVU7OztZQWxDRixhQUFhLHVCQW9DUCxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2VzaXVtU2VydmljZSB9IGZyb20gJy4uL2Nlc2l1bS9jZXNpdW0uc2VydmljZSc7XHJcbmltcG9ydCAqIGFzIGdlb2Rlc3kgZnJvbSAnZ2VvZGVzeSc7XHJcbmltcG9ydCB7IGhlbWlzcGhlcmUsIExhdExvbiwgTGF0TG9uRWxsaXBzb2lkYWwsIFV0bSB9IGZyb20gJ2dlb2Rlc3knO1xyXG5pbXBvcnQgeyBDYXJ0ZXNpYW4zIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhcnRlc2lhbjMnO1xyXG5cclxuY29uc3QgTGF0TG9uVmVjdG9ycyA9IGdlb2Rlc3lbJ0xhdExvblZlY3RvcnMnXTsgLy8gZG9lc250IGV4aXN0cyBvbiB0eXBpbmdzXHJcblxyXG53aW5kb3dbJ2dlb2Rlc3knXSA9IGdlb2Rlc3k7XHJcblxyXG4vKipcclxuICogIEdpdmVuIGRpZmZlcmVudCB0eXBlcyBvZiBjb29yZGluYXRlcywgd2UgcHJvdmlkZSB5b3UgYSBzZXJ2aWNlIGNvbnZlcnRpbmcgdGhvc2UgdHlwZXMgdG8gdGhlIG1vc3QgY29tbW9uIG90aGVyIHR5cGVzLlxyXG4gKiAgV2UgYXJlIHVzaW5nIHRoZSBnZW9kZXN5IGltcGxlbWVudGF0aW9uIG9mIFVUTSBjb252ZXJzaW9uLiBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3ZlbmVzcy9nZW9kZXN5LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4gKiBpbXBvcnQgeyBDb29yZGluYXRlQ29udmVydGVyIH0gZnJvbSAnYW5ndWxhcjItY2VzaXVtJztcclxuICpcclxuICogQENvbXBvbmVudCh7XHJcbiAqIFx0XHRzZWxlY3RvcjonbXktY29tcG9uZW50JyxcclxuICogXHRcdHRlbXBsYXRlOic8ZGl2Pnt7c2hvd0NhcnRvZ3JhcGhpY319PC9kaXY+JyxcclxuICogXHRcdHByb3ZpZGVyczpbQ29vcmRpbmF0ZUNvbnZlcnRlcl1cclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICogXHRcdHNob3dDYXJ0b2dyYXBoaWM7XHJcbiAqXHJcbiAqIFx0XHRjb25zdHJ1Y3Rvcihwcml2YXRlIGNvb3JkaW5hdGVDb252ZXJ0ZXI6Q29vcmRpbmF0ZUNvbnZlcnRlcil7XHJcbiAqIFx0XHR9XHJcbiAqXHJcbiAqIFx0XHRuZ09uSW5pdCgpe1xyXG4gKiBcdFx0XHR0aGlzLnNob3dDYXJ0b2dyYXBoaWMgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIuZGVncmVlc1RvQ2FydG9ncmFwaGljKDUsIDUsIDUpO1xyXG4gKiAgfVxyXG4gKiB9XHJcbiAqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb29yZGluYXRlQ29udmVydGVyIHtcclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBwcml2YXRlIGNlc2l1bVNlcnZpY2U/OiBDZXNpdW1TZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2FydGVzaWFuM1RvTGF0TG9uKGNhcnRlc2lhbjM6IENhcnRlc2lhbjMsIGVsbGlwc29pZD86IGFueSk6IHtsb246IG51bWJlciwgbGF0OiBudW1iZXI7IGhlaWdodDogbnVtYmVyfSB7XHJcbiAgICBjb25zdCBjYXJ0ID0gQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKGNhcnRlc2lhbjMsIGVsbGlwc29pZCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsb246IENlc2l1bS5NYXRoLnRvRGVncmVlcyhjYXJ0LmxvbmdpdHVkZSksXHJcbiAgICAgIGxhdDogQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGNhcnQubGF0aXR1ZGUpLFxyXG4gICAgICBoZWlnaHQ6IGNhcnQuaGVpZ2h0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc2NyZWVuVG9DYXJ0ZXNpYW4zKHNjcmVlblBvczogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9LCBhZGRNYXBDYW52YXNCb3VuZHNUb1Bvcz86IGJvb2xlYW4pIHtcclxuICAgIGlmICghdGhpcy5jZXNpdW1TZXJ2aWNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQU5HVUxBUjItQ0VTSVVNIC0gQ2VzaXVtIHNlcnZpY2Ugc2hvdWxkIGJlIHByb3ZpZGVkIGluIG9yZGVyJyArXHJcbiAgICAgICAgJyB0byBkbyBzY3JlZW4gcG9zaXRpb24gY2FsY3VsYXRpb25zJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzY3JlZW5Qb3NpdGlvbiA9IHsgLi4uc2NyZWVuUG9zIH07XHJcbiAgICAgIGlmIChhZGRNYXBDYW52YXNCb3VuZHNUb1Bvcykge1xyXG4gICAgICAgIGNvbnN0IG1hcEJvdW5kcyA9IHRoaXMuY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgc2NyZWVuUG9zaXRpb24ueCArPSBtYXBCb3VuZHMubGVmdDtcclxuICAgICAgICBzY3JlZW5Qb3NpdGlvbi55ICs9IG1hcEJvdW5kcy50b3A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICAgIHJldHVybiBjYW1lcmEucGlja0VsbGlwc29pZChzY3JlZW5Qb3NpdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzY3JlZW5Ub0NhcnRvZ3JhcGhpYyhzY3JlZW5Qb3M6IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSwgZWxsaXBzb2lkPzogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYXJ0ZXNpYW4zVG9DYXJ0b2dyYXBoaWModGhpcy5zY3JlZW5Ub0NhcnRlc2lhbjMoc2NyZWVuUG9zKSwgZWxsaXBzb2lkKTtcclxuICB9XHJcblxyXG4gIGNhcnRlc2lhbjNUb0NhcnRvZ3JhcGhpYyhjYXJ0ZXNpYW46IENhcnRlc2lhbjMsIGVsbGlwc29pZD86IGFueSkge1xyXG4gICAgcmV0dXJuIENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbUNhcnRlc2lhbihjYXJ0ZXNpYW4sIGVsbGlwc29pZCk7XHJcbiAgfVxyXG5cclxuICBkZWdyZWVzVG9DYXJ0b2dyYXBoaWMobG9uZ2l0dWRlOiBudW1iZXIsIGxhdGl0dWRlOiBudW1iZXIsIGhlaWdodD86IG51bWJlcikge1xyXG4gICAgcmV0dXJuIENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMobG9uZ2l0dWRlLCBsYXRpdHVkZSwgaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHJhZGlhbnNUb0NhcnRvZ3JhcGhpYyhsb25naXR1ZGU6IG51bWJlciwgbGF0aXR1ZGU6IG51bWJlciwgaGVpZ2h0PzogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tUmFkaWFucyhsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQpO1xyXG4gIH1cclxuXHJcbiAgZGVncmVlc1RvVVRNKGxvbmdpdHVkZTogbnVtYmVyLCBsYXRpdHVkZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbmV3IExhdExvbkVsbGlwc29pZGFsKGxhdGl0dWRlLCBsb25naXR1ZGUpLnRvVXRtKCk7XHJcbiAgfVxyXG5cclxuICBVVE1Ub0RlZ3JlZXMoem9uZTogbnVtYmVyLCBoZW1pc3BoZXJlVHlwZTogaGVtaXNwaGVyZSwgZWFzdGluZzogbnVtYmVyLCBub3J0aGluZzogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZW9kZXN5VG9DZXNpdW1PYmplY3QobmV3IFV0bSh6b25lLCBoZW1pc3BoZXJlVHlwZSwgZWFzdGluZywgbm9ydGhpbmcpLnRvTGF0TG9uRSgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VvZGVzeVRvQ2VzaXVtT2JqZWN0KGdlb2Rlc3lSYWRpYW5zOiBMYXRMb24pIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxvbmdpdHVkZTogZ2VvZGVzeVJhZGlhbnMubG9uLFxyXG4gICAgICBsYXRpdHVkZTogZ2VvZGVzeVJhZGlhbnMubGF0LFxyXG4gICAgICBoZWlnaHQ6IGdlb2Rlc3lSYWRpYW5zWydoZWlnaHQnXSA/IGdlb2Rlc3lSYWRpYW5zWydoZWlnaHQnXSA6IDBcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBtaWRkbGUgcG9pbnQgYmV0d2VlbiB0d28gcG9pbnRzXHJcbiAgICogQHBhcmFtIGZpcnN0ICAobGF0aXR1ZGUsbG9uZ2l0dWRlKSBpbiByYWRpYW5zXHJcbiAgICogQHBhcmFtIHNlY29uZCAobGF0aXR1ZGUsbG9uZ2l0dWRlKSBpbiByYWRpYW5zXHJcbiAgICovXHJcbiAgbWlkUG9pbnRUb0NhcnRlc2lhbjMoZmlyc3Q6IHsgbGF0aXR1ZGU6IG51bWJlciwgbG9uZ2l0dWRlOiBudW1iZXIgfSwgc2Vjb25kOiB7IGxhdGl0dWRlOiBudW1iZXIsIGxvbmdpdHVkZTogbnVtYmVyIH0pIHtcclxuICAgIGNvbnN0IHRvRGVnID0gKHJhZDogbnVtYmVyKSA9PiBDZXNpdW0uTWF0aC50b0RlZ3JlZXMocmFkKTtcclxuICAgIGNvbnN0IGZpcnN0UG9pbnQgPSBuZXcgTGF0TG9uVmVjdG9ycyh0b0RlZyhmaXJzdC5sYXRpdHVkZSksIHRvRGVnKGZpcnN0LmxvbmdpdHVkZSkpO1xyXG4gICAgY29uc3Qgc2Vjb25kUG9pbnQgPSBuZXcgTGF0TG9uVmVjdG9ycyh0b0RlZyhzZWNvbmQubGF0aXR1ZGUpLCB0b0RlZyhzZWNvbmQubG9uZ2l0dWRlKSk7XHJcbiAgICBjb25zdCBtaWRkbGVQb2ludDogYW55ID0gZmlyc3RQb2ludC5taWRwb2ludFRvKHNlY29uZFBvaW50KTtcclxuXHJcbiAgICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobWlkZGxlUG9pbnQubG9uLCBtaWRkbGVQb2ludC5sYXQpO1xyXG4gIH1cclxuXHJcbiAgbWlkZGxlUG9pbnRCeVNjcmVlbihwb3NpdGlvbjA6IENhcnRlc2lhbjMsIHBvc2l0aW9uMTogQ2FydGVzaWFuMyk6IENhcnRlc2lhbjMge1xyXG4gICAgY29uc3Qgc2NlbmUgPSB0aGlzLmNlc2l1bVNlcnZpY2UuZ2V0U2NlbmUoKTtcclxuICAgIGNvbnN0IHNjcmVlblBvc2l0aW9uMSA9IENlc2l1bS5TY2VuZVRyYW5zZm9ybXMud2dzODRUb1dpbmRvd0Nvb3JkaW5hdGVzKHNjZW5lLCBwb3NpdGlvbjApO1xyXG4gICAgY29uc3Qgc2NyZWVuUG9zaXRpb24yID0gQ2VzaXVtLlNjZW5lVHJhbnNmb3Jtcy53Z3M4NFRvV2luZG93Q29vcmRpbmF0ZXMoc2NlbmUsIHBvc2l0aW9uMSk7XHJcbiAgICBjb25zdCBtaWRkbGVTY3JlZW5Qb2ludCA9XHJcbiAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigoc2NyZWVuUG9zaXRpb24yLnggKyBzY3JlZW5Qb3NpdGlvbjEueCkgLyAyLjAsIChzY3JlZW5Qb3NpdGlvbjIueSArIHNjcmVlblBvc2l0aW9uMS55KSAvIDIuMCk7XHJcbiAgICByZXR1cm4gc2NlbmUucGlja1Bvc2l0aW9uKG1pZGRsZVNjcmVlblBvaW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGluaXRpYWwgYmVhcmluZyBiZXR3ZWVuIHR3byBwb2ludHNcclxuICAgKlxyXG4gICAqICogQHJldHVybiBiZWFyaW5nIGluIGRlZ3JlZXNcclxuICAgKiBAcGFyYW0gZmlyc3QgLSB7bGF0aXR1ZGUsbG9uZ2l0dWRlfSBpbiByYWRpYW5zXHJcbiAgICogQHBhcmFtIHNlY29uZCAtIHtsYXRpdHVkZSxsb25naXR1ZGV9IGluIHJhZGlhbnNcclxuICAgKi9cclxuICBiZWFyaW5nVG8oZmlyc3Q6IHsgbGF0aXR1ZGU6IG51bWJlciwgbG9uZ2l0dWRlOiBudW1iZXIgfSwgc2Vjb25kOiB7IGxhdGl0dWRlOiBudW1iZXIsIGxvbmdpdHVkZTogbnVtYmVyIH0pIHtcclxuICAgIGNvbnN0IHRvRGVnID0gKHJhZDogbnVtYmVyKSA9PiBDZXNpdW0uTWF0aC50b0RlZ3JlZXMocmFkKTtcclxuICAgIGNvbnN0IGZpcnN0UG9pbnQgPSBuZXcgTGF0TG9uVmVjdG9ycyh0b0RlZyhmaXJzdC5sYXRpdHVkZSksIHRvRGVnKGZpcnN0LmxvbmdpdHVkZSkpO1xyXG4gICAgY29uc3Qgc2Vjb25kUG9pbnQgPSBuZXcgTGF0TG9uVmVjdG9ycyh0b0RlZyhzZWNvbmQubGF0aXR1ZGUpLCB0b0RlZyhzZWNvbmQubG9uZ2l0dWRlKSk7XHJcbiAgICBjb25zdCBiZWFyaW5nID0gZmlyc3RQb2ludC5iZWFyaW5nVG8oc2Vjb25kUG9pbnQpO1xyXG5cclxuICAgIHJldHVybiBiZWFyaW5nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogaW5pdGlhbCBiZWFyaW5nIGJldHdlZW4gdHdvIHBvaW50c1xyXG4gICAqXHJcbiAgICogQHJldHVybiBiZWFyaW5nIGluIGRlZ3JlZXNcclxuICAgKi9cclxuICBiZWFyaW5nVG9DYXJ0ZXNpYW4oZmlyc3RDYXJ0ZXNpYW4zOiBDYXJ0ZXNpYW4zLCBzZWNvbmRDYXJ0ZXNpYW4zOiBDYXJ0ZXNpYW4zKSB7XHJcbiAgICBjb25zdCBmaXJzdENhcnQgPSBDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4oZmlyc3RDYXJ0ZXNpYW4zKTtcclxuICAgIGNvbnN0IHNlY29uZENhcnQgPSBDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4oc2Vjb25kQ2FydGVzaWFuMyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYmVhcmluZ1RvKGZpcnN0Q2FydCwgc2Vjb25kQ2FydCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==