tmp-react-map-gl-draw
Version:
A lite version editing layer with react
333 lines (248 loc) • 37.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _constants = require("../constants");
var _baseMode = _interopRequireDefault(require("./base-mode"));
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var EditingMode =
/*#__PURE__*/
function (_BaseMode) {
_inherits(EditingMode, _BaseMode);
function EditingMode() {
var _getPrototypeOf2;
var _this;
_classCallCheck(this, EditingMode);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(EditingMode)).call.apply(_getPrototypeOf2, [this].concat(args)));
_defineProperty(_assertThisInitialized(_this), "handleClick", function (event, props) {
var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
var selectedFeatureIndex = props.selectedIndexes && props.selectedIndexes[0];
if (!pickedObject || pickedObject.featureIndex !== selectedFeatureIndex) {
return;
}
var featureIndex = pickedObject.featureIndex,
index = pickedObject.index;
var feature = _this.getSelectedFeature(props, featureIndex);
if (feature && (feature.geometry.type === _constants.RENDER_TYPE.POLYGON || feature.geometry.type === _constants.RENDER_TYPE.LINE_STRING) && pickedObject.type === _constants.ELEMENT_TYPE.SEGMENT) {
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates) {
return;
}
var insertIndex = (index + 1) % coordinates.length;
var positionIndexes = feature.geometry.type === _constants.RENDER_TYPE.POLYGON ? [0, insertIndex] : [insertIndex];
var insertMapCoords = _this._getPointOnSegment(feature, pickedObject, event.mapCoords);
var updatedData = props.data.addPosition(featureIndex, positionIndexes, insertMapCoords).getObject();
props.onEdit({
editType: _constants.EDIT_TYPE.ADD_POSITION,
updatedData: updatedData,
editContext: [{
featureIndex: featureIndex,
editHandleIndex: insertIndex,
screenCoords: props.viewport && props.viewport.project(insertMapCoords),
mapCoords: insertMapCoords
}]
});
}
});
_defineProperty(_assertThisInitialized(_this), "_handleDragging", function (event, props) {
var onEdit = props.onEdit;
var selectedFeature = _this.getSelectedFeature(props); // nothing clicked
var isDragging = event.isDragging,
pointerDownPicks = event.pointerDownPicks,
screenCoords = event.screenCoords;
var lastPointerMoveEvent = props.lastPointerMoveEvent;
var clickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object;
if (!clickedObject || !(0, _utils.isNumeric)(clickedObject.featureIndex)) {
return;
}
var editHandleIndex = clickedObject.index; // not dragging
var updatedData = null;
var editType = isDragging ? _constants.EDIT_TYPE.MOVE_POSITION : _constants.EDIT_TYPE.FINISH_MOVE_POSITION;
switch (clickedObject.type) {
case _constants.ELEMENT_TYPE.FEATURE:
case _constants.ELEMENT_TYPE.FILL:
case _constants.ELEMENT_TYPE.SEGMENT:
// dragging feature
var dx = screenCoords[0] - lastPointerMoveEvent.screenCoords[0];
var dy = screenCoords[1] - lastPointerMoveEvent.screenCoords[1];
updatedData = _this._updateFeature(props, 'feature', {
dx: dx,
dy: dy
});
onEdit({
editType: editType,
updatedData: updatedData,
editContext: null
});
break;
case _constants.ELEMENT_TYPE.EDIT_HANDLE:
// dragging editHandle
// dragging rectangle or other shapes
var updateType = selectedFeature.properties.renderType === _constants.RENDER_TYPE.RECTANGLE ? 'rectangle' : 'editHandle';
updatedData = _this._updateFeature(props, updateType, {
editHandleIndex: editHandleIndex,
mapCoords: event.mapCoords
});
onEdit({
editType: editType,
updatedData: updatedData,
editContext: null
});
break;
default:
}
});
_defineProperty(_assertThisInitialized(_this), "handlePointerMove", function (event, props) {
// no selected feature
var selectedFeature = _this.getSelectedFeature(props);
if (!selectedFeature) {
return;
}
if (!event.isDragging) {
return;
}
_this._handleDragging(event, props);
});
_defineProperty(_assertThisInitialized(_this), "_updateFeature", function (props, type) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var data = props.data,
selectedIndexes = props.selectedIndexes,
viewport = props.viewport;
var featureIndex = selectedIndexes && selectedIndexes[0];
var feature = _this.getSelectedFeature(props, featureIndex);
var geometry = null;
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates) {
return null;
}
var newCoordinates = _toConsumableArray(coordinates);
switch (type) {
case 'editHandle':
var positionIndexes = feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON ? [0, options.editHandleIndex] : [options.editHandleIndex];
return data.replacePosition(featureIndex, positionIndexes, options.mapCoords).getObject();
case 'feature':
var dx = options.dx,
dy = options.dy;
newCoordinates = newCoordinates.map(function (mapCoords) {
var pixels = viewport && viewport.project(mapCoords);
if (pixels) {
pixels[0] += dx;
pixels[1] += dy;
return viewport && viewport.unproject(pixels);
}
return null;
}).filter(Boolean);
geometry = {
type: feature.geometry.type,
coordinates: feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON ? [newCoordinates] : newCoordinates
};
return data.replaceGeometry(featureIndex, geometry).getObject();
case 'rectangle':
// moved editHandleIndex and destination mapCoords
newCoordinates = (0, _utils.updateRectanglePosition)(feature, options.editHandleIndex, options.mapCoords);
geometry = {
type: _constants.GEOJSON_TYPE.POLYGON,
coordinates: newCoordinates
};
return data.replaceGeometry(featureIndex, geometry).getObject();
default:
return data && data.getObject();
}
});
_defineProperty(_assertThisInitialized(_this), "_getCursorEditHandle", function (event, feature) {
if (!event) return null;
var isDragging = event.isDragging,
picks = event.picks; // if not pick segment
var pickedObject = picks && picks[0] && picks[0].object;
if (!pickedObject || !(0, _utils.isNumeric)(pickedObject.featureIndex) || pickedObject.type !== _constants.ELEMENT_TYPE.SEGMENT) {
return null;
} // if dragging or feature is neither polygon nor line string
if (isDragging || feature.properties.renderType !== _constants.GEOJSON_TYPE.POLYGON && feature.properties.renderType !== _constants.GEOJSON_TYPE.LINE_STRING) {
return null;
}
var insertMapCoords = _this._getPointOnSegment(feature, pickedObject, event.mapCoords);
if (!insertMapCoords) {
return null;
}
return {
type: 'Feature',
properties: {
guideType: _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE,
renderType: feature.properties.renderType,
positionIndexes: [null]
},
geometry: {
type: _constants.GEOJSON_TYPE.POINT,
coordinates: [insertMapCoords]
}
};
});
_defineProperty(_assertThisInitialized(_this), "getGuides", function (props) {
var selectedFeature = _this.getSelectedFeature(props);
var selectedFeatureIndex = props.selectedIndexes && props.selectedIndexes[0];
if (!selectedFeature || selectedFeature.geometry.type === _constants.GEOJSON_TYPE.POINT) {
return null;
}
var event = props.lastPointerMoveEvent; // feature editHandles
var editHandles = _this.getEditHandlesFromFeature(selectedFeature, selectedFeatureIndex) || []; // cursor editHandle
var cursorEditHandle = _this._getCursorEditHandle(event, selectedFeature);
if (cursorEditHandle) {
editHandles.push(_this._getCursorEditHandle(event, selectedFeature));
}
return {
editHandles: editHandles.length ? editHandles : null
};
});
return _this;
}
_createClass(EditingMode, [{
key: "handleStopDragging",
value: function handleStopDragging(event, props) {
// replace point
var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
if (!pickedObject || !(0, _utils.isNumeric)(pickedObject.featureIndex)) {
return;
}
switch (pickedObject.type) {
case _constants.ELEMENT_TYPE.FEATURE:
case _constants.ELEMENT_TYPE.EDIT_HANDLE:
this._handleDragging(event, props);
break;
default:
}
}
}, {
key: "_getPointOnSegment",
value: function _getPointOnSegment(feature, pickedObject, pickedMapCoords) {
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates) {
return null;
}
var srcVertexIndex = pickedObject.index;
var targetVertexIndex = pickedObject.index + 1;
return (0, _utils.findClosestPointOnLineSegment)(coordinates[srcVertexIndex], coordinates[targetVertexIndex], pickedMapCoords);
}
}]);
return EditingMode;
}(_baseMode["default"]);
exports["default"] = EditingMode;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0LW1vZGVzL2VkaXRpbmctbW9kZS5qcyJdLCJuYW1lcyI6WyJFZGl0aW5nTW9kZSIsImV2ZW50IiwicHJvcHMiLCJwaWNrZWRPYmplY3QiLCJwaWNrcyIsIm9iamVjdCIsInNlbGVjdGVkRmVhdHVyZUluZGV4Iiwic2VsZWN0ZWRJbmRleGVzIiwiZmVhdHVyZUluZGV4IiwiaW5kZXgiLCJmZWF0dXJlIiwiZ2V0U2VsZWN0ZWRGZWF0dXJlIiwiZ2VvbWV0cnkiLCJ0eXBlIiwiUkVOREVSX1RZUEUiLCJQT0xZR09OIiwiTElORV9TVFJJTkciLCJFTEVNRU5UX1RZUEUiLCJTRUdNRU5UIiwiY29vcmRpbmF0ZXMiLCJpbnNlcnRJbmRleCIsImxlbmd0aCIsInBvc2l0aW9uSW5kZXhlcyIsImluc2VydE1hcENvb3JkcyIsIl9nZXRQb2ludE9uU2VnbWVudCIsIm1hcENvb3JkcyIsInVwZGF0ZWREYXRhIiwiZGF0YSIsImFkZFBvc2l0aW9uIiwiZ2V0T2JqZWN0Iiwib25FZGl0IiwiZWRpdFR5cGUiLCJFRElUX1RZUEUiLCJBRERfUE9TSVRJT04iLCJlZGl0Q29udGV4dCIsImVkaXRIYW5kbGVJbmRleCIsInNjcmVlbkNvb3JkcyIsInZpZXdwb3J0IiwicHJvamVjdCIsInNlbGVjdGVkRmVhdHVyZSIsImlzRHJhZ2dpbmciLCJwb2ludGVyRG93blBpY2tzIiwibGFzdFBvaW50ZXJNb3ZlRXZlbnQiLCJjbGlja2VkT2JqZWN0IiwiTU9WRV9QT1NJVElPTiIsIkZJTklTSF9NT1ZFX1BPU0lUSU9OIiwiRkVBVFVSRSIsIkZJTEwiLCJkeCIsImR5IiwiX3VwZGF0ZUZlYXR1cmUiLCJFRElUX0hBTkRMRSIsInVwZGF0ZVR5cGUiLCJwcm9wZXJ0aWVzIiwicmVuZGVyVHlwZSIsIlJFQ1RBTkdMRSIsIl9oYW5kbGVEcmFnZ2luZyIsIm9wdGlvbnMiLCJuZXdDb29yZGluYXRlcyIsIkdFT0pTT05fVFlQRSIsInJlcGxhY2VQb3NpdGlvbiIsIm1hcCIsInBpeGVscyIsInVucHJvamVjdCIsImZpbHRlciIsIkJvb2xlYW4iLCJyZXBsYWNlR2VvbWV0cnkiLCJndWlkZVR5cGUiLCJHVUlERV9UWVBFIiwiQ1VSU09SX0VESVRfSEFORExFIiwiUE9JTlQiLCJlZGl0SGFuZGxlcyIsImdldEVkaXRIYW5kbGVzRnJvbUZlYXR1cmUiLCJjdXJzb3JFZGl0SGFuZGxlIiwiX2dldEN1cnNvckVkaXRIYW5kbGUiLCJwdXNoIiwicGlja2VkTWFwQ29vcmRzIiwic3JjVmVydGV4SW5kZXgiLCJ0YXJnZXRWZXJ0ZXhJbmRleCIsIkJhc2VNb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBWUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBT3FCQSxXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7a0VBQ0wsVUFBQ0MsS0FBRCxFQUFvQkMsS0FBcEIsRUFBNEQ7QUFDeEUsVUFBTUMsWUFBWSxHQUFHRixLQUFLLENBQUNHLEtBQU4sSUFBZUgsS0FBSyxDQUFDRyxLQUFOLENBQVksQ0FBWixDQUFmLElBQWlDSCxLQUFLLENBQUNHLEtBQU4sQ0FBWSxDQUFaLEVBQWVDLE1BQXJFO0FBQ0EsVUFBTUMsb0JBQW9CLEdBQUdKLEtBQUssQ0FBQ0ssZUFBTixJQUF5QkwsS0FBSyxDQUFDSyxlQUFOLENBQXNCLENBQXRCLENBQXREOztBQUNBLFVBQUksQ0FBQ0osWUFBRCxJQUFpQkEsWUFBWSxDQUFDSyxZQUFiLEtBQThCRixvQkFBbkQsRUFBeUU7QUFDdkU7QUFDRDs7QUFMdUUsVUFPaEVFLFlBUGdFLEdBT3hDTCxZQVB3QyxDQU9oRUssWUFQZ0U7QUFBQSxVQU9sREMsS0FQa0QsR0FPeENOLFlBUHdDLENBT2xETSxLQVBrRDs7QUFReEUsVUFBTUMsT0FBTyxHQUFHLE1BQUtDLGtCQUFMLENBQXdCVCxLQUF4QixFQUErQk0sWUFBL0IsQ0FBaEI7O0FBQ0EsVUFDRUUsT0FBTyxLQUNOQSxPQUFPLENBQUNFLFFBQVIsQ0FBaUJDLElBQWpCLEtBQTBCQyx1QkFBWUMs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LFdBQXJCLEdBQW1DO0FBRDNDLE9BQVA7QUFHRCxLOzs7Ozs7O3VDQXpPa0J0RSxLLEVBQTBCQyxLLEVBQXFDO0FBQ2hGO0FBQ0EsVUFBTUMsWUFBWSxHQUFHRixLQUFLLENBQUNHLEtBQU4sSUFBZUgsS0FBSyxDQUFDRyxLQUFOLENBQVksQ0FBWixDQUFmLElBQWlDSCxLQUFLLENBQUNHLEtBQU4sQ0FBWSxDQUFaLEVBQWVDLE1BQXJFOztBQUNBLFVBQUksQ0FBQ0YsWUFBRCxJQUFpQixDQUFDLHNCQUFVQSxZQUFZLENBQUNLLFlBQXZCLENBQXRCLEVBQTREO0FBQzFEO0FBQ0Q7O0FBRUQsY0FBUUwsWUFBWSxDQUFDVSxJQUFyQjtBQUNFLGFBQUtJLHdCQUFhNkIsT0FBbEI7QUFDQSxhQUFLN0Isd0JBQWFrQyxXQUFsQjtBQUNFLGVBQUtLLGVBQUwsQ0FBcUJ2RCxLQUFyQixFQUE0QkMsS0FBNUI7O0FBQ0E7O0FBQ0Y7QUFMRjtBQU9EOzs7dUNBNklrQlEsTyxFQUFrQlAsWSxFQUFtQnlFLGUsRUFBMkI7QUFDakYsVUFBTXpELFdBQVcsR0FBRyxrQ0FBc0JULE9BQXRCLENBQXBCOztBQUNBLFVBQUksQ0FBQ1MsV0FBTCxFQUFrQjtBQUNoQixlQUFPLElBQVA7QUFDRDs7QUFDRCxVQUFNMEQsY0FBYyxHQUFHMUUsWUFBWSxDQUFDTSxLQUFwQztBQUNBLFVBQU1xRSxpQkFBaUIsR0FBRzNFLFlBQVksQ0FBQ00sS0FBYixHQUFxQixDQUEvQztBQUNBLGFBQU8sMENBQ0xVLFdBQVcsQ0FBQzBELGNBQUQsQ0FETixFQUVMMUQsV0FBVyxDQUFDMkQsaUJBQUQsQ0FGTixFQUdMRixlQUhLLENBQVA7QUFLRDs7OztFQW5Oc0NHLG9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlLFxuICBGZWF0dXJlQ29sbGVjdGlvbixcbiAgQ2xpY2tFdmVudCxcbiAgU3RvcERyYWdnaW5nRXZlbnQsXG4gIFBvaW50ZXJNb3ZlRXZlbnQsXG4gIFBvc2l0aW9uXG59IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5pbXBvcnQgdHlwZSB7IE1vZGVQcm9wcyB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgUkVOREVSX1RZUEUsIEVESVRfVFlQRSwgRUxFTUVOVF9UWVBFLCBHRU9KU09OX1RZUEUsIEdVSURFX1RZUEUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IEJhc2VNb2RlIGZyb20gJy4vYmFzZS1tb2RlJztcbmltcG9ydCB7XG4gIGZpbmRDbG9zZXN0UG9pbnRPbkxpbmVTZWdtZW50LFxuICBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMsXG4gIGlzTnVtZXJpYyxcbiAgdXBkYXRlUmVjdGFuZ2xlUG9zaXRpb25cbn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXRpbmdNb2RlIGV4dGVuZHMgQmFzZU1vZGUge1xuICBoYW5kbGVDbGljayA9IChldmVudDogQ2xpY2tFdmVudCwgcHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pID0+IHtcbiAgICBjb25zdCBwaWNrZWRPYmplY3QgPSBldmVudC5waWNrcyAmJiBldmVudC5waWNrc1swXSAmJiBldmVudC5waWNrc1swXS5vYmplY3Q7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSBwcm9wcy5zZWxlY3RlZEluZGV4ZXMgJiYgcHJvcHMuc2VsZWN0ZWRJbmRleGVzWzBdO1xuICAgIGlmICghcGlja2VkT2JqZWN0IHx8IHBpY2tlZE9iamVjdC5mZWF0dXJlSW5kZXggIT09IHNlbGVjdGVkRmVhdHVyZUluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBmZWF0dXJlSW5kZXgsIGluZGV4IH0gPSBwaWNrZWRPYmplY3Q7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuZ2V0U2VsZWN0ZWRGZWF0dXJlKHByb3BzLCBmZWF0dXJlSW5kZXgpO1xuICAgIGlmIChcbiAgICAgIGZlYXR1cmUgJiZcbiAgICAgIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04gfHxcbiAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORykgJiZcbiAgICAgIHBpY2tlZE9iamVjdC50eXBlID09PSBFTEVNRU5UX1RZUEUuU0VHTUVOVFxuICAgICkge1xuICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMoZmVhdHVyZSk7XG4gICAgICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gKGluZGV4ICsgMSkgJSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgICBjb25zdCBwb3NpdGlvbkluZGV4ZXMgPVxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04gPyBbMCwgaW5zZXJ0SW5kZXhdIDogW2luc2VydEluZGV4XTtcbiAgICAgIGNvbnN0IGluc2VydE1hcENvb3JkcyA9IHRoaXMuX2dldFBvaW50T25TZWdtZW50KGZlYXR1cmUsIHBpY2tlZE9iamVjdCwgZXZlbnQubWFwQ29vcmRzKTtcblxuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcm9wcy5kYXRhXG4gICAgICAgIC5hZGRQb3NpdGlvbihmZWF0dXJlSW5kZXgsIHBvc2l0aW9uSW5kZXhlcywgaW5zZXJ0TWFwQ29vcmRzKVxuICAgICAgICAuZ2V0T2JqZWN0KCk7XG5cbiAgICAgIHByb3BzLm9uRWRpdCh7XG4gICAgICAgIGVkaXRUeXBlOiBFRElUX1RZUEUuQUREX1BPU0lUSU9OLFxuICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgZWRpdENvbnRleHQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBlZGl0SGFuZGxlSW5kZXg6IGluc2VydEluZGV4LFxuICAgICAgICAgICAgc2NyZWVuQ29vcmRzOiBwcm9wcy52aWV3cG9ydCAmJiBwcm9wcy52aWV3cG9ydC5wcm9qZWN0KGluc2VydE1hcENvb3JkcyksXG4gICAgICAgICAgICBtYXBDb29yZHM6IGluc2VydE1hcENvb3Jkc1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVN0b3BEcmFnZ2luZyhldmVudDogU3RvcERyYWdnaW5nRXZlbnQsIHByb3BzOiBNb2RlUHJvcHM8RmVhdHVyZUNvbGxlY3Rpb24+KSB7XG4gICAgLy8gcmVwbGFjZSBwb2ludFxuICAgIGNvbnN0IHBpY2tlZE9iamVjdCA9IGV2ZW50LnBpY2tzICYmIGV2ZW50LnBpY2tzWzBdICYmIGV2ZW50LnBpY2tzWzBdLm9iamVjdDtcbiAgICBpZiAoIXBpY2tlZE9iamVjdCB8fCAhaXNOdW1lcmljKHBpY2tlZE9iamVjdC5mZWF0dXJlSW5kZXgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChwaWNrZWRPYmplY3QudHlwZSkge1xuICAgICAgY2FzZSBFTEVNRU5UX1RZUEUuRkVBVFVSRTpcbiAgICAgIGNhc2UgRUxFTUVOVF9UWVBFLkVESVRfSEFORExFOlxuICAgICAgICB0aGlzLl9oYW5kbGVEcmFnZ2luZyhldmVudCwgcHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZURyYWdnaW5nID0gKFxuICAgIGV2ZW50OiBQb2ludGVyTW92ZUV2ZW50IHwgU3RvcERyYWdnaW5nRXZlbnQsXG4gICAgcHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj5cbiAgKSA9PiB7XG4gICAgY29uc3QgeyBvbkVkaXQgfSA9IHByb3BzO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZSA9IHRoaXMuZ2V0U2VsZWN0ZWRGZWF0dXJlKHByb3BzKTtcbiAgICAvLyBub3RoaW5nIGNsaWNrZWRcbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIHBvaW50ZXJEb3duUGlja3MsIHNjcmVlbkNvb3JkcyB9ID0gZXZlbnQ7XG4gICAgY29uc3QgeyBsYXN0UG9pbnRlck1vdmVFdmVudCB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBjbGlja2VkT2JqZWN0ID0gcG9pbnRlckRvd25QaWNrcyAmJiBwb2ludGVyRG93blBpY2tzWzBdICYmIHBvaW50ZXJEb3duUGlja3NbMF0ub2JqZWN0O1xuICAgIGlmICghY2xpY2tlZE9iamVjdCB8fCAhaXNOdW1lcmljKGNsaWNrZWRPYmplY3QuZmVhdHVyZUluZGV4KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRIYW5kbGVJbmRleCA9IGNsaWNrZWRPYmplY3QuaW5kZXg7XG5cbiAgICAvLyBub3QgZHJhZ2dpbmdcbiAgICBsZXQgdXBkYXRlZERhdGEgPSBudWxsO1xuICAgIGNvbnN0IGVkaXRUeXBlID0gaXNEcmFnZ2luZyA/IEVESVRfVFlQRS5NT1ZFX1BPU0lUSU9OIDogRURJVF9UWVBFLkZJTklTSF9NT1ZFX1BPU0lUSU9OO1xuXG4gICAgc3dpdGNoIChjbGlja2VkT2JqZWN0LnR5cGUpIHtcbiAgICAgIGNhc2UgRUxFTUVOVF9UWVBFLkZFQVRVUkU6XG4gICAgICBjYXNlIEVMRU1FTlRfVFlQRS5GSUxMOlxuICAgICAgY2FzZSBFTEVNRU5UX1RZUEUuU0VHTUVOVDpcbiAgICAgICAgLy8gZHJhZ2dpbmcgZmVhdHVyZVxuICAgICAgICBjb25zdCBkeCA9IHNjcmVlbkNvb3Jkc1swXSAtIGxhc3RQb2ludGVyTW92ZUV2ZW50LnNjcmVlbkNvb3Jkc1swXTtcbiAgICAgICAgY29uc3QgZHkgPSBzY3JlZW5Db29yZHNbMV0gLSBsYXN0UG9pbnRlck1vdmVFdmVudC5zY3JlZW5Db29yZHNbMV07XG4gICAgICAgIHVwZGF0ZWREYXRhID0gdGhpcy5fdXBkYXRlRmVhdHVyZShwcm9wcywgJ2ZlYXR1cmUnLCB7IGR4LCBkeSB9KTtcbiAgICAgICAgb25FZGl0KHtcbiAgICAgICAgICBlZGl0VHlwZSxcbiAgICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgICBlZGl0Q29udGV4dDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRUxFTUVOVF9UWVBFLkVESVRfSEFORExFOlxuICAgICAgICAvLyBkcmFnZ2luZyBlZGl0SGFuZGxlXG4gICAgICAgIC8vIGRyYWdnaW5nIHJlY3RhbmdsZSBvciBvdGhlciBzaGFwZXNcbiAgICAgICAgY29uc3QgdXBkYXRlVHlwZSA9XG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlLnByb3BlcnRpZXMucmVuZGVyVHlwZSA9PT0gUkVOREVSX1RZUEUuUkVDVEFOR0xFXG4gICAgICAgICAgICA/ICdyZWN0YW5nbGUnXG4gICAgICAgICAgICA6ICdlZGl0SGFuZGxlJztcbiAgICAgICAgdXBkYXRlZERhdGEgPSB0aGlzLl91cGRhdGVGZWF0dXJlKHByb3BzLCB1cGRhdGVUeXBlLCB7XG4gICAgICAgICAgZWRpdEhhbmRsZUluZGV4LFxuICAgICAgICAgIG1hcENvb3JkczogZXZlbnQubWFwQ29vcmRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uRWRpdCh7XG4gICAgICAgICAgZWRpdFR5cGUsXG4gICAgICAgICAgdXBkYXRlZERhdGEsXG4gICAgICAgICAgZWRpdENvbnRleHQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBoYW5kbGVQb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlck1vdmVFdmVudCwgcHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pID0+IHtcbiAgICAvLyBubyBzZWxlY3RlZCBmZWF0dXJlXG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5nZXRTZWxlY3RlZEZlYXR1cmUocHJvcHMpO1xuICAgIGlmICghc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFldmVudC5pc0RyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlRHJhZ2dpbmcoZXZlbnQsIHByb3BzKTtcbiAgfTtcblxuICAvLyBUT0RPIC0gcmVmYWN0b3JcbiAgX3VwZGF0ZUZlYXR1cmUgPSAocHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4sIHR5cGU6IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIHNlbGVjdGVkSW5kZXhlcywgdmlld3BvcnQgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgZmVhdHVyZUluZGV4ID0gc2VsZWN0ZWRJbmRleGVzICYmIHNlbGVjdGVkSW5kZXhlc1swXTtcbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRTZWxlY3RlZEZlYXR1cmUocHJvcHMsIGZlYXR1cmVJbmRleCk7XG5cbiAgICBsZXQgZ2VvbWV0cnkgPSBudWxsO1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGZlYXR1cmUpO1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBuZXdDb29yZGluYXRlcyA9IFsuLi5jb29yZGluYXRlc107XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2VkaXRIYW5kbGUnOlxuICAgICAgICBjb25zdCBwb3NpdGlvbkluZGV4ZXMgPVxuICAgICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gR0VPSlNPTl9UWVBFLlBPTFlHT05cbiAgICAgICAgICAgID8gWzAsIG9wdGlvbnMuZWRpdEhhbmRsZUluZGV4XVxuICAgICAgICAgICAgOiBbb3B0aW9ucy5lZGl0SGFuZGxlSW5kZXhdO1xuXG4gICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2VQb3NpdGlvbihmZWF0dXJlSW5kZXgsIHBvc2l0aW9uSW5kZXhlcywgb3B0aW9ucy5tYXBDb29yZHMpLmdldE9iamVjdCgpO1xuXG4gICAgICBjYXNlICdmZWF0dXJlJzpcbiAgICAgICAgY29uc3QgeyBkeCwgZHkgfSA9IG9wdGlvbnM7XG4gICAgICAgIG5ld0Nvb3JkaW5hdGVzID0gbmV3Q29vcmRpbmF0ZXNcbiAgICAgICAgICAubWFwKG1hcENvb3JkcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBwaXhlbHMgPSB2aWV3cG9ydCAmJiB2aWV3cG9ydC5wcm9qZWN0KG1hcENvb3Jkcyk7XG4gICAgICAgICAgICBpZiAocGl4ZWxzKSB7XG4gICAgICAgICAgICAgIHBpeGVsc1swXSArPSBkeDtcbiAgICAgICAgICAgICAgcGl4ZWxzWzFdICs9IGR5O1xuICAgICAgICAgICAgICByZXR1cm4gdmlld3BvcnQgJiYgdmlld3BvcnQudW5wcm9qZWN0KHBpeGVscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgZ2VvbWV0cnkgPSB7XG4gICAgICAgICAgdHlwZTogZmVhdHVyZS5nZW9tZXRyeS50eXBlLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOlxuICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBHRU9KU09OX1RZUEUuUE9MWUdPTiA/IFtuZXdDb29yZGluYXRlc10gOiBuZXdDb29yZGluYXRlc1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2VHZW9tZXRyeShmZWF0dXJlSW5kZXgsIGdlb21ldHJ5KS5nZXRPYmplY3QoKTtcblxuICAgICAgY2FzZSAncmVjdGFuZ2xlJzpcbiAgICAgICAgLy8gbW92ZWQgZWRpdEhhbmRsZUluZGV4IGFuZCBkZXN0aW5hdGlvbiBtYXBDb29yZHNcbiAgICAgICAgbmV3Q29vcmRpbmF0ZXMgPSB1cGRhdGVSZWN0YW5nbGVQb3NpdGlvbihcbiAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgIG9wdGlvbnMuZWRpdEhhbmRsZUluZGV4LFxuICAgICAgICAgIG9wdGlvbnMubWFwQ29vcmRzXG4gICAgICAgICk7XG5cbiAgICAgICAgZ2VvbWV0cnkgPSB7XG4gICAgICAgICAgdHlwZTogR0VPSlNPTl9UWVBFLlBPTFlHT04sXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IG5ld0Nvb3JkaW5hdGVzXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZUdlb21ldHJ5KGZlYXR1cmVJbmRleCwgZ2VvbWV0cnkpLmdldE9iamVjdCgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF0YSAmJiBkYXRhLmdldE9iamVjdCgpO1xuICAgIH1cbiAgfTtcblxuICBfZ2V0UG9pbnRPblNlZ21lbnQoZmVhdHVyZTogRmVhdHVyZSwgcGlja2VkT2JqZWN0OiBhbnksIHBpY2tlZE1hcENvb3JkczogUG9zaXRpb24pIHtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGdldEZlYXR1cmVDb29yZGluYXRlcyhmZWF0dXJlKTtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3JjVmVydGV4SW5kZXggPSBwaWNrZWRPYmplY3QuaW5kZXg7XG4gICAgY29uc3QgdGFyZ2V0VmVydGV4SW5kZXggPSBwaWNrZWRPYmplY3QuaW5kZXggKyAxO1xuICAgIHJldHVybiBmaW5kQ2xvc2VzdFBvaW50T25MaW5lU2VnbWVudChcbiAgICAgIGNvb3JkaW5hdGVzW3NyY1ZlcnRleEluZGV4XSxcbiAgICAgIGNvb3JkaW5hdGVzW3RhcmdldFZlcnRleEluZGV4XSxcbiAgICAgIHBpY2tlZE1hcENvb3Jkc1xuICAgICk7XG4gIH1cblxuICBfZ2V0Q3Vyc29yRWRpdEhhbmRsZSA9IChldmVudDogUG9pbnRlck1vdmVFdmVudCwgZmVhdHVyZTogRmVhdHVyZSkgPT4ge1xuICAgIGlmKCFldmVudCkgcmV0dXJuIG51bGxcbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIHBpY2tzIH0gPSBldmVudDtcbiAgICAvLyBpZiBub3QgcGljayBzZWdtZW50XG4gICAgY29uc3QgcGlja2VkT2JqZWN0ID0gcGlja3MgJiYgcGlja3NbMF0gJiYgcGlja3NbMF0ub2JqZWN0O1xuICAgIGlmIChcbiAgICAgICFwaWNrZWRPYmplY3QgfHxcbiAgICAgICFpc051bWVyaWMocGlja2VkT2JqZWN0LmZlYXR1cmVJbmRleCkgfHxcbiAgICAgIHBpY2tlZE9iamVjdC50eXBlICE9PSBFTEVNRU5UX1RZUEUuU0VHTUVOVFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gaWYgZHJhZ2dpbmcgb3IgZmVhdHVyZSBpcyBuZWl0aGVyIHBvbHlnb24gbm9yIGxpbmUgc3RyaW5nXG4gICAgaWYgKFxuICAgICAgaXNEcmFnZ2luZyB8fFxuICAgICAgKGZlYXR1cmUucHJvcGVydGllcy5yZW5kZXJUeXBlICE9PSBHRU9KU09OX1RZUEUuUE9MWUdPTiAmJlxuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMucmVuZGVyVHlwZSAhPT0gR0VPSlNPTl9UWVBFLkxJTkVfU1RSSU5HKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zZXJ0TWFwQ29vcmRzID0gdGhpcy5fZ2V0UG9pbnRPblNlZ21lbnQoZmVhdHVyZSwgcGlja2VkT2JqZWN0LCBldmVudC5tYXBDb29yZHMpO1xuXG4gICAgaWYgKCFpbnNlcnRNYXBDb29yZHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGd1aWRlVHlwZTogR1VJREVfVFlQRS5DVVJTT1JfRURJVF9IQU5ETEUsXG4gICAgICAgIHJlbmRlclR5cGU6IGZlYXR1cmUucHJvcGVydGllcy5yZW5kZXJUeXBlLFxuICAgICAgICBwb3NpdGlvbkluZGV4ZXM6IFtudWxsXVxuICAgICAgfSxcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIHR5cGU6IEdFT0pTT05fVFlQRS5QT0lOVCxcbiAgICAgICAgY29vcmRpbmF0ZXM6IFtpbnNlcnRNYXBDb29yZHNdXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBnZXRHdWlkZXMgPSAocHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmUgPSB0aGlzLmdldFNlbGVjdGVkRmVhdHVyZShwcm9wcyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSBwcm9wcy5zZWxlY3RlZEluZGV4ZXMgJiYgcHJvcHMuc2VsZWN0ZWRJbmRleGVzWzBdO1xuXG4gICAgaWYgKCFzZWxlY3RlZEZlYXR1cmUgfHwgc2VsZWN0ZWRGZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IEdFT0pTT05fVFlQRS5QT0lOVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnQgPSBwcm9wcy5sYXN0UG9pbnRlck1vdmVFdmVudDtcblxuICAgIC8vIGZlYXR1cmUgZWRpdEhhbmRsZXNcbiAgICBjb25zdCBlZGl0SGFuZGxlcyA9IHRoaXMuZ2V0RWRpdEhhbmRsZXNGcm9tRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUsIHNlbGVjdGVkRmVhdHVyZUluZGV4KSB8fCBbXTtcblxuICAgIC8vIGN1cnNvciBlZGl0SGFuZGxlXG4gICAgY29uc3QgY3Vyc29yRWRpdEhhbmRsZSA9IHRoaXMuX2dldEN1cnNvckVkaXRIYW5kbGUoZXZlbnQsIHNlbGVjdGVkRmVhdHVyZSk7XG4gICAgaWYgKGN1cnNvckVkaXRIYW5kbGUpIHtcbiAgICAgIGVkaXRIYW5kbGVzLnB1c2godGhpcy5fZ2V0Q3Vyc29yRWRpdEhhbmRsZShldmVudCwgc2VsZWN0ZWRGZWF0dXJlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVkaXRIYW5kbGVzOiBlZGl0SGFuZGxlcy5sZW5ndGggPyBlZGl0SGFuZGxlcyA6IG51bGxcbiAgICB9O1xuICB9O1xufVxuIl19