react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
220 lines (182 loc) • 21.5 kB
JavaScript
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
import { Map, List, Record } from 'immutable';
import * as Geometry from './geometry';
export var SNAP_POINT = 'SNAP_POINT';
export var SNAP_LINE = 'SNAP_LINE';
export var SNAP_SEGMENT = 'SNAP_SEGMENT';
export var SNAP_GRID = 'SNAP_GRID';
export var SNAP_MASK = new Map({
SNAP_POINT: true,
SNAP_LINE: true,
SNAP_SEGMENT: true,
SNAP_GRID: false
});
var PointSnap = function (_Record) {
_inherits(PointSnap, _Record);
function PointSnap() {
_classCallCheck(this, PointSnap);
return _possibleConstructorReturn(this, (PointSnap.__proto__ || Object.getPrototypeOf(PointSnap)).apply(this, arguments));
}
_createClass(PointSnap, [{
key: 'nearestPoint',
value: function nearestPoint(x, y) {
return {
x: this.x,
y: this.y,
distance: Geometry.pointsDistance(this.x, this.y, x, y)
};
}
}, {
key: 'isNear',
value: function isNear(x, y, distance) {
return ~(this.x - x) + 1 < distance && ~(this.y - y) + 1 < distance;
}
}]);
return PointSnap;
}(Record({
type: 'point',
x: -1, y: -1,
radius: 1, priority: 1,
related: new List()
}));
var LineSnap = function (_Record2) {
_inherits(LineSnap, _Record2);
function LineSnap() {
_classCallCheck(this, LineSnap);
return _possibleConstructorReturn(this, (LineSnap.__proto__ || Object.getPrototypeOf(LineSnap)).apply(this, arguments));
}
_createClass(LineSnap, [{
key: 'nearestPoint',
value: function nearestPoint(x, y) {
return _extends({}, Geometry.closestPointFromLine(this.a, this.b, this.c, x, y), {
distance: Geometry.distancePointFromLine(this.a, this.b, this.c, x, y)
});
}
}, {
key: 'isNear',
value: function isNear(x, y, distance) {
return true;
}
}]);
return LineSnap;
}(Record({
type: 'line',
a: -1, b: -1, c: -1,
radius: 1, priority: 1,
related: new List()
}));
var LineSegmentSnap = function (_Record3) {
_inherits(LineSegmentSnap, _Record3);
function LineSegmentSnap() {
_classCallCheck(this, LineSegmentSnap);
return _possibleConstructorReturn(this, (LineSegmentSnap.__proto__ || Object.getPrototypeOf(LineSegmentSnap)).apply(this, arguments));
}
_createClass(LineSegmentSnap, [{
key: 'nearestPoint',
value: function nearestPoint(x, y) {
return _extends({}, Geometry.closestPointFromLineSegment(this.x1, this.y1, this.x2, this.y2, x, y), {
distance: Geometry.distancePointFromLineSegment(this.x1, this.y1, this.x2, this.y2, x, y)
});
}
}, {
key: 'isNear',
value: function isNear(x, y, distance) {
return true;
}
}]);
return LineSegmentSnap;
}(Record({
type: 'line-segment',
x1: -1, y1: -1, x2: -1, y2: -1,
radius: 1, priority: 1,
related: new List()
}));
var GridSnap = function (_Record4) {
_inherits(GridSnap, _Record4);
function GridSnap() {
_classCallCheck(this, GridSnap);
return _possibleConstructorReturn(this, (GridSnap.__proto__ || Object.getPrototypeOf(GridSnap)).apply(this, arguments));
}
_createClass(GridSnap, [{
key: 'nearestPoint',
value: function nearestPoint(x, y) {
return {
x: this.x,
y: this.y,
distance: Geometry.pointsDistance(this.x, this.y, x, y)
};
}
}, {
key: 'isNear',
value: function isNear(x, y, distance) {
return ~(this.x - x) + 1 < distance && ~(this.y - y) + 1 < distance;
}
}]);
return GridSnap;
}(Record({
type: 'grid',
x: -1, y: -1,
radius: 1, priority: 1,
related: new List()
}));
export function nearestSnap(snapElements, x, y, snapMask) {
var filter = {
'point': snapMask.get(SNAP_POINT),
'line': snapMask.get(SNAP_LINE),
'line-segment': snapMask.get(SNAP_SEGMENT),
'grid': snapMask.get(SNAP_GRID)
};
return snapElements.valueSeq().filter(function (el) {
return filter[el.type] && el.isNear(x, y, el.radius);
}).map(function (snap) {
return { snap: snap, point: snap.nearestPoint(x, y) };
}).filter(function (_ref) {
var radius = _ref.snap.radius,
distance = _ref.point.distance;
return distance < radius;
}).min(function (_ref2, _ref3) {
var p1 = _ref2.snap.priority,
d1 = _ref2.point.distance;
var p2 = _ref3.snap.priority,
d2 = _ref3.point.distance;
return p1 === p2 ? d1 < d2 ? -1 : 1 : p1 > p2 ? -1 : 1;
});
}
export function addPointSnap(snapElements, x, y, radius, priority, related) {
related = new List([related]);
return snapElements.push(new PointSnap({ x: x, y: y, radius: radius, priority: priority, related: related }));
}
export function addLineSnap(snapElements, a, b, c, radius, priority, related) {
related = new List([related]);
return snapElements.withMutations(function (snapElements) {
var alreadyPresent = snapElements.some(function (lineSnap) {
return lineSnap.type === 'line' && a === lineSnap.a && b === lineSnap.b && c === lineSnap.c;
});
if (alreadyPresent) return snapElements;
var intersections = snapElements.valueSeq().filter(function (snap) {
return snap.type === 'line';
}).map(function (snap) {
return Geometry.intersectionFromTwoLines(snap.a, snap.b, snap.c, a, b, c);
}).filter(function (intersection) {
return intersection !== undefined;
}).forEach(function (_ref4) {
var x = _ref4.x,
y = _ref4.y;
return addPointSnap(snapElements, x, y, 20, 40);
});
snapElements.push(new LineSnap({ a: a, b: b, c: c, radius: radius, priority: priority, related: related }));
});
}
export function addLineSegmentSnap(snapElements, x1, y1, x2, y2, radius, priority, related) {
related = new List([related]);
return snapElements.push(new LineSegmentSnap({ x1: x1, y1: y1, x2: x2, y2: y2, radius: radius, priority: priority, related: related }));
}
export function addGridSnap(snapElements, x, y, radius, priority, related) {
related = new List([related]);
return snapElements.push(new GridSnap({ x: x, y: y, radius: radius, priority: priority, related: related }));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zbmFwLmpzIl0sIm5hbWVzIjpbIk1hcCIsIkxpc3QiLCJSZWNvcmQiLCJHZW9tZXRyeSIsIlNOQVBfUE9JTlQiLCJTTkFQX0xJTkUiLCJTTkFQX1NFR01FTlQiLCJTTkFQX0dSSUQiLCJTTkFQX01BU0siLCJQb2ludFNuYXAiLCJ4IiwieSIsImRpc3RhbmNlIiwicG9pbnRzRGlzdGFuY2UiLCJ0eXBlIiwicmFkaXVzIiwicHJpb3JpdHkiLCJyZWxhdGVkIiwiTGluZVNuYXAiLCJjbG9zZXN0UG9pbnRGcm9tTGluZSIsImEiLCJiIiwiYyIsImRpc3RhbmNlUG9pbnRGcm9tTGluZSIsIkxpbmVTZWdtZW50U25hcCIsImNsb3Nlc3RQb2ludEZyb21MaW5lU2VnbWVudCIsIngxIiwieTEiLCJ4MiIsInkyIiwiZGlzdGFuY2VQb2ludEZyb21MaW5lU2VnbWVudCIsIkdyaWRTbmFwIiwibmVhcmVzdFNuYXAiLCJzbmFwRWxlbWVudHMiLCJzbmFwTWFzayIsImZpbHRlciIsImdldCIsInZhbHVlU2VxIiwiZWwiLCJpc05lYXIiLCJtYXAiLCJzbmFwIiwicG9pbnQiLCJuZWFyZXN0UG9pbnQiLCJtaW4iLCJwMSIsImQxIiwicDIiLCJkMiIsImFkZFBvaW50U25hcCIsInB1c2giLCJhZGRMaW5lU25hcCIsIndpdGhNdXRhdGlvbnMiLCJhbHJlYWR5UHJlc2VudCIsInNvbWUiLCJsaW5lU25hcCIsImludGVyc2VjdGlvbnMiLCJpbnRlcnNlY3Rpb25Gcm9tVHdvTGluZXMiLCJpbnRlcnNlY3Rpb24iLCJ1bmRlZmluZWQiLCJmb3JFYWNoIiwiYWRkTGluZVNlZ21lbnRTbmFwIiwiYWRkR3JpZFNuYXAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxTQUFRQSxHQUFSLEVBQWFDLElBQWIsRUFBbUJDLE1BQW5CLFFBQWdDLFdBQWhDO0FBQ0EsT0FBTyxLQUFLQyxRQUFaLE1BQTBCLFlBQTFCOztBQUVBLE9BQU8sSUFBTUMsYUFBYSxZQUFu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Q0UsSUFBRCxFQUFJQyxJQUFKLEVBQU9DLElBQVAsRUFBVVAsY0FBVixFQUFrQkMsa0JBQWxCLEVBQTRCQyxnQkFBNUIsRUFBYixDQUFsQjtBQUNELEdBakJNLENBQVA7QUFrQkQ7O0FBRUQsT0FBTyxTQUFTNEMsa0JBQVQsQ0FBNEI1QixZQUE1QixFQUEwQ1AsRUFBMUMsRUFBOENDLEVBQTlDLEVBQWtEQyxFQUFsRCxFQUFzREMsRUFBdEQsRUFBMERkLE1BQTFELEVBQWtFQyxRQUFsRSxFQUE0RUMsT0FBNUUsRUFBcUY7QUFDMUZBLFlBQVUsSUFBSWhCLElBQUosQ0FBUyxDQUFDZ0IsT0FBRCxDQUFULENBQVY7QUFDQSxTQUFPZ0IsYUFBYWlCLElBQWIsQ0FBa0IsSUFBSTFCLGVBQUosQ0FBb0IsRUFBQ0UsTUFBRCxFQUFLQyxNQUFMLEVBQVNDLE1BQVQsRUFBYUMsTUFBYixFQUFpQmQsY0FBakIsRUFBeUJDLGtCQUF6QixFQUFtQ0MsZ0JBQW5DLEVBQXBCLENBQWxCLENBQVA7QUFDRDs7QUFFRCxPQUFPLFNBQVM2QyxXQUFULENBQXFCN0IsWUFBckIsRUFBbUN2QixDQUFuQyxFQUFzQ0MsQ0FBdEMsRUFBeUNJLE1BQXpDLEVBQWlEQyxRQUFqRCxFQUEyREMsT0FBM0QsRUFBb0U7QUFDekVBLFlBQVUsSUFBSWhCLElBQUosQ0FBUyxDQUFDZ0IsT0FBRCxDQUFULENBQVY7QUFDQSxTQUFPZ0IsYUFBYWlCLElBQWIsQ0FBa0IsSUFBSW5CLFFBQUosQ0FBYSxFQUFDckIsSUFBRCxFQUFJQyxJQUFKLEVBQU9JLGNBQVAsRUFBZUMsa0JBQWYsRUFBeUJDLGdCQUF6QixFQUFiLENBQWxCLENBQVA7QUFDRCIsImZpbGUiOiJzbmFwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXAsIExpc3QsIFJlY29yZH0gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCAqIGFzIEdlb21ldHJ5IGZyb20gJy4vZ2VvbWV0cnknO1xuXG5leHBvcnQgY29uc3QgU05BUF9QT0lOVCA9ICdTTkFQX1BPSU5UJztcbmV4cG9ydCBjb25zdCBTTkFQX0xJTkUgPSAnU05BUF9MSU5FJztcbmV4cG9ydCBjb25zdCBTTkFQX1NFR01FTlQgPSAnU05BUF9TRUdNRU5UJztcbmV4cG9ydCBjb25zdCBTTkFQX0dSSUQgPSAnU05BUF9HUklEJztcblxuZXhwb3J0IGNvbnN0IFNOQVBfTUFTSyA9IG5ldyBNYXAoe1xuICBTTkFQX1BPSU5UIDogdHJ1ZSxcbiAgU05BUF9MSU5FIDogdHJ1ZSxcbiAgU05BUF9TRUdNRU5UIDogdHJ1ZSxcbiAgU05BUF9HUklEIDogZmFsc2Vcbn0pO1xuXG5jbGFzcyBQb2ludFNuYXAgZXh0ZW5kcyBSZWNvcmQoe1xuICB0eXBlOiAncG9pbnQnLFxuICB4OiAtMSwgeTogLTEsXG4gIHJhZGl1czogMSwgcHJpb3JpdHk6IDEsXG4gIHJlbGF0ZWQ6IG5ldyBMaXN0KClcbn0pIHtcbiAgbmVhcmVzdFBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy54LFxuICAgICAgeTogdGhpcy55LFxuICAgICAgZGlzdGFuY2U6IEdlb21ldHJ5LnBvaW50c0Rpc3RhbmNlKHRoaXMueCwgdGhpcy55LCB4LCB5KVxuICAgIH07XG4gIH1cbiAgaXNOZWFyKHgseSxkaXN0YW5jZSl7IHJldHVybiB+KHRoaXMueCAtIHgpICsgMSA8IGRpc3RhbmNlICYmIH4odGhpcy55IC0geSkgKyAxIDwgZGlzdGFuY2U7IH1cbn1cblxuY2xhc3MgTGluZVNuYXAgZXh0ZW5kcyBSZWNvcmQoe1xuICB0eXBlOiAnbGluZScsXG4gIGE6IC0xLCBiOiAtMSwgYzogLTEsXG4gIHJhZGl1czogMSwgcHJpb3JpdHk6IDEsXG4gIHJlbGF0ZWQ6IG5ldyBMaXN0KClcbn0pIHtcbiAgbmVhcmVzdFBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uR2VvbWV0cnkuY2xvc2VzdFBvaW50RnJvbUxpbmUodGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgeCwgeSksXG4gICAgICBkaXN0YW5jZTogR2VvbWV0cnkuZGlzdGFuY2VQb2ludEZyb21MaW5lKHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHgsIHkpXG4gICAgfTtcbiAgfVxuICBpc05lYXIoeCx5LGRpc3RhbmNlKXsgcmV0dXJuIHRydWU7IH1cbn1cblxuY2xhc3MgTGluZVNlZ21lbnRTbmFwIGV4dGVuZHMgUmVjb3JkKHtcbiAgdHlwZTogJ2xpbmUtc2VnbWVudCcsXG4gIHgxOiAtMSwgeTE6IC0xLCB4MjogLTEsIHkyOiAtMSxcbiAgcmFkaXVzOiAxLCBwcmlvcml0eTogMSxcbiAgcmVsYXRlZDogbmV3IExpc3QoKVxufSkge1xuICBuZWFyZXN0UG9pbnQoeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5HZW9tZXRyeS5jbG9zZXN0UG9pbnRGcm9tTGluZVNlZ21lbnQodGhpcy54MSwgdGhpcy55MSwgdGhpcy54MiwgdGhpcy55MiwgeCwgeSksXG4gICAgICBkaXN0YW5jZTogR2VvbWV0cnkuZGlzdGFuY2VQb2ludEZyb21MaW5lU2VnbWVudCh0aGlzLngxLCB0aGlzLnkxLCB0aGlzLngyLCB0aGlzLnkyLCB4LCB5KVxuICAgIH07XG4gIH1cbiAgaXNOZWFyKHgseSxkaXN0YW5jZSl7IHJldHVybiB0cnVlOyB9XG59XG5cbmNsYXNzIEdyaWRTbmFwIGV4dGVuZHMgUmVjb3JkKHtcbiAgdHlwZTogJ2dyaWQnLFxuICB4OiAtMSwgeTogLTEsXG4gIHJhZGl1czogMSwgcHJpb3JpdHk6IDEsXG4gIHJlbGF0ZWQ6IG5ldyBMaXN0KClcbn0pIHtcbiAgbmVhcmVzdFBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy54LFxuICAgICAgeTogdGhpcy55LFxuICAgICAgZGlzdGFuY2U6IEdlb21ldHJ5LnBvaW50c0Rpc3RhbmNlKHRoaXMueCwgdGhpcy55LCB4LCB5KVxuICAgIH07XG4gIH1cbiAgaXNOZWFyKHgseSxkaXN0YW5jZSl7IHJldHVybiB+KHRoaXMueCAtIHgpICsgMSA8IGRpc3RhbmNlICYmIH4odGhpcy55IC0geSkgKyAxIDwgZGlzdGFuY2U7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lYXJlc3RTbmFwKHNuYXBFbGVtZW50cywgeCwgeSwgc25hcE1hc2spIHtcblxuICBsZXQgZmlsdGVyID0ge1xuICAgICdwb2ludCc6IHNuYXBNYXNrLmdldChTTkFQX1BPSU5UKSxcbiAgICAnbGluZSc6IHNuYXBNYXNrLmdldChTTkFQX0xJTkUpLFxuICAgICdsaW5lLXNlZ21lbnQnOiBzbmFwTWFzay5nZXQoU05BUF9TRUdNRU5UKSxcbiAgICAnZ3JpZCc6IHNuYXBNYXNrLmdldChTTkFQX0dSSUQpXG4gIH07XG5cbiAgcmV0dXJuIHNuYXBFbGVtZW50c1xuICAudmFsdWVTZXEoKVxuICAuZmlsdGVyKCAoIGVsICkgPT4gZmlsdGVyW2VsLnR5cGVdICYmIGVsLmlzTmVhcih4LHksIGVsLnJhZGl1cykgKVxuICAubWFwKHNuYXAgPT4geyByZXR1cm4ge3NuYXAsIHBvaW50OiBzbmFwLm5lYXJlc3RQb2ludCh4LCB5KX0gfSlcbiAgLmZpbHRlcigoe3NuYXA6IHtyYWRpdXN9LCBwb2ludDoge2Rpc3RhbmNlfX0pID0+IGRpc3RhbmNlIDwgcmFkaXVzKVxuICAubWluKFxuICAgIChcbiAgICAgIHtzbmFwOiB7IHByaW9yaXR5IDogcDEgfSwgcG9pbnQ6IHsgZGlzdGFuY2UgOiBkMSB9fSxcbiAgICAgIHtzbmFwOiB7IHByaW9yaXR5IDogcDIgfSwgcG9pbnQ6IHsgZGlzdGFuY2UgOiBkMiB9fVxuICAgICkgPT4gcDEgPT09IHAyID8gKCBkMSA8IGQyID8gLTEgOiAxICkgOiAoIHAxID4gcDIgPyAtMSA6IDEgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkUG9pbnRTbmFwKHNuYXBFbGVtZW50cywgeCwgeSwgcmFkaXVzLCBwcmlvcml0eSwgcmVsYXRlZCkge1xuICByZWxhdGVkID0gbmV3IExpc3QoW3JlbGF0ZWRdKTtcbiAgcmV0dXJuIHNuYXBFbGVtZW50cy5wdXNoKG5ldyBQb2ludFNuYXAoe3gsIHksIHJhZGl1cywgcHJpb3JpdHksIHJlbGF0ZWR9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRMaW5lU25hcChzbmFwRWxlbWVudHMsIGEsIGIsIGMsIHJhZGl1cywgcHJpb3JpdHksIHJlbGF0ZWQpIHtcbiAgcmVsYXRlZCA9IG5ldyBMaXN0KFtyZWxhdGVkXSk7XG5cbiAgcmV0dXJuIHNuYXBFbGVtZW50cy53aXRoTXV0YXRpb25zKHNuYXBFbGVtZW50cyA9PiB7XG5cbiAgICBsZXQgYWxyZWFkeVByZXNlbnQgPSBzbmFwRWxlbWVudHMuc29tZShsaW5lU25hcCA9PlxuICAgIGxpbmVTbmFwLnR5cGUgPT09ICdsaW5lJyAmJlxuICAgIGEgPT09IGxpbmVTbmFwLmEgJiZcbiAgICBiID09PSBsaW5lU25hcC5iICYmXG4gICAgYyA9PT0gbGluZVNuYXAuYyk7XG4gICAgaWYgKGFscmVhZHlQcmVzZW50KSByZXR1cm4gc25hcEVsZW1lbnRzO1xuXG4gICAgbGV0IGludGVyc2VjdGlvbnMgPSBzbmFwRWxlbWVudHNcbiAgICAgIC52YWx1ZVNlcSgpXG4gICAgICAuZmlsdGVyKHNuYXAgPT4gc25hcC50eXBlID09PSAnbGluZScpXG4gICAgICAubWFwKHNuYXAgPT4gR2VvbWV0cnkuaW50ZXJzZWN0aW9uRnJvbVR3b0xpbmVzKHNuYXAuYSwgc25hcC5iLCBzbmFwLmMsIGEsIGIsIGMpKVxuICAgICAgLmZpbHRlcihpbnRlcnNlY3Rpb24gPT4gaW50ZXJzZWN0aW9uICE9PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaCgoe3gsIHl9KSA9PiBhZGRQb2ludFNuYXAoc25hcEVsZW1lbnRzLCB4LCB5LCAyMCwgNDApKTtcblxuICAgIHNuYXBFbGVtZW50cy5wdXNoKG5ldyBMaW5lU25hcCh7YSwgYiwgYywgcmFkaXVzLCBwcmlvcml0eSwgcmVsYXRlZH0pKTtcbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExpbmVTZWdtZW50U25hcChzbmFwRWxlbWVudHMsIHgxLCB5MSwgeDIsIHkyLCByYWRpdXMsIHByaW9yaXR5LCByZWxhdGVkKSB7XG4gIHJlbGF0ZWQgPSBuZXcgTGlzdChbcmVsYXRlZF0pO1xuICByZXR1cm4gc25hcEVsZW1lbnRzLnB1c2gobmV3IExpbmVTZWdtZW50U25hcCh7eDEsIHkxLCB4MiwgeTIsIHJhZGl1cywgcHJpb3JpdHksIHJlbGF0ZWR9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRHcmlkU25hcChzbmFwRWxlbWVudHMsIHgsIHksIHJhZGl1cywgcHJpb3JpdHksIHJlbGF0ZWQpIHtcbiAgcmVsYXRlZCA9IG5ldyBMaXN0KFtyZWxhdGVkXSk7XG4gIHJldHVybiBzbmFwRWxlbWVudHMucHVzaChuZXcgR3JpZFNuYXAoe3gsIHksIHJhZGl1cywgcHJpb3JpdHksIHJlbGF0ZWR9KSk7XG59XG4iXX0=