@limble/limble-tree 5.0.0 → 6.0.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/README.md +1 -0
- package/fesm2022/limble-limble-tree.mjs +46 -46
- package/fesm2022/limble-limble-tree.mjs.map +1 -1
- package/lib/components/index.d.ts +2 -2
- package/lib/core/configuration/index.d.ts +1 -1
- package/lib/core/index.d.ts +5 -5
- package/lib/core/tree-branch/index.d.ts +1 -1
- package/lib/events/index.d.ts +1 -1
- package/lib/events/relational/index.d.ts +2 -2
- package/lib/legacy/index.d.ts +3 -3
- package/package.json +4 -6
- package/esm2022/lib/components/branch/branch.component.mjs +0 -78
- package/esm2022/lib/components/branch/index.mjs +0 -2
- package/esm2022/lib/components/dragover-no-change-detect.mjs +0 -39
- package/esm2022/lib/components/dropzone/dropzone.component.mjs +0 -35
- package/esm2022/lib/components/dropzone/index.mjs +0 -2
- package/esm2022/lib/components/host-component.interface.mjs +0 -2
- package/esm2022/lib/components/index.mjs +0 -7
- package/esm2022/lib/components/node-component.interface.mjs +0 -2
- package/esm2022/lib/components/root/index.mjs +0 -2
- package/esm2022/lib/components/root/root.component.mjs +0 -35
- package/esm2022/lib/core/branch-options.interface.mjs +0 -2
- package/esm2022/lib/core/branchable.interface.mjs +0 -2
- package/esm2022/lib/core/component-container.interface.mjs +0 -2
- package/esm2022/lib/core/configuration/configuration.mjs +0 -17
- package/esm2022/lib/core/configuration/index.mjs +0 -3
- package/esm2022/lib/core/configuration/tree-options.interface.mjs +0 -2
- package/esm2022/lib/core/index.mjs +0 -11
- package/esm2022/lib/core/tree-branch/branch-controller.mjs +0 -99
- package/esm2022/lib/core/tree-branch/graftable.interface.mjs +0 -2
- package/esm2022/lib/core/tree-branch/index.mjs +0 -4
- package/esm2022/lib/core/tree-branch/tree-branch.mjs +0 -429
- package/esm2022/lib/core/tree-node-base.mjs +0 -77
- package/esm2022/lib/core/tree-node.interface.mjs +0 -2
- package/esm2022/lib/core/tree-plot.interface.mjs +0 -2
- package/esm2022/lib/core/tree-root/index.mjs +0 -3
- package/esm2022/lib/core/tree-root/root-controller.mjs +0 -42
- package/esm2022/lib/core/tree-root/tree-root.mjs +0 -193
- package/esm2022/lib/core/tree-service/index.mjs +0 -2
- package/esm2022/lib/core/tree-service/tree.service.mjs +0 -25
- package/esm2022/lib/errors/index.mjs +0 -2
- package/esm2022/lib/errors/tree-error.mjs +0 -3
- package/esm2022/lib/events/drag/drag-end-event.mjs +0 -30
- package/esm2022/lib/events/drag/drag-start-event.mjs +0 -10
- package/esm2022/lib/events/drag/drop-event.mjs +0 -18
- package/esm2022/lib/events/drag/index.mjs +0 -4
- package/esm2022/lib/events/general/destruction-event.mjs +0 -10
- package/esm2022/lib/events/general/index.mjs +0 -2
- package/esm2022/lib/events/index.mjs +0 -5
- package/esm2022/lib/events/relational/graft-event.mjs +0 -22
- package/esm2022/lib/events/relational/index.mjs +0 -5
- package/esm2022/lib/events/relational/prune-event.mjs +0 -22
- package/esm2022/lib/events/relational/relational-tree-event.interface.mjs +0 -2
- package/esm2022/lib/events/relational/tree-relationship.interface.mjs +0 -2
- package/esm2022/lib/events/tree-event.interface.mjs +0 -2
- package/esm2022/lib/extras/collapse/collapse.mjs +0 -33
- package/esm2022/lib/extras/collapse/collapse.module.mjs +0 -16
- package/esm2022/lib/extras/collapse/collapse.service.mjs +0 -45
- package/esm2022/lib/extras/collapse/index.mjs +0 -4
- package/esm2022/lib/extras/drag-and-drop/drag-and-drop.mjs +0 -83
- package/esm2022/lib/extras/drag-and-drop/drag-and-drop.module.mjs +0 -22
- package/esm2022/lib/extras/drag-and-drop/drag-and-drop.service.mjs +0 -44
- package/esm2022/lib/extras/drag-and-drop/drag-state.mjs +0 -47
- package/esm2022/lib/extras/drag-and-drop/draggable.directive.mjs +0 -30
- package/esm2022/lib/extras/drag-and-drop/dropzone-renderer.mjs +0 -176
- package/esm2022/lib/extras/drag-and-drop/index.mjs +0 -7
- package/esm2022/lib/legacy/index.mjs +0 -7
- package/esm2022/lib/legacy/legacy-component-obj.interface.mjs +0 -2
- package/esm2022/lib/legacy/legacy-tree-data.interface.mjs +0 -2
- package/esm2022/lib/legacy/legacy-tree-options.interface.mjs +0 -2
- package/esm2022/lib/legacy/legacy-tree.mjs +0 -73
- package/esm2022/lib/legacy/limble-tree-legacy.module.mjs +0 -20
- package/esm2022/lib/legacy/limble-tree-root/limble-tree-root.component.mjs +0 -78
- package/esm2022/lib/limble-tree.module.mjs +0 -25
- package/esm2022/limble-limble-tree.mjs +0 -5
- package/esm2022/public-api.mjs +0 -12
- package/esm2022/shared/assert.mjs +0 -7
- package/esm2022/shared/has-property.mjs +0 -4
- package/esm2022/shared/index.mjs +0 -3
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
import { assert } from "../../../shared";
|
|
2
|
-
import { TreeError } from "../../errors";
|
|
3
|
-
import { dropzoneRenderer } from "../../extras/drag-and-drop";
|
|
4
|
-
import { TreeRoot } from "../tree-root";
|
|
5
|
-
import { TreeNodeBase } from "../tree-node-base";
|
|
6
|
-
import { config } from "../configuration";
|
|
7
|
-
import { BranchController } from "./branch-controller";
|
|
8
|
-
import { treeCollapser } from "../../extras/collapse";
|
|
9
|
-
import { DestructionEvent, GraftEvent, PruneEvent } from "../../events";
|
|
10
|
-
/** Represents a standard node in a tree. Renders a BranchComponent.
|
|
11
|
-
*
|
|
12
|
-
* @remarks
|
|
13
|
-
* This class renders a branch component, which does the following:
|
|
14
|
-
* 1. Renders a component provided by the user
|
|
15
|
-
* 2. Provides a container in which child branches may be rendered
|
|
16
|
-
* 3. Contains two Dropzones: one for dropping branches below this branch (as a
|
|
17
|
-
* sibling), and one for dropping branches as a first child of this branch.
|
|
18
|
-
*/
|
|
19
|
-
export class TreeBranch {
|
|
20
|
-
constructor(parent, branchOptions) {
|
|
21
|
-
this.branchOptions = branchOptions;
|
|
22
|
-
this.detachedView = null;
|
|
23
|
-
this.treeNodeBase = new TreeNodeBase();
|
|
24
|
-
const parentBranchesContainer = parent.getBranchesContainer();
|
|
25
|
-
assert(parentBranchesContainer !== undefined);
|
|
26
|
-
this.branchController = new BranchController(this, parentBranchesContainer);
|
|
27
|
-
const hostView = this.branchController.getHostView();
|
|
28
|
-
if (parent instanceof TreeBranch &&
|
|
29
|
-
parent.branchOptions.defaultCollapsed === true) {
|
|
30
|
-
treeCollapser.storePrecollapsedNode(parent, this);
|
|
31
|
-
this.detachedView = hostView;
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
parentBranchesContainer.insert(hostView);
|
|
35
|
-
this._parent = parent;
|
|
36
|
-
this.dispatch(new GraftEvent(this, {
|
|
37
|
-
parent: this._parent,
|
|
38
|
-
child: this,
|
|
39
|
-
index: this._parent.branches().length
|
|
40
|
-
}));
|
|
41
|
-
this.setIndentation();
|
|
42
|
-
}
|
|
43
|
-
this.detectChanges();
|
|
44
|
-
}
|
|
45
|
-
/** @returns All child branches as an array of TreeBranch instances, in order. */
|
|
46
|
-
branches() {
|
|
47
|
-
return this.treeNodeBase.branches();
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Recursively destroys all descendant branches, as well as itself. This
|
|
51
|
-
* releases all resources held or consumed by this branch and its descendants.
|
|
52
|
-
*
|
|
53
|
-
* @remarks
|
|
54
|
-
* It is important to call this method when a branch is discarded, otherwise
|
|
55
|
-
* the branch will remain in memory and continue to consume resources.
|
|
56
|
-
*/
|
|
57
|
-
destroy() {
|
|
58
|
-
if (this.isDestroyed()) {
|
|
59
|
-
throw new TreeError("Cannot destroy a destroyed tree branch");
|
|
60
|
-
}
|
|
61
|
-
this.prune();
|
|
62
|
-
treeCollapser.expand(this);
|
|
63
|
-
dropzoneRenderer.clearTreeFromRegistry(this);
|
|
64
|
-
this.branchController.getHostView().destroy();
|
|
65
|
-
this.treeNodeBase.destroy();
|
|
66
|
-
this.branchController.destroy();
|
|
67
|
-
this.dispatch(new DestructionEvent(this));
|
|
68
|
-
}
|
|
69
|
-
/** Run Angular change detection on this branch */
|
|
70
|
-
detectChanges() {
|
|
71
|
-
this.branchController.detectChanges();
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Emits the specified TreeEvent.
|
|
75
|
-
*
|
|
76
|
-
* @remarks
|
|
77
|
-
* Caution: It is not recommended to manually emit TreeEvents that are already
|
|
78
|
-
* provided by the library. For example, it is not recommended to emit a
|
|
79
|
-
* `GraftEvent`, `DestructionEvent`, etc. These events may be used by the tree,
|
|
80
|
-
* and emitting them manually may cause unexpected behavior. Instead, we
|
|
81
|
-
* recommend implementing the TreeEvent interface with your own custom events
|
|
82
|
-
* and dispatching those.
|
|
83
|
-
*
|
|
84
|
-
* @param event - The TreeEvent that will be emitted.
|
|
85
|
-
*/
|
|
86
|
-
dispatch(event) {
|
|
87
|
-
this.treeNodeBase.dispatch(event);
|
|
88
|
-
this._parent?.dispatch(event);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* @returns
|
|
92
|
-
* An observable that emits TreeEvents whenever an event is dispatched
|
|
93
|
-
* in this branch or any of its descendant branches.
|
|
94
|
-
*/
|
|
95
|
-
events() {
|
|
96
|
-
return this.treeNodeBase.events();
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* @param index - The index of the child branch to retrieve.
|
|
100
|
-
*
|
|
101
|
-
* @returns
|
|
102
|
-
* The child branch at the specified index, or undefined if there is
|
|
103
|
-
* no child branch at the specified index.
|
|
104
|
-
*/
|
|
105
|
-
getBranch(index) {
|
|
106
|
-
return this.treeNodeBase.getBranch(index);
|
|
107
|
-
}
|
|
108
|
-
/** @returns The ViewContainerRef in which child branches are rendered */
|
|
109
|
-
getBranchesContainer() {
|
|
110
|
-
if (this.isDestroyed()) {
|
|
111
|
-
throw new TreeError("Cannot get branches container from a destroyed tree branch");
|
|
112
|
-
}
|
|
113
|
-
return this.branchController.getBranchesContainer();
|
|
114
|
-
}
|
|
115
|
-
/** @returns The instance of BranchComponent that is rendered by this class. */
|
|
116
|
-
getComponentInstance() {
|
|
117
|
-
if (this.isDestroyed()) {
|
|
118
|
-
throw new TreeError("Cannot get component instance from a destroyed tree branch");
|
|
119
|
-
}
|
|
120
|
-
return this.branchController.getComponentInstance();
|
|
121
|
-
}
|
|
122
|
-
/** @returns The Host View in which the BranchComponent is rendered */
|
|
123
|
-
getHostView() {
|
|
124
|
-
if (this.isDestroyed()) {
|
|
125
|
-
throw new TreeError("Cannot get component host view from a destroyed tree branch");
|
|
126
|
-
}
|
|
127
|
-
return this.branchController.getHostView();
|
|
128
|
-
}
|
|
129
|
-
/** @returns The BranchComponent as a native HTML Element */
|
|
130
|
-
getNativeElement() {
|
|
131
|
-
if (this.isDestroyed()) {
|
|
132
|
-
throw new TreeError("Cannot get native element from a destroyed tree branch");
|
|
133
|
-
}
|
|
134
|
-
return this.branchController.getNativeElement();
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* @returns
|
|
138
|
-
* A ComponentRef containing the instance of the user-provided
|
|
139
|
-
* component which is rendered by this branch.
|
|
140
|
-
*/
|
|
141
|
-
getUserlandComponentRef() {
|
|
142
|
-
if (this.isDestroyed()) {
|
|
143
|
-
throw new TreeError("Cannot get userland component from a destroyed tree branch");
|
|
144
|
-
}
|
|
145
|
-
return this.branchController.getUserlandComponentRef();
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Attaches a branch to a new parent node.
|
|
149
|
-
*
|
|
150
|
-
* @remarks
|
|
151
|
-
* If not already pruned, this method prunes (removes) this branch from its
|
|
152
|
-
* current position in the tree; then grafts (reattaches) it as a child of the
|
|
153
|
-
* specified parent branch at the specified index. If no index is specified,
|
|
154
|
-
* the branch is appended as the last child of the parent. This causes this
|
|
155
|
-
* branch's associated BranchComponent to be re-rendered in the DOM at the
|
|
156
|
-
* new location.
|
|
157
|
-
*
|
|
158
|
-
* @param newParent - The new parent branch unto which this branch will be grafted.
|
|
159
|
-
* @param index - The index at which this branch will be grafted. If not specified,
|
|
160
|
-
* this branch will be appended as the last child of the new parent.
|
|
161
|
-
*
|
|
162
|
-
* @returns The index at which this branch was grafted.
|
|
163
|
-
*/
|
|
164
|
-
graftTo(newParent, index) {
|
|
165
|
-
this.checkGraftLocationValidity(newParent, index);
|
|
166
|
-
const ownIndex = this.index();
|
|
167
|
-
if (ownIndex !== undefined) {
|
|
168
|
-
this.prune();
|
|
169
|
-
}
|
|
170
|
-
this._parent = newParent;
|
|
171
|
-
const newIndex = index ?? newParent.branches().length;
|
|
172
|
-
this.reattachView(newIndex);
|
|
173
|
-
this.dispatch(new GraftEvent(this, {
|
|
174
|
-
parent: newParent,
|
|
175
|
-
child: this,
|
|
176
|
-
index: newIndex
|
|
177
|
-
}));
|
|
178
|
-
return newIndex;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Appends a new child branch to this branch. The child branch will render
|
|
182
|
-
* the specified component according to the (optional) configuration parameter.
|
|
183
|
-
*
|
|
184
|
-
* @param component - The component to render in the new child branch.
|
|
185
|
-
* @param options - Configuration options for the new child branch.
|
|
186
|
-
*
|
|
187
|
-
* @returns
|
|
188
|
-
* The newly-created child branch.
|
|
189
|
-
*/
|
|
190
|
-
grow(component, options) {
|
|
191
|
-
if (this.isDestroyed()) {
|
|
192
|
-
throw new TreeError("Cannot grow a branch on a destroyed tree branch");
|
|
193
|
-
}
|
|
194
|
-
try {
|
|
195
|
-
return new TreeBranch(this, { component, ...options });
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
throw this.handleUserlandError(error);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Determines this branch's index in relation to its sibling branches.
|
|
203
|
-
*
|
|
204
|
-
* @remarks
|
|
205
|
-
* For example, if it is the first child of its parent, this method will return
|
|
206
|
-
* 0. If it is the second child of its parent, this method will return 1.
|
|
207
|
-
*
|
|
208
|
-
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
209
|
-
* method will return undefined.
|
|
210
|
-
*
|
|
211
|
-
* @returns
|
|
212
|
-
* The index of this branch in relation to its sibling branches, or undefined.
|
|
213
|
-
*/
|
|
214
|
-
index() {
|
|
215
|
-
if (!this._parent) {
|
|
216
|
-
return undefined;
|
|
217
|
-
}
|
|
218
|
-
const index = this._parent
|
|
219
|
-
.branches()
|
|
220
|
-
.findIndex((branch) => branch === this);
|
|
221
|
-
assert(index >= 0);
|
|
222
|
-
return index;
|
|
223
|
-
}
|
|
224
|
-
/** @returns `true` if the branch is destroyed, `false` otherwise */
|
|
225
|
-
isDestroyed() {
|
|
226
|
-
return this.treeNodeBase.isDestroyed();
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* @returns
|
|
230
|
-
* The data that was passed into the `branchOptions`' `meta` property
|
|
231
|
-
* at construction.
|
|
232
|
-
*/
|
|
233
|
-
meta() {
|
|
234
|
-
return this.branchOptions.meta ?? {};
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* @returns
|
|
238
|
-
* This branch's parent node (which may be a TreeBranch or TreeRoot).
|
|
239
|
-
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
240
|
-
* method will return undefined.
|
|
241
|
-
*/
|
|
242
|
-
parent() {
|
|
243
|
-
return this._parent;
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Provides a model describing this branch's descendants.
|
|
247
|
-
*
|
|
248
|
-
* @returns
|
|
249
|
-
* A multi-dimensional Map which describes the shape of this branch's
|
|
250
|
-
* descendants.
|
|
251
|
-
*
|
|
252
|
-
* @example
|
|
253
|
-
* A branch with no children will return an empty Map. A branch with
|
|
254
|
-
* a single child will return a Map with a single entry, where the key is the index
|
|
255
|
-
* of the branch (zero) and the value is an empty Map. A Tree like this:
|
|
256
|
-
*
|
|
257
|
-
* ```
|
|
258
|
-
* ---Branch-------Branch
|
|
259
|
-
* /
|
|
260
|
-
* Branch-------Branch
|
|
261
|
-
* \
|
|
262
|
-
* ---Branch
|
|
263
|
-
* ```
|
|
264
|
-
* Will return a Map of matching shape:
|
|
265
|
-
* ```
|
|
266
|
-
* Map {
|
|
267
|
-
* 0: Map { 0: Map {}},
|
|
268
|
-
* 1: Map {},
|
|
269
|
-
* 2: Map {}
|
|
270
|
-
* }
|
|
271
|
-
* ```
|
|
272
|
-
*/
|
|
273
|
-
plot() {
|
|
274
|
-
return this.treeNodeBase.plot();
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Calculates the branch's position in the tree relative to the Root.
|
|
278
|
-
*
|
|
279
|
-
* @remarks
|
|
280
|
-
* The position is described as an array of numbers, where each number
|
|
281
|
-
* represents the index of the branch at that level of the tree.
|
|
282
|
-
*
|
|
283
|
-
* For example, if this branch is the first child of the Root, this method
|
|
284
|
-
* will return [0]. If this branch is the second child of the first child
|
|
285
|
-
* of the Root, this method will return [0, 1].
|
|
286
|
-
*
|
|
287
|
-
* If the branch is not related to a TreeRoot, (such as when it has been
|
|
288
|
-
* pruned,) this method will throw an error.
|
|
289
|
-
*
|
|
290
|
-
* @returns
|
|
291
|
-
* An array of numbers which describe the branch's position in the tree
|
|
292
|
-
* relative to the Root.
|
|
293
|
-
*/
|
|
294
|
-
position() {
|
|
295
|
-
const index = this.index();
|
|
296
|
-
if (index === undefined) {
|
|
297
|
-
throw new TreeError("branch has no parent. Position cannot be determined.");
|
|
298
|
-
}
|
|
299
|
-
if (this._parent instanceof TreeBranch) {
|
|
300
|
-
const parentPosition = this._parent.position();
|
|
301
|
-
return [...parentPosition, index];
|
|
302
|
-
}
|
|
303
|
-
return [index];
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Removes a branch from its tree without destroying it.
|
|
307
|
-
*
|
|
308
|
-
* @remarks
|
|
309
|
-
* Removes this branch from its parent and detaches its associated
|
|
310
|
-
* BranchComponent from the DOM. This puts the branch in a "pruned" state,
|
|
311
|
-
* which may affect the behavior of other methods.
|
|
312
|
-
*
|
|
313
|
-
* A pruned branch can be reattached to any other node using the `graftTo` method.
|
|
314
|
-
*
|
|
315
|
-
* @returns
|
|
316
|
-
* Itself, or undefined if it is already in a pruned state.
|
|
317
|
-
*/
|
|
318
|
-
prune() {
|
|
319
|
-
if (this.isDestroyed()) {
|
|
320
|
-
throw new TreeError("Cannot prune a destroyed tree branch");
|
|
321
|
-
}
|
|
322
|
-
const parent = this._parent;
|
|
323
|
-
const index = this.index();
|
|
324
|
-
if (index === undefined || parent === undefined)
|
|
325
|
-
return undefined;
|
|
326
|
-
const container = parent.getBranchesContainer();
|
|
327
|
-
assert(container !== undefined);
|
|
328
|
-
this.detachedView = container.detach(index);
|
|
329
|
-
assert(this.detachedView !== null);
|
|
330
|
-
this.detachedView.detach();
|
|
331
|
-
this.dispatch(new PruneEvent(this, {
|
|
332
|
-
parent: parent,
|
|
333
|
-
child: this,
|
|
334
|
-
index: index
|
|
335
|
-
}));
|
|
336
|
-
this._parent = undefined;
|
|
337
|
-
return this;
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Get the root of the tree to which this Branch is attached.
|
|
341
|
-
*
|
|
342
|
-
* @returns
|
|
343
|
-
* The TreeRoot of the tree this branch is in. If this branch is
|
|
344
|
-
* does not have a root (such as when it has been pruned) this method will
|
|
345
|
-
* return undefined.
|
|
346
|
-
*/
|
|
347
|
-
root() {
|
|
348
|
-
const parent = this.parent();
|
|
349
|
-
if (parent instanceof TreeBranch) {
|
|
350
|
-
return parent.root();
|
|
351
|
-
}
|
|
352
|
-
assert(parent instanceof TreeRoot || parent === undefined);
|
|
353
|
-
return parent;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Traverses this branch's descendants in depth-first pre-order, executing
|
|
357
|
-
* the provided callback function on each node. Traversal includes this branch.
|
|
358
|
-
*
|
|
359
|
-
* @param callback - A function to execute on each node.
|
|
360
|
-
*/
|
|
361
|
-
traverse(callback) {
|
|
362
|
-
callback(this);
|
|
363
|
-
this.treeNodeBase.traverse(callback);
|
|
364
|
-
}
|
|
365
|
-
checkGraftLocationValidity(newParent, index) {
|
|
366
|
-
if (this.isDestroyed()) {
|
|
367
|
-
throw new TreeError("Cannot graft a destroyed tree branch");
|
|
368
|
-
}
|
|
369
|
-
if (newParent.isDestroyed()) {
|
|
370
|
-
throw new TreeError("Cannot graft to a destroyed tree branch");
|
|
371
|
-
}
|
|
372
|
-
if (typeof index === "number" &&
|
|
373
|
-
this.indexIsOutOfRange(newParent, index)) {
|
|
374
|
-
throw new TreeError(`Cannot graft branch at index ${index} of the parent. Out of range.`);
|
|
375
|
-
}
|
|
376
|
-
this.traverse((node) => {
|
|
377
|
-
if (node === newParent) {
|
|
378
|
-
throw new TreeError("Cannot graft a branch to itself or any of its own descendants");
|
|
379
|
-
}
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
handleUserlandError(error) {
|
|
383
|
-
/* When an error occurs in a userland component during a tree operation,
|
|
384
|
-
* it can cause undefined, bizarre behavior in the tree. To prevent this,
|
|
385
|
-
* we destroy the tree and throw an error instead. This helps protect
|
|
386
|
-
* the end-user's data from corruption. */
|
|
387
|
-
this.furthestAncestor().destroy();
|
|
388
|
-
return this.treeNodeBase.handleUserlandError(error);
|
|
389
|
-
}
|
|
390
|
-
indexIsOutOfRange(parent, index) {
|
|
391
|
-
return index < 0 || index > parent.branches().length;
|
|
392
|
-
}
|
|
393
|
-
furthestAncestor() {
|
|
394
|
-
// eslint-disable-next-line typescript/no-this-alias -- This code is for an iteration, not to make `this` available in other scopes (which is what the rule is intended to protect against).
|
|
395
|
-
let node = this;
|
|
396
|
-
while (node instanceof TreeBranch) {
|
|
397
|
-
const parent = node.parent();
|
|
398
|
-
if (parent === undefined)
|
|
399
|
-
break;
|
|
400
|
-
node = parent;
|
|
401
|
-
}
|
|
402
|
-
return node;
|
|
403
|
-
}
|
|
404
|
-
reattachView(index) {
|
|
405
|
-
assert(this._parent !== undefined);
|
|
406
|
-
assert(this.detachedView !== null);
|
|
407
|
-
const container = this._parent.getBranchesContainer();
|
|
408
|
-
assert(container !== undefined);
|
|
409
|
-
this.detachedView.reattach();
|
|
410
|
-
container.insert(this.detachedView, index);
|
|
411
|
-
this.detachedView = null;
|
|
412
|
-
this.setIndentation();
|
|
413
|
-
}
|
|
414
|
-
setIndentation() {
|
|
415
|
-
assert(this._parent !== undefined);
|
|
416
|
-
const root = this._parent.root();
|
|
417
|
-
if (root === undefined) {
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
const options = config.getConfig(root);
|
|
421
|
-
const branchesContainerEl = this.branchController
|
|
422
|
-
.getNativeElement()
|
|
423
|
-
.getElementsByClassName("branches-container")
|
|
424
|
-
.item(0);
|
|
425
|
-
assert(branchesContainerEl instanceof HTMLElement);
|
|
426
|
-
branchesContainerEl.style.marginLeft = `${options?.indentation ?? 16}px`;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1icmFuY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1icmFuY2gvdHJlZS1icmFuY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixVQUFVLEVBRVosTUFBTSxjQUFjLENBQUM7QUFFdEI7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQVFwQixZQUNHLE1BQW1DLEVBQ25CLGFBQW1EO1FBQW5ELGtCQUFhLEdBQWIsYUFBYSxDQUFzQztRQU45RCxpQkFBWSxHQUFtQixJQUFJLENBQUM7UUFRekMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUQsTUFBTSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUN6QyxJQUFJLEVBQ0osdUJBQXVCLENBQ3pCLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckQsSUFDRyxNQUFNLFlBQVksVUFBVTtZQUM1QixNQUFNLENBQUMsYUFBYSxDQUFDLGdCQUFnQixLQUFLLElBQUksRUFDL0MsQ0FBQztZQUNBLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTCx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FDVixJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDcEIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTTthQUN2QyxDQUFDLENBQ0osQ0FBQztZQUNGLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxpRkFBaUY7SUFDMUUsUUFBUTtRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE9BQU87UUFDWCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxTQUFTLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtEQUFrRDtJQUMzQyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksUUFBUSxDQUFDLEtBQW1DO1FBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTTtRQUNWLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLEtBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQseUVBQXlFO0lBQ2xFLG9CQUFvQjtRQUN4QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxTQUFTLENBQ2hCLDREQUE0RCxDQUM5RCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELCtFQUErRTtJQUN4RSxvQkFBb0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksU0FBUyxDQUNoQiw0REFBNEQsQ0FDOUQsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCxzRUFBc0U7SUFDL0QsV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLFNBQVMsQ0FDaEIsNkRBQTZELENBQy9ELENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELDREQUE0RDtJQUNyRCxnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksU0FBUyxDQUNoQix3REFBd0QsQ0FDMUQsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksdUJBQXVCO1FBRzNCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLFNBQVMsQ0FDaEIsNERBQTRELENBQzlELENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSSxPQUFPLENBQ1gsU0FBc0MsRUFDdEMsS0FBYztRQUVkLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDekIsTUFBTSxRQUFRLEdBQUcsS0FBSyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUNWLElBQUksVUFBVSxDQUFDLElBQUksRUFBRTtZQUNsQixNQUFNLEVBQUUsU0FBUztZQUNqQixLQUFLLEVBQUUsSUFBSTtZQUNYLEtBQUssRUFBRSxRQUFRO1NBQ2pCLENBQUMsQ0FDSixDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLElBQUksQ0FDUixTQUFrQyxFQUNsQyxPQUEwQztRQUUxQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxTQUFTLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0YsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksS0FBSztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxTQUFTLENBQUM7UUFDcEIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ3RCLFFBQVEsRUFBRTthQUNWLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkIsT0FBTyxLQUFLLENBQUM7SUFDaEIsQ0FBQztJQUVELG9FQUFvRTtJQUM3RCxXQUFXO1FBQ2YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksSUFBSTtRQUNSLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU07UUFDVixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7SUFDSSxJQUFJO1FBQ1IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSSxRQUFRO1FBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxTQUFTLENBQ2hCLHNEQUFzRCxDQUN4RCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sWUFBWSxVQUFVLEVBQUUsQ0FBQztZQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxHQUFHLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FDVixJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDbEIsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsSUFBSTtZQUNYLEtBQUssRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUNKLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksSUFBSTtRQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLE1BQU0sWUFBWSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sWUFBWSxRQUFRLElBQUksTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sTUFBTSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVEsQ0FDWixRQUF1RDtRQUV2RCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sMEJBQTBCLENBQy9CLFNBQXNDLEVBQ3RDLEtBQWM7UUFFZCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksU0FBUyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELElBQ0csT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUN6QyxDQUFDO1lBQ0EsTUFBTSxJQUFJLFNBQVMsQ0FDaEIsZ0NBQWdDLEtBQUssK0JBQStCLENBQ3RFLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3BCLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksU0FBUyxDQUNoQiwrREFBK0QsQ0FDakUsQ0FBQztZQUNMLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFjO1FBQ3ZDOzs7a0RBRzBDO1FBQzFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8saUJBQWlCLENBQ3RCLE1BQW1DLEVBQ25DLEtBQWE7UUFFYixPQUFPLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDeEQsQ0FBQztJQUVPLGdCQUFnQjtRQUNyQiw0TEFBNEw7UUFDNUwsSUFBSSxJQUFJLEdBQWdDLElBQUksQ0FBQztRQUM3QyxPQUFPLElBQUksWUFBWSxVQUFVLEVBQUUsQ0FBQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxNQUFNLEtBQUssU0FBUztnQkFBRSxNQUFNO1lBQ2hDLElBQUksR0FBRyxNQUFNLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2YsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFjO1FBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN0RCxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sY0FBYztRQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQkFBZ0I7YUFDN0MsZ0JBQWdCLEVBQUU7YUFDbEIsc0JBQXNCLENBQUMsb0JBQW9CLENBQUM7YUFDNUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osTUFBTSxDQUFDLG1CQUFtQixZQUFZLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQzVFLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWRcIjtcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gICBDb21wb25lbnRSZWYsXG4gICBUeXBlLFxuICAgVmlld0NvbnRhaW5lclJlZixcbiAgIFZpZXdSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJyYW5jaENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBUcmVlRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBkcm9wem9uZVJlbmRlcmVyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9kcmFnLWFuZC1kcm9wXCI7XG5pbXBvcnQgeyBUcmVlUm9vdCB9IGZyb20gXCIuLi90cmVlLXJvb3RcIjtcbmltcG9ydCB0eXBlIHsgVHJlZU5vZGUgfSBmcm9tIFwiLi4vdHJlZS1ub2RlLmludGVyZmFjZVwiO1xuaW1wb3J0IHR5cGUgeyBUcmVlUGxvdCB9IGZyb20gXCIuLi90cmVlLXBsb3QuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBUcmVlTm9kZUJhc2UgfSBmcm9tIFwiLi4vdHJlZS1ub2RlLWJhc2VcIjtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCIuLi9jb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7XG4gICBCcmFuY2hPcHRpb25zLFxuICAgRnVsbEJyYW5jaE9wdGlvbnNcbn0gZnJvbSBcIi4uL2JyYW5jaC1vcHRpb25zLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQnJhbmNoQ29udHJvbGxlciB9IGZyb20gXCIuL2JyYW5jaC1jb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEdyYWZ0YWJsZSB9IGZyb20gXCIuL2dyYWZ0YWJsZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IHRyZWVDb2xsYXBzZXIgfSBmcm9tIFwiLi4vLi4vZXh0cmFzL2NvbGxhcHNlXCI7XG5pbXBvcnQge1xuICAgRGVzdHJ1Y3Rpb25FdmVudCxcbiAgIEdyYWZ0RXZlbnQsXG4gICBQcnVuZUV2ZW50LFxuICAgdHlwZSBUcmVlRXZlbnRcbn0gZnJvbSBcIi4uLy4uL2V2ZW50c1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIHN0YW5kYXJkIG5vZGUgaW4gYSB0cmVlLiBSZW5kZXJzIGEgQnJhbmNoQ29tcG9uZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGNsYXNzIHJlbmRlcnMgYSBicmFuY2ggY29tcG9uZW50LCB3aGljaCBkb2VzIHRoZSBmb2xsb3dpbmc6XG4gKiAxLiBSZW5kZXJzIGEgY29tcG9uZW50IHByb3ZpZGVkIGJ5IHRoZSB1c2VyXG4gKiAyLiBQcm92aWRlcyBhIGNvbnRhaW5lciBpbiB3aGljaCBjaGlsZCBicmFuY2hlcyBtYXkgYmUgcmVuZGVyZWRcbiAqIDMuIENvbnRhaW5zIHR3byBEcm9wem9uZXM6IG9uZSBmb3IgZHJvcHBpbmcgYnJhbmNoZXMgYmVsb3cgdGhpcyBicmFuY2ggKGFzIGFcbiAqIHNpYmxpbmcpLCBhbmQgb25lIGZvciBkcm9wcGluZyBicmFuY2hlcyBhcyBhIGZpcnN0IGNoaWxkIG9mIHRoaXMgYnJhbmNoLlxuICovXG5leHBvcnQgY2xhc3MgVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD5cbiAgIGltcGxlbWVudHMgVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+LCBHcmFmdGFibGU8VXNlcmxhbmRDb21wb25lbnQ+XG57XG4gICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaENvbnRyb2xsZXI6IEJyYW5jaENvbnRyb2xsZXI8VXNlcmxhbmRDb21wb25lbnQ+O1xuICAgcHJpdmF0ZSBkZXRhY2hlZFZpZXc6IFZpZXdSZWYgfCBudWxsID0gbnVsbDtcbiAgIHByaXZhdGUgX3BhcmVudDogVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+IHwgdW5kZWZpbmVkO1xuICAgcHJpdmF0ZSByZWFkb25seSB0cmVlTm9kZUJhc2U6IFRyZWVOb2RlQmFzZTxVc2VybGFuZENvbXBvbmVudD47XG5cbiAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgIHBhcmVudDogVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+LFxuICAgICAgcHVibGljIHJlYWRvbmx5IGJyYW5jaE9wdGlvbnM6IEZ1bGxCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKSB7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZSA9IG5ldyBUcmVlTm9kZUJhc2UoKTtcbiAgICAgIGNvbnN0IHBhcmVudEJyYW5jaGVzQ29udGFpbmVyID0gcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQocGFyZW50QnJhbmNoZXNDb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIgPSBuZXcgQnJhbmNoQ29udHJvbGxlcihcbiAgICAgICAgIHRoaXMsXG4gICAgICAgICBwYXJlbnRCcmFuY2hlc0NvbnRhaW5lclxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhvc3RWaWV3ID0gdGhpcy5icmFuY2hDb250cm9sbGVyLmdldEhvc3RWaWV3KCk7XG4gICAgICBpZiAoXG4gICAgICAgICBwYXJlbnQgaW5zdGFuY2VvZiBUcmVlQnJhbmNoICYmXG4gICAgICAgICBwYXJlbnQuYnJhbmNoT3B0aW9ucy5kZWZhdWx0Q29sbGFwc2VkID09PSB0cnVlXG4gICAgICApIHtcbiAgICAgICAgIHRyZWVDb2xsYXBzZXIuc3RvcmVQcmVjb2xsYXBzZWROb2RlKHBhcmVudCwgdGhpcyk7XG4gICAgICAgICB0aGlzLmRldGFjaGVkVmlldyA9IGhvc3RWaWV3O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHBhcmVudEJyYW5jaGVzQ29udGFpbmVyLmluc2VydChob3N0Vmlldyk7XG4gICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgICAgbmV3IEdyYWZ0RXZlbnQodGhpcywge1xuICAgICAgICAgICAgICAgcGFyZW50OiB0aGlzLl9wYXJlbnQsXG4gICAgICAgICAgICAgICBjaGlsZDogdGhpcyxcbiAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLl9wYXJlbnQuYnJhbmNoZXMoKS5sZW5ndGhcbiAgICAgICAgICAgIH0pXG4gICAgICAgICApO1xuICAgICAgICAgdGhpcy5zZXRJbmRlbnRhdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICB9XG5cbiAgIC8qKiBAcmV0dXJucyBBbGwgY2hpbGQgYnJhbmNoZXMgYXMgYW4gYXJyYXkgb2YgVHJlZUJyYW5jaCBpbnN0YW5jZXMsIGluIG9yZGVyLiAqL1xuICAgcHVibGljIGJyYW5jaGVzKCk6IEFycmF5PFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmVlTm9kZUJhc2UuYnJhbmNoZXMoKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBSZWN1cnNpdmVseSBkZXN0cm95cyBhbGwgZGVzY2VuZGFudCBicmFuY2hlcywgYXMgd2VsbCBhcyBpdHNlbGYuIFRoaXNcbiAgICAqIHJlbGVhc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBvciBjb25zdW1lZCBieSB0aGlzIGJyYW5jaCBhbmQgaXRzIGRlc2NlbmRhbnRzLlxuICAgICpcbiAgICAqIEByZW1hcmtzXG4gICAgKiBJdCBpcyBpbXBvcnRhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIGEgYnJhbmNoIGlzIGRpc2NhcmRlZCwgb3RoZXJ3aXNlXG4gICAgKiB0aGUgYnJhbmNoIHdpbGwgcmVtYWluIGluIG1lbW9yeSBhbmQgY29udGludWUgdG8gY29uc3VtZSByZXNvdXJjZXMuXG4gICAgKi9cbiAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBkZXN0cm95IGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5wcnVuZSgpO1xuICAgICAgdHJlZUNvbGxhcHNlci5leHBhbmQodGhpcyk7XG4gICAgICBkcm9wem9uZVJlbmRlcmVyLmNsZWFyVHJlZUZyb21SZWdpc3RyeSh0aGlzKTtcbiAgICAgIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudHJlZU5vZGVCYXNlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuYnJhbmNoQ29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoKG5ldyBEZXN0cnVjdGlvbkV2ZW50KHRoaXMpKTtcbiAgIH1cblxuICAgLyoqIFJ1biBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhpcyBicmFuY2ggKi9cbiAgIHB1YmxpYyBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgdGhpcy5icmFuY2hDb250cm9sbGVyLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBFbWl0cyB0aGUgc3BlY2lmaWVkIFRyZWVFdmVudC5cbiAgICAqXG4gICAgKiBAcmVtYXJrc1xuICAgICogQ2F1dGlvbjogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hbnVhbGx5IGVtaXQgVHJlZUV2ZW50cyB0aGF0IGFyZSBhbHJlYWR5XG4gICAgKiBwcm92aWRlZCBieSB0aGUgbGlicmFyeS4gRm9yIGV4YW1wbGUsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBlbWl0IGFcbiAgICAqIGBHcmFmdEV2ZW50YCwgYERlc3RydWN0aW9uRXZlbnRgLCBldGMuIFRoZXNlIGV2ZW50cyBtYXkgYmUgdXNlZCBieSB0aGUgdHJlZSxcbiAgICAqIGFuZCBlbWl0dGluZyB0aGVtIG1hbnVhbGx5IG1heSBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yLiBJbnN0ZWFkLCB3ZVxuICAgICogcmVjb21tZW5kIGltcGxlbWVudGluZyB0aGUgVHJlZUV2ZW50IGludGVyZmFjZSB3aXRoIHlvdXIgb3duIGN1c3RvbSBldmVudHNcbiAgICAqIGFuZCBkaXNwYXRjaGluZyB0aG9zZS5cbiAgICAqXG4gICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgVHJlZUV2ZW50IHRoYXQgd2lsbCBiZSBlbWl0dGVkLlxuICAgICovXG4gICBwdWJsaWMgZGlzcGF0Y2goZXZlbnQ6IFRyZWVFdmVudDxVc2VybGFuZENvbXBvbmVudD4pOiB2b2lkIHtcbiAgICAgIHRoaXMudHJlZU5vZGVCYXNlLmRpc3BhdGNoKGV2ZW50KTtcbiAgICAgIHRoaXMuX3BhcmVudD8uZGlzcGF0Y2goZXZlbnQpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEByZXR1cm5zXG4gICAgKiBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgVHJlZUV2ZW50cyB3aGVuZXZlciBhbiBldmVudCBpcyBkaXNwYXRjaGVkXG4gICAgKiBpbiB0aGlzIGJyYW5jaCBvciBhbnkgb2YgaXRzIGRlc2NlbmRhbnQgYnJhbmNoZXMuXG4gICAgKi9cbiAgIHB1YmxpYyBldmVudHMoKTogT2JzZXJ2YWJsZTxUcmVlRXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmVlTm9kZUJhc2UuZXZlbnRzKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBjaGlsZCBicmFuY2ggdG8gcmV0cmlldmUuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIFRoZSBjaGlsZCBicmFuY2ggYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzXG4gICAgKiBubyBjaGlsZCBicmFuY2ggYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAqL1xuICAgcHVibGljIGdldEJyYW5jaChpbmRleDogbnVtYmVyKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmdldEJyYW5jaChpbmRleCk7XG4gICB9XG5cbiAgIC8qKiBAcmV0dXJucyBUaGUgVmlld0NvbnRhaW5lclJlZiBpbiB3aGljaCBjaGlsZCBicmFuY2hlcyBhcmUgcmVuZGVyZWQgKi9cbiAgIHB1YmxpYyBnZXRCcmFuY2hlc0NvbnRhaW5lcigpOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgYnJhbmNoZXMgY29udGFpbmVyIGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0QnJhbmNoZXNDb250YWluZXIoKTtcbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBvZiBCcmFuY2hDb21wb25lbnQgdGhhdCBpcyByZW5kZXJlZCBieSB0aGlzIGNsYXNzLiAqL1xuICAgcHVibGljIGdldENvbXBvbmVudEluc3RhbmNlKCk6IEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGdldCBjb21wb25lbnQgaW5zdGFuY2UgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgVGhlIEhvc3QgVmlldyBpbiB3aGljaCB0aGUgQnJhbmNoQ29tcG9uZW50IGlzIHJlbmRlcmVkICovXG4gICBwdWJsaWMgZ2V0SG9zdFZpZXcoKTogVmlld1JlZiB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IGNvbXBvbmVudCBob3N0IHZpZXcgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgVGhlIEJyYW5jaENvbXBvbmVudCBhcyBhIG5hdGl2ZSBIVE1MIEVsZW1lbnQgKi9cbiAgIHB1YmxpYyBnZXROYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgbmF0aXZlIGVsZW1lbnQgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXROYXRpdmVFbGVtZW50KCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHJldHVybnNcbiAgICAqIEEgQ29tcG9uZW50UmVmIGNvbnRhaW5pbmcgdGhlIGluc3RhbmNlIG9mIHRoZSB1c2VyLXByb3ZpZGVkXG4gICAgKiBjb21wb25lbnQgd2hpY2ggaXMgcmVuZGVyZWQgYnkgdGhpcyBicmFuY2guXG4gICAgKi9cbiAgIHB1YmxpYyBnZXRVc2VybGFuZENvbXBvbmVudFJlZigpOlxuICAgICAgfCBDb21wb25lbnRSZWY8VXNlcmxhbmRDb21wb25lbnQ+XG4gICAgICB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IHVzZXJsYW5kIGNvbXBvbmVudCBmcm9tIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCJcbiAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5icmFuY2hDb250cm9sbGVyLmdldFVzZXJsYW5kQ29tcG9uZW50UmVmKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQXR0YWNoZXMgYSBicmFuY2ggdG8gYSBuZXcgcGFyZW50IG5vZGUuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIElmIG5vdCBhbHJlYWR5IHBydW5lZCwgdGhpcyBtZXRob2QgcHJ1bmVzIChyZW1vdmVzKSB0aGlzIGJyYW5jaCBmcm9tIGl0c1xuICAgICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdHJlZTsgdGhlbiBncmFmdHMgKHJlYXR0YWNoZXMpIGl0IGFzIGEgY2hpbGQgb2YgdGhlXG4gICAgKiBzcGVjaWZpZWQgcGFyZW50IGJyYW5jaCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBubyBpbmRleCBpcyBzcGVjaWZpZWQsXG4gICAgKiB0aGUgYnJhbmNoIGlzIGFwcGVuZGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBwYXJlbnQuIFRoaXMgY2F1c2VzIHRoaXNcbiAgICAqIGJyYW5jaCdzIGFzc29jaWF0ZWQgQnJhbmNoQ29tcG9uZW50IHRvIGJlIHJlLXJlbmRlcmVkIGluIHRoZSBET00gYXQgdGhlXG4gICAgKiBuZXcgbG9jYXRpb24uXG4gICAgKlxuICAgICogQHBhcmFtIG5ld1BhcmVudCAtIFRoZSBuZXcgcGFyZW50IGJyYW5jaCB1bnRvIHdoaWNoIHRoaXMgYnJhbmNoIHdpbGwgYmUgZ3JhZnRlZC5cbiAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBhdCB3aGljaCB0aGlzIGJyYW5jaCB3aWxsIGJlIGdyYWZ0ZWQuIElmIG5vdCBzcGVjaWZpZWQsXG4gICAgKiB0aGlzIGJyYW5jaCB3aWxsIGJlIGFwcGVuZGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBuZXcgcGFyZW50LlxuICAgICpcbiAgICAqIEByZXR1cm5zIFRoZSBpbmRleCBhdCB3aGljaCB0aGlzIGJyYW5jaCB3YXMgZ3JhZnRlZC5cbiAgICAqL1xuICAgcHVibGljIGdyYWZ0VG8oXG4gICAgICBuZXdQYXJlbnQ6IFRyZWVOb2RlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIGluZGV4PzogbnVtYmVyXG4gICApOiBudW1iZXIge1xuICAgICAgdGhpcy5jaGVja0dyYWZ0TG9jYXRpb25WYWxpZGl0eShuZXdQYXJlbnQsIGluZGV4KTtcbiAgICAgIGNvbnN0IG93bkluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgaWYgKG93bkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMucHJ1bmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BhcmVudCA9IG5ld1BhcmVudDtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gaW5kZXggPz8gbmV3UGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoO1xuICAgICAgdGhpcy5yZWF0dGFjaFZpZXcobmV3SW5kZXgpO1xuICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgIG5ldyBHcmFmdEV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgIHBhcmVudDogbmV3UGFyZW50LFxuICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICBpbmRleDogbmV3SW5kZXhcbiAgICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgfVxuXG4gICAvKipcbiAgICAqIEFwcGVuZHMgYSBuZXcgY2hpbGQgYnJhbmNoIHRvIHRoaXMgYnJhbmNoLiBUaGUgY2hpbGQgYnJhbmNoIHdpbGwgcmVuZGVyXG4gICAgKiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIChvcHRpb25hbCkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXG4gICAgKlxuICAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdG8gcmVuZGVyIGluIHRoZSBuZXcgY2hpbGQgYnJhbmNoLlxuICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBuZXcgY2hpbGQgYnJhbmNoLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgbmV3bHktY3JlYXRlZCBjaGlsZCBicmFuY2guXG4gICAgKi9cbiAgIHB1YmxpYyBncm93KFxuICAgICAgY29tcG9uZW50OiBUeXBlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIG9wdGlvbnM/OiBCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBncm93IGEgYnJhbmNoIG9uIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgIHJldHVybiBuZXcgVHJlZUJyYW5jaCh0aGlzLCB7IGNvbXBvbmVudCwgLi4ub3B0aW9ucyB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICB0aHJvdyB0aGlzLmhhbmRsZVVzZXJsYW5kRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgfVxuXG4gICAvKipcbiAgICAqIERldGVybWluZXMgdGhpcyBicmFuY2gncyBpbmRleCBpbiByZWxhdGlvbiB0byBpdHMgc2libGluZyBicmFuY2hlcy5cbiAgICAqXG4gICAgKiBAcmVtYXJrc1xuICAgICogRm9yIGV4YW1wbGUsIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuICAgICogMC4gSWYgaXQgaXMgdGhlIHNlY29uZCBjaGlsZCBvZiBpdHMgcGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAxLlxuICAgICpcbiAgICAqIElmIHRoaXMgYnJhbmNoIGhhcyBubyBwYXJlbnQsIChlZywgaWYgdGhpcyBicmFuY2ggaGFzIGJlZW4gcHJ1bmVkKSB0aGlzXG4gICAgKiBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgaW5kZXggb2YgdGhpcyBicmFuY2ggaW4gcmVsYXRpb24gdG8gaXRzIHNpYmxpbmcgYnJhbmNoZXMsIG9yIHVuZGVmaW5lZC5cbiAgICAqL1xuICAgcHVibGljIGluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fcGFyZW50XG4gICAgICAgICAuYnJhbmNoZXMoKVxuICAgICAgICAgLmZpbmRJbmRleCgoYnJhbmNoKSA9PiBicmFuY2ggPT09IHRoaXMpO1xuICAgICAgYXNzZXJ0KGluZGV4ID49IDApO1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgYHRydWVgIGlmIHRoZSBicmFuY2ggaXMgZGVzdHJveWVkLCBgZmFsc2VgIG90aGVyd2lzZSAqL1xuICAgcHVibGljIGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmlzRGVzdHJveWVkKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHJldHVybnNcbiAgICAqIFRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBgYnJhbmNoT3B0aW9uc2AnIGBtZXRhYCBwcm9wZXJ0eVxuICAgICogYXQgY29uc3RydWN0aW9uLlxuICAgICovXG4gICBwdWJsaWMgbWV0YSgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaE9wdGlvbnMubWV0YSA/PyB7fTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhpcyBicmFuY2gncyBwYXJlbnQgbm9kZSAod2hpY2ggbWF5IGJlIGEgVHJlZUJyYW5jaCBvciBUcmVlUm9vdCkuXG4gICAgKiBJZiB0aGlzIGJyYW5jaCBoYXMgbm8gcGFyZW50LCAoZWcsIGlmIHRoaXMgYnJhbmNoIGhhcyBiZWVuIHBydW5lZCkgdGhpc1xuICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAqL1xuICAgcHVibGljIHBhcmVudCgpOiBUcmVlTm9kZTxVc2VybGFuZENvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBQcm92aWRlcyBhIG1vZGVsIGRlc2NyaWJpbmcgdGhpcyBicmFuY2gncyBkZXNjZW5kYW50cy5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogQSBtdWx0aS1kaW1lbnNpb25hbCBNYXAgd2hpY2ggZGVzY3JpYmVzIHRoZSBzaGFwZSBvZiB0aGlzIGJyYW5jaCdzXG4gICAgKiBkZXNjZW5kYW50cy5cbiAgICAqXG4gICAgKiBAZXhhbXBsZVxuICAgICogQSBicmFuY2ggd2l0aCBubyBjaGlsZHJlbiB3aWxsIHJldHVybiBhbiBlbXB0eSBNYXAuIEEgYnJhbmNoIHdpdGhcbiAgICAqIGEgc2luZ2xlIGNoaWxkIHdpbGwgcmV0dXJuIGEgTWFwIHdpdGggYSBzaW5nbGUgZW50cnksIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGluZGV4XG4gICAgKiBvZiB0aGUgYnJhbmNoICh6ZXJvKSBhbmQgdGhlIHZhbHVlIGlzIGFuIGVtcHR5IE1hcC4gQSBUcmVlIGxpa2UgdGhpczpcbiAgICAqXG4gICAgKiBgYGBcbiAgICAqICAgICAgICAgLS0tQnJhbmNoLS0tLS0tLUJyYW5jaFxuICAgICogICAgICAgIC9cbiAgICAqIEJyYW5jaC0tLS0tLS1CcmFuY2hcbiAgICAqICAgICAgICBcXFxuICAgICogICAgICAgICAtLS1CcmFuY2hcbiAgICAqIGBgYFxuICAgICogV2lsbCByZXR1cm4gYSBNYXAgb2YgbWF0Y2hpbmcgc2hhcGU6XG4gICAgKiBgYGBcbiAgICAqIE1hcCB7XG4gICAgKiAgICAwOiBNYXAgeyAwOiBNYXAge319LFxuICAgICogICAgMTogTWFwIHt9LFxuICAgICogICAgMjogTWFwIHt9XG4gICAgKiB9XG4gICAgKiBgYGBcbiAgICAqL1xuICAgcHVibGljIHBsb3QoKTogVHJlZVBsb3Qge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLnBsb3QoKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDYWxjdWxhdGVzIHRoZSBicmFuY2gncyBwb3NpdGlvbiBpbiB0aGUgdHJlZSByZWxhdGl2ZSB0byB0aGUgUm9vdC5cbiAgICAqXG4gICAgKiBAcmVtYXJrc1xuICAgICogVGhlIHBvc2l0aW9uIGlzIGRlc2NyaWJlZCBhcyBhbiBhcnJheSBvZiBudW1iZXJzLCB3aGVyZSBlYWNoIG51bWJlclxuICAgICogcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgdGhlIGJyYW5jaCBhdCB0aGF0IGxldmVsIG9mIHRoZSB0cmVlLlxuICAgICpcbiAgICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGJyYW5jaCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIFJvb3QsIHRoaXMgbWV0aG9kXG4gICAgKiB3aWxsIHJldHVybiBbMF0uIElmIHRoaXMgYnJhbmNoIGlzIHRoZSBzZWNvbmQgY2hpbGQgb2YgdGhlIGZpcnN0IGNoaWxkXG4gICAgKiBvZiB0aGUgUm9vdCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gWzAsIDFdLlxuICAgICpcbiAgICAqIElmIHRoZSBicmFuY2ggaXMgbm90IHJlbGF0ZWQgdG8gYSBUcmVlUm9vdCwgKHN1Y2ggYXMgd2hlbiBpdCBoYXMgYmVlblxuICAgICogcHJ1bmVkLCkgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogQW4gYXJyYXkgb2YgbnVtYmVycyB3aGljaCBkZXNjcmliZSB0aGUgYnJhbmNoJ3MgcG9zaXRpb24gaW4gdGhlIHRyZWVcbiAgICAqIHJlbGF0aXZlIHRvIHRoZSBSb290LlxuICAgICovXG4gICBwdWJsaWMgcG9zaXRpb24oKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgoKTtcbiAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJicmFuY2ggaGFzIG5vIHBhcmVudC4gUG9zaXRpb24gY2Fubm90IGJlIGRldGVybWluZWQuXCJcbiAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgVHJlZUJyYW5jaCkge1xuICAgICAgICAgY29uc3QgcGFyZW50UG9zaXRpb24gPSB0aGlzLl9wYXJlbnQucG9zaXRpb24oKTtcbiAgICAgICAgIHJldHVybiBbLi4ucGFyZW50UG9zaXRpb24sIGluZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbaW5kZXhdO1xuICAgfVxuXG4gICAvKipcbiAgICAqIFJlbW92ZXMgYSBicmFuY2ggZnJvbSBpdHMgdHJlZSB3aXRob3V0IGRlc3Ryb3lpbmcgaXQuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIFJlbW92ZXMgdGhpcyBicmFuY2ggZnJvbSBpdHMgcGFyZW50IGFuZCBkZXRhY2hlcyBpdHMgYXNzb2NpYXRlZFxuICAgICogQnJhbmNoQ29tcG9uZW50IGZyb20gdGhlIERPTS4gVGhpcyBwdXRzIHRoZSBicmFuY2ggaW4gYSBcInBydW5lZFwiIHN0YXRlLFxuICAgICogd2hpY2ggbWF5IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2Ygb3RoZXIgbWV0aG9kcy5cbiAgICAqXG4gICAgKiBBIHBydW5lZCBicmFuY2ggY2FuIGJlIHJlYXR0YWNoZWQgdG8gYW55IG90aGVyIG5vZGUgdXNpbmcgdGhlIGBncmFmdFRvYCBtZXRob2QuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIEl0c2VsZiwgb3IgdW5kZWZpbmVkIGlmIGl0IGlzIGFscmVhZHkgaW4gYSBwcnVuZWQgc3RhdGUuXG4gICAgKi9cbiAgIHB1YmxpYyBwcnVuZSgpOiB0aGlzIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgcHJ1bmUgYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgoKTtcbiAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQoY29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBjb250YWluZXIuZGV0YWNoKGluZGV4KTtcbiAgICAgIGFzc2VydCh0aGlzLmRldGFjaGVkVmlldyAhPT0gbnVsbCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldy5kZXRhY2goKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICBuZXcgUHJ1bmVFdmVudCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICAgIGNoaWxkOiB0aGlzLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byB3aGljaCB0aGlzIEJyYW5jaCBpcyBhdHRhY2hlZC5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhlIFRyZWVSb290IG9mIHRoZSB0cmVlIHRoaXMgYnJhbmNoIGlzIGluLiBJZiB0aGlzIGJyYW5jaCBpc1xuICAgICogZG9lcyBub3QgaGF2ZSBhIHJvb3QgKHN1Y2ggYXMgd2hlbiBpdCBoYXMgYmVlbiBwcnVuZWQpIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAqIHJldHVybiB1bmRlZmluZWQuXG4gICAgKi9cbiAgIHB1YmxpYyByb290KCk6IFRyZWVSb290PFVzZXJsYW5kQ29tcG9uZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIHJldHVybiBwYXJlbnQucm9vdCgpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHBhcmVudCBpbnN0YW5jZW9mIFRyZWVSb290IHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICB9XG5cbiAgIC8qKlxuICAgICogVHJhdmVyc2VzIHRoaXMgYnJhbmNoJ3MgZGVzY2VuZGFudHMgaW4gZGVwdGgtZmlyc3QgcHJlLW9yZGVyLCBleGVjdXRpbmdcbiAgICAqIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIG5vZGUuIFRyYXZlcnNhbCBpbmNsdWRlcyB0aGlzIGJyYW5jaC5cbiAgICAqXG4gICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBub2RlLlxuICAgICovXG4gICBwdWJsaWMgdHJhdmVyc2UoXG4gICAgICBjYWxsYmFjazogKG5vZGU6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+KSA9PiB2b2lkXG4gICApOiB2b2lkIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UudHJhdmVyc2UoY2FsbGJhY2spO1xuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrR3JhZnRMb2NhdGlvblZhbGlkaXR5KFxuICAgICAgbmV3UGFyZW50OiBUcmVlTm9kZTxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICBpbmRleD86IG51bWJlclxuICAgKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IGdyYWZ0IGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1BhcmVudC5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IGdyYWZ0IHRvIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICB0aGlzLmluZGV4SXNPdXRPZlJhbmdlKG5ld1BhcmVudCwgaW5kZXgpXG4gICAgICApIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGdyYWZ0IGJyYW5jaCBhdCBpbmRleCAke2luZGV4fSBvZiB0aGUgcGFyZW50LiBPdXQgb2YgcmFuZ2UuYFxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJhdmVyc2UoKG5vZGUpID0+IHtcbiAgICAgICAgIGlmIChub2RlID09PSBuZXdQYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICAgICBcIkNhbm5vdCBncmFmdCBhIGJyYW5jaCB0byBpdHNlbGYgb3IgYW55IG9mIGl0cyBvd24gZGVzY2VuZGFudHNcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgfVxuXG4gICBwcml2YXRlIGhhbmRsZVVzZXJsYW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBFcnJvciB7XG4gICAgICAvKiBXaGVuIGFuIGVycm9yIG9jY3VycyBpbiBhIHVzZXJsYW5kIGNvbXBvbmVudCBkdXJpbmcgYSB0cmVlIG9wZXJhdGlvbixcbiAgICAgICAqIGl0IGNhbiBjYXVzZSB1bmRlZmluZWQsIGJpemFycmUgYmVoYXZpb3IgaW4gdGhlIHRyZWUuIFRvIHByZXZlbnQgdGhpcyxcbiAgICAgICAqIHdlIGRlc3Ryb3kgdGhlIHRyZWUgYW5kIHRocm93IGFuIGVycm9yIGluc3RlYWQuIFRoaXMgaGVscHMgcHJvdGVjdFxuICAgICAgICogdGhlIGVuZC11c2VyJ3MgZGF0YSBmcm9tIGNvcnJ1cHRpb24uICovXG4gICAgICB0aGlzLmZ1cnRoZXN0QW5jZXN0b3IoKS5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdGhpcy50cmVlTm9kZUJhc2UuaGFuZGxlVXNlcmxhbmRFcnJvcihlcnJvcik7XG4gICB9XG5cbiAgIHByaXZhdGUgaW5kZXhJc091dE9mUmFuZ2UoXG4gICAgICBwYXJlbnQ6IFRyZWVOb2RlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIGluZGV4OiBudW1iZXJcbiAgICk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGluZGV4IDwgMCB8fCBpbmRleCA+IHBhcmVudC5icmFuY2hlcygpLmxlbmd0aDtcbiAgIH1cblxuICAgcHJpdmF0ZSBmdXJ0aGVzdEFuY2VzdG9yKCk6IFRyZWVOb2RlPFVzZXJsYW5kQ29tcG9uZW50PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby10aGlzLWFsaWFzIC0tIFRoaXMgY29kZSBpcyBmb3IgYW4gaXRlcmF0aW9uLCBub3QgdG8gbWFrZSBgdGhpc2AgYXZhaWxhYmxlIGluIG90aGVyIHNjb3BlcyAod2hpY2ggaXMgd2hhdCB0aGUgcnVsZSBpcyBpbnRlbmRlZCB0byBwcm90ZWN0IGFnYWluc3QpLlxuICAgICAgbGV0IG5vZGU6IFRyZWVOb2RlPFVzZXJsYW5kQ29tcG9uZW50PiA9IHRoaXM7XG4gICAgICB3aGlsZSAobm9kZSBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50KCk7XG4gICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgfVxuXG4gICBwcml2YXRlIHJlYXR0YWNoVmlldyhpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgICAgYXNzZXJ0KHRoaXMuX3BhcmVudCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydCh0aGlzLmRldGFjaGVkVmlldyAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9wYXJlbnQuZ2V0QnJhbmNoZXNDb250YWluZXIoKTtcbiAgICAgIGFzc2VydChjb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldy5yZWF0dGFjaCgpO1xuICAgICAgY29udGFpbmVyLmluc2VydCh0aGlzLmRldGFjaGVkVmlldywgaW5kZXgpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBudWxsO1xuICAgICAgdGhpcy5zZXRJbmRlbnRhdGlvbigpO1xuICAgfVxuXG4gICBwcml2YXRlIHNldEluZGVudGF0aW9uKCk6IHZvaWQge1xuICAgICAgYXNzZXJ0KHRoaXMuX3BhcmVudCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9wYXJlbnQucm9vdCgpO1xuICAgICAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5nZXRDb25maWcocm9vdCk7XG4gICAgICBjb25zdCBicmFuY2hlc0NvbnRhaW5lckVsID0gdGhpcy5icmFuY2hDb250cm9sbGVyXG4gICAgICAgICAuZ2V0TmF0aXZlRWxlbWVudCgpXG4gICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJyYW5jaGVzLWNvbnRhaW5lclwiKVxuICAgICAgICAgLml0ZW0oMCk7XG4gICAgICBhc3NlcnQoYnJhbmNoZXNDb250YWluZXJFbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KTtcbiAgICAgIGJyYW5jaGVzQ29udGFpbmVyRWwuc3R5bGUubWFyZ2luTGVmdCA9IGAke29wdGlvbnM/LmluZGVudGF0aW9uID8/IDE2fXB4YDtcbiAgIH1cbn1cbiJdfQ==
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { filter, Subject } from "rxjs";
|
|
2
|
-
import { hasProperty } from "../../shared";
|
|
3
|
-
import { TreeError } from "../errors";
|
|
4
|
-
import { GraftEvent, PruneEvent } from "../events";
|
|
5
|
-
export class TreeNodeBase {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.destroyed = false;
|
|
8
|
-
this._branches = [];
|
|
9
|
-
this.events$ = new Subject();
|
|
10
|
-
this.subscriptions = [
|
|
11
|
-
this.graftsToSelf().subscribe((event) => {
|
|
12
|
-
this.registerChildRelationship(event.child(), event.index());
|
|
13
|
-
}),
|
|
14
|
-
this.prunesToSelf().subscribe((event) => {
|
|
15
|
-
this.deregisterChildRelationship(event.child());
|
|
16
|
-
})
|
|
17
|
-
];
|
|
18
|
-
}
|
|
19
|
-
branches() {
|
|
20
|
-
return [...this._branches];
|
|
21
|
-
}
|
|
22
|
-
destroy() {
|
|
23
|
-
this.branches().forEach((branch) => {
|
|
24
|
-
branch.destroy();
|
|
25
|
-
});
|
|
26
|
-
this.subscriptions.forEach((sub) => {
|
|
27
|
-
sub.unsubscribe();
|
|
28
|
-
});
|
|
29
|
-
this.destroyed = true;
|
|
30
|
-
}
|
|
31
|
-
dispatch(event) {
|
|
32
|
-
this.events$.next(event);
|
|
33
|
-
}
|
|
34
|
-
events() {
|
|
35
|
-
return this.events$;
|
|
36
|
-
}
|
|
37
|
-
getBranch(index) {
|
|
38
|
-
return this._branches[index];
|
|
39
|
-
}
|
|
40
|
-
handleUserlandError(error) {
|
|
41
|
-
const message = hasProperty(error, "message")
|
|
42
|
-
? error.message
|
|
43
|
-
: "Unknown error";
|
|
44
|
-
return new TreeError(`Failed to grow branch: ${message}`, {
|
|
45
|
-
cause: error
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
isDestroyed() {
|
|
49
|
-
return this.destroyed;
|
|
50
|
-
}
|
|
51
|
-
plot() {
|
|
52
|
-
return new Map(this.branches().map((branch, index) => [index, branch.plot()]));
|
|
53
|
-
}
|
|
54
|
-
traverse(callback) {
|
|
55
|
-
this.branches().forEach((branch) => {
|
|
56
|
-
branch.traverse(callback);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
deregisterChildRelationship(child) {
|
|
60
|
-
const index = this.branches().findIndex((branch) => branch === child);
|
|
61
|
-
this._branches.splice(index, 1);
|
|
62
|
-
}
|
|
63
|
-
graftsToSelf() {
|
|
64
|
-
return this.events().pipe(filter((event) => event instanceof GraftEvent), filter((event) => event.parent().events() === this.events$));
|
|
65
|
-
}
|
|
66
|
-
prunesToSelf() {
|
|
67
|
-
return this.events().pipe(filter((event) => event instanceof PruneEvent), filter((event) => event.parent().events() === this.events$));
|
|
68
|
-
}
|
|
69
|
-
registerChildRelationship(child, index) {
|
|
70
|
-
const branches = this.branches();
|
|
71
|
-
if (index < 0 || index > branches.length) {
|
|
72
|
-
throw new TreeError(`Can't register child at index ${index}. Out of range.`);
|
|
73
|
-
}
|
|
74
|
-
this._branches.splice(index, 0, child);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1ub2RlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBbUIsT0FBTyxFQUFxQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQWtCLE1BQU0sV0FBVyxDQUFDO0FBS25FLE1BQU0sT0FBTyxZQUFZO0lBUXRCO1FBSFEsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUloQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDO1NBQ0osQ0FBQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxPQUFPO1FBQ1gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDaEMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVNLFFBQVEsQ0FBQyxLQUFtQztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU0sTUFBTTtRQUNWLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxLQUFjO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztZQUNmLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDckIsT0FBTyxJQUFJLFNBQVMsQ0FBQywwQkFBMEIsT0FBTyxFQUFFLEVBQUU7WUFDdkQsS0FBSyxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU0sV0FBVztRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN6QixDQUFDO0lBRU0sSUFBSTtRQUNSLE9BQU8sSUFBSSxHQUFHLENBQ1gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ2hFLENBQUM7SUFDTCxDQUFDO0lBRU0sUUFBUSxDQUNaLFFBQXVEO1FBRXZELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLDJCQUEyQixDQUNoQyxLQUFvQztRQUVwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FDdEIsTUFBTSxDQUNILENBQUMsS0FBSyxFQUEwQyxFQUFFLENBQy9DLEtBQUssWUFBWSxVQUFVLENBQ2hDLEVBQ0QsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUM3RCxDQUFDO0lBQ0wsQ0FBQztJQUVPLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUN0QixNQUFNLENBQ0gsQ0FBQyxLQUFLLEVBQTBDLEVBQUUsQ0FDL0MsS0FBSyxZQUFZLFVBQVUsQ0FDaEMsRUFDRCxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQzdELENBQUM7SUFDTCxDQUFDO0lBRU8seUJBQXlCLENBQzlCLEtBQW9DLEVBQ3BDLEtBQWE7UUFFYixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLFNBQVMsQ0FDaEIsaUNBQWlDLEtBQUssaUJBQWlCLENBQ3pELENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaWx0ZXIsIHR5cGUgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdHlwZSBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgaGFzUHJvcGVydHkgfSBmcm9tIFwiLi4vLi4vc2hhcmVkXCI7XG5pbXBvcnQgeyBUcmVlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBHcmFmdEV2ZW50LCBQcnVuZUV2ZW50LCB0eXBlIFRyZWVFdmVudCB9IGZyb20gXCIuLi9ldmVudHNcIjtcbmltcG9ydCB7IFRyZWVCcmFuY2ggfSBmcm9tIFwiLi90cmVlLWJyYW5jaFwiO1xuaW1wb3J0IHR5cGUgeyBUcmVlUGxvdCB9IGZyb20gXCIuL3RyZWUtcGxvdC5pbnRlcmZhY2VcIjtcbmltcG9ydCB0eXBlIHsgVHJlZU5vZGUgfSBmcm9tIFwiLi90cmVlLW5vZGUuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmVlTm9kZUJhc2U8VXNlcmxhbmRDb21wb25lbnQ+XG4gICBpbXBsZW1lbnRzIFBhcnRpYWw8VHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+Plxue1xuICAgcHJpdmF0ZSByZWFkb25seSBfYnJhbmNoZXM6IEFycmF5PFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+PjtcbiAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRzJDogU3ViamVjdDxUcmVlRXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+PjtcbiAgIHByaXZhdGUgZGVzdHJveWVkOiBib29sZWFuID0gZmFsc2U7XG4gICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj47XG5cbiAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX2JyYW5jaGVzID0gW107XG4gICAgICB0aGlzLmV2ZW50cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW1xuICAgICAgICAgdGhpcy5ncmFmdHNUb1NlbGYoKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQ2hpbGRSZWxhdGlvbnNoaXAoZXZlbnQuY2hpbGQoKSwgZXZlbnQuaW5kZXgoKSk7XG4gICAgICAgICB9KSxcbiAgICAgICAgIHRoaXMucHJ1bmVzVG9TZWxmKCkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXJlZ2lzdGVyQ2hpbGRSZWxhdGlvbnNoaXAoZXZlbnQuY2hpbGQoKSk7XG4gICAgICAgICB9KVxuICAgICAgXTtcbiAgIH1cblxuICAgcHVibGljIGJyYW5jaGVzKCk6IEFycmF5PFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+PiB7XG4gICAgICByZXR1cm4gWy4uLnRoaXMuX2JyYW5jaGVzXTtcbiAgIH1cblxuICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICB0aGlzLmJyYW5jaGVzKCkuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICAgICBicmFuY2guZGVzdHJveSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiB7XG4gICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgfVxuXG4gICBwdWJsaWMgZGlzcGF0Y2goZXZlbnQ6IFRyZWVFdmVudDxVc2VybGFuZENvbXBvbmVudD4pOiB2b2lkIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5uZXh0KGV2ZW50KTtcbiAgIH1cblxuICAgcHVibGljIGV2ZW50cygpOiBPYnNlcnZhYmxlPFRyZWVFdmVudDxVc2VybGFuZENvbXBvbmVudD4+IHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50cyQ7XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRCcmFuY2goaW5kZXg6IG51bWJlcik6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9icmFuY2hlc1tpbmRleF07XG4gICB9XG5cbiAgIHB1YmxpYyBoYW5kbGVVc2VybGFuZEVycm9yKGVycm9yOiB1bmtub3duKTogVHJlZUVycm9yIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBoYXNQcm9wZXJ0eShlcnJvciwgXCJtZXNzYWdlXCIpXG4gICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICByZXR1cm4gbmV3IFRyZWVFcnJvcihgRmFpbGVkIHRvIGdyb3cgYnJhbmNoOiAke21lc3NhZ2V9YCwge1xuICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICB9KTtcbiAgIH1cblxuICAgcHVibGljIGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveWVkO1xuICAgfVxuXG4gICBwdWJsaWMgcGxvdCgpOiBUcmVlUGxvdCB7XG4gICAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgICAgIHRoaXMuYnJhbmNoZXMoKS5tYXAoKGJyYW5jaCwgaW5kZXgpID0+IFtpbmRleCwgYnJhbmNoLnBsb3QoKV0pXG4gICAgICApO1xuICAgfVxuXG4gICBwdWJsaWMgdHJhdmVyc2UoXG4gICAgICBjYWxsYmFjazogKG5vZGU6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+KSA9PiB2b2lkXG4gICApOiB2b2lkIHtcbiAgICAgIHRoaXMuYnJhbmNoZXMoKS5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgIGJyYW5jaC50cmF2ZXJzZShjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHJpdmF0ZSBkZXJlZ2lzdGVyQ2hpbGRSZWxhdGlvbnNoaXAoXG4gICAgICBjaGlsZDogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD5cbiAgICk6IHZvaWQge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmJyYW5jaGVzKCkuZmluZEluZGV4KChicmFuY2gpID0+IGJyYW5jaCA9PT0gY2hpbGQpO1xuICAgICAgdGhpcy5fYnJhbmNoZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBncmFmdHNUb1NlbGYoKTogT2JzZXJ2YWJsZTxHcmFmdEV2ZW50PFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzKCkucGlwZShcbiAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChldmVudCk6IGV2ZW50IGlzIEdyYWZ0RXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+ID0+XG4gICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIEdyYWZ0RXZlbnRcbiAgICAgICAgICksXG4gICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5wYXJlbnQoKS5ldmVudHMoKSA9PT0gdGhpcy5ldmVudHMkKVxuICAgICAgKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBwcnVuZXNUb1NlbGYoKTogT2JzZXJ2YWJsZTxQcnVuZUV2ZW50PFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzKCkucGlwZShcbiAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChldmVudCk6IGV2ZW50IGlzIFBydW5lRXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+ID0+XG4gICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIFBydW5lRXZlbnRcbiAgICAgICAgICksXG4gICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5wYXJlbnQoKS5ldmVudHMoKSA9PT0gdGhpcy5ldmVudHMkKVxuICAgICAgKTtcbiAgIH1cblxuICAgcHJpdmF0ZSByZWdpc3RlckNoaWxkUmVsYXRpb25zaGlwKFxuICAgICAgY2hpbGQ6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LFxuICAgICAgaW5kZXg6IG51bWJlclxuICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBicmFuY2hlcyA9IHRoaXMuYnJhbmNoZXMoKTtcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBicmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBgQ2FuJ3QgcmVnaXN0ZXIgY2hpbGQgYXQgaW5kZXggJHtpbmRleH0uIE91dCBvZiByYW5nZS5gXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5fYnJhbmNoZXMuc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7XG4gICB9XG59XG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpbWJsZS10cmVlL3NyYy9saWIvY29yZS90cmVlLW5vZGUuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRyZWVSb290IH0gZnJvbSBcIi4vdHJlZS1yb290XCI7XG5pbXBvcnQgdHlwZSB7IFRyZWVQbG90IH0gZnJvbSBcIi4vdHJlZS1wbG90LmludGVyZmFjZVwiO1xuaW1wb3J0IHR5cGUgeyBCcmFuY2hhYmxlIH0gZnJvbSBcIi4vYnJhbmNoYWJsZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSBcIi4vY29tcG9uZW50LWNvbnRhaW5lci5pbnRlcmZhY2VcIjtcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyZWVFdmVudCB9IGZyb20gXCIuLi9ldmVudHNcIjtcbmltcG9ydCB0eXBlIHsgTm9kZUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+XG4gICBleHRlbmRzIEJyYW5jaGFibGU8VXNlcmxhbmRDb21wb25lbnQ+LFxuICAgICAgQ29tcG9uZW50Q29udGFpbmVyPE5vZGVDb21wb25lbnQ+IHtcbiAgIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG4gICBkaXNwYXRjaDogKGV2ZW50OiBUcmVlRXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+KSA9PiB2b2lkO1xuICAgZXZlbnRzOiAoKSA9PiBPYnNlcnZhYmxlPFRyZWVFdmVudDxVc2VybGFuZENvbXBvbmVudD4+O1xuICAgaXNEZXN0cm95ZWQ6ICgpID0+IGJvb2xlYW47XG4gICBwbG90OiAoKSA9PiBUcmVlUGxvdDtcbiAgIHJvb3Q6ICgpID0+IFRyZWVSb290PGFueT4gfCB1bmRlZmluZWQ7XG4gICB0cmF2ZXJzZTogKGNhbGxiYWNrOiAobm9kZTogVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+KSA9PiB2b2lkKSA9PiB2b2lkO1xufVxuIl19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1wbG90LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpbWJsZS10cmVlL3NyYy9saWIvY29yZS90cmVlLXBsb3QuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBUcmVlUGxvdCA9IE1hcDxudW1iZXIsIFRyZWVQbG90PjtcbiJdfQ==
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from "./tree-root";
|
|
2
|
-
export * from "./root-controller";
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1yb290L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi90cmVlLXJvb3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jvb3QtY29udHJvbGxlclwiO1xuIl19
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { assert } from "../../../shared";
|
|
2
|
-
import { RootComponent } from "../../components";
|
|
3
|
-
import { dropzoneRenderer } from "../../extras/drag-and-drop";
|
|
4
|
-
/**
|
|
5
|
-
* A wrapper around the BranchComponent that helps instantiate it and handles its events.
|
|
6
|
-
*/
|
|
7
|
-
export class RootController {
|
|
8
|
-
constructor(treeRoot, viewContainerRef) {
|
|
9
|
-
this.treeRoot = treeRoot;
|
|
10
|
-
this.rootComponentRef = viewContainerRef.createComponent(RootComponent);
|
|
11
|
-
const viewInitSub = this.rootComponentRef.instance.afterViewInit.subscribe(() => {
|
|
12
|
-
const dropzone = this.rootComponentRef.instance.dropzone;
|
|
13
|
-
assert(dropzone !== undefined);
|
|
14
|
-
dropzoneRenderer.registerDropzone(dropzone, this.treeRoot);
|
|
15
|
-
});
|
|
16
|
-
const droppedSub = this.rootComponentRef.instance.dropped.subscribe(() => {
|
|
17
|
-
dropzoneRenderer.handleDrop(this.treeRoot, "inner");
|
|
18
|
-
});
|
|
19
|
-
this.instanceSubscriptions = [viewInitSub, droppedSub];
|
|
20
|
-
}
|
|
21
|
-
destroy() {
|
|
22
|
-
this.instanceSubscriptions.forEach((sub) => {
|
|
23
|
-
sub.unsubscribe();
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
detectChanges() {
|
|
27
|
-
this.rootComponentRef.changeDetectorRef.detectChanges();
|
|
28
|
-
}
|
|
29
|
-
getBranchesContainer() {
|
|
30
|
-
return this.rootComponentRef.instance.branchesContainer;
|
|
31
|
-
}
|
|
32
|
-
getComponentInstance() {
|
|
33
|
-
return this.rootComponentRef.instance;
|
|
34
|
-
}
|
|
35
|
-
getHostView() {
|
|
36
|
-
return this.rootComponentRef.hostView;
|
|
37
|
-
}
|
|
38
|
-
getNativeElement() {
|
|
39
|
-
return this.rootComponentRef.location.nativeElement;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9jb3JlL3RyZWUtcm9vdC9yb290LWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUk5RDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBSXhCLFlBQ29CLFFBQXFCLEVBQ3RDLGdCQUFrQztRQURqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBR3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEUsTUFBTSxXQUFXLEdBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUN6RCxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQy9CLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFDTixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ2hFLEdBQUcsRUFBRTtZQUNGLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxPQUFPO1FBQ1gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3hDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTSxhQUFhO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBRU0sb0JBQW9CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxDQUFDO0lBRU0sb0JBQW9CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRU0sV0FBVztRQUNmLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDdkQsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb21wb25lbnRSZWYsIFZpZXdDb250YWluZXJSZWYsIFZpZXdSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZFwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgUm9vdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBkcm9wem9uZVJlbmRlcmVyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9kcmFnLWFuZC1kcm9wXCI7XG5pbXBvcnQgdHlwZSB7IFRyZWVSb290IH0gZnJvbSBcIi4vdHJlZS1yb290XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gXCIuLi9jb21wb25lbnQtY29udGFpbmVyLmludGVyZmFjZVwiO1xuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIEJyYW5jaENvbXBvbmVudCB0aGF0IGhlbHBzIGluc3RhbnRpYXRlIGl0IGFuZCBoYW5kbGVzIGl0cyBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb290Q29udHJvbGxlcjxUPiBpbXBsZW1lbnRzIENvbXBvbmVudENvbnRhaW5lcjxSb290Q29tcG9uZW50PiB7XG4gICBwcml2YXRlIHJlYWRvbmx5IHJvb3RDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxSb290Q29tcG9uZW50PjtcbiAgIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VTdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+O1xuXG4gICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHRyZWVSb290OiBUcmVlUm9vdDxUPixcbiAgICAgIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWZcbiAgICkge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoUm9vdENvbXBvbmVudCk7XG4gICAgICBjb25zdCB2aWV3SW5pdFN1YiA9XG4gICAgICAgICB0aGlzLnJvb3RDb21wb25lbnRSZWYuaW5zdGFuY2UuYWZ0ZXJWaWV3SW5pdC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHJvcHpvbmUgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuaW5zdGFuY2UuZHJvcHpvbmU7XG4gICAgICAgICAgICBhc3NlcnQoZHJvcHpvbmUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBkcm9wem9uZVJlbmRlcmVyLnJlZ2lzdGVyRHJvcHpvbmUoZHJvcHpvbmUsIHRoaXMudHJlZVJvb3QpO1xuICAgICAgICAgfSk7XG4gICAgICBjb25zdCBkcm9wcGVkU3ViID0gdGhpcy5yb290Q29tcG9uZW50UmVmLmluc3RhbmNlLmRyb3BwZWQuc3Vic2NyaWJlKFxuICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgZHJvcHpvbmVSZW5kZXJlci5oYW5kbGVEcm9wKHRoaXMudHJlZVJvb3QsIFwiaW5uZXJcIik7XG4gICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5pbnN0YW5jZVN1YnNjcmlwdGlvbnMgPSBbdmlld0luaXRTdWIsIGRyb3BwZWRTdWJdO1xuICAgfVxuXG4gICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLnJvb3RDb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0QnJhbmNoZXNDb250YWluZXIoKTogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmluc3RhbmNlLmJyYW5jaGVzQ29udGFpbmVyO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTogUm9vdENvbXBvbmVudCB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0SG9zdFZpZXcoKTogVmlld1JlZiB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmhvc3RWaWV3O1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0TmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICB9XG59XG4iXX0=
|