@angular/core 18.0.0-next.2 → 18.0.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/esm2022/rxjs-interop/src/to_signal.mjs +2 -2
  2. package/esm2022/src/application/application_init.mjs +2 -2
  3. package/esm2022/src/application/application_ref.mjs +10 -15
  4. package/esm2022/src/application/application_tokens.mjs +3 -3
  5. package/esm2022/src/change_detection/scheduling/ng_zone_scheduling.mjs +20 -3
  6. package/esm2022/src/change_detection/scheduling/zoneless_scheduling_impl.mjs +7 -6
  7. package/esm2022/src/core_private_export.mjs +3 -3
  8. package/esm2022/src/defer/instructions.mjs +2 -2
  9. package/esm2022/src/di/interface/provider.mjs +1 -1
  10. package/esm2022/src/di/metadata.mjs +1 -1
  11. package/esm2022/src/hydration/annotate.mjs +35 -49
  12. package/esm2022/src/hydration/api.mjs +36 -13
  13. package/esm2022/src/hydration/cleanup.mjs +4 -18
  14. package/esm2022/src/hydration/i18n.mjs +378 -0
  15. package/esm2022/src/hydration/interfaces.mjs +2 -1
  16. package/esm2022/src/hydration/node_lookup_utils.mjs +24 -10
  17. package/esm2022/src/hydration/utils.mjs +61 -2
  18. package/esm2022/src/linker/component_factory.mjs +1 -1
  19. package/esm2022/src/linker/view_container_ref.mjs +2 -2
  20. package/esm2022/src/linker/view_ref.mjs +4 -4
  21. package/esm2022/src/metadata/directives.mjs +1 -1
  22. package/esm2022/src/metadata/ng_module.mjs +1 -1
  23. package/esm2022/src/render3/component_ref.mjs +1 -1
  24. package/esm2022/src/render3/i18n/i18n_apply.mjs +28 -6
  25. package/esm2022/src/render3/i18n/i18n_parse.mjs +2 -5
  26. package/esm2022/src/render3/i18n/i18n_util.mjs +6 -1
  27. package/esm2022/src/render3/instructions/i18n.mjs +3 -1
  28. package/esm2022/src/render3/util/injector_discovery_utils.mjs +12 -8
  29. package/esm2022/src/render3/util/view_utils.mjs +4 -14
  30. package/esm2022/src/util/callback_scheduler.mjs +23 -33
  31. package/esm2022/src/version.mjs +1 -1
  32. package/esm2022/src/zone/ng_zone.mjs +3 -3
  33. package/esm2022/testing/src/component_fixture.mjs +2 -2
  34. package/esm2022/testing/src/fake_async.mjs +6 -1
  35. package/esm2022/testing/src/logger.mjs +3 -3
  36. package/esm2022/testing/src/private_export.mjs +9 -0
  37. package/esm2022/testing/src/test_hooks.mjs +3 -3
  38. package/esm2022/testing/src/testing.mjs +3 -2
  39. package/fesm2022/core.mjs +1124 -688
  40. package/fesm2022/core.mjs.map +1 -1
  41. package/fesm2022/primitives/signals.mjs +1 -1
  42. package/fesm2022/rxjs-interop.mjs +2 -2
  43. package/fesm2022/rxjs-interop.mjs.map +1 -1
  44. package/fesm2022/testing.mjs +41 -36
  45. package/fesm2022/testing.mjs.map +1 -1
  46. package/index.d.ts +80 -33
  47. package/package.json +1 -1
  48. package/primitives/signals/index.d.ts +1 -1
  49. package/rxjs-interop/index.d.ts +2 -2
  50. package/schematics/migrations/block-template-entities/bundle.js +157 -157
  51. package/schematics/migrations/block-template-entities/bundle.js.map +1 -1
  52. package/schematics/migrations/compiler-options/bundle.js +13 -13
  53. package/schematics/migrations/invalid-two-way-bindings/bundle.js +158 -158
  54. package/schematics/migrations/invalid-two-way-bindings/bundle.js.map +1 -1
  55. package/schematics/migrations/transfer-state/bundle.js +13 -13
  56. package/schematics/ng-generate/control-flow-migration/bundle.js +189 -177
  57. package/schematics/ng-generate/control-flow-migration/bundle.js.map +3 -3
  58. package/schematics/ng-generate/standalone-migration/bundle.js +450 -467
  59. package/schematics/ng-generate/standalone-migration/bundle.js.map +2 -2
  60. package/testing/index.d.ts +7 -1
  61. package/esm2022/src/change_detection/flags.mjs +0 -17
@@ -0,0 +1,378 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { inject, Injector } from '../di';
9
+ import { isRootTemplateMessage } from '../render3/i18n/i18n_util';
10
+ import { HEADER_OFFSET, HYDRATION, RENDERER, TVIEW } from '../render3/interfaces/view';
11
+ import { nativeRemoveNode } from '../render3/node_manipulation';
12
+ import { unwrapRNode } from '../render3/util/view_utils';
13
+ import { assertDefined, assertNotEqual } from '../util/assert';
14
+ import { I18N_DATA } from './interfaces';
15
+ import { locateNextRNode, tryLocateRNodeByPath } from './node_lookup_utils';
16
+ import { IS_I18N_HYDRATION_ENABLED } from './tokens';
17
+ import { getNgContainerSize, initDisconnectedNodes, isSerializedElementContainer, processTextNodeBeforeSerialization } from './utils';
18
+ let _isI18nHydrationSupportEnabled = false;
19
+ let _prepareI18nBlockForHydrationImpl = () => {
20
+ // noop unless `enablePrepareI18nBlockForHydrationImpl` is invoked.
21
+ };
22
+ export function setIsI18nHydrationSupportEnabled(enabled) {
23
+ _isI18nHydrationSupportEnabled = enabled;
24
+ }
25
+ export function isI18nHydrationSupportEnabled() {
26
+ return _isI18nHydrationSupportEnabled;
27
+ }
28
+ /**
29
+ * Prepares an i18n block and its children, located at the given
30
+ * view and instruction index, for hydration.
31
+ *
32
+ * @param lView lView with the i18n block
33
+ * @param index index of the i18n block in the lView
34
+ * @param parentTNode TNode of the parent of the i18n block
35
+ * @param subTemplateIndex sub-template index, or -1 for the main template
36
+ */
37
+ export function prepareI18nBlockForHydration(lView, index, parentTNode, subTemplateIndex) {
38
+ _prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplateIndex);
39
+ }
40
+ export function enablePrepareI18nBlockForHydrationImpl() {
41
+ _prepareI18nBlockForHydrationImpl = prepareI18nBlockForHydrationImpl;
42
+ }
43
+ export function isI18nHydrationEnabled(injector) {
44
+ injector = injector ?? inject(Injector);
45
+ return injector.get(IS_I18N_HYDRATION_ENABLED, false);
46
+ }
47
+ /**
48
+ * Collects, if not already cached, all of the indices in the
49
+ * given TView which are children of an i18n block.
50
+ *
51
+ * Since i18n blocks don't introduce a parent TNode, this is necessary
52
+ * in order to determine which indices in a LView are translated.
53
+ */
54
+ export function getOrComputeI18nChildren(tView, context) {
55
+ let i18nChildren = context.i18nChildren.get(tView);
56
+ if (i18nChildren === undefined) {
57
+ i18nChildren = collectI18nChildren(tView);
58
+ context.i18nChildren.set(tView, i18nChildren);
59
+ }
60
+ return i18nChildren;
61
+ }
62
+ function collectI18nChildren(tView) {
63
+ const children = new Set();
64
+ function collectI18nViews(node) {
65
+ children.add(node.index);
66
+ switch (node.kind) {
67
+ case 1 /* I18nNodeKind.ELEMENT */:
68
+ case 2 /* I18nNodeKind.PLACEHOLDER */: {
69
+ for (const childNode of node.children) {
70
+ collectI18nViews(childNode);
71
+ }
72
+ break;
73
+ }
74
+ case 3 /* I18nNodeKind.ICU */: {
75
+ for (const caseNodes of node.cases) {
76
+ for (const caseNode of caseNodes) {
77
+ collectI18nViews(caseNode);
78
+ }
79
+ }
80
+ break;
81
+ }
82
+ }
83
+ }
84
+ // Traverse through the AST of each i18n block in the LView,
85
+ // and collect every instruction index.
86
+ for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
87
+ const tI18n = tView.data[i];
88
+ if (!tI18n || !tI18n.ast) {
89
+ continue;
90
+ }
91
+ for (const node of tI18n.ast) {
92
+ collectI18nViews(node);
93
+ }
94
+ }
95
+ return children.size === 0 ? null : children;
96
+ }
97
+ /**
98
+ * Attempts to serialize i18n data for an i18n block, located at
99
+ * the given view and instruction index.
100
+ *
101
+ * @param lView lView with the i18n block
102
+ * @param index index of the i18n block in the lView
103
+ * @param context the hydration context
104
+ * @returns the i18n data, or null if there is no relevant data
105
+ */
106
+ export function trySerializeI18nBlock(lView, index, context) {
107
+ if (!context.isI18nHydrationEnabled) {
108
+ return null;
109
+ }
110
+ const tView = lView[TVIEW];
111
+ const tI18n = tView.data[index];
112
+ if (!tI18n || !tI18n.ast) {
113
+ return null;
114
+ }
115
+ const caseQueue = [];
116
+ tI18n.ast.forEach(node => serializeI18nBlock(lView, caseQueue, context, node));
117
+ return caseQueue.length > 0 ? caseQueue : null;
118
+ }
119
+ function serializeI18nBlock(lView, caseQueue, context, node) {
120
+ switch (node.kind) {
121
+ case 0 /* I18nNodeKind.TEXT */:
122
+ const rNode = unwrapRNode(lView[node.index]);
123
+ processTextNodeBeforeSerialization(context, rNode);
124
+ break;
125
+ case 1 /* I18nNodeKind.ELEMENT */:
126
+ case 2 /* I18nNodeKind.PLACEHOLDER */:
127
+ node.children.forEach(node => serializeI18nBlock(lView, caseQueue, context, node));
128
+ break;
129
+ case 3 /* I18nNodeKind.ICU */:
130
+ const currentCase = lView[node.currentCaseLViewIndex];
131
+ if (currentCase != null) {
132
+ // i18n uses a negative value to signal a change to a new case, so we
133
+ // need to invert it to get the proper value.
134
+ const caseIdx = currentCase < 0 ? ~currentCase : currentCase;
135
+ caseQueue.push(caseIdx);
136
+ node.cases[caseIdx].forEach(node => serializeI18nBlock(lView, caseQueue, context, node));
137
+ }
138
+ break;
139
+ }
140
+ }
141
+ function setCurrentNode(state, node) {
142
+ state.currentNode = node;
143
+ }
144
+ /**
145
+ * Marks the current RNode as the hydration root for the given
146
+ * AST node.
147
+ */
148
+ function appendI18nNodeToCollection(context, state, astNode) {
149
+ const noOffsetIndex = astNode.index - HEADER_OFFSET;
150
+ const { disconnectedNodes } = context;
151
+ const currentNode = state.currentNode;
152
+ if (state.isConnected) {
153
+ context.i18nNodes.set(noOffsetIndex, currentNode);
154
+ // We expect the node to be connected, so ensure that it
155
+ // is not in the set, regardless of whether we found it,
156
+ // so that the downstream error handling can provide the
157
+ // proper context.
158
+ disconnectedNodes.delete(noOffsetIndex);
159
+ }
160
+ else {
161
+ disconnectedNodes.add(noOffsetIndex);
162
+ }
163
+ return currentNode;
164
+ }
165
+ /**
166
+ * Skip over some sibling nodes during hydration.
167
+ *
168
+ * Note: we use this instead of `siblingAfter` as it's expected that
169
+ * sometimes we might encounter null nodes. In those cases, we want to
170
+ * defer to downstream error handling to provide proper context.
171
+ */
172
+ function skipSiblingNodes(state, skip) {
173
+ let currentNode = state.currentNode;
174
+ for (let i = 0; i < skip; i++) {
175
+ if (!currentNode) {
176
+ break;
177
+ }
178
+ currentNode = currentNode?.nextSibling ?? null;
179
+ }
180
+ return currentNode;
181
+ }
182
+ /**
183
+ * Fork the given state into a new state for hydrating children.
184
+ */
185
+ function forkHydrationState(state, nextNode) {
186
+ return { currentNode: nextNode, isConnected: state.isConnected };
187
+ }
188
+ function prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplateIndex) {
189
+ if (!isI18nHydrationSupportEnabled()) {
190
+ return;
191
+ }
192
+ const hydrationInfo = lView[HYDRATION];
193
+ if (!hydrationInfo) {
194
+ return;
195
+ }
196
+ const tView = lView[TVIEW];
197
+ const tI18n = tView.data[index];
198
+ ngDevMode &&
199
+ assertDefined(tI18n, 'Expected i18n data to be present in a given TView slot during hydration');
200
+ function findHydrationRoot() {
201
+ if (isRootTemplateMessage(subTemplateIndex)) {
202
+ // This is the root of an i18n block. In this case, our hydration root will
203
+ // depend on where our parent TNode (i.e. the block with i18n applied) is
204
+ // in the DOM.
205
+ ngDevMode && assertDefined(parentTNode, 'Expected parent TNode while hydrating i18n root');
206
+ const rootNode = locateNextRNode(hydrationInfo, tView, lView, parentTNode);
207
+ // If this i18n block is attached to an <ng-container>, then we want to begin
208
+ // hydrating directly with the RNode. Otherwise, for a TNode with a physical DOM
209
+ // element, we want to recurse into the first child and begin there.
210
+ return (parentTNode.type & 8 /* TNodeType.ElementContainer */) ? rootNode : rootNode.firstChild;
211
+ }
212
+ // This is a nested template in an i18n block. In this case, the entire view
213
+ // is translated, and part of a dehydrated view in a container. This means that
214
+ // we can simply begin hydration with the first dehydrated child.
215
+ return hydrationInfo?.firstChild;
216
+ }
217
+ const currentNode = findHydrationRoot();
218
+ ngDevMode && assertDefined(currentNode, 'Expected root i18n node during hydration');
219
+ const disconnectedNodes = initDisconnectedNodes(hydrationInfo) ?? new Set();
220
+ const i18nNodes = hydrationInfo.i18nNodes ??= new Map();
221
+ const caseQueue = hydrationInfo.data[I18N_DATA]?.[index - HEADER_OFFSET] ?? [];
222
+ const dehydratedIcuData = hydrationInfo.dehydratedIcuData ??=
223
+ new Map();
224
+ collectI18nNodesFromDom({ hydrationInfo, lView, i18nNodes, disconnectedNodes, caseQueue, dehydratedIcuData }, { currentNode, isConnected: true }, tI18n.ast);
225
+ // Nodes from inactive ICU cases should be considered disconnected. We track them above
226
+ // because they aren't (and shouldn't be) serialized. Since we may mutate or create a
227
+ // new set, we need to be sure to write the expected value back to the DehydratedView.
228
+ hydrationInfo.disconnectedNodes = disconnectedNodes.size === 0 ? null : disconnectedNodes;
229
+ }
230
+ function collectI18nNodesFromDom(context, state, nodeOrNodes) {
231
+ if (Array.isArray(nodeOrNodes)) {
232
+ for (const node of nodeOrNodes) {
233
+ // If the node is being projected elsewhere, we need to temporarily
234
+ // branch the state to that location to continue hydration.
235
+ // Otherwise, we continue hydration from the current location.
236
+ const targetNode = tryLocateRNodeByPath(context.hydrationInfo, context.lView, node.index - HEADER_OFFSET);
237
+ const nextState = targetNode ? forkHydrationState(state, targetNode) : state;
238
+ collectI18nNodesFromDom(context, nextState, node);
239
+ }
240
+ }
241
+ else {
242
+ switch (nodeOrNodes.kind) {
243
+ case 0 /* I18nNodeKind.TEXT */: {
244
+ // Claim a text node for hydration
245
+ const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
246
+ setCurrentNode(state, currentNode?.nextSibling ?? null);
247
+ break;
248
+ }
249
+ case 1 /* I18nNodeKind.ELEMENT */: {
250
+ // Recurse into the current element's children...
251
+ collectI18nNodesFromDom(context, forkHydrationState(state, state.currentNode?.firstChild ?? null), nodeOrNodes.children);
252
+ // And claim the parent element itself.
253
+ const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
254
+ setCurrentNode(state, currentNode?.nextSibling ?? null);
255
+ break;
256
+ }
257
+ case 2 /* I18nNodeKind.PLACEHOLDER */: {
258
+ const noOffsetIndex = nodeOrNodes.index - HEADER_OFFSET;
259
+ const { hydrationInfo } = context;
260
+ const containerSize = getNgContainerSize(hydrationInfo, noOffsetIndex);
261
+ switch (nodeOrNodes.type) {
262
+ case 0 /* I18nPlaceholderType.ELEMENT */: {
263
+ // Hydration expects to find the head of the element.
264
+ const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
265
+ // A TNode for the node may not yet if we're hydrating during the first pass,
266
+ // so use the serialized data to determine if this is an <ng-container>.
267
+ if (isSerializedElementContainer(hydrationInfo, noOffsetIndex)) {
268
+ // An <ng-container> doesn't have a physical DOM node, so we need to
269
+ // continue hydrating from siblings.
270
+ collectI18nNodesFromDom(context, state, nodeOrNodes.children);
271
+ // Skip over the anchor element. It will be claimed by the
272
+ // downstream container hydration.
273
+ const nextNode = skipSiblingNodes(state, 1);
274
+ setCurrentNode(state, nextNode);
275
+ }
276
+ else {
277
+ // Non-container elements represent an actual node in the DOM, so we
278
+ // need to continue hydration with the children, and claim the node.
279
+ collectI18nNodesFromDom(context, forkHydrationState(state, state.currentNode?.firstChild ?? null), nodeOrNodes.children);
280
+ setCurrentNode(state, currentNode?.nextSibling ?? null);
281
+ // Elements can also be the anchor of a view container, so there may
282
+ // be elements after this node that we need to skip.
283
+ if (containerSize !== null) {
284
+ // `+1` stands for an anchor node after all of the views in the container.
285
+ const nextNode = skipSiblingNodes(state, containerSize + 1);
286
+ setCurrentNode(state, nextNode);
287
+ }
288
+ }
289
+ break;
290
+ }
291
+ case 1 /* I18nPlaceholderType.SUBTEMPLATE */: {
292
+ ngDevMode &&
293
+ assertNotEqual(containerSize, null, 'Expected a container size while hydrating i18n subtemplate');
294
+ // Hydration expects to find the head of the template.
295
+ appendI18nNodeToCollection(context, state, nodeOrNodes);
296
+ // Skip over all of the template children, as well as the anchor
297
+ // node, since the template itself will handle them instead.
298
+ const nextNode = skipSiblingNodes(state, containerSize + 1);
299
+ setCurrentNode(state, nextNode);
300
+ break;
301
+ }
302
+ }
303
+ break;
304
+ }
305
+ case 3 /* I18nNodeKind.ICU */: {
306
+ // If the current node is connected, we need to pop the next case from the
307
+ // queue, so that the active case is also considered connected.
308
+ const selectedCase = state.isConnected ? context.caseQueue.shift() : null;
309
+ const childState = { currentNode: null, isConnected: false };
310
+ // We traverse through each case, even if it's not active,
311
+ // so that we correctly populate disconnected nodes.
312
+ for (let i = 0; i < nodeOrNodes.cases.length; i++) {
313
+ collectI18nNodesFromDom(context, i === selectedCase ? state : childState, nodeOrNodes.cases[i]);
314
+ }
315
+ if (selectedCase !== null) {
316
+ // ICUs represent a branching state, and the selected case could be different
317
+ // than what it was on the server. In that case, we need to be able to clean
318
+ // up the nodes from the original case. To do that, we store the selected case.
319
+ context.dehydratedIcuData.set(nodeOrNodes.index, { case: selectedCase, node: nodeOrNodes });
320
+ }
321
+ // Hydration expects to find the ICU anchor element.
322
+ const currentNode = appendI18nNodeToCollection(context, state, nodeOrNodes);
323
+ setCurrentNode(state, currentNode?.nextSibling ?? null);
324
+ break;
325
+ }
326
+ }
327
+ }
328
+ }
329
+ let _claimDehydratedIcuCaseImpl = () => {
330
+ // noop unless `enableClaimDehydratedIcuCaseImpl` is invoked
331
+ };
332
+ /**
333
+ * Mark the case for the ICU node at the given index in the view as claimed,
334
+ * allowing its nodes to be hydrated and not cleaned up.
335
+ */
336
+ export function claimDehydratedIcuCase(lView, icuIndex, caseIndex) {
337
+ _claimDehydratedIcuCaseImpl(lView, icuIndex, caseIndex);
338
+ }
339
+ export function enableClaimDehydratedIcuCaseImpl() {
340
+ _claimDehydratedIcuCaseImpl = claimDehydratedIcuCaseImpl;
341
+ }
342
+ function claimDehydratedIcuCaseImpl(lView, icuIndex, caseIndex) {
343
+ const dehydratedIcuDataMap = lView[HYDRATION]?.dehydratedIcuData;
344
+ if (dehydratedIcuDataMap) {
345
+ const dehydratedIcuData = dehydratedIcuDataMap.get(icuIndex);
346
+ if (dehydratedIcuData?.case === caseIndex) {
347
+ // If the case we're attempting to claim matches the dehydrated one,
348
+ // we remove it from the map to mark it as "claimed."
349
+ dehydratedIcuDataMap.delete(icuIndex);
350
+ }
351
+ }
352
+ }
353
+ /**
354
+ * Clean up all i18n hydration data associated with the given view.
355
+ */
356
+ export function cleanupI18nHydrationData(lView) {
357
+ const hydrationInfo = lView[HYDRATION];
358
+ if (hydrationInfo) {
359
+ const { i18nNodes, dehydratedIcuData: dehydratedIcuDataMap } = hydrationInfo;
360
+ if (i18nNodes && dehydratedIcuDataMap) {
361
+ const renderer = lView[RENDERER];
362
+ for (const dehydratedIcuData of dehydratedIcuDataMap.values()) {
363
+ cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData);
364
+ }
365
+ }
366
+ hydrationInfo.i18nNodes = undefined;
367
+ hydrationInfo.dehydratedIcuData = undefined;
368
+ }
369
+ }
370
+ function cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData) {
371
+ for (const node of dehydratedIcuData.node.cases[dehydratedIcuData.case]) {
372
+ const rNode = i18nNodes.get(node.index - HEADER_OFFSET);
373
+ if (rNode) {
374
+ nativeRemoveNode(renderer, rNode, false);
375
+ }
376
+ }
377
+ }
378
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2h5ZHJhdGlvbi9pMThuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBS2hFLE9BQU8sRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFTLFFBQVEsRUFBUyxLQUFLLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUc3RCxPQUFPLEVBQW9DLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSxrQ0FBa0MsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVwSSxJQUFJLDhCQUE4QixHQUFHLEtBQUssQ0FBQztBQUUzQyxJQUFJLGlDQUFpQyxHQUE0QyxHQUFHLEVBQUU7SUFDcEYsbUVBQW1FO0FBQ3JFLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxnQ0FBZ0MsQ0FBQyxPQUFnQjtJQUMvRCw4QkFBOEIsR0FBRyxPQUFPLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSw2QkFBNkI7SUFDM0MsT0FBTyw4QkFBOEIsQ0FBQztBQUN4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QUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQzlELHdCQUF3QixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQztRQUVELGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7SUFDOUMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUM3QixRQUFrQixFQUFFLFNBQWtDLEVBQUUsaUJBQW9DO0lBQzlGLEtBQUssTUFBTSxJQUFJLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsQ0FBQztRQUN4RCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtpbmplY3QsIEluamVjdG9yfSBmcm9tICcuLi9kaSc7XG5pbXBvcnQge2lzUm9vdFRlbXBsYXRlTWVzc2FnZX0gZnJvbSAnLi4vcmVuZGVyMy9pMThuL2kxOG5fdXRpbCc7XG5pbXBvcnQge0kxOG5Ob2RlLCBJMThuTm9kZUtpbmQsIEkxOG5QbGFjZWhvbGRlclR5cGUsIFRJMThufSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvaTE4bic7XG5pbXBvcnQge1ROb2RlLCBUTm9kZVR5cGV9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy9ub2RlJztcbmltcG9ydCB0eXBlIHtSZW5kZXJlcn0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3JlbmRlcmVyJztcbmltcG9ydCB0eXBlIHtSTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3JlbmRlcmVyX2RvbSc7XG5pbXBvcnQge0hFQURFUl9PRkZTRVQsIEhZRFJBVElPTiwgTFZpZXcsIFJFTkRFUkVSLCBUVmlldywgVFZJRVd9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy92aWV3JztcbmltcG9ydCB7bmF0aXZlUmVtb3ZlTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9ub2RlX21hbmlwdWxhdGlvbic7XG5pbXBvcnQge3Vud3JhcFJOb2RlfSBmcm9tICcuLi9yZW5kZXIzL3V0aWwvdmlld191dGlscyc7XG5pbXBvcnQge2Fzc2VydERlZmluZWQsIGFzc2VydE5vdEVxdWFsfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtIeWRyYXRpb25Db250ZXh0fSBmcm9tICcuL2Fubm90YXRlJztcbmltcG9ydCB7RGVoeWRyYXRlZEljdURhdGEsIERlaHlkcmF0ZWRWaWV3LCBJMThOX0RBVEF9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge2xvY2F0ZU5leHRSTm9kZSwgdHJ5TG9jYXRlUk5vZGVCeVBhdGh9IGZyb20gJy4vbm9kZV9sb29rdXBfdXRpbHMnO1xuaW1wb3J0IHtJU19JMThOX0hZRFJBVElPTl9FTkFCTEVEfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQge2dldE5nQ29udGFpbmVyU2l6ZSwgaW5pdERpc2Nvbm5lY3RlZE5vZGVzLCBpc1NlcmlhbGl6ZWRFbGVtZW50Q29udGFpbmVyLCBwcm9jZXNzVGV4dE5vZGVCZWZvcmVTZXJpYWxpemF0aW9ufSBmcm9tICcuL3V0aWxzJztcblxubGV0IF9pc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZCA9IGZhbHNlO1xuXG5sZXQgX3ByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb25JbXBsOiB0eXBlb2YgcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGwgPSAoKSA9PiB7XG4gIC8vIG5vb3AgdW5sZXNzIGBlbmFibGVQcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbGAgaXMgaW52b2tlZC5cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gIF9pc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZCA9IGVuYWJsZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9pc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZDtcbn1cblxuLyoqXG4gKiBQcmVwYXJlcyBhbiBpMThuIGJsb2NrIGFuZCBpdHMgY2hpbGRyZW4sIGxvY2F0ZWQgYXQgdGhlIGdpdmVuXG4gKiB2aWV3IGFuZCBpbnN0cnVjdGlvbiBpbmRleCwgZm9yIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbFZpZXcgbFZpZXcgd2l0aCB0aGUgaTE4biBibG9ja1xuICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBpMThuIGJsb2NrIGluIHRoZSBsVmlld1xuICogQHBhcmFtIHBhcmVudFROb2RlIFROb2RlIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGkxOG4gYmxvY2tcbiAqIEBwYXJhbSBzdWJUZW1wbGF0ZUluZGV4IHN1Yi10ZW1wbGF0ZSBpbmRleCwgb3IgLTEgZm9yIHRoZSBtYWluIHRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uKFxuICAgIGxWaWV3OiBMVmlldywgaW5kZXg6IG51bWJlciwgcGFyZW50VE5vZGU6IFROb2RlfG51bGwsIHN1YlRlbXBsYXRlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICBfcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGwobFZpZXcsIGluZGV4LCBwYXJlbnRUTm9kZSwgc3ViVGVtcGxhdGVJbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVQcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbCgpIHtcbiAgX3ByZXBhcmVJMThuQmxvY2tGb3JIeWRyYXRpb25JbXBsID0gcHJlcGFyZUkxOG5CbG9ja0Zvckh5ZHJhdGlvbkltcGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0kxOG5IeWRyYXRpb25FbmFibGVkKGluamVjdG9yPzogSW5qZWN0b3IpIHtcbiAgaW5qZWN0b3IgPSBpbmplY3RvciA/PyBpbmplY3QoSW5qZWN0b3IpO1xuICByZXR1cm4gaW5qZWN0b3IuZ2V0KElTX0kxOE5fSFlEUkFUSU9OX0VOQUJMRUQsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0cywgaWYgbm90IGFscmVhZHkgY2FjaGVkLCBhbGwgb2YgdGhlIGluZGljZXMgaW4gdGhlXG4gKiBnaXZlbiBUVmlldyB3aGljaCBhcmUgY2hpbGRyZW4gb2YgYW4gaTE4biBibG9jay5cbiAqXG4gKiBTaW5jZSBpMThuIGJsb2NrcyBkb24ndCBpbnRyb2R1Y2UgYSBwYXJlbnQgVE5vZGUsIHRoaXMgaXMgbmVjZXNzYXJ5XG4gKiBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggaW5kaWNlcyBpbiBhIExWaWV3IGFyZSB0cmFuc2xhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JDb21wdXRlSTE4bkNoaWxkcmVuKHRWaWV3OiBUVmlldywgY29udGV4dDogSHlkcmF0aW9uQ29udGV4dCk6IFNldDxudW1iZXI+fFxuICAgIG51bGwge1xuICBsZXQgaTE4bkNoaWxkcmVuID0gY29udGV4dC5pMThuQ2hpbGRyZW4uZ2V0KHRWaWV3KTtcbiAgaWYgKGkxOG5DaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaTE4bkNoaWxkcmVuID0gY29sbGVjdEkxOG5DaGlsZHJlbih0Vmlldyk7XG4gICAgY29udGV4dC5pMThuQ2hpbGRyZW4uc2V0KHRWaWV3LCBpMThuQ2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBpMThuQ2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RJMThuQ2hpbGRyZW4odFZpZXc6IFRWaWV3KTogU2V0PG51bWJlcj58bnVsbCB7XG4gIGNvbnN0IGNoaWxkcmVuID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgZnVuY3Rpb24gY29sbGVjdEkxOG5WaWV3cyhub2RlOiBJMThuTm9kZSkge1xuICAgIGNoaWxkcmVuLmFkZChub2RlLmluZGV4KTtcblxuICAgIHN3aXRjaCAobm9kZS5raW5kKSB7XG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5FTEVNRU5UOlxuICAgICAgY2FzZSBJMThuTm9kZUtpbmQuUExBQ0VIT0xERVI6IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGNvbGxlY3RJMThuVmlld3MoY2hpbGROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBJMThuTm9kZUtpbmQuSUNVOiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FzZU5vZGVzIG9mIG5vZGUuY2FzZXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNhc2VOb2RlIG9mIGNhc2VOb2Rlcykge1xuICAgICAgICAgICAgY29sbGVjdEkxOG5WaWV3cyhjYXNlTm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyYXZlcnNlIHRocm91Z2ggdGhlIEFTVCBvZiBlYWNoIGkxOG4gYmxvY2sgaW4gdGhlIExWaWV3LFxuICAvLyBhbmQgY29sbGVjdCBldmVyeSBpbnN0cnVjdGlvbiBpbmRleC5cbiAgZm9yIChsZXQgaSA9IEhFQURFUl9PRkZTRVQ7IGkgPCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleDsgaSsrKSB7XG4gICAgY29uc3QgdEkxOG4gPSB0Vmlldy5kYXRhW2ldIGFzIFRJMThuIHwgdW5kZWZpbmVkO1xuICAgIGlmICghdEkxOG4gfHwgIXRJMThuLmFzdCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRJMThuLmFzdCkge1xuICAgICAgY29sbGVjdEkxOG5WaWV3cyhub2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW4uc2l6ZSA9PT0gMCA/IG51bGwgOiBjaGlsZHJlbjtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBzZXJpYWxpemUgaTE4biBkYXRhIGZvciBhbiBpMThuIGJsb2NrLCBsb2NhdGVkIGF0XG4gKiB0aGUgZ2l2ZW4gdmlldyBhbmQgaW5zdHJ1Y3Rpb24gaW5kZXguXG4gKlxuICogQHBhcmFtIGxWaWV3IGxWaWV3IHdpdGggdGhlIGkxOG4gYmxvY2tcbiAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgaTE4biBibG9jayBpbiB0aGUgbFZpZXdcbiAqIEBwYXJhbSBjb250ZXh0IHRoZSBoeWRyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgdGhlIGkxOG4gZGF0YSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyByZWxldmFudCBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlTZXJpYWxpemVJMThuQmxvY2soXG4gICAgbFZpZXc6IExWaWV3LCBpbmRleDogbnVtYmVyLCBjb250ZXh0OiBIeWRyYXRpb25Db250ZXh0KTogQXJyYXk8bnVtYmVyPnxudWxsIHtcbiAgaWYgKCFjb250ZXh0LmlzSTE4bkh5ZHJhdGlvbkVuYWJsZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICBjb25zdCB0STE4biA9IHRWaWV3LmRhdGFbaW5kZXhdIGFzIFRJMThuIHwgdW5kZWZpbmVkO1xuICBpZiAoIXRJMThuIHx8ICF0STE4bi5hc3QpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNhc2VRdWV1ZTogbnVtYmVyW10gPSBbXTtcbiAgdEkxOG4uYXN0LmZvckVhY2gobm9kZSA9PiBzZXJpYWxpemVJMThuQmxvY2sobFZpZXcsIGNhc2VRdWV1ZSwgY29udGV4dCwgbm9kZSkpO1xuICByZXR1cm4gY2FzZVF1ZXVlLmxlbmd0aCA+IDAgPyBjYXNlUXVldWUgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVJMThuQmxvY2soXG4gICAgbFZpZXc6IExWaWV3LCBjYXNlUXVldWU6IG51bWJlcltdLCBjb250ZXh0OiBIeWRyYXRpb25Db250ZXh0LCBub2RlOiBJMThuTm9kZSkge1xuICBzd2l0Y2ggKG5vZGUua2luZCkge1xuICAgIGNhc2UgSTE4bk5vZGVLaW5kLlRFWFQ6XG4gICAgICBjb25zdCByTm9kZSA9IHVud3JhcFJOb2RlKGxWaWV3W25vZGUuaW5kZXhdISk7XG4gICAgICBwcm9jZXNzVGV4dE5vZGVCZWZvcmVTZXJpYWxpemF0aW9uKGNvbnRleHQsIHJOb2RlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJMThuTm9kZUtpbmQuRUxFTUVOVDpcbiAgICBjYXNlIEkxOG5Ob2RlS2luZC5QTEFDRUhPTERFUjpcbiAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChub2RlID0+IHNlcmlhbGl6ZUkxOG5CbG9jayhsVmlldywgY2FzZVF1ZXVlLCBjb250ZXh0LCBub2RlKSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSTE4bk5vZGVLaW5kLklDVTpcbiAgICAgIGNvbnN0IGN1cnJlbnRDYXNlID0gbFZpZXdbbm9kZS5jdXJyZW50Q2FzZUxWaWV3SW5kZXhdIGFzIG51bWJlciB8IG51bGw7XG4gICAgICBpZiAoY3VycmVudENhc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBpMThuIHVzZXMgYSBuZWdhdGl2ZSB2YWx1ZSB0byBzaWduYWwgYSBjaGFuZ2UgdG8gYSBuZXcgY2FzZSwgc28gd2VcbiAgICAgICAgLy8gbmVlZCB0byBpbnZlcnQgaXQgdG8gZ2V0IHRoZSBwcm9wZXIgdmFsdWUuXG4gICAgICAgIGNvbnN0IGNhc2VJZHggPSBjdXJyZW50Q2FzZSA8IDAgPyB+Y3VycmVudENhc2UgOiBjdXJyZW50Q2FzZTtcbiAgICAgICAgY2FzZVF1ZXVlLnB1c2goY2FzZUlkeCk7XG4gICAgICAgIG5vZGUuY2FzZXNbY2FzZUlkeF0uZm9yRWFjaChub2RlID0+IHNlcmlhbGl6ZUkxOG5CbG9jayhsVmlldywgY2FzZVF1ZXVlLCBjb250ZXh0LCBub2RlKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBzaGFyZWQgZGF0YSBhdmFpbGFibGUgZHVyaW5nIHRoZSBoeWRyYXRpb24gcHJvY2Vzcy5cbiAqL1xuaW50ZXJmYWNlIEkxOG5IeWRyYXRpb25Db250ZXh0IHtcbiAgaHlkcmF0aW9uSW5mbzogRGVoeWRyYXRlZFZpZXc7XG4gIGxWaWV3OiBMVmlldztcbiAgaTE4bk5vZGVzOiBNYXA8bnVtYmVyLCBSTm9kZXxudWxsPjtcbiAgZGlzY29ubmVjdGVkTm9kZXM6IFNldDxudW1iZXI+O1xuICBjYXNlUXVldWU6IG51bWJlcltdO1xuICBkZWh5ZHJhdGVkSWN1RGF0YTogTWFwPG51bWJlciwgRGVoeWRyYXRlZEljdURhdGE+O1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBjdXJyZW50IGh5ZHJhdGlvbiBzdGF0ZS5cbiAqL1xuaW50ZXJmYWNlIEkxOG5IeWRyYXRpb25TdGF0ZSB7XG4gIC8vIFRoZSBjdXJyZW50IG5vZGVcbiAgY3VycmVudE5vZGU6IE5vZGV8bnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdHJlZSBzaG91bGQgYmUgY29ubmVjdGVkLlxuICAgKlxuICAgKiBEdXJpbmcgaHlkcmF0aW9uLCBpdCBjYW4gaGFwcGVuIHRoYXQgd2UgZXhwZWN0IHRvIGhhdmUgYVxuICAgKiBjdXJyZW50IFJOb2RlLCBidXQgd2UgZG9uJ3QuIEluIHN1Y2ggY2FzZXMsIHdlIHN0aWxsIG5lZWRcbiAgICogdG8gcHJvcGFnYXRlIHRoZSBleHBlY3RhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBMVmlld3MsXG4gICAqIHNvIHRoYXQgdGhlIHByb3BlciBkb3duc3RyZWFtIGVycm9yIGhhbmRsaW5nIGNhbiBwcm92aWRlXG4gICAqIHRoZSBjb3JyZWN0IGNvbnRleHQgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIGlzQ29ubmVjdGVkOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50Tm9kZShzdGF0ZTogSTE4bkh5ZHJhdGlvblN0YXRlLCBub2RlOiBOb2RlfG51bGwpIHtcbiAgc3RhdGUuY3VycmVudE5vZGUgPSBub2RlO1xufVxuXG4vKipcbiAqIE1hcmtzIHRoZSBjdXJyZW50IFJOb2RlIGFzIHRoZSBoeWRyYXRpb24gcm9vdCBmb3IgdGhlIGdpdmVuXG4gKiBBU1Qgbm9kZS5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kSTE4bk5vZGVUb0NvbGxlY3Rpb24oXG4gICAgY29udGV4dDogSTE4bkh5ZHJhdGlvbkNvbnRleHQsIHN0YXRlOiBJMThuSHlkcmF0aW9uU3RhdGUsIGFzdE5vZGU6IEkxOG5Ob2RlKSB7XG4gIGNvbnN0IG5vT2Zmc2V0SW5kZXggPSBhc3ROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVDtcbiAgY29uc3Qge2Rpc2Nvbm5lY3RlZE5vZGVzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGN1cnJlbnROb2RlID0gc3RhdGUuY3VycmVudE5vZGU7XG5cbiAgaWYgKHN0YXRlLmlzQ29ubmVjdGVkKSB7XG4gICAgY29udGV4dC5pMThuTm9kZXMuc2V0KG5vT2Zmc2V0SW5kZXgsIGN1cnJlbnROb2RlKTtcblxuICAgIC8vIFdlIGV4cGVjdCB0aGUgbm9kZSB0byBiZSBjb25uZWN0ZWQsIHNvIGVuc3VyZSB0aGF0IGl0XG4gICAgLy8gaXMgbm90IGluIHRoZSBzZXQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBmb3VuZCBpdCxcbiAgICAvLyBzbyB0aGF0IHRoZSBkb3duc3RyZWFtIGVycm9yIGhhbmRsaW5nIGNhbiBwcm92aWRlIHRoZVxuICAgIC8vIHByb3BlciBjb250ZXh0LlxuICAgIGRpc2Nvbm5lY3RlZE5vZGVzLmRlbGV0ZShub09mZnNldEluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICBkaXNjb25uZWN0ZWROb2Rlcy5hZGQobm9PZmZzZXRJbmRleCk7XG4gIH1cblxuICByZXR1cm4gY3VycmVudE5vZGU7XG59XG5cbi8qKlxuICogU2tpcCBvdmVyIHNvbWUgc2libGluZyBub2RlcyBkdXJpbmcgaHlkcmF0aW9uLlxuICpcbiAqIE5vdGU6IHdlIHVzZSB0aGlzIGluc3RlYWQgb2YgYHNpYmxpbmdBZnRlcmAgYXMgaXQncyBleHBlY3RlZCB0aGF0XG4gKiBzb21ldGltZXMgd2UgbWlnaHQgZW5jb3VudGVyIG51bGwgbm9kZXMuIEluIHRob3NlIGNhc2VzLCB3ZSB3YW50IHRvXG4gKiBkZWZlciB0byBkb3duc3RyZWFtIGVycm9yIGhhbmRsaW5nIHRvIHByb3ZpZGUgcHJvcGVyIGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIHNraXBTaWJsaW5nTm9kZXMoc3RhdGU6IEkxOG5IeWRyYXRpb25TdGF0ZSwgc2tpcDogbnVtYmVyKSB7XG4gIGxldCBjdXJyZW50Tm9kZSA9IHN0YXRlLmN1cnJlbnROb2RlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNraXA7IGkrKykge1xuICAgIGlmICghY3VycmVudE5vZGUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlPy5uZXh0U2libGluZyA/PyBudWxsO1xuICB9XG4gIHJldHVybiBjdXJyZW50Tm9kZTtcbn1cblxuLyoqXG4gKiBGb3JrIHRoZSBnaXZlbiBzdGF0ZSBpbnRvIGEgbmV3IHN0YXRlIGZvciBoeWRyYXRpbmcgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGZvcmtIeWRyYXRpb25TdGF0ZShzdGF0ZTogSTE4bkh5ZHJhdGlvblN0YXRlLCBuZXh0Tm9kZTogTm9kZXxudWxsKSB7XG4gIHJldHVybiB7Y3VycmVudE5vZGU6IG5leHROb2RlLCBpc0Nvbm5lY3RlZDogc3RhdGUuaXNDb25uZWN0ZWR9O1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlSTE4bkJsb2NrRm9ySHlkcmF0aW9uSW1wbChcbiAgICBsVmlldzogTFZpZXcsIGluZGV4OiBudW1iZXIsIHBhcmVudFROb2RlOiBUTm9kZXxudWxsLCBzdWJUZW1wbGF0ZUluZGV4OiBudW1iZXIpIHtcbiAgaWYgKCFpc0kxOG5IeWRyYXRpb25TdXBwb3J0RW5hYmxlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaHlkcmF0aW9uSW5mbyA9IGxWaWV3W0hZRFJBVElPTl07XG4gIGlmICghaHlkcmF0aW9uSW5mbykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICBjb25zdCB0STE4biA9IHRWaWV3LmRhdGFbaW5kZXhdIGFzIFRJMThuO1xuICBuZ0Rldk1vZGUgJiZcbiAgICAgIGFzc2VydERlZmluZWQoXG4gICAgICAgICAgdEkxOG4sICdFeHBlY3RlZCBpMThuIGRhdGEgdG8gYmUgcHJlc2VudCBpbiBhIGdpdmVuIFRWaWV3IHNsb3QgZHVyaW5nIGh5ZHJhdGlvbicpO1xuXG4gIGZ1bmN0aW9uIGZpbmRIeWRyYXRpb25Sb290KCkge1xuICAgIGlmIChpc1Jvb3RUZW1wbGF0ZU1lc3NhZ2Uoc3ViVGVtcGxhdGVJbmRleCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYW4gaTE4biBibG9jay4gSW4gdGhpcyBjYXNlLCBvdXIgaHlkcmF0aW9uIHJvb3Qgd2lsbFxuICAgICAgLy8gZGVwZW5kIG9uIHdoZXJlIG91ciBwYXJlbnQgVE5vZGUgKGkuZS4gdGhlIGJsb2NrIHdpdGggaTE4biBhcHBsaWVkKSBpc1xuICAgICAgLy8gaW4gdGhlIERPTS5cbiAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHBhcmVudFROb2RlLCAnRXhwZWN0ZWQgcGFyZW50IFROb2RlIHdoaWxlIGh5ZHJhdGluZyBpMThuIHJvb3QnKTtcbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gbG9jYXRlTmV4dFJOb2RlKGh5ZHJhdGlvbkluZm8hLCB0VmlldywgbFZpZXcsIHBhcmVudFROb2RlISkgYXMgTm9kZTtcblxuICAgICAgLy8gSWYgdGhpcyBpMThuIGJsb2NrIGlzIGF0dGFjaGVkIHRvIGFuIDxuZy1jb250YWluZXI+LCB0aGVuIHdlIHdhbnQgdG8gYmVnaW5cbiAgICAgIC8vIGh5ZHJhdGluZyBkaXJlY3RseSB3aXRoIHRoZSBSTm9kZS4gT3RoZXJ3aXNlLCBmb3IgYSBUTm9kZSB3aXRoIGEgcGh5c2ljYWwgRE9NXG4gICAgICAvLyBlbGVtZW50LCB3ZSB3YW50IHRvIHJlY3Vyc2UgaW50byB0aGUgZmlyc3QgY2hpbGQgYW5kIGJlZ2luIHRoZXJlLlxuICAgICAgcmV0dXJuIChwYXJlbnRUTm9kZSEudHlwZSAmIFROb2RlVHlwZS5FbGVtZW50Q29udGFpbmVyKSA/IHJvb3ROb2RlIDogcm9vdE5vZGUuZmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGEgbmVzdGVkIHRlbXBsYXRlIGluIGFuIGkxOG4gYmxvY2suIEluIHRoaXMgY2FzZSwgdGhlIGVudGlyZSB2aWV3XG4gICAgLy8gaXMgdHJhbnNsYXRlZCwgYW5kIHBhcnQgb2YgYSBkZWh5ZHJhdGVkIHZpZXcgaW4gYSBjb250YWluZXIuIFRoaXMgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGNhbiBzaW1wbHkgYmVnaW4gaHlkcmF0aW9uIHdpdGggdGhlIGZpcnN0IGRlaHlkcmF0ZWQgY2hpbGQuXG4gICAgcmV0dXJuIGh5ZHJhdGlvbkluZm8/LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnROb2RlID0gZmluZEh5ZHJhdGlvblJvb3QoKTtcbiAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoY3VycmVudE5vZGUsICdFeHBlY3RlZCByb290IGkxOG4gbm9kZSBkdXJpbmcgaHlkcmF0aW9uJyk7XG5cbiAgY29uc3QgZGlzY29ubmVjdGVkTm9kZXMgPSBpbml0RGlzY29ubmVjdGVkTm9kZXMoaHlkcmF0aW9uSW5mbykgPz8gbmV3IFNldCgpO1xuICBjb25zdCBpMThuTm9kZXMgPSBoeWRyYXRpb25JbmZvLmkxOG5Ob2RlcyA/Pz0gbmV3IE1hcDxudW1iZXIsIFJOb2RlfG51bGw+KCk7XG4gIGNvbnN0IGNhc2VRdWV1ZSA9IGh5ZHJhdGlvbkluZm8uZGF0YVtJMThOX0RBVEFdPy5baW5kZXggLSBIRUFERVJfT0ZGU0VUXSA/PyBbXTtcbiAgY29uc3QgZGVoeWRyYXRlZEljdURhdGEgPSBoeWRyYXRpb25JbmZvLmRlaHlkcmF0ZWRJY3VEYXRhID8/PVxuICAgICAgbmV3IE1hcDxudW1iZXIsIERlaHlkcmF0ZWRJY3VEYXRhPigpO1xuXG4gIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICAgICAge2h5ZHJhdGlvbkluZm8sIGxWaWV3LCBpMThuTm9kZXMsIGRpc2Nvbm5lY3RlZE5vZGVzLCBjYXNlUXVldWUsIGRlaHlkcmF0ZWRJY3VEYXRhfSxcbiAgICAgIHtjdXJyZW50Tm9kZSwgaXNDb25uZWN0ZWQ6IHRydWV9LCB0STE4bi5hc3QpO1xuXG4gIC8vIE5vZGVzIGZyb20gaW5hY3RpdmUgSUNVIGNhc2VzIHNob3VsZCBiZSBjb25zaWRlcmVkIGRpc2Nvbm5lY3RlZC4gV2UgdHJhY2sgdGhlbSBhYm92ZVxuICAvLyBiZWNhdXNlIHRoZXkgYXJlbid0IChhbmQgc2hvdWxkbid0IGJlKSBzZXJpYWxpemVkLiBTaW5jZSB3ZSBtYXkgbXV0YXRlIG9yIGNyZWF0ZSBhXG4gIC8vIG5ldyBzZXQsIHdlIG5lZWQgdG8gYmUgc3VyZSB0byB3cml0ZSB0aGUgZXhwZWN0ZWQgdmFsdWUgYmFjayB0byB0aGUgRGVoeWRyYXRlZFZpZXcuXG4gIGh5ZHJhdGlvbkluZm8uZGlzY29ubmVjdGVkTm9kZXMgPSBkaXNjb25uZWN0ZWROb2Rlcy5zaXplID09PSAwID8gbnVsbCA6IGRpc2Nvbm5lY3RlZE5vZGVzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0STE4bk5vZGVzRnJvbURvbShcbiAgICBjb250ZXh0OiBJMThuSHlkcmF0aW9uQ29udGV4dCwgc3RhdGU6IEkxOG5IeWRyYXRpb25TdGF0ZSwgbm9kZU9yTm9kZXM6IEkxOG5Ob2RlfEkxOG5Ob2RlW10pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZU9yTm9kZXMpKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVPck5vZGVzKSB7XG4gICAgICAvLyBJZiB0aGUgbm9kZSBpcyBiZWluZyBwcm9qZWN0ZWQgZWxzZXdoZXJlLCB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5XG4gICAgICAvLyBicmFuY2ggdGhlIHN0YXRlIHRvIHRoYXQgbG9jYXRpb24gdG8gY29udGludWUgaHlkcmF0aW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBjb250aW51ZSBoeWRyYXRpb24gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi5cbiAgICAgIGNvbnN0IHRhcmdldE5vZGUgPVxuICAgICAgICAgIHRyeUxvY2F0ZVJOb2RlQnlQYXRoKGNvbnRleHQuaHlkcmF0aW9uSW5mbywgY29udGV4dC5sVmlldywgbm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQpO1xuICAgICAgY29uc3QgbmV4dFN0YXRlID0gdGFyZ2V0Tm9kZSA/IGZvcmtIeWRyYXRpb25TdGF0ZShzdGF0ZSwgdGFyZ2V0Tm9kZSBhcyBOb2RlKSA6IHN0YXRlO1xuICAgICAgY29sbGVjdEkxOG5Ob2Rlc0Zyb21Eb20oY29udGV4dCwgbmV4dFN0YXRlLCBub2RlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChub2RlT3JOb2Rlcy5raW5kKSB7XG4gICAgICBjYXNlIEkxOG5Ob2RlS2luZC5URVhUOiB7XG4gICAgICAgIC8vIENsYWltIGEgdGV4dCBub2RlIGZvciBoeWRyYXRpb25cbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBhcHBlbmRJMThuTm9kZVRvQ29sbGVjdGlvbihjb250ZXh0LCBzdGF0ZSwgbm9kZU9yTm9kZXMpO1xuICAgICAgICBzZXRDdXJyZW50Tm9kZShzdGF0ZSwgY3VycmVudE5vZGU/Lm5leHRTaWJsaW5nID8/IG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBJMThuTm9kZUtpbmQuRUxFTUVOVDoge1xuICAgICAgICAvLyBSZWN1cnNlIGludG8gdGhlIGN1cnJlbnQgZWxlbWVudCdzIGNoaWxkcmVuLi4uXG4gICAgICAgIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKFxuICAgICAgICAgICAgY29udGV4dCwgZm9ya0h5ZHJhdGlvblN0YXRlKHN0YXRlLCBzdGF0ZS5jdXJyZW50Tm9kZT8uZmlyc3RDaGlsZCA/PyBudWxsKSxcbiAgICAgICAgICAgIG5vZGVPck5vZGVzLmNoaWxkcmVuKTtcblxuICAgICAgICAvLyBBbmQgY2xhaW0gdGhlIHBhcmVudCBlbGVtZW50IGl0c2VsZi5cbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBhcHBlbmRJMThuTm9kZVRvQ29sbGVjdGlvbihjb250ZXh0LCBzdGF0ZSwgbm9kZU9yTm9kZXMpO1xuICAgICAgICBzZXRDdXJyZW50Tm9kZShzdGF0ZSwgY3VycmVudE5vZGU/Lm5leHRTaWJsaW5nID8/IG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBJMThuTm9kZUtpbmQuUExBQ0VIT0xERVI6IHtcbiAgICAgICAgY29uc3Qgbm9PZmZzZXRJbmRleCA9IG5vZGVPck5vZGVzLmluZGV4IC0gSEVBREVSX09GRlNFVDtcbiAgICAgICAgY29uc3Qge2h5ZHJhdGlvbkluZm99ID0gY29udGV4dDtcbiAgICAgICAgY29uc3QgY29udGFpbmVyU2l6ZSA9IGdldE5nQ29udGFpbmVyU2l6ZShoeWRyYXRpb25JbmZvLCBub09mZnNldEluZGV4KTtcblxuICAgICAgICBzd2l0Y2ggKG5vZGVPck5vZGVzLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIEkxOG5QbGFjZWhvbGRlclR5cGUuRUxFTUVOVDoge1xuICAgICAgICAgICAgLy8gSHlkcmF0aW9uIGV4cGVjdHMgdG8gZmluZCB0aGUgaGVhZCBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gYXBwZW5kSTE4bk5vZGVUb0NvbGxlY3Rpb24oY29udGV4dCwgc3RhdGUsIG5vZGVPck5vZGVzKTtcblxuICAgICAgICAgICAgLy8gQSBUTm9kZSBmb3IgdGhlIG5vZGUgbWF5IG5vdCB5ZXQgaWYgd2UncmUgaHlkcmF0aW5nIGR1cmluZyB0aGUgZmlyc3QgcGFzcyxcbiAgICAgICAgICAgIC8vIHNvIHVzZSB0aGUgc2VyaWFsaXplZCBkYXRhIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGFuIDxuZy1jb250YWluZXI+LlxuICAgICAgICAgICAgaWYgKGlzU2VyaWFsaXplZEVsZW1lbnRDb250YWluZXIoaHlkcmF0aW9uSW5mbywgbm9PZmZzZXRJbmRleCkpIHtcbiAgICAgICAgICAgICAgLy8gQW4gPG5nLWNvbnRhaW5lcj4gZG9lc24ndCBoYXZlIGEgcGh5c2ljYWwgRE9NIG5vZGUsIHNvIHdlIG5lZWQgdG9cbiAgICAgICAgICAgICAgLy8gY29udGludWUgaHlkcmF0aW5nIGZyb20gc2libGluZ3MuXG4gICAgICAgICAgICAgIGNvbGxlY3RJMThuTm9kZXNGcm9tRG9tKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcy5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBhbmNob3IgZWxlbWVudC4gSXQgd2lsbCBiZSBjbGFpbWVkIGJ5IHRoZVxuICAgICAgICAgICAgICAvLyBkb3duc3RyZWFtIGNvbnRhaW5lciBoeWRyYXRpb24uXG4gICAgICAgICAgICAgIGNvbnN0IG5leHROb2RlID0gc2tpcFNpYmxpbmdOb2RlcyhzdGF0ZSwgMSk7XG4gICAgICAgICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBuZXh0Tm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBOb24tY29udGFpbmVyIGVsZW1lbnRzIHJlcHJlc2VudCBhbiBhY3R1YWwgbm9kZSBpbiB0aGUgRE9NLCBzbyB3ZVxuICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNvbnRpbnVlIGh5ZHJhdGlvbiB3aXRoIHRoZSBjaGlsZHJlbiwgYW5kIGNsYWltIHRoZSBub2RlLlxuICAgICAgICAgICAgICBjb2xsZWN0STE4bk5vZGVzRnJvbURvbShcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZvcmtIeWRyYXRpb25TdGF0ZShzdGF0ZSwgc3RhdGUuY3VycmVudE5vZGU/LmZpcnN0Q2hpbGQgPz8gbnVsbCksXG4gICAgICAgICAgICAgICAgICBub2RlT3JOb2Rlcy5jaGlsZHJlbik7XG4gICAgICAgICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG5cbiAgICAgICAgICAgICAgLy8gRWxlbWVudHMgY2FuIGFsc28gYmUgdGhlIGFuY2hvciBvZiBhIHZpZXcgY29udGFpbmVyLCBzbyB0aGVyZSBtYXlcbiAgICAgICAgICAgICAgLy8gYmUgZWxlbWVudHMgYWZ0ZXIgdGhpcyBub2RlIHRoYXQgd2UgbmVlZCB0byBza2lwLlxuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGArMWAgc3RhbmRzIGZvciBhbiBhbmNob3Igbm9kZSBhZnRlciBhbGwgb2YgdGhlIHZpZXdzIGluIHRoZSBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBza2lwU2libGluZ05vZGVzKHN0YXRlLCBjb250YWluZXJTaXplICsgMSk7XG4gICAgICAgICAgICAgICAgc2V0Q3VycmVudE5vZGUoc3RhdGUsIG5leHROb2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBJMThuUGxhY2Vob2xkZXJUeXBlLlNVQlRFTVBMQVRFOiB7XG4gICAgICAgICAgICBuZ0Rldk1vZGUgJiZcbiAgICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbChcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU2l6ZSwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdGVkIGEgY29udGFpbmVyIHNpemUgd2hpbGUgaHlkcmF0aW5nIGkxOG4gc3VidGVtcGxhdGUnKTtcblxuICAgICAgICAgICAgLy8gSHlkcmF0aW9uIGV4cGVjdHMgdG8gZmluZCB0aGUgaGVhZCBvZiB0aGUgdGVtcGxhdGUuXG4gICAgICAgICAgICBhcHBlbmRJMThuTm9kZVRvQ29sbGVjdGlvbihjb250ZXh0LCBzdGF0ZSwgbm9kZU9yTm9kZXMpO1xuXG4gICAgICAgICAgICAvLyBTa2lwIG92ZXIgYWxsIG9mIHRoZSB0ZW1wbGF0ZSBjaGlsZHJlbiwgYXMgd2VsbCBhcyB0aGUgYW5jaG9yXG4gICAgICAgICAgICAvLyBub2RlLCBzaW5jZSB0aGUgdGVtcGxhdGUgaXRzZWxmIHdpbGwgaGFuZGxlIHRoZW0gaW5zdGVhZC5cbiAgICAgICAgICAgIGNvbnN0IG5leHROb2RlID0gc2tpcFNpYmxpbmdOb2RlcyhzdGF0ZSwgY29udGFpbmVyU2l6ZSEgKyAxKTtcbiAgICAgICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBuZXh0Tm9kZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgSTE4bk5vZGVLaW5kLklDVToge1xuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBub2RlIGlzIGNvbm5lY3RlZCwgd2UgbmVlZCB0byBwb3AgdGhlIG5leHQgY2FzZSBmcm9tIHRoZVxuICAgICAgICAvLyBxdWV1ZSwgc28gdGhhdCB0aGUgYWN0aXZlIGNhc2UgaXMgYWxzbyBjb25zaWRlcmVkIGNvbm5lY3RlZC5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDYXNlID0gc3RhdGUuaXNDb25uZWN0ZWQgPyBjb250ZXh0LmNhc2VRdWV1ZS5zaGlmdCgpISA6IG51bGw7XG4gICAgICAgIGNvbnN0IGNoaWxkU3RhdGUgPSB7Y3VycmVudE5vZGU6IG51bGwsIGlzQ29ubmVjdGVkOiBmYWxzZX07XG5cbiAgICAgICAgLy8gV2UgdHJhdmVyc2UgdGhyb3VnaCBlYWNoIGNhc2UsIGV2ZW4gaWYgaXQncyBub3QgYWN0aXZlLFxuICAgICAgICAvLyBzbyB0aGF0IHdlIGNvcnJlY3RseSBwb3B1bGF0ZSBkaXNjb25uZWN0ZWQgbm9kZXMuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZU9yTm9kZXMuY2FzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb2xsZWN0STE4bk5vZGVzRnJvbURvbShcbiAgICAgICAgICAgICAgY29udGV4dCwgaSA9PT0gc2VsZWN0ZWRDYXNlID8gc3RhdGUgOiBjaGlsZFN0YXRlLCBub2RlT3JOb2Rlcy5jYXNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRDYXNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSUNVcyByZXByZXNlbnQgYSBicmFuY2hpbmcgc3RhdGUsIGFuZCB0aGUgc2VsZWN0ZWQgY2FzZSBjb3VsZCBiZSBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB0aGFuIHdoYXQgaXQgd2FzIG9uIHRoZSBzZXJ2ZXIuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGNsZWFuXG4gICAgICAgICAgLy8gdXAgdGhlIG5vZGVzIGZyb20gdGhlIG9yaWdpbmFsIGNhc2UuIFRvIGRvIHRoYXQsIHdlIHN0b3JlIHRoZSBzZWxlY3RlZCBjYXNlLlxuICAgICAgICAgIGNvbnRleHQuZGVoeWRyYXRlZEljdURhdGEuc2V0KG5vZGVPck5vZGVzLmluZGV4LCB7Y2FzZTogc2VsZWN0ZWRDYXNlLCBub2RlOiBub2RlT3JOb2Rlc30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSHlkcmF0aW9uIGV4cGVjdHMgdG8gZmluZCB0aGUgSUNVIGFuY2hvciBlbGVtZW50LlxuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGFwcGVuZEkxOG5Ob2RlVG9Db2xsZWN0aW9uKGNvbnRleHQsIHN0YXRlLCBub2RlT3JOb2Rlcyk7XG4gICAgICAgIHNldEN1cnJlbnROb2RlKHN0YXRlLCBjdXJyZW50Tm9kZT8ubmV4dFNpYmxpbmcgPz8gbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5sZXQgX2NsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsOiB0eXBlb2YgY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZUltcGwgPSAoKSA9PiB7XG4gIC8vIG5vb3AgdW5sZXNzIGBlbmFibGVDbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbGAgaXMgaW52b2tlZFxufTtcblxuLyoqXG4gKiBNYXJrIHRoZSBjYXNlIGZvciB0aGUgSUNVIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSB2aWV3IGFzIGNsYWltZWQsXG4gKiBhbGxvd2luZyBpdHMgbm9kZXMgdG8gYmUgaHlkcmF0ZWQgYW5kIG5vdCBjbGVhbmVkIHVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZShsVmlldzogTFZpZXcsIGljdUluZGV4OiBudW1iZXIsIGNhc2VJbmRleDogbnVtYmVyKSB7XG4gIF9jbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbChsVmlldywgaWN1SW5kZXgsIGNhc2VJbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVDbGFpbURlaHlkcmF0ZWRJY3VDYXNlSW1wbCgpIHtcbiAgX2NsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsID0gY2xhaW1EZWh5ZHJhdGVkSWN1Q2FzZUltcGw7XG59XG5cbmZ1bmN0aW9uIGNsYWltRGVoeWRyYXRlZEljdUNhc2VJbXBsKGxWaWV3OiBMVmlldywgaWN1SW5kZXg6IG51bWJlciwgY2FzZUluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZGVoeWRyYXRlZEljdURhdGFNYXAgPSBsVmlld1tIWURSQVRJT05dPy5kZWh5ZHJhdGVkSWN1RGF0YTtcbiAgaWYgKGRlaHlkcmF0ZWRJY3VEYXRhTWFwKSB7XG4gICAgY29uc3QgZGVoeWRyYXRlZEljdURhdGEgPSBkZWh5ZHJhdGVkSWN1RGF0YU1hcC5nZXQoaWN1SW5kZXgpO1xuICAgIGlmIChkZWh5ZHJhdGVkSWN1RGF0YT8uY2FzZSA9PT0gY2FzZUluZGV4KSB7XG4gICAgICAvLyBJZiB0aGUgY2FzZSB3ZSdyZSBhdHRlbXB0aW5nIHRvIGNsYWltIG1hdGNoZXMgdGhlIGRlaHlkcmF0ZWQgb25lLFxuICAgICAgLy8gd2UgcmVtb3ZlIGl0IGZyb20gdGhlIG1hcCB0byBtYXJrIGl0IGFzIFwiY2xhaW1lZC5cIlxuICAgICAgZGVoeWRyYXRlZEljdURhdGFNYXAuZGVsZXRlKGljdUluZGV4KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBhbGwgaTE4biBoeWRyYXRpb24gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHZpZXcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwSTE4bkh5ZHJhdGlvbkRhdGEobFZpZXc6IExWaWV3KSB7XG4gIGNvbnN0IGh5ZHJhdGlvbkluZm8gPSBsVmlld1tIWURSQVRJT05dO1xuICBpZiAoaHlkcmF0aW9uSW5mbykge1xuICAgIGNvbnN0IHtpMThuTm9kZXMsIGRlaHlkcmF0ZWRJY3VEYXRhOiBkZWh5ZHJhdGVkSWN1RGF0YU1hcH0gPSBoeWRyYXRpb25JbmZvO1xuICAgIGlmIChpMThuTm9kZXMgJiYgZGVoeWRyYXRlZEljdURhdGFNYXApIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdO1xuICAgICAgZm9yIChjb25zdCBkZWh5ZHJhdGVkSWN1RGF0YSBvZiBkZWh5ZHJhdGVkSWN1RGF0YU1hcC52YWx1ZXMoKSkge1xuICAgICAgICBjbGVhbnVwRGVoeWRyYXRlZEljdURhdGEocmVuZGVyZXIsIGkxOG5Ob2RlcywgZGVoeWRyYXRlZEljdURhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGh5ZHJhdGlvbkluZm8uaTE4bk5vZGVzID0gdW5kZWZpbmVkO1xuICAgIGh5ZHJhdGlvbkluZm8uZGVoeWRyYXRlZEljdURhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW51cERlaHlkcmF0ZWRJY3VEYXRhKFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlciwgaTE4bk5vZGVzOiBNYXA8bnVtYmVyLCBSTm9kZXxudWxsPiwgZGVoeWRyYXRlZEljdURhdGE6IERlaHlkcmF0ZWRJY3VEYXRhKSB7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBkZWh5ZHJhdGVkSWN1RGF0YS5ub2RlLmNhc2VzW2RlaHlkcmF0ZWRJY3VEYXRhLmNhc2VdKSB7XG4gICAgY29uc3Qgck5vZGUgPSBpMThuTm9kZXMuZ2V0KG5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUKTtcbiAgICBpZiAock5vZGUpIHtcbiAgICAgIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -30,4 +30,5 @@ export const NUM_ROOT_NODES = 'r';
30
30
  export const TEMPLATE_ID = 'i'; // as it's also an "id"
31
31
  export const NODES = 'n';
32
32
  export const DISCONNECTED_NODES = 'd';
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2h5ZHJhdGlvbi9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUtILHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFdkMsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUV2Qzs7O0dBR0c7QUFDSCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLHNDQUFnQixDQUFBO0lBQ2hCLHVDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7QUFDN0IsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFFLHVCQUF1QjtBQUN4RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1JOb2RlfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvcmVuZGVyZXJfZG9tJztcblxuXG4vKiogRW5jb2RlcyB0aGF0IHRoZSBub2RlIGxvb2t1cCBzaG91bGQgc3RhcnQgZnJvbSB0aGUgaG9zdCBub2RlIG9mIHRoaXMgY29tcG9uZW50LiAqL1xuZXhwb3J0IGNvbnN0IFJFRkVSRU5DRV9OT0RFX0hPU1QgPSAnaCc7XG5cbi8qKiBFbmNvZGVzIHRoYXQgdGhlIG5vZGUgbG9va3VwIHNob3VsZCBzdGFydCBmcm9tIHRoZSBkb2N1bWVudCBib2R5IG5vZGUuICovXG5leHBvcnQgY29uc3QgUkVGRVJFTkNFX05PREVfQk9EWSA9ICdiJztcblxuLyoqXG4gKiBEZXNjcmliZXMgbmF2aWdhdGlvbiBzdGVwcyB0aGF0IHRoZSBydW50aW1lIGxvZ2ljIG5lZWQgdG8gcGVyZm9ybSxcbiAqIHN0YXJ0aW5nIGZyb20gYSBnaXZlbiAoa25vd24pIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIE5vZGVOYXZpZ2F0aW9uU3RlcCB7XG4gIEZpcnN0Q2hpbGQgPSAnZicsXG4gIE5leHRTaWJsaW5nID0gJ24nLFxufVxuXG4vKipcbiAqIEtleXMgd2l0aGluIHNlcmlhbGl6ZWQgdmlldyBkYXRhIHN0cnVjdHVyZSB0byByZXByZXNlbnQgdmFyaW91c1xuICogcGFydHMuIFNlZSB0aGUgYFNlcmlhbGl6ZWRWaWV3YCBpbnRlcmZhY2UgYmVsb3cgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBFTEVNRU5UX0NPTlRBSU5FUlMgPSAnZSc7XG5leHBvcnQgY29uc3QgVEVNUExBVEVTID0gJ3QnO1xuZXhwb3J0IGNvbnN0IENPTlRBSU5FUlMgPSAnYyc7XG5leHBvcnQgY29uc3QgTVVMVElQTElFUiA9ICd4JztcbmV4cG9ydCBjb25zdCBOVU1fUk9PVF9OT0RFUyA9ICdyJztcbmV4cG9ydCBjb25zdCBURU1QTEFURV9JRCA9ICdpJzsgIC8vIGFzIGl0J3MgYWxzbyBhbiBcImlkXCJcbmV4cG9ydCBjb25zdCBOT0RFUyA9ICduJztcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfTk9ERVMgPSAnZCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBlbGVtZW50IGNvbnRhaW5lcnMgd2l0aGluIHRoaXMgdmlldywgc3RvcmVkIGFzIGtleS12YWx1ZSBwYWlyc1xuICogd2hlcmUga2V5IGlzIGFuIGluZGV4IG9mIGEgY29udGFpbmVyIGluIGFuIExWaWV3IChhbHNvIHVzZWQgaW4gdGhlXG4gKiBgZWxlbWVudENvbnRhaW5lclN0YXJ0YCBpbnN0cnVjdGlvbiksIHRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHJvb3Qgbm9kZXNcbiAqIGluIHRoaXMgY29udGFpbmVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBsb2NhdGUgYW4gYW5jaG9yIGNvbW1lbnRcbiAqIG5vZGUgdGhhdCBnb2VzIGFmdGVyIGFsbCBjb250YWluZXIgbm9kZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZEVsZW1lbnRDb250YWluZXJzIHtcbiAgW2tleTogbnVtYmVyXTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyByZWxldmFudCBoeWRyYXRpb25cbiAqIGFubm90YXRpb24gaW5mb3JtYXRpb24gdGhhdCBkZXNjcmliZXMgYSBnaXZlbiBoeWRyYXRpb24gYm91bmRhcnlcbiAqIChlLmcuIGEgY29tcG9uZW50KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkVmlldyB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGluZm9ybWF0aW9uIGFib3V0IDxuZy1jb250YWluZXI+cy5cbiAgICovXG4gIFtFTEVNRU5UX0NPTlRBSU5FUlNdPzogU2VyaWFsaXplZEVsZW1lbnRDb250YWluZXJzO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGluZm9ybWF0aW9uIGFib3V0IHRlbXBsYXRlcy5cbiAgICogS2V5LXZhbHVlIHBhaXJzIHdoZXJlIGEga2V5IGlzIGFuIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gICAqIGB0ZW1wbGF0ZWAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBpZCB0aGF0IGNhblxuICAgKiBiZSB1c2VkIGR1cmluZyBoeWRyYXRpb24gdG8gaWRlbnRpZnkgdGhhdCB0ZW1wbGF0ZS5cbiAgICovXG4gIFtURU1QTEFURVNdPzogUmVjb3JkPG51bWJlciwgc3RyaW5nPjtcblxuICAvKipcbiAgICogU2VyaWFsaXplZCBpbmZvcm1hdGlvbiBhYm91dCB2aWV3IGNvbnRhaW5lcnMuXG4gICAqIEtleS12YWx1ZSBwYWlycyB3aGVyZSBhIGtleSBpcyBhbiBpbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiBMQ29udGFpbmVyIGVudHJ5IHdpdGhpbiBhbiBMVmlldywgYW5kIHRoZSB2YWx1ZSBpcyBhIGxpc3RcbiAgICogb2Ygc2VyaWFsaXplZCBpbmZvcm1hdGlvbiBhYm91dCB2aWV3cyB3aXRoaW4gdGhpcyBjb250YWluZXIuXG4gICAqL1xuICBbQ09OVEFJTkVSU10/OiBSZWNvcmQ8bnVtYmVyLCBTZXJpYWxpemVkQ29udGFpbmVyVmlld1tdPjtcblxuICAvKipcbiAgICogU2VyaWFsaXplZCBpbmZvcm1hdGlvbiBhYm91dCBub2RlcyBpbiBhIHRlbXBsYXRlLlxuICAgKiBLZXktdmFsdWUgcGFpcnMgd2hlcmUgYSBrZXkgaXMgYW4gaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICogRE9NIG5vZGUgaW4gYW4gTFZpZXcgYW5kIHRoZSB2YWx1ZSBpcyBhIHBhdGggdGhhdCBkZXNjcmliZXNcbiAgICogdGhlIGxvY2F0aW9uIG9mIHRoaXMgbm9kZSAoYXMgYSBzZXQgb2YgbmF2aWdhdGlvbiBpbnN0cnVjdGlvbnMpLlxuICAgKi9cbiAgW05PREVTXT86IFJlY29yZDxudW1iZXIsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpZHMgd2hpY2ggcmVwcmVzZW50cyBhIHNldCBvZiBub2RlcyBkaXNjb25uZWN0ZWRcbiAgICogZnJvbSB0aGUgRE9NIHRyZWUgYXQgdGhlIHNlcmlhbGl6YXRpb24gdGltZSwgYnV0IG90aGVyd2lzZVxuICAgKiBwcmVzZW50IGluIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSBoeWRyYXRpb25cbiAgICogbG9naWMgZm9yIHN1Y2ggbm9kZXMgYW5kIGluc3RlYWQgdXNlIGEgcmVndWxhciBcImNyZWF0aW9uIG1vZGVcIi5cbiAgICovXG4gIFtESVNDT05ORUNURURfTk9ERVNdPzogbnVtYmVyW107XG59XG5cbi8qKlxuICogU2VyaWFsaXplZCBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHJlbGV2YW50IGh5ZHJhdGlvblxuICogYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHZpZXcgdGhhdCBpcyBhIHBhcnQgb2YgYVxuICogVmlld0NvbnRhaW5lciBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRDb250YWluZXJWaWV3IGV4dGVuZHMgU2VyaWFsaXplZFZpZXcge1xuICAvKipcbiAgICogVW5pcXVlIGlkIHRoYXQgcmVwcmVzZW50cyBhIFRWaWV3IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlXG4gICAqIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgYSB2aWV3OlxuICAgKiAgLSBUVmlld1R5cGUuRW1iZWRkZWQ6IGEgdW5pcXVlIGlkIGdlbmVyYXRlZCBkdXJpbmcgc2VyaWFsaXphdGlvbiBvbiB0aGUgc2VydmVyXG4gICAqICAtIFRWaWV3VHlwZS5Db21wb25lbnQ6IGFuIGlkIGdlbmVyYXRlZCBiYXNlZCBvbiBjb21wb25lbnQgcHJvcGVydGllc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgYGdldENvbXBvbmVudElkYCBmdW5jdGlvbiBmb3IgZGV0YWlscylcbiAgICovXG4gIFtURU1QTEFURV9JRF06IHN0cmluZztcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHJvb3Qgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB2aWV3LlxuICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBlZmZlY3RpdmVseSB0cmF2ZXJzZSB0aGUgRE9NIHRyZWVcbiAgICogYW5kIGlkZW50aWZ5IHNlZ21lbnRzIHRoYXQgYmVsb25nIHRvIGRpZmZlcmVudCB2aWV3cy5cbiAgICovXG4gIFtOVU1fUk9PVF9OT0RFU106IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHRpbWVzIHRoaXMgdmlldyBpcyByZXBlYXRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHNlcmlhbGl6aW5nIGFuZCBzZW5kaW5nIHRoZSBzYW1lIGh5ZHJhdGlvblxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBzaW1pbGFyIHZpZXdzIChmb3IgZXhhbXBsZSwgcHJvZHVjZWQgYnkgKm5nRm9yKS5cbiAgICovXG4gIFtNVUxUSVBMSUVSXT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyBoeWRyYXRpb24tcmVsYXRlZCBpbmZvcm1hdGlvbiBzZXJpYWxpemVkXG4gKiBvbiB0aGUgc2VydmVyLCBhcyB3ZWxsIGFzIHRoZSBuZWNlc3NhcnkgcmVmZXJlbmNlcyB0byBzZWdtZW50cyBvZlxuICogdGhlIERPTSwgdG8gZmFjaWxpdGF0ZSB0aGUgaHlkcmF0aW9uIHByb2Nlc3MgZm9yIGEgZ2l2ZW4gaHlkcmF0aW9uXG4gKiBib3VuZGFyeSBvbiB0aGUgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlaHlkcmF0ZWRWaWV3IHtcbiAgLyoqXG4gICAqIFRoZSByZWFkb25seSBoeWRyYXRpb24gYW5ub3RhdGlvbiBkYXRhLlxuICAgKi9cbiAgZGF0YTogUmVhZG9ubHk8U2VyaWFsaXplZFZpZXc+O1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZmlyc3QgY2hpbGQgaW4gYSBET00gc2VnbWVudCBhc3NvY2lhdGVkXG4gICAqIHdpdGggYSBnaXZlbiBoeWRyYXRpb24gYm91bmRhcnkuXG4gICAqXG4gICAqIE9uY2UgYSB2aWV3IGJlY29tZXMgaHlkcmF0ZWQsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gYG51bGxgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhhdCBmdXJ0aGVyIGRldGFjaGluZy9hdHRhY2hpbmcgdmlldyBhY3Rpb25zIHNob3VsZCByZXN1bHRcbiAgICogaW4gaW52b2tpbmcgY29ycmVzcG9uZGluZyBET00gYWN0aW9ucyAoYXR0YWNoaW5nIERPTSBub2RlcyBhY3Rpb24gaXNcbiAgICogc2tpcHBlZCB3aGVuIHdlIGh5ZHJhdGUsIHNpbmNlIG5vZGVzIGFyZSBhbHJlYWR5IGluIHRoZSBET00pLlxuICAgKi9cbiAgZmlyc3RDaGlsZDogUk5vZGV8bnVsbDtcblxuICAvKipcbiAgICogU3RvcmVzIHJlZmVyZW5jZXMgdG8gZmlyc3Qgbm9kZXMgaW4gRE9NIHNlZ21lbnRzIHRoYXRcbiAgICogcmVwcmVzZW50IGVpdGhlciBhbiA8bmctY29udGFpbmVyPiBvciBhIHZpZXcgY29udGFpbmVyLlxuICAgKi9cbiAgc2VnbWVudEhlYWRzPzoge1tpbmRleDogbnVtYmVyXTogUk5vZGV8bnVsbH07XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIGEgU2V0IHRoYXQgcmVwcmVzZW50cyBub2RlcyBkaXNjb25uZWN0ZWQgZnJvbVxuICAgKiB0aGUgRE9NIHRyZWUgYXQgdGhlIHNlcmlhbGl6YXRpb24gdGltZSwgYnV0IG90aGVyd2lzZSBwcmVzZW50XG4gICAqIGluIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIFRoZSBTZXQgaXMgYmFzZWQgb24gdGhlIGBTZXJpYWxpemVkVmlld1tESVNDT05ORUNURURfTk9ERVNdYCBkYXRhXG4gICAqIGFuZCBpcyBuZWVkZWQgdG8gaGF2ZSBjb25zdGFudC10aW1lIGxvb2t1cHMuXG4gICAqXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBgbnVsbGAsIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2VyZSBubyBkaXNjb25uZWN0ZWRcbiAgICogbm9kZXMgZGV0ZWN0ZWQgaW4gdGhpcyB2aWV3IGF0IHNlcmlhbGl6YXRpb24gdGltZS5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZE5vZGVzPzogU2V0PG51bWJlcj58bnVsbDtcblxuICAvKipcbiAgICogQSBtYXBwaW5nIGZyb20gYSB2aWV3IHRvIHRoZSBmaXJzdCBjaGlsZCB0byBiZWdpbiBjbGFpbWluZyBub2Rlcy5cbiAgICpcbiAgICogVGhpcyBtYXBwaW5nIGlzIGdlbmVyYXRlZCBieSBhbiBpMThuIGJsb2NrLCBhbmQgaXMgdGhlIHNvdXJjZSBvZlxuICAgKiB0cnV0aCBmb3IgdGhlIG5vZGVzIGluc2lkZSBvZiBpdC4gT25jZSBhIHZpZXcgaGFzIGJlZW4gaHlkcmF0ZWQsXG4gICAqIHRoZSBub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwLiBUaGUgcmVtYWluaW5nIGVudHJpZXMgaW5kaWNhdGVcbiAgICogZGVoeWRyYXRlZCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgY2xlYW5lZCB1cC5cbiAgICovXG4gIGkxOG5Ob2Rlcz86IE1hcDxudW1iZXIsIFJOb2RlPjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyBoeWRyYXRpb24tcmVsYXRlZCBpbmZvcm1hdGlvbiBzZXJpYWxpemVkXG4gKiBvbiB0aGUgc2VydmVyLCBhcyB3ZWxsIGFzIHRoZSBuZWNlc3NhcnkgcmVmZXJlbmNlcyB0byBzZWdtZW50cyBvZlxuICogdGhlIERPTSwgdG8gZmFjaWxpdGF0ZSB0aGUgaHlkcmF0aW9uIHByb2Nlc3MgZm9yIGEgZ2l2ZW4gdmlld1xuICogaW5zaWRlIGEgdmlldyBjb250YWluZXIgKGVpdGhlciBhbiBlbWJlZGRlZCB2aWV3IG9yIGEgdmlldyBjcmVhdGVkXG4gKiBmb3IgYSBjb21wb25lbnQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlaHlkcmF0ZWRDb250YWluZXJWaWV3IGV4dGVuZHMgRGVoeWRyYXRlZFZpZXcge1xuICBkYXRhOiBSZWFkb25seTxTZXJpYWxpemVkQ29udGFpbmVyVmlldz47XG59XG4iXX0=
33
+ export const I18N_DATA = 'l';
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2h5ZHJhdGlvbi9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQU1ILHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFdkMsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUV2Qzs7O0dBR0c7QUFDSCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLHNDQUFnQixDQUFBO0lBQ2hCLHVDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7QUFDN0IsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFFLHVCQUF1QjtBQUN4RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUN0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHtJMThuSUNVTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL2kxOG4nO1xuaW1wb3J0IHtSTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3JlbmRlcmVyX2RvbSc7XG5cblxuLyoqIEVuY29kZXMgdGhhdCB0aGUgbm9kZSBsb29rdXAgc2hvdWxkIHN0YXJ0IGZyb20gdGhlIGhvc3Qgbm9kZSBvZiB0aGlzIGNvbXBvbmVudC4gKi9cbmV4cG9ydCBjb25zdCBSRUZFUkVOQ0VfTk9ERV9IT1NUID0gJ2gnO1xuXG4vKiogRW5jb2RlcyB0aGF0IHRoZSBub2RlIGxvb2t1cCBzaG91bGQgc3RhcnQgZnJvbSB0aGUgZG9jdW1lbnQgYm9keSBub2RlLiAqL1xuZXhwb3J0IGNvbnN0IFJFRkVSRU5DRV9OT0RFX0JPRFkgPSAnYic7XG5cbi8qKlxuICogRGVzY3JpYmVzIG5hdmlnYXRpb24gc3RlcHMgdGhhdCB0aGUgcnVudGltZSBsb2dpYyBuZWVkIHRvIHBlcmZvcm0sXG4gKiBzdGFydGluZyBmcm9tIGEgZ2l2ZW4gKGtub3duKSBlbGVtZW50LlxuICovXG5leHBvcnQgZW51bSBOb2RlTmF2aWdhdGlvblN0ZXAge1xuICBGaXJzdENoaWxkID0gJ2YnLFxuICBOZXh0U2libGluZyA9ICduJyxcbn1cblxuLyoqXG4gKiBLZXlzIHdpdGhpbiBzZXJpYWxpemVkIHZpZXcgZGF0YSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IHZhcmlvdXNcbiAqIHBhcnRzLiBTZWUgdGhlIGBTZXJpYWxpemVkVmlld2AgaW50ZXJmYWNlIGJlbG93IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgRUxFTUVOVF9DT05UQUlORVJTID0gJ2UnO1xuZXhwb3J0IGNvbnN0IFRFTVBMQVRFUyA9ICd0JztcbmV4cG9ydCBjb25zdCBDT05UQUlORVJTID0gJ2MnO1xuZXhwb3J0IGNvbnN0IE1VTFRJUExJRVIgPSAneCc7XG5leHBvcnQgY29uc3QgTlVNX1JPT1RfTk9ERVMgPSAncic7XG5leHBvcnQgY29uc3QgVEVNUExBVEVfSUQgPSAnaSc7ICAvLyBhcyBpdCdzIGFsc28gYW4gXCJpZFwiXG5leHBvcnQgY29uc3QgTk9ERVMgPSAnbic7XG5leHBvcnQgY29uc3QgRElTQ09OTkVDVEVEX05PREVTID0gJ2QnO1xuZXhwb3J0IGNvbnN0IEkxOE5fREFUQSA9ICdsJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGVsZW1lbnQgY29udGFpbmVycyB3aXRoaW4gdGhpcyB2aWV3LCBzdG9yZWQgYXMga2V5LXZhbHVlIHBhaXJzXG4gKiB3aGVyZSBrZXkgaXMgYW4gaW5kZXggb2YgYSBjb250YWluZXIgaW4gYW4gTFZpZXcgKGFsc28gdXNlZCBpbiB0aGVcbiAqIGBlbGVtZW50Q29udGFpbmVyU3RhcnRgIGluc3RydWN0aW9uKSwgdGhlIHZhbHVlIGlzIHRoZSBudW1iZXIgb2Ygcm9vdCBub2Rlc1xuICogaW4gdGhpcyBjb250YWluZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGxvY2F0ZSBhbiBhbmNob3IgY29tbWVudFxuICogbm9kZSB0aGF0IGdvZXMgYWZ0ZXIgYWxsIGNvbnRhaW5lciBub2Rlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkRWxlbWVudENvbnRhaW5lcnMge1xuICBba2V5OiBudW1iZXJdOiBudW1iZXI7XG59XG5cbi8qKlxuICogU2VyaWFsaXplZCBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHJlbGV2YW50IGh5ZHJhdGlvblxuICogYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGRlc2NyaWJlcyBhIGdpdmVuIGh5ZHJhdGlvbiBib3VuZGFyeVxuICogKGUuZy4gYSBjb21wb25lbnQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRWaWV3IHtcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgaW5mb3JtYXRpb24gYWJvdXQgPG5nLWNvbnRhaW5lcj5zLlxuICAgKi9cbiAgW0VMRU1FTlRfQ09OVEFJTkVSU10/OiBTZXJpYWxpemVkRWxlbWVudENvbnRhaW5lcnM7XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGVtcGxhdGVzLlxuICAgKiBLZXktdmFsdWUgcGFpcnMgd2hlcmUgYSBrZXkgaXMgYW4gaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICogYHRlbXBsYXRlYCBpbnN0cnVjdGlvbiBhbmQgdGhlIHZhbHVlIGlzIGEgdW5pcXVlIGlkIHRoYXQgY2FuXG4gICAqIGJlIHVzZWQgZHVyaW5nIGh5ZHJhdGlvbiB0byBpZGVudGlmeSB0aGF0IHRlbXBsYXRlLlxuICAgKi9cbiAgW1RFTVBMQVRFU10/OiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGluZm9ybWF0aW9uIGFib3V0IHZpZXcgY29udGFpbmVycy5cbiAgICogS2V5LXZhbHVlIHBhaXJzIHdoZXJlIGEga2V5IGlzIGFuIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gICAqIExDb250YWluZXIgZW50cnkgd2l0aGluIGFuIExWaWV3LCBhbmQgdGhlIHZhbHVlIGlzIGEgbGlzdFxuICAgKiBvZiBzZXJpYWxpemVkIGluZm9ybWF0aW9uIGFib3V0IHZpZXdzIHdpdGhpbiB0aGlzIGNvbnRhaW5lci5cbiAgICovXG4gIFtDT05UQUlORVJTXT86IFJlY29yZDxudW1iZXIsIFNlcmlhbGl6ZWRDb250YWluZXJWaWV3W10+O1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGluZm9ybWF0aW9uIGFib3V0IG5vZGVzIGluIGEgdGVtcGxhdGUuXG4gICAqIEtleS12YWx1ZSBwYWlycyB3aGVyZSBhIGtleSBpcyBhbiBpbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiBET00gbm9kZSBpbiBhbiBMVmlldyBhbmQgdGhlIHZhbHVlIGlzIGEgcGF0aCB0aGF0IGRlc2NyaWJlc1xuICAgKiB0aGUgbG9jYXRpb24gb2YgdGhpcyBub2RlIChhcyBhIHNldCBvZiBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucykuXG4gICAqL1xuICBbTk9ERVNdPzogUmVjb3JkPG51bWJlciwgc3RyaW5nPjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGlkcyB3aGljaCByZXByZXNlbnRzIGEgc2V0IG9mIG5vZGVzIGRpc2Nvbm5lY3RlZFxuICAgKiBmcm9tIHRoZSBET00gdHJlZSBhdCB0aGUgc2VyaWFsaXphdGlvbiB0aW1lLCBidXQgb3RoZXJ3aXNlXG4gICAqIHByZXNlbnQgaW4gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy5cbiAgICpcbiAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGF2b2lkIHRyaWdnZXJpbmcgdGhlIGh5ZHJhdGlvblxuICAgKiBsb2dpYyBmb3Igc3VjaCBub2RlcyBhbmQgaW5zdGVhZCB1c2UgYSByZWd1bGFyIFwiY3JlYXRpb24gbW9kZVwiLlxuICAgKi9cbiAgW0RJU0NPTk5FQ1RFRF9OT0RFU10/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogU2VyaWFsaXplZCBpbmZvcm1hdGlvbiBhYm91dCBpMThuIGJsb2NrcyBpbiBhIHRlbXBsYXRlLlxuICAgKiBLZXktdmFsdWUgcGFpcnMgd2hlcmUgYSBrZXkgaXMgYW4gaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICogaTE4biBlbnRyeSB3aXRoaW4gYW4gTFZpZXcsIGFuZCB0aGUgdmFsdWUgaXMgYSBsaXN0IG9mXG4gICAqIGFjdGl2ZSBJQ1UgY2FzZXMuXG4gICAqL1xuICBbSTE4Tl9EQVRBXT86IFJlY29yZDxudW1iZXIsIG51bWJlcltdPjtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVkIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgcmVsZXZhbnQgaHlkcmF0aW9uXG4gKiBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgdmlldyB0aGF0IGlzIGEgcGFydCBvZiBhXG4gKiBWaWV3Q29udGFpbmVyIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZENvbnRhaW5lclZpZXcgZXh0ZW5kcyBTZXJpYWxpemVkVmlldyB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgdGhhdCByZXByZXNlbnRzIGEgVFZpZXcgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGVcbiAgICogYSBnaXZlbiBpbnN0YW5jZSBvZiBhIHZpZXc6XG4gICAqICAtIFRWaWV3VHlwZS5FbWJlZGRlZDogYSB1bmlxdWUgaWQgZ2VuZXJhdGVkIGR1cmluZyBzZXJpYWxpemF0aW9uIG9uIHRoZSBzZXJ2ZXJcbiAgICogIC0gVFZpZXdUeXBlLkNvbXBvbmVudDogYW4gaWQgZ2VuZXJhdGVkIGJhc2VkIG9uIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBgZ2V0Q29tcG9uZW50SWRgIGZ1bmN0aW9uIGZvciBkZXRhaWxzKVxuICAgKi9cbiAgW1RFTVBMQVRFX0lEXTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2Ygcm9vdCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHZpZXcuXG4gICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGVmZmVjdGl2ZWx5IHRyYXZlcnNlIHRoZSBET00gdHJlZVxuICAgKiBhbmQgaWRlbnRpZnkgc2VnbWVudHMgdGhhdCBiZWxvbmcgdG8gZGlmZmVyZW50IHZpZXdzLlxuICAgKi9cbiAgW05VTV9ST09UX05PREVTXTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgdGltZXMgdGhpcyB2aWV3IGlzIHJlcGVhdGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgc2VyaWFsaXppbmcgYW5kIHNlbmRpbmcgdGhlIHNhbWUgaHlkcmF0aW9uXG4gICAqIGluZm9ybWF0aW9uIGFib3V0IHNpbWlsYXIgdmlld3MgKGZvciBleGFtcGxlLCBwcm9kdWNlZCBieSAqbmdGb3IpLlxuICAgKi9cbiAgW01VTFRJUExJRVJdPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGh5ZHJhdGlvbi1yZWxhdGVkIGluZm9ybWF0aW9uIHNlcmlhbGl6ZWRcbiAqIG9uIHRoZSBzZXJ2ZXIsIGFzIHdlbGwgYXMgdGhlIG5lY2Vzc2FyeSByZWZlcmVuY2VzIHRvIHNlZ21lbnRzIG9mXG4gKiB0aGUgRE9NLCB0byBmYWNpbGl0YXRlIHRoZSBoeWRyYXRpb24gcHJvY2VzcyBmb3IgYSBnaXZlbiBoeWRyYXRpb25cbiAqIGJvdW5kYXJ5IG9uIHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVoeWRyYXRlZFZpZXcge1xuICAvKipcbiAgICogVGhlIHJlYWRvbmx5IGh5ZHJhdGlvbiBhbm5vdGF0aW9uIGRhdGEuXG4gICAqL1xuICBkYXRhOiBSZWFkb25seTxTZXJpYWxpemVkVmlldz47XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBmaXJzdCBjaGlsZCBpbiBhIERPTSBzZWdtZW50IGFzc29jaWF0ZWRcbiAgICogd2l0aCBhIGdpdmVuIGh5ZHJhdGlvbiBib3VuZGFyeS5cbiAgICpcbiAgICogT25jZSBhIHZpZXcgYmVjb21lcyBoeWRyYXRlZCwgdGhlIHZhbHVlIGlzIHNldCB0byBgbnVsbGAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGF0IGZ1cnRoZXIgZGV0YWNoaW5nL2F0dGFjaGluZyB2aWV3IGFjdGlvbnMgc2hvdWxkIHJlc3VsdFxuICAgKiBpbiBpbnZva2luZyBjb3JyZXNwb25kaW5nIERPTSBhY3Rpb25zIChhdHRhY2hpbmcgRE9NIG5vZGVzIGFjdGlvbiBpc1xuICAgKiBza2lwcGVkIHdoZW4gd2UgaHlkcmF0ZSwgc2luY2Ugbm9kZXMgYXJlIGFscmVhZHkgaW4gdGhlIERPTSkuXG4gICAqL1xuICBmaXJzdENoaWxkOiBSTm9kZXxudWxsO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgcmVmZXJlbmNlcyB0byBmaXJzdCBub2RlcyBpbiBET00gc2VnbWVudHMgdGhhdFxuICAgKiByZXByZXNlbnQgZWl0aGVyIGFuIDxuZy1jb250YWluZXI+IG9yIGEgdmlldyBjb250YWluZXIuXG4gICAqL1xuICBzZWdtZW50SGVhZHM/OiB7W2luZGV4OiBudW1iZXJdOiBSTm9kZXxudWxsfTtcblxuICAvKipcbiAgICogQW4gaW5zdGFuY2Ugb2YgYSBTZXQgdGhhdCByZXByZXNlbnRzIG5vZGVzIGRpc2Nvbm5lY3RlZCBmcm9tXG4gICAqIHRoZSBET00gdHJlZSBhdCB0aGUgc2VyaWFsaXphdGlvbiB0aW1lLCBidXQgb3RoZXJ3aXNlIHByZXNlbnRcbiAgICogaW4gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy5cbiAgICpcbiAgICogVGhlIFNldCBpcyBiYXNlZCBvbiB0aGUgYFNlcmlhbGl6ZWRWaWV3W0RJU0NPTk5FQ1RFRF9OT0RFU11gIGRhdGFcbiAgICogYW5kIGlzIG5lZWRlZCB0byBoYXZlIGNvbnN0YW50LXRpbWUgbG9va3Vwcy5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIGlzIGBudWxsYCwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3ZXJlIG5vIGRpc2Nvbm5lY3RlZFxuICAgKiBub2RlcyBkZXRlY3RlZCBpbiB0aGlzIHZpZXcgYXQgc2VyaWFsaXphdGlvbiB0aW1lLlxuICAgKi9cbiAgZGlzY29ubmVjdGVkTm9kZXM/OiBTZXQ8bnVtYmVyPnxudWxsO1xuXG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgZnJvbSBhIHZpZXcgdG8gdGhlIGZpcnN0IGNoaWxkIHRvIGJlZ2luIGNsYWltaW5nIG5vZGVzLlxuICAgKlxuICAgKiBUaGlzIG1hcHBpbmcgaXMgZ2VuZXJhdGVkIGJ5IGFuIGkxOG4gYmxvY2ssIGFuZCBpcyB0aGUgc291cmNlIG9mXG4gICAqIHRydXRoIGZvciB0aGUgbm9kZXMgaW5zaWRlIG9mIGl0LlxuICAgKi9cbiAgaTE4bk5vZGVzPzogTWFwPG51bWJlciwgUk5vZGV8bnVsbD47XG5cbiAgLyoqXG4gICAqIEEgbWFwcGluZyBmcm9tIHRoZSBpbmRleCBvZiBhbiBJQ1Ugbm9kZSB0byBkZWh5ZHJhdGVkIGRhdGEgZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgZHVyaW5nIHRoZSBoeWRyYXRpb24gcHJvY2VzcyBvbiB0aGUgY2xpZW50LlxuICAgKiBJQ1UgY2FzZXMgdGhhdCB3ZXJlIGFjdGl2ZSBkdXJpbmcgc2VydmVyLXNpZGUgcmVuZGVyaW5nIHdpbGwgYmUgYWRkZWRcbiAgICogdG8gdGhlIG1hcC4gVGhlIGh5ZHJhdGlvbiBsb2dpYyB3aWxsIFwiY2xhaW1cIiBtYXRjaGluZyBjYXNlcywgcmVtb3ZpbmdcbiAgICogdGhlbSBmcm9tIHRoZSBtYXAuIFRoZSByZW1haW5pbmcgZW50cmllcyBhcmUgXCJ1bmNsYWltZWRcIiwgYW5kIHdpbGwgYmVcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBET00gZHVyaW5nIGh5ZHJhdGlvbiBjbGVhbnVwLlxuICAgKi9cbiAgZGVoeWRyYXRlZEljdURhdGE/OiBNYXA8bnVtYmVyLCBEZWh5ZHJhdGVkSWN1RGF0YT47XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgaHlkcmF0aW9uLXJlbGF0ZWQgaW5mb3JtYXRpb24gc2VyaWFsaXplZFxuICogb24gdGhlIHNlcnZlciwgYXMgd2VsbCBhcyB0aGUgbmVjZXNzYXJ5IHJlZmVyZW5jZXMgdG8gc2VnbWVudHMgb2ZcbiAqIHRoZSBET00sIHRvIGZhY2lsaXRhdGUgdGhlIGh5ZHJhdGlvbiBwcm9jZXNzIGZvciBhIGdpdmVuIHZpZXdcbiAqIGluc2lkZSBhIHZpZXcgY29udGFpbmVyIChlaXRoZXIgYW4gZW1iZWRkZWQgdmlldyBvciBhIHZpZXcgY3JlYXRlZFxuICogZm9yIGEgY29tcG9uZW50KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWh5ZHJhdGVkQ29udGFpbmVyVmlldyBleHRlbmRzIERlaHlkcmF0ZWRWaWV3IHtcbiAgZGF0YTogUmVhZG9ubHk8U2VyaWFsaXplZENvbnRhaW5lclZpZXc+O1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZGVoeWRyYXRlZCBJQ1UgY2FzZSxcbiAqIHRvIGZhY2lsaXRhdGUgY2xlYW5pbmcgdXAgSUNVIGNhc2VzIHRoYXQgd2VyZSBhY3RpdmUgZHVyaW5nXG4gKiBzZXJ2ZXItc2lkZSByZW5kZXJpbmcsIGJ1dCBub3QgZHVyaW5nIGh5ZHJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWh5ZHJhdGVkSWN1RGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgY2FzZSBpbmRleCB0aGF0IHRoaXMgZGF0YSByZXByZXNlbnRzLlxuICAgKi9cbiAgY2FzZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBBU1QgZm9yIHRoZSBJQ1Ugbm9kZS4gVGhpcyBhbGxvd3MgdGhlXG4gICAqIEFTVCB0byBiZSB1c2VkIHRvIGNsZWFuIHVwIGRlaHlkcmF0ZWQgbm9kZXMuXG4gICAqL1xuICBub2RlOiBJMThuSUNVTm9kZTtcbn1cbiJdfQ==