@plait/mind 0.27.0-next.3 → 0.27.0-next.5
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/base/emoji-base.component.d.ts +1 -1
- package/esm2022/base/emoji-base.component.mjs +5 -5
- package/esm2022/interfaces/element.mjs +1 -1
- package/esm2022/interfaces/options.mjs +1 -1
- package/esm2022/mind-node.component.mjs +234 -0
- package/esm2022/mind.component.mjs +2 -2
- package/esm2022/mind.module.mjs +2 -2
- package/esm2022/plugins/with-mind-fragment.mjs +90 -0
- package/esm2022/plugins/with-mind-hotkey.mjs +13 -55
- package/esm2022/plugins/with-mind.mjs +7 -36
- package/esm2022/plugins/with-node-dnd.mjs +3 -3
- package/esm2022/plugins/with-node-resize.mjs +2 -2
- package/esm2022/public-api.mjs +2 -2
- package/esm2022/transforms/index.mjs +2 -3
- package/esm2022/transforms/node.mjs +2 -18
- package/esm2022/utils/abstract/resize.mjs +1 -1
- package/esm2022/utils/dnd/common.mjs +1 -1
- package/esm2022/utils/draw/node-dnd.mjs +1 -1
- package/esm2022/utils/node/common.mjs +1 -1
- package/esm2022/utils/node/dynamic-width.mjs +2 -5
- package/esm2022/utils/node/image.mjs +1 -1
- package/esm2022/utils/position/topic.mjs +2 -3
- package/fesm2022/plait-mind.mjs +208 -234
- package/fesm2022/plait-mind.mjs.map +1 -1
- package/interfaces/options.d.ts +0 -2
- package/mind.component.d.ts +1 -1
- package/mind.module.d.ts +1 -1
- package/package.json +1 -1
- package/plugins/with-mind-fragment.d.ts +5 -0
- package/plugins/with-mind-hotkey.d.ts +0 -2
- package/public-api.d.ts +1 -1
- package/styles/styles.scss +0 -3
- package/transforms/index.d.ts +0 -1
- package/transforms/node.d.ts +0 -1
- package/esm2022/node.component.mjs +0 -251
- /package/{node.component.d.ts → mind-node.component.d.ts} +0 -0
package/interfaces/options.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { ComponentType, WithPluginOptions } from '@plait/core';
|
|
2
|
-
import { TextPlugin } from '@plait/text';
|
|
3
2
|
import { MindImageBaseComponent } from '../base';
|
|
4
3
|
export interface WithMindOptions extends WithPluginOptions {
|
|
5
4
|
emojiPadding: number;
|
|
6
5
|
spaceBetweenEmojis: number;
|
|
7
|
-
textPlugins?: TextPlugin[];
|
|
8
6
|
imageComponentType?: ComponentType<MindImageBaseComponent>;
|
|
9
7
|
}
|
package/mind.component.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { OnInit } from '@angular/core';
|
|
|
2
2
|
import { PlaitMind } from './interfaces/element';
|
|
3
3
|
import { MindNode } from './interfaces/node';
|
|
4
4
|
import { BeforeContextChange, PlaitPluginElementContext } from '@plait/core';
|
|
5
|
-
import { MindNodeComponent } from './node.component';
|
|
5
|
+
import { MindNodeComponent } from './mind-node.component';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class PlaitMindComponent extends MindNodeComponent implements OnInit, BeforeContextChange<PlaitMind> {
|
|
8
8
|
root: MindNode;
|
package/mind.module.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
import * as i1 from "./mind.component";
|
|
3
|
-
import * as i2 from "./node.component";
|
|
3
|
+
import * as i2 from "./mind-node.component";
|
|
4
4
|
import * as i3 from "@angular/common";
|
|
5
5
|
import * as i4 from "@plait/text";
|
|
6
6
|
import * as i5 from "@plait/core";
|
package/package.json
CHANGED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PlaitBoard } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../interfaces';
|
|
3
|
+
import { PlaitMindBoard } from './with-mind.board';
|
|
4
|
+
export declare const withMindFragment: (baseBoard: PlaitBoard) => PlaitBoard & PlaitMindBoard;
|
|
5
|
+
export declare const getNextSelectedElement: (board: PlaitBoard, firstLevelElements: MindElement[]) => MindElement<import("../interfaces").BaseData> | undefined;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
|
-
import { MindElement } from '../interfaces';
|
|
3
2
|
import { PlaitMindBoard } from './with-mind.board';
|
|
4
3
|
export declare const withMindHotkey: (baseBoard: PlaitBoard) => PlaitBoard & PlaitMindBoard;
|
|
5
|
-
export declare const getNextSelectedElement: (board: PlaitBoard, firstLevelElements: MindElement[]) => MindElement<import("../interfaces").BaseData> | undefined;
|
package/public-api.d.ts
CHANGED
package/styles/styles.scss
CHANGED
package/transforms/index.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ export declare const MindTransforms: {
|
|
|
9
9
|
insertAbstract: (board: import("@plait/core").PlaitBoard, elements: import("@plait/core").PlaitElement[]) => void;
|
|
10
10
|
setAbstractsByRefs: (board: import("@plait/core").PlaitBoard, abstractRefs: import("@plait/mind").AbstractRefs) => void;
|
|
11
11
|
setAbstractByStandardLayout: (board: import("@plait/core").PlaitBoard, element: import("@plait/mind").MindElement<import("@plait/mind").BaseData>) => void;
|
|
12
|
-
removeElements: (board: import("@plait/core").PlaitBoard, elements: import("@plait/mind").MindElement<import("@plait/mind").BaseData>[]) => void;
|
|
13
12
|
insertNodes: (board: import("@plait/core").PlaitBoard, elements: import("@plait/mind").MindElement<import("@plait/mind").BaseData>[], path: import("slate").Path) => void;
|
|
14
13
|
insertAbstractNodes: (board: import("@plait/core").PlaitBoard, validAbstractRefs: import("@plait/mind").AbstractRef[], elements: import("@plait/mind").MindElement<import("@plait/mind").BaseData>[], path: import("slate").Path) => void;
|
|
15
14
|
setRightNodeCountByRefs: (board: import("@plait/core").PlaitBoard, refs: import("@plait/mind").RightNodeCountRef[]) => void;
|
package/transforms/node.d.ts
CHANGED
|
@@ -7,7 +7,6 @@ import { PlaitMindBoard } from '../plugins/with-mind.board';
|
|
|
7
7
|
export declare const setTopic: (board: PlaitMindBoard, element: MindElement, topic: Element, width: number, height: number) => void;
|
|
8
8
|
export declare const setNodeManualWidth: (board: PlaitMindBoard, element: MindElement, width: number, height: number) => void;
|
|
9
9
|
export declare const setTopicSize: (board: PlaitMindBoard, element: MindElement, width: number, height: number) => void;
|
|
10
|
-
export declare const removeElements: (board: PlaitBoard, elements: MindElement[]) => void;
|
|
11
10
|
export declare const insertNodes: (board: PlaitBoard, elements: MindElement[], path: Path) => void;
|
|
12
11
|
export declare const insertAbstractNodes: (board: PlaitBoard, validAbstractRefs: AbstractRef[], elements: MindElement[], path: Path) => void;
|
|
13
12
|
export declare const setRightNodeCountByRefs: (board: PlaitBoard, refs: RightNodeCountRef[]) => void;
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
-
import { createG, PlaitBoard, PlaitPluginElementComponent, PlaitElement, NODE_TO_INDEX, RectangleClient } from '@plait/core';
|
|
3
|
-
import { isHorizontalLayout, AbstractNode } from '@plait/layouts';
|
|
4
|
-
import { TextManage, ExitOrigin } from '@plait/text';
|
|
5
|
-
import { Subject } from 'rxjs';
|
|
6
|
-
import { drawRoundRectangleByNode } from './utils/draw/node-shape';
|
|
7
|
-
import { MindElement, PlaitMind } from './interfaces/element';
|
|
8
|
-
import { MindQueries } from './queries';
|
|
9
|
-
import { getShapeByElement } from './utils/node-style/shape';
|
|
10
|
-
import { ELEMENT_TO_NODE } from './utils/weak-maps';
|
|
11
|
-
import { drawAbstractLink } from './utils/draw/node-link/abstract-link';
|
|
12
|
-
import { NodeEmojisDrawer } from './drawer/node-emojis.drawer';
|
|
13
|
-
import { MindTransforms } from './transforms';
|
|
14
|
-
import { MindElementShape } from './interfaces';
|
|
15
|
-
import { NodeInsertDrawer } from './drawer/node-insert.drawer';
|
|
16
|
-
import { drawLink } from './utils/draw/node-link/draw-link';
|
|
17
|
-
import { getTopicRectangleByNode } from './utils/position/topic';
|
|
18
|
-
import { NodeActiveDrawer } from './drawer/node-active.drawer';
|
|
19
|
-
import { CollapseDrawer } from './drawer/node-collapse.drawer';
|
|
20
|
-
import { WithMindPluginKey } from './constants/default';
|
|
21
|
-
import { NodeImageDrawer } from './drawer/node-image.drawer';
|
|
22
|
-
import { NodeSpace } from './utils/space/node-space';
|
|
23
|
-
import { NodeTopicThreshold, ROOT_TOPIC_FONT_SIZE, TOPIC_DEFAULT_MAX_WORD_COUNT, TOPIC_FONT_SIZE } from './constants/node-topic-style';
|
|
24
|
-
import * as i0 from "@angular/core";
|
|
25
|
-
import * as i1 from "@angular/common";
|
|
26
|
-
import * as i2 from "@plait/core";
|
|
27
|
-
// 1. When the text at the end has an italic attribute, the text is partially covered
|
|
28
|
-
// 2. There will be some differences in the width measured by different browsers
|
|
29
|
-
const WIDTH_BUFFER = 4;
|
|
30
|
-
export class MindNodeComponent extends PlaitPluginElementComponent {
|
|
31
|
-
constructor(viewContainerRef, cdr) {
|
|
32
|
-
super(cdr);
|
|
33
|
-
this.viewContainerRef = viewContainerRef;
|
|
34
|
-
this.cdr = cdr;
|
|
35
|
-
this.shapeG = null;
|
|
36
|
-
this.destroy$ = new Subject();
|
|
37
|
-
this.trackBy = (index, node) => {
|
|
38
|
-
return node.origin.id;
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
initializeDrawer() {
|
|
42
|
-
this.nodeEmojisDrawer = new NodeEmojisDrawer(this.board, this.viewContainerRef);
|
|
43
|
-
this.nodeInsertDrawer = new NodeInsertDrawer(this.board);
|
|
44
|
-
this.activeDrawer = new NodeActiveDrawer(this.board);
|
|
45
|
-
this.collapseDrawer = new CollapseDrawer(this.board);
|
|
46
|
-
this.imageDrawer = new NodeImageDrawer(this.board, this.viewContainerRef);
|
|
47
|
-
const plugins = this.board.getPluginOptions(WithMindPluginKey).textPlugins;
|
|
48
|
-
this.textManage = new TextManage(this.board, this.viewContainerRef, {
|
|
49
|
-
getRectangle: () => {
|
|
50
|
-
const rect = getTopicRectangleByNode(this.board, this.node);
|
|
51
|
-
return rect;
|
|
52
|
-
},
|
|
53
|
-
onValueChangeHandle: (textManageRef) => {
|
|
54
|
-
const width = textManageRef.width;
|
|
55
|
-
const height = textManageRef.height;
|
|
56
|
-
if (textManageRef.newValue) {
|
|
57
|
-
MindTransforms.setTopic(this.board, this.element, textManageRef.newValue, width, height);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
MindTransforms.setTopicSize(this.board, this.element, width, height);
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
textPlugins: plugins,
|
|
64
|
-
getMaxWidth: () => {
|
|
65
|
-
return NodeTopicThreshold.defaultTextMaxWidth;
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
ngOnInit() {
|
|
70
|
-
super.ngOnInit();
|
|
71
|
-
this.initializeDrawer();
|
|
72
|
-
this.node = MindElement.getNode(this.element);
|
|
73
|
-
this.index = NODE_TO_INDEX.get(this.element) || 0;
|
|
74
|
-
this.roughSVG = PlaitBoard.getRoughSVG(this.board);
|
|
75
|
-
this.parentG = PlaitElement.getComponent(MindElement.getRoot(this.board, this.element)).rootG;
|
|
76
|
-
this.drawShape();
|
|
77
|
-
this.drawLink();
|
|
78
|
-
this.drawTopic();
|
|
79
|
-
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: this.textManage.isEditing });
|
|
80
|
-
this.drawEmojis();
|
|
81
|
-
this.drawExtend();
|
|
82
|
-
this.imageDrawer.drawImage(this.g, this.element);
|
|
83
|
-
if (PlaitMind.isMind(this.context.parent)) {
|
|
84
|
-
this.g.classList.add('branch');
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
onContextChanged(value, previous) {
|
|
88
|
-
const newNode = MindElement.getNode(value.element);
|
|
89
|
-
const isEqualNode = RectangleClient.isEqual(this.node, newNode);
|
|
90
|
-
this.node = newNode;
|
|
91
|
-
const isChangeTheme = this.board.operations.find(op => op.type === 'set_theme');
|
|
92
|
-
if (!isEqualNode || value.element !== previous.element || isChangeTheme) {
|
|
93
|
-
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: this.textManage.isEditing });
|
|
94
|
-
this.drawShape();
|
|
95
|
-
this.drawLink();
|
|
96
|
-
this.drawEmojis();
|
|
97
|
-
this.drawExtend();
|
|
98
|
-
this.imageDrawer.updateImage(this.g, previous.element, value.element);
|
|
99
|
-
this.updateTopic();
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const hasSameSelected = value.selected === previous.selected;
|
|
103
|
-
const hasSameParent = value.parent === previous.parent;
|
|
104
|
-
if (!hasSameSelected) {
|
|
105
|
-
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: this.textManage.isEditing });
|
|
106
|
-
}
|
|
107
|
-
if (!hasSameParent) {
|
|
108
|
-
this.drawLink();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
drawEmojis() {
|
|
113
|
-
const g = this.nodeEmojisDrawer.drawEmojis(this.element);
|
|
114
|
-
if (g) {
|
|
115
|
-
this.g.append(g);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
drawShape() {
|
|
119
|
-
this.destroyShape();
|
|
120
|
-
const shape = getShapeByElement(this.board, this.node.origin);
|
|
121
|
-
switch (shape) {
|
|
122
|
-
case MindElementShape.roundRectangle:
|
|
123
|
-
this.shapeG = drawRoundRectangleByNode(this.board, this.node);
|
|
124
|
-
this.g.prepend(this.shapeG);
|
|
125
|
-
break;
|
|
126
|
-
default:
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
destroyShape() {
|
|
131
|
-
if (this.shapeG) {
|
|
132
|
-
this.shapeG.remove();
|
|
133
|
-
this.shapeG = null;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
drawLink() {
|
|
137
|
-
if (PlaitMind.isMind(this.element)) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
const parent = MindElement.getParent(this.element);
|
|
141
|
-
const parentNode = MindElement.getNode(parent);
|
|
142
|
-
if (this.linkG) {
|
|
143
|
-
this.linkG.remove();
|
|
144
|
-
}
|
|
145
|
-
const layout = MindQueries.getLayoutByElement(parent);
|
|
146
|
-
if (AbstractNode.isAbstract(this.node.origin)) {
|
|
147
|
-
this.linkG = drawAbstractLink(this.board, this.node, isHorizontalLayout(layout));
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
this.linkG = drawLink(this.board, parentNode, this.node, isHorizontalLayout(layout));
|
|
151
|
-
}
|
|
152
|
-
this.g.append(this.linkG);
|
|
153
|
-
}
|
|
154
|
-
destroyLine() {
|
|
155
|
-
if (this.linkG) {
|
|
156
|
-
this.linkG.remove();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
drawExtend() {
|
|
160
|
-
this.destroyExtend();
|
|
161
|
-
this.extendG = createG();
|
|
162
|
-
this.extendG.classList.add('extend');
|
|
163
|
-
this.g.append(this.extendG);
|
|
164
|
-
if (this.element.isCollapsed) {
|
|
165
|
-
this.g.classList.add('collapsed');
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
this.g.classList.remove('collapsed');
|
|
169
|
-
}
|
|
170
|
-
this.nodeInsertDrawer.draw(this.element, this.extendG);
|
|
171
|
-
this.collapseDrawer.draw(this.element, this.extendG);
|
|
172
|
-
}
|
|
173
|
-
destroyExtend() {
|
|
174
|
-
if (this.extendG) {
|
|
175
|
-
this.extendG.remove();
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
drawTopic() {
|
|
179
|
-
this.textManage.draw(this.element.data.topic);
|
|
180
|
-
this.g.append(this.textManage.g);
|
|
181
|
-
if (this.element.manualWidth) {
|
|
182
|
-
const width = NodeSpace.getNodeDynamicWidth(this.board, this.element);
|
|
183
|
-
this.textManage.updateWidth(width);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
updateTopic() {
|
|
187
|
-
this.textManage.updateText(this.element.data.topic);
|
|
188
|
-
this.textManage.updateRectangle();
|
|
189
|
-
if (this.element.manualWidth) {
|
|
190
|
-
const width = NodeSpace.getNodeDynamicWidth(this.board, this.element);
|
|
191
|
-
this.textManage.updateWidth(width);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
editTopic() {
|
|
195
|
-
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: true });
|
|
196
|
-
// update text max-width when image width greater than topic default max width to cover node topic default max width style
|
|
197
|
-
const defaultMaxWidth = TOPIC_DEFAULT_MAX_WORD_COUNT * (PlaitMind.isMind(this.element) ? ROOT_TOPIC_FONT_SIZE : TOPIC_FONT_SIZE);
|
|
198
|
-
let hasMaxWidth = false;
|
|
199
|
-
if (!this.element.manualWidth && MindElement.hasImage(this.element) && this.element.data.image.width > defaultMaxWidth) {
|
|
200
|
-
const width = NodeSpace.getNodeDynamicWidth(this.board, this.element);
|
|
201
|
-
this.textManage.updateWidth(width);
|
|
202
|
-
hasMaxWidth = true;
|
|
203
|
-
}
|
|
204
|
-
this.textManage.edit((origin) => {
|
|
205
|
-
if (origin === ExitOrigin.default) {
|
|
206
|
-
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: false });
|
|
207
|
-
}
|
|
208
|
-
if (hasMaxWidth) {
|
|
209
|
-
this.textManage.updateWidth(0);
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
ngOnDestroy() {
|
|
214
|
-
super.ngOnDestroy();
|
|
215
|
-
this.textManage.destroy();
|
|
216
|
-
this.nodeEmojisDrawer.destroy();
|
|
217
|
-
this.imageDrawer.destroy();
|
|
218
|
-
this.destroy$.next();
|
|
219
|
-
this.destroy$.complete();
|
|
220
|
-
if (ELEMENT_TO_NODE.get(this.element) === this.node) {
|
|
221
|
-
ELEMENT_TO_NODE.delete(this.element);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: MindNodeComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
225
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.3", type: MindNodeComponent, selector: "plait-mind-node", usesInheritance: true, ngImport: i0, template: `
|
|
226
|
-
<plait-children
|
|
227
|
-
*ngIf="!element.isCollapsed"
|
|
228
|
-
[board]="board"
|
|
229
|
-
[parent]="element"
|
|
230
|
-
[effect]="effect"
|
|
231
|
-
[parentG]="parentG"
|
|
232
|
-
></plait-children>
|
|
233
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.PlaitChildrenElement, selector: "plait-children", inputs: ["board", "parent", "effect", "parentG"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
234
|
-
}
|
|
235
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: MindNodeComponent, decorators: [{
|
|
236
|
-
type: Component,
|
|
237
|
-
args: [{
|
|
238
|
-
selector: 'plait-mind-node',
|
|
239
|
-
template: `
|
|
240
|
-
<plait-children
|
|
241
|
-
*ngIf="!element.isCollapsed"
|
|
242
|
-
[board]="board"
|
|
243
|
-
[parent]="element"
|
|
244
|
-
[effect]="effect"
|
|
245
|
-
[parentG]="parentG"
|
|
246
|
-
></plait-children>
|
|
247
|
-
`,
|
|
248
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
249
|
-
}]
|
|
250
|
-
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; } });
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9ub2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUNILE9BQU8sRUFDUCxVQUFVLEVBQ1YsMkJBQTJCLEVBQzNCLFlBQVksRUFDWixhQUFhLEVBR2IsZUFBZSxFQUVsQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBaUIsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFL0QsT0FBTyxFQUFFLFFB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QyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakQsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDeEM7SUFDTCxDQUFDOzhHQWpQUSxpQkFBaUI7a0dBQWpCLGlCQUFpQiw4RUFYaEI7Ozs7Ozs7O0tBUVQ7OzJGQUdRLGlCQUFpQjtrQkFiN0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixRQUFRLEVBQUU7Ozs7Ozs7O0tBUVQ7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2xEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIGNyZWF0ZUcsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBQbGFpdFBsdWdpbkVsZW1lbnRDb21wb25lbnQsXG4gICAgUGxhaXRFbGVtZW50LFxuICAgIE5PREVfVE9fSU5ERVgsXG4gICAgUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dCxcbiAgICBPbkNvbnRleHRDaGFuZ2VkLFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBQb2ludFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBpc0hvcml6b250YWxMYXlvdXQsIEFic3RyYWN0Tm9kZSwgTWluZExheW91dFR5cGUgfSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyBUZXh0TWFuYWdlUmVmLCBUZXh0TWFuYWdlLCBFeGl0T3JpZ2luIH0gZnJvbSAnQHBsYWl0L3RleHQnO1xuaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tICdyb3VnaGpzL2Jpbi9zdmcnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZHJhd1JvdW5kUmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi91dGlscy9kcmF3L25vZGUtc2hhcGUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9lbGVtZW50JztcbmltcG9ydCB7IE1pbmROb2RlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgTWluZFF1ZXJpZXMgfSBmcm9tICcuL3F1ZXJpZXMnO1xuaW1wb3J0IHsgaXNIaXRNaW5kRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvcG9zaXRpb24vbm9kZSc7XG5pbXBvcnQgeyBnZXRTaGFwZUJ5RWxlbWVudCB9IGZyb20gJy4vdXRpbHMvbm9kZS1zdHlsZS9zaGFwZSc7XG5pbXBvcnQgeyBFTEVNRU5UX1RPX05PREUgfSBmcm9tICcuL3V0aWxzL3dlYWstbWFwcyc7XG5pbXBvcnQgeyBkcmF3QWJzdHJhY3RMaW5rIH0gZnJvbSAnLi91dGlscy9kcmF3L25vZGUtbGluay9hYnN0cmFjdC1saW5rJztcbmltcG9ydCB7IE5vZGVFbW9qaXNEcmF3ZXIgfSBmcm9tICcuL2RyYXdlci9ub2RlLWVtb2ppcy5kcmF3ZXInO1xuaW1wb3J0IHsgTWluZFRyYW5zZm9ybXMgfSBmcm9tICcuL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnRTaGFwZSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBOb2RlSW5zZXJ0RHJhd2VyIH0gZnJvbSAnLi9kcmF3ZXIvbm9kZS1pbnNlcnQuZHJhd2VyJztcbmltcG9ydCB7IFBsYWl0TWluZEJvYXJkIH0gZnJvbSAnLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5pbXBvcnQgeyBkcmF3TGluayB9IGZyb20gJy4vdXRpbHMvZHJhdy9ub2RlLWxpbmsvZHJhdy1saW5rJztcbmltcG9ydCB7IGdldFRvcGljUmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi91dGlscy9wb3NpdGlvbi90b3BpYyc7XG5pbXBvcnQgeyBOb2RlQWN0aXZlRHJhd2VyIH0gZnJvbSAnLi9kcmF3ZXIvbm9kZS1hY3RpdmUuZHJhd2VyJztcbmltcG9ydCB7IENvbGxhcHNlRHJhd2VyIH0gZnJvbSAnLi9kcmF3ZXIvbm9kZS1jb2xsYXBzZS5kcmF3ZXInO1xuaW1wb3J0IHsgV2l0aE1pbmRPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL29wdGlvbnMnO1xuaW1wb3J0IHsgV2l0aE1pbmRQbHVnaW5LZXkgfSBmcm9tICcuL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IE5vZGVJbWFnZURyYXdlciB9IGZyb20gJy4vZHJhd2VyL25vZGUtaW1hZ2UuZHJhd2VyJztcbmltcG9ydCB7IE5vZGVTcGFjZSB9IGZyb20gJy4vdXRpbHMvc3BhY2Uvbm9kZS1zcGFjZSc7XG5pbXBvcnQgeyBOb2RlVG9waWNUaHJlc2hvbGQsIFJPT1RfVE9QSUNfRk9OVF9TSVpFLCBUT1BJQ19ERUZBVUxUX01BWF9XT1JEX0NPVU5ULCBUT1BJQ19GT05UX1NJWkUgfSBmcm9tICcuL2NvbnN0YW50cy9ub2RlLXRvcGljLXN0eWxlJztcblxuLy8gMS4gV2hlbiB0aGUgdGV4dCBhdCB0aGUgZW5kIGhhcyBhbiBpdGFsaWMgYXR0cmlidXRlLCB0aGUgdGV4dCBpcyBwYXJ0aWFsbHkgY292ZXJlZFxuLy8gMi4gVGhlcmUgd2lsbCBiZSBzb21lIGRpZmZlcmVuY2VzIGluIHRoZSB3aWR0aCBtZWFzdXJlZCBieSBkaWZmZXJlbnQgYnJvd3NlcnNcbmNvbnN0IFdJRFRIX0JVRkZFUiA9IDQ7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGxhaXQtbWluZC1ub2RlJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8cGxhaXQtY2hpbGRyZW5cbiAgICAgICAgICAgICpuZ0lmPVwiIWVsZW1lbnQuaXNDb2xsYXBzZWRcIlxuICAgICAgICAgICAgW2JvYXJkXT1cImJvYXJkXCJcbiAgICAgICAgICAgIFtwYXJlbnRdPVwiZWxlbWVudFwiXG4gICAgICAgICAgICBbZWZmZWN0XT1cImVmZmVjdFwiXG4gICAgICAgICAgICBbcGFyZW50R109XCJwYXJlbnRHXCJcbiAgICAgICAgPjwvcGxhaXQtY2hpbGRyZW4+XG4gICAgYCxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNaW5kTm9kZUNvbXBvbmVudCBleHRlbmRzIFBsYWl0UGx1Z2luRWxlbWVudENvbXBvbmVudDxNaW5kRWxlbWVudCwgUGxhaXRNaW5kQm9hcmQ+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25Db250ZXh0Q2hhbmdlZDxNaW5kRWxlbWVudCwgUGxhaXRNaW5kQm9hcmQ+IHtcbiAgICByb3VnaFNWRyE6IFJvdWdoU1ZHO1xuXG4gICAgbm9kZSE6IE1pbmROb2RlO1xuXG4gICAgaW5kZXghOiBudW1iZXI7XG5cbiAgICBwYXJlbnRHITogU1ZHR0VsZW1lbnQ7XG5cbiAgICBzaGFwZUc6IFNWR0dFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBsaW5rRz86IFNWR0dFbGVtZW50O1xuXG4gICAgZXh0ZW5kRz86IFNWR0dFbGVtZW50O1xuXG4gICAgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgbm9kZUVtb2ppc0RyYXdlciE6IE5vZGVFbW9qaXNEcmF3ZXI7XG5cbiAgICBub2RlSW5zZXJ0RHJhd2VyITogTm9kZUluc2VydERyYXdlcjtcblxuICAgIGltYWdlRHJhd2VyITogTm9kZUltYWdlRHJhd2VyO1xuXG4gICAgdGV4dE1hbmFnZSE6IFRleHRNYW5hZ2U7XG5cbiAgICBhY3RpdmVEcmF3ZXIhOiBOb2RlQWN0aXZlRHJhd2VyO1xuXG4gICAgY29sbGFwc2VEcmF3ZXIhOiBDb2xsYXBzZURyYXdlcjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgICAgc3VwZXIoY2RyKTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplRHJhd2VyKCkge1xuICAgICAgICB0aGlzLm5vZGVFbW9qaXNEcmF3ZXIgPSBuZXcgTm9kZUVtb2ppc0RyYXdlcih0aGlzLmJvYXJkLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICB0aGlzLm5vZGVJbnNlcnREcmF3ZXIgPSBuZXcgTm9kZUluc2VydERyYXdlcih0aGlzLmJvYXJkKTtcbiAgICAgICAgdGhpcy5hY3RpdmVEcmF3ZXIgPSBuZXcgTm9kZUFjdGl2ZURyYXdlcih0aGlzLmJvYXJkKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZURyYXdlciA9IG5ldyBDb2xsYXBzZURyYXdlcih0aGlzLmJvYXJkKTtcbiAgICAgICAgdGhpcy5pbWFnZURyYXdlciA9IG5ldyBOb2RlSW1hZ2VEcmF3ZXIodGhpcy5ib2FyZCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYm9hcmQuZ2V0UGx1Z2luT3B0aW9uczxXaXRoTWluZE9wdGlvbnM+KFdpdGhNaW5kUGx1Z2luS2V5KS50ZXh0UGx1Z2lucztcblxuICAgICAgICB0aGlzLnRleHRNYW5hZ2UgPSBuZXcgVGV4dE1hbmFnZSh0aGlzLmJvYXJkLCB0aGlzLnZpZXdDb250YWluZXJSZWYsIHtcbiAgICAgICAgICAgIGdldFJlY3RhbmdsZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBnZXRUb3BpY1JlY3RhbmdsZUJ5Tm9kZSh0aGlzLmJvYXJkLCB0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWN0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2VIYW5kbGU6ICh0ZXh0TWFuYWdlUmVmOiBUZXh0TWFuYWdlUmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0ZXh0TWFuYWdlUmVmLndpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRleHRNYW5hZ2VSZWYuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0TWFuYWdlUmVmLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIE1pbmRUcmFuc2Zvcm1zLnNldFRvcGljKHRoaXMuYm9hcmQsIHRoaXMuZWxlbWVudCwgdGV4dE1hbmFnZVJlZi5uZXdWYWx1ZSBhcyBNaW5kRWxlbWVudCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTWluZFRyYW5zZm9ybXMuc2V0VG9waWNTaXplKHRoaXMuYm9hcmQsIHRoaXMuZWxlbWVudCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRleHRQbHVnaW5zOiBwbHVnaW5zLFxuICAgICAgICAgICAgZ2V0TWF4V2lkdGg6ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZVRvcGljVGhyZXNob2xkLmRlZmF1bHRUZXh0TWF4V2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVEcmF3ZXIoKTtcbiAgICAgICAgdGhpcy5ub2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZSh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLmluZGV4ID0gTk9ERV9UT19JTkRFWC5nZXQodGhpcy5lbGVtZW50KSB8fCAwO1xuICAgICAgICB0aGlzLnJvdWdoU1ZHID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKTtcbiAgICAgICAgdGhpcy5wYXJlbnRHID0gUGxhaXRFbGVtZW50LmdldENvbXBvbmVudChNaW5kRWxlbWVudC5nZXRSb290KHRoaXMuYm9hcmQsIHRoaXMuZWxlbWVudCkpLnJvb3RHIGFzIFNWR0dFbGVtZW50O1xuICAgICAgICB0aGlzLmRyYXdTaGFwZSgpO1xuICAgICAgICB0aGlzLmRyYXdMaW5rKCk7XG4gICAgICAgIHRoaXMuZHJhd1RvcGljKCk7XG4gICAgICAgIHRoaXMuYWN0aXZlRHJhd2VyLmRyYXcodGhpcy5lbGVtZW50LCB0aGlzLmcsIHsgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWQsIGlzRWRpdGluZzogdGhpcy50ZXh0TWFuYWdlLmlzRWRpdGluZyB9KTtcbiAgICAgICAgdGhpcy5kcmF3RW1vamlzKCk7XG4gICAgICAgIHRoaXMuZHJhd0V4dGVuZCgpO1xuICAgICAgICB0aGlzLmltYWdlRHJhd2VyLmRyYXdJbWFnZSh0aGlzLmcsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKHRoaXMuY29udGV4dC5wYXJlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmcuY2xhc3NMaXN0LmFkZCgnYnJhbmNoJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNvbnRleHRDaGFuZ2VkKFxuICAgICAgICB2YWx1ZTogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dDxNaW5kRWxlbWVudCwgUGxhaXRNaW5kQm9hcmQ+LFxuICAgICAgICBwcmV2aW91czogUGxhaXRQbHVnaW5FbGVtZW50Q29udGV4dDxNaW5kRWxlbWVudCwgUGxhaXRNaW5kQm9hcmQ+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSBNaW5kRWxlbWVudC5nZXROb2RlKHZhbHVlLmVsZW1lbnQpO1xuICAgICAgICBjb25zdCBpc0VxdWFsTm9kZSA9IFJlY3RhbmdsZUNsaWVudC5pc0VxdWFsKHRoaXMubm9kZSwgbmV3Tm9kZSk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5ld05vZGU7XG5cbiAgICAgICAgY29uc3QgaXNDaGFuZ2VUaGVtZSA9IHRoaXMuYm9hcmQub3BlcmF0aW9ucy5maW5kKG9wID0+IG9wLnR5cGUgPT09ICdzZXRfdGhlbWUnKTtcblxuICAgICAgICBpZiAoIWlzRXF1YWxOb2RlIHx8IHZhbHVlLmVsZW1lbnQgIT09IHByZXZpb3VzLmVsZW1lbnQgfHwgaXNDaGFuZ2VUaGVtZSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVEcmF3ZXIuZHJhdyh0aGlzLmVsZW1lbnQsIHRoaXMuZywgeyBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCwgaXNFZGl0aW5nOiB0aGlzLnRleHRNYW5hZ2UuaXNFZGl0aW5nIH0pO1xuICAgICAgICAgICAgdGhpcy5kcmF3U2hhcGUoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhd0xpbmsoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhd0Vtb2ppcygpO1xuICAgICAgICAgICAgdGhpcy5kcmF3RXh0ZW5kKCk7XG4gICAgICAgICAgICB0aGlzLmltYWdlRHJhd2VyLnVwZGF0ZUltYWdlKHRoaXMuZywgcHJldmlvdXMuZWxlbWVudCwgdmFsdWUuZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRvcGljKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoYXNTYW1lU2VsZWN0ZWQgPSB2YWx1ZS5zZWxlY3RlZCA9PT0gcHJldmlvdXMuc2VsZWN0ZWQ7XG4gICAgICAgICAgICBjb25zdCBoYXNTYW1lUGFyZW50ID0gdmFsdWUucGFyZW50ID09PSBwcmV2aW91cy5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIWhhc1NhbWVTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRHJhd2VyLmRyYXcodGhpcy5lbGVtZW50LCB0aGlzLmcsIHsgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWQsIGlzRWRpdGluZzogdGhpcy50ZXh0TWFuYWdlLmlzRWRpdGluZyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzU2FtZVBhcmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd0xpbmsoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYXdFbW9qaXMoKSB7XG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLm5vZGVFbW9qaXNEcmF3ZXIuZHJhd0Vtb2ppcyh0aGlzLmVsZW1lbnQpO1xuICAgICAgICBpZiAoZykge1xuICAgICAgICAgICAgdGhpcy5nLmFwcGVuZChnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYXdTaGFwZSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95U2hhcGUoKTtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZUJ5RWxlbWVudCh0aGlzLmJvYXJkLCB0aGlzLm5vZGUub3JpZ2luKSBhcyBNaW5kRWxlbWVudFNoYXBlO1xuICAgICAgICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgICAgICAgICBjYXNlIE1pbmRFbGVtZW50U2hhcGUucm91bmRSZWN0YW5nbGU6XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFwZUcgPSBkcmF3Um91bmRSZWN0YW5nbGVCeU5vZGUodGhpcy5ib2FyZCwgdGhpcy5ub2RlIGFzIE1pbmROb2RlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmcucHJlcGVuZCh0aGlzLnNoYXBlRyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveVNoYXBlKCkge1xuICAgICAgICBpZiAodGhpcy5zaGFwZUcpIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVHLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5zaGFwZUcgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHJhd0xpbmsoKSB7XG4gICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKHRoaXMuZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IE1pbmRFbGVtZW50LmdldFBhcmVudCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShwYXJlbnQpO1xuXG4gICAgICAgIGlmICh0aGlzLmxpbmtHKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtHLnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gTWluZFF1ZXJpZXMuZ2V0TGF5b3V0QnlFbGVtZW50KHBhcmVudCkgYXMgTWluZExheW91dFR5cGU7XG4gICAgICAgIGlmIChBYnN0cmFjdE5vZGUuaXNBYnN0cmFjdCh0aGlzLm5vZGUub3JpZ2luKSkge1xuICAgICAgICAgICAgdGhpcy5saW5rRyA9IGRyYXdBYnN0cmFjdExpbmsodGhpcy5ib2FyZCwgdGhpcy5ub2RlLCBpc0hvcml6b250YWxMYXlvdXQobGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtHID0gZHJhd0xpbmsodGhpcy5ib2FyZCwgcGFyZW50Tm9kZSwgdGhpcy5ub2RlLCBpc0hvcml6b250YWxMYXlvdXQobGF5b3V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nLmFwcGVuZCh0aGlzLmxpbmtHKTtcbiAgICB9XG5cbiAgICBkZXN0cm95TGluZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGlua0cpIHtcbiAgICAgICAgICAgIHRoaXMubGlua0cucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmF3RXh0ZW5kKCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lFeHRlbmQoKTtcblxuICAgICAgICB0aGlzLmV4dGVuZEcgPSBjcmVhdGVHKCk7XG4gICAgICAgIHRoaXMuZXh0ZW5kRy5jbGFzc0xpc3QuYWRkKCdleHRlbmQnKTtcbiAgICAgICAgdGhpcy5nLmFwcGVuZCh0aGlzLmV4dGVuZEcpO1xuXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuaXNDb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZy5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZy5jbGFzc0xpc3QucmVtb3ZlKCdjb2xsYXBzZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm9kZUluc2VydERyYXdlci5kcmF3KHRoaXMuZWxlbWVudCwgdGhpcy5leHRlbmRHISk7XG4gICAgICAgIHRoaXMuY29sbGFwc2VEcmF3ZXIuZHJhdyh0aGlzLmVsZW1lbnQsIHRoaXMuZXh0ZW5kRyEpO1xuICAgIH1cblxuICAgIGRlc3Ryb3lFeHRlbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4dGVuZEcpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kRy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYXdUb3BpYygpIHtcbiAgICAgICAgdGhpcy50ZXh0TWFuYWdlLmRyYXcodGhpcy5lbGVtZW50LmRhdGEudG9waWMpO1xuICAgICAgICB0aGlzLmcuYXBwZW5kKHRoaXMudGV4dE1hbmFnZS5nKTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5tYW51YWxXaWR0aCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBOb2RlU3BhY2UuZ2V0Tm9kZUR5bmFtaWNXaWR0aCh0aGlzLmJvYXJkLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy50ZXh0TWFuYWdlLnVwZGF0ZVdpZHRoKHdpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRvcGljKCkge1xuICAgICAgICB0aGlzLnRleHRNYW5hZ2UudXBkYXRlVGV4dCh0aGlzLmVsZW1lbnQuZGF0YS50b3BpYyk7XG4gICAgICAgIHRoaXMudGV4dE1hbmFnZS51cGRhdGVSZWN0YW5nbGUoKTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5tYW51YWxXaWR0aCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBOb2RlU3BhY2UuZ2V0Tm9kZUR5bmFtaWNXaWR0aCh0aGlzLmJvYXJkLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy50ZXh0TWFuYWdlLnVwZGF0ZVdpZHRoKHdpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVkaXRUb3BpYygpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVEcmF3ZXIuZHJhdyh0aGlzLmVsZW1lbnQsIHRoaXMuZywgeyBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCwgaXNFZGl0aW5nOiB0cnVlIH0pO1xuICAgICAgICAvLyB1cGRhdGUgdGV4dCBtYXgtd2lkdGggd2hlbiBpbWFnZSB3aWR0aCBncmVhdGVyIHRoYW4gdG9waWMgZGVmYXVsdCBtYXggd2lkdGggdG8gY292ZXIgbm9kZSB0b3BpYyBkZWZhdWx0IG1heCB3aWR0aCBzdHlsZVxuICAgICAgICBjb25zdCBkZWZhdWx0TWF4V2lkdGggPSBUT1BJQ19ERUZBVUxUX01BWF9XT1JEX0NPVU5UICogKFBsYWl0TWluZC5pc01pbmQodGhpcy5lbGVtZW50KSA/IFJPT1RfVE9QSUNfRk9OVF9TSVpFIDogVE9QSUNfRk9OVF9TSVpFKTtcbiAgICAgICAgbGV0IGhhc01heFdpZHRoID0gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm1hbnVhbFdpZHRoICYmIE1pbmRFbGVtZW50Lmhhc0ltYWdlKHRoaXMuZWxlbWVudCkgJiYgdGhpcy5lbGVtZW50LmRhdGEuaW1hZ2Uud2lkdGggPiBkZWZhdWx0TWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gTm9kZVNwYWNlLmdldE5vZGVEeW5hbWljV2lkdGgodGhpcy5ib2FyZCwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMudGV4dE1hbmFnZS51cGRhdGVXaWR0aCh3aWR0aCk7XG4gICAgICAgICAgICBoYXNNYXhXaWR0aCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0TWFuYWdlLmVkaXQoKG9yaWdpbjogRXhpdE9yaWdpbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9yaWdpbiA9PT0gRXhpdE9yaWdpbi5kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcmF3ZXIuZHJhdyh0aGlzLmVsZW1lbnQsIHRoaXMuZywgeyBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZCwgaXNFZGl0aW5nOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNNYXhXaWR0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dE1hbmFnZS51cGRhdGVXaWR0aCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhY2tCeSA9IChpbmRleDogbnVtYmVyLCBub2RlOiBNaW5kTm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gbm9kZS5vcmlnaW4uaWQ7XG4gICAgfTtcblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRleHRNYW5hZ2UuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm5vZGVFbW9qaXNEcmF3ZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmltYWdlRHJhd2VyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgaWYgKEVMRU1FTlRfVE9fTk9ERS5nZXQodGhpcy5lbGVtZW50KSA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICBFTEVNRU5UX1RPX05PREUuZGVsZXRlKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
File without changes
|