@plait/draw 0.53.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants/geometry.d.ts +25 -1
- package/engines/basic-shapes/circle.d.ts +8 -0
- package/engines/basic-shapes/cloud.d.ts +2 -0
- package/engines/flowchart/off-page.d.ts +4 -0
- package/engines/flowchart/or.d.ts +2 -0
- package/engines/flowchart/predefined-process.d.ts +2 -0
- package/engines/flowchart/summing-junction.d.ts +2 -0
- package/esm2022/constants/geometry.mjs +15 -3
- package/esm2022/engines/basic-shapes/circle.mjs +51 -0
- package/esm2022/engines/basic-shapes/cloud.mjs +57 -0
- package/esm2022/engines/basic-shapes/ellipse.mjs +3 -41
- package/esm2022/engines/flowchart/off-page.mjs +32 -0
- package/esm2022/engines/flowchart/or.mjs +25 -0
- package/esm2022/engines/flowchart/predefined-process.mjs +47 -0
- package/esm2022/engines/flowchart/summing-junction.mjs +28 -0
- package/esm2022/engines/index.mjs +12 -2
- package/esm2022/generators/line-auto-complete.generator.mjs +1 -1
- package/esm2022/geometry.component.mjs +7 -8
- package/esm2022/image.component.mjs +6 -7
- package/esm2022/interfaces/element.mjs +2 -1
- package/esm2022/interfaces/geometry.mjs +6 -1
- package/esm2022/interfaces/index.mjs +2 -2
- package/esm2022/line.component.mjs +8 -9
- package/esm2022/plugins/with-draw-fragment.mjs +7 -7
- package/esm2022/plugins/with-draw-hotkey.mjs +1 -1
- package/esm2022/plugins/with-draw-resize.mjs +73 -26
- package/esm2022/plugins/with-draw-rotate.mjs +127 -0
- package/esm2022/plugins/with-draw.mjs +6 -5
- package/esm2022/plugins/with-geometry-create.mjs +21 -5
- package/esm2022/plugins/with-geometry-resize.mjs +17 -23
- package/esm2022/plugins/with-line-auto-complete-reaction.mjs +2 -2
- package/esm2022/plugins/with-line-auto-complete.mjs +15 -13
- package/esm2022/plugins/with-line-bound-reaction.mjs +19 -21
- package/esm2022/plugins/with-line-create.mjs +4 -4
- package/esm2022/plugins/with-line-resize.mjs +11 -12
- package/esm2022/transforms/line.mjs +4 -4
- package/esm2022/utils/geometry.mjs +35 -23
- package/esm2022/utils/hit.mjs +26 -26
- package/esm2022/utils/line/elbow.mjs +11 -6
- package/esm2022/utils/line/line-basic.mjs +25 -30
- package/esm2022/utils/line/line-common.mjs +3 -3
- package/esm2022/utils/line/line-resize.mjs +2 -2
- package/esm2022/utils/position/geometry.mjs +59 -21
- package/esm2022/utils/shape.mjs +2 -2
- package/esm2022/utils/snap-resizing.mjs +185 -0
- package/esm2022/utils/style/stroke.mjs +9 -2
- package/fesm2022/plait-draw.mjs +1393 -1121
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-auto-complete.generator.d.ts +3 -3
- package/geometry.component.d.ts +2 -3
- package/image.component.d.ts +2 -3
- package/interfaces/element.d.ts +2 -1
- package/interfaces/geometry.d.ts +7 -2
- package/interfaces/index.d.ts +2 -2
- package/line.component.d.ts +2 -3
- package/package.json +1 -1
- package/plugins/with-draw-fragment.d.ts +2 -2
- package/plugins/with-draw-resize.d.ts +9 -5
- package/plugins/with-draw-rotate.d.ts +2 -0
- package/utils/geometry.d.ts +7 -4
- package/utils/hit.d.ts +3 -1
- package/utils/line/elbow.d.ts +3 -0
- package/utils/line/line-basic.d.ts +4 -4
- package/utils/position/geometry.d.ts +16 -2
- package/utils/shape.d.ts +2 -2
- package/utils/snap-resizing.d.ts +25 -0
- package/esm2022/utils/resize-align-reaction.mjs +0 -316
- package/esm2022/utils/resize-align.mjs +0 -37
- package/utils/resize-align-reaction.d.ts +0 -42
- package/utils/resize-align.d.ts +0 -8
|
@@ -1,30 +1,68 @@
|
|
|
1
|
-
import { RectangleClient, depthFirstRecursion, getIsRecursionFunc, rotatePoints, rotateAntiPointsByElement } from '@plait/core';
|
|
1
|
+
import { PlaitBoard, RectangleClient, depthFirstRecursion, getIsRecursionFunc, rotatePoints, rotateAntiPointsByElement } from '@plait/core';
|
|
2
|
+
import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, getRotatedResizeCursorClassByAngle, ROTATE_HANDLE_SIZE, ROTATE_HANDLE_DISTANCE_TO_ELEMENT } from '@plait/common';
|
|
2
3
|
import { PlaitDrawElement } from '../../interfaces';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { isHitEdgeOfShape, isInsideOfShape } from '../hit';
|
|
5
|
+
import { LINE_HIT_GEOMETRY_BUFFER, LINE_SNAPPING_BUFFER } from '../../constants/geometry';
|
|
6
|
+
import { getNearestPoint } from '../geometry';
|
|
7
|
+
import { getHitConnectorPoint } from '../line/line-basic';
|
|
6
8
|
export const getHitRectangleResizeHandleRef = (board, rectangle, point, angle = 0) => {
|
|
7
9
|
const centerPoint = RectangleClient.getCenterPoint(rectangle);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const resizeHandleRefs = getRectangleResizeHandleRefs(rectangle, RESIZE_HANDLE_DIAMETER);
|
|
11
|
+
if (angle) {
|
|
12
|
+
const rotatedPoint = rotatePoints([point], centerPoint, -angle)[0];
|
|
13
|
+
let result = resizeHandleRefs.find(resizeHandleRef => {
|
|
14
|
+
return RectangleClient.isHit(RectangleClient.getRectangleByPoints([rotatedPoint, rotatedPoint]), resizeHandleRef.rectangle);
|
|
15
|
+
});
|
|
16
|
+
if (result) {
|
|
17
|
+
result.cursorClass = getRotatedResizeCursorClassByAngle(result.cursorClass, angle);
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return resizeHandleRefs.find(resizeHandleRef => {
|
|
23
|
+
return RectangleClient.isHit(RectangleClient.getRectangleByPoints([point, point]), resizeHandleRef.rectangle);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export const getSnappingGeometry = (board, point) => {
|
|
28
|
+
let hitElement = getHitGeometry(board, point);
|
|
29
|
+
if (hitElement) {
|
|
30
|
+
const ref = getSnappingRef(board, hitElement, point);
|
|
31
|
+
if (ref.isHitConnector || ref.isHitEdge) {
|
|
32
|
+
return hitElement;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
export const getSnappingRef = (board, hitElement, point) => {
|
|
38
|
+
const rotatedPoint = rotateAntiPointsByElement(point, hitElement) || point;
|
|
39
|
+
const connectorPoint = getHitConnectorPoint(rotatedPoint, hitElement);
|
|
40
|
+
const edgePoint = getNearestPoint(hitElement, rotatedPoint);
|
|
41
|
+
const isHitEdge = isHitEdgeOfShape(board, hitElement, rotatedPoint, LINE_SNAPPING_BUFFER);
|
|
42
|
+
return { isHitEdge, isHitConnector: !!connectorPoint, connectorPoint, edgePoint };
|
|
43
|
+
};
|
|
44
|
+
export const getHitGeometry = (board, point, offset = LINE_HIT_GEOMETRY_BUFFER) => {
|
|
45
|
+
let hitShape = null;
|
|
46
|
+
traverseDrawShapes(board, (element) => {
|
|
47
|
+
if (hitShape === null && isInsideOfShape(board, element, rotateAntiPointsByElement(point, element) || point, offset * 2)) {
|
|
48
|
+
hitShape = element;
|
|
49
|
+
}
|
|
12
50
|
});
|
|
13
|
-
return
|
|
51
|
+
return hitShape;
|
|
14
52
|
};
|
|
15
|
-
export const
|
|
16
|
-
let geometry = null;
|
|
53
|
+
export const traverseDrawShapes = (board, callback) => {
|
|
17
54
|
depthFirstRecursion(board, node => {
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
client = RectangleClient.getOutlineRectangle(client, offset);
|
|
21
|
-
const shape = getShape(node);
|
|
22
|
-
const isHit = getEngine(shape).isInsidePoint(client, rotateAntiPointsByElement(point, node) || point);
|
|
23
|
-
if (isHit) {
|
|
24
|
-
geometry = node;
|
|
25
|
-
}
|
|
55
|
+
if (!PlaitBoard.isBoard(node) && PlaitDrawElement.isShapeElement(node)) {
|
|
56
|
+
callback(node);
|
|
26
57
|
}
|
|
27
58
|
}, getIsRecursionFunc(board), true);
|
|
28
|
-
return geometry;
|
|
29
59
|
};
|
|
30
|
-
|
|
60
|
+
export const getRotateHandleRectangle = (rectangle) => {
|
|
61
|
+
return {
|
|
62
|
+
x: rectangle.x - ROTATE_HANDLE_DISTANCE_TO_ELEMENT - ROTATE_HANDLE_SIZE,
|
|
63
|
+
y: rectangle.y + rectangle.height + ROTATE_HANDLE_DISTANCE_TO_ELEMENT,
|
|
64
|
+
width: ROTATE_HANDLE_SIZE,
|
|
65
|
+
height: ROTATE_HANDLE_SIZE
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9wb3NpdGlvbi9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsVUFBVSxFQUVWLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWix5QkFBeUIsRUFDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNILHNCQUFzQixFQUN0Qiw0QkFBNEIsRUFDNUIsa0NBQWtDLEVBQ2xDLGtCQUFrQixFQUNsQixpQ0FBaUMsRUFDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFvQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDM0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxRCxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsU0FBMEIsRUFBRSxLQUFZLEVBQUUsUUFBZ0IsQ0FBQyxFQUFFLEVBQUU7SUFDN0gsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3pGLElBQUksS0FBSyxFQUFFLENBQUM7UUFDUixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxD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Q3BHLG1CQUFtQixDQUNmLEtBQUssRUFDTCxJQUFJLENBQUMsRUFBRTtRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0wsQ0FBQyxFQUNELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUN6QixJQUFJLENBQ1AsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsU0FBMEIsRUFBRSxFQUFFO0lBQ25FLE9BQU87UUFDSCxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxpQ0FBaUMsR0FBRyxrQkFBa0I7UUFDdkUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxpQ0FBaUM7UUFDckUsS0FBSyxFQUFFLGtCQUFrQjtRQUN6QixNQUFNLEVBQUUsa0JBQWtCO0tBQzdCLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFuY2VzdG9yLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGRlcHRoRmlyc3RSZWN1cnNpb24sXG4gICAgZ2V0SXNSZWN1cnNpb25GdW5jLFxuICAgIHJvdGF0ZVBvaW50cyxcbiAgICByb3RhdGVBbnRpUG9pbnRzQnlFbGVtZW50XG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7XG4gICAgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUixcbiAgICBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzLFxuICAgIGdldFJvdGF0ZWRSZXNpemVDdXJzb3JDbGFzc0J5QW5nbGUsXG4gICAgUk9UQVRFX0hBTkRMRV9TSVpFLFxuICAgIFJPVEFURV9IQU5ETEVfRElTVEFOQ0VfVE9fRUxFTUVOVFxufSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IFBsYWl0RHJhd0VsZW1lbnQsIFBsYWl0R2VvbWV0cnksIFBsYWl0U2hhcGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBpc0hpdEVkZ2VPZlNoYXBlLCBpc0luc2lkZU9mU2hhcGUgfSBmcm9tICcuLi9oaXQnO1xuaW1wb3J0IHsgTElORV9ISVRfR0VPTUVUUllfQlVGRkVSLCBMSU5FX1NOQVBQSU5HX0JVRkZFUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9nZW9tZXRyeSc7XG5pbXBvcnQgeyBnZXROZWFyZXN0UG9pbnQgfSBmcm9tICcuLi9nZW9tZXRyeSc7XG5pbXBvcnQgeyBnZXRIaXRDb25uZWN0b3JQb2ludCB9IGZyb20gJy4uL2xpbmUvbGluZS1iYXNpYyc7XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWYgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQsIGFuZ2xlOiBudW1iZXIgPSAwKSA9PiB7XG4gICAgY29uc3QgY2VudGVyUG9pbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQocmVjdGFuZ2xlKTtcbiAgICBjb25zdCByZXNpemVIYW5kbGVSZWZzID0gZ2V0UmVjdGFuZ2xlUmVzaXplSGFuZGxlUmVmcyhyZWN0YW5nbGUsIFJFU0laRV9IQU5ETEVfRElBTUVURVIpO1xuICAgIGlmIChhbmdsZSkge1xuICAgICAgICBjb25zdCByb3RhdGVkUG9pbnQgPSByb3RhdGVQb2ludHMoW3BvaW50XSwgY2VudGVyUG9pbnQsIC1hbmdsZSlbMF07XG4gICAgICAgIGxldCByZXN1bHQgPSByZXNpemVIYW5kbGVSZWZzLmZpbmQocmVzaXplSGFuZGxlUmVmID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQoUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtyb3RhdGVkUG9pbnQsIHJvdGF0ZWRQb2ludF0pLCByZXNpemVIYW5kbGVSZWYucmVjdGFuZ2xlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jdXJzb3JDbGFzcyA9IGdldFJvdGF0ZWRSZXNpemVDdXJzb3JDbGFzc0J5QW5nbGUocmVzdWx0LmN1cnNvckNsYXNzLCBhbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzaXplSGFuZGxlUmVmcy5maW5kKHJlc2l6ZUhhbmRsZVJlZiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbcG9pbnQsIHBvaW50XSksIHJlc2l6ZUhhbmRsZVJlZi5yZWN0YW5nbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U25hcHBpbmdHZW9tZXRyeSA9IChib2FyZDogUGxhaXRCb2FyZCwgcG9pbnQ6IFBvaW50KTogUGxhaXRHZW9tZXRyeSB8IG51bGwgPT4ge1xuICAgIGxldCBoaXRFbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCB8IG51bGwgPSBnZXRIaXRHZW9tZXRyeShib2FyZCwgcG9pbnQpO1xuICAgIGlmIChoaXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IGdldFNuYXBwaW5nUmVmKGJvYXJkLCBoaXRFbGVtZW50LCBwb2ludCk7XG4gICAgICAgIGlmIChyZWYuaXNIaXRDb25uZWN0b3IgfHwgcmVmLmlzSGl0RWRnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGhpdEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U25hcHBpbmdSZWYgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGhpdEVsZW1lbnQ6IFBsYWl0U2hhcGVFbGVtZW50LCBwb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCByb3RhdGVkUG9pbnQgPSByb3RhdGVBbnRpUG9pbnRzQnlFbGVtZW50KHBvaW50LCBoaXRFbGVtZW50KSB8fCBwb2ludDtcbiAgICBjb25zdCBjb25uZWN0b3JQb2ludCA9IGdldEhpdENvbm5lY3RvclBvaW50KHJvdGF0ZWRQb2ludCwgaGl0RWxlbWVudCk7XG4gICAgY29uc3QgZWRnZVBvaW50ID0gZ2V0TmVhcmVzdFBvaW50KGhpdEVsZW1lbnQsIHJvdGF0ZWRQb2ludCk7XG4gICAgY29uc3QgaXNIaXRFZGdlID0gaXNIaXRFZGdlT2ZTaGFwZShib2FyZCwgaGl0RWxlbWVudCwgcm90YXRlZFBvaW50LCBMSU5FX1NOQVBQSU5HX0JVRkZFUik7XG4gICAgcmV0dXJuIHsgaXNIaXRFZGdlLCBpc0hpdENvbm5lY3RvcjogISFjb25uZWN0b3JQb2ludCwgY29ubmVjdG9yUG9pbnQsIGVkZ2VQb2ludCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdEdlb21ldHJ5ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIG9mZnNldCA9IExJTkVfSElUX0dFT01FVFJZX0JVRkZFUik6IFBsYWl0R2VvbWV0cnkgfCBudWxsID0+IHtcbiAgICBsZXQgaGl0U2hhcGU6IFBsYWl0U2hhcGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgdHJhdmVyc2VEcmF3U2hhcGVzKGJvYXJkLCAoZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGhpdFNoYXBlID09PSBudWxsICYmIGlzSW5zaWRlT2ZTaGFwZShib2FyZCwgZWxlbWVudCwgcm90YXRlQW50aVBvaW50c0J5RWxlbWVudChwb2ludCwgZWxlbWVudCkgfHwgcG9pbnQsIG9mZnNldCAqIDIpKSB7XG4gICAgICAgICAgICBoaXRTaGFwZSA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGl0U2hhcGU7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhdmVyc2VEcmF3U2hhcGVzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBjYWxsYmFjazogKGVsZW1lbnQ6IFBsYWl0U2hhcGVFbGVtZW50KSA9PiB2b2lkKSA9PiB7XG4gICAgZGVwdGhGaXJzdFJlY3Vyc2lvbjxBbmNlc3Rvcj4oXG4gICAgICAgIGJvYXJkLFxuICAgICAgICBub2RlID0+IHtcbiAgICAgICAgICAgIGlmICghUGxhaXRCb2FyZC5pc0JvYXJkKG5vZGUpICYmIFBsYWl0RHJhd0VsZW1lbnQuaXNTaGFwZUVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SXNSZWN1cnNpb25GdW5jKGJvYXJkKSxcbiAgICAgICAgdHJ1ZVxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlSGFuZGxlUmVjdGFuZ2xlID0gKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcmVjdGFuZ2xlLnggLSBST1RBVEVfSEFORExFX0RJU1RBTkNFX1RPX0VMRU1FTlQgLSBST1RBVEVfSEFORExFX1NJWkUsXG4gICAgICAgIHk6IHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCArIFJPVEFURV9IQU5ETEVfRElTVEFOQ0VfVE9fRUxFTUVOVCxcbiAgICAgICAgd2lkdGg6IFJPVEFURV9IQU5ETEVfU0laRSxcbiAgICAgICAgaGVpZ2h0OiBST1RBVEVfSEFORExFX1NJWkVcbiAgICB9O1xufTtcbiJdfQ==
|
package/esm2022/utils/shape.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BasicShapes, PlaitDrawElement } from '../interfaces';
|
|
2
|
-
export const
|
|
2
|
+
export const getElementShape = (value) => {
|
|
3
3
|
if (PlaitDrawElement.isImage(value)) {
|
|
4
4
|
return BasicShapes.rectangle;
|
|
5
5
|
}
|
|
6
6
|
return value.shape;
|
|
7
7
|
};
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9zaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVqRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUF3QixFQUFFLEVBQUU7SUFDeEQsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNpY1NoYXBlcywgUGxhaXREcmF3RWxlbWVudCwgUGxhaXRTaGFwZUVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRTaGFwZSA9ICh2YWx1ZTogUGxhaXRTaGFwZUVsZW1lbnQpID0+IHtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0ltYWdlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gQmFzaWNTaGFwZXMucmVjdGFuZ2xlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUuc2hhcGU7XG59O1xuIl19
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { getDirectionFactorByDirectionComponent, getUnitVectorByPointAndPoint, resetPointsAfterResize } from '@plait/common';
|
|
2
|
+
import { RectangleClient, createDebugGenerator, createG, getSelectionAngle, getRectangleByAngle, getRectangleByElements, getSnapRectangles, SNAP_TOLERANCE, drawSolidLines, drawPointSnapLines, getTripleAxis, getMinPointDelta } from '@plait/core';
|
|
3
|
+
import { getResizeZoom, movePointByZoomAndOriginPoint } from '../plugins/with-draw-resize';
|
|
4
|
+
const debugKey = 'debug:plait:point-for-geometry';
|
|
5
|
+
export const debugGenerator = createDebugGenerator(debugKey);
|
|
6
|
+
const EQUAL_SPACING = 10;
|
|
7
|
+
export function getSnapResizingRefOptions(board, resizeRef, resizeState, resizeOriginPointAndHandlePoint, isAspectRatio, isFromCorner) {
|
|
8
|
+
const { originPoint, handlePoint } = resizeOriginPointAndHandlePoint;
|
|
9
|
+
const resizePoints = [resizeState.startPoint, resizeState.endPoint];
|
|
10
|
+
const { xZoom, yZoom } = getResizeZoom(resizePoints, originPoint, handlePoint, isFromCorner, isAspectRatio);
|
|
11
|
+
let activeElements;
|
|
12
|
+
let resizeOriginPoint = [];
|
|
13
|
+
if (Array.isArray(resizeRef.element)) {
|
|
14
|
+
activeElements = resizeRef.element;
|
|
15
|
+
const rectangle = getRectangleByElements(board, resizeRef.element, false);
|
|
16
|
+
resizeOriginPoint = RectangleClient.getPoints(rectangle);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
activeElements = [resizeRef.element];
|
|
20
|
+
resizeOriginPoint = resizeRef.element.points;
|
|
21
|
+
}
|
|
22
|
+
const points = resizeOriginPoint.map(p => {
|
|
23
|
+
return movePointByZoomAndOriginPoint(p, originPoint, xZoom, yZoom);
|
|
24
|
+
});
|
|
25
|
+
const activeRectangle = getRectangleByAngle(RectangleClient.getRectangleByPoints(points), getSelectionAngle(activeElements)) ||
|
|
26
|
+
RectangleClient.getRectangleByPoints(points);
|
|
27
|
+
const resizeHandlePoint = movePointByZoomAndOriginPoint(handlePoint, originPoint, xZoom, yZoom);
|
|
28
|
+
const [x, y] = getUnitVectorByPointAndPoint(originPoint, resizeHandlePoint);
|
|
29
|
+
return {
|
|
30
|
+
resizePoints,
|
|
31
|
+
resizeOriginPoint,
|
|
32
|
+
activeRectangle,
|
|
33
|
+
originPoint,
|
|
34
|
+
handlePoint,
|
|
35
|
+
directionFactors: [getDirectionFactorByDirectionComponent(x), getDirectionFactorByDirectionComponent(y)],
|
|
36
|
+
isAspectRatio,
|
|
37
|
+
isFromCorner
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function getSnapResizingRef(board, activeElements, resizeSnapOptions) {
|
|
41
|
+
const snapG = createG();
|
|
42
|
+
const snapRectangles = getSnapRectangles(board, activeElements);
|
|
43
|
+
let snapLineDelta = getIsometricLineDelta(snapRectangles, resizeSnapOptions);
|
|
44
|
+
if (snapLineDelta.deltaX === 0 && snapLineDelta.deltaY === 0) {
|
|
45
|
+
snapLineDelta = getSnapPointDelta(snapRectangles, resizeSnapOptions);
|
|
46
|
+
}
|
|
47
|
+
const angle = getSelectionAngle(activeElements);
|
|
48
|
+
const activePointAndZoom = getActivePointAndZoom(snapLineDelta, resizeSnapOptions, angle);
|
|
49
|
+
const isometricLinesG = drawIsometricSnapLines(board, activePointAndZoom.activePoints, snapRectangles, resizeSnapOptions, angle);
|
|
50
|
+
const pointLinesG = drawResizingPointSnapLines(board, activePointAndZoom.activePoints, snapRectangles, resizeSnapOptions, angle);
|
|
51
|
+
snapG.append(isometricLinesG, pointLinesG);
|
|
52
|
+
return { ...activePointAndZoom, ...snapLineDelta, snapG };
|
|
53
|
+
}
|
|
54
|
+
function getSnapPointDelta(snapRectangles, resizeSnapOptions) {
|
|
55
|
+
let pointLineDelta = {
|
|
56
|
+
deltaX: 0,
|
|
57
|
+
deltaY: 0
|
|
58
|
+
};
|
|
59
|
+
const { isAspectRatio, activeRectangle, directionFactors } = resizeSnapOptions;
|
|
60
|
+
const drawHorizontal = directionFactors[0] !== 0 || isAspectRatio;
|
|
61
|
+
const drawVertical = directionFactors[1] !== 0 || isAspectRatio;
|
|
62
|
+
if (drawHorizontal) {
|
|
63
|
+
const xSnapAxis = getTripleAxis(activeRectangle, true);
|
|
64
|
+
const pointX = directionFactors[0] === -1 ? xSnapAxis[0] : xSnapAxis[2];
|
|
65
|
+
const deltaX = getMinPointDelta(snapRectangles, pointX, true);
|
|
66
|
+
if (Math.abs(deltaX) < SNAP_TOLERANCE) {
|
|
67
|
+
pointLineDelta.deltaX = deltaX;
|
|
68
|
+
if (pointLineDelta.deltaX !== 0 && isAspectRatio) {
|
|
69
|
+
pointLineDelta.deltaY = pointLineDelta.deltaX / (activeRectangle.width / activeRectangle.height);
|
|
70
|
+
return pointLineDelta;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (drawVertical) {
|
|
75
|
+
const ySnapAxis = getTripleAxis(activeRectangle, false);
|
|
76
|
+
const pointY = directionFactors[1] === -1 ? ySnapAxis[0] : ySnapAxis[2];
|
|
77
|
+
const deltaY = getMinPointDelta(snapRectangles, pointY, false);
|
|
78
|
+
if (Math.abs(deltaY) < SNAP_TOLERANCE) {
|
|
79
|
+
pointLineDelta.deltaY = deltaY;
|
|
80
|
+
if (pointLineDelta.deltaY !== 0 && isAspectRatio) {
|
|
81
|
+
pointLineDelta.deltaX = pointLineDelta.deltaY * (activeRectangle.width / activeRectangle.height);
|
|
82
|
+
return pointLineDelta;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return pointLineDelta;
|
|
87
|
+
}
|
|
88
|
+
function getActivePointAndZoom(resizeSnapDelta, resizeSnapOptions, angle) {
|
|
89
|
+
const { deltaX, deltaY } = resizeSnapDelta;
|
|
90
|
+
const { resizePoints, isCreate } = resizeSnapOptions;
|
|
91
|
+
const newResizePoints = [resizePoints[0], [resizePoints[1][0] + deltaX, resizePoints[1][1] + deltaY]];
|
|
92
|
+
let activePoints = newResizePoints;
|
|
93
|
+
let xZoom = 0;
|
|
94
|
+
let yZoom = 0;
|
|
95
|
+
if (!isCreate) {
|
|
96
|
+
const { originPoint, handlePoint, isFromCorner, isAspectRatio, resizeOriginPoint } = resizeSnapOptions;
|
|
97
|
+
const resizeZoom = getResizeZoom(newResizePoints, originPoint, handlePoint, isFromCorner, isAspectRatio);
|
|
98
|
+
xZoom = resizeZoom.xZoom;
|
|
99
|
+
yZoom = resizeZoom.yZoom;
|
|
100
|
+
activePoints = resizeOriginPoint.map(p => {
|
|
101
|
+
return movePointByZoomAndOriginPoint(p, originPoint, xZoom, yZoom);
|
|
102
|
+
});
|
|
103
|
+
if (angle) {
|
|
104
|
+
activePoints = resetPointsAfterResize(RectangleClient.getRectangleByPoints(resizeOriginPoint), RectangleClient.getRectangleByPoints(activePoints), RectangleClient.getCenterPoint(RectangleClient.getRectangleByPoints(resizeOriginPoint)), RectangleClient.getCenterPoint(RectangleClient.getRectangleByPoints(activePoints)), angle);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
xZoom,
|
|
109
|
+
yZoom,
|
|
110
|
+
activePoints
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function getIsometricLineDelta(snapRectangles, resizeSnapOptions) {
|
|
114
|
+
let isometricLineDelta = {
|
|
115
|
+
deltaX: 0,
|
|
116
|
+
deltaY: 0
|
|
117
|
+
};
|
|
118
|
+
const { isAspectRatio, activeRectangle } = resizeSnapOptions;
|
|
119
|
+
const widthSnapRectangle = snapRectangles.find(item => Math.abs(item.width - activeRectangle.width) < SNAP_TOLERANCE);
|
|
120
|
+
if (widthSnapRectangle) {
|
|
121
|
+
const deltaWidth = widthSnapRectangle.width - activeRectangle.width;
|
|
122
|
+
isometricLineDelta.deltaX = deltaWidth * resizeSnapOptions.directionFactors[0];
|
|
123
|
+
if (isAspectRatio) {
|
|
124
|
+
const deltaHeight = deltaWidth / (activeRectangle.width / activeRectangle.height);
|
|
125
|
+
isometricLineDelta.deltaY = deltaHeight * resizeSnapOptions.directionFactors[1];
|
|
126
|
+
return isometricLineDelta;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const heightSnapRectangle = snapRectangles.find(item => Math.abs(item.height - activeRectangle.height) < SNAP_TOLERANCE);
|
|
130
|
+
if (heightSnapRectangle) {
|
|
131
|
+
const deltaHeight = heightSnapRectangle.height - activeRectangle.height;
|
|
132
|
+
isometricLineDelta.deltaY = deltaHeight * resizeSnapOptions.directionFactors[1];
|
|
133
|
+
if (isAspectRatio) {
|
|
134
|
+
const deltaWidth = deltaHeight * (activeRectangle.width / activeRectangle.height);
|
|
135
|
+
isometricLineDelta.deltaX = deltaWidth * resizeSnapOptions.directionFactors[0];
|
|
136
|
+
return isometricLineDelta;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return isometricLineDelta;
|
|
140
|
+
}
|
|
141
|
+
function getIsometricLinePoints(rectangle, isHorizontal) {
|
|
142
|
+
return isHorizontal
|
|
143
|
+
? [
|
|
144
|
+
[rectangle.x, rectangle.y - EQUAL_SPACING],
|
|
145
|
+
[rectangle.x + rectangle.width, rectangle.y - EQUAL_SPACING]
|
|
146
|
+
]
|
|
147
|
+
: [
|
|
148
|
+
[rectangle.x - EQUAL_SPACING, rectangle.y],
|
|
149
|
+
[rectangle.x - EQUAL_SPACING, rectangle.y + rectangle.height]
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
function drawResizingPointSnapLines(board, activePoints, snapRectangles, resizeSnapOptions, angle) {
|
|
153
|
+
debugGenerator.isDebug() && debugGenerator.clear();
|
|
154
|
+
const activeRectangle = getRectangleByAngle(RectangleClient.getRectangleByPoints(activePoints), angle) ||
|
|
155
|
+
RectangleClient.getRectangleByPoints(activePoints);
|
|
156
|
+
const { isAspectRatio, directionFactors } = resizeSnapOptions;
|
|
157
|
+
const drawHorizontal = directionFactors[0] !== 0 || isAspectRatio;
|
|
158
|
+
const drawVertical = directionFactors[1] !== 0 || isAspectRatio;
|
|
159
|
+
return drawPointSnapLines(board, activeRectangle, snapRectangles, drawHorizontal, drawVertical);
|
|
160
|
+
}
|
|
161
|
+
function drawIsometricSnapLines(board, activePoints, snapRectangles, resizeSnapOptions, angle) {
|
|
162
|
+
let widthIsometricPoints = [];
|
|
163
|
+
let heightIsometricPoints = [];
|
|
164
|
+
const drawHorizontalLine = resizeSnapOptions.directionFactors[0] !== 0 || resizeSnapOptions.isAspectRatio;
|
|
165
|
+
const drawVerticalLine = resizeSnapOptions.directionFactors[1] !== 0 || resizeSnapOptions.isAspectRatio;
|
|
166
|
+
const activeRectangle = getRectangleByAngle(RectangleClient.getRectangleByPoints(activePoints), angle) ||
|
|
167
|
+
RectangleClient.getRectangleByPoints(activePoints);
|
|
168
|
+
for (let snapRectangle of snapRectangles) {
|
|
169
|
+
if (activeRectangle.width === snapRectangle.width && drawHorizontalLine) {
|
|
170
|
+
widthIsometricPoints.push(getIsometricLinePoints(snapRectangle, true));
|
|
171
|
+
}
|
|
172
|
+
if (activeRectangle.height === snapRectangle.height && drawVerticalLine) {
|
|
173
|
+
heightIsometricPoints.push(getIsometricLinePoints(snapRectangle, false));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (widthIsometricPoints.length && drawHorizontalLine) {
|
|
177
|
+
widthIsometricPoints.push(getIsometricLinePoints(activeRectangle, true));
|
|
178
|
+
}
|
|
179
|
+
if (heightIsometricPoints.length && drawVerticalLine) {
|
|
180
|
+
heightIsometricPoints.push(getIsometricLinePoints(activeRectangle, false));
|
|
181
|
+
}
|
|
182
|
+
const isometricLines = [...widthIsometricPoints, ...heightIsometricPoints];
|
|
183
|
+
return drawSolidLines(board, isometricLines);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC1yZXNpemluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL3NuYXAtcmVzaXppbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILHNDQUFzQyxFQUN0Qyw0QkFBNEIsRUFDNUIsc0JBQXNCLEVBQ3pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFLSCxlQUFlLEVBQ2Ysb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUd0QixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGdCQUFnQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsYUFBYSxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHM0YsTUFBTSxRQUFRLEdBQUcsZ0NBQWdDLENBQUM7QUFDbEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBb0I3RCxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekIsTUFBTSxVQUFVLHlCQUF5QixDQUNyQyxLQUFpQixFQUNqQixTQUEyRCxFQUMzRCxXQUF3QixFQUN4QiwrQkFHQyxFQUNELGFBQXNCLEVBQ3RCLFlBQXFCO0lBRXJCLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsK0JBQStCLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQW1CLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEYsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRTVHLElBQUks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QWEsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUN2QyxJQUFJLGVBQWUsQ0FBQyxLQUFLLEtBQUssYUFBYSxDQUFDLEtBQUssSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN0RSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLG9CQUFvQixDQUFDLE1BQU0sSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3BELG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsSUFBSSxxQkFBcUIsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNuRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxHQUFHLHFCQUFxQixDQUFDLENBQUM7SUFDM0UsT0FBTyxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFJlc2l6ZVJlZixcbiAgICBSZXNpemVTdGF0ZSxcbiAgICBnZXREaXJlY3Rpb25GYWN0b3JCeURpcmVjdGlvbkNvbXBvbmVudCxcbiAgICBnZXRVbml0VmVjdG9yQnlQb2ludEFuZFBvaW50LFxuICAgIHJlc2V0UG9pbnRzQWZ0ZXJSZXNpemVcbn0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQge1xuICAgIERpcmVjdGlvbkZhY3RvcnMsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBQbGFpdEVsZW1lbnQsXG4gICAgUG9pbnQsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGNyZWF0ZURlYnVnR2VuZXJhdG9yLFxuICAgIGNyZWF0ZUcsXG4gICAgZ2V0U2VsZWN0aW9uQW5nbGUsXG4gICAgZ2V0UmVjdGFuZ2xlQnlBbmdsZSxcbiAgICBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzLFxuICAgIFNuYXBEZWx0YSxcbiAgICBTbmFwUmVmLFxuICAgIGdldFNuYXBSZWN0YW5nbGVzLFxuICAgIFNOQVBfVE9MRVJBTkNFLFxuICAgIGRyYXdTb2xpZExpbmVzLFxuICAgIGRyYXdQb2ludFNuYXBMaW5lcyxcbiAgICBnZXRUcmlwbGVBeGlzLFxuICAgIGdldE1pblBvaW50RGVsdGFcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgZ2V0UmVzaXplWm9vbSwgbW92ZVBvaW50Qnlab29tQW5kT3JpZ2luUG9pbnQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtZHJhdy1yZXNpemUnO1xuaW1wb3J0IHsgUGxhaXREcmF3RWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5jb25zdCBkZWJ1Z0tleSA9ICdkZWJ1ZzpwbGFpdDpwb2ludC1mb3ItZ2VvbWV0cnknO1xuZXhwb3J0IGNvbnN0IGRlYnVnR2VuZXJhdG9yID0gY3JlYXRlRGVidWdHZW5lcmF0b3IoZGVidWdLZXkpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZVNuYXBSZWYgZXh0ZW5kcyBTbmFwUmVmIHtcbiAgICB4Wm9vbTogbnVtYmVyO1xuICAgIHlab29tOiBudW1iZXI7XG4gICAgYWN0aXZlUG9pbnRzOiBQb2ludFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZVNuYXBPcHRpb25zIHtcbiAgICByZXNpemVQb2ludHM6IFBvaW50W107XG4gICAgYWN0aXZlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG4gICAgZGlyZWN0aW9uRmFjdG9yczogRGlyZWN0aW9uRmFjdG9ycztcbiAgICBpc0Zyb21Db3JuZXI6IGJvb2xlYW47XG4gICAgaXNBc3BlY3RSYXRpbzogYm9vbGVhbjtcbiAgICByZXNpemVPcmlnaW5Qb2ludD86IFBvaW50W107XG4gICAgb3JpZ2luUG9pbnQ/OiBQb2ludDtcbiAgICBoYW5kbGVQb2ludD86IFBvaW50O1xuICAgIGlzQ3JlYXRlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgRVFVQUxfU1BBQ0lORyA9IDEwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U25hcFJlc2l6aW5nUmVmT3B0aW9ucyhcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICByZXNpemVSZWY6IFJlc2l6ZVJlZjxQbGFpdERyYXdFbGVtZW50IHwgUGxhaXREcmF3RWxlbWVudFtdPixcbiAgICByZXNpemVTdGF0ZTogUmVzaXplU3RhdGUsXG4gICAgcmVzaXplT3JpZ2luUG9pbnRBbmRIYW5kbGVQb2ludDoge1xuICAgICAgICBvcmlnaW5Qb2ludDogUG9pbnQ7XG4gICAgICAgIGhhbmRsZVBvaW50OiBQb2ludDtcbiAgICB9LFxuICAgIGlzQXNwZWN0UmF0aW86IGJvb2xlYW4sXG4gICAgaXNGcm9tQ29ybmVyOiBib29sZWFuXG4pOiBSZXNpemVTbmFwT3B0aW9ucyB7XG4gICAgY29uc3QgeyBvcmlnaW5Qb2ludCwgaGFuZGxlUG9pbnQgfSA9IHJlc2l6ZU9yaWdpblBvaW50QW5kSGFuZGxlUG9pbnQ7XG4gICAgY29uc3QgcmVzaXplUG9pbnRzOiBbUG9pbnQsIFBvaW50XSA9IFtyZXNpemVTdGF0ZS5zdGFydFBvaW50LCByZXNpemVTdGF0ZS5lbmRQb2ludF07XG4gICAgY29uc3QgeyB4Wm9vbSwgeVpvb20gfSA9IGdldFJlc2l6ZVpvb20ocmVzaXplUG9pbnRzLCBvcmlnaW5Qb2ludCwgaGFuZGxlUG9pbnQsIGlzRnJvbUNvcm5lciwgaXNBc3BlY3RSYXRpbyk7XG5cbiAgICBsZXQgYWN0aXZlRWxlbWVudHM6IFBsYWl0RWxlbWVudFtdO1xuICAgIGxldCByZXNpemVPcmlnaW5Qb2ludDogUG9pbnRbXSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc2l6ZVJlZi5lbGVtZW50KSkge1xuICAgICAgICBhY3RpdmVFbGVtZW50cyA9IHJlc2l6ZVJlZi5lbGVtZW50O1xuICAgICAgICBjb25zdCByZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCByZXNpemVSZWYuZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICByZXNpemVPcmlnaW5Qb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRQb2ludHMocmVjdGFuZ2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVFbGVtZW50cyA9IFtyZXNpemVSZWYuZWxlbWVudF07XG4gICAgICAgIHJlc2l6ZU9yaWdpblBvaW50ID0gcmVzaXplUmVmLmVsZW1lbnQucG9pbnRzO1xuICAgIH1cblxuICAgIGNvbnN0IHBvaW50cyA9IHJlc2l6ZU9yaWdpblBvaW50Lm1hcChwID0+IHtcbiAgICAgICAgcmV0dXJuIG1vdmVQb2ludEJ5Wm9vbUFuZE9yaWdpblBvaW50KHAsIG9yaWdpblBvaW50LCB4Wm9vbSwgeVpvb20pO1xuICAgIH0pIGFzIFtQb2ludCwgUG9pbnRdO1xuICAgIGNvbnN0IGFjdGl2ZVJlY3RhbmdsZSA9XG4gICAgICAgIGdldFJlY3RhbmdsZUJ5QW5nbGUoUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHBvaW50cyksIGdldFNlbGVjdGlvbkFuZ2xlKGFjdGl2ZUVsZW1lbnRzKSkgfHxcbiAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHBvaW50cyk7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlUG9pbnQgPSBtb3ZlUG9pbnRCeVpvb21BbmRPcmlnaW5Qb2ludChoYW5kbGVQb2ludCwgb3JpZ2luUG9pbnQsIHhab29tLCB5Wm9vbSk7XG4gICAgY29uc3QgW3gsIHldID0gZ2V0VW5pdFZlY3RvckJ5UG9pbnRBbmRQb2ludChvcmlnaW5Qb2ludCwgcmVzaXplSGFuZGxlUG9pbnQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc2l6ZVBvaW50cyxcbiAgICAgICAgcmVzaXplT3JpZ2luUG9pbnQsXG4gICAgICAgIGFjdGl2ZVJlY3RhbmdsZSxcbiAgICAgICAgb3JpZ2luUG9pbnQsXG4gICAgICAgIGhhbmRsZVBvaW50LFxuICAgICAgICBkaXJlY3Rpb25GYWN0b3JzOiBbZ2V0RGlyZWN0aW9uRmFjdG9yQnlEaXJlY3Rpb25Db21wb25lbnQoeCksIGdldERpcmVjdGlvbkZhY3RvckJ5RGlyZWN0aW9uQ29tcG9uZW50KHkpXSxcbiAgICAgICAgaXNBc3BlY3RSYXRpbyxcbiAgICAgICAgaXNGcm9tQ29ybmVyXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNuYXBSZXNpemluZ1JlZihib2FyZDogUGxhaXRCb2FyZCwgYWN0aXZlRWxlbWVudHM6IFBsYWl0RWxlbWVudFtdLCByZXNpemVTbmFwT3B0aW9uczogUmVzaXplU25hcE9wdGlvbnMpOiBSZXNpemVTbmFwUmVmIHtcbiAgICBjb25zdCBzbmFwRyA9IGNyZWF0ZUcoKTtcbiAgICBjb25zdCBzbmFwUmVjdGFuZ2xlcyA9IGdldFNuYXBSZWN0YW5nbGVzKGJvYXJkLCBhY3RpdmVFbGVtZW50cyk7XG4gICAgbGV0IHNuYXBMaW5lRGVsdGEgPSBnZXRJc29tZXRyaWNMaW5lRGVsdGEoc25hcFJlY3RhbmdsZXMsIHJlc2l6ZVNuYXBPcHRpb25zKTtcbiAgICBpZiAoc25hcExpbmVEZWx0YS5kZWx0YVggPT09IDAgJiYgc25hcExpbmVEZWx0YS5kZWx0YVkgPT09IDApIHtcbiAgICAgICAgc25hcExpbmVEZWx0YSA9IGdldFNuYXBQb2ludERlbHRhKHNuYXBSZWN0YW5nbGVzLCByZXNpemVTbmFwT3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IGFuZ2xlID0gZ2V0U2VsZWN0aW9uQW5nbGUoYWN0aXZlRWxlbWVudHMpO1xuICAgIGNvbnN0IGFjdGl2ZVBvaW50QW5kWm9vbSA9IGdldEFjdGl2ZVBvaW50QW5kWm9vbShzbmFwTGluZURlbHRhLCByZXNpemVTbmFwT3B0aW9ucywgYW5nbGUpO1xuICAgIGNvbnN0IGlzb21ldHJpY0xpbmVzRyA9IGRyYXdJc29tZXRyaWNTbmFwTGluZXMoYm9hcmQsIGFjdGl2ZVBvaW50QW5kWm9vbS5hY3RpdmVQb2ludHMsIHNuYXBSZWN0YW5nbGVzLCByZXNpemVTbmFwT3B0aW9ucywgYW5nbGUpO1xuICAgIGNvbnN0IHBvaW50TGluZXNHID0gZHJhd1Jlc2l6aW5nUG9pbnRTbmFwTGluZXMoYm9hcmQsIGFjdGl2ZVBvaW50QW5kWm9vbS5hY3RpdmVQb2ludHMsIHNuYXBSZWN0YW5nbGVzLCByZXNpemVTbmFwT3B0aW9ucywgYW5nbGUpO1xuICAgIHNuYXBHLmFwcGVuZChpc29tZXRyaWNMaW5lc0csIHBvaW50TGluZXNHKTtcbiAgICByZXR1cm4geyAuLi5hY3RpdmVQb2ludEFuZFpvb20sIC4uLnNuYXBMaW5lRGVsdGEsIHNuYXBHIH07XG59XG5cbmZ1bmN0aW9uIGdldFNuYXBQb2ludERlbHRhKHNuYXBSZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSwgcmVzaXplU25hcE9wdGlvbnM6IFJlc2l6ZVNuYXBPcHRpb25zKSB7XG4gICAgbGV0IHBvaW50TGluZURlbHRhOiBTbmFwRGVsdGEgPSB7XG4gICAgICAgIGRlbHRhWDogMCxcbiAgICAgICAgZGVsdGFZOiAwXG4gICAgfTtcbiAgICBjb25zdCB7IGlzQXNwZWN0UmF0aW8sIGFjdGl2ZVJlY3RhbmdsZSwgZGlyZWN0aW9uRmFjdG9ycyB9ID0gcmVzaXplU25hcE9wdGlvbnM7XG4gICAgY29uc3QgZHJhd0hvcml6b250YWwgPSBkaXJlY3Rpb25GYWN0b3JzWzBdICE9PSAwIHx8IGlzQXNwZWN0UmF0aW87XG4gICAgY29uc3QgZHJhd1ZlcnRpY2FsID0gZGlyZWN0aW9uRmFjdG9yc1sxXSAhPT0gMCB8fCBpc0FzcGVjdFJhdGlvO1xuXG4gICAgaWYgKGRyYXdIb3Jpem9udGFsKSB7XG4gICAgICAgIGNvbnN0IHhTbmFwQXhpcyA9IGdldFRyaXBsZUF4aXMoYWN0aXZlUmVjdGFuZ2xlLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcG9pbnRYID0gZGlyZWN0aW9uRmFjdG9yc1swXSA9PT0gLTEgPyB4U25hcEF4aXNbMF0gOiB4U25hcEF4aXNbMl07XG4gICAgICAgIGNvbnN0IGRlbHRhWCA9IGdldE1pblBvaW50RGVsdGEoc25hcFJlY3RhbmdsZXMsIHBvaW50WCwgdHJ1ZSk7XG4gICAgICAgIGlmIChNYXRoLmFicyhkZWx0YVgpIDwgU05BUF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50TGluZURlbHRhLmRlbHRhWCA9IGRlbHRhWDtcbiAgICAgICAgICAgIGlmIChwb2ludExpbmVEZWx0YS5kZWx0YVggIT09IDAgJiYgaXNBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIHBvaW50TGluZURlbHRhLmRlbHRhWSA9IHBvaW50TGluZURlbHRhLmRlbHRhWCAvIChhY3RpdmVSZWN0YW5nbGUud2lkdGggLyBhY3RpdmVSZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRMaW5lRGVsdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZHJhd1ZlcnRpY2FsKSB7XG4gICAgICAgIGNvbnN0IHlTbmFwQXhpcyA9IGdldFRyaXBsZUF4aXMoYWN0aXZlUmVjdGFuZ2xlLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHBvaW50WSA9IGRpcmVjdGlvbkZhY3RvcnNbMV0gPT09IC0xID8geVNuYXBBeGlzWzBdIDogeVNuYXBBeGlzWzJdO1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBnZXRNaW5Qb2ludERlbHRhKHNuYXBSZWN0YW5nbGVzLCBwb2ludFksIGZhbHNlKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGRlbHRhWSkgPCBTTkFQX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRMaW5lRGVsdGEuZGVsdGFZID0gZGVsdGFZO1xuICAgICAgICAgICAgaWYgKHBvaW50TGluZURlbHRhLmRlbHRhWSAhPT0gMCAmJiBpc0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRMaW5lRGVsdGEuZGVsdGFYID0gcG9pbnRMaW5lRGVsdGEuZGVsdGFZICogKGFjdGl2ZVJlY3RhbmdsZS53aWR0aCAvIGFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2ludExpbmVEZWx0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2ludExpbmVEZWx0YTtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlUG9pbnRBbmRab29tKHJlc2l6ZVNuYXBEZWx0YTogU25hcERlbHRhLCByZXNpemVTbmFwT3B0aW9uczogUmVzaXplU25hcE9wdGlvbnMsIGFuZ2xlOiBudW1iZXIpIHtcbiAgICBjb25zdCB7IGRlbHRhWCwgZGVsdGFZIH0gPSByZXNpemVTbmFwRGVsdGE7XG4gICAgY29uc3QgeyByZXNpemVQb2ludHMsIGlzQ3JlYXRlIH0gPSByZXNpemVTbmFwT3B0aW9ucztcbiAgICBjb25zdCBuZXdSZXNpemVQb2ludHM6IFtQb2ludCwgUG9pbnRdID0gW3Jlc2l6ZVBvaW50c1swXSwgW3Jlc2l6ZVBvaW50c1sxXVswXSArIGRlbHRhWCwgcmVzaXplUG9pbnRzWzFdWzFdICsgZGVsdGFZXV07XG4gICAgbGV0IGFjdGl2ZVBvaW50cyA9IG5ld1Jlc2l6ZVBvaW50cztcbiAgICBsZXQgeFpvb20gPSAwO1xuICAgIGxldCB5Wm9vbSA9IDA7XG4gICAgaWYgKCFpc0NyZWF0ZSkge1xuICAgICAgICBjb25zdCB7IG9yaWdpblBvaW50LCBoYW5kbGVQb2ludCwgaXNGcm9tQ29ybmVyLCBpc0FzcGVjdFJhdGlvLCByZXNpemVPcmlnaW5Qb2ludCB9ID0gcmVzaXplU25hcE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHJlc2l6ZVpvb20gPSBnZXRSZXNpemVab29tKG5ld1Jlc2l6ZVBvaW50cywgb3JpZ2luUG9pbnQhLCBoYW5kbGVQb2ludCEsIGlzRnJvbUNvcm5lciwgaXNBc3BlY3RSYXRpbyk7XG4gICAgICAgIHhab29tID0gcmVzaXplWm9vbS54Wm9vbTtcbiAgICAgICAgeVpvb20gPSByZXNpemVab29tLnlab29tO1xuICAgICAgICBhY3RpdmVQb2ludHMgPSByZXNpemVPcmlnaW5Qb2ludCEubWFwKHAgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1vdmVQb2ludEJ5Wm9vbUFuZE9yaWdpblBvaW50KHAsIG9yaWdpblBvaW50ISwgeFpvb20sIHlab29tKTtcbiAgICAgICAgfSkgYXMgW1BvaW50LCBQb2ludF07XG4gICAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICAgICAgYWN0aXZlUG9pbnRzID0gcmVzZXRQb2ludHNBZnRlclJlc2l6ZShcbiAgICAgICAgICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocmVzaXplT3JpZ2luUG9pbnQhKSxcbiAgICAgICAgICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYWN0aXZlUG9pbnRzKSxcbiAgICAgICAgICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0Q2VudGVyUG9pbnQoUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKHJlc2l6ZU9yaWdpblBvaW50ISkpLFxuICAgICAgICAgICAgICAgIFJlY3RhbmdsZUNsaWVudC5nZXRDZW50ZXJQb2ludChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYWN0aXZlUG9pbnRzKSksXG4gICAgICAgICAgICAgICAgYW5nbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4Wm9vbSxcbiAgICAgICAgeVpvb20sXG4gICAgICAgIGFjdGl2ZVBvaW50c1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldElzb21ldHJpY0xpbmVEZWx0YShzbmFwUmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W10sIHJlc2l6ZVNuYXBPcHRpb25zOiBSZXNpemVTbmFwT3B0aW9ucykge1xuICAgIGxldCBpc29tZXRyaWNMaW5lRGVsdGE6IFNuYXBEZWx0YSA9IHtcbiAgICAgICAgZGVsdGFYOiAwLFxuICAgICAgICBkZWx0YVk6IDBcbiAgICB9O1xuICAgIGNvbnN0IHsgaXNBc3BlY3RSYXRpbywgYWN0aXZlUmVjdGFuZ2xlIH0gPSByZXNpemVTbmFwT3B0aW9ucztcbiAgICBjb25zdCB3aWR0aFNuYXBSZWN0YW5nbGUgPSBzbmFwUmVjdGFuZ2xlcy5maW5kKGl0ZW0gPT4gTWF0aC5hYnMoaXRlbS53aWR0aCAtIGFjdGl2ZVJlY3RhbmdsZS53aWR0aCkgPCBTTkFQX1RPTEVSQU5DRSk7XG4gICAgaWYgKHdpZHRoU25hcFJlY3RhbmdsZSkge1xuICAgICAgICBjb25zdCBkZWx0YVdpZHRoID0gd2lkdGhTbmFwUmVjdGFuZ2xlLndpZHRoIC0gYWN0aXZlUmVjdGFuZ2xlLndpZHRoO1xuICAgICAgICBpc29tZXRyaWNMaW5lRGVsdGEuZGVsdGFYID0gZGVsdGFXaWR0aCAqIHJlc2l6ZVNuYXBPcHRpb25zLmRpcmVjdGlvbkZhY3RvcnNbMF07XG4gICAgICAgIGlmIChpc0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YUhlaWdodCA9IGRlbHRhV2lkdGggLyAoYWN0aXZlUmVjdGFuZ2xlLndpZHRoIC8gYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgICAgICBpc29tZXRyaWNMaW5lRGVsdGEuZGVsdGFZID0gZGVsdGFIZWlnaHQgKiByZXNpemVTbmFwT3B0aW9ucy5kaXJlY3Rpb25GYWN0b3JzWzFdO1xuICAgICAgICAgICAgcmV0dXJuIGlzb21ldHJpY0xpbmVEZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoZWlnaHRTbmFwUmVjdGFuZ2xlID0gc25hcFJlY3RhbmdsZXMuZmluZChpdGVtID0+IE1hdGguYWJzKGl0ZW0uaGVpZ2h0IC0gYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCkgPCBTTkFQX1RPTEVSQU5DRSk7XG4gICAgaWYgKGhlaWdodFNuYXBSZWN0YW5nbGUpIHtcbiAgICAgICAgY29uc3QgZGVsdGFIZWlnaHQgPSBoZWlnaHRTbmFwUmVjdGFuZ2xlLmhlaWdodCAtIGFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQ7XG4gICAgICAgIGlzb21ldHJpY0xpbmVEZWx0YS5kZWx0YVkgPSBkZWx0YUhlaWdodCAqIHJlc2l6ZVNuYXBPcHRpb25zLmRpcmVjdGlvbkZhY3RvcnNbMV07XG4gICAgICAgIGlmIChpc0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YVdpZHRoID0gZGVsdGFIZWlnaHQgKiAoYWN0aXZlUmVjdGFuZ2xlLndpZHRoIC8gYWN0aXZlUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgICAgICBpc29tZXRyaWNMaW5lRGVsdGEuZGVsdGFYID0gZGVsdGFXaWR0aCAqIHJlc2l6ZVNuYXBPcHRpb25zLmRpcmVjdGlvbkZhY3RvcnNbMF07XG4gICAgICAgICAgICByZXR1cm4gaXNvbWV0cmljTGluZURlbHRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc29tZXRyaWNMaW5lRGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldElzb21ldHJpY0xpbmVQb2ludHMocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIGlzSG9yaXpvbnRhbDogYm9vbGVhbik6IFBvaW50W10ge1xuICAgIHJldHVybiBpc0hvcml6b250YWxcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFtyZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnkgLSBFUVVBTF9TUEFDSU5HXSxcbiAgICAgICAgICAgICAgW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUueSAtIEVRVUFMX1NQQUNJTkddXG4gICAgICAgICAgXVxuICAgICAgICA6IFtcbiAgICAgICAgICAgICAgW3JlY3RhbmdsZS54IC0gRVFVQUxfU1BBQ0lORywgcmVjdGFuZ2xlLnldLFxuICAgICAgICAgICAgICBbcmVjdGFuZ2xlLnggLSBFUVVBTF9TUEFDSU5HLCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHRdXG4gICAgICAgICAgXTtcbn1cblxuZnVuY3Rpb24gZHJhd1Jlc2l6aW5nUG9pbnRTbmFwTGluZXMoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgYWN0aXZlUG9pbnRzOiBQb2ludFtdLFxuICAgIHNuYXBSZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSxcbiAgICByZXNpemVTbmFwT3B0aW9uczogUmVzaXplU25hcE9wdGlvbnMsXG4gICAgYW5nbGU6IG51bWJlclxuKSB7XG4gICAgZGVidWdHZW5lcmF0b3IuaXNEZWJ1ZygpICYmIGRlYnVnR2VuZXJhdG9yLmNsZWFyKCk7XG4gICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID1cbiAgICAgICAgZ2V0UmVjdGFuZ2xlQnlBbmdsZShSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYWN0aXZlUG9pbnRzKSwgYW5nbGUpIHx8XG4gICAgICAgIFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhhY3RpdmVQb2ludHMpO1xuXG4gICAgY29uc3QgeyBpc0FzcGVjdFJhdGlvLCBkaXJlY3Rpb25GYWN0b3JzIH0gPSByZXNpemVTbmFwT3B0aW9ucztcbiAgICBjb25zdCBkcmF3SG9yaXpvbnRhbCA9IGRpcmVjdGlvbkZhY3RvcnNbMF0gIT09IDAgfHwgaXNBc3BlY3RSYXRpbztcbiAgICBjb25zdCBkcmF3VmVydGljYWwgPSBkaXJlY3Rpb25GYWN0b3JzWzFdICE9PSAwIHx8IGlzQXNwZWN0UmF0aW87XG4gICAgcmV0dXJuIGRyYXdQb2ludFNuYXBMaW5lcyhib2FyZCwgYWN0aXZlUmVjdGFuZ2xlLCBzbmFwUmVjdGFuZ2xlcywgZHJhd0hvcml6b250YWwsIGRyYXdWZXJ0aWNhbCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdJc29tZXRyaWNTbmFwTGluZXMoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgYWN0aXZlUG9pbnRzOiBQb2ludFtdLFxuICAgIHNuYXBSZWN0YW5nbGVzOiBSZWN0YW5nbGVDbGllbnRbXSxcbiAgICByZXNpemVTbmFwT3B0aW9uczogUmVzaXplU25hcE9wdGlvbnMsXG4gICAgYW5nbGU6IG51bWJlclxuKSB7XG4gICAgbGV0IHdpZHRoSXNvbWV0cmljUG9pbnRzID0gW107XG4gICAgbGV0IGhlaWdodElzb21ldHJpY1BvaW50cyA9IFtdO1xuXG4gICAgY29uc3QgZHJhd0hvcml6b250YWxMaW5lID0gcmVzaXplU25hcE9wdGlvbnMuZGlyZWN0aW9uRmFjdG9yc1swXSAhPT0gMCB8fCByZXNpemVTbmFwT3B0aW9ucy5pc0FzcGVjdFJhdGlvO1xuICAgIGNvbnN0IGRyYXdWZXJ0aWNhbExpbmUgPSByZXNpemVTbmFwT3B0aW9ucy5kaXJlY3Rpb25GYWN0b3JzWzFdICE9PSAwIHx8IHJlc2l6ZVNuYXBPcHRpb25zLmlzQXNwZWN0UmF0aW87XG4gICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID1cbiAgICAgICAgZ2V0UmVjdGFuZ2xlQnlBbmdsZShSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYWN0aXZlUG9pbnRzKSwgYW5nbGUpIHx8XG4gICAgICAgIFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhhY3RpdmVQb2ludHMpO1xuICAgIGZvciAobGV0IHNuYXBSZWN0YW5nbGUgb2Ygc25hcFJlY3RhbmdsZXMpIHtcbiAgICAgICAgaWYgKGFjdGl2ZVJlY3RhbmdsZS53aWR0aCA9PT0gc25hcFJlY3RhbmdsZS53aWR0aCAmJiBkcmF3SG9yaXpvbnRhbExpbmUpIHtcbiAgICAgICAgICAgIHdpZHRoSXNvbWV0cmljUG9pbnRzLnB1c2goZ2V0SXNvbWV0cmljTGluZVBvaW50cyhzbmFwUmVjdGFuZ2xlLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGl2ZVJlY3RhbmdsZS5oZWlnaHQgPT09IHNuYXBSZWN0YW5nbGUuaGVpZ2h0ICYmIGRyYXdWZXJ0aWNhbExpbmUpIHtcbiAgICAgICAgICAgIGhlaWdodElzb21ldHJpY1BvaW50cy5wdXNoKGdldElzb21ldHJpY0xpbmVQb2ludHMoc25hcFJlY3RhbmdsZSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAod2lkdGhJc29tZXRyaWNQb2ludHMubGVuZ3RoICYmIGRyYXdIb3Jpem9udGFsTGluZSkge1xuICAgICAgICB3aWR0aElzb21ldHJpY1BvaW50cy5wdXNoKGdldElzb21ldHJpY0xpbmVQb2ludHMoYWN0aXZlUmVjdGFuZ2xlLCB0cnVlKSk7XG4gICAgfVxuICAgIGlmIChoZWlnaHRJc29tZXRyaWNQb2ludHMubGVuZ3RoICYmIGRyYXdWZXJ0aWNhbExpbmUpIHtcbiAgICAgICAgaGVpZ2h0SXNvbWV0cmljUG9pbnRzLnB1c2goZ2V0SXNvbWV0cmljTGluZVBvaW50cyhhY3RpdmVSZWN0YW5nbGUsIGZhbHNlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNvbWV0cmljTGluZXMgPSBbLi4ud2lkdGhJc29tZXRyaWNQb2ludHMsIC4uLmhlaWdodElzb21ldHJpY1BvaW50c107XG4gICAgcmV0dXJuIGRyYXdTb2xpZExpbmVzKGJvYXJkLCBpc29tZXRyaWNMaW5lcyk7XG59XG5cbiJdfQ==
|
|
@@ -21,9 +21,16 @@ export const getFillByElement = (board, element) => {
|
|
|
21
21
|
return fill;
|
|
22
22
|
};
|
|
23
23
|
export const getLineDashByElement = (element) => {
|
|
24
|
-
|
|
24
|
+
switch (element.strokeStyle) {
|
|
25
|
+
case StrokeStyle.dashed:
|
|
26
|
+
return [8, 8 + getStrokeWidthByElement(element)];
|
|
27
|
+
case StrokeStyle.dotted:
|
|
28
|
+
return [0, 4 + getStrokeWidthByElement(element)];
|
|
29
|
+
default:
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
25
32
|
};
|
|
26
33
|
export const getStrokeStyleByElement = (element) => {
|
|
27
34
|
return element.strokeStyle || StrokeStyle.solid;
|
|
28
35
|
};
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Ryb2tlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvdXRpbHMvc3R5bGUvc3Ryb2tlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBNEIsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsT0FBa0MsRUFBRSxFQUFFO0lBQzFFLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQyxXQUFXLENBQUM7SUFDNUUsT0FBTyxXQUFXLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQWtDLEVBQUUsRUFBRTtJQUM3RixNQUFNLFlBQVksR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksWUFBWSxDQUFDO0lBQ3hELE9BQU8sV0FBVyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQyxFQUFFLEVBQUU7SUFDdEYsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNyRCxDQUFDLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDckQsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQztJQUN6QyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQWtDLEVBQUUsRUFBRTtJQUN2RSxRQUFRLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixLQUFLLFdBQVcsQ0FBQyxNQUFNO1lBQ25CLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDckQsS0FBSyxXQUFXLENBQUMsTUFBTTtZQUNuQixPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3JEO1lBQ0ksT0FBTyxTQUFTLENBQUM7SUFDekIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsT0FBa0MsRUFBRSxFQUFFO0lBQzFFLE9BQU8sT0FBTyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDO0FBQ3BELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0RHJhd0VsZW1lbnQsIFBsYWl0R2VvbWV0cnksIFBsYWl0TGluZSwgU3Ryb2tlU3R5bGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERlZmF1bHRHZW9tZXRyeVN0eWxlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXREcmF3RGVmYXVsdFN0cm9rZUNvbG9yLCBnZXRGbG93Y2hhcnREZWZhdWx0RmlsbCB9IGZyb20gJy4uL2dlb21ldHJ5JztcblxuZXhwb3J0IGNvbnN0IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50ID0gKGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkgfCBQbGFpdExpbmUpID0+IHtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc1RleHQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZWxlbWVudC5zdHJva2VXaWR0aCB8fCBEZWZhdWx0R2VvbWV0cnlTdHlsZS5zdHJva2VXaWR0aDtcbiAgICByZXR1cm4gc3Ryb2tlV2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3Ryb2tlQ29sb3JCeUVsZW1lbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkgfCBQbGFpdExpbmUpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0Q29sb3IgPSBnZXREcmF3RGVmYXVsdFN0cm9rZUNvbG9yKGJvYXJkLnRoZW1lLnRoZW1lQ29sb3JNb2RlKTtcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IGVsZW1lbnQuc3Ryb2tlQ29sb3IgfHwgZGVmYXVsdENvbG9yO1xuICAgIHJldHVybiBzdHJva2VDb2xvcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxsQnlFbGVtZW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEdlb21ldHJ5IHwgUGxhaXRMaW5lKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdEZpbGwgPSBQbGFpdERyYXdFbGVtZW50LmlzRmxvd2NoYXJ0KGVsZW1lbnQpXG4gICAgICAgID8gZ2V0Rmxvd2NoYXJ0RGVmYXVsdEZpbGwoYm9hcmQudGhlbWUudGhlbWVDb2xvck1vZGUpXG4gICAgICAgIDogRGVmYXVsdEdlb21ldHJ5U3R5bGUuZmlsbDtcbiAgICBjb25zdCBmaWxsID0gZWxlbWVudC5maWxsIHx8IGRlZmF1bHRGaWxsO1xuICAgIHJldHVybiBmaWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldExpbmVEYXNoQnlFbGVtZW50ID0gKGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkgfCBQbGFpdExpbmUpID0+IHtcbiAgICBzd2l0Y2ggKGVsZW1lbnQuc3Ryb2tlU3R5bGUpIHtcbiAgICAgICAgY2FzZSBTdHJva2VTdHlsZS5kYXNoZWQ6XG4gICAgICAgICAgICByZXR1cm4gWzgsIDggKyBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KV07XG4gICAgICAgIGNhc2UgU3Ryb2tlU3R5bGUuZG90dGVkOlxuICAgICAgICAgICAgcmV0dXJuIFswLCA0ICsgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCldO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3Ryb2tlU3R5bGVCeUVsZW1lbnQgPSAoZWxlbWVudDogUGxhaXRHZW9tZXRyeSB8IFBsYWl0TGluZSkgPT4ge1xuICAgIHJldHVybiBlbGVtZW50LnN0cm9rZVN0eWxlIHx8IFN0cm9rZVN0eWxlLnNvbGlkO1xufTtcbiJdfQ==
|