@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.
Files changed (96) hide show
  1. package/fesm2022/plait-mind.mjs +2 -2
  2. package/fesm2022/plait-mind.mjs.map +1 -1
  3. package/package.json +1 -3
  4. package/esm2022/constants/abstract-node.mjs +0 -5
  5. package/esm2022/constants/default.mjs +0 -17
  6. package/esm2022/constants/index.mjs +0 -5
  7. package/esm2022/constants/node-style.mjs +0 -19
  8. package/esm2022/constants/node-topic-style.mjs +0 -7
  9. package/esm2022/constants/theme.mjs +0 -73
  10. package/esm2022/emoji/emoji-base.component.mjs +0 -6
  11. package/esm2022/emoji/index.mjs +0 -3
  12. package/esm2022/emoji/with-emoji.mjs +0 -8
  13. package/esm2022/generators/node-active.generator.mjs +0 -46
  14. package/esm2022/generators/node-collapse.generator.mjs +0 -108
  15. package/esm2022/generators/node-emojis.generator.mjs +0 -63
  16. package/esm2022/generators/node-plus.generator.mjs +0 -100
  17. package/esm2022/generators/node-shape.generator.mjs +0 -22
  18. package/esm2022/interfaces/element-data.mjs +0 -2
  19. package/esm2022/interfaces/element.mjs +0 -103
  20. package/esm2022/interfaces/index.mjs +0 -8
  21. package/esm2022/interfaces/layout.mjs +0 -19
  22. package/esm2022/interfaces/node.mjs +0 -14
  23. package/esm2022/interfaces/options.mjs +0 -2
  24. package/esm2022/interfaces/pointer.mjs +0 -5
  25. package/esm2022/interfaces/theme-color.mjs +0 -57
  26. package/esm2022/interfaces/types.mjs +0 -13
  27. package/esm2022/mind-node.component.mjs +0 -193
  28. package/esm2022/mind.component.mjs +0 -34
  29. package/esm2022/plait-mind.mjs +0 -5
  30. package/esm2022/plugins/with-abstract-resize.board.mjs +0 -12
  31. package/esm2022/plugins/with-abstract-resize.mjs +0 -112
  32. package/esm2022/plugins/with-mind-create.mjs +0 -104
  33. package/esm2022/plugins/with-mind-extend.mjs +0 -7
  34. package/esm2022/plugins/with-mind-fragment.mjs +0 -101
  35. package/esm2022/plugins/with-mind-hotkey.mjs +0 -62
  36. package/esm2022/plugins/with-mind.board.mjs +0 -2
  37. package/esm2022/plugins/with-mind.mjs +0 -148
  38. package/esm2022/plugins/with-node-dnd.mjs +0 -176
  39. package/esm2022/plugins/with-node-hover-hit-test.mjs +0 -23
  40. package/esm2022/plugins/with-node-image-resize.mjs +0 -46
  41. package/esm2022/plugins/with-node-image.mjs +0 -113
  42. package/esm2022/plugins/with-node-resize.mjs +0 -69
  43. package/esm2022/public-api.mjs +0 -16
  44. package/esm2022/queries/get-available-sublayouts-by-element.mjs +0 -23
  45. package/esm2022/queries/get-branch-layouts.mjs +0 -18
  46. package/esm2022/queries/get-correct-layout-by-element.mjs +0 -48
  47. package/esm2022/queries/get-layout-by-element.mjs +0 -18
  48. package/esm2022/queries/index.mjs +0 -11
  49. package/esm2022/transforms/abstract-node.mjs +0 -73
  50. package/esm2022/transforms/emoji.mjs +0 -41
  51. package/esm2022/transforms/image.mjs +0 -31
  52. package/esm2022/transforms/index.mjs +0 -30
  53. package/esm2022/transforms/layout.mjs +0 -19
  54. package/esm2022/transforms/node.mjs +0 -99
  55. package/esm2022/transforms/property.mjs +0 -34
  56. package/esm2022/utils/abstract/common.mjs +0 -170
  57. package/esm2022/utils/abstract/resize.mjs +0 -194
  58. package/esm2022/utils/clipboard.mjs +0 -108
  59. package/esm2022/utils/common.mjs +0 -26
  60. package/esm2022/utils/dnd/common.mjs +0 -59
  61. package/esm2022/utils/dnd/detector.mjs +0 -176
  62. package/esm2022/utils/draw/abstract-outline.mjs +0 -118
  63. package/esm2022/utils/draw/node-dnd.mjs +0 -164
  64. package/esm2022/utils/draw/node-link/abstract-link.mjs +0 -60
  65. package/esm2022/utils/draw/node-link/draw-link.mjs +0 -9
  66. package/esm2022/utils/draw/node-link/indented-link.mjs +0 -46
  67. package/esm2022/utils/draw/node-link/logic-link.mjs +0 -76
  68. package/esm2022/utils/draw/node-shape.mjs +0 -26
  69. package/esm2022/utils/index.mjs +0 -17
  70. package/esm2022/utils/layout.mjs +0 -105
  71. package/esm2022/utils/mind.mjs +0 -98
  72. package/esm2022/utils/node/adjust-node.mjs +0 -36
  73. package/esm2022/utils/node/common.mjs +0 -15
  74. package/esm2022/utils/node/create-node.mjs +0 -46
  75. package/esm2022/utils/node/dynamic-width.mjs +0 -14
  76. package/esm2022/utils/node/image.mjs +0 -15
  77. package/esm2022/utils/node/index.mjs +0 -6
  78. package/esm2022/utils/node/right-node-count.mjs +0 -45
  79. package/esm2022/utils/node-hover/extend.mjs +0 -50
  80. package/esm2022/utils/node-style/branch.mjs +0 -63
  81. package/esm2022/utils/node-style/common.mjs +0 -4
  82. package/esm2022/utils/node-style/index.mjs +0 -4
  83. package/esm2022/utils/node-style/shape.mjs +0 -37
  84. package/esm2022/utils/normalize.mjs +0 -40
  85. package/esm2022/utils/path.mjs +0 -12
  86. package/esm2022/utils/point-placement.mjs +0 -119
  87. package/esm2022/utils/position/emoji.mjs +0 -31
  88. package/esm2022/utils/position/image.mjs +0 -36
  89. package/esm2022/utils/position/index.mjs +0 -5
  90. package/esm2022/utils/position/node.mjs +0 -36
  91. package/esm2022/utils/position/topic.mjs +0 -16
  92. package/esm2022/utils/space/emoji.mjs +0 -20
  93. package/esm2022/utils/space/index.mjs +0 -4
  94. package/esm2022/utils/space/layout-options.mjs +0 -69
  95. package/esm2022/utils/space/node-space.mjs +0 -134
  96. package/esm2022/utils/weak-maps.mjs +0 -2
@@ -1,19 +0,0 @@
1
- import { PlaitNode, Transforms } from '@plait/core';
2
- import { isHorizontalLogicLayout, isVerticalLogicLayout } from '@plait/layouts';
3
- export const correctLogicLayoutNode = (board, layout, path) => {
4
- const node = PlaitNode.get(board, path);
5
- if (node && layout) {
6
- node.children?.forEach((value, index) => {
7
- if (value.layout) {
8
- if ((isHorizontalLogicLayout(layout) && isVerticalLogicLayout(value.layout)) ||
9
- (isVerticalLogicLayout(layout) && isHorizontalLogicLayout(value.layout))) {
10
- Transforms.setNode(board, { layout: null }, [...path, index]);
11
- }
12
- if (value.children?.length) {
13
- correctLogicLayoutNode(board, layout, [...path, index]);
14
- }
15
- }
16
- });
17
- }
18
- };
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvdHJhbnNmb3Jtcy9sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsTUFBc0IsRUFBRSxJQUFVLEVBQUUsRUFBRTtJQUM1RixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQWdCLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2YsSUFDSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDMUUsQ0FBQztvQkFDQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUN6QixzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQYXRoLCBQbGFpdE5vZGUsIFRyYW5zZm9ybXMgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBpc0hvcml6b250YWxMb2dpY0xheW91dCwgaXNWZXJ0aWNhbExvZ2ljTGF5b3V0LCBNaW5kTGF5b3V0VHlwZSB9IGZyb20gJ0BwbGFpdC9sYXlvdXRzJztcblxuZXhwb3J0IGNvbnN0IGNvcnJlY3RMb2dpY0xheW91dE5vZGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGxheW91dDogTWluZExheW91dFR5cGUsIHBhdGg6IFBhdGgpID0+IHtcbiAgICBjb25zdCBub2RlID0gUGxhaXROb2RlLmdldChib2FyZCwgcGF0aCk7XG4gICAgaWYgKG5vZGUgJiYgbGF5b3V0KSB7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2goKHZhbHVlOiBQbGFpdE5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUubGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoaXNIb3Jpem9udGFsTG9naWNMYXlvdXQobGF5b3V0KSAmJiBpc1ZlcnRpY2FsTG9naWNMYXlvdXQodmFsdWUubGF5b3V0KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzVmVydGljYWxMb2dpY0xheW91dChsYXlvdXQpICYmIGlzSG9yaXpvbnRhbExvZ2ljTGF5b3V0KHZhbHVlLmxheW91dCkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgeyBsYXlvdXQ6IG51bGwgfSwgWy4uLnBhdGgsIGluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvcnJlY3RMb2dpY0xheW91dE5vZGUoYm9hcmQsIGxheW91dCwgWy4uLnBhdGgsIGluZGV4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuIl19
@@ -1,99 +0,0 @@
1
- import { Path } from 'slate';
2
- import { MindElement, PlaitMind } from '../interfaces/element';
3
- import { PlaitBoard, PlaitHistoryBoard, PlaitNode, Transforms, removeSelectedElement } from '@plait/core';
4
- import { getRelativeStartEndByAbstractRef, insertElementHandleAbstract } from '../utils/abstract/common';
5
- import { insertElementHandleRightNodeCount, isInRightBranchOfStandardLayout } from '../utils/node/right-node-count';
6
- import { NodeSpace } from '../utils/space/node-space';
7
- import { findNewChildNodePath, findNewSiblingNodePath, insertMindElement } from '../utils';
8
- import { setAbstractsByRefs } from './abstract-node';
9
- import { AbstractNode } from '@plait/layouts';
10
- const normalizeWidthAndHeight = (board, element, width, height) => {
11
- const minWidth = NodeSpace.getNodeTopicMinWidth(board, element);
12
- const newWidth = width < minWidth ? minWidth : width;
13
- return { width: Math.ceil(newWidth), height };
14
- };
15
- export const setTopic = (board, element, topic, width, height) => {
16
- const newElement = {
17
- data: { ...element.data, topic },
18
- ...normalizeWidthAndHeight(board, element, width, height)
19
- };
20
- const path = PlaitBoard.findPath(board, element);
21
- Transforms.setNode(board, newElement, path);
22
- };
23
- export const setNodeManualWidth = (board, element, width, height) => {
24
- const path = PlaitBoard.findPath(board, element);
25
- const { width: normalizedWidth, height: normalizedHeight } = normalizeWidthAndHeight(board, element, width, height);
26
- const newElement = { manualWidth: normalizedWidth, height: normalizedHeight };
27
- Transforms.setNode(board, newElement, path);
28
- };
29
- export const setTopicSize = (board, element, width, height) => {
30
- const newElement = {
31
- ...normalizeWidthAndHeight(board, element, width, height)
32
- };
33
- let isEqualWidth = Math.ceil(element.width) === Math.ceil(newElement.width);
34
- let isEqualHeight = Math.ceil(element.height) === Math.ceil(newElement.height);
35
- if (element.manualWidth) {
36
- isEqualWidth = true;
37
- }
38
- if (!isEqualWidth || !isEqualHeight) {
39
- const path = PlaitBoard.findPath(board, element);
40
- Transforms.setNode(board, newElement, path);
41
- }
42
- };
43
- export const insertNodes = (board, elements, path) => {
44
- const pathRef = board.pathRef(path);
45
- elements.forEach(element => {
46
- if (pathRef.current) {
47
- Transforms.insertNode(board, element, pathRef.current);
48
- }
49
- });
50
- pathRef.unref();
51
- };
52
- export const insertAbstractNodes = (board, validAbstractRefs, elements, path) => {
53
- const parent = PlaitNode.get(board, Path.parent(path));
54
- const abstractPath = [...Path.parent(path), parent.children?.length];
55
- const abstracts = validAbstractRefs.map(refs => {
56
- const { start, end } = getRelativeStartEndByAbstractRef(refs, elements);
57
- return {
58
- ...refs.abstract,
59
- start: start + path[path.length - 1],
60
- end: end + path[path.length - 1]
61
- };
62
- });
63
- insertNodes(board, abstracts, abstractPath);
64
- };
65
- export const setRightNodeCountByRefs = (board, refs) => {
66
- refs.forEach(ref => {
67
- Transforms.setNode(board, { rightNodeCount: ref.rightNodeCount }, ref.path);
68
- });
69
- };
70
- export const insertChildNode = (board, element) => {
71
- if (MindElement.isMindElement(board, element)) {
72
- removeSelectedElement(board, element);
73
- const targetElementPath = PlaitBoard.findPath(board, element);
74
- if (element.isCollapsed) {
75
- const newElement = { isCollapsed: false };
76
- PlaitHistoryBoard.withoutSaving(board, () => {
77
- Transforms.setNode(board, newElement, targetElementPath);
78
- });
79
- }
80
- insertMindElement(board, element, findNewChildNodePath(board, element));
81
- }
82
- };
83
- export const insertSiblingNode = (board, element) => {
84
- if (MindElement.isMindElement(board, element) && !PlaitMind.isMind(element) && !AbstractNode.isAbstract(element)) {
85
- const path = PlaitBoard.findPath(board, element);
86
- if (isInRightBranchOfStandardLayout(element)) {
87
- const refs = insertElementHandleRightNodeCount(board, path.slice(0, 1), 1);
88
- setRightNodeCountByRefs(board, refs);
89
- }
90
- const abstractRefs = insertElementHandleAbstract(board, Path.next(path));
91
- setAbstractsByRefs(board, abstractRefs);
92
- insertMindElement(board, element, findNewSiblingNodePath(board, element));
93
- }
94
- };
95
- export const insertMind = (board, mind) => {
96
- Transforms.insertNode(board, mind, [board.children.length]);
97
- Transforms.addSelectionWithTemporaryElements(board, [mind]);
98
- };
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3RyYW5zZm9ybXMvbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFHLE9BQU8sRUFBZSxnQ0FBZ0MsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RILE9BQU8sRUFBcUIsaUNBQWlDLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxNQUFNLHVCQUF1QixHQUFHLENBQUMsS0FBcUIsRUFBRSxPQUFvQixFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUMzRyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENB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QyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSwrQkFBK0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLGlDQUFpQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRSx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLDJCQUEyQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQXFCLEVBQUUsSUFBaUIsRUFBRSxFQUFFO0lBQ25FLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RCxVQUFVLENBQUMsaUNBQWlDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50LCBQYXRoIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEhpc3RvcnlCb2FyZCwgUGxhaXROb2RlLCBUcmFuc2Zvcm1zLCByZW1vdmVTZWxlY3RlZEVsZW1lbnQgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFJlZiwgZ2V0UmVsYXRpdmVTdGFydEVuZEJ5QWJzdHJhY3RSZWYsIGluc2VydEVsZW1lbnRIYW5kbGVBYnN0cmFjdCB9IGZyb20gJy4uL3V0aWxzL2Fic3RyYWN0L2NvbW1vbic7XG5pbXBvcnQgeyBSaWdodE5vZGVDb3VudFJlZiwgaW5zZXJ0RWxlbWVudEhhbmRsZVJpZ2h0Tm9kZUNvdW50LCBpc0luUmlnaHRCcmFuY2hPZlN0YW5kYXJkTGF5b3V0IH0gZnJvbSAnLi4vdXRpbHMvbm9kZS9yaWdodC1ub2RlLWNvdW50JztcbmltcG9ydCB7IE5vZGVTcGFjZSB9IGZyb20gJy4uL3V0aWxzL3NwYWNlL25vZGUtc3BhY2UnO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5pbXBvcnQgeyBmaW5kTmV3Q2hpbGROb2RlUGF0aCwgZmluZE5ld1NpYmxpbmdOb2RlUGF0aCwgaW5zZXJ0TWluZEVsZW1lbnQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBzZXRBYnN0cmFjdHNCeVJlZnMgfSBmcm9tICcuL2Fic3RyYWN0LW5vZGUnO1xuaW1wb3J0IHsgQWJzdHJhY3ROb2RlIH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuXG5jb25zdCBub3JtYWxpemVXaWR0aEFuZEhlaWdodCA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG1pbldpZHRoID0gTm9kZVNwYWNlLmdldE5vZGVUb3BpY01pbldpZHRoKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBuZXdXaWR0aCA9IHdpZHRoIDwgbWluV2lkdGggPyBtaW5XaWR0aCA6IHdpZHRoO1xuICAgIHJldHVybiB7IHdpZHRoOiBNYXRoLmNlaWwobmV3V2lkdGgpLCBoZWlnaHQgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRUb3BpYyA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50LCB0b3BpYzogRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0ge1xuICAgICAgICBkYXRhOiB7IC4uLmVsZW1lbnQuZGF0YSwgdG9waWMgfSxcbiAgICAgICAgLi4ubm9ybWFsaXplV2lkdGhBbmRIZWlnaHQoYm9hcmQsIGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQpXG4gICAgfSBhcyBNaW5kRWxlbWVudDtcbiAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCBuZXdFbGVtZW50LCBwYXRoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXROb2RlTWFudWFsV2lkdGggPSAoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgeyB3aWR0aDogbm9ybWFsaXplZFdpZHRoLCBoZWlnaHQ6IG5vcm1hbGl6ZWRIZWlnaHQgfSA9IG5vcm1hbGl6ZVdpZHRoQW5kSGVpZ2h0KGJvYXJkLCBlbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0geyBtYW51YWxXaWR0aDogbm9ybWFsaXplZFdpZHRoLCBoZWlnaHQ6IG5vcm1hbGl6ZWRIZWlnaHQgfSBhcyBNaW5kRWxlbWVudDtcbiAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIG5ld0VsZW1lbnQsIHBhdGgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFRvcGljU2l6ZSA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB7XG4gICAgICAgIC4uLm5vcm1hbGl6ZVdpZHRoQW5kSGVpZ2h0KGJvYXJkLCBlbGVtZW50LCB3aWR0aCwgaGVpZ2h0KVxuICAgIH07XG4gICAgbGV0IGlzRXF1YWxXaWR0aCA9IE1hdGguY2VpbChlbGVtZW50LndpZHRoKSA9PT0gTWF0aC5jZWlsKG5ld0VsZW1lbnQud2lkdGgpO1xuICAgIGxldCBpc0VxdWFsSGVpZ2h0ID0gTWF0aC5jZWlsKGVsZW1lbnQuaGVpZ2h0KSA9PT0gTWF0aC5jZWlsKG5ld0VsZW1lbnQuaGVpZ2h0KTtcbiAgICBpZiAoZWxlbWVudC5tYW51YWxXaWR0aCkge1xuICAgICAgICBpc0VxdWFsV2lkdGggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWlzRXF1YWxXaWR0aCB8fCAhaXNFcXVhbEhlaWdodCkge1xuICAgICAgICBjb25zdCBwYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgbmV3RWxlbWVudCwgcGF0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydE5vZGVzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50czogTWluZEVsZW1lbnRbXSwgcGF0aDogUGF0aCkgPT4ge1xuICAgIGNvbnN0IHBhdGhSZWYgPSBib2FyZC5wYXRoUmVmKHBhdGgpO1xuICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChwYXRoUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZShib2FyZCwgZWxlbWVudCwgcGF0aFJlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHBhdGhSZWYudW5yZWYoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRBYnN0cmFjdE5vZGVzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCB2YWxpZEFic3RyYWN0UmVmczogQWJzdHJhY3RSZWZbXSwgZWxlbWVudHM6IE1pbmRFbGVtZW50W10sIHBhdGg6IFBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnBhcmVudChwYXRoKSk7XG4gICAgY29uc3QgYWJzdHJhY3RQYXRoID0gWy4uLlBhdGgucGFyZW50KHBhdGgpLCBwYXJlbnQuY2hpbGRyZW4/Lmxlbmd0aCFdO1xuICAgIGNvbnN0IGFic3RyYWN0cyA9IHZhbGlkQWJzdHJhY3RSZWZzLm1hcChyZWZzID0+IHtcbiAgICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBnZXRSZWxhdGl2ZVN0YXJ0RW5kQnlBYnN0cmFjdFJlZihyZWZzLCBlbGVtZW50cyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZWZzLmFic3RyYWN0LFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0ICsgcGF0aFtwYXRoLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgZW5kOiBlbmQgKyBwYXRoW3BhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGluc2VydE5vZGVzKGJvYXJkLCBhYnN0cmFjdHMsIGFic3RyYWN0UGF0aCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0UmlnaHROb2RlQ291bnRCeVJlZnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlZnM6IFJpZ2h0Tm9kZUNvdW50UmVmW10pID0+IHtcbiAgICByZWZzLmZvckVhY2gocmVmID0+IHtcbiAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCB7IHJpZ2h0Tm9kZUNvdW50OiByZWYucmlnaHROb2RlQ291bnQgfSwgcmVmLnBhdGgpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydENoaWxkTm9kZSA9IChib2FyZDogUGxhaXRNaW5kQm9hcmQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50KSA9PiB7XG4gICAgaWYgKE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpKSB7XG4gICAgICAgIHJlbW92ZVNlbGVjdGVkRWxlbWVudChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRQYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LmlzQ29sbGFwc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50OiBQYXJ0aWFsPE1pbmRFbGVtZW50PiA9IHsgaXNDb2xsYXBzZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICBQbGFpdEhpc3RvcnlCb2FyZC53aXRob3V0U2F2aW5nKGJvYXJkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCBuZXdFbGVtZW50LCB0YXJnZXRFbGVtZW50UGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRNaW5kRWxlbWVudChib2FyZCwgZWxlbWVudCwgZmluZE5ld0NoaWxkTm9kZVBhdGgoYm9hcmQsIGVsZW1lbnQpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaW5zZXJ0U2libGluZ05vZGUgPSAoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIGlmIChNaW5kRWxlbWVudC5pc01pbmRFbGVtZW50KGJvYXJkLCBlbGVtZW50KSAmJiAhUGxhaXRNaW5kLmlzTWluZChlbGVtZW50KSAmJiAhQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBpZiAoaXNJblJpZ2h0QnJhbmNoT2ZTdGFuZGFyZExheW91dChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IGluc2VydEVsZW1lbnRIYW5kbGVSaWdodE5vZGVDb3VudChib2FyZCwgcGF0aC5zbGljZSgwLCAxKSwgMSk7XG4gICAgICAgICAgICBzZXRSaWdodE5vZGVDb3VudEJ5UmVmcyhib2FyZCwgcmVmcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWJzdHJhY3RSZWZzID0gaW5zZXJ0RWxlbWVudEhhbmRsZUFic3RyYWN0KGJvYXJkLCBQYXRoLm5leHQocGF0aCkpO1xuICAgICAgICBzZXRBYnN0cmFjdHNCeVJlZnMoYm9hcmQsIGFic3RyYWN0UmVmcyk7XG4gICAgICAgIGluc2VydE1pbmRFbGVtZW50KGJvYXJkLCBlbGVtZW50LCBmaW5kTmV3U2libGluZ05vZGVQYXRoKGJvYXJkLCBlbGVtZW50KSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydE1pbmQgPSAoYm9hcmQ6IFBsYWl0TWluZEJvYXJkLCBtaW5kOiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZShib2FyZCwgbWluZCwgW2JvYXJkLmNoaWxkcmVuLmxlbmd0aF0pO1xuICAgIFRyYW5zZm9ybXMuYWRkU2VsZWN0aW9uV2l0aFRlbXBvcmFyeUVsZW1lbnRzKGJvYXJkLCBbbWluZF0pO1xufTtcbiJdfQ==
@@ -1,34 +0,0 @@
1
- import { PlaitNode, Transforms } from '@plait/core';
2
- import { isStandardLayout } from '@plait/layouts';
3
- import { PropertyTransforms } from '@plait/common';
4
- import { MindElement, PlaitMind } from '../interfaces';
5
- import { correctLogicLayoutNode } from './layout';
6
- import { setAbstractByStandardLayout } from './abstract-node';
7
- export const setLayout = (board, type) => {
8
- const callback = (element, path) => {
9
- if (MindElement.isMindElement(board, element)) {
10
- correctLogicLayoutNode(board, type, path);
11
- const element = PlaitNode.get(board, path);
12
- if (PlaitMind.isMind(element) && isStandardLayout(type)) {
13
- let properties = { rightNodeCount: element.children.length / 2 };
14
- Transforms.setNode(board, properties, path);
15
- setAbstractByStandardLayout(board, element);
16
- }
17
- Transforms.setNode(board, { layout: type }, path);
18
- }
19
- };
20
- PropertyTransforms.setProperty(board, {}, { callback });
21
- };
22
- export const setShape = (board, shape) => {
23
- PropertyTransforms.setProperty(board, { shape });
24
- };
25
- export const setBranchShape = (board, branchShape) => {
26
- PropertyTransforms.setProperty(board, { branchShape });
27
- };
28
- export const setBranchWidth = (board, branchWidth) => {
29
- PropertyTransforms.setProperty(board, { branchWidth });
30
- };
31
- export const setBranchColor = (board, branchColor) => {
32
- PropertyTransforms.setProperty(board, { branchColor });
33
- };
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy90cmFuc2Zvcm1zL3Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RSxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBaUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBaUIsRUFBRSxJQUFvQixFQUFFLEVBQUU7SUFDakUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFvQixFQUFFLElBQVUsRUFBRSxFQUFFO1FBQ2xELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBZ0IsQ0FBQztZQUMxRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxVQUFVLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0Ysa0JBQWtCLENBQUMsV0FBVyxDQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsS0FBdUIsRUFBRSxFQUFFO0lBQ25FLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBd0IsRUFBRSxFQUFFO0lBQzFFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQ3JFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQ3JFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhdGgsIFBsYWl0Qm9hcmQsIFBsYWl0Tm9kZSwgVHJhbnNmb3JtcyB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRMYXlvdXRUeXBlLCBpc1N0YW5kYXJkTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgUHJvcGVydHlUcmFuc2Zvcm1zIH0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQgeyBCcmFuY2hTaGFwZSwgTWluZEVsZW1lbnRTaGFwZSwgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY29ycmVjdExvZ2ljTGF5b3V0Tm9kZSB9IGZyb20gJy4vbGF5b3V0JztcbmltcG9ydCB7IHNldEFic3RyYWN0QnlTdGFuZGFyZExheW91dCB9IGZyb20gJy4vYWJzdHJhY3Qtbm9kZSc7XG5cbmV4cG9ydCBjb25zdCBzZXRMYXlvdXQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHR5cGU6IE1pbmRMYXlvdXRUeXBlKSA9PiB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoZWxlbWVudDogTWluZEVsZW1lbnQsIHBhdGg6IFBhdGgpID0+IHtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50LmlzTWluZEVsZW1lbnQoYm9hcmQsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjb3JyZWN0TG9naWNMYXlvdXROb2RlKGJvYXJkLCB0eXBlLCBwYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBwYXRoKSBhcyBNaW5kRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKGVsZW1lbnQpICYmIGlzU3RhbmRhcmRMYXlvdXQodHlwZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IHsgcmlnaHROb2RlQ291bnQ6IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoIC8gMiB9O1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgcHJvcGVydGllcywgcGF0aCk7XG4gICAgICAgICAgICAgICAgc2V0QWJzdHJhY3RCeVN0YW5kYXJkTGF5b3V0KGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgeyBsYXlvdXQ6IHR5cGUgfSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFByb3BlcnR5VHJhbnNmb3Jtcy5zZXRQcm9wZXJ0eTxNaW5kRWxlbWVudD4oYm9hcmQsIHt9LCB7IGNhbGxiYWNrIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFNoYXBlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBzaGFwZTogTWluZEVsZW1lbnRTaGFwZSkgPT4ge1xuICAgIFByb3BlcnR5VHJhbnNmb3Jtcy5zZXRQcm9wZXJ0eShib2FyZCwgeyBzaGFwZSB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRCcmFuY2hTaGFwZSA9IChib2FyZDogUGxhaXRCb2FyZCwgYnJhbmNoU2hhcGU6IEJyYW5jaFNoYXBlKSA9PiB7XG4gICAgUHJvcGVydHlUcmFuc2Zvcm1zLnNldFByb3BlcnR5KGJvYXJkLCB7IGJyYW5jaFNoYXBlIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEJyYW5jaFdpZHRoID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBicmFuY2hXaWR0aDogbnVtYmVyKSA9PiB7XG4gICAgUHJvcGVydHlUcmFuc2Zvcm1zLnNldFByb3BlcnR5KGJvYXJkLCB7IGJyYW5jaFdpZHRoIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEJyYW5jaENvbG9yID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBicmFuY2hDb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgUHJvcGVydHlUcmFuc2Zvcm1zLnNldFByb3BlcnR5KGJvYXJkLCB7IGJyYW5jaENvbG9yIH0pO1xufTtcbiJdfQ==
@@ -1,170 +0,0 @@
1
- import { AbstractNode } from '@plait/layouts';
2
- import { MindElement, PlaitMind } from '../../interfaces/element';
3
- import { Path, PlaitElement, PlaitNode } from '@plait/core';
4
- export const separateChildren = (parentElement) => {
5
- const rightNodeCount = parentElement.rightNodeCount;
6
- const children = parentElement.children;
7
- let rightChildren = [], leftChildren = [];
8
- for (let i = 0; i < children.length; i++) {
9
- const child = children[i];
10
- if (AbstractNode.isAbstract(child) && child.end < rightNodeCount) {
11
- rightChildren.push(child);
12
- continue;
13
- }
14
- if (AbstractNode.isAbstract(child) && child.start >= rightNodeCount) {
15
- leftChildren.push(child);
16
- continue;
17
- }
18
- if (i < rightNodeCount) {
19
- rightChildren.push(child);
20
- }
21
- else {
22
- leftChildren.push(child);
23
- }
24
- }
25
- return { leftChildren, rightChildren };
26
- };
27
- export const isSetAbstract = (element) => {
28
- return !!getCorrespondingAbstract(element);
29
- };
30
- export const canSetAbstract = (element) => {
31
- return !PlaitElement.isRootElement(element) && !AbstractNode.isAbstract(element) && !isSetAbstract(element);
32
- };
33
- export const getCorrespondingAbstract = (element) => {
34
- const parent = MindElement.findParent(element);
35
- if (!parent)
36
- return undefined;
37
- const elementIndex = parent.children.indexOf(element);
38
- return parent.children.find(child => {
39
- return AbstractNode.isAbstract(child) && elementIndex >= child.start && elementIndex <= child.end;
40
- });
41
- };
42
- export const getBehindAbstracts = (element) => {
43
- const parent = MindElement.findParent(element);
44
- if (!parent)
45
- return [];
46
- const index = parent.children.indexOf(element);
47
- return parent.children.filter(child => AbstractNode.isAbstract(child) && child.start > index);
48
- };
49
- /**
50
- * return corresponding abstract that is not child of elements
51
- */
52
- export const getOverallAbstracts = (board, elements) => {
53
- const overallAbstracts = [];
54
- elements
55
- .filter(value => !AbstractNode.isAbstract(value) && !PlaitMind.isMind(value))
56
- .forEach(value => {
57
- const abstract = getCorrespondingAbstract(value);
58
- if (abstract && elements.indexOf(abstract) === -1 && overallAbstracts.indexOf(abstract) === -1) {
59
- const { start, end } = abstract;
60
- const parent = MindElement.getParent(value);
61
- const isOverall = parent.children.slice(start, end + 1).every(includedElement => elements.indexOf(includedElement) > -1);
62
- if (isOverall) {
63
- overallAbstracts.push(abstract);
64
- }
65
- }
66
- });
67
- return overallAbstracts;
68
- };
69
- /**
70
- * abstract node is valid when elements contains at least one element it is referenced with
71
- */
72
- export const getValidAbstractRefs = (board, elements) => {
73
- const validAbstractRefs = [];
74
- elements
75
- .filter(value => !AbstractNode.isAbstract(value) && !PlaitMind.isMind(value))
76
- .forEach(value => {
77
- const abstract = getCorrespondingAbstract(value);
78
- if (abstract && elements.indexOf(abstract) > 0) {
79
- const index = validAbstractRefs.findIndex(value => value.abstract === abstract);
80
- if (index === -1) {
81
- validAbstractRefs.push({
82
- abstract: abstract,
83
- references: [value]
84
- });
85
- }
86
- else {
87
- validAbstractRefs[index].references.push(value);
88
- }
89
- }
90
- });
91
- return validAbstractRefs;
92
- };
93
- export function getRelativeStartEndByAbstractRef(abstractRef, elements) {
94
- const start = elements.indexOf(abstractRef.references[0]);
95
- const end = elements.indexOf(abstractRef.references[abstractRef.references.length - 1]);
96
- return { start, end };
97
- }
98
- export const insertElementHandleAbstract = (board, path, step = 1,
99
- // This distinguishes between dragging and adding to the last node summarized in the abstract node
100
- isExtendPreviousNode = true, effectedAbstracts = new Map()) => {
101
- const parent = PlaitNode.parent(board, path);
102
- const hasPreviousNode = path[path.length - 1] !== 0;
103
- let behindAbstracts;
104
- if (!hasPreviousNode) {
105
- behindAbstracts = parent.children.filter(child => AbstractNode.isAbstract(child));
106
- }
107
- else {
108
- const selectedElement = PlaitNode.get(board, Path.previous(path));
109
- behindAbstracts = getBehindAbstracts(selectedElement);
110
- }
111
- if (behindAbstracts.length) {
112
- behindAbstracts.forEach(abstract => {
113
- let newProperties = effectedAbstracts.get(abstract);
114
- if (!newProperties) {
115
- newProperties = { start: 0, end: 0 };
116
- effectedAbstracts.set(abstract, newProperties);
117
- }
118
- newProperties.start = newProperties.start + step;
119
- newProperties.end = newProperties.end + step;
120
- });
121
- }
122
- if (!hasPreviousNode) {
123
- return effectedAbstracts;
124
- }
125
- const selectedElement = PlaitNode.get(board, Path.previous(path));
126
- const correspondingAbstract = getCorrespondingAbstract(selectedElement);
127
- const isDragToLast = !isExtendPreviousNode && correspondingAbstract && correspondingAbstract.end === path[path.length - 1] - 1;
128
- if (correspondingAbstract && !isDragToLast) {
129
- let newProperties = effectedAbstracts.get(correspondingAbstract);
130
- if (!newProperties) {
131
- newProperties = { start: 0, end: 0 };
132
- effectedAbstracts.set(correspondingAbstract, newProperties);
133
- }
134
- newProperties.end = newProperties.end + step;
135
- }
136
- return effectedAbstracts;
137
- };
138
- export const deleteElementHandleAbstract = (board, deletableElements, effectedAbstracts = new Map()) => {
139
- deletableElements.forEach(node => {
140
- if (!PlaitMind.isMind(node)) {
141
- const behindAbstracts = getBehindAbstracts(node).filter(abstract => !deletableElements.includes(abstract));
142
- if (behindAbstracts.length) {
143
- behindAbstracts.forEach(abstract => {
144
- let newProperties = effectedAbstracts.get(abstract);
145
- if (!newProperties) {
146
- newProperties = { start: 0, end: 0 };
147
- effectedAbstracts.set(abstract, newProperties);
148
- }
149
- newProperties.start = newProperties.start - 1;
150
- newProperties.end = newProperties.end - 1;
151
- });
152
- }
153
- const correspondingAbstract = getCorrespondingAbstract(node);
154
- if (correspondingAbstract && !deletableElements.includes(correspondingAbstract)) {
155
- let newProperties = effectedAbstracts.get(correspondingAbstract);
156
- if (!newProperties) {
157
- newProperties = { start: 0, end: 0 };
158
- effectedAbstracts.set(correspondingAbstract, newProperties);
159
- }
160
- newProperties.end = newProperties.end - 1;
161
- }
162
- }
163
- });
164
- return effectedAbstracts;
165
- };
166
- export const isChildOfAbstract = (board, element) => {
167
- const ancestors = MindElement.getAncestors(board, element);
168
- return !!ancestors.find(value => AbstractNode.isAbstract(value));
169
- };
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvdXRpbHMvYWJzdHJhY3QvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQWMsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLGFBQTBCLEVBQUUsRUFBRTtJQUMzRCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsY0FBZSxDQUFDO0lBQ3JELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDeEMsSUFBSSxhQUFhLEdBQUcsRUFBRSxFQUNsQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQy9ELGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsU0FBUztRQUNiLENBQUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNsRSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLFNBQVM7UUFDYixD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QUFvQixFQUFFLEVBQUU7SUFDekUsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFrQixDQUFDO0lBQzVFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3ROb2RlIH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQYXRoLCBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFBsYWl0Tm9kZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcblxuZXhwb3J0IGNvbnN0IHNlcGFyYXRlQ2hpbGRyZW4gPSAocGFyZW50RWxlbWVudDogTWluZEVsZW1lbnQpID0+IHtcbiAgICBjb25zdCByaWdodE5vZGVDb3VudCA9IHBhcmVudEVsZW1lbnQucmlnaHROb2RlQ291bnQhO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50RWxlbWVudC5jaGlsZHJlbjtcbiAgICBsZXQgcmlnaHRDaGlsZHJlbiA9IFtdLFxuICAgICAgICBsZWZ0Q2hpbGRyZW4gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKEFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KGNoaWxkKSAmJiBjaGlsZC5lbmQgPCByaWdodE5vZGVDb3VudCkge1xuICAgICAgICAgICAgcmlnaHRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdChjaGlsZCkgJiYgY2hpbGQuc3RhcnQgPj0gcmlnaHROb2RlQ291bnQpIHtcbiAgICAgICAgICAgIGxlZnRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkgPCByaWdodE5vZGVDb3VudCkge1xuICAgICAgICAgICAgcmlnaHRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxlZnRDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGxlZnRDaGlsZHJlbiwgcmlnaHRDaGlsZHJlbiB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzU2V0QWJzdHJhY3QgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgcmV0dXJuICEhZ2V0Q29ycmVzcG9uZGluZ0Fic3RyYWN0KGVsZW1lbnQgYXMgTWluZEVsZW1lbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhblNldEFic3RyYWN0ID0gKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgIHJldHVybiAhUGxhaXRFbGVtZW50LmlzUm9vdEVsZW1lbnQoZWxlbWVudCkgJiYgIUFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KGVsZW1lbnQpICYmICFpc1NldEFic3RyYWN0KGVsZW1lbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdCA9IChlbGVtZW50OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IE1pbmRFbGVtZW50LmZpbmRQYXJlbnQoZWxlbWVudCBhcyBNaW5kRWxlbWVudCk7XG4gICAgaWYgKCFwYXJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50KTtcbiAgICByZXR1cm4gcGFyZW50LmNoaWxkcmVuLmZpbmQoY2hpbGQgPT4ge1xuICAgICAgICByZXR1cm4gQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoY2hpbGQpICYmIGVsZW1lbnRJbmRleCA+PSBjaGlsZC5zdGFydCEgJiYgZWxlbWVudEluZGV4IDw9IGNoaWxkLmVuZCE7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmVoaW5kQWJzdHJhY3RzID0gKGVsZW1lbnQ6IE1pbmRFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgcGFyZW50ID0gTWluZEVsZW1lbnQuZmluZFBhcmVudChlbGVtZW50IGFzIE1pbmRFbGVtZW50KTtcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZWxlbWVudCk7XG4gICAgcmV0dXJuIHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoY2hpbGQpICYmIGNoaWxkLnN0YXJ0ISA+IGluZGV4KTtcbn07XG5cbi8qKlxuICogcmV0dXJuIGNvcnJlc3BvbmRpbmcgYWJzdHJhY3QgdGhhdCBpcyBub3QgY2hpbGQgb2YgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE92ZXJhbGxBYnN0cmFjdHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnRzOiBNaW5kRWxlbWVudFtdKSA9PiB7XG4gICAgY29uc3Qgb3ZlcmFsbEFic3RyYWN0czogTWluZEVsZW1lbnRbXSA9IFtdO1xuICAgIGVsZW1lbnRzXG4gICAgICAgIC5maWx0ZXIodmFsdWUgPT4gIUFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KHZhbHVlKSAmJiAhUGxhaXRNaW5kLmlzTWluZCh2YWx1ZSkpXG4gICAgICAgIC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFic3RyYWN0ID0gZ2V0Q29ycmVzcG9uZGluZ0Fic3RyYWN0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChhYnN0cmFjdCAmJiBlbGVtZW50cy5pbmRleE9mKGFic3RyYWN0KSA9PT0gLTEgJiYgb3ZlcmFsbEFic3RyYWN0cy5pbmRleE9mKGFic3RyYWN0KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGFic3RyYWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IE1pbmRFbGVtZW50LmdldFBhcmVudCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdmVyYWxsID0gcGFyZW50LmNoaWxkcmVuLnNsaWNlKHN0YXJ0ISwgZW5kISArIDEpLmV2ZXJ5KGluY2x1ZGVkRWxlbWVudCA9PiBlbGVtZW50cy5pbmRleE9mKGluY2x1ZGVkRWxlbWVudCkgPiAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzT3ZlcmFsbCkge1xuICAgICAgICAgICAgICAgICAgICBvdmVyYWxsQWJzdHJhY3RzLnB1c2goYWJzdHJhY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIG92ZXJhbGxBYnN0cmFjdHMgYXMgKE1pbmRFbGVtZW50ICYgQWJzdHJhY3ROb2RlKVtdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdFJlZiB7XG4gICAgYWJzdHJhY3Q6IE1pbmRFbGVtZW50ICYgQWJzdHJhY3ROb2RlO1xuICAgIHJlZmVyZW5jZXM6IE1pbmRFbGVtZW50W107XG59XG5cbi8qKlxuICogYWJzdHJhY3Qgbm9kZSBpcyB2YWxpZCB3aGVuIGVsZW1lbnRzIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IGl0IGlzIHJlZmVyZW5jZWQgd2l0aFxuICovXG5leHBvcnQgY29uc3QgZ2V0VmFsaWRBYnN0cmFjdFJlZnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnRzOiBNaW5kRWxlbWVudFtdKSA9PiB7XG4gICAgY29uc3QgdmFsaWRBYnN0cmFjdFJlZnM6IEFic3RyYWN0UmVmW10gPSBbXTtcbiAgICBlbGVtZW50c1xuICAgICAgICAuZmlsdGVyKHZhbHVlID0+ICFBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdCh2YWx1ZSkgJiYgIVBsYWl0TWluZC5pc01pbmQodmFsdWUpKVxuICAgICAgICAuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhYnN0cmFjdCA9IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoYWJzdHJhY3QgJiYgZWxlbWVudHMuaW5kZXhPZihhYnN0cmFjdCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB2YWxpZEFic3RyYWN0UmVmcy5maW5kSW5kZXgodmFsdWUgPT4gdmFsdWUuYWJzdHJhY3QgPT09IGFic3RyYWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkQWJzdHJhY3RSZWZzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3Q6IGFic3RyYWN0IGFzIE1pbmRFbGVtZW50ICYgQWJzdHJhY3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlczogW3ZhbHVlXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZEFic3RyYWN0UmVmc1tpbmRleF0ucmVmZXJlbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIHJldHVybiB2YWxpZEFic3RyYWN0UmVmcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWxhdGl2ZVN0YXJ0RW5kQnlBYnN0cmFjdFJlZihhYnN0cmFjdFJlZjogQWJzdHJhY3RSZWYsIGVsZW1lbnRzOiBNaW5kRWxlbWVudFtdKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBlbGVtZW50cy5pbmRleE9mKGFic3RyYWN0UmVmLnJlZmVyZW5jZXNbMF0pO1xuICAgIGNvbnN0IGVuZCA9IGVsZW1lbnRzLmluZGV4T2YoYWJzdHJhY3RSZWYucmVmZXJlbmNlc1thYnN0cmFjdFJlZi5yZWZlcmVuY2VzLmxlbmd0aCAtIDFdKTtcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG59XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRFbGVtZW50SGFuZGxlQWJzdHJhY3QgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgcGF0aDogUGF0aCxcbiAgICBzdGVwID0gMSxcbiAgICAvLyBUaGlzIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBkcmFnZ2luZyBhbmQgYWRkaW5nIHRvIHRoZSBsYXN0IG5vZGUgc3VtbWFyaXplZCBpbiB0aGUgYWJzdHJhY3Qgbm9kZVxuICAgIGlzRXh0ZW5kUHJldmlvdXNOb2RlOiBib29sZWFuID0gdHJ1ZSxcbiAgICBlZmZlY3RlZEFic3RyYWN0cyA9IG5ldyBNYXA8TWluZEVsZW1lbnQsIFBpY2s8QWJzdHJhY3ROb2RlLCAnc3RhcnQnIHwgJ2VuZCc+PigpXG4pID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBQbGFpdE5vZGUucGFyZW50KGJvYXJkLCBwYXRoKSBhcyBNaW5kRWxlbWVudDtcbiAgICBjb25zdCBoYXNQcmV2aW91c05vZGUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gIT09IDA7XG4gICAgbGV0IGJlaGluZEFic3RyYWN0czogTWluZEVsZW1lbnRbXTtcblxuICAgIGlmICghaGFzUHJldmlvdXNOb2RlKSB7XG4gICAgICAgIGJlaGluZEFic3RyYWN0cyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gQWJzdHJhY3ROb2RlLmlzQWJzdHJhY3QoY2hpbGQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBQbGFpdE5vZGUuZ2V0KGJvYXJkLCBQYXRoLnByZXZpb3VzKHBhdGgpKSBhcyBNaW5kRWxlbWVudDtcbiAgICAgICAgYmVoaW5kQWJzdHJhY3RzID0gZ2V0QmVoaW5kQWJzdHJhY3RzKHNlbGVjdGVkRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKGJlaGluZEFic3RyYWN0cy5sZW5ndGgpIHtcbiAgICAgICAgYmVoaW5kQWJzdHJhY3RzLmZvckVhY2goYWJzdHJhY3QgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld1Byb3BlcnRpZXMgPSBlZmZlY3RlZEFic3RyYWN0cy5nZXQoYWJzdHJhY3QpO1xuICAgICAgICAgICAgaWYgKCFuZXdQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcyA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgICAgICAgICAgIGVmZmVjdGVkQWJzdHJhY3RzLnNldChhYnN0cmFjdCwgbmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLnN0YXJ0ID0gbmV3UHJvcGVydGllcy5zdGFydCArIHN0ZXA7XG4gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmVuZCA9IG5ld1Byb3BlcnRpZXMuZW5kICsgc3RlcDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNQcmV2aW91c05vZGUpIHtcbiAgICAgICAgcmV0dXJuIGVmZmVjdGVkQWJzdHJhY3RzO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IFBsYWl0Tm9kZS5nZXQoYm9hcmQsIFBhdGgucHJldmlvdXMocGF0aCkpIGFzIE1pbmRFbGVtZW50O1xuICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdBYnN0cmFjdCA9IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdChzZWxlY3RlZEVsZW1lbnQpO1xuICAgIGNvbnN0IGlzRHJhZ1RvTGFzdCA9ICFpc0V4dGVuZFByZXZpb3VzTm9kZSAmJiBjb3JyZXNwb25kaW5nQWJzdHJhY3QgJiYgY29ycmVzcG9uZGluZ0Fic3RyYWN0LmVuZCA9PT0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdIC0gMTtcblxuICAgIGlmIChjb3JyZXNwb25kaW5nQWJzdHJhY3QgJiYgIWlzRHJhZ1RvTGFzdCkge1xuICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGVmZmVjdGVkQWJzdHJhY3RzLmdldChjb3JyZXNwb25kaW5nQWJzdHJhY3QpO1xuICAgICAgICBpZiAoIW5ld1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcbiAgICAgICAgICAgIGVmZmVjdGVkQWJzdHJhY3RzLnNldChjb3JyZXNwb25kaW5nQWJzdHJhY3QsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIG5ld1Byb3BlcnRpZXMuZW5kID0gbmV3UHJvcGVydGllcy5lbmQgKyBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiBlZmZlY3RlZEFic3RyYWN0cztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVFbGVtZW50SGFuZGxlQWJzdHJhY3QgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZGVsZXRhYmxlRWxlbWVudHM6IE1pbmRFbGVtZW50W10sXG4gICAgZWZmZWN0ZWRBYnN0cmFjdHMgPSBuZXcgTWFwPE1pbmRFbGVtZW50LCBQaWNrPEFic3RyYWN0Tm9kZSwgJ3N0YXJ0JyB8ICdlbmQnPj4oKVxuKSA9PiB7XG4gICAgZGVsZXRhYmxlRWxlbWVudHMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgaWYgKCFQbGFpdE1pbmQuaXNNaW5kKG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBiZWhpbmRBYnN0cmFjdHMgPSBnZXRCZWhpbmRBYnN0cmFjdHMobm9kZSkuZmlsdGVyKGFic3RyYWN0ID0+ICFkZWxldGFibGVFbGVtZW50cy5pbmNsdWRlcyhhYnN0cmFjdCkpO1xuICAgICAgICAgICAgaWYgKGJlaGluZEFic3RyYWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBiZWhpbmRBYnN0cmFjdHMuZm9yRWFjaChhYnN0cmFjdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9wZXJ0aWVzID0gZWZmZWN0ZWRBYnN0cmFjdHMuZ2V0KGFic3RyYWN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RlZEFic3RyYWN0cy5zZXQoYWJzdHJhY3QsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuc3RhcnQgPSBuZXdQcm9wZXJ0aWVzLnN0YXJ0IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcy5lbmQgPSBuZXdQcm9wZXJ0aWVzLmVuZCAtIDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdBYnN0cmFjdCA9IGdldENvcnJlc3BvbmRpbmdBYnN0cmFjdChub2RlKTtcbiAgICAgICAgICAgIGlmIChjb3JyZXNwb25kaW5nQWJzdHJhY3QgJiYgIWRlbGV0YWJsZUVsZW1lbnRzLmluY2x1ZGVzKGNvcnJlc3BvbmRpbmdBYnN0cmFjdCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGVmZmVjdGVkQWJzdHJhY3RzLmdldChjb3JyZXNwb25kaW5nQWJzdHJhY3QpO1xuICAgICAgICAgICAgICAgIGlmICghbmV3UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0ZWRBYnN0cmFjdHMuc2V0KGNvcnJlc3BvbmRpbmdBYnN0cmFjdCwgbmV3UHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuZW5kID0gbmV3UHJvcGVydGllcy5lbmQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVmZmVjdGVkQWJzdHJhY3RzO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ2hpbGRPZkFic3RyYWN0ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IE1pbmRFbGVtZW50LmdldEFuY2VzdG9ycyhib2FyZCwgZWxlbWVudCkgYXMgTWluZEVsZW1lbnRbXTtcbiAgICByZXR1cm4gISFhbmNlc3RvcnMuZmluZCh2YWx1ZSA9PiBBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdCh2YWx1ZSkpO1xufTtcbiJdfQ==