@plait/mind 0.77.2 → 0.78.0-next.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/fesm2022/plait-mind.mjs +2 -2
- package/fesm2022/plait-mind.mjs.map +1 -1
- package/package.json +1 -3
- package/esm2022/constants/abstract-node.mjs +0 -5
- package/esm2022/constants/default.mjs +0 -17
- package/esm2022/constants/index.mjs +0 -5
- package/esm2022/constants/node-style.mjs +0 -19
- package/esm2022/constants/node-topic-style.mjs +0 -7
- package/esm2022/constants/theme.mjs +0 -73
- package/esm2022/emoji/emoji-base.component.mjs +0 -6
- package/esm2022/emoji/index.mjs +0 -3
- package/esm2022/emoji/with-emoji.mjs +0 -8
- package/esm2022/generators/node-active.generator.mjs +0 -46
- package/esm2022/generators/node-collapse.generator.mjs +0 -108
- package/esm2022/generators/node-emojis.generator.mjs +0 -63
- package/esm2022/generators/node-plus.generator.mjs +0 -100
- package/esm2022/generators/node-shape.generator.mjs +0 -22
- package/esm2022/interfaces/element-data.mjs +0 -2
- package/esm2022/interfaces/element.mjs +0 -103
- package/esm2022/interfaces/index.mjs +0 -8
- package/esm2022/interfaces/layout.mjs +0 -19
- package/esm2022/interfaces/node.mjs +0 -14
- package/esm2022/interfaces/options.mjs +0 -2
- package/esm2022/interfaces/pointer.mjs +0 -5
- package/esm2022/interfaces/theme-color.mjs +0 -57
- package/esm2022/interfaces/types.mjs +0 -13
- package/esm2022/mind-node.component.mjs +0 -193
- package/esm2022/mind.component.mjs +0 -34
- package/esm2022/plait-mind.mjs +0 -5
- package/esm2022/plugins/with-abstract-resize.board.mjs +0 -12
- package/esm2022/plugins/with-abstract-resize.mjs +0 -112
- package/esm2022/plugins/with-mind-create.mjs +0 -104
- package/esm2022/plugins/with-mind-extend.mjs +0 -7
- package/esm2022/plugins/with-mind-fragment.mjs +0 -101
- package/esm2022/plugins/with-mind-hotkey.mjs +0 -62
- package/esm2022/plugins/with-mind.board.mjs +0 -2
- package/esm2022/plugins/with-mind.mjs +0 -148
- package/esm2022/plugins/with-node-dnd.mjs +0 -176
- package/esm2022/plugins/with-node-hover-hit-test.mjs +0 -23
- package/esm2022/plugins/with-node-image-resize.mjs +0 -46
- package/esm2022/plugins/with-node-image.mjs +0 -113
- package/esm2022/plugins/with-node-resize.mjs +0 -69
- package/esm2022/public-api.mjs +0 -16
- package/esm2022/queries/get-available-sublayouts-by-element.mjs +0 -23
- package/esm2022/queries/get-branch-layouts.mjs +0 -18
- package/esm2022/queries/get-correct-layout-by-element.mjs +0 -48
- package/esm2022/queries/get-layout-by-element.mjs +0 -18
- package/esm2022/queries/index.mjs +0 -11
- package/esm2022/transforms/abstract-node.mjs +0 -73
- package/esm2022/transforms/emoji.mjs +0 -41
- package/esm2022/transforms/image.mjs +0 -31
- package/esm2022/transforms/index.mjs +0 -30
- package/esm2022/transforms/layout.mjs +0 -19
- package/esm2022/transforms/node.mjs +0 -99
- package/esm2022/transforms/property.mjs +0 -34
- package/esm2022/utils/abstract/common.mjs +0 -170
- package/esm2022/utils/abstract/resize.mjs +0 -194
- package/esm2022/utils/clipboard.mjs +0 -108
- package/esm2022/utils/common.mjs +0 -26
- package/esm2022/utils/dnd/common.mjs +0 -59
- package/esm2022/utils/dnd/detector.mjs +0 -176
- package/esm2022/utils/draw/abstract-outline.mjs +0 -118
- package/esm2022/utils/draw/node-dnd.mjs +0 -164
- package/esm2022/utils/draw/node-link/abstract-link.mjs +0 -60
- package/esm2022/utils/draw/node-link/draw-link.mjs +0 -9
- package/esm2022/utils/draw/node-link/indented-link.mjs +0 -46
- package/esm2022/utils/draw/node-link/logic-link.mjs +0 -76
- package/esm2022/utils/draw/node-shape.mjs +0 -26
- package/esm2022/utils/index.mjs +0 -17
- package/esm2022/utils/layout.mjs +0 -105
- package/esm2022/utils/mind.mjs +0 -98
- package/esm2022/utils/node/adjust-node.mjs +0 -36
- package/esm2022/utils/node/common.mjs +0 -15
- package/esm2022/utils/node/create-node.mjs +0 -46
- package/esm2022/utils/node/dynamic-width.mjs +0 -14
- package/esm2022/utils/node/image.mjs +0 -15
- package/esm2022/utils/node/index.mjs +0 -6
- package/esm2022/utils/node/right-node-count.mjs +0 -45
- package/esm2022/utils/node-hover/extend.mjs +0 -50
- package/esm2022/utils/node-style/branch.mjs +0 -63
- package/esm2022/utils/node-style/common.mjs +0 -4
- package/esm2022/utils/node-style/index.mjs +0 -4
- package/esm2022/utils/node-style/shape.mjs +0 -37
- package/esm2022/utils/normalize.mjs +0 -40
- package/esm2022/utils/path.mjs +0 -12
- package/esm2022/utils/point-placement.mjs +0 -119
- package/esm2022/utils/position/emoji.mjs +0 -31
- package/esm2022/utils/position/image.mjs +0 -36
- package/esm2022/utils/position/index.mjs +0 -5
- package/esm2022/utils/position/node.mjs +0 -36
- package/esm2022/utils/position/topic.mjs +0 -16
- package/esm2022/utils/space/emoji.mjs +0 -20
- package/esm2022/utils/space/index.mjs +0 -4
- package/esm2022/utils/space/layout-options.mjs +0 -69
- package/esm2022/utils/space/node-space.mjs +0 -134
- package/esm2022/utils/weak-maps.mjs +0 -2
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, RectangleClient, Transforms, depthFirstRecursion, PlaitElement, getIsRecursionFunc, toHostPoint, toViewBoxPoint } from '@plait/core';
|
|
2
|
-
import { MindElement, PlaitMind } from '../interfaces';
|
|
3
|
-
import { PlaitMindComponent } from '../mind.component';
|
|
4
|
-
import { MindNodeComponent } from '../mind-node.component';
|
|
5
|
-
import { getRectangleByNode, isHitMindElement } from '../utils/position/node';
|
|
6
|
-
import { withNodeDnd } from './with-node-dnd';
|
|
7
|
-
import { editTopic } from '../utils/node/common';
|
|
8
|
-
import { withAbstract } from './with-abstract-resize';
|
|
9
|
-
import { withMindExtend } from './with-mind-extend';
|
|
10
|
-
import { withCreateMind } from './with-mind-create';
|
|
11
|
-
import { withMindHotkey } from './with-mind-hotkey';
|
|
12
|
-
import { withNodeHoverHitTest } from './with-node-hover-hit-test';
|
|
13
|
-
import { withNodeImage } from './with-node-image';
|
|
14
|
-
import { withNodeResize } from './with-node-resize';
|
|
15
|
-
import { withNodeImageResize } from './with-node-image-resize';
|
|
16
|
-
import { withMindFragment } from './with-mind-fragment';
|
|
17
|
-
import { withEmoji } from '../emoji/with-emoji';
|
|
18
|
-
import { fixMindElementData, fixMindElementWidthAndHeight, isNormalizedData, isNormalizedWidthAndHeight } from '../utils/normalize';
|
|
19
|
-
export const withMind = (baseBoard) => {
|
|
20
|
-
const board = baseBoard;
|
|
21
|
-
const { drawElement, dblClick, isRectangleHit, isHit, getRectangle, isMovable, isRecursion, isAlign, isImageBindingAllowed, canAddToGroup, canSetZIndex, isExpanded, getOneHitElement, normalizeElement } = board;
|
|
22
|
-
board.normalizeElement = (context) => {
|
|
23
|
-
if (PlaitMind.isMind(context.element)) {
|
|
24
|
-
depthFirstRecursion(context.element, (node) => {
|
|
25
|
-
if (!isNormalizedData(node)) {
|
|
26
|
-
fixMindElementData(node);
|
|
27
|
-
}
|
|
28
|
-
if (!isNormalizedWidthAndHeight(node)) {
|
|
29
|
-
fixMindElementWidthAndHeight(node);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
normalizeElement(context);
|
|
34
|
-
};
|
|
35
|
-
board.drawElement = (context) => {
|
|
36
|
-
if (PlaitMind.isMind(context.element)) {
|
|
37
|
-
return PlaitMindComponent;
|
|
38
|
-
}
|
|
39
|
-
else if (MindElement.isMindElement(board, context.element)) {
|
|
40
|
-
return MindNodeComponent;
|
|
41
|
-
}
|
|
42
|
-
return drawElement(context);
|
|
43
|
-
};
|
|
44
|
-
board.applyTheme = (element) => {
|
|
45
|
-
const mindElement = element;
|
|
46
|
-
const shouldClearProperty = !PlaitBoard.isBoard(element) && (mindElement?.branchColor || mindElement?.fill || mindElement?.strokeColor);
|
|
47
|
-
if (PlaitMind.isMind(element) && shouldClearProperty) {
|
|
48
|
-
const path = PlaitBoard.findPath(board, element);
|
|
49
|
-
Transforms.setNode(board, { fill: null, strokeColor: null, branchColor: null }, path);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
board.getRectangle = (element) => {
|
|
53
|
-
if (MindElement.isMindElement(board, element)) {
|
|
54
|
-
if (!PlaitElement.hasMounted(element)) {
|
|
55
|
-
console.error('mind element has not been mounted');
|
|
56
|
-
}
|
|
57
|
-
return getRectangleByNode(MindElement.getNode(element));
|
|
58
|
-
}
|
|
59
|
-
return getRectangle(element);
|
|
60
|
-
};
|
|
61
|
-
board.canAddToGroup = (element) => {
|
|
62
|
-
if (MindElement.isMindElement(board, element) && !element.isRoot) {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
return canAddToGroup(element);
|
|
66
|
-
};
|
|
67
|
-
board.canSetZIndex = (element) => {
|
|
68
|
-
if (MindElement.isMindElement(board, element) && !element.isRoot) {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
return canSetZIndex(element);
|
|
72
|
-
};
|
|
73
|
-
board.isRecursion = (element) => {
|
|
74
|
-
if (MindElement.isMindElement(board, element) && element.isCollapsed) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
return isRecursion(element);
|
|
78
|
-
};
|
|
79
|
-
board.isRectangleHit = (element, selection) => {
|
|
80
|
-
if (MindElement.isMindElement(board, element)) {
|
|
81
|
-
const client = getRectangleByNode(MindElement.getNode(element));
|
|
82
|
-
const isHit = RectangleClient.isHit(RectangleClient.getRectangleByPoints([selection.anchor, selection.focus]), client);
|
|
83
|
-
return isHit;
|
|
84
|
-
}
|
|
85
|
-
return isRectangleHit(element, selection);
|
|
86
|
-
};
|
|
87
|
-
board.isHit = (element, point, isStrict) => {
|
|
88
|
-
if (MindElement.isMindElement(board, element)) {
|
|
89
|
-
const client = getRectangleByNode(MindElement.getNode(element));
|
|
90
|
-
const isHit = RectangleClient.isHit(RectangleClient.getRectangleByPoints([point, point]), client);
|
|
91
|
-
return isHit;
|
|
92
|
-
}
|
|
93
|
-
return isHit(element, point, isStrict);
|
|
94
|
-
};
|
|
95
|
-
board.getOneHitElement = (elements) => {
|
|
96
|
-
const isAllMindElements = elements.every((item) => MindElement.isMindElement(board, item));
|
|
97
|
-
if (isAllMindElements) {
|
|
98
|
-
return elements[0];
|
|
99
|
-
}
|
|
100
|
-
return getOneHitElement(elements);
|
|
101
|
-
};
|
|
102
|
-
board.isMovable = (element) => {
|
|
103
|
-
if (PlaitMind.isMind(element) && element.isRoot) {
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
return isMovable(element);
|
|
107
|
-
};
|
|
108
|
-
board.isImageBindingAllowed = (element) => {
|
|
109
|
-
if (MindElement.isMindElement(board, element)) {
|
|
110
|
-
return true;
|
|
111
|
-
}
|
|
112
|
-
return isImageBindingAllowed(element);
|
|
113
|
-
};
|
|
114
|
-
board.isAlign = (element) => {
|
|
115
|
-
if (PlaitMind.isMind(element) && element.isRoot) {
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
return isAlign(element);
|
|
119
|
-
};
|
|
120
|
-
board.isExpanded = (element) => {
|
|
121
|
-
if (MindElement.isMindElement(board, element) && !PlaitMind.isMind(element)) {
|
|
122
|
-
return !element.isCollapsed;
|
|
123
|
-
}
|
|
124
|
-
return isExpanded(element);
|
|
125
|
-
};
|
|
126
|
-
board.dblClick = (event) => {
|
|
127
|
-
if (PlaitBoard.isReadonly(board)) {
|
|
128
|
-
dblClick(event);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
132
|
-
board.children
|
|
133
|
-
.filter((value) => PlaitMind.isMind(value))
|
|
134
|
-
.forEach((mindMap) => {
|
|
135
|
-
depthFirstRecursion(mindMap, (node) => {
|
|
136
|
-
if (!PlaitBoard.hasBeenTextEditing(board) && isHitMindElement(board, point, node)) {
|
|
137
|
-
editTopic(node);
|
|
138
|
-
}
|
|
139
|
-
}, getIsRecursionFunc(board));
|
|
140
|
-
});
|
|
141
|
-
if (PlaitBoard.hasBeenTextEditing(board)) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
dblClick(event);
|
|
145
|
-
};
|
|
146
|
-
return withEmoji(withNodeResize(withNodeImageResize(withNodeImage(withNodeHoverHitTest(withMindFragment(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board)))))))))));
|
|
147
|
-
};
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1taW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvcGx1Z2lucy93aXRoLW1pbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFVBQVUsRUFFVixlQUFlLEVBQ2YsVUFBVSxFQUVWLG1CQUFtQixFQUNuQixZQUFZLEVBQ1osa0JBQWtCLEVBRWxCLFdBQVcsRUFDWCxjQUFjLEVBQ2pCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxF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YUFBYSxDQUNULG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzNILENBQ0osQ0FDSixDQUNKLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dCxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgVHJhbnNmb3JtcyxcbiAgICBTZWxlY3Rpb24sXG4gICAgZGVwdGhGaXJzdFJlY3Vyc2lvbixcbiAgICBQbGFpdEVsZW1lbnQsXG4gICAgZ2V0SXNSZWN1cnNpb25GdW5jLFxuICAgIFBvaW50LFxuICAgIHRvSG9zdFBvaW50LFxuICAgIHRvVmlld0JveFBvaW50XG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRFbGVtZW50LCBQbGFpdE1pbmQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBsYWl0TWluZENvbXBvbmVudCB9IGZyb20gJy4uL21pbmQuY29tcG9uZW50JztcbmltcG9ydCB7IE1pbmROb2RlQ29tcG9uZW50IH0gZnJvbSAnLi4vbWluZC1ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUsIGlzSGl0TWluZEVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9wb3NpdGlvbi9ub2RlJztcbmltcG9ydCB7IHdpdGhOb2RlRG5kIH0gZnJvbSAnLi93aXRoLW5vZGUtZG5kJztcbmltcG9ydCB7IGVkaXRUb3BpYyB9IGZyb20gJy4uL3V0aWxzL25vZGUvY29tbW9uJztcbmltcG9ydCB7IHdpdGhBYnN0cmFjdCB9IGZyb20gJy4vd2l0aC1hYnN0cmFjdC1yZXNpemUnO1xuaW1wb3J0IHsgd2l0aE1pbmRFeHRlbmQgfSBmcm9tICcuL3dpdGgtbWluZC1leHRlbmQnO1xuaW1wb3J0IHsgd2l0aENyZWF0ZU1pbmQgfSBmcm9tICcuL3dpdGgtbWluZC1jcmVhdGUnO1xuaW1wb3J0IHsgd2l0aE1pbmRIb3RrZXkgfSBmcm9tICcuL3dpdGgtbWluZC1ob3RrZXknO1xuaW1wb3J0IHsgd2l0aE5vZGVIb3ZlckhpdFRlc3QgfSBmcm9tICcuL3dpdGgtbm9kZS1ob3Zlci1oaXQtdGVzdCc7XG5pbXBvcnQgeyB3aXRoTm9kZUltYWdlIH0gZnJvbSAnLi93aXRoLW5vZGUtaW1hZ2UnO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuL3dpdGgtbWluZC5ib2FyZCc7XG5pbXBvcnQgeyB3aXRoTm9kZVJlc2l6ZSB9IGZyb20gJy4vd2l0aC1ub2RlLXJlc2l6ZSc7XG5pbXBvcnQgeyB3aXRoTm9kZUltYWdlUmVzaXplIH0gZnJvbSAnLi93aXRoLW5vZGUtaW1hZ2UtcmVzaXplJztcbmltcG9ydCB7IHdpdGhNaW5kRnJhZ21lbnQgfSBmcm9tICcuL3dpdGgtbWluZC1mcmFnbWVudCc7XG5pbXBvcnQgeyB3aXRoRW1vamkgfSBmcm9tICcuLi9lbW9qaS93aXRoLWVtb2ppJztcbmltcG9ydCB7IGZpeE1pbmRFbGVtZW50RGF0YSwgZml4TWluZEVsZW1lbnRXaWR0aEFuZEhlaWdodCwgaXNOb3JtYWxpemVkRGF0YSwgaXNOb3JtYWxpemVkV2lkdGhBbmRIZWlnaHQgfSBmcm9tICcuLi91dGlscy9ub3JtYWxpemUnO1xuXG5leHBvcnQgY29uc3Qgd2l0aE1pbmQgPSAoYmFzZUJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3QgYm9hcmQgPSBiYXNlQm9hcmQgYXMgUGxhaXRCb2FyZCAmIFBsYWl0TWluZEJvYXJkO1xuICAgIGNvbnN0IHtcbiAgICAgICAgZHJhd0VsZW1lbnQsXG4gICAgICAgIGRibENsaWNrLFxuICAgICAgICBpc1JlY3RhbmdsZUhpdCxcbiAgICAgICAgaXNIaXQsXG4gICAgICAgIGdldFJlY3RhbmdsZSxcbiAgICAgICAgaXNNb3ZhYmxlLFxuICAgICAgICBpc1JlY3Vyc2lvbixcbiAgICAgICAgaXNBbGlnbixcbiAgICAgICAgaXNJbWFnZUJpbmRpbmdBbGxvd2VkLFxuICAgICAgICBjYW5BZGRUb0dyb3VwLFxuICAgICAgICBjYW5TZXRaSW5kZXgsXG4gICAgICAgIGlzRXhwYW5kZWQsXG4gICAgICAgIGdldE9uZUhpdEVsZW1lbnQsXG4gICAgICAgIG5vcm1hbGl6ZUVsZW1lbnRcbiAgICB9ID0gYm9hcmQ7XG5cbiAgICBib2FyZC5ub3JtYWxpemVFbGVtZW50ID0gKGNvbnRleHQ6IFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKFBsYWl0TWluZC5pc01pbmQoY29udGV4dC5lbGVtZW50KSkge1xuICAgICAgICAgICAgZGVwdGhGaXJzdFJlY3Vyc2lvbihjb250ZXh0LmVsZW1lbnQsIChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vcm1hbGl6ZWREYXRhKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpeE1pbmRFbGVtZW50RGF0YShub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vcm1hbGl6ZWRXaWR0aEFuZEhlaWdodChub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBmaXhNaW5kRWxlbWVudFdpZHRoQW5kSGVpZ2h0KG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIG5vcm1hbGl6ZUVsZW1lbnQoY29udGV4dCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmRyYXdFbGVtZW50ID0gKGNvbnRleHQ6IFBsYWl0UGx1Z2luRWxlbWVudENvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKFBsYWl0TWluZC5pc01pbmQoY29udGV4dC5lbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFBsYWl0TWluZENvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIGlmIChNaW5kRWxlbWVudC5pc01pbmRFbGVtZW50KGJvYXJkLCBjb250ZXh0LmVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRyYXdFbGVtZW50KGNvbnRleHQpO1xuICAgIH07XG5cbiAgICBib2FyZC5hcHBseVRoZW1lID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBtaW5kRWxlbWVudCA9IGVsZW1lbnQgYXMgTWluZEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNob3VsZENsZWFyUHJvcGVydHkgPVxuICAgICAgICAgICAgIVBsYWl0Qm9hcmQuaXNCb2FyZChlbGVtZW50KSAmJiAobWluZEVsZW1lbnQ/LmJyYW5jaENvbG9yIHx8IG1pbmRFbGVtZW50Py5maWxsIHx8IG1pbmRFbGVtZW50Py5zdHJva2VDb2xvcik7XG4gICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKGVsZW1lbnQpICYmIHNob3VsZENsZWFyUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBQbGFpdEJvYXJkLmZpbmRQYXRoKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgeyBmaWxsOiBudWxsLCBzdHJva2VDb2xvcjogbnVsbCwgYnJhbmNoQ29sb3I6IG51bGwgfSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYm9hcmQuZ2V0UmVjdGFuZ2xlID0gKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBpZiAoIVBsYWl0RWxlbWVudC5oYXNNb3VudGVkKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignbWluZCBlbGVtZW50IGhhcyBub3QgYmVlbiBtb3VudGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2V0UmVjdGFuZ2xlQnlOb2RlKE1pbmRFbGVtZW50LmdldE5vZGUoZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRSZWN0YW5nbGUoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmNhbkFkZFRvR3JvdXAgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChNaW5kRWxlbWVudC5pc01pbmRFbGVtZW50KGJvYXJkLCBlbGVtZW50KSAmJiAhZWxlbWVudC5pc1Jvb3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuQWRkVG9Hcm91cChlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQuY2FuU2V0WkluZGV4ID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoTWluZEVsZW1lbnQuaXNNaW5kRWxlbWVudChib2FyZCwgZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNSb290KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhblNldFpJbmRleChlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQuaXNSZWN1cnNpb24gPSAoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoTWluZEVsZW1lbnQuaXNNaW5kRWxlbWVudChib2FyZCwgZWxlbWVudCkgJiYgZWxlbWVudC5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1JlY3Vyc2lvbihlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQuaXNSZWN0YW5nbGVIaXQgPSAoZWxlbWVudCwgc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBjbGllbnQgPSBnZXRSZWN0YW5nbGVCeU5vZGUoTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KSk7XG4gICAgICAgICAgICBjb25zdCBpc0hpdCA9IFJlY3RhbmdsZUNsaWVudC5pc0hpdChSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3NlbGVjdGlvbi5hbmNob3IsIHNlbGVjdGlvbi5mb2N1c10pLCBjbGllbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGlzSGl0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1JlY3RhbmdsZUhpdChlbGVtZW50LCBzZWxlY3Rpb24pO1xuICAgIH07XG5cbiAgICBib2FyZC5pc0hpdCA9IChlbGVtZW50LCBwb2ludDogUG9pbnQsIGlzU3RyaWN0PzogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoTWluZEVsZW1lbnQuaXNNaW5kRWxlbWVudChib2FyZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IGdldFJlY3RhbmdsZUJ5Tm9kZShNaW5kRWxlbWVudC5nZXROb2RlKGVsZW1lbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSGl0ID0gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbcG9pbnQsIHBvaW50XSksIGNsaWVudCk7XG4gICAgICAgICAgICByZXR1cm4gaXNIaXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzSGl0KGVsZW1lbnQsIHBvaW50LCBpc1N0cmljdCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmdldE9uZUhpdEVsZW1lbnQgPSAoZWxlbWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgaXNBbGxNaW5kRWxlbWVudHMgPSBlbGVtZW50cy5ldmVyeSgoaXRlbSkgPT4gTWluZEVsZW1lbnQuaXNNaW5kRWxlbWVudChib2FyZCwgaXRlbSkpO1xuICAgICAgICBpZiAoaXNBbGxNaW5kRWxlbWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50c1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0T25lSGl0RWxlbWVudChlbGVtZW50cyk7XG4gICAgfTtcblxuICAgIGJvYXJkLmlzTW92YWJsZSA9IChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKGVsZW1lbnQpICYmIGVsZW1lbnQuaXNSb290KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNNb3ZhYmxlKGVsZW1lbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5pc0ltYWdlQmluZGluZ0FsbG93ZWQgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoTWluZEVsZW1lbnQuaXNNaW5kRWxlbWVudChib2FyZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0ltYWdlQmluZGluZ0FsbG93ZWQoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmlzQWxpZ24gPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKGVsZW1lbnQpICYmIGVsZW1lbnQuaXNSb290KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBbGlnbihlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQuaXNFeHBhbmRlZCA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpICYmICFQbGFpdE1pbmQuaXNNaW5kKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaXNDb2xsYXBzZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRXhwYW5kZWQoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLmRibENsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChQbGFpdEJvYXJkLmlzUmVhZG9ubHkoYm9hcmQpKSB7XG4gICAgICAgICAgICBkYmxDbGljayhldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnQgPSB0b1ZpZXdCb3hQb2ludChib2FyZCwgdG9Ib3N0UG9pbnQoYm9hcmQsIGV2ZW50LngsIGV2ZW50LnkpKTtcbiAgICAgICAgYm9hcmQuY2hpbGRyZW5cbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiBQbGFpdE1pbmQuaXNNaW5kKHZhbHVlKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChtaW5kTWFwKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVwdGhGaXJzdFJlY3Vyc2lvbjxNaW5kRWxlbWVudD4oXG4gICAgICAgICAgICAgICAgICAgIG1pbmRNYXAgYXMgTWluZEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVBsYWl0Qm9hcmQuaGFzQmVlblRleHRFZGl0aW5nKGJvYXJkKSAmJiBpc0hpdE1pbmRFbGVtZW50KGJvYXJkLCBwb2ludCwgbm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0VG9waWMobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGdldElzUmVjdXJzaW9uRnVuYyhib2FyZClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmIChQbGFpdEJvYXJkLmhhc0JlZW5UZXh0RWRpdGluZyhib2FyZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkYmxDbGljayhldmVudCk7XG4gICAgfTtcblxuICAgIHJldHVybiB3aXRoRW1vamkoXG4gICAgICAgIHdpdGhOb2RlUmVzaXplKFxuICAgICAgICAgICAgd2l0aE5vZGVJbWFnZVJlc2l6ZShcbiAgICAgICAgICAgICAgICB3aXRoTm9kZUltYWdlKFxuICAgICAgICAgICAgICAgICAgICB3aXRoTm9kZUhvdmVySGl0VGVzdCh3aXRoTWluZEZyYWdtZW50KHdpdGhNaW5kSG90a2V5KHdpdGhNaW5kRXh0ZW5kKHdpdGhDcmVhdGVNaW5kKHdpdGhBYnN0cmFjdCh3aXRoTm9kZURuZChib2FyZCkpKSkpKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApO1xufTtcbiJdfQ==
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { distanceBetweenPointAndPoint, Path, PlaitBoard, Transforms, getSelectedElements, depthFirstRecursion, createG, PlaitNode, PlaitPointerType, isMainPointer, CoreTransforms, getHitElementByPoint, toHostPoint, toViewBoxPoint, isDragging } from '@plait/core';
|
|
2
|
-
import { AbstractNode, getNonAbstractChildren } from '@plait/layouts';
|
|
3
|
-
import { MindElement, PlaitMind } from '../interfaces/element';
|
|
4
|
-
import { deleteElementHandleAbstract, deleteElementsHandleRightNodeCount, getCorrespondingAbstract, getFirstLevelElement, getOverallAbstracts, getValidAbstractRefs, insertElementHandleAbstract, insertElementHandleRightNodeCount } from '../utils';
|
|
5
|
-
import { addActiveOnDragOrigin, isDropStandardRight, removeActiveOnDragOrigin, setMindDragging } from '../utils/dnd/common';
|
|
6
|
-
import { detectDropTarget, getPathByDropTarget } from '../utils/dnd/detector';
|
|
7
|
-
import { drawFakeDragNode, drawFakeDropNode } from '../utils/draw/node-dnd';
|
|
8
|
-
import { MindTransforms } from '../transforms';
|
|
9
|
-
import { adjustAbstractToNode } from '../utils/node/adjust-node';
|
|
10
|
-
const DRAG_MOVE_BUFFER = 5;
|
|
11
|
-
export const withNodeDnd = (board) => {
|
|
12
|
-
const { pointerDown, pointerMove, globalPointerUp } = board;
|
|
13
|
-
let activeElements = [];
|
|
14
|
-
let correspondingElements = [];
|
|
15
|
-
let startPoint;
|
|
16
|
-
let dragFakeNodeG;
|
|
17
|
-
let fakeDropNodeG;
|
|
18
|
-
let dropTarget = null;
|
|
19
|
-
let targetPath;
|
|
20
|
-
board.pointerDown = (event) => {
|
|
21
|
-
if (PlaitBoard.isReadonly(board) ||
|
|
22
|
-
PlaitBoard.hasBeenTextEditing(board) ||
|
|
23
|
-
!PlaitBoard.isPointer(board, PlaitPointerType.selection) ||
|
|
24
|
-
!isMainPointer(event)) {
|
|
25
|
-
pointerDown(event);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
29
|
-
const selectedElements = getSelectedElements(board);
|
|
30
|
-
const hitElement = getHitElementByPoint(board, point);
|
|
31
|
-
if (hitElement &&
|
|
32
|
-
MindElement.isMindElement(board, hitElement) &&
|
|
33
|
-
!PlaitMind.isMind(hitElement) &&
|
|
34
|
-
!AbstractNode.isAbstract(hitElement)) {
|
|
35
|
-
const targetElements = selectedElements.filter(element => MindElement.isMindElement(board, element) && !element.isRoot && !AbstractNode.isAbstract(element));
|
|
36
|
-
const isMultipleSelection = selectedElements.length > 0 && selectedElements.includes(hitElement);
|
|
37
|
-
if (isMultipleSelection) {
|
|
38
|
-
activeElements = targetElements;
|
|
39
|
-
startPoint = point;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
activeElements = [hitElement];
|
|
43
|
-
startPoint = point;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (activeElements.length) {
|
|
47
|
-
correspondingElements = getOverallAbstracts(board, activeElements);
|
|
48
|
-
}
|
|
49
|
-
pointerDown(event);
|
|
50
|
-
};
|
|
51
|
-
board.pointerMove = (event) => {
|
|
52
|
-
if (!board.options.readonly && activeElements.length && startPoint) {
|
|
53
|
-
const endPoint = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
54
|
-
const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
|
|
55
|
-
if (distance < DRAG_MOVE_BUFFER) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
setMindDragging(board, true);
|
|
59
|
-
fakeDropNodeG?.remove();
|
|
60
|
-
const detectPoint = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
|
|
61
|
-
dropTarget = detectDropTarget(board, detectPoint, dropTarget, [...activeElements, ...correspondingElements]);
|
|
62
|
-
if (dropTarget?.target) {
|
|
63
|
-
targetPath = getPathByDropTarget(board, dropTarget);
|
|
64
|
-
fakeDropNodeG = drawFakeDropNode(board, dropTarget, targetPath);
|
|
65
|
-
PlaitBoard.getHost(board).appendChild(fakeDropNodeG);
|
|
66
|
-
}
|
|
67
|
-
const offsetX = endPoint[0] - startPoint[0];
|
|
68
|
-
const offsetY = endPoint[1] - startPoint[1];
|
|
69
|
-
dragFakeNodeG?.remove();
|
|
70
|
-
dragFakeNodeG = createG();
|
|
71
|
-
[...activeElements, ...correspondingElements].forEach(element => {
|
|
72
|
-
addActiveOnDragOrigin(element);
|
|
73
|
-
});
|
|
74
|
-
activeElements.forEach(element => {
|
|
75
|
-
const nodeG = drawFakeDragNode(board, element, offsetX, offsetY);
|
|
76
|
-
dragFakeNodeG?.appendChild(nodeG);
|
|
77
|
-
});
|
|
78
|
-
PlaitBoard.getHost(board).appendChild(dragFakeNodeG);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
pointerMove(event);
|
|
82
|
-
};
|
|
83
|
-
board.globalPointerUp = (event) => {
|
|
84
|
-
const firstLevelElements = getFirstLevelElement(activeElements);
|
|
85
|
-
if (!board.options.readonly && firstLevelElements.length) {
|
|
86
|
-
firstLevelElements.push(...correspondingElements);
|
|
87
|
-
if (isDragging(board)) {
|
|
88
|
-
firstLevelElements.forEach(element => {
|
|
89
|
-
removeActiveOnDragOrigin(element);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
if (dropTarget) {
|
|
93
|
-
const targetPathRef = board.pathRef(targetPath);
|
|
94
|
-
const targetPreviousPathRef = Path.hasPrevious(targetPath) && board.pathRef(Path.previous(targetPath));
|
|
95
|
-
const targetElementPathRef = board.pathRef(PlaitBoard.findPath(board, dropTarget.target));
|
|
96
|
-
let abstractRefs = getValidAbstractRefs(board, firstLevelElements);
|
|
97
|
-
const normalElements = firstLevelElements
|
|
98
|
-
.filter(element => !abstractRefs.some(refs => refs.abstract === element))
|
|
99
|
-
.map(element => {
|
|
100
|
-
if (AbstractNode.isAbstract(element)) {
|
|
101
|
-
return adjustAbstractToNode(element);
|
|
102
|
-
}
|
|
103
|
-
return element;
|
|
104
|
-
});
|
|
105
|
-
const hasPreviousNode = targetPath[targetPath.length - 1] !== 0;
|
|
106
|
-
if (hasPreviousNode) {
|
|
107
|
-
const previousElement = PlaitNode.get(board, Path.previous(targetPath));
|
|
108
|
-
const correspondingAbstract = getCorrespondingAbstract(previousElement);
|
|
109
|
-
const targetHasCorrespondAbstract = correspondingAbstract && correspondingAbstract.end !== targetPath[targetPath.length - 1] - 1;
|
|
110
|
-
if (targetHasCorrespondAbstract) {
|
|
111
|
-
const adjustedNode = abstractRefs.map(ref => {
|
|
112
|
-
return adjustAbstractToNode(ref.abstract);
|
|
113
|
-
});
|
|
114
|
-
normalElements.push(...adjustedNode);
|
|
115
|
-
abstractRefs = [];
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
const effectedAbstracts = deleteElementHandleAbstract(board, firstLevelElements);
|
|
119
|
-
insertElementHandleAbstract(board, targetPath, normalElements.length, false, effectedAbstracts);
|
|
120
|
-
MindTransforms.setAbstractsByRefs(board, effectedAbstracts);
|
|
121
|
-
let refs = deleteElementsHandleRightNodeCount(board, firstLevelElements);
|
|
122
|
-
const parent = PlaitNode.get(board, Path.parent(targetPath));
|
|
123
|
-
const shouldChangeRoot = isDropStandardRight(parent, dropTarget);
|
|
124
|
-
if (shouldChangeRoot && targetElementPathRef.current) {
|
|
125
|
-
refs = insertElementHandleRightNodeCount(board, targetElementPathRef.current.slice(0, 1), normalElements.length, refs);
|
|
126
|
-
}
|
|
127
|
-
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
128
|
-
CoreTransforms.removeElements(board, firstLevelElements);
|
|
129
|
-
let insertPath = targetPathRef.current;
|
|
130
|
-
const parentPath = Path.parent(targetPathRef.current || targetPath);
|
|
131
|
-
if (!insertPath) {
|
|
132
|
-
// When the insertion position and the selected node position are the same, the recorded previousPath is used
|
|
133
|
-
const previousPath = targetPreviousPathRef && targetPreviousPathRef.unref();
|
|
134
|
-
if (previousPath) {
|
|
135
|
-
insertPath = Path.next(previousPath);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
const parent = PlaitNode.get(board, parentPath);
|
|
139
|
-
const children = getNonAbstractChildren(parent);
|
|
140
|
-
insertPath = [...parentPath, children.length || 0];
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
MindTransforms.insertNodes(board, normalElements, insertPath);
|
|
144
|
-
if (abstractRefs.length) {
|
|
145
|
-
MindTransforms.insertAbstractNodes(board, abstractRefs, normalElements, insertPath);
|
|
146
|
-
}
|
|
147
|
-
if (targetElementPathRef.current &&
|
|
148
|
-
targetPathRef.current &&
|
|
149
|
-
Path.isAncestor(targetElementPathRef.current, targetPathRef.current) &&
|
|
150
|
-
dropTarget.target.isCollapsed) {
|
|
151
|
-
Transforms.setNode(board, { isCollapsed: false }, targetElementPathRef.current);
|
|
152
|
-
}
|
|
153
|
-
targetElementPathRef.unref();
|
|
154
|
-
targetPathRef.unref();
|
|
155
|
-
let setActiveElements = [];
|
|
156
|
-
depthFirstRecursion(board, node => {
|
|
157
|
-
const isSelected = activeElements.some(element => element.id === node.id);
|
|
158
|
-
if (isSelected) {
|
|
159
|
-
setActiveElements.push(node);
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
Transforms.addSelectionWithTemporaryElements(board, setActiveElements);
|
|
163
|
-
}
|
|
164
|
-
setMindDragging(board, false);
|
|
165
|
-
activeElements = [];
|
|
166
|
-
dragFakeNodeG?.remove();
|
|
167
|
-
dragFakeNodeG = undefined;
|
|
168
|
-
fakeDropNodeG?.remove();
|
|
169
|
-
fakeDropNodeG = undefined;
|
|
170
|
-
dropTarget = null;
|
|
171
|
-
}
|
|
172
|
-
globalPointerUp(event);
|
|
173
|
-
};
|
|
174
|
-
return board;
|
|
175
|
-
};
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub2RlLWRuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3BsdWdpbnMvd2l0aC1ub2RlLWRuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsNEJBQTRCLEVBQzVCLElBQUksRUFDSixVQUFVLEVBRVYsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsT0FBTyxFQUNQLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGNBQWMsRUFDZCxVQUFVLEVBQ2IsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUNILDJCQUEyQixFQUMzQixrQ0FBa0MsRUFDbEMsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUMzQixpQ0FBaUMsRUFDcEMsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFakUsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFM0IsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQzdDLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUU1RCxJQUFJLGNBQWMsR0FBa0IsRUFBRSxDQUFDO0lBQ3ZDLElBQUkscUJBQXFCLEdBQWtCLEVBQUUsQ0FBQztJQUM5QyxJQUFJLFVBQWlCLENBQUM7SUFDdEIsSUFBSSxhQUFzQyxDQUFDO0lBQzNDLElBQUksYUFBc0MsQ0FBQztJQUMzQyxJQUFJLFVBQVUsR0FBK0QsSUFBSSxDQUFDO0lBQ2xGLElBQUksVUFBZ0IsQ0FBQztJQUVyQixLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBbUIsRUFBRSxFQUFFO1FBQ3hDLElBQ0ksVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDNUIsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUNwQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUN4RCxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFDdkIsQ0FBQztZQUNDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQ0ksVUFBVTtZQUNWLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQztZQUM1QyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzdCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFDdEMsQ0FBQztZQUNDLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FDMUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUM5RixDQUFDO1lBQ25CLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO2dCQUN0QixjQUFjLEdBQUcsY0FBYyxDQUFDO2dCQUNoQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixjQUFjLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUIsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztJQUVGLEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxLQUFtQixFQUFFLEVBQUU7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFLENBQUM7WUFDakUsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0UsTUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEcsSUFBSSxRQUFRLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUIsT0FBTztZQUNYLENBQUM7WUFFRCxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTdCLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4QixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRixVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUM3RyxJQUFJLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDckIsVUFBVSxHQUFHLG1CQUFtQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFFcEQsYUFBYSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2hFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLGFBQWEsR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUMxQixDQUFDLEdBQUcsY0FBYyxFQUFFLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzVELHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1lBQ0gsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pFLGFBQWEsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7WUFFSCxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNyRCxPQUFPO1FBQ1gsQ0FBQztRQUVELFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUM7SUFFRixLQUFLLENBQUMsZUFBZSxHQUFHLENBQUMsS0FBbUIsRUFBRSxFQUFFO1FBQzVDLE1BQU0sa0JBQWtCLEdBQUcsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZELGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixDQUFDLENBQUM7WUFDbEQsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNqQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1lBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDYixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZHLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDMUYsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQ25FLE1BQU0sY0FBYyxHQUFHLGtCQUFrQjtxQkFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQztxQkFDeEUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNYLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNuQyxPQUFPLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN6QyxDQUFDO29CQUNELE9BQU8sT0FBTyxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQztnQkFFUCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ2xCLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQWdCLENBQUM7b0JBQ3ZGLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3hFLE1BQU0sMkJBQTJCLEdBQzdCLHFCQUFxQixJQUFJLHFCQUFxQixDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pHLElBQUksMkJBQTJCLEVBQUUsQ0FBQzt3QkFDOUIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDeEMsT0FBTyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzlDLENBQUMsQ0FBQyxDQUFDO3dCQUNILGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQzt3QkFDckMsWUFBWSxHQUFHLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQztnQkFDTCxDQUFDO2dCQUVELE1BQU0saUJBQWlCLEdBQUcsMkJBQTJCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQ2pGLDJCQUEyQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDaEcsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUU1RCxJQUFJLElBQUksR0FBRyxrQ0FBa0MsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFDekUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBZ0IsQ0FBQztnQkFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksZ0JBQWdCLElBQUksb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ25ELElBQUksR0FBRyxpQ0FBaUMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0gsQ0FBQztnQkFFRCxjQUFjLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwRCxjQUFjLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUV6RCxJQUFJLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO2dCQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDZCw2R0FBNkc7b0JBQzdHLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixJQUFJLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM1RSxJQUFJLFlBQVksRUFBRSxDQUFDO3dCQUNmLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUN6QyxDQUFDO3lCQUFNLENBQUM7d0JBQ0osTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ2hELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNoRCxVQUFVLEdBQUcsQ0FBQyxHQUFHLFVBQVUsRUFBRSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUN2RCxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUU5RCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdEIsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN4RixDQUFDO2dCQUVELElBQ0ksb0JBQW9CLENBQUMsT0FBTztvQkFDNUIsYUFBYSxDQUFDLE9BQU87b0JBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUM7b0JBQ3BFLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUMvQixDQUFDO29CQUNDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRixDQUFDO2dCQUNELG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM3QixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBRXRCLElBQUksaUJBQWlCLEdBQWtCLEVBQUUsQ0FBQztnQkFDMUMsbUJBQW1CLENBQUUsS0FBZ0MsRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDMUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxRSxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNiLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFFSCxVQUFVLENBQUMsaUNBQWlDLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUNELGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUIsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUNwQixhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDeEIsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMxQixhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDeEIsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMxQixVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50LFxuICAgIFBhdGgsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBQb2ludCxcbiAgICBUcmFuc2Zvcm1zLFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gICAgZGVwdGhGaXJzdFJlY3Vyc2lvbixcbiAgICBjcmVhdGVHLFxuICAgIFBsYWl0Tm9kZSxcbiAgICBQbGFpdFBvaW50ZXJUeXBlLFxuICAgIGlzTWFpblBvaW50ZXIsXG4gICAgQ29yZVRyYW5zZm9ybXMsXG4gICAgZ2V0SGl0RWxlbWVudEJ5UG9pbnQsXG4gICAgdG9Ib3N0UG9pbnQsXG4gICAgdG9WaWV3Qm94UG9pbnQsXG4gICAgaXNEcmFnZ2luZ1xufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5vZGUsIGdldE5vbkFic3RyYWN0Q2hpbGRyZW4gfSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCwgUGxhaXRNaW5kIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbGVtZW50JztcbmltcG9ydCB7IERldGVjdFJlc3VsdCB9IGZyb20gJy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQge1xuICAgIGRlbGV0ZUVsZW1lbnRIYW5kbGVBYnN0cmFjdCxcbiAgICBkZWxldGVFbGVtZW50c0hhbmRsZVJpZ2h0Tm9kZUNvdW50LFxuICAgIGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdCxcbiAgICBnZXRGaXJzdExldmVsRWxlbWVudCxcbiAgICBnZXRPdmVyYWxsQWJzdHJhY3RzLFxuICAgIGdldFZhbGlkQWJzdHJhY3RSZWZzLFxuICAgIGluc2VydEVsZW1lbnRIYW5kbGVBYnN0cmFjdCxcbiAgICBpbnNlcnRFbGVtZW50SGFuZGxlUmlnaHROb2RlQ291bnRcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgYWRkQWN0aXZlT25EcmFnT3JpZ2luLCBpc0Ryb3BTdGFuZGFyZFJpZ2h0LCByZW1vdmVBY3RpdmVPbkRyYWdPcmlnaW4sIHNldE1pbmREcmFnZ2luZyB9IGZyb20gJy4uL3V0aWxzL2RuZC9jb21tb24nO1xuaW1wb3J0IHsgZGV0ZWN0RHJvcFRhcmdldCwgZ2V0UGF0aEJ5RHJvcFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL2RuZC9kZXRlY3Rvcic7XG5pbXBvcnQgeyBkcmF3RmFrZURyYWdOb2RlLCBkcmF3RmFrZURyb3BOb2RlIH0gZnJvbSAnLi4vdXRpbHMvZHJhdy9ub2RlLWRuZCc7XG5pbXBvcnQgeyBNaW5kVHJhbnNmb3JtcyB9IGZyb20gJy4uL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgYWRqdXN0QWJzdHJhY3RUb05vZGUgfSBmcm9tICcuLi91dGlscy9ub2RlL2FkanVzdC1ub2RlJztcblxuY29uc3QgRFJBR19NT1ZFX0JVRkZFUiA9IDU7XG5cbmV4cG9ydCBjb25zdCB3aXRoTm9kZURuZCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRlckRvd24sIHBvaW50ZXJNb3ZlLCBnbG9iYWxQb2ludGVyVXAgfSA9IGJvYXJkO1xuXG4gICAgbGV0IGFjdGl2ZUVsZW1lbnRzOiBNaW5kRWxlbWVudFtdID0gW107XG4gICAgbGV0IGNvcnJlc3BvbmRpbmdFbGVtZW50czogTWluZEVsZW1lbnRbXSA9IFtdO1xuICAgIGxldCBzdGFydFBvaW50OiBQb2ludDtcbiAgICBsZXQgZHJhZ0Zha2VOb2RlRzogU1ZHR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZha2VEcm9wTm9kZUc6IFNWR0dFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGxldCBkcm9wVGFyZ2V0OiB7IHRhcmdldDogTWluZEVsZW1lbnQ7IGRldGVjdFJlc3VsdDogRGV0ZWN0UmVzdWx0IH0gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgdGFyZ2V0UGF0aDogUGF0aDtcblxuICAgIGJvYXJkLnBvaW50ZXJEb3duID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgUGxhaXRCb2FyZC5pc1JlYWRvbmx5KGJvYXJkKSB8fFxuICAgICAgICAgICAgUGxhaXRCb2FyZC5oYXNCZWVuVGV4dEVkaXRpbmcoYm9hcmQpIHx8XG4gICAgICAgICAgICAhUGxhaXRCb2FyZC5pc1BvaW50ZXIoYm9hcmQsIFBsYWl0UG9pbnRlclR5cGUuc2VsZWN0aW9uKSB8fFxuICAgICAgICAgICAgIWlzTWFpblBvaW50ZXIoZXZlbnQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcG9pbnRlckRvd24oZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvaW50ID0gdG9WaWV3Qm94UG9pbnQoYm9hcmQsIHRvSG9zdFBvaW50KGJvYXJkLCBldmVudC54LCBldmVudC55KSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKTtcbiAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IGdldEhpdEVsZW1lbnRCeVBvaW50KGJvYXJkLCBwb2ludCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGhpdEVsZW1lbnQgJiZcbiAgICAgICAgICAgIE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGhpdEVsZW1lbnQpICYmXG4gICAgICAgICAgICAhUGxhaXRNaW5kLmlzTWluZChoaXRFbGVtZW50KSAmJlxuICAgICAgICAgICAgIUFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KGhpdEVsZW1lbnQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudHMgPSBzZWxlY3RlZEVsZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0+IE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpICYmICFlbGVtZW50LmlzUm9vdCAmJiAhQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoZWxlbWVudClcbiAgICAgICAgICAgICkgYXMgTWluZEVsZW1lbnRbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzTXVsdGlwbGVTZWxlY3Rpb24gPSBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRFbGVtZW50cy5pbmNsdWRlcyhoaXRFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChpc011bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudHMgPSB0YXJnZXRFbGVtZW50cztcbiAgICAgICAgICAgICAgICBzdGFydFBvaW50ID0gcG9pbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzID0gW2hpdEVsZW1lbnRdO1xuICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQgPSBwb2ludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmdFbGVtZW50cyA9IGdldE92ZXJhbGxBYnN0cmFjdHMoYm9hcmQsIGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvaW50ZXJEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQucG9pbnRlck1vdmUgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIWJvYXJkLm9wdGlvbnMucmVhZG9ubHkgJiYgYWN0aXZlRWxlbWVudHMubGVuZ3RoICYmIHN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdG9WaWV3Qm94UG9pbnQoYm9hcmQsIHRvSG9zdFBvaW50KGJvYXJkLCBldmVudC54LCBldmVudC55KSk7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXSwgZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdKTtcbiAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IERSQUdfTU9WRV9CVUZGRVIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldE1pbmREcmFnZ2luZyhib2FyZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGZha2VEcm9wTm9kZUc/LnJlbW92ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGV0ZWN0UG9pbnQgPSB0b1ZpZXdCb3hQb2ludChib2FyZCwgdG9Ib3N0UG9pbnQoYm9hcmQsIGV2ZW50LngsIGV2ZW50LnkpKTtcbiAgICAgICAgICAgIGRyb3BUYXJnZXQgPSBkZXRlY3REcm9wVGFyZ2V0KGJvYXJkLCBkZXRlY3RQb2ludCwgZHJvcFRhcmdldCwgWy4uLmFjdGl2ZUVsZW1lbnRzLCAuLi5jb3JyZXNwb25kaW5nRWxlbWVudHNdKTtcbiAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0Py50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRQYXRoID0gZ2V0UGF0aEJ5RHJvcFRhcmdldChib2FyZCwgZHJvcFRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICBmYWtlRHJvcE5vZGVHID0gZHJhd0Zha2VEcm9wTm9kZShib2FyZCwgZHJvcFRhcmdldCwgdGFyZ2V0UGF0aCk7XG4gICAgICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKS5hcHBlbmRDaGlsZChmYWtlRHJvcE5vZGVHKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGVuZFBvaW50WzBdIC0gc3RhcnRQb2ludFswXTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSBlbmRQb2ludFsxXSAtIHN0YXJ0UG9pbnRbMV07XG4gICAgICAgICAgICBkcmFnRmFrZU5vZGVHPy5yZW1vdmUoKTtcbiAgICAgICAgICAgIGRyYWdGYWtlTm9kZUcgPSBjcmVhdGVHKCk7XG4gICAgICAgICAgICBbLi4uYWN0aXZlRWxlbWVudHMsIC4uLmNvcnJlc3BvbmRpbmdFbGVtZW50c10uZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBhZGRBY3RpdmVPbkRyYWdPcmlnaW4oZWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZUcgPSBkcmF3RmFrZURyYWdOb2RlKGJvYXJkLCBlbGVtZW50LCBvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICAgICAgICAgICAgICBkcmFnRmFrZU5vZGVHPy5hcHBlbmRDaGlsZChub2RlRyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKS5hcHBlbmRDaGlsZChkcmFnRmFrZU5vZGVHKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvaW50ZXJNb3ZlKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQuZ2xvYmFsUG9pbnRlclVwID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZmlyc3RMZXZlbEVsZW1lbnRzID0gZ2V0Rmlyc3RMZXZlbEVsZW1lbnQoYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICBpZiAoIWJvYXJkLm9wdGlvbnMucmVhZG9ubHkgJiYgZmlyc3RMZXZlbEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZmlyc3RMZXZlbEVsZW1lbnRzLnB1c2goLi4uY29ycmVzcG9uZGluZ0VsZW1lbnRzKTtcbiAgICAgICAgICAgIGlmIChpc0RyYWdnaW5nKGJvYXJkKSkge1xuICAgICAgICAgICAgICAgIGZpcnN0TGV2ZWxFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVBY3RpdmVPbkRyYWdPcmlnaW4oZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZHJvcFRhcmdldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFBhdGhSZWYgPSBib2FyZC5wYXRoUmVmKHRhcmdldFBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFByZXZpb3VzUGF0aFJlZiA9IFBhdGguaGFzUHJldmlvdXModGFyZ2V0UGF0aCkgJiYgYm9hcmQucGF0aFJlZihQYXRoLnByZXZpb3VzKHRhcmdldFBhdGgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50UGF0aFJlZiA9IGJvYXJkLnBhdGhSZWYoUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZHJvcFRhcmdldC50YXJnZXQpKTtcbiAgICAgICAgICAgICAgICBsZXQgYWJzdHJhY3RSZWZzID0gZ2V0VmFsaWRBYnN0cmFjdFJlZnMoYm9hcmQsIGZpcnN0TGV2ZWxFbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsRWxlbWVudHMgPSBmaXJzdExldmVsRWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihlbGVtZW50ID0+ICFhYnN0cmFjdFJlZnMuc29tZShyZWZzID0+IHJlZnMuYWJzdHJhY3QgPT09IGVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkanVzdEFic3RyYWN0VG9Ob2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzUHJldmlvdXNOb2RlID0gdGFyZ2V0UGF0aFt0YXJnZXRQYXRoLmxlbmd0aCAtIDFdICE9PSAwO1xuICAgICAgICAgICAgICAgIGlmIChoYXNQcmV2aW91c05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gUGxhaXROb2RlLmdldChib2FyZCwgUGF0aC5wcmV2aW91cyh0YXJnZXRQYXRoKSkgYXMgTWluZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdBYnN0cmFjdCA9IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdChwcmV2aW91c0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRIYXNDb3JyZXNwb25kQWJzdHJhY3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZ0Fic3RyYWN0ICYmIGNvcnJlc3BvbmRpbmdBYnN0cmFjdC5lbmQgIT09IHRhcmdldFBhdGhbdGFyZ2V0UGF0aC5sZW5ndGggLSAxXSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRIYXNDb3JyZXNwb25kQWJzdHJhY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkTm9kZSA9IGFic3RyYWN0UmVmcy5tYXAocmVmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRqdXN0QWJzdHJhY3RUb05vZGUocmVmLmFic3RyYWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsRWxlbWVudHMucHVzaCguLi5hZGp1c3RlZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RSZWZzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RlZEFic3RyYWN0cyA9IGRlbGV0ZUVsZW1lbnRIYW5kbGVBYnN0cmFjdChib2FyZCwgZmlyc3RMZXZlbEVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpbnNlcnRFbGVtZW50SGFuZGxlQWJzdHJhY3QoYm9hcmQsIHRhcmdldFBhdGgsIG5vcm1hbEVsZW1lbnRzLmxlbmd0aCwgZmFsc2UsIGVmZmVjdGVkQWJzdHJhY3RzKTtcbiAgICAgICAgICAgICAgICBNaW5kVHJhbnNmb3Jtcy5zZXRBYnN0cmFjdHNCeVJlZnMoYm9hcmQsIGVmZmVjdGVkQWJzdHJhY3RzKTtcblxuICAgICAgICAgICAgICAgIGxldCByZWZzID0gZGVsZXRlRWxlbWVudHNIYW5kbGVSaWdodE5vZGVDb3VudChib2FyZCwgZmlyc3RMZXZlbEVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnBhcmVudCh0YXJnZXRQYXRoKSkgYXMgTWluZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ2hhbmdlUm9vdCA9IGlzRHJvcFN0YW5kYXJkUmlnaHQocGFyZW50LCBkcm9wVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQ2hhbmdlUm9vdCAmJiB0YXJnZXRFbGVtZW50UGF0aFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZnMgPSBpbnNlcnRFbGVtZW50SGFuZGxlUmlnaHROb2RlQ291bnQoYm9hcmQsIHRhcmdldEVsZW1lbnRQYXRoUmVmLmN1cnJlbnQuc2xpY2UoMCwgMSksIG5vcm1hbEVsZW1lbnRzLmxlbmd0aCwgcmVmcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgTWluZFRyYW5zZm9ybXMuc2V0UmlnaHROb2RlQ291bnRCeVJlZnMoYm9hcmQsIHJlZnMpO1xuICAgICAgICAgICAgICAgIENvcmVUcmFuc2Zvcm1zLnJlbW92ZUVsZW1lbnRzKGJvYXJkLCBmaXJzdExldmVsRWxlbWVudHMpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGluc2VydFBhdGggPSB0YXJnZXRQYXRoUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IFBhdGgucGFyZW50KHRhcmdldFBhdGhSZWYuY3VycmVudCB8fCB0YXJnZXRQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWluc2VydFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIGFuZCB0aGUgc2VsZWN0ZWQgbm9kZSBwb3NpdGlvbiBhcmUgdGhlIHNhbWUsIHRoZSByZWNvcmRlZCBwcmV2aW91c1BhdGggaXMgdXNlZFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1BhdGggPSB0YXJnZXRQcmV2aW91c1BhdGhSZWYgJiYgdGFyZ2V0UHJldmlvdXNQYXRoUmVmLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1BhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFBhdGggPSBQYXRoLm5leHQocHJldmlvdXNQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IFBsYWl0Tm9kZS5nZXQoYm9hcmQsIHBhcmVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBnZXROb25BYnN0cmFjdENoaWxkcmVuKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRQYXRoID0gWy4uLnBhcmVudFBhdGgsIGNoaWxkcmVuLmxlbmd0aCB8fCAwXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE1pbmRUcmFuc2Zvcm1zLmluc2VydE5vZGVzKGJvYXJkLCBub3JtYWxFbGVtZW50cywgaW5zZXJ0UGF0aCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWJzdHJhY3RSZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBNaW5kVHJhbnNmb3Jtcy5pbnNlcnRBYnN0cmFjdE5vZGVzKGJvYXJkLCBhYnN0cmFjdFJlZnMsIG5vcm1hbEVsZW1lbnRzLCBpbnNlcnRQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVsZW1lbnRQYXRoUmVmLmN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UGF0aFJlZi5jdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIFBhdGguaXNBbmNlc3Rvcih0YXJnZXRFbGVtZW50UGF0aFJlZi5jdXJyZW50LCB0YXJnZXRQYXRoUmVmLmN1cnJlbnQpICYmXG4gICAgICAgICAgICAgICAgICAgIGRyb3BUYXJnZXQudGFyZ2V0LmlzQ29sbGFwc2VkXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgeyBpc0NvbGxhcHNlZDogZmFsc2UgfSwgdGFyZ2V0RWxlbWVudFBhdGhSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1lbnRQYXRoUmVmLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0UGF0aFJlZi51bnJlZigpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHNldEFjdGl2ZUVsZW1lbnRzOiBNaW5kRWxlbWVudFtdID0gW107XG4gICAgICAgICAgICAgICAgZGVwdGhGaXJzdFJlY3Vyc2lvbigoYm9hcmQgYXMgdW5rbm93bikgYXMgTWluZEVsZW1lbnQsIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYWN0aXZlRWxlbWVudHMuc29tZShlbGVtZW50ID0+IGVsZW1lbnQuaWQgPT09IG5vZGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlRWxlbWVudHMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5hZGRTZWxlY3Rpb25XaXRoVGVtcG9yYXJ5RWxlbWVudHMoYm9hcmQsIHNldEFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldE1pbmREcmFnZ2luZyhib2FyZCwgZmFsc2UpO1xuICAgICAgICAgICAgYWN0aXZlRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGRyYWdGYWtlTm9kZUc/LnJlbW92ZSgpO1xuICAgICAgICAgICAgZHJhZ0Zha2VOb2RlRyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZha2VEcm9wTm9kZUc/LnJlbW92ZSgpO1xuICAgICAgICAgICAgZmFrZURyb3BOb2RlRyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRyb3BUYXJnZXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGdsb2JhbFBvaW50ZXJVcChldmVudCk7XG4gICAgfTtcblxuICAgIHJldHVybiBib2FyZDtcbn07XG4iXX0=
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { PlaitElement, throttleRAF } from '@plait/core';
|
|
2
|
-
import { pointerLeaveHandle, pointerMoveHandle } from '../utils/node-hover/extend';
|
|
3
|
-
export const withNodeHoverHitTest = (board) => {
|
|
4
|
-
const { pointerMove, pointerLeave } = board;
|
|
5
|
-
let nodeExtendHoveredRef = null;
|
|
6
|
-
board.pointerMove = (event) => {
|
|
7
|
-
throttleRAF(board, 'with-mind-node-hover-hit-test', () => {
|
|
8
|
-
// element has been deleted
|
|
9
|
-
if (nodeExtendHoveredRef && !PlaitElement.hasMounted(nodeExtendHoveredRef.element)) {
|
|
10
|
-
nodeExtendHoveredRef = null;
|
|
11
|
-
}
|
|
12
|
-
nodeExtendHoveredRef = pointerMoveHandle(board, event, nodeExtendHoveredRef);
|
|
13
|
-
});
|
|
14
|
-
pointerMove(event);
|
|
15
|
-
};
|
|
16
|
-
board.pointerLeave = (event) => {
|
|
17
|
-
pointerLeaveHandle(board, event, nodeExtendHoveredRef);
|
|
18
|
-
nodeExtendHoveredRef = null;
|
|
19
|
-
pointerLeave(event);
|
|
20
|
-
};
|
|
21
|
-
return board;
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub2RlLWhvdmVyLWhpdC10ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvcGx1Z2lucy93aXRoLW5vZGUtaG92ZXItaGl0LXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEUsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpHLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQ3RELE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQzVDLElBQUksb0JBQW9CLEdBQWdDLElBQUksQ0FBQztJQUU3RCxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBbUIsRUFBRSxFQUFFO1FBQ3hDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsK0JBQStCLEVBQUUsR0FBRyxFQUFFO1lBQ3JELDJCQUEyQjtZQUMzQixJQUFJLG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNqRixvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDaEMsQ0FBQztZQUNELG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUM7SUFFRixLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsS0FBbUIsRUFBRSxFQUFFO1FBQ3pDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUN2RCxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUVGLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudCwgdGhyb3R0bGVSQUYgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBOb2RlRXh0ZW5kSG92ZXJlZFJlZiwgcG9pbnRlckxlYXZlSGFuZGxlLCBwb2ludGVyTW92ZUhhbmRsZSB9IGZyb20gJy4uL3V0aWxzL25vZGUtaG92ZXIvZXh0ZW5kJztcblxuZXhwb3J0IGNvbnN0IHdpdGhOb2RlSG92ZXJIaXRUZXN0ID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgY29uc3QgeyBwb2ludGVyTW92ZSwgcG9pbnRlckxlYXZlIH0gPSBib2FyZDtcbiAgICBsZXQgbm9kZUV4dGVuZEhvdmVyZWRSZWY6IE5vZGVFeHRlbmRIb3ZlcmVkUmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgICBib2FyZC5wb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIHRocm90dGxlUkFGKGJvYXJkLCAnd2l0aC1taW5kLW5vZGUtaG92ZXItaGl0LXRlc3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBlbGVtZW50IGhhcyBiZWVuIGRlbGV0ZWRcbiAgICAgICAgICAgIGlmIChub2RlRXh0ZW5kSG92ZXJlZFJlZiAmJiAhUGxhaXRFbGVtZW50Lmhhc01vdW50ZWQobm9kZUV4dGVuZEhvdmVyZWRSZWYuZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBub2RlRXh0ZW5kSG92ZXJlZFJlZiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlRXh0ZW5kSG92ZXJlZFJlZiA9IHBvaW50ZXJNb3ZlSGFuZGxlKGJvYXJkLCBldmVudCwgbm9kZUV4dGVuZEhvdmVyZWRSZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgcG9pbnRlck1vdmUoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5wb2ludGVyTGVhdmUgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgICBwb2ludGVyTGVhdmVIYW5kbGUoYm9hcmQsIGV2ZW50LCBub2RlRXh0ZW5kSG92ZXJlZFJlZik7XG4gICAgICAgIG5vZGVFeHRlbmRIb3ZlcmVkUmVmID0gbnVsbDtcbiAgICAgICAgcG9pbnRlckxlYXZlKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJvYXJkO1xufTtcbiJdfQ==
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Point, PlaitNode } from '@plait/core';
|
|
2
|
-
import { MindElement } from '../interfaces';
|
|
3
|
-
import { getHitImageResizeHandleDirection } from '../utils';
|
|
4
|
-
import { addElementOfFocusedImage, getElementOfFocusedImage, withResize } from '@plait/common';
|
|
5
|
-
import { MindTransforms } from '../transforms';
|
|
6
|
-
export const withNodeImageResize = (board) => {
|
|
7
|
-
const options = {
|
|
8
|
-
key: 'mind-node-image',
|
|
9
|
-
canResize: () => {
|
|
10
|
-
return true;
|
|
11
|
-
},
|
|
12
|
-
hitTest: (point) => {
|
|
13
|
-
const elementOfFocusedImage = getElementOfFocusedImage(board);
|
|
14
|
-
const selectedMindElement = elementOfFocusedImage && MindElement.isMindElement(board, elementOfFocusedImage) ? elementOfFocusedImage : undefined;
|
|
15
|
-
if (selectedMindElement) {
|
|
16
|
-
const result = getHitImageResizeHandleDirection(board, selectedMindElement, point);
|
|
17
|
-
if (result) {
|
|
18
|
-
return {
|
|
19
|
-
element: selectedMindElement,
|
|
20
|
-
handle: result.handle,
|
|
21
|
-
cursorClass: result.cursorClass
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
26
|
-
},
|
|
27
|
-
onResize: (resizeRef, resizeState) => {
|
|
28
|
-
const offsetX = Point.getOffsetX(resizeState.startPoint, resizeState.endPoint);
|
|
29
|
-
const originWidth = resizeRef.element.data.image.width;
|
|
30
|
-
const originHeight = resizeRef.element.data.image.height;
|
|
31
|
-
const path = resizeRef.path;
|
|
32
|
-
let width = originWidth + offsetX;
|
|
33
|
-
if (width <= 100) {
|
|
34
|
-
width = 100;
|
|
35
|
-
}
|
|
36
|
-
const ratio = originWidth / originHeight;
|
|
37
|
-
const height = width / ratio;
|
|
38
|
-
const imageItem = { ...resizeRef.element.data.image, width, height };
|
|
39
|
-
MindTransforms.setImage(board, PlaitNode.get(board, path), imageItem);
|
|
40
|
-
addElementOfFocusedImage(board, PlaitNode.get(board, path));
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
withResize(board, options);
|
|
44
|
-
return board;
|
|
45
|
-
};
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub2RlLWltYWdlLXJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3BsdWdpbnMvd2l0aC1ub2RlLWltYWdlLXJlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsS0FBSyxFQUFFLFNBQVMsRUFBUSxNQUFNLGFBQWEsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1RCxPQUFPLEVBS0gsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixVQUFVLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUNyRCxNQUFNLE9BQU8sR0FBOEM7UUFDdkQsR0FBRyxFQUFFLGlCQUFpQjtRQUN0QixTQUFTLEVBQUUsR0FBRyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3RCLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsTUFBTSxtQkFBbUIsR0FDckIscUJBQXFCLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6SCxJQUFJLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sTUFBTSxHQUFHLGdDQUFnQyxDQUFDLEtBQUssRUFBRSxtQkFBNkMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0csSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDVCxPQUFPO3dCQUNILE9BQU8sRUFBRSxtQkFBNkM7d0JBQ3RELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBc0I7d0JBQ3JDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztxQkFDbEMsQ0FBQztnQkFDTixDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxRQUFRLEVBQUUsQ0FBQyxTQUE0QyxFQUFFLFdBQXdCLEVBQUUsRUFBRTtZQUNqRixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDdkQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN6RCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsSUFBWSxDQUFDO1lBQ3BDLElBQUksS0FBSyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDbEMsSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2YsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsV0FBVyxHQUFHLFlBQVksQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQzdCLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3JFLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3RFLHdCQUF3QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7S0FDSixDQUFDO0lBRUYsVUFBVSxDQUF5QixLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFbkQsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFBsYWl0Tm9kZSwgUGF0aCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRFbGVtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJbWFnZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2VsZW1lbnQtZGF0YSc7XG5pbXBvcnQgeyBnZXRIaXRJbWFnZVJlc2l6ZUhhbmRsZURpcmVjdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gICAgUmVzaXplSGFuZGxlLFxuICAgIFJlc2l6ZVJlZixcbiAgICBSZXNpemVTdGF0ZSxcbiAgICBXaXRoUmVzaXplT3B0aW9ucyxcbiAgICBhZGRFbGVtZW50T2ZGb2N1c2VkSW1hZ2UsXG4gICAgZ2V0RWxlbWVudE9mRm9jdXNlZEltYWdlLFxuICAgIHdpdGhSZXNpemVcbn0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBNaW5kVHJhbnNmb3JtcyB9IGZyb20gJy4uL3RyYW5zZm9ybXMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aE5vZGVJbWFnZVJlc2l6ZSA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IFdpdGhSZXNpemVPcHRpb25zPE1pbmRFbGVtZW50PEltYWdlRGF0YT4+ID0ge1xuICAgICAgICBrZXk6ICdtaW5kLW5vZGUtaW1hZ2UnLFxuICAgICAgICBjYW5SZXNpemU6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBoaXRUZXN0OiAocG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZGb2N1c2VkSW1hZ2UgPSBnZXRFbGVtZW50T2ZGb2N1c2VkSW1hZ2UoYm9hcmQpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNaW5kRWxlbWVudCA9XG4gICAgICAgICAgICAgICAgZWxlbWVudE9mRm9jdXNlZEltYWdlICYmIE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnRPZkZvY3VzZWRJbWFnZSkgPyBlbGVtZW50T2ZGb2N1c2VkSW1hZ2UgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRNaW5kRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEhpdEltYWdlUmVzaXplSGFuZGxlRGlyZWN0aW9uKGJvYXJkLCBzZWxlY3RlZE1pbmRFbGVtZW50IGFzIE1pbmRFbGVtZW50PEltYWdlRGF0YT4sIHBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBzZWxlY3RlZE1pbmRFbGVtZW50IGFzIE1pbmRFbGVtZW50PEltYWdlRGF0YT4sXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IHJlc3VsdC5oYW5kbGUgYXMgUmVzaXplSGFuZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yQ2xhc3M6IHJlc3VsdC5jdXJzb3JDbGFzc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBvblJlc2l6ZTogKHJlc2l6ZVJlZjogUmVzaXplUmVmPE1pbmRFbGVtZW50PEltYWdlRGF0YT4+LCByZXNpemVTdGF0ZTogUmVzaXplU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBQb2ludC5nZXRPZmZzZXRYKHJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQsIHJlc2l6ZVN0YXRlLmVuZFBvaW50KTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbldpZHRoID0gcmVzaXplUmVmLmVsZW1lbnQuZGF0YS5pbWFnZS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbkhlaWdodCA9IHJlc2l6ZVJlZi5lbGVtZW50LmRhdGEuaW1hZ2UuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IHJlc2l6ZVJlZi5wYXRoIGFzIFBhdGg7XG4gICAgICAgICAgICBsZXQgd2lkdGggPSBvcmlnaW5XaWR0aCArIG9mZnNldFg7XG4gICAgICAgICAgICBpZiAod2lkdGggPD0gMTAwKSB7XG4gICAgICAgICAgICAgICAgd2lkdGggPSAxMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByYXRpbyA9IG9yaWdpbldpZHRoIC8gb3JpZ2luSGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gd2lkdGggLyByYXRpbztcbiAgICAgICAgICAgIGNvbnN0IGltYWdlSXRlbSA9IHsgLi4ucmVzaXplUmVmLmVsZW1lbnQuZGF0YS5pbWFnZSwgd2lkdGgsIGhlaWdodCB9O1xuICAgICAgICAgICAgTWluZFRyYW5zZm9ybXMuc2V0SW1hZ2UoYm9hcmQsIFBsYWl0Tm9kZS5nZXQoYm9hcmQsIHBhdGgpLCBpbWFnZUl0ZW0pO1xuICAgICAgICAgICAgYWRkRWxlbWVudE9mRm9jdXNlZEltYWdlKGJvYXJkLCBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBwYXRoKSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgd2l0aFJlc2l6ZTxNaW5kRWxlbWVudDxJbWFnZURhdGE+Pihib2FyZCwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYm9hcmQ7XG59O1xuIl19
|