tmp-react-map-gl-draw
Version:
A lite version editing layer with react
649 lines (510 loc) • 68.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireDefault(require("react"));
var _constants = require("./constants");
var _modeHandler = _interopRequireDefault(require("./mode-handler"));
var _utils = require("./edit-modes/utils");
var _style = require("./style");
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 _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
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 _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
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 ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
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 defaultProps = _objectSpread({}, _modeHandler["default"].defaultProps, {
clickRadius: 0,
featureShape: 'circle',
editHandleShape: 'rect',
editHandleStyle: _style.editHandleStyle,
featureStyle: _style.featureStyle
});
var Editor =
/*#__PURE__*/
function (_ModeHandler) {
_inherits(Editor, _ModeHandler);
function Editor() {
var _getPrototypeOf2;
var _this;
_classCallCheck(this, Editor);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Editor)).call.apply(_getPrototypeOf2, [this].concat(args)));
_defineProperty(_assertThisInitialized(_this), "_getEditHandleState", function (editHandle, renderState) {
var _this$state = _this.state,
pointerDownPicks = _this$state.pointerDownPicks,
hovered = _this$state.hovered;
if (renderState) {
return renderState;
}
var editHandleIndex = editHandle.properties.positionIndexes[0];
var draggingEditHandleIndex = null;
var pickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object;
if (pickedObject && pickedObject.guideType === _constants.GUIDE_TYPE.EDIT_HANDLE) {
draggingEditHandleIndex = pickedObject.index;
}
if (editHandleIndex === draggingEditHandleIndex) {
return _constants.RENDER_STATE.SELECTED;
}
if (hovered && hovered.type === _constants.ELEMENT_TYPE.EDIT_HANDLE) {
if (hovered.index === editHandleIndex) {
return _constants.RENDER_STATE.HOVERED;
} // cursor hovered on first vertex when drawing polygon
if (hovered.index === 0 && editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
return _constants.RENDER_STATE.CLOSING;
}
}
return _constants.RENDER_STATE.INACTIVE;
});
_defineProperty(_assertThisInitialized(_this), "_getFeatureRenderState", function (index, renderState) {
var hovered = _this.state.hovered;
var selectedFeatureIndex = _this._getSelectedFeatureIndex();
if (renderState) {
return renderState;
}
if (index === selectedFeatureIndex) {
return _constants.RENDER_STATE.SELECTED;
}
if (hovered && hovered.type === _constants.ELEMENT_TYPE.FEATURE && hovered.featureIndex === index) {
return _constants.RENDER_STATE.HOVERED;
}
return _constants.RENDER_STATE.INACTIVE;
});
_defineProperty(_assertThisInitialized(_this), "_getStyleProp", function (styleProp, params) {
return typeof styleProp === 'function' ? styleProp(params) : styleProp;
});
_defineProperty(_assertThisInitialized(_this), "_renderEditHandle", function (editHandle, feature) {
/* eslint-enable max-params */
var coordinates = (0, _utils.getFeatureCoordinates)(editHandle);
var p = _this.project(coordinates && coordinates[0]);
if (!p) {
return null;
}
var _editHandle$propertie = editHandle.properties,
featureIndex = _editHandle$propertie.featureIndex,
positionIndexes = _editHandle$propertie.positionIndexes;
var _this$props = _this.props,
clickRadius = _this$props.clickRadius,
editHandleShape = _this$props.editHandleShape,
editHandleStyle = _this$props.editHandleStyle;
var index = positionIndexes[0];
var shape = _this._getStyleProp(editHandleShape, {
feature: feature || editHandle,
index: index,
featureIndex: featureIndex,
state: _this._getEditHandleState(editHandle)
});
var style = _this._getStyleProp(editHandleStyle, {
feature: feature || editHandle,
index: index,
featureIndex: featureIndex,
shape: shape,
state: _this._getEditHandleState(editHandle)
}); // disable events for cursor editHandle
if (editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
style = _objectSpread({}, style, {
// disable pointer events for cursor
pointerEvents: 'none'
});
}
var elemKey = "".concat(_constants.ELEMENT_TYPE.EDIT_HANDLE, ".").concat(featureIndex, ".").concat(index); // first <circle|rect> is to make path easily interacted with
switch (shape) {
case 'circle':
return _react["default"].createElement("g", {
key: elemKey,
transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
}, _react["default"].createElement("circle", {
"data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
"data-index": index,
"data-feature-index": featureIndex,
key: "".concat(elemKey, ".hidden"),
style: _objectSpread({}, style, {
stroke: 'none',
fill: '#000',
fillOpacity: 0
}),
cx: 0,
cy: 0,
r: clickRadius
}), _react["default"].createElement("circle", {
"data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
"data-index": index,
"data-feature-index": featureIndex,
key: elemKey,
style: style,
cx: 0,
cy: 0
}));
case 'rect':
return _react["default"].createElement("g", {
key: elemKey,
transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
}, _react["default"].createElement("rect", {
"data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
"data-index": index,
"data-feature-index": featureIndex,
key: "".concat(elemKey, ".hidden"),
style: _objectSpread({}, style, {
height: clickRadius,
width: clickRadius,
fill: '#000',
fillOpacity: 0
}),
r: clickRadius
}), _react["default"].createElement("rect", {
"data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
"data-index": index,
"data-feature-index": featureIndex,
key: "".concat(elemKey),
style: style
}));
default:
return null;
}
});
_defineProperty(_assertThisInitialized(_this), "_renderSegment", function (featureIndex, index, coordinates, style) {
var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.LINE_STRING);
var radius = style.radius,
others = _objectWithoutProperties(style, ["radius"]);
var clickRadius = _this.props.clickRadius;
var elemKey = "".concat(_constants.ELEMENT_TYPE.SEGMENT, ".").concat(featureIndex, ".").concat(index);
return _react["default"].createElement("g", {
key: elemKey
}, _react["default"].createElement("path", {
key: "".concat(elemKey, ".hidden"),
"data-type": _constants.ELEMENT_TYPE.SEGMENT,
"data-index": index,
"data-feature-index": featureIndex,
style: _objectSpread({}, others, {
strokeWidth: clickRadius || radius,
opacity: 0
}),
d: path
}), _react["default"].createElement("path", {
key: elemKey,
"data-type": _constants.ELEMENT_TYPE.SEGMENT,
"data-index": index,
"data-feature-index": featureIndex,
style: others,
d: path
}));
});
_defineProperty(_assertThisInitialized(_this), "_renderSegments", function (featureIndex, coordinates, style) {
var segments = [];
for (var i = 0; i < coordinates.length - 1; i++) {
segments.push(_this._renderSegment(featureIndex, i, [coordinates[i], coordinates[i + 1]], style));
}
return segments;
});
_defineProperty(_assertThisInitialized(_this), "_renderFill", function (featureIndex, coordinates, style) {
var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.POLYGON);
return _react["default"].createElement("path", {
key: "".concat(_constants.ELEMENT_TYPE.FILL, ".").concat(featureIndex),
"data-type": _constants.ELEMENT_TYPE.FILL,
"data-feature-index": featureIndex,
style: _objectSpread({}, style, {
stroke: 'none'
}),
d: path
});
});
_defineProperty(_assertThisInitialized(_this), "_renderTentativeFeature", function (feature, cursorEditHandle) {
var featureStyle = _this.props.featureStyle;
var coordinates = feature.geometry.coordinates,
renderType = feature.properties.renderType;
if (!coordinates || coordinates.length < 2) {
return null;
} // >= 2 coordinates
var firstCoords = coordinates[0];
var lastCoords = coordinates[coordinates.length - 1];
var uncommittedStyle = _this._getStyleProp(featureStyle, {
feature: feature,
index: null,
state: _constants.RENDER_STATE.UNCOMMITTED
});
var committedPath;
var uncommittedPath;
var closingPath;
var fill = _this._renderFill('tentative', coordinates, uncommittedStyle);
switch (renderType) {
case _constants.RENDER_TYPE.LINE_STRING:
case _constants.RENDER_TYPE.POLYGON:
var committedStyle = _this._getStyleProp(featureStyle, {
feature: feature,
state: _constants.RENDER_STATE.SELECTED
});
if (cursorEditHandle) {
var cursorCoords = coordinates[coordinates.length - 2];
committedPath = _this._renderSegments('tentative', coordinates.slice(0, coordinates.length - 1), committedStyle);
uncommittedPath = _this._renderSegment('tentative-uncommitted', coordinates.length - 2, [cursorCoords, lastCoords], uncommittedStyle);
} else {
committedPath = _this._renderSegments('tentative', coordinates, committedStyle);
}
if (renderType === _constants.RENDER_TYPE.POLYGON) {
var closingStyle = _this._getStyleProp(featureStyle, {
feature: feature,
index: null,
state: _constants.RENDER_STATE.CLOSING
});
closingPath = _this._renderSegment('tentative-closing', coordinates.length - 1, [lastCoords, firstCoords], closingStyle);
}
break;
case _constants.RENDER_TYPE.RECTANGLE:
uncommittedPath = _this._renderSegments('tentative', [].concat(_toConsumableArray(coordinates), [firstCoords]), uncommittedStyle);
break;
default:
}
return [fill, committedPath, uncommittedPath, closingPath].filter(Boolean);
});
_defineProperty(_assertThisInitialized(_this), "_renderGuides", function (_ref) {
var tentativeFeature = _ref.tentativeFeature,
editHandles = _ref.editHandles;
var features = _this.getFeatures();
var cursorEditHandle = editHandles.find(function (f) {
return f.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE;
});
return _react["default"].createElement("g", {
key: "feature-guides"
}, tentativeFeature && _this._renderTentativeFeature(tentativeFeature, cursorEditHandle), editHandles && editHandles.map(function (editHandle) {
var feature = features && features[editHandle.properties.featureIndex] || tentativeFeature;
return _this._renderEditHandle(editHandle, feature);
}));
});
_defineProperty(_assertThisInitialized(_this), "_renderPoint", function (feature, index, path) {
var renderState = _this._getFeatureRenderState(index);
var _this$props2 = _this.props,
featureStyle = _this$props2.featureStyle,
featureShape = _this$props2.featureShape,
clickRadius = _this$props2.clickRadius;
var shape = _this._getStyleProp(featureShape, {
feature: feature,
index: index,
state: renderState
});
var style = _this._getStyleProp(featureStyle, {
feature: feature,
index: index,
state: renderState
});
var elemKey = "feature.".concat(index);
if (shape === 'rect') {
return _react["default"].createElement("g", {
key: elemKey,
transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
}, _react["default"].createElement("rect", {
"data-type": _constants.ELEMENT_TYPE.FEATURE,
"data-feature-index": index,
key: "".concat(elemKey, ".hidden"),
style: _objectSpread({}, style, {
width: clickRadius,
height: clickRadius,
fill: '#000',
fillOpacity: 0
})
}), _react["default"].createElement("rect", {
"data-type": _constants.ELEMENT_TYPE.FEATURE,
"data-feature-index": index,
key: elemKey,
style: style
}));
}
return _react["default"].createElement("g", {
key: "feature.".concat(index),
transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
}, _react["default"].createElement("circle", {
"data-type": _constants.ELEMENT_TYPE.FEATURE,
"data-feature-index": index,
key: "".concat(elemKey, ".hidden"),
style: _objectSpread({}, style, {
opacity: 0
}),
cx: 0,
cy: 0,
r: clickRadius
}), _react["default"].createElement("circle", {
"data-type": _constants.ELEMENT_TYPE.FEATURE,
"data-feature-index": index,
key: elemKey,
style: style,
cx: 0,
cy: 0
}));
});
_defineProperty(_assertThisInitialized(_this), "_renderPath", function (feature, index, path) {
var _this$props3 = _this.props,
featureStyle = _this$props3.featureStyle,
clickRadius = _this$props3.clickRadius;
var selectedFeatureIndex = _this._getSelectedFeatureIndex();
var selected = index === selectedFeatureIndex;
var renderState = _this._getFeatureRenderState(index);
var style = _this._getStyleProp(featureStyle, {
feature: feature,
index: index,
state: renderState
});
var elemKey = "feature.".concat(index);
if (selected) {
return _react["default"].createElement("g", {
key: elemKey
}, _this._renderSegments(index, feature.geometry.coordinates, style));
} // first <path> is to make path easily interacted with
return _react["default"].createElement("g", {
key: elemKey
}, _react["default"].createElement("path", {
"data-type": _constants.ELEMENT_TYPE.FEATURE,
"data-feature-index": index,
key: "".concat(elemKey, ".hidden"),
style: _objectSpread({}, style, {
strokeWidth: clickRadius,
opacity: 0
}),
d: path
}), _react["default"].createElement("path", {
"data-type": _constants.ELEMENT_TYPE.FEATURE,
"data-feature-index": index,
key: elemKey,
style: style,
d: path
}));
});
_defineProperty(_assertThisInitialized(_this), "_renderPolygon", function (feature, index, path) {
var featureStyle = _this.props.featureStyle;
var selectedFeatureIndex = _this._getSelectedFeatureIndex();
var selected = index === selectedFeatureIndex;
var renderState = _this._getFeatureRenderState(index);
var style = _this._getStyleProp(featureStyle, {
feature: feature,
index: index,
state: renderState
});
var elemKey = "feature.".concat(index);
if (selected) {
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates) {
return null;
}
return _react["default"].createElement("g", {
key: elemKey
}, _this._renderFill(index, coordinates, style), _this._renderSegments(index, coordinates, style));
}
return _react["default"].createElement("path", {
"data-type": _constants.ELEMENT_TYPE.FEATURE,
"data-feature-index": index,
key: elemKey,
style: style,
d: path
});
});
_defineProperty(_assertThisInitialized(_this), "_renderFeature", function (feature, index) {
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates || !coordinates.length) {
return null;
}
var renderType = feature.properties.renderType,
type = feature.geometry.type;
var path = _this._getPathInScreenCoords(coordinates, type);
if (!path) {
return null;
}
switch (renderType) {
case _constants.RENDER_TYPE.POINT:
return _this._renderPoint(feature, index, path);
case _constants.RENDER_TYPE.LINE_STRING:
return _this._renderPath(feature, index, path);
case _constants.RENDER_TYPE.POLYGON:
case _constants.RENDER_TYPE.RECTANGLE:
return _this._renderPolygon(feature, index, path);
default:
return null;
}
});
_defineProperty(_assertThisInitialized(_this), "_renderCanvas", function () {
var features = _this.getFeatures();
var guides = _this._modeHandler && _this._modeHandler.getGuides(_this.getModeProps());
return _react["default"].createElement("svg", {
key: "draw-canvas",
width: "100%",
height: "100%"
}, features && features.length > 0 && _react["default"].createElement("g", {
key: "feature-group"
}, features.map(_this._renderFeature)), guides && _react["default"].createElement("g", {
key: "feature-guides"
}, _this._renderGuides(guides)));
});
_defineProperty(_assertThisInitialized(_this), "_renderEditor", function () {
var viewport = _this._context && _this._context.viewport || {};
if (!_this._context) return null;
var style = _this.props.style;
var width = viewport.width,
height = viewport.height;
return _react["default"].createElement("div", {
id: "editor",
style: _objectSpread({
width: width,
height: height
}, style),
ref: function ref(_) {
_this._containerRef = _;
}
}, _this._renderCanvas());
});
return _this;
}
_createClass(Editor, [{
key: "_getPathInScreenCoords",
/* HELPERS */
value: function _getPathInScreenCoords(coordinates, type) {
var _this2 = this;
if (coordinates.length === 0) {
return '';
}
var screenCoords = coordinates.map(function (p) {
return _this2.project(p);
});
var pathString = '';
switch (type) {
case _constants.GEOJSON_TYPE.POINT:
return screenCoords;
case _constants.GEOJSON_TYPE.LINE_STRING:
pathString = screenCoords.map(function (p) {
return "".concat(p[0], ",").concat(p[1]);
}).join('L');
return "M ".concat(pathString);
case _constants.GEOJSON_TYPE.POLYGON:
pathString = screenCoords.map(function (p) {
return "".concat(p[0], ",").concat(p[1]);
}).join('L');
return "M ".concat(pathString, " z");
default:
return null;
}
}
}, {
key: "render",
value: function render() {
return _get(_getPrototypeOf(Editor.prototype), "render", this).call(this, this._renderEditor());
}
}]);
return Editor;
}(_modeHandler["default"]);
exports["default"] = Editor;
_defineProperty(Editor, "defaultProps", defaultProps);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IuanMiXSwibmFtZXMiOlsiZGVmYXVsdFByb3BzIiwiTW9kZUhhbmRsZXIiLCJjbGlja1JhZGl1cyIsImZlYXR1cmVTaGFwZSIsImVkaXRIYW5kbGVTaGFwZSIsImVkaXRIYW5kbGVTdHlsZSIsImRlZmF1bHRFZGl0SGFuZGxlU3R5bGUiLCJmZWF0dXJlU3R5bGUiLCJkZWZhdWx0RmVhdHVyZVN0eWxlIiwiRWRpdG9yIiwiZWRpdEhhbmRsZSIsInJlbmRlclN0YXRlIiwic3RhdGUiLCJwb2ludGVyRG93blBpY2tzIiwiaG92ZXJlZCIsImVkaXRIYW5kbGVJbmRleCIsInByb3BlcnRpZXMiLCJwb3NpdGlvbkluZGV4ZXMiLCJkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCIsInBpY2tlZE9iamVjdCIsIm9iamVjdCIsImd1aWRlVHlwZSIsIkdVSURFX1RZUEUiLCJFRElUX0hBTkRMRSIsImluZGV4IiwiUkVOREVSX1NUQVRFIiwiU0VMRUNURUQiLCJ0eXBlIiwiRUxFTUVOVF9UWVBFIiwiSE9WRVJFRCIsIkNVUlNPUl9FRElUX0hBTkRMRSIsIkNMT1NJTkciLCJJTkFDVElWRSIsInNlbGVjdGVkRmVhdHVyZUluZGV4IiwiX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4IiwiRkVBVFVSRSIsImZlYXR1cmVJbmRleCIsInN0eWxlUHJvcCIsInBhcmFtcyIsImZlYXR1cmUiLCJjb29yZGluYXRlcyIsInAiLCJwcm9qZWN0IiwicHJvcHMiLCJzaGFwZSIsIl9nZXRTdHlsZVByb3AiLCJfZ2V0RWRpdEhhbmRsZVN0YXRlIiwic3R5bGUiLCJwb2ludGVyRXZlbnRzIiwiZWxlbUtleSIsInN0cm9rZSIsImZpbGwiLCJmaWxsT3BhY2l0eSIsImhlaWdodCIsIndpZHRoIiwicGF0aCIsIl9nZXRQYXRoSW5TY3JlZW5Db29yZHMiLCJHRU9KU09OX1RZUEUiLCJMSU5FX1NUUklORyIsInJhZGl1cyIsIm90aGVycyIsIlNFR01FTlQiLCJzdHJva2VXaWR0aCIsIm9wYWNpdHkiLCJzZWdtZW50cyIsImkiLCJsZW5ndGgiLCJwdXNoIiwiX3JlbmRlclNlZ21lbnQiLCJQT0xZR09OIiwiRklMTCIsImN1cnNvckVkaXRIYW5kbGUiLCJnZW9tZXRyeSIsInJlbmRlclR5cGUiLCJmaXJzdENvb3JkcyIsImxhc3RDb29yZHMiLCJ1bmNvbW1pdHRlZFN0eWxlIiwiVU5DT01NSVRURUQiLCJjb21taXR0ZWRQYXRoIiwidW5jb21taXR0ZWRQYXRoIiwiY2xvc2luZ1BhdGgiLCJfcmVuZGVyRmlsbCIsIlJFTkRFUl9UWVBFIiwiY29tbWl0dGVkU3R5bGUiLCJjdXJzb3JDb29yZHMiLCJfcmVuZGVyU2VnbWVudHMiLCJzbGljZSIsImNsb3NpbmdTdHlsZSIsIlJFQ1RBTkdMRSIsImZpbHRlciIsIkJvb2xlYW4iLCJ0ZW50YXRpdmVGZWF0dXJlIiwiZWRpdEhhbmRsZXMiLCJmZWF0dXJlcyIsImdldEZlYXR1cmVzIiwiZmluZCIsImYiLCJfcmVuZGVyVGVudGF0aXZlRmVhdHVyZSIsIm1hcCIsIl9yZW5kZXJFZGl0SGFuZGxlIiwiX2dldEZlYXR1cmVSZW5kZXJTdGF0ZSIsInNlbGVjdGVkIiwiUE9JTlQiLCJfcmVuZGVyUG9pbnQiLCJfcmVuZGVyUGF0aCIsIl9yZW5kZXJQb2x5Z29uIiwiZ3VpZGVzIiwiX21vZGVIYW5kbGVyIiwiZ2V0R3VpZGVzIiwiZ2V0TW9kZVByb3BzIiwiX3JlbmRlckZlYXR1cmUiLCJfcmVuZGVyR3VpZGVzIiwidmlld3BvcnQiLCJfY29udGV4dCIsIl8iLCJfY29udGFpbmVyUmVmIiwiX3JlbmRlckNhbnZhcyIsInNjcmVlbkNvb3JkcyIsInBhdGhTdHJpbmciLCJqb2luIiwiX3JlbmRlckVkaXRvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUtBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLElBQU1BLFlBQVkscUJBQ2JDLHdCQUFZRCxZQURDO0FBRWhCRSxFQUFB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LE9BQWpCLENBQXJCO0FBRUEsVUFBSTZFLFVBQVUsR0FBRyxFQUFqQjs7QUFDQSxjQUFRM0YsSUFBUjtBQUNFLGFBQUs4Qix3QkFBYTZDLEtBQWxCO0FBQ0UsaUJBQU9lLFlBQVA7O0FBRUYsYUFBSzVELHdCQUFhQyxXQUFsQjtBQUNFNEQsVUFBQUEsVUFBVSxHQUFHRCxZQUFZLENBQUNuQixHQUFiLENBQWlCLFVBQUF6RCxDQUFDO0FBQUEsNkJBQU9BLENBQUMsQ0FBQyxDQUFELENBQVIsY0FBZUEsQ0FBQyxDQUFDLENBQUQsQ0FBaEI7QUFBQSxXQUFsQixFQUF5QzhFLElBQXpDLENBQThDLEdBQTlDLENBQWI7QUFDQSw2QkFBWUQsVUFBWjs7QUFFRixhQUFLN0Qsd0JBQWFZLE9BQWxCO0FBRUVpRCxVQUFBQSxVQUFVLEdBQUdELFlBQVksQ0FBQ25CLEdBQWIsQ0FBaUIsVUFBQXpELENBQUM7QUFBQSw2QkFBT0EsQ0FBQyxDQUFDLENBQUQsQ0FBUixjQUFlQSxDQUFDLENBQUMsQ0FBRCxDQUFoQjtBQUFBLFdBQWxCLEVBQXlDOEUsSUFBekMsQ0FBOEMsR0FBOUMsQ0FBYjtBQUNBLDZCQUFZRCxVQUFaOztBQUVGO0FBQ0UsaUJBQU8sSUFBUDtBQWRKO0FBZ0JEOzs7NkJBZ2dCUTtBQUNQLGdGQUFvQixLQUFLRSxhQUFMLEVBQXBCO0FBQ0Q7Ozs7RUE3aEJpQ3ZILHVCOzs7O2dCQUFmUSxNLGtCQUNHVCxZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSAnQG5lYnVsYS5nbC9lZGl0LW1vZGVzJztcbmltcG9ydCB0eXBlIHsgR2VvSnNvblR5cGUsIFJlbmRlclN0YXRlLCBJZCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBSRU5ERVJfU1RBVEUsIFJFTkRFUl9UWVBFLCBHRU9KU09OX1RZUEUsIEdVSURFX1RZUEUsIEVMRU1FTlRfVFlQRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBNb2RlSGFuZGxlciBmcm9tICcuL21vZGUtaGFuZGxlcic7XG5pbXBvcnQgeyBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMgfSBmcm9tICcuL2VkaXQtbW9kZXMvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBlZGl0SGFuZGxlU3R5bGUgYXMgZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlIGFzIGRlZmF1bHRGZWF0dXJlU3R5bGVcbn0gZnJvbSAnLi9zdHlsZSc7XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgLi4uTW9kZUhhbmRsZXIuZGVmYXVsdFByb3BzLFxuICBjbGlja1JhZGl1czogMCxcbiAgZmVhdHVyZVNoYXBlOiAnY2lyY2xlJyxcbiAgZWRpdEhhbmRsZVNoYXBlOiAncmVjdCcsXG4gIGVkaXRIYW5kbGVTdHlsZTogZGVmYXVsdEVkaXRIYW5kbGVTdHlsZSxcbiAgZmVhdHVyZVN0eWxlOiBkZWZhdWx0RmVhdHVyZVN0eWxlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0b3IgZXh0ZW5kcyBNb2RlSGFuZGxlciB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbiAgLyogSEVMUEVSUyAqL1xuICBfZ2V0UGF0aEluU2NyZWVuQ29vcmRzKGNvb3JkaW5hdGVzOiBhbnksIHR5cGU6IEdlb0pzb25UeXBlKSB7XG4gICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBzY3JlZW5Db29yZHMgPSBjb29yZGluYXRlcy5tYXAocCA9PiB0aGlzLnByb2plY3QocCkpO1xuXG4gICAgbGV0IHBhdGhTdHJpbmcgPSAnJztcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLlBPSU5UOlxuICAgICAgICByZXR1cm4gc2NyZWVuQ29vcmRzO1xuXG4gICAgICBjYXNlIEdFT0pTT05fVFlQRS5MSU5FX1NUUklORzpcbiAgICAgICAgcGF0aFN0cmluZyA9IHNjcmVlbkNvb3Jkcy5tYXAocCA9PiBgJHtwWzBdfSwke3BbMV19YCkuam9pbignTCcpO1xuICAgICAgICByZXR1cm4gYE0gJHtwYXRoU3RyaW5nfWA7XG5cbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLlBPTFlHT046XG5cbiAgICAgICAgcGF0aFN0cmluZyA9IHNjcmVlbkNvb3Jkcy5tYXAocCA9PiBgJHtwWzBdfSwke3BbMV19YCkuam9pbignTCcpO1xuICAgICAgICByZXR1cm4gYE0gJHtwYXRoU3RyaW5nfSB6YDtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2dldEVkaXRIYW5kbGVTdGF0ZSA9IChlZGl0SGFuZGxlOiBGZWF0dXJlLCByZW5kZXJTdGF0ZTogP3N0cmluZykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRlckRvd25QaWNrcywgaG92ZXJlZCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChyZW5kZXJTdGF0ZSkge1xuICAgICAgcmV0dXJuIHJlbmRlclN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGVkaXRIYW5kbGVJbmRleCA9IGVkaXRIYW5kbGUucHJvcGVydGllcy5wb3NpdGlvbkluZGV4ZXNbMF07XG4gICAgbGV0IGRyYWdnaW5nRWRpdEhhbmRsZUluZGV4ID0gbnVsbDtcbiAgICBjb25zdCBwaWNrZWRPYmplY3QgPSBwb2ludGVyRG93blBpY2tzICYmIHBvaW50ZXJEb3duUGlja3NbMF0gJiYgcG9pbnRlckRvd25QaWNrc1swXS5vYmplY3Q7XG4gICAgaWYgKHBpY2tlZE9iamVjdCAmJiBwaWNrZWRPYmplY3QuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkVESVRfSEFORExFKSB7XG4gICAgICBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCA9IHBpY2tlZE9iamVjdC5pbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZWRpdEhhbmRsZUluZGV4ID09PSBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCkge1xuICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5TRUxFQ1RFRDtcbiAgICB9XG5cbiAgICBpZiAoaG92ZXJlZCAmJiBob3ZlcmVkLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5FRElUX0hBTkRMRSkge1xuICAgICAgaWYgKGhvdmVyZWQuaW5kZXggPT09IGVkaXRIYW5kbGVJbmRleCkge1xuICAgICAgICByZXR1cm4gUkVOREVSX1NUQVRFLkhPVkVSRUQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGN1cnNvciBob3ZlcmVkIG9uIGZpcnN0IHZlcnRleCB3aGVuIGRyYXdpbmcgcG9seWdvblxuICAgICAgaWYgKFxuICAgICAgICBob3ZlcmVkLmluZGV4ID09PSAwICYmXG4gICAgICAgIGVkaXRIYW5kbGUucHJvcGVydGllcy5ndWlkZVR5cGUgPT09IEdVSURFX1RZUEUuQ1VSU09SX0VESVRfSEFORExFXG4gICAg