@angular/core 16.0.0-next.3 → 16.0.0-next.4
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/esm2020/src/application_tokens.mjs +33 -1
- package/esm2020/src/change_detection/change_detector_ref.mjs +4 -4
- package/esm2020/src/compiler/compiler_facade_interface.mjs +1 -1
- package/esm2020/src/core.mjs +2 -2
- package/esm2020/src/core_private_export.mjs +2 -1
- package/esm2020/src/core_reactivity_export_internal.mjs +1 -1
- package/esm2020/src/core_render3_private_export.mjs +1 -2
- package/esm2020/src/di/r3_injector.mjs +8 -1
- package/esm2020/src/errors.mjs +1 -1
- package/esm2020/src/hydration/annotate.mjs +118 -5
- package/esm2020/src/hydration/api.mjs +14 -1
- package/esm2020/src/hydration/cleanup.mjs +54 -3
- package/esm2020/src/hydration/compression.mjs +69 -0
- package/esm2020/src/hydration/error_handling.mjs +357 -15
- package/esm2020/src/hydration/interfaces.mjs +17 -1
- package/esm2020/src/hydration/node_lookup_utils.mjs +199 -7
- package/esm2020/src/hydration/utils.mjs +16 -3
- package/esm2020/src/hydration/views.mjs +19 -15
- package/esm2020/src/linker/destroy_ref.mjs +5 -2
- package/esm2020/src/linker/view_container_ref.mjs +8 -7
- package/esm2020/src/metadata/directives.mjs +8 -3
- package/esm2020/src/render3/instructions/element.mjs +16 -9
- package/esm2020/src/render3/instructions/element_container.mjs +2 -5
- package/esm2020/src/render3/instructions/element_validation.mjs +2 -2
- package/esm2020/src/render3/instructions/projection.mjs +7 -4
- package/esm2020/src/render3/instructions/template.mjs +4 -7
- package/esm2020/src/render3/instructions/text.mjs +6 -6
- package/esm2020/src/render3/interfaces/public_definitions.mjs +1 -1
- package/esm2020/src/render3/interfaces/type_checks.mjs +4 -1
- package/esm2020/src/render3/node_manipulation.mjs +2 -2
- package/esm2020/src/render3/node_selector_matcher.mjs +17 -5
- package/esm2020/src/render3/util/view_utils.mjs +12 -1
- package/esm2020/src/render3/view_ref.mjs +1 -1
- package/esm2020/src/signals/index.mjs +2 -1
- package/esm2020/src/signals/src/computed.mjs +3 -3
- package/esm2020/src/signals/src/effect.mjs +1 -3
- package/esm2020/src/signals/src/signal.mjs +3 -3
- package/esm2020/src/signals/src/watch.mjs +3 -3
- package/esm2020/src/signals/src/weak_ref.mjs +18 -2
- package/esm2020/src/util/ng_dev_mode.mjs +2 -1
- package/esm2020/src/version.mjs +1 -1
- package/esm2020/testing/src/logger.mjs +3 -3
- package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
- package/esm2020/testing/src/test_bed_compiler.mjs +12 -7
- package/fesm2015/core.mjs +1066 -178
- package/fesm2015/core.mjs.map +1 -1
- package/fesm2015/testing.mjs +816 -68
- package/fesm2015/testing.mjs.map +1 -1
- package/fesm2020/core.mjs +1051 -170
- package/fesm2020/core.mjs.map +1 -1
- package/fesm2020/testing.mjs +810 -67
- package/fesm2020/testing.mjs.map +1 -1
- package/index.d.ts +128 -216
- package/package.json +1 -1
- package/schematics/migrations/relative-link-resolution/bundle.js +7 -7
- package/schematics/migrations/router-link-with-href/bundle.js +10 -10
- package/schematics/ng-generate/standalone-migration/bundle.js +473 -376
- package/schematics/ng-generate/standalone-migration/bundle.js.map +2 -2
- package/testing/index.d.ts +1 -1
|
@@ -5,33 +5,375 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
|
+
import { RuntimeError } from '../errors';
|
|
9
|
+
import { getDeclarationComponentDef } from '../render3/instructions/element_validation';
|
|
10
|
+
import { TVIEW } from '../render3/interfaces/view';
|
|
11
|
+
import { getParentRElement } from '../render3/node_manipulation';
|
|
12
|
+
const AT_THIS_LOCATION = '<-- AT THIS LOCATION';
|
|
8
13
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
14
|
+
* Retrieves a user friendly string for a given TNodeType for use in
|
|
15
|
+
* friendly error messages
|
|
16
|
+
*
|
|
17
|
+
* @param tNodeType
|
|
18
|
+
* @returns
|
|
11
19
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
function getFriendlyStringFromTNodeType(tNodeType) {
|
|
21
|
+
switch (tNodeType) {
|
|
22
|
+
case 4 /* TNodeType.Container */:
|
|
23
|
+
return 'view container';
|
|
24
|
+
case 2 /* TNodeType.Element */:
|
|
25
|
+
return 'element';
|
|
26
|
+
case 8 /* TNodeType.ElementContainer */:
|
|
27
|
+
return 'ng-container';
|
|
28
|
+
case 32 /* TNodeType.Icu */:
|
|
29
|
+
return 'icu';
|
|
30
|
+
case 64 /* TNodeType.Placeholder */:
|
|
31
|
+
return 'i18n';
|
|
32
|
+
case 16 /* TNodeType.Projection */:
|
|
33
|
+
return 'projection';
|
|
34
|
+
case 1 /* TNodeType.Text */:
|
|
35
|
+
return 'text';
|
|
36
|
+
default:
|
|
37
|
+
// This should not happen as we cover all possible TNode types above.
|
|
38
|
+
return '<unknown>';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validates that provided nodes match during the hydration process.
|
|
43
|
+
*/
|
|
44
|
+
export function validateMatchingNode(node, nodeType, tagName, lView, tNode, isViewContainerAnchor = false) {
|
|
45
|
+
if (!node ||
|
|
46
|
+
(node.nodeType !== nodeType ||
|
|
47
|
+
(node.nodeType === Node.ELEMENT_NODE &&
|
|
48
|
+
node.tagName.toLowerCase() !== tagName?.toLowerCase()))) {
|
|
49
|
+
const expectedNode = shortRNodeDescription(nodeType, tagName, null);
|
|
50
|
+
let header = `During hydration Angular expected ${expectedNode} but `;
|
|
51
|
+
const hostComponentDef = getDeclarationComponentDef(lView);
|
|
52
|
+
const componentClassName = hostComponentDef?.type?.name;
|
|
53
|
+
const expected = `Angular expected this DOM:\n\n${describeExpectedDom(lView, tNode, isViewContainerAnchor)}\n\n`;
|
|
54
|
+
let actual = '';
|
|
55
|
+
if (!node) {
|
|
56
|
+
// No node found during hydration.
|
|
57
|
+
header += `the node was not found.\n\n`;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const actualNode = shortRNodeDescription(node.nodeType, node.tagName ?? null, node.textContent ?? null);
|
|
61
|
+
header += `found ${actualNode}.\n\n`;
|
|
62
|
+
actual = `Actual DOM is:\n\n${describeDomFromNode(node)}\n\n`;
|
|
63
|
+
}
|
|
64
|
+
const footer = getHydrationErrorFooter(componentClassName);
|
|
65
|
+
const message = header + expected + actual + getHydrationAttributeNote() + footer;
|
|
66
|
+
throw new RuntimeError(500 /* RuntimeErrorCode.HYDRATION_NODE_MISMATCH */, message);
|
|
19
67
|
}
|
|
20
68
|
}
|
|
21
69
|
/**
|
|
22
|
-
*
|
|
70
|
+
* Validates that a given node has sibling nodes
|
|
23
71
|
*/
|
|
24
72
|
export function validateSiblingNodeExists(node) {
|
|
25
73
|
validateNodeExists(node);
|
|
26
74
|
if (!node.nextSibling) {
|
|
27
|
-
|
|
28
|
-
|
|
75
|
+
const header = 'During hydration Angular expected more sibling nodes to be present.\n\n';
|
|
76
|
+
const actual = `Actual DOM is:\n\n${describeDomFromNode(node)}\n\n`;
|
|
77
|
+
const footer = getHydrationErrorFooter();
|
|
78
|
+
const message = header + actual + footer;
|
|
79
|
+
throw new RuntimeError(501 /* RuntimeErrorCode.HYDRATION_MISSING_SIBLINGS */, message);
|
|
29
80
|
}
|
|
30
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Validates that a node exists or throws
|
|
84
|
+
*/
|
|
31
85
|
export function validateNodeExists(node) {
|
|
32
86
|
if (!node) {
|
|
33
|
-
|
|
34
|
-
|
|
87
|
+
throw new RuntimeError(502 /* RuntimeErrorCode.HYDRATION_MISSING_NODE */, `Hydration expected an element to be present at this location.`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Builds the hydration error message when a node is not found
|
|
92
|
+
*
|
|
93
|
+
* @param lView the LView where the node exists
|
|
94
|
+
* @param tNode the TNode
|
|
95
|
+
*/
|
|
96
|
+
export function nodeNotFoundError(lView, tNode) {
|
|
97
|
+
const header = 'During serialization, Angular was unable to find an element in the DOM:\n\n';
|
|
98
|
+
const expected = `${describeExpectedDom(lView, tNode, false)}\n\n`;
|
|
99
|
+
const footer = getHydrationErrorFooter();
|
|
100
|
+
throw new RuntimeError(502 /* RuntimeErrorCode.HYDRATION_MISSING_NODE */, header + expected + footer);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Builds a hydration error message when a node is not found at a path location
|
|
104
|
+
*
|
|
105
|
+
* @param host the Host Node
|
|
106
|
+
* @param path the path to the node
|
|
107
|
+
*/
|
|
108
|
+
export function nodeNotFoundAtPathError(host, path) {
|
|
109
|
+
const header = `During hydration Angular was unable to locate a node ` +
|
|
110
|
+
`using the "${path}" path, starting from the ${describeRNode(host)} node.\n\n`;
|
|
111
|
+
const footer = getHydrationErrorFooter();
|
|
112
|
+
throw new RuntimeError(502 /* RuntimeErrorCode.HYDRATION_MISSING_NODE */, header + footer);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Builds the hydration error message in the case that dom nodes are created outside of
|
|
116
|
+
* the Angular context and are being used as projected nodes
|
|
117
|
+
*
|
|
118
|
+
* @param lView the LView
|
|
119
|
+
* @param tNode the TNode
|
|
120
|
+
* @returns an error
|
|
121
|
+
*/
|
|
122
|
+
export function unsupportedProjectionOfDomNodes(rNode) {
|
|
123
|
+
const header = 'During serialization, Angular detected DOM nodes ' +
|
|
124
|
+
'that were created outside of Angular context and provided as projectable nodes ' +
|
|
125
|
+
'(likely via `ViewContainerRef.createComponent` or `createComponent` APIs). ' +
|
|
126
|
+
'Hydration is not supported for such cases, consider refactoring the code to avoid ' +
|
|
127
|
+
'this pattern or using `ngSkipHydration` on the host element of the component.\n\n';
|
|
128
|
+
const actual = `${describeDomFromNode(rNode)}\n\n`;
|
|
129
|
+
const message = header + actual + getHydrationAttributeNote();
|
|
130
|
+
return new RuntimeError(503 /* RuntimeErrorCode.UNSUPPORTED_PROJECTION_DOM_NODES */, message);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Builds the hydration error message in the case that ngSkipHydration was used on a
|
|
134
|
+
* node that is not a component host element or host binding
|
|
135
|
+
*
|
|
136
|
+
* @param rNode the HTML Element
|
|
137
|
+
* @returns an error
|
|
138
|
+
*/
|
|
139
|
+
export function invalidSkipHydrationHost(rNode) {
|
|
140
|
+
const header = 'The `ngSkipHydration` flag is applied on a node ' +
|
|
141
|
+
'that doesn\'t act as a component host. Hydration can be ' +
|
|
142
|
+
'skipped only on per-component basis.\n\n';
|
|
143
|
+
const actual = `${describeDomFromNode(rNode)}\n\n`;
|
|
144
|
+
const footer = 'Please move the `ngSkipHydration` attribute to the component host element.';
|
|
145
|
+
const message = header + actual + footer;
|
|
146
|
+
return new RuntimeError(504 /* RuntimeErrorCode.INVALID_SKIP_HYDRATION_HOST */, message);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Builds the hydration error message in the case that a user is attempting to enable
|
|
150
|
+
* hydration on internationalized nodes, which is not yet supported.
|
|
151
|
+
*
|
|
152
|
+
* @param rNode the HTML Element
|
|
153
|
+
* @returns an error
|
|
154
|
+
*/
|
|
155
|
+
export function notYetSupportedI18nBlockError(rNode) {
|
|
156
|
+
const header = 'Hydration for nodes marked with `i18n` is not yet supported. ' +
|
|
157
|
+
'You can opt-out a component that uses `i18n` in a template using ' +
|
|
158
|
+
'the `ngSkipHydration` attribute or fall back to the previous ' +
|
|
159
|
+
'hydration logic (which re-creates the application structure).\n\n';
|
|
160
|
+
const actual = `${describeDomFromNode(rNode)}\n\n`;
|
|
161
|
+
const message = header + actual;
|
|
162
|
+
return new RuntimeError(518 /* RuntimeErrorCode.HYDRATION_I18N_NOT_YET_SUPPORTED */, message);
|
|
163
|
+
}
|
|
164
|
+
// Stringification methods
|
|
165
|
+
/**
|
|
166
|
+
* Stringifies a given TNode's attributes
|
|
167
|
+
*
|
|
168
|
+
* @param tNode a provided TNode
|
|
169
|
+
* @returns string
|
|
170
|
+
*/
|
|
171
|
+
function stringifyTNodeAttrs(tNode) {
|
|
172
|
+
const results = [];
|
|
173
|
+
if (tNode.attrs) {
|
|
174
|
+
for (let i = 0; i < tNode.attrs.length;) {
|
|
175
|
+
const attrName = tNode.attrs[i++];
|
|
176
|
+
// Once we reach the first flag, we know that the list of
|
|
177
|
+
// attributes is over.
|
|
178
|
+
if (typeof attrName == 'number') {
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
const attrValue = tNode.attrs[i++];
|
|
182
|
+
results.push(`${attrName}="${shorten(attrValue)}"`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return results.join(' ');
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The list of internal attributes that should be filtered out while
|
|
189
|
+
* producing an error message.
|
|
190
|
+
*/
|
|
191
|
+
const internalAttrs = new Set(['ngh', 'ng-version', 'ng-server-context']);
|
|
192
|
+
/**
|
|
193
|
+
* Stringifies an HTML Element's attributes
|
|
194
|
+
*
|
|
195
|
+
* @param rNode an HTML Element
|
|
196
|
+
* @returns string
|
|
197
|
+
*/
|
|
198
|
+
function stringifyRNodeAttrs(rNode) {
|
|
199
|
+
const results = [];
|
|
200
|
+
for (let i = 0; i < rNode.attributes.length; i++) {
|
|
201
|
+
const attr = rNode.attributes[i];
|
|
202
|
+
if (internalAttrs.has(attr.name))
|
|
203
|
+
continue;
|
|
204
|
+
results.push(`${attr.name}="${shorten(attr.value)}"`);
|
|
205
|
+
}
|
|
206
|
+
return results.join(' ');
|
|
207
|
+
}
|
|
208
|
+
// Methods for Describing the DOM
|
|
209
|
+
/**
|
|
210
|
+
* Converts a tNode to a helpful readable string value for use in error messages
|
|
211
|
+
*
|
|
212
|
+
* @param tNode a given TNode
|
|
213
|
+
* @param innerContent the content of the node
|
|
214
|
+
* @returns string
|
|
215
|
+
*/
|
|
216
|
+
function describeTNode(tNode, innerContent = '…') {
|
|
217
|
+
switch (tNode.type) {
|
|
218
|
+
case 1 /* TNodeType.Text */:
|
|
219
|
+
const content = tNode.value ? `(${tNode.value})` : '';
|
|
220
|
+
return `#text${content}`;
|
|
221
|
+
case 2 /* TNodeType.Element */:
|
|
222
|
+
const attrs = stringifyTNodeAttrs(tNode);
|
|
223
|
+
const tag = tNode.value.toLowerCase();
|
|
224
|
+
return `<${tag}${attrs ? ' ' + attrs : ''}>${innerContent}</${tag}>`;
|
|
225
|
+
case 8 /* TNodeType.ElementContainer */:
|
|
226
|
+
return '<!-- ng-container -->';
|
|
227
|
+
case 4 /* TNodeType.Container */:
|
|
228
|
+
return '<!-- container -->';
|
|
229
|
+
default:
|
|
230
|
+
const typeAsString = getFriendlyStringFromTNodeType(tNode.type);
|
|
231
|
+
return `#node(${typeAsString})`;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Converts an RNode to a helpful readable string value for use in error messages
|
|
236
|
+
*
|
|
237
|
+
* @param rNode a given RNode
|
|
238
|
+
* @param innerContent the content of the node
|
|
239
|
+
* @returns string
|
|
240
|
+
*/
|
|
241
|
+
function describeRNode(rNode, innerContent = '…') {
|
|
242
|
+
const node = rNode;
|
|
243
|
+
switch (node.nodeType) {
|
|
244
|
+
case Node.ELEMENT_NODE:
|
|
245
|
+
const tag = node.tagName.toLowerCase();
|
|
246
|
+
const attrs = stringifyRNodeAttrs(node);
|
|
247
|
+
return `<${tag}${attrs ? ' ' + attrs : ''}>${innerContent}</${tag}>`;
|
|
248
|
+
case Node.TEXT_NODE:
|
|
249
|
+
const content = node.textContent ? shorten(node.textContent) : '';
|
|
250
|
+
return `#text${content ? `(${content})` : ''}`;
|
|
251
|
+
case Node.COMMENT_NODE:
|
|
252
|
+
return `<!-- ${shorten(node.textContent ?? '')} -->`;
|
|
253
|
+
default:
|
|
254
|
+
return `#node(${node.nodeType})`;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Builds the string containing the expected DOM present given the LView and TNode
|
|
259
|
+
* values for a readable error message
|
|
260
|
+
*
|
|
261
|
+
* @param lView the lView containing the DOM
|
|
262
|
+
* @param tNode the tNode
|
|
263
|
+
* @param isViewContainerAnchor boolean
|
|
264
|
+
* @returns string
|
|
265
|
+
*/
|
|
266
|
+
function describeExpectedDom(lView, tNode, isViewContainerAnchor) {
|
|
267
|
+
const spacer = ' ';
|
|
268
|
+
let content = '';
|
|
269
|
+
if (tNode.prev) {
|
|
270
|
+
content += spacer + '…\n';
|
|
271
|
+
content += spacer + describeTNode(tNode.prev) + '\n';
|
|
272
|
+
}
|
|
273
|
+
else if (tNode.type && tNode.type & 12 /* TNodeType.AnyContainer */) {
|
|
274
|
+
content += spacer + '…\n';
|
|
275
|
+
}
|
|
276
|
+
if (isViewContainerAnchor) {
|
|
277
|
+
content += spacer + describeTNode(tNode) + '\n';
|
|
278
|
+
content += spacer + `<!-- container --> ${AT_THIS_LOCATION}\n`;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
content += spacer + describeTNode(tNode) + ` ${AT_THIS_LOCATION}\n`;
|
|
282
|
+
}
|
|
283
|
+
content += spacer + '…\n';
|
|
284
|
+
const parentRNode = tNode.type ? getParentRElement(lView[TVIEW], tNode, lView) : null;
|
|
285
|
+
if (parentRNode) {
|
|
286
|
+
content = describeRNode(parentRNode, '\n' + content);
|
|
287
|
+
}
|
|
288
|
+
return content;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Builds the string containing the DOM present around a given RNode for a
|
|
292
|
+
* readable error message
|
|
293
|
+
*
|
|
294
|
+
* @param node the RNode
|
|
295
|
+
* @returns string
|
|
296
|
+
*/
|
|
297
|
+
function describeDomFromNode(node) {
|
|
298
|
+
const spacer = ' ';
|
|
299
|
+
let content = '';
|
|
300
|
+
const currentNode = node;
|
|
301
|
+
if (currentNode.previousSibling) {
|
|
302
|
+
content += spacer + '…\n';
|
|
303
|
+
content += spacer + describeRNode(currentNode.previousSibling) + '\n';
|
|
304
|
+
}
|
|
305
|
+
content += spacer + describeRNode(currentNode) + ` ${AT_THIS_LOCATION}\n`;
|
|
306
|
+
if (node.nextSibling) {
|
|
307
|
+
content += spacer + '…\n';
|
|
308
|
+
}
|
|
309
|
+
if (node.parentNode) {
|
|
310
|
+
content = describeRNode(currentNode.parentNode, '\n' + content);
|
|
311
|
+
}
|
|
312
|
+
return content;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Shortens the description of a given RNode by its type for readability
|
|
316
|
+
*
|
|
317
|
+
* @param nodeType the type of node
|
|
318
|
+
* @param tagName the node tag name
|
|
319
|
+
* @param textContent the text content in the node
|
|
320
|
+
* @returns string
|
|
321
|
+
*/
|
|
322
|
+
function shortRNodeDescription(nodeType, tagName, textContent) {
|
|
323
|
+
switch (nodeType) {
|
|
324
|
+
case Node.ELEMENT_NODE:
|
|
325
|
+
return `<${tagName.toLowerCase()}>`;
|
|
326
|
+
case Node.TEXT_NODE:
|
|
327
|
+
const content = textContent ? ` (with the "${shorten(textContent)}" content)` : '';
|
|
328
|
+
return `a text node${content}`;
|
|
329
|
+
case Node.COMMENT_NODE:
|
|
330
|
+
return 'a comment node';
|
|
331
|
+
default:
|
|
332
|
+
return `#node(nodeType=${nodeType})`;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Builds the footer hydration error message
|
|
337
|
+
*
|
|
338
|
+
* @param componentClassName the name of the component class
|
|
339
|
+
* @returns string
|
|
340
|
+
*/
|
|
341
|
+
function getHydrationErrorFooter(componentClassName) {
|
|
342
|
+
const componentInfo = componentClassName ? `the "${componentClassName}"` : 'corresponding';
|
|
343
|
+
return `To fix this problem:\n` +
|
|
344
|
+
` * check ${componentInfo} component for hydration-related issues\n` +
|
|
345
|
+
` * or skip hydration by adding the \`ngSkipHydration\` attribute ` +
|
|
346
|
+
`to its host node in a template`;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* An attribute related note for hydration errors
|
|
350
|
+
*/
|
|
351
|
+
function getHydrationAttributeNote() {
|
|
352
|
+
return 'Note: attributes are only displayed to better represent the DOM' +
|
|
353
|
+
' but have no effect on hydration mismatches.\n\n';
|
|
354
|
+
}
|
|
355
|
+
// Node string utility functions
|
|
356
|
+
/**
|
|
357
|
+
* Strips all newlines out of a given string
|
|
358
|
+
*
|
|
359
|
+
* @param input a string to be cleared of new line characters
|
|
360
|
+
* @returns
|
|
361
|
+
*/
|
|
362
|
+
function stripNewlines(input) {
|
|
363
|
+
return input.replace(/\s+/gm, '');
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Reduces a string down to a maximum length of characters with ellipsis for readability
|
|
367
|
+
*
|
|
368
|
+
* @param input a string input
|
|
369
|
+
* @param maxLength a maximum length in characters
|
|
370
|
+
* @returns string
|
|
371
|
+
*/
|
|
372
|
+
function shorten(input, maxLength = 50) {
|
|
373
|
+
if (!input) {
|
|
374
|
+
return '';
|
|
35
375
|
}
|
|
376
|
+
input = stripNewlines(input);
|
|
377
|
+
return input.length > maxLength ? `${input.substring(0, maxLength - 1)}…` : input;
|
|
36
378
|
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JfaGFuZGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9oeWRyYXRpb24vZXJyb3JfaGFuZGxpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBTUg7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxJQUFXLEVBQUUsUUFBZ0IsRUFBRSxPQUFvQixFQUFFLEtBQVksRUFBRSxLQUFZO0lBQ2pGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLElBQUssSUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQ25DLElBQWEsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVk7WUFDeEMsSUFBb0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFO1FBQzlFLDREQUE0RDtRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7S0FDNUQ7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsSUFBZ0I7SUFDeEQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFFLElBQWMsQ0FBQyxXQUFXLEVBQUU7UUFDaEMsNERBQTREO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztLQUM1RTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBZ0I7SUFDakQsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNULDREQUE0RDtRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7S0FDbEY7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7VE5vZGV9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy9ub2RlJztcbmltcG9ydCB7Uk5vZGV9IGZyb20gJy4uL3JlbmRlcjMvaW50ZXJmYWNlcy9yZW5kZXJlcl9kb20nO1xuaW1wb3J0IHtMVmlld30gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3ZpZXcnO1xuXG4vKipcbiAqIFZlcmlmaWVzIHdoZXRoZXIgYSBnaXZlbiBub2RlIG1hdGNoZXMgYW4gZXhwZWN0ZWQgY3JpdGVyaWEsXG4gKiBiYXNlZCBvbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWF0Y2hpbmdOb2RlKFxuICAgIG5vZGU6IFJOb2RlLCBub2RlVHlwZTogbnVtYmVyLCB0YWdOYW1lOiBzdHJpbmd8bnVsbCwgbFZpZXc6IExWaWV3LCB0Tm9kZTogVE5vZGUpOiB2b2lkIHtcbiAgdmFsaWRhdGVOb2RlRXhpc3RzKG5vZGUpO1xuICBpZiAoKG5vZGUgYXMgTm9kZSkubm9kZVR5cGUgIT09IG5vZGVUeXBlIHx8XG4gICAgICAobm9kZSBhcyBOb2RlKS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICAgICAobm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSB0YWdOYW1lPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgLy8gVE9ETzogaW1wcm92ZSBlcnJvciBtZXNzYWdlIGFuZCB1c2UgUnVudGltZUVycm9yIGluc3RlYWQuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG5vZGUgZm91bmQgZHVyaW5nIGh5ZHJhdGlvbi5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIHdoZXRoZXIgbmV4dCBzaWJsaW5nIG5vZGUgZXhpc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTaWJsaW5nTm9kZUV4aXN0cyhub2RlOiBSTm9kZXxudWxsKTogdm9pZCB7XG4gIHZhbGlkYXRlTm9kZUV4aXN0cyhub2RlKTtcbiAgaWYgKCEobm9kZSBhcyBSTm9kZSkubmV4dFNpYmxpbmcpIHtcbiAgICAvLyBUT0RPOiBpbXByb3ZlIGVycm9yIG1lc3NhZ2UgYW5kIHVzZSBSdW50aW1lRXJyb3IgaW5zdGVhZC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc3RhdGU6IGluc3VmZmljaWVudCBudW1iZXIgb2Ygc2libGluZyBub2Rlcy5gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOb2RlRXhpc3RzKG5vZGU6IFJOb2RlfG51bGwpOiB2b2lkIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgLy8gVE9ETzogaW1wcm92ZSBlcnJvciBtZXNzYWdlIGFuZCB1c2UgUnVudGltZUVycm9yIGluc3RlYWQuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBIeWRyYXRpb24gZXhwZWN0ZWQgYW4gZWxlbWVudCB0byBiZSBwcmVzZW50IGF0IHRoaXMgbG9jYXRpb24uYCk7XG4gIH1cbn1cbiJdfQ==
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JfaGFuZGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9oeWRyYXRpb24vZXJyb3JfaGFuZGxpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBbUIsTUFBTSxXQUFXLENBQUM7QUFDekQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFHdEYsT0FBTyxFQUFRLEtBQUssRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUM7QUFFaEQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyw4QkFBOEIsQ0FBQyxTQUFvQjtJQUMxRCxRQUFRLFNBQVMsRUFBRTtRQUNqQjtZQUNFLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUI7WUFDRSxPQUFPLFNBQVMsQ0FBQztRQUNuQjtZQUNFLE9BQU8sY0FBYyxDQUFDO1FBQ3hCO1lBQ0UsT0FBTyxLQUFLLENBQUM7UUFDZjtZQUNFLE9BQU8sTUFBTSxDQUFDO1FBQ2hCO1lBQ0UsT0FBTyxZQUFZLENBQUM7UUFDdEI7WUFDRSxPQUFPLE1BQU0sQ0FBQztRQUNoQjtZQUNFLHFFQUFxRTtZQUNyRSxPQUFPLFdBQVcsQ0FBQztLQUN0QjtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDaEMsSUFBVyxFQUFFLFFBQWdCLEVBQUUsT0FBb0IsRUFBRSxLQUFZLEVBQUUsS0FBWSxFQUMvRSxxQkFBcUIsR0FBRyxLQUFLO0lBQy9CLElBQUksQ0FBQyxJQUFJO1FBQ0wsQ0FBRSxJQUFhLENBQUMsUUFBUSxLQUFLLFFBQVE7WUFDcEMsQ0FBRSxJQUFhLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxZQUFZO2dCQUM1QyxJQUFvQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQzlFLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBSSxNQUFNLEdBQUcscUNBQXFDLFlBQVksT0FBTyxDQUFDO1FBRXRFLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0QsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBRXhELE1BQU0sUUFBUSxHQUFHLGlDQUNiLG1CQUFtQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBRW5FLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1Qsa0NBQWtDO1lBQ2xDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztTQUN6QzthQUFNO1lBQ0wsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQ25DLElBQWEsQ0FBQyxRQUFRLEVBQUcsSUFBb0IsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUM3RCxJQUFvQixDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUUvQyxNQUFNLElBQUksU0FBUyxVQUFVLE9BQU8sQ0FBQztZQUNyQyxNQUFNLEdBQUcscUJBQXFCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDL0Q7UUFFRCxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNELE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxRQUFRLEdBQUcsTUFBTSxHQUFHLHlCQUF5QixFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2xGLE1BQU0sSUFBSSxZQUFZLHFEQUEyQyxPQUFPLENBQUMsQ0FBQztLQUMzRTtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxJQUFnQjtJQUN4RCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixJQUFJLENBQUMsSUFBSyxDQUFDLFdBQVcsRUFBRTtRQUN0QixNQUFNLE1BQU0sR0FBRyx5RUFBeUUsQ0FBQztRQUN6RixNQUFNLE1BQU0sR0FBRyxxQkFBcUIsbUJBQW1CLENBQUMsSUFBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO1FBRXpDLE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxZQUFZLHdEQUE4QyxPQUFPLENBQUMsQ0FBQztLQUM5RTtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUFnQjtJQUNqRCxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ1QsTUFBTSxJQUFJLFlBQVksb0RBRWxCLCtEQUErRCxDQUFDLENBQUM7S0FDdEU7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBWSxFQUFFLEtBQVk7SUFDMUQsTUFBTSxNQUFNLEdBQUcsNkVBQTZFLENBQUM7SUFDN0YsTUFBTSxRQUFRLEdBQUcsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztJQUV6QyxNQUFNLElBQUksWUFBWSxvREFBMEMsTUFBTSxHQUFHLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsSUFBVSxFQUFFLElBQVk7SUFDOUQsTUFBTSxNQUFNLEdBQUcsdURBQXVEO1FBQ2xFLGNBQWMsSUFBSSw2QkFBNkIsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDbkYsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztJQUV6QyxNQUFNLElBQUksWUFBWSxvREFBMEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFHRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUFDLEtBQVk7SUFDMUQsTUFBTSxNQUFNLEdBQUcsbURBQW1EO1FBQzlELGlGQUFpRjtRQUNqRiw2RUFBNkU7UUFDN0Usb0ZBQW9GO1FBQ3BGLG1GQUFtRixDQUFDO0lBQ3hGLE1BQU0sTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNuRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLHlCQUF5QixFQUFFLENBQUM7SUFDOUQsT0FBTyxJQUFJLFlBQVksOERBQW9ELE9BQU8sQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsS0FBWTtJQUNuRCxNQUFNLE1BQU0sR0FBRyxrREFBa0Q7UUFDN0QsMERBQTBEO1FBQzFELDBDQUEwQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNuRCxNQUFNLE1BQU0sR0FBRyw0RUFBNEUsQ0FBQztJQUM1RixNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QyxPQUFPLElBQUksWUFBWSx5REFBK0MsT0FBTyxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxLQUFZO0lBQ3hELE1BQU0sTUFBTSxHQUFHLCtEQUErRDtRQUMxRSxtRUFBbUU7UUFDbkUsK0RBQStEO1FBQy9ELG1FQUFtRSxDQUFDO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNuRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLE9BQU8sSUFBSSxZQUFZLDhEQUFvRCxPQUFPLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsMEJBQTBCO0FBRTFCOzs7OztHQUtHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUFZO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNuQixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUc7WUFDdkMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLHlEQUF5RDtZQUN6RCxzQkFBc0I7WUFDdEIsSUFBSSxPQUFPLFFBQVEsSUFBSSxRQUFRLEVBQUU7Z0JBQy9CLE1BQU07YUFDUDtZQUNELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxLQUFLLE9BQU8sQ0FBQyxTQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9EO0tBQ0Y7SUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7QUFFMUU7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQWtCO0lBQzdDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDaEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdkQ7SUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELGlDQUFpQztBQUVqQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFZLEVBQUUsZUFBdUIsR0FBRztJQUM3RCxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDbEI7WUFDRSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RELE9BQU8sUUFBUSxPQUFPLEVBQUUsQ0FBQztRQUMzQjtZQUNFLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEMsT0FBTyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxZQUFZLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDdkU7WUFDRSxPQUFPLHVCQUF1QixDQUFDO1FBQ2pDO1lBQ0UsT0FBTyxvQkFBb0IsQ0FBQztRQUM5QjtZQUNFLE1BQU0sWUFBWSxHQUFHLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRSxPQUFPLFNBQVMsWUFBWSxHQUFHLENBQUM7S0FDbkM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBWSxFQUFFLGVBQXVCLEdBQUc7SUFDN0QsTUFBTSxJQUFJLEdBQUcsS0FBb0IsQ0FBQztJQUNsQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDckIsS0FBSyxJQUFJLENBQUMsWUFBWTtZQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksWUFBWSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ3ZFLEtBQUssSUFBSSxDQUFDLFNBQVM7WUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE9BQU8sUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pELEtBQUssSUFBSSxDQUFDLFlBQVk7WUFDcEIsT0FBTyxRQUFRLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDdkQ7WUFDRSxPQUFPLFNBQVMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDO0tBQ3BDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUFZLEVBQUUsS0FBWSxFQUFFLHFCQUE4QjtJQUNyRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDcEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtRQUNkLE9BQU8sSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7S0FDdEQ7U0FBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksa0NBQXlCLEVBQUU7UUFDNUQsT0FBTyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7S0FDM0I7SUFDRCxJQUFJLHFCQUFxQixFQUFFO1FBQ3pCLE9BQU8sSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNoRCxPQUFPLElBQUksTUFBTSxHQUFHLHVCQUF1QixnQkFBZ0IsSUFBSSxDQUFDO0tBQ2pFO1NBQU07UUFDTCxPQUFPLElBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLGdCQUFnQixJQUFJLENBQUM7S0FDdEU7SUFDRCxPQUFPLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUUxQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEYsSUFBSSxXQUFXLEVBQUU7UUFDZixPQUFPLEdBQUcsYUFBYSxDQUFDLFdBQThCLEVBQUUsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0tBQ3pFO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBVztJQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDcEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLE1BQU0sV0FBVyxHQUFHLElBQW1CLENBQUM7SUFDeEMsSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFO1FBQy9CLE9BQU8sSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7S0FDdkU7SUFDRCxPQUFPLElBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLGdCQUFnQixJQUFJLENBQUM7SUFDM0UsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ3BCLE9BQU8sSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0tBQzNCO0lBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ25CLE9BQU8sR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLFVBQWtCLEVBQUUsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0tBQ3pFO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHFCQUFxQixDQUMxQixRQUFnQixFQUFFLE9BQW9CLEVBQUUsV0FBd0I7SUFDbEUsUUFBUSxRQUFRLEVBQUU7UUFDaEIsS0FBSyxJQUFJLENBQUMsWUFBWTtZQUNwQixPQUFPLElBQUksT0FBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUM7UUFDdkMsS0FBSyxJQUFJLENBQUMsU0FBUztZQUNqQixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRixPQUFPLGNBQWMsT0FBTyxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLENBQUMsWUFBWTtZQUNwQixPQUFPLGdCQUFnQixDQUFDO1FBQzFCO1lBQ0UsT0FBTyxrQkFBa0IsUUFBUSxHQUFHLENBQUM7S0FDeEM7QUFDSCxDQUFDO0FBR0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUFDLGtCQUEyQjtJQUMxRCxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7SUFDM0YsT0FBTyx3QkFBd0I7UUFDM0IsYUFBYSxhQUFhLDJDQUEyQztRQUNyRSxvRUFBb0U7UUFDcEUsZ0NBQWdDLENBQUM7QUFDdkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyx5QkFBeUI7SUFDaEMsT0FBTyxpRUFBaUU7UUFDcEUsa0RBQWtELENBQUM7QUFDekQsQ0FBQztBQUVELGdDQUFnQztBQUVoQzs7Ozs7R0FLRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQWE7SUFDbEMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxPQUFPLENBQUMsS0FBa0IsRUFBRSxTQUFTLEdBQUcsRUFBRTtJQUNqRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUNELEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtSdW50aW1lRXJyb3IsIFJ1bnRpbWVFcnJvckNvZGV9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldERlY2xhcmF0aW9uQ29tcG9uZW50RGVmfSBmcm9tICcuLi9yZW5kZXIzL2luc3RydWN0aW9ucy9lbGVtZW50X3ZhbGlkYXRpb24nO1xuaW1wb3J0IHtUTm9kZSwgVE5vZGVUeXBlfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQge1JOb2RlfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvcmVuZGVyZXJfZG9tJztcbmltcG9ydCB7TFZpZXcsIFRWSUVXfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvdmlldyc7XG5pbXBvcnQge2dldFBhcmVudFJFbGVtZW50fSBmcm9tICcuLi9yZW5kZXIzL25vZGVfbWFuaXB1bGF0aW9uJztcblxuY29uc3QgQVRfVEhJU19MT0NBVElPTiA9ICc8LS0gQVQgVEhJUyBMT0NBVElPTic7XG5cbi8qKlxuICogUmV0cmlldmVzIGEgdXNlciBmcmllbmRseSBzdHJpbmcgZm9yIGEgZ2l2ZW4gVE5vZGVUeXBlIGZvciB1c2UgaW5cbiAqIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2VzXG4gKlxuICogQHBhcmFtIHROb2RlVHlwZVxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0RnJpZW5kbHlTdHJpbmdGcm9tVE5vZGVUeXBlKHROb2RlVHlwZTogVE5vZGVUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh0Tm9kZVR5cGUpIHtcbiAgICBjYXNlIFROb2RlVHlwZS5Db250YWluZXI6XG4gICAgICByZXR1cm4gJ3ZpZXcgY29udGFpbmVyJztcbiAgICBjYXNlIFROb2RlVHlwZS5FbGVtZW50OlxuICAgICAgcmV0dXJuICdlbGVtZW50JztcbiAgICBjYXNlIFROb2RlVHlwZS5FbGVtZW50Q29udGFpbmVyOlxuICAgICAgcmV0dXJuICduZy1jb250YWluZXInO1xuICAgIGNhc2UgVE5vZGVUeXBlLkljdTpcbiAgICAgIHJldHVybiAnaWN1JztcbiAgICBjYXNlIFROb2RlVHlwZS5QbGFjZWhvbGRlcjpcbiAgICAgIHJldHVybiAnaTE4bic7XG4gICAgY2FzZSBUTm9kZVR5cGUuUHJvamVjdGlvbjpcbiAgICAgIHJldHVybiAncHJvamVjdGlvbic7XG4gICAgY2FzZSBUTm9kZVR5cGUuVGV4dDpcbiAgICAgIHJldHVybiAndGV4dCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYXMgd2UgY292ZXIgYWxsIHBvc3NpYmxlIFROb2RlIHR5cGVzIGFib3ZlLlxuICAgICAgcmV0dXJuICc8dW5rbm93bj4nO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgcHJvdmlkZWQgbm9kZXMgbWF0Y2ggZHVyaW5nIHRoZSBoeWRyYXRpb24gcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWF0Y2hpbmdOb2RlKFxuICAgIG5vZGU6IFJOb2RlLCBub2RlVHlwZTogbnVtYmVyLCB0YWdOYW1lOiBzdHJpbmd8bnVsbCwgbFZpZXc6IExWaWV3LCB0Tm9kZTogVE5vZGUsXG4gICAgaXNWaWV3Q29udGFpbmVyQW5jaG9yID0gZmFsc2UpOiB2b2lkIHtcbiAgaWYgKCFub2RlIHx8XG4gICAgICAoKG5vZGUgYXMgTm9kZSkubm9kZVR5cGUgIT09IG5vZGVUeXBlIHx8XG4gICAgICAgKChub2RlIGFzIE5vZGUpLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJlxuICAgICAgICAobm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSB0YWdOYW1lPy50b0xvd2VyQ2FzZSgpKSkpIHtcbiAgICBjb25zdCBleHBlY3RlZE5vZGUgPSBzaG9ydFJOb2RlRGVzY3JpcHRpb24obm9kZVR5cGUsIHRhZ05hbWUsIG51bGwpO1xuICAgIGxldCBoZWFkZXIgPSBgRHVyaW5nIGh5ZHJhdGlvbiBBbmd1bGFyIGV4cGVjdGVkICR7ZXhwZWN0ZWROb2RlfSBidXQgYDtcblxuICAgIGNvbnN0IGhvc3RDb21wb25lbnREZWYgPSBnZXREZWNsYXJhdGlvbkNvbXBvbmVudERlZihsVmlldyk7XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3NOYW1lID0gaG9zdENvbXBvbmVudERlZj8udHlwZT8ubmFtZTtcblxuICAgIGNvbnN0IGV4cGVjdGVkID0gYEFuZ3VsYXIgZXhwZWN0ZWQgdGhpcyBET006XFxuXFxuJHtcbiAgICAgICAgZGVzY3JpYmVFeHBlY3RlZERvbShsVmlldywgdE5vZGUsIGlzVmlld0NvbnRhaW5lckFuY2hvcil9XFxuXFxuYDtcblxuICAgIGxldCBhY3R1YWwgPSAnJztcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgLy8gTm8gbm9kZSBmb3VuZCBkdXJpbmcgaHlkcmF0aW9uLlxuICAgICAgaGVhZGVyICs9IGB0aGUgbm9kZSB3YXMgbm90IGZvdW5kLlxcblxcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFjdHVhbE5vZGUgPSBzaG9ydFJOb2RlRGVzY3JpcHRpb24oXG4gICAgICAgICAgKG5vZGUgYXMgTm9kZSkubm9kZVR5cGUsIChub2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lID8/IG51bGwsXG4gICAgICAgICAgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnRleHRDb250ZW50ID8/IG51bGwpO1xuXG4gICAgICBoZWFkZXIgKz0gYGZvdW5kICR7YWN0dWFsTm9kZX0uXFxuXFxuYDtcbiAgICAgIGFjdHVhbCA9IGBBY3R1YWwgRE9NIGlzOlxcblxcbiR7ZGVzY3JpYmVEb21Gcm9tTm9kZShub2RlKX1cXG5cXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IGZvb3RlciA9IGdldEh5ZHJhdGlvbkVycm9yRm9vdGVyKGNvbXBvbmVudENsYXNzTmFtZSk7XG4gICAgY29uc3QgbWVzc2FnZSA9IGhlYWRlciArIGV4cGVjdGVkICsgYWN0dWFsICsgZ2V0SHlkcmF0aW9uQXR0cmlidXRlTm90ZSgpICsgZm9vdGVyO1xuICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoUnVudGltZUVycm9yQ29kZS5IWURSQVRJT05fTk9ERV9NSVNNQVRDSCwgbWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBhIGdpdmVuIG5vZGUgaGFzIHNpYmxpbmcgbm9kZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2libGluZ05vZGVFeGlzdHMobm9kZTogUk5vZGV8bnVsbCk6IHZvaWQge1xuICB2YWxpZGF0ZU5vZGVFeGlzdHMobm9kZSk7XG4gIGlmICghbm9kZSEubmV4dFNpYmxpbmcpIHtcbiAgICBjb25zdCBoZWFkZXIgPSAnRHVyaW5nIGh5ZHJhdGlvbiBBbmd1bGFyIGV4cGVjdGVkIG1vcmUgc2libGluZyBub2RlcyB0byBiZSBwcmVzZW50Llxcblxcbic7XG4gICAgY29uc3QgYWN0dWFsID0gYEFjdHVhbCBET00gaXM6XFxuXFxuJHtkZXNjcmliZURvbUZyb21Ob2RlKG5vZGUhKX1cXG5cXG5gO1xuICAgIGNvbnN0IGZvb3RlciA9IGdldEh5ZHJhdGlvbkVycm9yRm9vdGVyKCk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gaGVhZGVyICsgYWN0dWFsICsgZm9vdGVyO1xuICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoUnVudGltZUVycm9yQ29kZS5IWURSQVRJT05fTUlTU0lOR19TSUJMSU5HUywgbWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBhIG5vZGUgZXhpc3RzIG9yIHRocm93c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOb2RlRXhpc3RzKG5vZGU6IFJOb2RlfG51bGwpOiB2b2lkIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcbiAgICAgICAgUnVudGltZUVycm9yQ29kZS5IWURSQVRJT05fTUlTU0lOR19OT0RFLFxuICAgICAgICBgSHlkcmF0aW9uIGV4cGVjdGVkIGFuIGVsZW1lbnQgdG8gYmUgcHJlc2VudCBhdCB0aGlzIGxvY2F0aW9uLmApO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBoeWRyYXRpb24gZXJyb3IgbWVzc2FnZSB3aGVuIGEgbm9kZSBpcyBub3QgZm91bmRcbiAqXG4gKiBAcGFyYW0gbFZpZXcgdGhlIExWaWV3IHdoZXJlIHRoZSBub2RlIGV4aXN0c1xuICogQHBhcmFtIHROb2RlIHRoZSBUTm9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9kZU5vdEZvdW5kRXJyb3IobFZpZXc6IExWaWV3LCB0Tm9kZTogVE5vZGUpOiBFcnJvciB7XG4gIGNvbnN0IGhlYWRlciA9ICdEdXJpbmcgc2VyaWFsaXphdGlvbiwgQW5ndWxhciB3YXMgdW5hYmxlIHRvIGZpbmQgYW4gZWxlbWVudCBpbiB0aGUgRE9NOlxcblxcbic7XG4gIGNvbnN0IGV4cGVjdGVkID0gYCR7ZGVzY3JpYmVFeHBlY3RlZERvbShsVmlldywgdE5vZGUsIGZhbHNlKX1cXG5cXG5gO1xuICBjb25zdCBmb290ZXIgPSBnZXRIeWRyYXRpb25FcnJvckZvb3RlcigpO1xuXG4gIHRocm93IG5ldyBSdW50aW1lRXJyb3IoUnVudGltZUVycm9yQ29kZS5IWURSQVRJT05fTUlTU0lOR19OT0RFLCBoZWFkZXIgKyBleHBlY3RlZCArIGZvb3Rlcik7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgaHlkcmF0aW9uIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIG5vZGUgaXMgbm90IGZvdW5kIGF0IGEgcGF0aCBsb2NhdGlvblxuICpcbiAqIEBwYXJhbSBob3N0IHRoZSBIb3N0IE5vZGVcbiAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBub2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub2RlTm90Rm91bmRBdFBhdGhFcnJvcihob3N0OiBOb2RlLCBwYXRoOiBzdHJpbmcpOiBFcnJvciB7XG4gIGNvbnN0IGhlYWRlciA9IGBEdXJpbmcgaHlkcmF0aW9uIEFuZ3VsYXIgd2FzIHVuYWJsZSB0byBsb2NhdGUgYSBub2RlIGAgK1xuICAgICAgYHVzaW5nIHRoZSBcIiR7cGF0aH1cIiBwYXRoLCBzdGFydGluZyBmcm9tIHRoZSAke2Rlc2NyaWJlUk5vZGUoaG9zdCl9IG5vZGUuXFxuXFxuYDtcbiAgY29uc3QgZm9vdGVyID0gZ2V0SHlkcmF0aW9uRXJyb3JGb290ZXIoKTtcblxuICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFJ1bnRpbWVFcnJvckNvZGUuSFlEUkFUSU9OX01JU1NJTkdfTk9ERSwgaGVhZGVyICsgZm9vdGVyKTtcbn1cblxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgaHlkcmF0aW9uIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGNhc2UgdGhhdCBkb20gbm9kZXMgYXJlIGNyZWF0ZWQgb3V0c2lkZSBvZlxuICogdGhlIEFuZ3VsYXIgY29udGV4dCBhbmQgYXJlIGJlaW5nIHVzZWQgYXMgcHJvamVjdGVkIG5vZGVzXG4gKlxuICogQHBhcmFtIGxWaWV3IHRoZSBMVmlld1xuICogQHBhcmFtIHROb2RlIHRoZSBUTm9kZVxuICogQHJldHVybnMgYW4gZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuc3VwcG9ydGVkUHJvamVjdGlvbk9mRG9tTm9kZXMock5vZGU6IFJOb2RlKTogRXJyb3Ige1xuICBjb25zdCBoZWFkZXIgPSAnRHVyaW5nIHNlcmlhbGl6YXRpb24sIEFuZ3VsYXIgZGV0ZWN0ZWQgRE9NIG5vZGVzICcgK1xuICAgICAgJ3RoYXQgd2VyZSBjcmVhdGVkIG91dHNpZGUgb2YgQW5ndWxhciBjb250ZXh0IGFuZCBwcm92aWRlZCBhcyBwcm9qZWN0YWJsZSBub2RlcyAnICtcbiAgICAgICcobGlrZWx5IHZpYSBgVmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnRgIG9yIGBjcmVhdGVDb21wb25lbnRgIEFQSXMpLiAnICtcbiAgICAgICdIeWRyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3Igc3VjaCBjYXNlcywgY29uc2lkZXIgcmVmYWN0b3JpbmcgdGhlIGNvZGUgdG8gYXZvaWQgJyArXG4gICAgICAndGhpcyBwYXR0ZXJuIG9yIHVzaW5nIGBuZ1NraXBIeWRyYXRpb25gIG9uIHRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGNvbXBvbmVudC5cXG5cXG4nO1xuICBjb25zdCBhY3R1YWwgPSBgJHtkZXNjcmliZURvbUZyb21Ob2RlKHJOb2RlKX1cXG5cXG5gO1xuICBjb25zdCBtZXNzYWdlID0gaGVhZGVyICsgYWN0dWFsICsgZ2V0SHlkcmF0aW9uQXR0cmlidXRlTm90ZSgpO1xuICByZXR1cm4gbmV3IFJ1bnRpbWVFcnJvcihSdW50aW1lRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BST0pFQ1RJT05fRE9NX05PREVTLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGh5ZHJhdGlvbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjYXNlIHRoYXQgbmdTa2lwSHlkcmF0aW9uIHdhcyB1c2VkIG9uIGFcbiAqIG5vZGUgdGhhdCBpcyBub3QgYSBjb21wb25lbnQgaG9zdCBlbGVtZW50IG9yIGhvc3QgYmluZGluZ1xuICpcbiAqIEBwYXJhbSByTm9kZSB0aGUgSFRNTCBFbGVtZW50XG4gKiBAcmV0dXJucyBhbiBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZFNraXBIeWRyYXRpb25Ib3N0KHJOb2RlOiBSTm9kZSk6IEVycm9yIHtcbiAgY29uc3QgaGVhZGVyID0gJ1RoZSBgbmdTa2lwSHlkcmF0aW9uYCBmbGFnIGlzIGFwcGxpZWQgb24gYSBub2RlICcgK1xuICAgICAgJ3RoYXQgZG9lc25cXCd0IGFjdCBhcyBhIGNvbXBvbmVudCBob3N0LiBIeWRyYXRpb24gY2FuIGJlICcgK1xuICAgICAgJ3NraXBwZWQgb25seSBvbiBwZXItY29tcG9uZW50IGJhc2lzLlxcblxcbic7XG4gIGNvbnN0IGFjdHVhbCA9IGAke2Rlc2NyaWJlRG9tRnJvbU5vZGUock5vZGUpfVxcblxcbmA7XG4gIGNvbnN0IGZvb3RlciA9ICdQbGVhc2UgbW92ZSB0aGUgYG5nU2tpcEh5ZHJhdGlvbmAgYXR0cmlidXRlIHRvIHRoZSBjb21wb25lbnQgaG9zdCBlbGVtZW50Lic7XG4gIGNvbnN0IG1lc3NhZ2UgPSBoZWFkZXIgKyBhY3R1YWwgKyBmb290ZXI7XG4gIHJldHVybiBuZXcgUnVudGltZUVycm9yKFJ1bnRpbWVFcnJvckNvZGUuSU5WQUxJRF9TS0lQX0hZRFJBVElPTl9IT1NULCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGh5ZHJhdGlvbiBlcnJvciBtZXNzYWdlIGluIHRoZSBjYXNlIHRoYXQgYSB1c2VyIGlzIGF0dGVtcHRpbmcgdG8gZW5hYmxlXG4gKiBoeWRyYXRpb24gb24gaW50ZXJuYXRpb25hbGl6ZWQgbm9kZXMsIHdoaWNoIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSByTm9kZSB0aGUgSFRNTCBFbGVtZW50XG4gKiBAcmV0dXJucyBhbiBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gbm90WWV0U3VwcG9ydGVkSTE4bkJsb2NrRXJyb3Iock5vZGU6IFJOb2RlKTogRXJyb3Ige1xuICBjb25zdCBoZWFkZXIgPSAnSHlkcmF0aW9uIGZvciBub2RlcyBtYXJrZWQgd2l0aCBgaTE4bmAgaXMgbm90IHlldCBzdXBwb3J0ZWQuICcgK1xuICAgICAgJ1lvdSBjYW4gb3B0LW91dCBhIGNvbXBvbmVudCB0aGF0IHVzZXMgYGkxOG5gIGluIGEgdGVtcGxhdGUgdXNpbmcgJyArXG4gICAgICAndGhlIGBuZ1NraXBIeWRyYXRpb25gIGF0dHJpYnV0ZSBvciBmYWxsIGJhY2sgdG8gdGhlIHByZXZpb3VzICcgK1xuICAgICAgJ2h5ZHJhdGlvbiBsb2dpYyAod2hpY2ggcmUtY3JlYXRlcyB0aGUgYXBwbGljYXRpb24gc3RydWN0dXJlKS5cXG5cXG4nO1xuICBjb25zdCBhY3R1YWwgPSBgJHtkZXNjcmliZURvbUZyb21Ob2RlKHJOb2RlKX1cXG5cXG5gO1xuICBjb25zdCBtZXNzYWdlID0gaGVhZGVyICsgYWN0dWFsO1xuICByZXR1cm4gbmV3IFJ1bnRpbWVFcnJvcihSdW50aW1lRXJyb3JDb2RlLkhZRFJBVElPTl9JMThOX05PVF9ZRVRfU1VQUE9SVEVELCBtZXNzYWdlKTtcbn1cblxuLy8gU3RyaW5naWZpY2F0aW9uIG1ldGhvZHNcblxuLyoqXG4gKiBTdHJpbmdpZmllcyBhIGdpdmVuIFROb2RlJ3MgYXR0cmlidXRlc1xuICpcbiAqIEBwYXJhbSB0Tm9kZSBhIHByb3ZpZGVkIFROb2RlXG4gKiBAcmV0dXJucyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5VE5vZGVBdHRycyh0Tm9kZTogVE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHRzID0gW107XG4gIGlmICh0Tm9kZS5hdHRycykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdE5vZGUuYXR0cnMubGVuZ3RoOykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSB0Tm9kZS5hdHRyc1tpKytdO1xuICAgICAgLy8gT25jZSB3ZSByZWFjaCB0aGUgZmlyc3QgZmxhZywgd2Uga25vdyB0aGF0IHRoZSBsaXN0IG9mXG4gICAgICAvLyBhdHRyaWJ1dGVzIGlzIG92ZXIuXG4gICAgICBpZiAodHlwZW9mIGF0dHJOYW1lID09ICdudW1iZXInKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgYXR0clZhbHVlID0gdE5vZGUuYXR0cnNbaSsrXTtcbiAgICAgIHJlc3VsdHMucHVzaChgJHthdHRyTmFtZX09XCIke3Nob3J0ZW4oYXR0clZhbHVlIGFzIHN0cmluZyl9XCJgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHMuam9pbignICcpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0IG9mIGludGVybmFsIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IHdoaWxlXG4gKiBwcm9kdWNpbmcgYW4gZXJyb3IgbWVzc2FnZS5cbiAqL1xuY29uc3QgaW50ZXJuYWxBdHRycyA9IG5ldyBTZXQoWyduZ2gnLCAnbmctdmVyc2lvbicsICduZy1zZXJ2ZXItY29udGV4dCddKTtcblxuLyoqXG4gKiBTdHJpbmdpZmllcyBhbiBIVE1MIEVsZW1lbnQncyBhdHRyaWJ1dGVzXG4gKlxuICogQHBhcmFtIHJOb2RlIGFuIEhUTUwgRWxlbWVudFxuICogQHJldHVybnMgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVJOb2RlQXR0cnMock5vZGU6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJOb2RlLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gck5vZGUuYXR0cmlidXRlc1tpXTtcbiAgICBpZiAoaW50ZXJuYWxBdHRycy5oYXMoYXR0ci5uYW1lKSkgY29udGludWU7XG4gICAgcmVzdWx0cy5wdXNoKGAke2F0dHIubmFtZX09XCIke3Nob3J0ZW4oYXR0ci52YWx1ZSl9XCJgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cy5qb2luKCcgJyk7XG59XG5cbi8vIE1ldGhvZHMgZm9yIERlc2NyaWJpbmcgdGhlIERPTVxuXG4vKipcbiAqIENvbnZlcnRzIGEgdE5vZGUgdG8gYSBoZWxwZnVsIHJlYWRhYmxlIHN0cmluZyB2YWx1ZSBmb3IgdXNlIGluIGVycm9yIG1lc3NhZ2VzXG4gKlxuICogQHBhcmFtIHROb2RlIGEgZ2l2ZW4gVE5vZGVcbiAqIEBwYXJhbSBpbm5lckNvbnRlbnQgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGVcbiAqIEByZXR1cm5zIHN0cmluZ1xuICovXG5mdW5jdGlvbiBkZXNjcmliZVROb2RlKHROb2RlOiBUTm9kZSwgaW5uZXJDb250ZW50OiBzdHJpbmcgPSAn4oCmJyk6IHN0cmluZyB7XG4gIHN3aXRjaCAodE5vZGUudHlwZSkge1xuICAgIGNhc2UgVE5vZGVUeXBlLlRleHQ6XG4gICAgICBjb25zdCBjb250ZW50ID0gdE5vZGUudmFsdWUgPyBgKCR7dE5vZGUudmFsdWV9KWAgOiAnJztcbiAgICAgIHJldHVybiBgI3RleHQke2NvbnRlbnR9YDtcbiAgICBjYXNlIFROb2RlVHlwZS5FbGVtZW50OlxuICAgICAgY29uc3QgYXR0cnMgPSBzdHJpbmdpZnlUTm9kZUF0dHJzKHROb2RlKTtcbiAgICAgIGNvbnN0IHRhZyA9IHROb2RlLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gYDwke3RhZ30ke2F0dHJzID8gJyAnICsgYXR0cnMgOiAnJ30+JHtpbm5lckNvbnRlbnR9PC8ke3RhZ30+YDtcbiAgICBjYXNlIFROb2RlVHlwZS5FbGVtZW50Q29udGFpbmVyOlxuICAgICAgcmV0dXJuICc8IS0tIG5nLWNvbnRhaW5lciAtLT4nO1xuICAgIGNhc2UgVE5vZGVUeXBlLkNvbnRhaW5lcjpcbiAgICAgIHJldHVybiAnPCEtLSBjb250YWluZXIgLS0+JztcbiAgICBkZWZhdWx0OlxuICAgICAgY29uc3QgdHlwZUFzU3RyaW5nID0gZ2V0RnJpZW5kbHlTdHJpbmdGcm9tVE5vZGVUeXBlKHROb2RlLnR5cGUpO1xuICAgICAgcmV0dXJuIGAjbm9kZSgke3R5cGVBc1N0cmluZ30pYDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIFJOb2RlIHRvIGEgaGVscGZ1bCByZWFkYWJsZSBzdHJpbmcgdmFsdWUgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlc1xuICpcbiAqIEBwYXJhbSByTm9kZSBhIGdpdmVuIFJOb2RlXG4gKiBAcGFyYW0gaW5uZXJDb250ZW50IHRoZSBjb250ZW50IG9mIHRoZSBub2RlXG4gKiBAcmV0dXJucyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVSTm9kZShyTm9kZTogUk5vZGUsIGlubmVyQ29udGVudDogc3RyaW5nID0gJ+KApicpOiBzdHJpbmcge1xuICBjb25zdCBub2RlID0gck5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6XG4gICAgICBjb25zdCB0YWcgPSBub2RlLnRhZ05hbWUhLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBhdHRycyA9IHN0cmluZ2lmeVJOb2RlQXR0cnMobm9kZSk7XG4gICAgICByZXR1cm4gYDwke3RhZ30ke2F0dHJzID8gJyAnICsgYXR0cnMgOiAnJ30+JHtpbm5lckNvbnRlbnR9PC8ke3RhZ30+YDtcbiAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOlxuICAgICAgY29uc3QgY29udGVudCA9IG5vZGUudGV4dENvbnRlbnQgPyBzaG9ydGVuKG5vZGUudGV4dENvbnRlbnQpIDogJyc7XG4gICAgICByZXR1cm4gYCN0ZXh0JHtjb250ZW50ID8gYCgke2NvbnRlbnR9KWAgOiAnJ31gO1xuICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6XG4gICAgICByZXR1cm4gYDwhLS0gJHtzaG9ydGVuKG5vZGUudGV4dENvbnRlbnQgPz8gJycpfSAtLT5gO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYCNub2RlKCR7bm9kZS5ub2RlVHlwZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4cGVjdGVkIERPTSBwcmVzZW50IGdpdmVuIHRoZSBMVmlldyBhbmQgVE5vZGVcbiAqIHZhbHVlcyBmb3IgYSByZWFkYWJsZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQHBhcmFtIGxWaWV3IHRoZSBsVmlldyBjb250YWluaW5nIHRoZSBET01cbiAqIEBwYXJhbSB0Tm9kZSB0aGUgdE5vZGVcbiAqIEBwYXJhbSBpc1ZpZXdDb250YWluZXJBbmNob3IgYm9vbGVhblxuICogQHJldHVybnMgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlRXhwZWN0ZWREb20obFZpZXc6IExWaWV3LCB0Tm9kZTogVE5vZGUsIGlzVmlld0NvbnRhaW5lckFuY2hvcjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNwYWNlciA9ICcgICc7XG4gIGxldCBjb250ZW50ID0gJyc7XG4gIGlmICh0Tm9kZS5wcmV2KSB7XG4gICAgY29udGVudCArPSBzcGFjZXIgKyAn4oCmXFxuJztcbiAgICBjb250ZW50ICs9IHNwYWNlciArIGRlc2NyaWJlVE5vZGUodE5vZGUucHJldikgKyAnXFxuJztcbiAgfSBlbHNlIGlmICh0Tm9kZS50eXBlICYmIHROb2RlLnR5cGUgJiBUTm9kZVR5cGUuQW55Q29udGFpbmVyKSB7XG4gICAgY29udGVudCArPSBzcGFjZXIgKyAn4oCmXFxuJztcbiAgfVxuICBpZiAoaXNWaWV3Q29udGFpbmVyQW5jaG9yKSB7XG4gICAgY29udGVudCArPSBzcGFjZXIgKyBkZXNjcmliZVROb2RlKHROb2RlKSArICdcXG4nO1xuICAgIGNvbnRlbnQgKz0gc3BhY2VyICsgYDwhLS0gY29udGFpbmVyIC0tPiAgJHtBVF9USElTX0xPQ0FUSU9OfVxcbmA7XG4gIH0gZWxzZSB7XG4gICAgY29udGVudCArPSBzcGFjZXIgKyBkZXNjcmliZVROb2RlKHROb2RlKSArIGAgICR7QVRfVEhJU19MT0NBVElPTn1cXG5gO1xuICB9XG4gIGNvbnRlbnQgKz0gc3BhY2VyICsgJ+KAplxcbic7XG5cbiAgY29uc3QgcGFyZW50Uk5vZGUgPSB0Tm9kZS50eXBlID8gZ2V0UGFyZW50UkVsZW1lbnQobFZpZXdbVFZJRVddLCB0Tm9kZSwgbFZpZXcpIDogbnVsbDtcbiAgaWYgKHBhcmVudFJOb2RlKSB7XG4gICAgY29udGVudCA9IGRlc2NyaWJlUk5vZGUocGFyZW50Uk5vZGUgYXMgdW5rbm93biBhcyBOb2RlLCAnXFxuJyArIGNvbnRlbnQpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIERPTSBwcmVzZW50IGFyb3VuZCBhIGdpdmVuIFJOb2RlIGZvciBhXG4gKiByZWFkYWJsZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQHBhcmFtIG5vZGUgdGhlIFJOb2RlXG4gKiBAcmV0dXJucyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVEb21Gcm9tTm9kZShub2RlOiBSTm9kZSk6IHN0cmluZyB7XG4gIGNvbnN0IHNwYWNlciA9ICcgICc7XG4gIGxldCBjb250ZW50ID0gJyc7XG4gIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgaWYgKGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZykge1xuICAgIGNvbnRlbnQgKz0gc3BhY2VyICsgJ+KAplxcbic7XG4gICAgY29udGVudCArPSBzcGFjZXIgKyBkZXNjcmliZVJOb2RlKGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZykgKyAnXFxuJztcbiAgfVxuICBjb250ZW50ICs9IHNwYWNlciArIGRlc2NyaWJlUk5vZGUoY3VycmVudE5vZGUpICsgYCAgJHtBVF9USElTX0xPQ0FUSU9OfVxcbmA7XG4gIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgY29udGVudCArPSBzcGFjZXIgKyAn4oCmXFxuJztcbiAgfVxuICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgY29udGVudCA9IGRlc2NyaWJlUk5vZGUoY3VycmVudE5vZGUucGFyZW50Tm9kZSBhcyBOb2RlLCAnXFxuJyArIGNvbnRlbnQpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIFNob3J0ZW5zIHRoZSBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIFJOb2RlIGJ5IGl0cyB0eXBlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBub2RlVHlwZSB0aGUgdHlwZSBvZiBub2RlXG4gKiBAcGFyYW0gdGFnTmFtZSB0aGUgbm9kZSB0YWcgbmFtZVxuICogQHBhcmFtIHRleHRDb250ZW50IHRoZSB0ZXh0IGNvbnRlbnQgaW4gdGhlIG5vZGVcbiAqIEByZXR1cm5zIHN0cmluZ1xuICovXG5mdW5jdGlvbiBzaG9ydFJOb2RlRGVzY3JpcHRpb24oXG4gICAgbm9kZVR5cGU6IG51bWJlciwgdGFnTmFtZTogc3RyaW5nfG51bGwsIHRleHRDb250ZW50OiBzdHJpbmd8bnVsbCk6IHN0cmluZyB7XG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOlxuICAgICAgcmV0dXJuIGA8JHt0YWdOYW1lIS50b0xvd2VyQ2FzZSgpfT5gO1xuICAgIGNhc2UgTm9kZS5URVhUX05PREU6XG4gICAgICBjb25zdCBjb250ZW50ID0gdGV4dENvbnRlbnQgPyBgICh3aXRoIHRoZSBcIiR7c2hvcnRlbih0ZXh0Q29udGVudCl9XCIgY29udGVudClgIDogJyc7XG4gICAgICByZXR1cm4gYGEgdGV4dCBub2RlJHtjb250ZW50fWA7XG4gICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpcbiAgICAgIHJldHVybiAnYSBjb21tZW50IG5vZGUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYCNub2RlKG5vZGVUeXBlPSR7bm9kZVR5cGV9KWA7XG4gIH1cbn1cblxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZm9vdGVyIGh5ZHJhdGlvbiBlcnJvciBtZXNzYWdlXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudENsYXNzTmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGNsYXNzXG4gKiBAcmV0dXJucyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SHlkcmF0aW9uRXJyb3JGb290ZXIoY29tcG9uZW50Q2xhc3NOYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29tcG9uZW50SW5mbyA9IGNvbXBvbmVudENsYXNzTmFtZSA/IGB0aGUgXCIke2NvbXBvbmVudENsYXNzTmFtZX1cImAgOiAnY29ycmVzcG9uZGluZyc7XG4gIHJldHVybiBgVG8gZml4IHRoaXMgcHJvYmxlbTpcXG5gICtcbiAgICAgIGAgICogY2hlY2sgJHtjb21wb25lbnRJbmZvfSBjb21wb25lbnQgZm9yIGh5ZHJhdGlvbi1yZWxhdGVkIGlzc3Vlc1xcbmAgK1xuICAgICAgYCAgKiBvciBza2lwIGh5ZHJhdGlvbiBieSBhZGRpbmcgdGhlIFxcYG5nU2tpcEh5ZHJhdGlvblxcYCBhdHRyaWJ1dGUgYCArXG4gICAgICBgdG8gaXRzIGhvc3Qgbm9kZSBpbiBhIHRlbXBsYXRlYDtcbn1cblxuLyoqXG4gKiBBbiBhdHRyaWJ1dGUgcmVsYXRlZCBub3RlIGZvciBoeWRyYXRpb24gZXJyb3JzXG4gKi9cbmZ1bmN0aW9uIGdldEh5ZHJhdGlvbkF0dHJpYnV0ZU5vdGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuICdOb3RlOiBhdHRyaWJ1dGVzIGFyZSBvbmx5IGRpc3BsYXllZCB0byBiZXR0ZXIgcmVwcmVzZW50IHRoZSBET00nICtcbiAgICAgICcgYnV0IGhhdmUgbm8gZWZmZWN0IG9uIGh5ZHJhdGlvbiBtaXNtYXRjaGVzLlxcblxcbic7XG59XG5cbi8vIE5vZGUgc3RyaW5nIHV0aWxpdHkgZnVuY3Rpb25zXG5cbi8qKlxuICogU3RyaXBzIGFsbCBuZXdsaW5lcyBvdXQgb2YgYSBnaXZlbiBzdHJpbmdcbiAqXG4gKiBAcGFyYW0gaW5wdXQgYSBzdHJpbmcgdG8gYmUgY2xlYXJlZCBvZiBuZXcgbGluZSBjaGFyYWN0ZXJzXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBzdHJpcE5ld2xpbmVzKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxzKy9nbSwgJycpO1xufVxuXG4vKipcbiAqIFJlZHVjZXMgYSBzdHJpbmcgZG93biB0byBhIG1heGltdW0gbGVuZ3RoIG9mIGNoYXJhY3RlcnMgd2l0aCBlbGxpcHNpcyBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gaW5wdXQgYSBzdHJpbmcgaW5wdXRcbiAqIEBwYXJhbSBtYXhMZW5ndGggYSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzXG4gKiBAcmV0dXJucyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gc2hvcnRlbihpbnB1dDogc3RyaW5nfG51bGwsIG1heExlbmd0aCA9IDUwKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBpbnB1dCA9IHN0cmlwTmV3bGluZXMoaW5wdXQpO1xuICByZXR1cm4gaW5wdXQubGVuZ3RoID4gbWF4TGVuZ3RoID8gYCR7aW5wdXQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCAtIDEpfeKApmAgOiBpbnB1dDtcbn1cbiJdfQ==
|
|
@@ -5,6 +5,19 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
|
+
/** Encodes that the node lookup should start from the host node of this component. */
|
|
9
|
+
export const REFERENCE_NODE_HOST = 'h';
|
|
10
|
+
/** Encodes that the node lookup should start from the document body node. */
|
|
11
|
+
export const REFERENCE_NODE_BODY = 'b';
|
|
12
|
+
/**
|
|
13
|
+
* Describes navigation steps that the runtime logic need to perform,
|
|
14
|
+
* starting from a given (known) element.
|
|
15
|
+
*/
|
|
16
|
+
export var NodeNavigationStep;
|
|
17
|
+
(function (NodeNavigationStep) {
|
|
18
|
+
NodeNavigationStep["FirstChild"] = "f";
|
|
19
|
+
NodeNavigationStep["NextSibling"] = "n";
|
|
20
|
+
})(NodeNavigationStep || (NodeNavigationStep = {}));
|
|
8
21
|
/**
|
|
9
22
|
* Keys within serialized view data structure to represent various
|
|
10
23
|
* parts. See the `SerializedView` interface below for additional information.
|
|
@@ -12,6 +25,9 @@
|
|
|
12
25
|
export const ELEMENT_CONTAINERS = 'e';
|
|
13
26
|
export const TEMPLATES = 't';
|
|
14
27
|
export const CONTAINERS = 'c';
|
|
28
|
+
export const MULTIPLIER = 'x';
|
|
15
29
|
export const NUM_ROOT_NODES = 'r';
|
|
16
30
|
export const TEMPLATE_ID = 'i'; // as it's also an "id"
|
|
17
|
-
|
|
31
|
+
export const NODES = 'n';
|
|
32
|
+
export const DISCONNECTED_NODES = 'd';
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2h5ZHJhdGlvbi9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUtILHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFdkMsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUV2Qzs7O0dBR0c7QUFDSCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLHNDQUFnQixDQUFBO0lBQ2hCLHVDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7QUFDN0IsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFFLHVCQUF1QjtBQUN4RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1JOb2RlfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvcmVuZGVyZXJfZG9tJztcblxuXG4vKiogRW5jb2RlcyB0aGF0IHRoZSBub2RlIGxvb2t1cCBzaG91bGQgc3RhcnQgZnJvbSB0aGUgaG9zdCBub2RlIG9mIHRoaXMgY29tcG9uZW50LiAqL1xuZXhwb3J0IGNvbnN0IFJFRkVSRU5DRV9OT0RFX0hPU1QgPSAnaCc7XG5cbi8qKiBFbmNvZGVzIHRoYXQgdGhlIG5vZGUgbG9va3VwIHNob3VsZCBzdGFydCBmcm9tIHRoZSBkb2N1bWVudCBib2R5IG5vZGUuICovXG5leHBvcnQgY29uc3QgUkVGRVJFTkNFX05PREVfQk9EWSA9ICdiJztcblxuLyoqXG4gKiBEZXNjcmliZXMgbmF2aWdhdGlvbiBzdGVwcyB0aGF0IHRoZSBydW50aW1lIGxvZ2ljIG5lZWQgdG8gcGVyZm9ybSxcbiAqIHN0YXJ0aW5nIGZyb20gYSBnaXZlbiAoa25vd24pIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIE5vZGVOYXZpZ2F0aW9uU3RlcCB7XG4gIEZpcnN0Q2hpbGQgPSAnZicsXG4gIE5leHRTaWJsaW5nID0gJ24nLFxufVxuXG4vKipcbiAqIEtleXMgd2l0aGluIHNlcmlhbGl6ZWQgdmlldyBkYXRhIHN0cnVjdHVyZSB0byByZXByZXNlbnQgdmFyaW91c1xuICogcGFydHMuIFNlZSB0aGUgYFNlcmlhbGl6ZWRWaWV3YCBpbnRlcmZhY2UgYmVsb3cgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBFTEVNRU5UX0NPTlRBSU5FUlMgPSAnZSc7XG5leHBvcnQgY29uc3QgVEVNUExBVEVTID0gJ3QnO1xuZXhwb3J0IGNvbnN0IENPTlRBSU5FUlMgPSAnYyc7XG5leHBvcnQgY29uc3QgTVVMVElQTElFUiA9ICd4JztcbmV4cG9ydCBjb25zdCBOVU1fUk9PVF9OT0RFUyA9ICdyJztcbmV4cG9ydCBjb25zdCBURU1QTEFURV9JRCA9ICdpJzsgIC8vIGFzIGl0J3MgYWxzbyBhbiBcImlkXCJcbmV4cG9ydCBjb25zdCBOT0RFUyA9ICduJztcbmV4cG9ydCBjb25zdCBESVNDT05ORUNURURfTk9ERVMgPSAnZCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBlbGVtZW50IGNvbnRhaW5lcnMgd2l0aGluIHRoaXMgdmlldywgc3RvcmVkIGFzIGtleS12YWx1ZSBwYWlyc1xuICogd2hlcmUga2V5IGlzIGFuIGluZGV4IG9mIGEgY29udGFpbmVyIGluIGFuIExWaWV3IChhbHNvIHVzZWQgaW4gdGhlXG4gKiBgZWxlbWVudENvbnRhaW5lclN0YXJ0YCBpbnN0cnVjdGlvbiksIHRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHJvb3Qgbm9kZXNcbiAqIGluIHRoaXMgY29udGFpbmVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBsb2NhdGUgYW4gYW5jaG9yIGNvbW1lbnRcbiAqIG5vZGUgdGhhdCBnb2VzIGFmdGVyIGFsbCBjb250YWluZXIgbm9kZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZEVsZW1lbnRDb250YWluZXJzIHtcbiAgW2tleTogbnVtYmVyXTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyByZWxldmFudCBoeWRyYXRpb25cbiAqIGFubm90YXRpb24gaW5mb3JtYXRpb24gdGhhdCBkZXNjcmliZXMgYSBnaXZlbiBoeWRyYXRpb24gYm91bmRhcnlcbiAqIChlLmcuIGEgY29tcG9uZW50KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkVmlldyB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGluZm9ybWF0aW9uIGFib3V0IDxuZy1jb250YWluZXI+cy5cbiAgICovXG4gIFtFTEVNRU5UX0NPTlRBSU5FUlNdPzogU2VyaWFsaXplZEVsZW1lbnRDb250YWluZXJzO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGluZm9ybWF0aW9uIGFib3V0IHRlbXBsYXRlcy5cbiAgICogS2V5LXZhbHVlIHBhaXJzIHdoZXJlIGEga2V5IGlzIGFuIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gICAqIGB0ZW1wbGF0ZWAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBpZCB0aGF0IGNhblxuICAgKiBiZSB1c2VkIGR1cmluZyBoeWRyYXRpb24gdG8gaWRlbnRpZnkgdGhhdCB0ZW1wbGF0ZS5cbiAgICovXG4gIFtURU1QTEFURVNdPzogUmVjb3JkPG51bWJlciwgc3RyaW5nPjtcblxuICAvKipcbiAgICogU2VyaWFsaXplZCBpbmZvcm1hdGlvbiBhYm91dCB2aWV3IGNvbnRhaW5lcnMuXG4gICAqIEtleS12YWx1ZSBwYWlycyB3aGVyZSBhIGtleSBpcyBhbiBpbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgKiBMQ29udGFpbmVyIGVudHJ5IHdpdGhpbiBhbiBMVmlldywgYW5kIHRoZSB2YWx1ZSBpcyBhIGxpc3RcbiAgICogb2Ygc2VyaWFsaXplZCBpbmZvcm1hdGlvbiBhYm91dCB2aWV3cyB3aXRoaW4gdGhpcyBjb250YWluZXIuXG4gICAqL1xuICBbQ09OVEFJTkVSU10/OiBSZWNvcmQ8bnVtYmVyLCBTZXJpYWxpemVkQ29udGFpbmVyVmlld1tdPjtcblxuICAvKipcbiAgICogU2VyaWFsaXplZCBpbmZvcm1hdGlvbiBhYm91dCBub2RlcyBpbiBhIHRlbXBsYXRlLlxuICAgKiBLZXktdmFsdWUgcGFpcnMgd2hlcmUgYSBrZXkgaXMgYW4gaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICogRE9NIG5vZGUgaW4gYW4gTFZpZXcgYW5kIHRoZSB2YWx1ZSBpcyBhIHBhdGggdGhhdCBkZXNjcmliZXNcbiAgICogdGhlIGxvY2F0aW9uIG9mIHRoaXMgbm9kZSAoYXMgYSBzZXQgb2YgbmF2aWdhdGlvbiBpbnN0cnVjdGlvbnMpLlxuICAgKi9cbiAgW05PREVTXT86IFJlY29yZDxudW1iZXIsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpZHMgd2hpY2ggcmVwcmVzZW50cyBhIHNldCBvZiBub2RlcyBkaXNjb25uZWN0ZWRcbiAgICogZnJvbSB0aGUgRE9NIHRyZWUgYXQgdGhlIHNlcmlhbGl6YXRpb24gdGltZSwgYnV0IG90aGVyd2lzZVxuICAgKiBwcmVzZW50IGluIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSBoeWRyYXRpb25cbiAgICogbG9naWMgZm9yIHN1Y2ggbm9kZXMgYW5kIGluc3RlYWQgdXNlIGEgcmVndWxhciBcImNyZWF0aW9uIG1vZGVcIi5cbiAgICovXG4gIFtESVNDT05ORUNURURfTk9ERVNdPzogbnVtYmVyW107XG59XG5cbi8qKlxuICogU2VyaWFsaXplZCBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHJlbGV2YW50IGh5ZHJhdGlvblxuICogYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHZpZXcgdGhhdCBpcyBhIHBhcnQgb2YgYVxuICogVmlld0NvbnRhaW5lciBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRDb250YWluZXJWaWV3IGV4dGVuZHMgU2VyaWFsaXplZFZpZXcge1xuICAvKipcbiAgICogVW5pcXVlIGlkIHRoYXQgcmVwcmVzZW50cyBhIFRWaWV3IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlXG4gICAqIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgYSB2aWV3OlxuICAgKiAgLSBUVmlld1R5cGUuRW1iZWRkZWQ6IGEgdW5pcXVlIGlkIGdlbmVyYXRlZCBkdXJpbmcgc2VyaWFsaXphdGlvbiBvbiB0aGUgc2VydmVyXG4gICAqICAtIFRWaWV3VHlwZS5Db21wb25lbnQ6IGFuIGlkIGdlbmVyYXRlZCBiYXNlZCBvbiBjb21wb25lbnQgcHJvcGVydGllc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgYGdldENvbXBvbmVudElkYCBmdW5jdGlvbiBmb3IgZGV0YWlscylcbiAgICovXG4gIFtURU1QTEFURV9JRF06IHN0cmluZztcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHJvb3Qgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB2aWV3LlxuICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBlZmZlY3RpdmVseSB0cmF2ZXJzZSB0aGUgRE9NIHRyZWVcbiAgICogYW5kIGlkZW50aWZ5IHNlZ21lbnRzIHRoYXQgYmVsb25nIHRvIGRpZmZlcmVudCB2aWV3cy5cbiAgICovXG4gIFtOVU1fUk9PVF9OT0RFU106IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHRpbWVzIHRoaXMgdmlldyBpcyByZXBlYXRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHNlcmlhbGl6aW5nIGFuZCBzZW5kaW5nIHRoZSBzYW1lIGh5ZHJhdGlvblxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCBzaW1pbGFyIHZpZXdzIChmb3IgZXhhbXBsZSwgcHJvZHVjZWQgYnkgKm5nRm9yKS5cbiAgICovXG4gIFtNVUxUSVBMSUVSXT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyBoeWRyYXRpb24tcmVsYXRlZCBpbmZvcm1hdGlvbiBzZXJpYWxpemVkXG4gKiBvbiB0aGUgc2VydmVyLCBhcyB3ZWxsIGFzIHRoZSBuZWNlc3NhcnkgcmVmZXJlbmNlcyB0byBzZWdtZW50cyBvZlxuICogdGhlIERPTSwgdG8gZmFjaWxpdGF0ZSB0aGUgaHlkcmF0aW9uIHByb2Nlc3MgZm9yIGEgZ2l2ZW4gaHlkcmF0aW9uXG4gKiBib3VuZGFyeSBvbiB0aGUgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlaHlkcmF0ZWRWaWV3IHtcbiAgLyoqXG4gICAqIFRoZSByZWFkb25seSBoeWRyYXRpb24gYW5ub3RhdGlvbiBkYXRhLlxuICAgKi9cbiAgZGF0YTogUmVhZG9ubHk8U2VyaWFsaXplZFZpZXc+O1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZmlyc3QgY2hpbGQgaW4gYSBET00gc2VnbWVudCBhc3NvY2lhdGVkXG4gICAqIHdpdGggYSBnaXZlbiBoeWRyYXRpb24gYm91bmRhcnkuXG4gICAqL1xuICBmaXJzdENoaWxkOiBSTm9kZXxudWxsO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgcmVmZXJlbmNlcyB0byBmaXJzdCBub2RlcyBpbiBET00gc2VnbWVudHMgdGhhdFxuICAgKiByZXByZXNlbnQgZWl0aGVyIGFuIDxuZy1jb250YWluZXI+IG9yIGEgdmlldyBjb250YWluZXIuXG4gICAqL1xuICBzZWdtZW50SGVhZHM/OiB7W2luZGV4OiBudW1iZXJdOiBSTm9kZXxudWxsfTtcblxuICAvKipcbiAgICogQW4gaW5zdGFuY2Ugb2YgYSBTZXQgdGhhdCByZXByZXNlbnRzIG5vZGVzIGRpc2Nvbm5lY3RlZCBmcm9tXG4gICAqIHRoZSBET00gdHJlZSBhdCB0aGUgc2VyaWFsaXphdGlvbiB0aW1lLCBidXQgb3RoZXJ3aXNlIHByZXNlbnRcbiAgICogaW4gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy5cbiAgICpcbiAgICogVGhlIFNldCBpcyBiYXNlZCBvbiB0aGUgYFNlcmlhbGl6ZWRWaWV3W0RJU0NPTk5FQ1RFRF9OT0RFU11gIGRhdGFcbiAgICogYW5kIGlzIG5lZWRlZCB0byBoYXZlIGNvbnN0YW50LXRpbWUgbG9va3Vwcy5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIGlzIGBudWxsYCwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3ZXJlIG5vIGRpc2Nvbm5lY3RlZFxuICAgKiBub2RlcyBkZXRlY3RlZCBpbiB0aGlzIHZpZXcgYXQgc2VyaWFsaXphdGlvbiB0aW1lLlxuICAgKi9cbiAgZGlzY29ubmVjdGVkTm9kZXM/OiBTZXQ8bnVtYmVyPnxudWxsO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGh5ZHJhdGlvbi1yZWxhdGVkIGluZm9ybWF0aW9uIHNlcmlhbGl6ZWRcbiAqIG9uIHRoZSBzZXJ2ZXIsIGFzIHdlbGwgYXMgdGhlIG5lY2Vzc2FyeSByZWZlcmVuY2VzIHRvIHNlZ21lbnRzIG9mXG4gKiB0aGUgRE9NLCB0byBmYWNpbGl0YXRlIHRoZSBoeWRyYXRpb24gcHJvY2VzcyBmb3IgYSBnaXZlbiB2aWV3XG4gKiBpbnNpZGUgYSB2aWV3IGNvbnRhaW5lciAoZWl0aGVyIGFuIGVtYmVkZGVkIHZpZXcgb3IgYSB2aWV3IGNyZWF0ZWRcbiAqIGZvciBhIGNvbXBvbmVudCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVoeWRyYXRlZENvbnRhaW5lclZpZXcgZXh0ZW5kcyBEZWh5ZHJhdGVkVmlldyB7XG4gIGRhdGE6IFJlYWRvbmx5PFNlcmlhbGl6ZWRDb250YWluZXJWaWV3Pjtcbn1cbiJdfQ==
|