tmp-react-map-gl-draw
Version:
A lite version editing layer with react
112 lines (88 loc) • 13.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isNumeric = isNumeric;
exports.parseEventElement = parseEventElement;
exports.getScreenCoords = getScreenCoords;
exports.findClosestPointOnLineSegment = findClosestPointOnLineSegment;
exports.getFeatureCoordinates = getFeatureCoordinates;
exports.updateRectanglePosition = updateRectanglePosition;
var _constants = require("../constants");
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 isNumeric(val) {
return !Array.isArray(val) && !isNaN(parseFloat(val)) && isFinite(val);
}
function parseEventElement(evt) {
var elem = evt.target;
if (!elem || !elem.dataset || !elem.dataset.type) {
return null;
}
var type = elem.dataset.type;
var featureIndex = elem.dataset.featureIndex;
var index = elem.dataset.index;
return {
object: {
type: type,
index: isNumeric(index) ? Number(index) : undefined,
featureIndex: isNumeric(featureIndex) ? Number(featureIndex) : undefined
},
index: index
};
}
function getScreenCoords(evt) {
var _evt$offsetCenter = evt.offsetCenter,
x = _evt$offsetCenter.x,
y = _evt$offsetCenter.y;
return [Number(x), Number(y)];
}
function findClosestPointOnLineSegment(p1, p2, p) {
// line
var k = (p2[1] - p1[1]) / (p2[0] - p1[0]);
var b = p1[1] - k * p1[0]; // vertical line
if (!isFinite(k)) {
var q = [p1[0], p[1]];
return inBounds(p1, p2, q) ? q : null;
} // p is on line [p1, p2]
if (p[0] * k + b - p[1] === 0) {
return inBounds(p1, p2, p) ? p : null;
}
var qx = (k * p[1] + p[0] - k * b) / (k * k + 1);
var qy = k * qx + b;
return inBounds(p1, p2, [qx, qy]) ? [qx, qy] : null;
}
function getFeatureCoordinates(feature) {
var coordinates = feature && feature.geometry && feature.geometry.coordinates;
if (!coordinates) {
return null;
}
var isPolygonal = feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON;
return isPolygonal ? coordinates[0] : coordinates;
}
function updateRectanglePosition(feature, editHandleIndex, mapCoords) {
var coordinates = getFeatureCoordinates(feature);
if (!coordinates) {
return null;
}
var points = coordinates.slice(0, 4);
points[editHandleIndex % 4] = mapCoords;
/*
* p0.x, p0.y (p0) ------ p2.x, p0.y (p1)
* | |
* | |
* p0.x, p2.y (p3) ----- p2.x, p2.y (p2)
*/
var p0 = points[(editHandleIndex + 2) % 4];
var p2 = points[editHandleIndex % 4];
points[(editHandleIndex + 1) % 4] = [p2[0], p0[1]];
points[(editHandleIndex + 3) % 4] = [p0[0], p2[1]];
return feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON ? [[].concat(_toConsumableArray(points), [points[0]])] : points;
}
function inBounds(p1, p2, p) {
var bounds = [Math.min(p1[0], p2[0]), Math.max(p1[0], p2[0]), Math.min(p1[1], p2[1]), Math.max(p1[1], p2[1])];
return p[0] >= bounds[0] && p[0] <= bounds[1] && p[1] >= bounds[2] && p[1] <= bounds[3];
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0LW1vZGVzL3V0aWxzLmpzIl0sIm5hbWVzIjpbImlzTnVtZXJpYyIsInZhbCIsIkFycmF5IiwiaXNBcnJheSIsImlzTmFOIiwicGFyc2VGbG9hdCIsImlzRmluaXRlIiwicGFyc2VFdmVudEVsZW1lbnQiLCJldnQiLCJlbGVtIiwidGFyZ2V0IiwiZGF0YXNldCIsInR5cGUiLCJmZWF0dXJlSW5kZXgiLCJpbmRleCIsIm9iamVjdCIsIk51bWJlciIsInVuZGVmaW5lZCIsImdldFNjcmVlbkNvb3JkcyIsIm9mZnNldENlbnRlciIsIngiLCJ5IiwiZmluZENsb3Nlc3RQb2ludE9uTGluZVNlZ21lbnQiLCJwMSIsInAyIiwicCIsImsiLCJiIiwicSIsImluQm91bmRzIiwicXgiLCJxeSIsImdldEZlYXR1cmVDb29yZGluYXRlcyIsImZlYXR1cmUiLCJjb29yZGluYXRlcyIsImdlb21ldHJ5IiwiaXNQb2x5Z29uYWwiLCJHRU9KU09OX1RZUEUiLCJQT0xZR09OIiwidXBkYXRlUmVjdGFuZ2xlUG9zaXRpb24iLCJlZGl0SGFuZGxlSW5kZXgiLCJtYXBDb29yZHMiLCJwb2ludHMiLCJzbGljZSIsInAwIiwiYm91bmRzIiwiTWF0aCIsIm1pbiIsIm1heCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBS0E7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxTQUFULENBQW1CQyxHQUFuQixFQUE2QjtBQUNsQyxTQUFPLENBQUNDLEtBQUssQ0FBQ0MsT0FBTixDQUFjRixHQUFkLENBQUQsSUFBdUIsQ0FBQ0csS0FBSyxDQUFDQyxVQUFVLENBQUNKLEdBQUQsQ0FBWCxDQUE3QixJQUFrREssUUFBUSxDQUFDTCxHQUFELENBQWpFO0FBQ0Q7O0FBRU0sU0FBU00saUJBQVQsQ0FBMkJDLEdBQTNCLEVBQThDO0FBQ25ELE1BQU1DLElBQUksR0FBR0QsR0FBRyxDQUFDRSxNQUFqQjs7QUFDQSxNQUFJLENBQUNELElBQUQsSUFBUyxDQUFDQSxJQUFJLENBQUNFLE9BQWYsSUFBMEIsQ0FBQ0YsSUFBSSxDQUFDRSxPQUFMLENBQWFDLElBQTVDLEVBQWtEO0FBQ2hELFdBQU8sSUFBUDtBQUNEOztBQUVELE1BQU1BLElBQUksR0FBR0gsSUFBSSxDQUFDRSxPQUFMLENBQWFDLElBQTFCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHSixJQUFJLENBQUNFLE9BQUwsQ0FBYUUsWUFBbEM7QUFDQSxNQUFNQyxLQUFLLEdBQUdMLElBQUksQ0FBQ0UsT0FBTCxDQUFhRyxLQUEzQjtBQUVBLFNBQU87QUFDTEMsSUFBQUEsTUFBTSxFQUFFO0FBQ05ILE1BQUFBLElBQUksRUFBSkEsSUFETTtBQUVORSxNQUFBQSxLQUFLLEVBQUVkLFNBQVMsQ0FBQ2MsS0FBRCxDQUFULEdBQW1CRSxNQUFNLENBQUNGLEtBQUQsQ0FBekIsR0FBbUNHLFNBRnBDO0FBR05KLE1BQUFBLFlBQVksRUFBRWIsU0FBUyxDQUFDYSxZQUFELENBQVQsR0FBMEJHLE1BQU0sQ0FBQ0gsWUFBRCxDQUFoQyxHQUFpREk7QUFIekQsS0FESDtBQU1MSCxJQUFBQSxLQUFLLEVBQUxBO0FBTkssR0FBUDtBQVFEOztBQUVNLFNBQVNJLGVBQVQsQ0FBeUJWLEdBQXpCLEVBQTRDO0FBQUEsMEJBRzdDQSxHQUg2QyxDQUUvQ1csWUFGK0M7QUFBQSxNQUUvQkMsQ0FGK0IscUJBRS9CQSxDQUYrQjtBQUFBLE1BRTVCQyxDQUY0QixxQkFFNUJBLENBRjRCO0FBSWpELFNBQU8sQ0FBQ0wsTUFBTSxDQUFDSSxDQUFELENBQVAsRUFBWUosTUFBTSxDQUFDSyxDQUFELENBQWxCLENBQVA7QUFDRDs7QUFFTSxTQUFTQyw2QkFBVCxDQUF1Q0MsRUFBdkMsRUFBcURDLEVBQXJELEVBQW1FQyxDQUFuRSxFQUFnRjtBQUNyRjtBQUNBLE1BQU1DLENBQUMsR0FBRyxDQUFDRixFQUFFLENBQUMsQ0FBRCxDQUFGLEdBQVFELEVBQUUsQ0FBQyxDQUFELENBQVgsS0FBbUJDLEVBQUUsQ0FBQyxDQUFELENBQUYsR0FBUUQsRUFBRSxDQUFDLENBQUQsQ0FBN0IsQ0FBVjtBQUNBLE1BQU1JLENBQUMsR0FBR0osRUFBRSxDQUFDLENBQUQsQ0FBRixHQUFRRyxDQUFDLEdBQUdILEVBQUUsQ0FBQyxDQUFELENBQXhCLENBSHFGLENBS3JGOztBQUNBLE1BQUksQ0FBQ2pCLFFBQVEsQ0FBQ29CLENBQUQsQ0FBYixFQUFrQjtBQUNoQixRQUFNRSxDQUFDLEdBQUcsQ0FBQ0wsRUFBRSxDQUFDLENBQUQsQ0FBSCxFQUFRRSxDQUFDLENBQUMsQ0FBRCxDQUFULENBQVY7QUFDQSxXQUFPSSxRQUFRLENBQUNOLEVBQUQsRUFBS0MsRUFBTCxFQUFTSSxDQUFULENBQVIsR0FBc0JBLENBQXRCLEdBQTBCLElBQWpDO0FBQ0QsR0FUb0YsQ0FXckY7OztBQUNBLE1BQUlILENBQUMsQ0FBQyxDQUFELENBQUQsR0FBT0MsQ0FBUCxHQUFXQyxDQUFYLEdBQWVGLENBQUMsQ0FBQyxDQUFELENBQWhCLEtBQXdCLENBQTVCLEVBQStCO0FBQzdCLFdBQU9JLFFBQVEsQ0FBQ04sRUFBRCxFQUFLQyxFQUFMLEVBQVNDLENBQVQsQ0FBUixHQUFzQkEsQ0FBdEIsR0FBMEIsSUFBakM7QUFDRDs7QUFFRCxNQUFNSyxFQUFFLEdBQUcsQ0FBQ0osQ0FBQyxHQUFHRCxDQUFDLENBQUMsQ0FBRCxDQUFMLEdBQVdBLENBQUMsQ0FBQyxDQUFELENBQVosR0FBa0JDLENBQUMsR0FBR0MsQ0FBdkIsS0FBNkJELENBQUMsR0FBR0EsQ0FBSixHQUFRLENBQXJDLENBQVg7QUFDQSxNQUFNSyxFQUFFLEdBQUdMLENBQUMsR0FBR0ksRUFBSixHQUFTSCxDQUFwQjtBQUVBLFNBQU9FLFFBQVEsQ0FBQ04sRUFBRCxFQUFLQyxFQUFMLEVBQVMsQ0FBQ00sRUFBRCxFQUFLQyxFQUFMLENBQVQsQ0FBUixHQUE2QixDQUFDRCxFQUFELEVBQUtDLEVBQUwsQ0FBN0IsR0FBd0MsSUFBL0M7QUFDRDs7QUFFTSxTQUFTQyxxQkFBVCxDQUErQkMsT0FBL0IsRUFBaUQ7QUFDdEQsTUFBTUMsV0FBVyxHQUFHRCxPQUFPLElBQUlBLE9BQU8sQ0FBQ0UsUUFBbkIsSUFBK0JGLE9BQU8sQ0FBQ0UsUUFBUixDQUFpQkQsV0FBcEU7O0FBQ0EsTUFBSSxDQUFDQSxXQUFMLEVBQWtCO0FBQ2hCLFdBQU8sSUFBUDtBQUNEOztBQUVELE1BQU1FLFdBQVcsR0FBR0gsT0FBTyxDQUFDRSxRQUFSLENBQWlCdkIsSUFBakIsS0FBMEJ5Qix3QkFBYUMsT0FBM0Q7QUFDQSxTQUFPRixXQUFXLEdBQUdGLFdBQVcsQ0FBQyxDQUFELENBQWQsR0FBb0JBLFdBQXRDO0FBQ0Q7O0FBRU0sU0FBU0ssdUJBQVQsQ0FDTE4sT0FESyxFQUVMTyxlQUZLLEVBR0xDLFNBSEssRUFJTDtBQUNBLE1BQU1QLFdBQVcsR0FBR0YscUJBQXFCLENBQUNDLE9BQUQsQ0FBekM7O0FBQ0EsTUFBSSxDQUFDQyxXQUFMLEVBQWtCO0FBQ2hCLFdBQU8sSUFBUDtBQUNEOztBQUVELE1BQU1RLE1BQU0sR0FBR1IsV0FBVyxDQUFDUyxLQUFaLENBQWtCLENBQWxCLEVBQXFCLENBQXJCLENBQWY7QUFDQUQsRUFBQUEsTUFBTSxDQUFDRixlQUFlLEdBQUcsQ0FBbkIsQ0FBTixHQUE4QkMsU0FBOUI7QUFFQTs7Ozs7OztBQU1BLE1BQU1HLEVBQUUsR0FBR0YsTUFBTSxDQUFDLENBQUNGLGVBQWUsR0FBRyxDQUFuQixJQUF3QixDQUF6QixDQUFqQjtBQUNBLE1BQU1oQixFQUFFLEdBQUdrQixNQUFNLENBQUNGLGVBQWUsR0FBRyxDQUFuQixDQUFqQjtBQUNBRSxFQUFBQSxNQUFNLENBQUMsQ0FBQ0YsZUFBZSxHQUFHLENBQW5CLElBQXdCLENBQXpCLENBQU4sR0FBb0MsQ0FBQ2hCLEVBQUUsQ0FBQyxDQUFELENBQUgsRUFBUW9CLEVBQUUsQ0FBQyxDQUFELENBQVYsQ0FBcEM7QUFDQUYsRUFBQUEsTUFBTSxDQUFDLENBQUNGLGVBQWUsR0FBRyxDQUFuQixJQUF3QixDQUF6QixDQUFOLEdBQW9DLENBQUNJLEVBQUUsQ0FBQyxDQUFELENBQUgsRUFBUXBCLEVBQUUsQ0FBQyxDQUFELENBQVYsQ0FBcEM7QUFFQSxTQUFPUyxPQUFPLENBQUNFLFFBQVIsQ0FBaUJ2QixJQUFqQixLQUEwQnlCLHdCQUFhQyxPQUF2QyxHQUFpRCw4QkFBS0ksTUFBTCxJQUFhQSxNQUFNLENBQUMsQ0FBRCxDQUFuQixHQUFqRCxHQUE0RUEsTUFBbkY7QUFDRDs7QUFFRCxTQUFTYixRQUFULENBQWtCTixFQUFsQixFQUFnQ0MsRUFBaEMsRUFBOENDLENBQTlDLEVBQTJEO0FBQ3pELE1BQU1vQixNQUFNLEdBQUcsQ0FDYkMsSUFBSSxDQUFDQyxHQUFMLENBQVN4QixFQUFFLENBQUMsQ0FBRCxDQUFYLEVBQWdCQyxFQUFFLENBQUMsQ0FBRCxDQUFsQixDQURhLEVBRWJzQixJQUFJLENBQUNFLEdBQUwsQ0FBU3pCLEVBQUUsQ0FBQyxDQUFELENBQVgsRUFBZ0JDLEVBQUUsQ0FBQyxDQUFELENBQWxCLENBRmEsRUFHYnNCLElBQUksQ0FBQ0MsR0FBTCxDQUFTeEIsRUFBRSxDQUFDLENBQUQsQ0FBWCxFQUFnQkMsRUFBRSxDQUFDLENBQUQsQ0FBbEIsQ0FIYSxFQUlic0IsSUFBSSxDQUFDRSxHQUFMLENBQVN6QixFQUFFLENBQUMsQ0FBRCxDQUFYLEVBQWdCQyxFQUFFLENBQUMsQ0FBRCxDQUFsQixDQUphLENBQWY7QUFPQSxTQUFPQyxDQUFDLENBQUMsQ0FBRCxDQUFELElBQVFvQixNQUFNLENBQUMsQ0FBRCxDQUFkLElBQXFCcEIsQ0FBQyxDQUFDLENBQUQsQ0FBRCxJQUFRb0IsTUFBTSxDQUFDLENBQUQsQ0FBbkMsSUFBMENwQixDQUFDLENBQUMsQ0FBRCxDQUFELElBQVFvQixNQUFNLENBQUMsQ0FBRCxDQUF4RCxJQUErRHBCLENBQUMsQ0FBQyxDQUFELENBQUQsSUFBUW9CLE1BQU0sQ0FBQyxDQUFELENBQXBGO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7IE1qb2xuaXJFdmVudCB9IGZyb20gJ21qb2xuaXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlLCBQb3NpdGlvbiB9IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5cbmltcG9ydCB7IEdFT0pTT05fVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWModmFsOiBhbnkpIHtcbiAgcmV0dXJuICFBcnJheS5pc0FycmF5KHZhbCkgJiYgIWlzTmFOKHBhcnNlRmxvYXQodmFsKSkgJiYgaXNGaW5pdGUodmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXZlbnRFbGVtZW50KGV2dDogTWpvbG5pckV2ZW50KSB7XG4gIGNvbnN0IGVsZW0gPSBldnQudGFyZ2V0O1xuICBpZiAoIWVsZW0gfHwgIWVsZW0uZGF0YXNldCB8fCAhZWxlbS5kYXRhc2V0LnR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBlbGVtLmRhdGFzZXQudHlwZTtcbiAgY29uc3QgZmVhdHVyZUluZGV4ID0gZWxlbS5kYXRhc2V0LmZlYXR1cmVJbmRleDtcbiAgY29uc3QgaW5kZXggPSBlbGVtLmRhdGFzZXQuaW5kZXg7XG5cbiAgcmV0dXJuIHtcbiAgICBvYmplY3Q6IHtcbiAgICAgIHR5cGUsXG4gICAgICBpbmRleDogaXNOdW1lcmljKGluZGV4KSA/IE51bWJlcihpbmRleCkgOiB1bmRlZmluZWQsXG4gICAgICBmZWF0dXJlSW5kZXg6IGlzTnVtZXJpYyhmZWF0dXJlSW5kZXgpID8gTnVtYmVyKGZlYXR1cmVJbmRleCkgOiB1bmRlZmluZWRcbiAgICB9LFxuICAgIGluZGV4XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JlZW5Db29yZHMoZXZ0OiBNam9sbmlyRXZlbnQpIHtcbiAgY29uc3Qge1xuICAgIG9mZnNldENlbnRlcjogeyB4LCB5IH1cbiAgfSA9IGV2dDtcbiAgcmV0dXJuIFtOdW1iZXIoeCksIE51bWJlcih5KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2xvc2VzdFBvaW50T25MaW5lU2VnbWVudChwMTogUG9zaXRpb24sIHAyOiBQb3NpdGlvbiwgcDogUG9zaXRpb24pIHtcbiAgLy8gbGluZVxuICBjb25zdCBrID0gKHAyWzFdIC0gcDFbMV0pIC8gKHAyWzBdIC0gcDFbMF0pO1xuICBjb25zdCBiID0gcDFbMV0gLSBrICogcDFbMF07XG5cbiAgLy8gdmVydGljYWwgbGluZVxuICBpZiAoIWlzRmluaXRlKGspKSB7XG4gICAgY29uc3QgcSA9IFtwMVswXSwgcFsxXV07XG4gICAgcmV0dXJuIGluQm91bmRzKHAxLCBwMiwgcSkgPyBxIDogbnVsbDtcbiAgfVxuXG4gIC8vIHAgaXMgb24gbGluZSBbcDEsIHAyXVxuICBpZiAocFswXSAqIGsgKyBiIC0gcFsxXSA9PT0gMCkge1xuICAgIHJldHVybiBpbkJvdW5kcyhwMSwgcDIsIHApID8gcCA6IG51bGw7XG4gIH1cblxuICBjb25zdCBxeCA9IChrICogcFsxXSArIHBbMF0gLSBrICogYikgLyAoayAqIGsgKyAxKTtcbiAgY29uc3QgcXkgPSBrICogcXggKyBiO1xuXG4gIHJldHVybiBpbkJvdW5kcyhwMSwgcDIsIFtxeCwgcXldKSA/IFtxeCwgcXldIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVDb29yZGluYXRlcyhmZWF0dXJlOiBGZWF0dXJlKSB7XG4gIGNvbnN0IGNvb3JkaW5hdGVzID0gZmVhdHVyZSAmJiBmZWF0dXJlLmdlb21ldHJ5ICYmIGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGlzUG9seWdvbmFsID0gZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBHRU9KU09OX1RZUEUuUE9MWUdPTjtcbiAgcmV0dXJuIGlzUG9seWdvbmFsID8gY29vcmRpbmF0ZXNbMF0gOiBjb29yZGluYXRlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVJlY3RhbmdsZVBvc2l0aW9uKFxuICBmZWF0dXJlOiBGZWF0dXJlLFxuICBlZGl0SGFuZGxlSW5kZXg6IG51bWJlcixcbiAgbWFwQ29vcmRzOiBQb3NpdGlvblxuKSB7XG4gIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGZlYXR1cmUpO1xuICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwb2ludHMgPSBjb29yZGluYXRlcy5zbGljZSgwLCA0KTtcbiAgcG9pbnRzW2VkaXRIYW5kbGVJbmRleCAlIDRdID0gbWFwQ29vcmRzO1xuXG4gIC8qXG4gICogICBwMC54LCBwMC55IChwMCkgLS0tLS0tIHAyLngsIHAwLnkgKHAxKVxuICAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfFxuICAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfFxuICAqICAgcDAueCwgcDIueSAocDMpIC0tLS0tIHAyLngsIHAyLnkgKHAyKVxuICAqL1xuICBjb25zdCBwMCA9IHBvaW50c1soZWRpdEhhbmRsZUluZGV4ICsgMikgJSA0XTtcbiAgY29uc3QgcDIgPSBwb2ludHNbZWRpdEhhbmRsZUluZGV4ICUgNF07XG4gIHBvaW50c1soZWRpdEhhbmRsZUluZGV4ICsgMSkgJSA0XSA9IFtwMlswXSwgcDBbMV1dO1xuICBwb2ludHNbKGVkaXRIYW5kbGVJbmRleCArIDMpICUgNF0gPSBbcDBbMF0sIHAyWzFdXTtcblxuICByZXR1cm4gZmVhdHVyZS5nZW9tZXRyeS50eXBlID09PSBHRU9KU09OX1RZUEUuUE9MWUdPTiA/IFtbLi4ucG9pbnRzLCBwb2ludHNbMF1dXSA6IHBvaW50cztcbn1cblxuZnVuY3Rpb24gaW5Cb3VuZHMocDE6IFBvc2l0aW9uLCBwMjogUG9zaXRpb24sIHA6IFBvc2l0aW9uKSB7XG4gIGNvbnN0IGJvdW5kcyA9IFtcbiAgICBNYXRoLm1pbihwMVswXSwgcDJbMF0pLFxuICAgIE1hdGgubWF4KHAxWzBdLCBwMlswXSksXG4gICAgTWF0aC5taW4ocDFbMV0sIHAyWzFdKSxcbiAgICBNYXRoLm1heChwMVsxXSwgcDJbMV0pXG4gIF07XG5cbiAgcmV0dXJuIHBbMF0gPj0gYm91bmRzWzBdICYmIHBbMF0gPD0gYm91bmRzWzFdICYmIHBbMV0gPj0gYm91bmRzWzJdICYmIHBbMV0gPD0gYm91bmRzWzNdO1xufVxuIl19