angular-cesium
Version:
Angular library for working with Cesium.
288 lines • 40.9 kB
JavaScript
import { AcEntity } from '../../angular-cesium/models/ac-entity';
import { EditPoint } from './edit-point';
import { GeoUtilsService } from '../../angular-cesium/services/geo-utils/geo-utils.service';
import { defaultLabelProps } from './label-props';
export class EditableEllipse extends AcEntity {
constructor(id, ellipsesLayer, pointsLayer, coordinateConverter, options) {
super();
this.id = id;
this.ellipsesLayer = ellipsesLayer;
this.pointsLayer = pointsLayer;
this.coordinateConverter = coordinateConverter;
this.options = options;
this._rotation = 0;
this.doneCreation = false;
this._enableEdit = true;
this._minorRadiusPoints = [];
this._labels = [];
this._ellipseProps = Object.assign({}, options.ellipseProps);
this._pointProps = Object.assign({}, options.pointProps);
}
get labels() {
return this._labels;
}
set labels(labels) {
if (!labels || !this._center) {
return;
}
this._labels = labels.map((label, index) => {
if (!label.position) {
if (index === 0) {
label.position = this._center.getPosition();
}
else if (index === 1) {
label.position = this._majorRadiusPoint
? Cesium.Cartesian3.midpoint(this.getCenter(), this._majorRadiusPoint.getPosition(), new Cesium.Cartesian3())
: new Cesium.Cartesian3();
}
else if (index === 2) {
label.position =
this._minorRadiusPoints.length > 0 && this._minorRadius
? Cesium.Cartesian3.midpoint(this.getCenter(), this.getMinorRadiusPointPosition(), new Cesium.Cartesian3())
: new Cesium.Cartesian3();
}
}
return Object.assign({}, defaultLabelProps, label);
});
}
get polylineProps() {
return this._polylineProps;
}
set polylineProps(value) {
this._polylineProps = value;
}
get pointProps() {
return this._pointProps;
}
set pointProps(value) {
this._pointProps = value;
}
get ellipseProps() {
return this._ellipseProps;
}
set ellipseProps(value) {
this._ellipseProps = value;
}
get center() {
return this._center;
}
get majorRadiusPoint() {
return this._majorRadiusPoint;
}
getMajorRadiusPointPosition() {
if (!this._majorRadiusPoint) {
return undefined;
}
return this._majorRadiusPoint.getPosition();
}
getMinorRadiusPointPosition() {
if (this._minorRadiusPoints.length < 1) {
return undefined;
}
return this._minorRadiusPoints[0].getPosition();
}
get enableEdit() {
return this._enableEdit;
}
set enableEdit(value) {
this._enableEdit = value;
this._center.show = value;
this._majorRadiusPoint.show = value;
this.updatePointsLayer();
}
setManually(center, majorRadius, rotation = Math.PI / 2, minorRadius, centerPointProp = this.pointProps, radiusPointProp = this.pointProps, ellipseProp = this.ellipseProps) {
if (majorRadius < minorRadius) {
throw new Error('Major radius muse be equal or greater than minor radius');
}
this._rotation = rotation;
this._majorRadius = majorRadius;
if (!this._center) {
this._center = new EditPoint(this.id, center, centerPointProp);
}
else {
this._center.setPosition(center);
}
const majorRadiusPosition = GeoUtilsService.pointByLocationDistanceAndAzimuth(this.center.getPosition(), majorRadius, rotation);
if (!this._majorRadiusPoint) {
this._majorRadiusPoint = new EditPoint(this.id, majorRadiusPosition, radiusPointProp);
}
else {
this._majorRadiusPoint.setPosition(majorRadiusPosition);
}
if (minorRadius) {
this._minorRadius = minorRadius;
}
this.ellipseProps = ellipseProp;
this.doneCreation = true;
this.updateMinorRadiusEditPoints();
this.updatePointsLayer();
this.updateEllipsesLayer();
}
addPoint(position) {
if (this.doneCreation) {
return;
}
if (!this._center) {
this._center = new EditPoint(this.id, position, this.pointProps);
this._majorRadiusPoint = new EditPoint(this.id, position.clone(), this.pointProps);
this._majorRadius = 0;
}
this.updateRotation();
this.updateMinorRadiusEditPoints();
this.updatePointsLayer();
this.updateEllipsesLayer();
}
transformToEllipse() {
if (this._minorRadius) {
return;
}
this._minorRadius = this.getMajorRadius();
this.updateMinorRadiusEditPoints();
this.updatePointsLayer();
this.updateEllipsesLayer();
}
addLastPoint(position) {
if (this.doneCreation || !this._center || !this._majorRadiusPoint) {
return;
}
const newRadius = GeoUtilsService.distance(this._center.getPosition(), position);
this._majorRadiusPoint.setPosition(position);
this._majorRadius = newRadius;
this.doneCreation = true;
if (!this.options.circleToEllipseTransformation) {
this._minorRadius = this._majorRadius;
}
this.updateRotation();
this.updateMinorRadiusEditPoints();
this.updatePointsLayer();
this.updateEllipsesLayer();
}
movePoint(toPosition, editPoint) {
if (!this._center || !this._majorRadiusPoint) {
return;
}
const newRadius = GeoUtilsService.distance(this._center.getPosition(), toPosition);
if (this.majorRadiusPoint === editPoint) {
if (newRadius < this._minorRadius) {
this._majorRadius = this._minorRadius;
this._majorRadiusPoint.setPosition(GeoUtilsService.pointByLocationDistanceAndAzimuth(this.getCenter(), this._minorRadius, this._rotation));
}
else {
this.majorRadiusPoint.setPosition(toPosition);
this._majorRadius = newRadius;
}
}
else {
if (newRadius > this._majorRadius) {
this._minorRadius = this._majorRadius;
}
else {
this._minorRadius = newRadius;
}
}
this.updateRotation();
this.updateMinorRadiusEditPoints();
this.updatePointsLayer();
this.updateEllipsesLayer();
}
moveEllipse(dragStartPosition, dragEndPosition) {
if (!this.doneCreation) {
return;
}
if (!this.lastDraggedToPosition) {
this.lastDraggedToPosition = dragStartPosition;
}
const majorRadius = this.getMajorRadius();
const rotation = this.getRotation();
const delta = GeoUtilsService.getPositionsDelta(this.lastDraggedToPosition, dragEndPosition);
const newCenterPosition = GeoUtilsService.addDeltaToPosition(this.getCenter(), delta, true);
this._center.setPosition(newCenterPosition);
this.majorRadiusPoint.setPosition(GeoUtilsService.pointByLocationDistanceAndAzimuth(this.getCenter(), majorRadius, rotation));
this.updatePointsLayer();
this.updateMinorRadiusEditPoints();
this.updateEllipsesLayer();
this.lastDraggedToPosition = dragEndPosition;
}
endMoveEllipse() {
this.lastDraggedToPosition = undefined;
}
updateMinorRadiusEditPoints() {
if (this._minorRadius === undefined) {
return;
}
if (this._minorRadiusPoints.length === 0) {
this._minorRadiusPoints.push(new EditPoint(this.id, new Cesium.Cartesian3(), this.pointProps, true));
this._minorRadiusPoints.push(new EditPoint(this.id, new Cesium.Cartesian3(), this.pointProps, true));
}
this._minorRadiusPoints[0].setPosition(GeoUtilsService.pointByLocationDistanceAndAzimuth(this._center.getPosition(), this._minorRadius, this.getRotation() - Math.PI / 2));
this._minorRadiusPoints[1].setPosition(GeoUtilsService.pointByLocationDistanceAndAzimuth(this._center.getPosition(), this._minorRadius, this.getRotation() + Math.PI / 2));
}
getMajorRadius() {
return this._majorRadius || 0;
}
getMinorRadius() {
if (this._minorRadius === undefined) {
return this.getMajorRadius();
}
else {
return this._minorRadius;
}
}
getRotation() {
return this._rotation || 0;
}
updateRotation() {
if (!this._majorRadiusPoint) {
return 0;
}
const azimuthInDegrees = this.coordinateConverter.bearingToCartesian(this.getCenter(), this._majorRadiusPoint.getPosition());
this._rotation = Cesium.Math.toRadians(azimuthInDegrees);
return this._rotation;
}
getRotationCallbackProperty() {
return new Cesium.CallbackProperty(() => Math.PI / 2 - this.getRotation(), false);
}
getMinorRadiusCallbackProperty() {
return new Cesium.CallbackProperty(() => this.getMinorRadius(), false);
}
getMajorRadiusCallbackProperty() {
return new Cesium.CallbackProperty(() => this.getMajorRadius(), false);
}
getCenter() {
return this._center ? this._center.getPosition() : undefined;
}
getCenterCallbackProperty() {
return new Cesium.CallbackProperty(() => this.getCenter(), false);
}
dispose() {
if (this._center) {
this.pointsLayer.remove(this._center.getId());
}
if (this._majorRadiusPoint) {
this.pointsLayer.remove(this._majorRadiusPoint.getId());
}
if (this._minorRadiusPoints) {
this._minorRadiusPoints.forEach(point => this.pointsLayer.remove(point.getId()));
}
this.ellipsesLayer.remove(this.id);
}
getId() {
return this.id;
}
updateEllipsesLayer() {
this.ellipsesLayer.update(this, this.id);
}
updatePointsLayer() {
if (this._center) {
this.pointsLayer.update(this._center, this._center.getId());
}
if (this._majorRadiusPoint) {
this.pointsLayer.update(this._majorRadiusPoint, this._majorRadiusPoint.getId());
}
if (this._minorRadiusPoints.length > 0) {
this.pointsLayer.update(this._minorRadiusPoints[0], this._minorRadiusPoints[0].getId());
this.pointsLayer.update(this._minorRadiusPoints[1], this._minorRadiusPoints[1].getId());
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtZWxsaXBzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY2VzaXVtL3NyYy9saWIvYW5ndWxhci1jZXNpdW0td2lkZ2V0cy9tb2RlbHMvZWRpdGFibGUtZWxsaXBzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFJNUYsT0FBTyxFQUFFLGlCQUFpQixFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRzlELE1BQU0sT0FBTyxlQUFnQixTQUFRLFFBQVE7SUFlM0MsWUFDVSxFQUFVLEVBQ1YsYUFBK0IsRUFDL0IsV0FBNkIsRUFDN0IsbUJBQXdDLEVBQ3hDLE9BQTJCO1FBRW5DLEtBQUssRUFBRSxDQUFDO1FBTkEsT0FBRSxHQUFGLEVBQUUsQ0FBUTtRQUNWLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDN0Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQWY3QixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsdUJBQWtCLEdBQWdCLEVBQUUsQ0FBQztRQUtyQyxZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQVVqQyxJQUFJLENBQUMsYUFBYSxxQkFBTyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFdBQVcscUJBQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUks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LElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN4RixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDekY7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY0VudGl0eSB9IGZyb20gJy4uLy4uL2FuZ3VsYXItY2VzaXVtL21vZGVscy9hYy1lbnRpdHknO1xyXG5pbXBvcnQgeyBFZGl0UG9pbnQgfSBmcm9tICcuL2VkaXQtcG9pbnQnO1xyXG5pbXBvcnQgeyBBY0xheWVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYW5ndWxhci1jZXNpdW0vY29tcG9uZW50cy9hYy1sYXllci9hYy1sYXllci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYXJ0ZXNpYW4zIH0gZnJvbSAnLi4vLi4vYW5ndWxhci1jZXNpdW0vbW9kZWxzL2NhcnRlc2lhbjMnO1xyXG5pbXBvcnQgeyBHZW9VdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hbmd1bGFyLWNlc2l1bS9zZXJ2aWNlcy9nZW8tdXRpbHMvZ2VvLXV0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbGxpcHNlRWRpdE9wdGlvbnMsIEVsbGlwc2VQcm9wcyB9IGZyb20gJy4vZWxsaXBzZS1lZGl0LW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBQb2ludFByb3BzIH0gZnJvbSAnLi9wb2ludC1lZGl0LW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBQb2x5bGluZVByb3BzIH0gZnJvbSAnLi9wb2x5bGluZS1lZGl0LW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBkZWZhdWx0TGFiZWxQcm9wcywgTGFiZWxQcm9wcyB9IGZyb20gJy4vbGFiZWwtcHJvcHMnO1xyXG5pbXBvcnQgeyBDb29yZGluYXRlQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vYW5ndWxhci1jZXNpdW0vc2VydmljZXMvY29vcmRpbmF0ZS1jb252ZXJ0ZXIvY29vcmRpbmF0ZS1jb252ZXJ0ZXIuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdGFibGVFbGxpcHNlIGV4dGVuZHMgQWNFbnRpdHkge1xyXG4gIHByaXZhdGUgX2NlbnRlcjogRWRpdFBvaW50O1xyXG4gIHByaXZhdGUgX21ham9yUmFkaXVzUG9pbnQ6IEVkaXRQb2ludDtcclxuICBwcml2YXRlIF9tYWpvclJhZGl1czogbnVtYmVyO1xyXG4gIHByaXZhdGUgX21pbm9yUmFkaXVzOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfcm90YXRpb24gPSAwO1xyXG4gIHByaXZhdGUgZG9uZUNyZWF0aW9uID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZW5hYmxlRWRpdCA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfbWlub3JSYWRpdXNQb2ludHM6IEVkaXRQb2ludFtdID0gW107XHJcbiAgcHJpdmF0ZSBsYXN0RHJhZ2dlZFRvUG9zaXRpb246IGFueTtcclxuICBwcml2YXRlIF9lbGxpcHNlUHJvcHM6IEVsbGlwc2VQcm9wcztcclxuICBwcml2YXRlIF9wb2ludFByb3BzOiBQb2ludFByb3BzO1xyXG4gIHByaXZhdGUgX3BvbHlsaW5lUHJvcHM6IFBvbHlsaW5lUHJvcHM7XHJcbiAgcHJpdmF0ZSBfbGFiZWxzOiBMYWJlbFByb3BzW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGlkOiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIGVsbGlwc2VzTGF5ZXI6IEFjTGF5ZXJDb21wb25lbnQsXHJcbiAgICBwcml2YXRlIHBvaW50c0xheWVyOiBBY0xheWVyQ29tcG9uZW50LFxyXG4gICAgcHJpdmF0ZSBjb29yZGluYXRlQ29udmVydGVyOiBDb29yZGluYXRlQ29udmVydGVyLFxyXG4gICAgcHJpdmF0ZSBvcHRpb25zOiBFbGxpcHNlRWRpdE9wdGlvbnMsXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fZWxsaXBzZVByb3BzID0gey4uLm9wdGlvbnMuZWxsaXBzZVByb3BzfTtcclxuICAgIHRoaXMuX3BvaW50UHJvcHMgPSB7Li4ub3B0aW9ucy5wb2ludFByb3BzfTtcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbHMoKTogTGFiZWxQcm9wc1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9sYWJlbHM7XHJcbiAgfVxyXG5cclxuICBzZXQgbGFiZWxzKGxhYmVsczogTGFiZWxQcm9wc1tdKSB7XHJcbiAgICBpZiAoIWxhYmVscyB8fCAhdGhpcy5fY2VudGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2xhYmVscyA9IGxhYmVscy5tYXAoKGxhYmVsLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoIWxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICBsYWJlbC5wb3NpdGlvbiA9IHRoaXMuX2NlbnRlci5nZXRQb3NpdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IDEpIHtcclxuICAgICAgICAgIGxhYmVsLnBvc2l0aW9uID0gdGhpcy5fbWFqb3JSYWRpdXNQb2ludFxyXG4gICAgICAgICAgICA/IENlc2l1bS5DYXJ0ZXNpYW4zLm1pZHBvaW50KHRoaXMuZ2V0Q2VudGVyKCksIHRoaXMuX21ham9yUmFkaXVzUG9pbnQuZ2V0UG9zaXRpb24oKSwgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKCkpXHJcbiAgICAgICAgICAgIDogbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PT0gMikge1xyXG4gICAgICAgICAgbGFiZWwucG9zaXRpb24gPVxyXG4gICAgICAgICAgICB0aGlzLl9taW5vclJhZGl1c1BvaW50cy5sZW5ndGggPiAwICYmIHRoaXMuX21pbm9yUmFkaXVzXHJcbiAgICAgICAgICAgICAgPyBDZXNpdW0uQ2FydGVzaWFuMy5taWRwb2ludCh0aGlzLmdldENlbnRlcigpLCB0aGlzLmdldE1pbm9yUmFkaXVzUG9pbnRQb3NpdGlvbigpLCBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoKSlcclxuICAgICAgICAgICAgICA6IG5ldyBDZXNpdW0uQ2FydGVzaWFuMygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRMYWJlbFByb3BzLCBsYWJlbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBwb2x5bGluZVByb3BzKCk6IFBvbHlsaW5lUHJvcHMge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BvbHlsaW5lUHJvcHM7XHJcbiAgfVxyXG5cclxuICBzZXQgcG9seWxpbmVQcm9wcyh2YWx1ZTogUG9seWxpbmVQcm9wcykge1xyXG4gICAgdGhpcy5fcG9seWxpbmVQcm9wcyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBvaW50UHJvcHMoKTogUG9pbnRQcm9wcyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRQcm9wcztcclxuICB9XHJcblxyXG4gIHNldCBwb2ludFByb3BzKHZhbHVlOiBQb2ludFByb3BzKSB7XHJcbiAgICB0aGlzLl9wb2ludFByb3BzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgZWxsaXBzZVByb3BzKCk6IEVsbGlwc2VQcm9wcyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZWxsaXBzZVByb3BzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGVsbGlwc2VQcm9wcyh2YWx1ZTogRWxsaXBzZVByb3BzKSB7XHJcbiAgICB0aGlzLl9lbGxpcHNlUHJvcHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBjZW50ZXIoKTogRWRpdFBvaW50IHtcclxuICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgbWFqb3JSYWRpdXNQb2ludCgpOiBFZGl0UG9pbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuX21ham9yUmFkaXVzUG9pbnQ7XHJcbiAgfVxyXG5cclxuICBnZXRNYWpvclJhZGl1c1BvaW50UG9zaXRpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuX21ham9yUmFkaXVzUG9pbnQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbWFqb3JSYWRpdXNQb2ludC5nZXRQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWlub3JSYWRpdXNQb2ludFBvc2l0aW9uKCk6IENhcnRlc2lhbjMge1xyXG4gICAgaWYgKHRoaXMuX21pbm9yUmFkaXVzUG9pbnRzLmxlbmd0aCA8IDEpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbWlub3JSYWRpdXNQb2ludHNbMF0uZ2V0UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG4gIGdldCBlbmFibGVFZGl0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZUVkaXQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZW5hYmxlRWRpdCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZW5hYmxlRWRpdCA9IHZhbHVlO1xyXG4gICAgdGhpcy5fY2VudGVyLnNob3cgPSB2YWx1ZTtcclxuICAgIHRoaXMuX21ham9yUmFkaXVzUG9pbnQuc2hvdyA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVQb2ludHNMYXllcigpO1xyXG4gIH1cclxuXHJcbiAgc2V0TWFudWFsbHkoXHJcbiAgICBjZW50ZXI6IENhcnRlc2lhbjMsXHJcbiAgICBtYWpvclJhZGl1czogbnVtYmVyLFxyXG4gICAgcm90YXRpb24gPSBNYXRoLlBJIC8gMixcclxuICAgIG1pbm9yUmFkaXVzPzogbnVtYmVyLFxyXG4gICAgY2VudGVyUG9pbnRQcm9wID0gdGhpcy5wb2ludFByb3BzLFxyXG4gICAgcmFkaXVzUG9pbnRQcm9wID0gdGhpcy5wb2ludFByb3BzLFxyXG4gICAgZWxsaXBzZVByb3AgPSB0aGlzLmVsbGlwc2VQcm9wcyxcclxuICApIHtcclxuICAgIGlmIChtYWpvclJhZGl1cyA8IG1pbm9yUmFkaXVzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWFqb3IgcmFkaXVzIG11c2UgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIG1pbm9yIHJhZGl1cycpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcm90YXRpb24gPSByb3RhdGlvbjtcclxuICAgIHRoaXMuX21ham9yUmFkaXVzID0gbWFqb3JSYWRpdXM7XHJcbiAgICBpZiAoIXRoaXMuX2NlbnRlcikge1xyXG4gICAgICB0aGlzLl9jZW50ZXIgPSBuZXcgRWRpdFBvaW50KHRoaXMuaWQsIGNlbnRlciwgY2VudGVyUG9pbnRQcm9wKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2NlbnRlci5zZXRQb3NpdGlvbihjZW50ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1ham9yUmFkaXVzUG9zaXRpb24gPSBHZW9VdGlsc1NlcnZpY2UucG9pbnRCeUxvY2F0aW9uRGlzdGFuY2VBbmRBemltdXRoKHRoaXMuY2VudGVyLmdldFBvc2l0aW9uKCksIG1ham9yUmFkaXVzLCByb3RhdGlvbik7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9tYWpvclJhZGl1c1BvaW50KSB7XHJcbiAgICAgIHRoaXMuX21ham9yUmFkaXVzUG9pbnQgPSBuZXcgRWRpdFBvaW50KHRoaXMuaWQsIG1ham9yUmFkaXVzUG9zaXRpb24sIHJhZGl1c1BvaW50UHJvcCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9tYWpvclJhZGl1c1BvaW50LnNldFBvc2l0aW9uKG1ham9yUmFkaXVzUG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtaW5vclJhZGl1cykge1xyXG4gICAgICB0aGlzLl9taW5vclJhZGl1cyA9IG1pbm9yUmFkaXVzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxsaXBzZVByb3BzID0gZWxsaXBzZVByb3A7XHJcbiAgICB0aGlzLmRvbmVDcmVhdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLnVwZGF0ZU1pbm9yUmFkaXVzRWRpdFBvaW50cygpO1xyXG4gICAgdGhpcy51cGRhdGVQb2ludHNMYXllcigpO1xyXG4gICAgdGhpcy51cGRhdGVFbGxpcHNlc0xheWVyKCk7XHJcbiAgfVxyXG5cclxuICBhZGRQb2ludChwb3NpdGlvbjogQ2FydGVzaWFuMykge1xyXG4gICAgaWYgKHRoaXMuZG9uZUNyZWF0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2NlbnRlcikge1xyXG4gICAgICB0aGlzLl9jZW50ZXIgPSBuZXcgRWRpdFBvaW50KHRoaXMuaWQsIHBvc2l0aW9uLCB0aGlzLnBvaW50UHJvcHMpO1xyXG4gICAgICB0aGlzLl9tYWpvclJhZGl1c1BvaW50ID0gbmV3IEVkaXRQb2ludCh0aGlzLmlkLCBwb3NpdGlvbi5jbG9uZSgpLCB0aGlzLnBvaW50UHJvcHMpO1xyXG4gICAgICB0aGlzLl9tYWpvclJhZGl1cyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVSb3RhdGlvbigpO1xyXG4gICAgdGhpcy51cGRhdGVNaW5vclJhZGl1c0VkaXRQb2ludHMoKTtcclxuICAgIHRoaXMudXBkYXRlUG9pbnRzTGF5ZXIoKTtcclxuICAgIHRoaXMudXBkYXRlRWxsaXBzZXNMYXllcigpO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtVG9FbGxpcHNlKCkge1xyXG4gICAgaWYgKHRoaXMuX21pbm9yUmFkaXVzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9taW5vclJhZGl1cyA9IHRoaXMuZ2V0TWFqb3JSYWRpdXMoKTtcclxuICAgIHRoaXMudXBkYXRlTWlub3JSYWRpdXNFZGl0UG9pbnRzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVBvaW50c0xheWVyKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUVsbGlwc2VzTGF5ZXIoKTtcclxuICB9XHJcblxyXG4gIGFkZExhc3RQb2ludChwb3NpdGlvbjogQ2FydGVzaWFuMykge1xyXG4gICAgaWYgKHRoaXMuZG9uZUNyZWF0aW9uIHx8ICF0aGlzLl9jZW50ZXIgfHwgIXRoaXMuX21ham9yUmFkaXVzUG9pbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1JhZGl1cyA9IEdlb1V0aWxzU2VydmljZS5kaXN0YW5jZSh0aGlzLl9jZW50ZXIuZ2V0UG9zaXRpb24oKSwgcG9zaXRpb24pO1xyXG4gICAgdGhpcy5fbWFqb3JSYWRpdXNQb2ludC5zZXRQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICB0aGlzLl9tYWpvclJhZGl1cyA9IG5ld1JhZGl1cztcclxuICAgIHRoaXMuZG9uZUNyZWF0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jaXJjbGVUb0VsbGlwc2VUcmFuc2Zvcm1hdGlvbikge1xyXG4gICAgICB0aGlzLl9taW5vclJhZGl1cyA9IHRoaXMuX21ham9yUmFkaXVzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlUm90YXRpb24oKTtcclxuICAgIHRoaXMudXBkYXRlTWlub3JSYWRpdXNFZGl0UG9pbnRzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVBvaW50c0xheWVyKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUVsbGlwc2VzTGF5ZXIoKTtcclxuICB9XHJcblxyXG4gIG1vdmVQb2ludCh0b1Bvc2l0aW9uOiBDYXJ0ZXNpYW4zLCBlZGl0UG9pbnQ6IEVkaXRQb2ludCkge1xyXG4gICAgaWYgKCF0aGlzLl9jZW50ZXIgfHwgIXRoaXMuX21ham9yUmFkaXVzUG9pbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1JhZGl1cyA9IEdlb1V0aWxzU2VydmljZS5kaXN0YW5jZSh0aGlzLl9jZW50ZXIuZ2V0UG9zaXRpb24oKSwgdG9Qb3NpdGlvbik7XHJcbiAgICBpZiAodGhpcy5tYWpvclJhZGl1c1BvaW50ID09PSBlZGl0UG9pbnQpIHtcclxuICAgICAgaWYgKG5ld1JhZGl1cyA8IHRoaXMuX21pbm9yUmFkaXVzKSB7XHJcbiAgICAgICAgdGhpcy5fbWFqb3JSYWRpdXMgPSB0aGlzLl9taW5vclJhZGl1cztcclxuICAgICAgICB0aGlzLl9tYWpvclJhZGl1c1BvaW50LnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgR2VvVXRpbHNTZXJ2aWNlLnBvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aCh0aGlzLmdldENlbnRlcigpLCB0aGlzLl9taW5vclJhZGl1cywgdGhpcy5fcm90YXRpb24pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tYWpvclJhZGl1c1BvaW50LnNldFBvc2l0aW9uKHRvUG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMuX21ham9yUmFkaXVzID0gbmV3UmFkaXVzO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAobmV3UmFkaXVzID4gdGhpcy5fbWFqb3JSYWRpdXMpIHtcclxuICAgICAgICB0aGlzLl9taW5vclJhZGl1cyA9IHRoaXMuX21ham9yUmFkaXVzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX21pbm9yUmFkaXVzID0gbmV3UmFkaXVzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVSb3RhdGlvbigpO1xyXG4gICAgdGhpcy51cGRhdGVNaW5vclJhZGl1c0VkaXRQb2ludHMoKTtcclxuICAgIHRoaXMudXBkYXRlUG9pbnRzTGF5ZXIoKTtcclxuICAgIHRoaXMudXBkYXRlRWxsaXBzZXNMYXllcigpO1xyXG4gIH1cclxuXHJcbiAgbW92ZUVsbGlwc2UoZHJhZ1N0YXJ0UG9zaXRpb246IENhcnRlc2lhbjMsIGRyYWdFbmRQb3NpdGlvbjogQ2FydGVzaWFuMykge1xyXG4gICAgaWYgKCF0aGlzLmRvbmVDcmVhdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMubGFzdERyYWdnZWRUb1Bvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMubGFzdERyYWdnZWRUb1Bvc2l0aW9uID0gZHJhZ1N0YXJ0UG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWFqb3JSYWRpdXMgPSB0aGlzLmdldE1ham9yUmFkaXVzKCk7XHJcbiAgICBjb25zdCByb3RhdGlvbiA9IHRoaXMuZ2V0Um90YXRpb24oKTtcclxuICAgIGNvbnN0IGRlbHRhID0gR2VvVXRpbHNTZXJ2aWNlLmdldFBvc2l0aW9uc0RlbHRhKHRoaXMubGFzdERyYWdnZWRUb1Bvc2l0aW9uLCBkcmFnRW5kUG9zaXRpb24pO1xyXG4gICAgY29uc3QgbmV3Q2VudGVyUG9zaXRpb24gPSBHZW9VdGlsc1NlcnZpY2UuYWRkRGVsdGFUb1Bvc2l0aW9uKHRoaXMuZ2V0Q2VudGVyKCksIGRlbHRhLCB0cnVlKTtcclxuICAgIHRoaXMuX2NlbnRlci5zZXRQb3NpdGlvbihuZXdDZW50ZXJQb3NpdGlvbik7XHJcbiAgICB0aGlzLm1ham9yUmFkaXVzUG9pbnQuc2V0UG9zaXRpb24oR2VvVXRpbHNTZXJ2aWNlLnBvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aCh0aGlzLmdldENlbnRlcigpLCBtYWpvclJhZGl1cywgcm90YXRpb24pKTtcclxuICAgIHRoaXMudXBkYXRlUG9pbnRzTGF5ZXIoKTtcclxuICAgIHRoaXMudXBkYXRlTWlub3JSYWRpdXNFZGl0UG9pbnRzKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUVsbGlwc2VzTGF5ZXIoKTtcclxuICAgIHRoaXMubGFzdERyYWdnZWRUb1Bvc2l0aW9uID0gZHJhZ0VuZFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgZW5kTW92ZUVsbGlwc2UoKSB7XHJcbiAgICB0aGlzLmxhc3REcmFnZ2VkVG9Qb3NpdGlvbiA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTWlub3JSYWRpdXNFZGl0UG9pbnRzKCkge1xyXG4gICAgaWYgKHRoaXMuX21pbm9yUmFkaXVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX21pbm9yUmFkaXVzUG9pbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLl9taW5vclJhZGl1c1BvaW50cy5wdXNoKG5ldyBFZGl0UG9pbnQodGhpcy5pZCwgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKCksIHRoaXMucG9pbnRQcm9wcywgdHJ1ZSkpO1xyXG4gICAgICB0aGlzLl9taW5vclJhZGl1c1BvaW50cy5wdXNoKG5ldyBFZGl0UG9pbnQodGhpcy5pZCwgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKCksIHRoaXMucG9pbnRQcm9wcywgdHJ1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX21pbm9yUmFkaXVzUG9pbnRzWzBdLnNldFBvc2l0aW9uKFxyXG4gICAgICBHZW9VdGlsc1NlcnZpY2UucG9pbnRCeUxvY2F0aW9uRGlzdGFuY2VBbmRBemltdXRoKHRoaXMuX2NlbnRlci5nZXRQb3NpdGlvbigpLCB0aGlzLl9taW5vclJhZGl1cywgdGhpcy5nZXRSb3RhdGlvbigpIC0gTWF0aC5QSSAvIDIpLFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9taW5vclJhZGl1c1BvaW50c1sxXS5zZXRQb3NpdGlvbihcclxuICAgICAgR2VvVXRpbHNTZXJ2aWNlLnBvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aCh0aGlzLl9jZW50ZXIuZ2V0UG9zaXRpb24oKSwgdGhpcy5fbWlub3JSYWRpdXMsIHRoaXMuZ2V0Um90YXRpb24oKSArIE1hdGguUEkgLyAyKSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRNYWpvclJhZGl1cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX21ham9yUmFkaXVzIHx8IDA7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5vclJhZGl1cygpIHtcclxuICAgIGlmICh0aGlzLl9taW5vclJhZGl1cyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldE1ham9yUmFkaXVzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbWlub3JSYWRpdXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uIHx8IDA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVSb3RhdGlvbigpOiBudW1iZXIge1xyXG4gICAgaWYgKCF0aGlzLl9tYWpvclJhZGl1c1BvaW50KSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGF6aW11dGhJbkRlZ3JlZXMgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIuYmVhcmluZ1RvQ2FydGVzaWFuKHRoaXMuZ2V0Q2VudGVyKCksIHRoaXMuX21ham9yUmFkaXVzUG9pbnQuZ2V0UG9zaXRpb24oKSk7XHJcbiAgICB0aGlzLl9yb3RhdGlvbiA9IENlc2l1bS5NYXRoLnRvUmFkaWFucyhhemltdXRoSW5EZWdyZWVzKTtcclxuICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbjtcclxuICB9XHJcblxyXG4gIGdldFJvdGF0aW9uQ2FsbGJhY2tQcm9wZXJ0eSgpIHtcclxuICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4gTWF0aC5QSSAvIDIgLSB0aGlzLmdldFJvdGF0aW9uKCksIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGdldE1pbm9yUmFkaXVzQ2FsbGJhY2tQcm9wZXJ0eSgpIHtcclxuICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4gdGhpcy5nZXRNaW5vclJhZGl1cygpLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBnZXRNYWpvclJhZGl1c0NhbGxiYWNrUHJvcGVydHkoKSB7XHJcbiAgICByZXR1cm4gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHRoaXMuZ2V0TWFqb3JSYWRpdXMoKSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2VudGVyKCk6IENhcnRlc2lhbjMge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NlbnRlciA/IHRoaXMuX2NlbnRlci5nZXRQb3NpdGlvbigpIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2VudGVyQ2FsbGJhY2tQcm9wZXJ0eSgpIHtcclxuICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4gdGhpcy5nZXRDZW50ZXIoKSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGlmICh0aGlzLl9jZW50ZXIpIHtcclxuICAgICAgdGhpcy5wb2ludHNMYXllci5yZW1vdmUodGhpcy5fY2VudGVyLmdldElkKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9tYWpvclJhZGl1c1BvaW50KSB7XHJcbiAgICAgIHRoaXMucG9pbnRzTGF5ZXIucmVtb3ZlKHRoaXMuX21ham9yUmFkaXVzUG9pbnQuZ2V0SWQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX21pbm9yUmFkaXVzUG9pbnRzKSB7XHJcbiAgICAgIHRoaXMuX21pbm9yUmFkaXVzUG9pbnRzLmZvckVhY2gocG9pbnQgPT4gdGhpcy5wb2ludHNMYXllci5yZW1vdmUocG9pbnQuZ2V0SWQoKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZWxsaXBzZXNMYXllci5yZW1vdmUodGhpcy5pZCk7XHJcbiAgfVxyXG5cclxuICBnZXRJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVFbGxpcHNlc0xheWVyKCkge1xyXG4gICAgdGhpcy5lbGxpcHNlc0xheWVyLnVwZGF0ZSh0aGlzLCB0aGlzLmlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUG9pbnRzTGF5ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5fY2VudGVyKSB7XHJcbiAgICAgIHRoaXMucG9pbnRzTGF5ZXIudXBkYXRlKHRoaXMuX2NlbnRlciwgdGhpcy5fY2VudGVyLmdldElkKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX21ham9yUmFkaXVzUG9pbnQpIHtcclxuICAgICAgdGhpcy5wb2ludHNMYXllci51cGRhdGUodGhpcy5fbWFqb3JSYWRpdXNQb2ludCwgdGhpcy5fbWFqb3JSYWRpdXNQb2ludC5nZXRJZCgpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9taW5vclJhZGl1c1BvaW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucG9pbnRzTGF5ZXIudXBkYXRlKHRoaXMuX21pbm9yUmFkaXVzUG9pbnRzWzBdLCB0aGlzLl9taW5vclJhZGl1c1BvaW50c1swXS5nZXRJZCgpKTtcclxuICAgICAgdGhpcy5wb2ludHNMYXllci51cGRhdGUodGhpcy5fbWlub3JSYWRpdXNQb2ludHNbMV0sIHRoaXMuX21pbm9yUmFkaXVzUG9pbnRzWzFdLmdldElkKCkpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=