@angular/compiler 19.0.0-next.0 → 19.0.0-next.10
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/LICENSE +21 -0
- package/README.md +1 -1
- package/fesm2022/compiler.mjs +5465 -4675
- package/fesm2022/compiler.mjs.map +1 -1
- package/index.d.ts +115 -15
- package/package.json +2 -4
- package/esm2022/compiler.mjs +0 -13
- package/esm2022/index.mjs +0 -13
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/src/assertions.mjs +0 -31
- package/esm2022/src/chars.mjs +0 -90
- package/esm2022/src/compiler.mjs +0 -88
- package/esm2022/src/compiler_facade_interface.mjs +0 -29
- package/esm2022/src/config.mjs +0 -20
- package/esm2022/src/constant_pool.mjs +0 -285
- package/esm2022/src/core.mjs +0 -96
- package/esm2022/src/expression_parser/ast.mjs +0 -755
- package/esm2022/src/expression_parser/lexer.mjs +0 -421
- package/esm2022/src/expression_parser/parser.mjs +0 -1222
- package/esm2022/src/i18n/digest.mjs +0 -322
- package/esm2022/src/i18n/extractor_merger.mjs +0 -409
- package/esm2022/src/i18n/i18n_ast.mjs +0 -212
- package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
- package/esm2022/src/i18n/i18n_parser.mjs +0 -247
- package/esm2022/src/i18n/index.mjs +0 -16
- package/esm2022/src/i18n/message_bundle.mjs +0 -93
- package/esm2022/src/i18n/parse_util.mjs +0 -17
- package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
- package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
- package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
- package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
- package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
- package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
- package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
- package/esm2022/src/i18n/translation_bundle.mjs +0 -164
- package/esm2022/src/injectable_compiler_2.mjs +0 -138
- package/esm2022/src/jit_compiler_facade.mjs +0 -681
- package/esm2022/src/ml_parser/ast.mjs +0 -167
- package/esm2022/src/ml_parser/defaults.mjs +0 -24
- package/esm2022/src/ml_parser/entities.mjs +0 -2144
- package/esm2022/src/ml_parser/html_parser.mjs +0 -18
- package/esm2022/src/ml_parser/html_tags.mjs +0 -156
- package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
- package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
- package/esm2022/src/ml_parser/lexer.mjs +0 -1210
- package/esm2022/src/ml_parser/parser.mjs +0 -539
- package/esm2022/src/ml_parser/tags.mjs +0 -47
- package/esm2022/src/ml_parser/tokens.mjs +0 -9
- package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
- package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
- package/esm2022/src/output/abstract_emitter.mjs +0 -524
- package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
- package/esm2022/src/output/map_util.mjs +0 -19
- package/esm2022/src/output/output_ast.mjs +0 -1301
- package/esm2022/src/output/output_jit.mjs +0 -138
- package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
- package/esm2022/src/output/source_map.mjs +0 -150
- package/esm2022/src/parse_util.mjs +0 -198
- package/esm2022/src/render3/partial/api.mjs +0 -9
- package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
- package/esm2022/src/render3/partial/component.mjs +0 -197
- package/esm2022/src/render3/partial/directive.mjs +0 -264
- package/esm2022/src/render3/partial/factory.mjs +0 -35
- package/esm2022/src/render3/partial/injectable.mjs +0 -67
- package/esm2022/src/render3/partial/injector.mjs +0 -41
- package/esm2022/src/render3/partial/ng_module.mjs +0 -63
- package/esm2022/src/render3/partial/pipe.mjs +0 -50
- package/esm2022/src/render3/partial/util.mjs +0 -79
- package/esm2022/src/render3/r3_ast.mjs +0 -493
- package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
- package/esm2022/src/render3/r3_control_flow.mjs +0 -421
- package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
- package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
- package/esm2022/src/render3/r3_factory.mjs +0 -200
- package/esm2022/src/render3/r3_identifiers.mjs +0 -480
- package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
- package/esm2022/src/render3/r3_jit.mjs +0 -29
- package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
- package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_template_transform.mjs +0 -560
- package/esm2022/src/render3/util.mjs +0 -90
- package/esm2022/src/render3/view/api.mjs +0 -14
- package/esm2022/src/render3/view/compiler.mjs +0 -546
- package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
- package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
- package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
- package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
- package/esm2022/src/render3/view/i18n/util.mjs +0 -70
- package/esm2022/src/render3/view/query_generation.mjs +0 -182
- package/esm2022/src/render3/view/t2_api.mjs +0 -9
- package/esm2022/src/render3/view/t2_binder.mjs +0 -823
- package/esm2022/src/render3/view/template.mjs +0 -113
- package/esm2022/src/render3/view/util.mjs +0 -192
- package/esm2022/src/resource_loader.mjs +0 -17
- package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
- package/esm2022/src/schema/dom_security_schema.mjs +0 -96
- package/esm2022/src/schema/element_schema_registry.mjs +0 -10
- package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
- package/esm2022/src/selector.mjs +0 -400
- package/esm2022/src/shadow_css.mjs +0 -1053
- package/esm2022/src/style_url_resolver.mjs +0 -17
- package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
- package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
- package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
- package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
- package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
- package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
- package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
- package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
- package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
- package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
- package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
- package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
- package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
- package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
- package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
- package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
- package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
- package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
- package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
- package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
- package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
- package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
- package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
- package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
- package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
- package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
- package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
- package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
- package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
- package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
- package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
- package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
- package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
- package/esm2022/src/template_parser/binding_parser.mjs +0 -465
- package/esm2022/src/template_parser/template_preparser.mjs +0 -84
- package/esm2022/src/util.mjs +0 -124
- package/esm2022/src/version.mjs +0 -15
|
@@ -1,997 +0,0 @@
|
|
|
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
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
9
|
-
import * as o from '../../../../output/output_ast';
|
|
10
|
-
import { ExpressionKind, OpKind } from './enums';
|
|
11
|
-
import { Interpolation } from './ops/update';
|
|
12
|
-
import { ConsumesVarsTrait, DependsOnSlotContext, UsesVarOffset, } from './traits';
|
|
13
|
-
/**
|
|
14
|
-
* Check whether a given `o.Expression` is a logical IR expression type.
|
|
15
|
-
*/
|
|
16
|
-
export function isIrExpression(expr) {
|
|
17
|
-
return expr instanceof ExpressionBase;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Base type used for all logical IR expressions.
|
|
21
|
-
*/
|
|
22
|
-
export class ExpressionBase extends o.Expression {
|
|
23
|
-
constructor(sourceSpan = null) {
|
|
24
|
-
super(null, sourceSpan);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Logical expression representing a lexical read of a variable name.
|
|
29
|
-
*/
|
|
30
|
-
export class LexicalReadExpr extends ExpressionBase {
|
|
31
|
-
constructor(name) {
|
|
32
|
-
super();
|
|
33
|
-
this.name = name;
|
|
34
|
-
this.kind = ExpressionKind.LexicalRead;
|
|
35
|
-
}
|
|
36
|
-
visitExpression(visitor, context) { }
|
|
37
|
-
isEquivalent(other) {
|
|
38
|
-
// We assume that the lexical reads are in the same context, which must be true for parent
|
|
39
|
-
// expressions to be equivalent.
|
|
40
|
-
// TODO: is this generally safe?
|
|
41
|
-
return this.name === other.name;
|
|
42
|
-
}
|
|
43
|
-
isConstant() {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
transformInternalExpressions() { }
|
|
47
|
-
clone() {
|
|
48
|
-
return new LexicalReadExpr(this.name);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Runtime operation to retrieve the value of a local reference.
|
|
53
|
-
*/
|
|
54
|
-
export class ReferenceExpr extends ExpressionBase {
|
|
55
|
-
constructor(target, targetSlot, offset) {
|
|
56
|
-
super();
|
|
57
|
-
this.target = target;
|
|
58
|
-
this.targetSlot = targetSlot;
|
|
59
|
-
this.offset = offset;
|
|
60
|
-
this.kind = ExpressionKind.Reference;
|
|
61
|
-
}
|
|
62
|
-
visitExpression() { }
|
|
63
|
-
isEquivalent(e) {
|
|
64
|
-
return e instanceof ReferenceExpr && e.target === this.target;
|
|
65
|
-
}
|
|
66
|
-
isConstant() {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
transformInternalExpressions() { }
|
|
70
|
-
clone() {
|
|
71
|
-
return new ReferenceExpr(this.target, this.targetSlot, this.offset);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
export class StoreLetExpr extends ExpressionBase {
|
|
75
|
-
static { _a = ConsumesVarsTrait, _b = DependsOnSlotContext; }
|
|
76
|
-
constructor(target, value, sourceSpan) {
|
|
77
|
-
super();
|
|
78
|
-
this.target = target;
|
|
79
|
-
this.value = value;
|
|
80
|
-
this.sourceSpan = sourceSpan;
|
|
81
|
-
this.kind = ExpressionKind.StoreLet;
|
|
82
|
-
this[_a] = true;
|
|
83
|
-
this[_b] = true;
|
|
84
|
-
}
|
|
85
|
-
visitExpression() { }
|
|
86
|
-
isEquivalent(e) {
|
|
87
|
-
return (e instanceof StoreLetExpr && e.target === this.target && e.value.isEquivalent(this.value));
|
|
88
|
-
}
|
|
89
|
-
isConstant() {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
transformInternalExpressions(transform, flags) {
|
|
93
|
-
this.value = transformExpressionsInExpression(this.value, transform, flags);
|
|
94
|
-
}
|
|
95
|
-
clone() {
|
|
96
|
-
return new StoreLetExpr(this.target, this.value, this.sourceSpan);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
export class ContextLetReferenceExpr extends ExpressionBase {
|
|
100
|
-
constructor(target, targetSlot) {
|
|
101
|
-
super();
|
|
102
|
-
this.target = target;
|
|
103
|
-
this.targetSlot = targetSlot;
|
|
104
|
-
this.kind = ExpressionKind.ContextLetReference;
|
|
105
|
-
}
|
|
106
|
-
visitExpression() { }
|
|
107
|
-
isEquivalent(e) {
|
|
108
|
-
return e instanceof ContextLetReferenceExpr && e.target === this.target;
|
|
109
|
-
}
|
|
110
|
-
isConstant() {
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
transformInternalExpressions() { }
|
|
114
|
-
clone() {
|
|
115
|
-
return new ContextLetReferenceExpr(this.target, this.targetSlot);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* A reference to the current view context (usually the `ctx` variable in a template function).
|
|
120
|
-
*/
|
|
121
|
-
export class ContextExpr extends ExpressionBase {
|
|
122
|
-
constructor(view) {
|
|
123
|
-
super();
|
|
124
|
-
this.view = view;
|
|
125
|
-
this.kind = ExpressionKind.Context;
|
|
126
|
-
}
|
|
127
|
-
visitExpression() { }
|
|
128
|
-
isEquivalent(e) {
|
|
129
|
-
return e instanceof ContextExpr && e.view === this.view;
|
|
130
|
-
}
|
|
131
|
-
isConstant() {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
transformInternalExpressions() { }
|
|
135
|
-
clone() {
|
|
136
|
-
return new ContextExpr(this.view);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* A reference to the current view context inside a track function.
|
|
141
|
-
*/
|
|
142
|
-
export class TrackContextExpr extends ExpressionBase {
|
|
143
|
-
constructor(view) {
|
|
144
|
-
super();
|
|
145
|
-
this.view = view;
|
|
146
|
-
this.kind = ExpressionKind.TrackContext;
|
|
147
|
-
}
|
|
148
|
-
visitExpression() { }
|
|
149
|
-
isEquivalent(e) {
|
|
150
|
-
return e instanceof TrackContextExpr && e.view === this.view;
|
|
151
|
-
}
|
|
152
|
-
isConstant() {
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
transformInternalExpressions() { }
|
|
156
|
-
clone() {
|
|
157
|
-
return new TrackContextExpr(this.view);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Runtime operation to navigate to the next view context in the view hierarchy.
|
|
162
|
-
*/
|
|
163
|
-
export class NextContextExpr extends ExpressionBase {
|
|
164
|
-
constructor() {
|
|
165
|
-
super();
|
|
166
|
-
this.kind = ExpressionKind.NextContext;
|
|
167
|
-
this.steps = 1;
|
|
168
|
-
}
|
|
169
|
-
visitExpression() { }
|
|
170
|
-
isEquivalent(e) {
|
|
171
|
-
return e instanceof NextContextExpr && e.steps === this.steps;
|
|
172
|
-
}
|
|
173
|
-
isConstant() {
|
|
174
|
-
return false;
|
|
175
|
-
}
|
|
176
|
-
transformInternalExpressions() { }
|
|
177
|
-
clone() {
|
|
178
|
-
const expr = new NextContextExpr();
|
|
179
|
-
expr.steps = this.steps;
|
|
180
|
-
return expr;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Runtime operation to snapshot the current view context.
|
|
185
|
-
*
|
|
186
|
-
* The result of this operation can be stored in a variable and later used with the `RestoreView`
|
|
187
|
-
* operation.
|
|
188
|
-
*/
|
|
189
|
-
export class GetCurrentViewExpr extends ExpressionBase {
|
|
190
|
-
constructor() {
|
|
191
|
-
super();
|
|
192
|
-
this.kind = ExpressionKind.GetCurrentView;
|
|
193
|
-
}
|
|
194
|
-
visitExpression() { }
|
|
195
|
-
isEquivalent(e) {
|
|
196
|
-
return e instanceof GetCurrentViewExpr;
|
|
197
|
-
}
|
|
198
|
-
isConstant() {
|
|
199
|
-
return false;
|
|
200
|
-
}
|
|
201
|
-
transformInternalExpressions() { }
|
|
202
|
-
clone() {
|
|
203
|
-
return new GetCurrentViewExpr();
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Runtime operation to restore a snapshotted view.
|
|
208
|
-
*/
|
|
209
|
-
export class RestoreViewExpr extends ExpressionBase {
|
|
210
|
-
constructor(view) {
|
|
211
|
-
super();
|
|
212
|
-
this.view = view;
|
|
213
|
-
this.kind = ExpressionKind.RestoreView;
|
|
214
|
-
}
|
|
215
|
-
visitExpression(visitor, context) {
|
|
216
|
-
if (typeof this.view !== 'number') {
|
|
217
|
-
this.view.visitExpression(visitor, context);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
isEquivalent(e) {
|
|
221
|
-
if (!(e instanceof RestoreViewExpr) || typeof e.view !== typeof this.view) {
|
|
222
|
-
return false;
|
|
223
|
-
}
|
|
224
|
-
if (typeof this.view === 'number') {
|
|
225
|
-
return this.view === e.view;
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
return this.view.isEquivalent(e.view);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
isConstant() {
|
|
232
|
-
return false;
|
|
233
|
-
}
|
|
234
|
-
transformInternalExpressions(transform, flags) {
|
|
235
|
-
if (typeof this.view !== 'number') {
|
|
236
|
-
this.view = transformExpressionsInExpression(this.view, transform, flags);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
clone() {
|
|
240
|
-
return new RestoreViewExpr(this.view instanceof o.Expression ? this.view.clone() : this.view);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Runtime operation to reset the current view context after `RestoreView`.
|
|
245
|
-
*/
|
|
246
|
-
export class ResetViewExpr extends ExpressionBase {
|
|
247
|
-
constructor(expr) {
|
|
248
|
-
super();
|
|
249
|
-
this.expr = expr;
|
|
250
|
-
this.kind = ExpressionKind.ResetView;
|
|
251
|
-
}
|
|
252
|
-
visitExpression(visitor, context) {
|
|
253
|
-
this.expr.visitExpression(visitor, context);
|
|
254
|
-
}
|
|
255
|
-
isEquivalent(e) {
|
|
256
|
-
return e instanceof ResetViewExpr && this.expr.isEquivalent(e.expr);
|
|
257
|
-
}
|
|
258
|
-
isConstant() {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
transformInternalExpressions(transform, flags) {
|
|
262
|
-
this.expr = transformExpressionsInExpression(this.expr, transform, flags);
|
|
263
|
-
}
|
|
264
|
-
clone() {
|
|
265
|
-
return new ResetViewExpr(this.expr.clone());
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
export class TwoWayBindingSetExpr extends ExpressionBase {
|
|
269
|
-
constructor(target, value) {
|
|
270
|
-
super();
|
|
271
|
-
this.target = target;
|
|
272
|
-
this.value = value;
|
|
273
|
-
this.kind = ExpressionKind.TwoWayBindingSet;
|
|
274
|
-
}
|
|
275
|
-
visitExpression(visitor, context) {
|
|
276
|
-
this.target.visitExpression(visitor, context);
|
|
277
|
-
this.value.visitExpression(visitor, context);
|
|
278
|
-
}
|
|
279
|
-
isEquivalent(other) {
|
|
280
|
-
return this.target.isEquivalent(other.target) && this.value.isEquivalent(other.value);
|
|
281
|
-
}
|
|
282
|
-
isConstant() {
|
|
283
|
-
return false;
|
|
284
|
-
}
|
|
285
|
-
transformInternalExpressions(transform, flags) {
|
|
286
|
-
this.target = transformExpressionsInExpression(this.target, transform, flags);
|
|
287
|
-
this.value = transformExpressionsInExpression(this.value, transform, flags);
|
|
288
|
-
}
|
|
289
|
-
clone() {
|
|
290
|
-
return new TwoWayBindingSetExpr(this.target, this.value);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Read of a variable declared as an `ir.VariableOp` and referenced through its `ir.XrefId`.
|
|
295
|
-
*/
|
|
296
|
-
export class ReadVariableExpr extends ExpressionBase {
|
|
297
|
-
constructor(xref) {
|
|
298
|
-
super();
|
|
299
|
-
this.xref = xref;
|
|
300
|
-
this.kind = ExpressionKind.ReadVariable;
|
|
301
|
-
this.name = null;
|
|
302
|
-
}
|
|
303
|
-
visitExpression() { }
|
|
304
|
-
isEquivalent(other) {
|
|
305
|
-
return other instanceof ReadVariableExpr && other.xref === this.xref;
|
|
306
|
-
}
|
|
307
|
-
isConstant() {
|
|
308
|
-
return false;
|
|
309
|
-
}
|
|
310
|
-
transformInternalExpressions() { }
|
|
311
|
-
clone() {
|
|
312
|
-
const expr = new ReadVariableExpr(this.xref);
|
|
313
|
-
expr.name = this.name;
|
|
314
|
-
return expr;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
export class PureFunctionExpr extends ExpressionBase {
|
|
318
|
-
static { _c = ConsumesVarsTrait, _d = UsesVarOffset; }
|
|
319
|
-
constructor(expression, args) {
|
|
320
|
-
super();
|
|
321
|
-
this.kind = ExpressionKind.PureFunctionExpr;
|
|
322
|
-
this[_c] = true;
|
|
323
|
-
this[_d] = true;
|
|
324
|
-
this.varOffset = null;
|
|
325
|
-
/**
|
|
326
|
-
* Once extracted to the `ConstantPool`, a reference to the function which defines the computation
|
|
327
|
-
* of `body`.
|
|
328
|
-
*/
|
|
329
|
-
this.fn = null;
|
|
330
|
-
this.body = expression;
|
|
331
|
-
this.args = args;
|
|
332
|
-
}
|
|
333
|
-
visitExpression(visitor, context) {
|
|
334
|
-
this.body?.visitExpression(visitor, context);
|
|
335
|
-
for (const arg of this.args) {
|
|
336
|
-
arg.visitExpression(visitor, context);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
isEquivalent(other) {
|
|
340
|
-
if (!(other instanceof PureFunctionExpr) || other.args.length !== this.args.length) {
|
|
341
|
-
return false;
|
|
342
|
-
}
|
|
343
|
-
return (other.body !== null &&
|
|
344
|
-
this.body !== null &&
|
|
345
|
-
other.body.isEquivalent(this.body) &&
|
|
346
|
-
other.args.every((arg, idx) => arg.isEquivalent(this.args[idx])));
|
|
347
|
-
}
|
|
348
|
-
isConstant() {
|
|
349
|
-
return false;
|
|
350
|
-
}
|
|
351
|
-
transformInternalExpressions(transform, flags) {
|
|
352
|
-
if (this.body !== null) {
|
|
353
|
-
// TODO: figure out if this is the right flag to pass here.
|
|
354
|
-
this.body = transformExpressionsInExpression(this.body, transform, flags | VisitorContextFlag.InChildOperation);
|
|
355
|
-
}
|
|
356
|
-
else if (this.fn !== null) {
|
|
357
|
-
this.fn = transformExpressionsInExpression(this.fn, transform, flags);
|
|
358
|
-
}
|
|
359
|
-
for (let i = 0; i < this.args.length; i++) {
|
|
360
|
-
this.args[i] = transformExpressionsInExpression(this.args[i], transform, flags);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
clone() {
|
|
364
|
-
const expr = new PureFunctionExpr(this.body?.clone() ?? null, this.args.map((arg) => arg.clone()));
|
|
365
|
-
expr.fn = this.fn?.clone() ?? null;
|
|
366
|
-
expr.varOffset = this.varOffset;
|
|
367
|
-
return expr;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
export class PureFunctionParameterExpr extends ExpressionBase {
|
|
371
|
-
constructor(index) {
|
|
372
|
-
super();
|
|
373
|
-
this.index = index;
|
|
374
|
-
this.kind = ExpressionKind.PureFunctionParameterExpr;
|
|
375
|
-
}
|
|
376
|
-
visitExpression() { }
|
|
377
|
-
isEquivalent(other) {
|
|
378
|
-
return other instanceof PureFunctionParameterExpr && other.index === this.index;
|
|
379
|
-
}
|
|
380
|
-
isConstant() {
|
|
381
|
-
return true;
|
|
382
|
-
}
|
|
383
|
-
transformInternalExpressions() { }
|
|
384
|
-
clone() {
|
|
385
|
-
return new PureFunctionParameterExpr(this.index);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
export class PipeBindingExpr extends ExpressionBase {
|
|
389
|
-
static { _e = ConsumesVarsTrait, _f = UsesVarOffset; }
|
|
390
|
-
constructor(target, targetSlot, name, args) {
|
|
391
|
-
super();
|
|
392
|
-
this.target = target;
|
|
393
|
-
this.targetSlot = targetSlot;
|
|
394
|
-
this.name = name;
|
|
395
|
-
this.args = args;
|
|
396
|
-
this.kind = ExpressionKind.PipeBinding;
|
|
397
|
-
this[_e] = true;
|
|
398
|
-
this[_f] = true;
|
|
399
|
-
this.varOffset = null;
|
|
400
|
-
}
|
|
401
|
-
visitExpression(visitor, context) {
|
|
402
|
-
for (const arg of this.args) {
|
|
403
|
-
arg.visitExpression(visitor, context);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
isEquivalent() {
|
|
407
|
-
return false;
|
|
408
|
-
}
|
|
409
|
-
isConstant() {
|
|
410
|
-
return false;
|
|
411
|
-
}
|
|
412
|
-
transformInternalExpressions(transform, flags) {
|
|
413
|
-
for (let idx = 0; idx < this.args.length; idx++) {
|
|
414
|
-
this.args[idx] = transformExpressionsInExpression(this.args[idx], transform, flags);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
clone() {
|
|
418
|
-
const r = new PipeBindingExpr(this.target, this.targetSlot, this.name, this.args.map((a) => a.clone()));
|
|
419
|
-
r.varOffset = this.varOffset;
|
|
420
|
-
return r;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
export class PipeBindingVariadicExpr extends ExpressionBase {
|
|
424
|
-
static { _g = ConsumesVarsTrait, _h = UsesVarOffset; }
|
|
425
|
-
constructor(target, targetSlot, name, args, numArgs) {
|
|
426
|
-
super();
|
|
427
|
-
this.target = target;
|
|
428
|
-
this.targetSlot = targetSlot;
|
|
429
|
-
this.name = name;
|
|
430
|
-
this.args = args;
|
|
431
|
-
this.numArgs = numArgs;
|
|
432
|
-
this.kind = ExpressionKind.PipeBindingVariadic;
|
|
433
|
-
this[_g] = true;
|
|
434
|
-
this[_h] = true;
|
|
435
|
-
this.varOffset = null;
|
|
436
|
-
}
|
|
437
|
-
visitExpression(visitor, context) {
|
|
438
|
-
this.args.visitExpression(visitor, context);
|
|
439
|
-
}
|
|
440
|
-
isEquivalent() {
|
|
441
|
-
return false;
|
|
442
|
-
}
|
|
443
|
-
isConstant() {
|
|
444
|
-
return false;
|
|
445
|
-
}
|
|
446
|
-
transformInternalExpressions(transform, flags) {
|
|
447
|
-
this.args = transformExpressionsInExpression(this.args, transform, flags);
|
|
448
|
-
}
|
|
449
|
-
clone() {
|
|
450
|
-
const r = new PipeBindingVariadicExpr(this.target, this.targetSlot, this.name, this.args.clone(), this.numArgs);
|
|
451
|
-
r.varOffset = this.varOffset;
|
|
452
|
-
return r;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
export class SafePropertyReadExpr extends ExpressionBase {
|
|
456
|
-
constructor(receiver, name) {
|
|
457
|
-
super();
|
|
458
|
-
this.receiver = receiver;
|
|
459
|
-
this.name = name;
|
|
460
|
-
this.kind = ExpressionKind.SafePropertyRead;
|
|
461
|
-
}
|
|
462
|
-
// An alias for name, which allows other logic to handle property reads and keyed reads together.
|
|
463
|
-
get index() {
|
|
464
|
-
return this.name;
|
|
465
|
-
}
|
|
466
|
-
visitExpression(visitor, context) {
|
|
467
|
-
this.receiver.visitExpression(visitor, context);
|
|
468
|
-
}
|
|
469
|
-
isEquivalent() {
|
|
470
|
-
return false;
|
|
471
|
-
}
|
|
472
|
-
isConstant() {
|
|
473
|
-
return false;
|
|
474
|
-
}
|
|
475
|
-
transformInternalExpressions(transform, flags) {
|
|
476
|
-
this.receiver = transformExpressionsInExpression(this.receiver, transform, flags);
|
|
477
|
-
}
|
|
478
|
-
clone() {
|
|
479
|
-
return new SafePropertyReadExpr(this.receiver.clone(), this.name);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
export class SafeKeyedReadExpr extends ExpressionBase {
|
|
483
|
-
constructor(receiver, index, sourceSpan) {
|
|
484
|
-
super(sourceSpan);
|
|
485
|
-
this.receiver = receiver;
|
|
486
|
-
this.index = index;
|
|
487
|
-
this.kind = ExpressionKind.SafeKeyedRead;
|
|
488
|
-
}
|
|
489
|
-
visitExpression(visitor, context) {
|
|
490
|
-
this.receiver.visitExpression(visitor, context);
|
|
491
|
-
this.index.visitExpression(visitor, context);
|
|
492
|
-
}
|
|
493
|
-
isEquivalent() {
|
|
494
|
-
return false;
|
|
495
|
-
}
|
|
496
|
-
isConstant() {
|
|
497
|
-
return false;
|
|
498
|
-
}
|
|
499
|
-
transformInternalExpressions(transform, flags) {
|
|
500
|
-
this.receiver = transformExpressionsInExpression(this.receiver, transform, flags);
|
|
501
|
-
this.index = transformExpressionsInExpression(this.index, transform, flags);
|
|
502
|
-
}
|
|
503
|
-
clone() {
|
|
504
|
-
return new SafeKeyedReadExpr(this.receiver.clone(), this.index.clone(), this.sourceSpan);
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
export class SafeInvokeFunctionExpr extends ExpressionBase {
|
|
508
|
-
constructor(receiver, args) {
|
|
509
|
-
super();
|
|
510
|
-
this.receiver = receiver;
|
|
511
|
-
this.args = args;
|
|
512
|
-
this.kind = ExpressionKind.SafeInvokeFunction;
|
|
513
|
-
}
|
|
514
|
-
visitExpression(visitor, context) {
|
|
515
|
-
this.receiver.visitExpression(visitor, context);
|
|
516
|
-
for (const a of this.args) {
|
|
517
|
-
a.visitExpression(visitor, context);
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
isEquivalent() {
|
|
521
|
-
return false;
|
|
522
|
-
}
|
|
523
|
-
isConstant() {
|
|
524
|
-
return false;
|
|
525
|
-
}
|
|
526
|
-
transformInternalExpressions(transform, flags) {
|
|
527
|
-
this.receiver = transformExpressionsInExpression(this.receiver, transform, flags);
|
|
528
|
-
for (let i = 0; i < this.args.length; i++) {
|
|
529
|
-
this.args[i] = transformExpressionsInExpression(this.args[i], transform, flags);
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
clone() {
|
|
533
|
-
return new SafeInvokeFunctionExpr(this.receiver.clone(), this.args.map((a) => a.clone()));
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
export class SafeTernaryExpr extends ExpressionBase {
|
|
537
|
-
constructor(guard, expr) {
|
|
538
|
-
super();
|
|
539
|
-
this.guard = guard;
|
|
540
|
-
this.expr = expr;
|
|
541
|
-
this.kind = ExpressionKind.SafeTernaryExpr;
|
|
542
|
-
}
|
|
543
|
-
visitExpression(visitor, context) {
|
|
544
|
-
this.guard.visitExpression(visitor, context);
|
|
545
|
-
this.expr.visitExpression(visitor, context);
|
|
546
|
-
}
|
|
547
|
-
isEquivalent() {
|
|
548
|
-
return false;
|
|
549
|
-
}
|
|
550
|
-
isConstant() {
|
|
551
|
-
return false;
|
|
552
|
-
}
|
|
553
|
-
transformInternalExpressions(transform, flags) {
|
|
554
|
-
this.guard = transformExpressionsInExpression(this.guard, transform, flags);
|
|
555
|
-
this.expr = transformExpressionsInExpression(this.expr, transform, flags);
|
|
556
|
-
}
|
|
557
|
-
clone() {
|
|
558
|
-
return new SafeTernaryExpr(this.guard.clone(), this.expr.clone());
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
export class EmptyExpr extends ExpressionBase {
|
|
562
|
-
constructor() {
|
|
563
|
-
super(...arguments);
|
|
564
|
-
this.kind = ExpressionKind.EmptyExpr;
|
|
565
|
-
}
|
|
566
|
-
visitExpression(visitor, context) { }
|
|
567
|
-
isEquivalent(e) {
|
|
568
|
-
return e instanceof EmptyExpr;
|
|
569
|
-
}
|
|
570
|
-
isConstant() {
|
|
571
|
-
return true;
|
|
572
|
-
}
|
|
573
|
-
clone() {
|
|
574
|
-
return new EmptyExpr();
|
|
575
|
-
}
|
|
576
|
-
transformInternalExpressions() { }
|
|
577
|
-
}
|
|
578
|
-
export class AssignTemporaryExpr extends ExpressionBase {
|
|
579
|
-
constructor(expr, xref) {
|
|
580
|
-
super();
|
|
581
|
-
this.expr = expr;
|
|
582
|
-
this.xref = xref;
|
|
583
|
-
this.kind = ExpressionKind.AssignTemporaryExpr;
|
|
584
|
-
this.name = null;
|
|
585
|
-
}
|
|
586
|
-
visitExpression(visitor, context) {
|
|
587
|
-
this.expr.visitExpression(visitor, context);
|
|
588
|
-
}
|
|
589
|
-
isEquivalent() {
|
|
590
|
-
return false;
|
|
591
|
-
}
|
|
592
|
-
isConstant() {
|
|
593
|
-
return false;
|
|
594
|
-
}
|
|
595
|
-
transformInternalExpressions(transform, flags) {
|
|
596
|
-
this.expr = transformExpressionsInExpression(this.expr, transform, flags);
|
|
597
|
-
}
|
|
598
|
-
clone() {
|
|
599
|
-
const a = new AssignTemporaryExpr(this.expr.clone(), this.xref);
|
|
600
|
-
a.name = this.name;
|
|
601
|
-
return a;
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
export class ReadTemporaryExpr extends ExpressionBase {
|
|
605
|
-
constructor(xref) {
|
|
606
|
-
super();
|
|
607
|
-
this.xref = xref;
|
|
608
|
-
this.kind = ExpressionKind.ReadTemporaryExpr;
|
|
609
|
-
this.name = null;
|
|
610
|
-
}
|
|
611
|
-
visitExpression(visitor, context) { }
|
|
612
|
-
isEquivalent() {
|
|
613
|
-
return this.xref === this.xref;
|
|
614
|
-
}
|
|
615
|
-
isConstant() {
|
|
616
|
-
return false;
|
|
617
|
-
}
|
|
618
|
-
transformInternalExpressions(transform, flags) { }
|
|
619
|
-
clone() {
|
|
620
|
-
const r = new ReadTemporaryExpr(this.xref);
|
|
621
|
-
r.name = this.name;
|
|
622
|
-
return r;
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
export class SlotLiteralExpr extends ExpressionBase {
|
|
626
|
-
constructor(slot) {
|
|
627
|
-
super();
|
|
628
|
-
this.slot = slot;
|
|
629
|
-
this.kind = ExpressionKind.SlotLiteralExpr;
|
|
630
|
-
}
|
|
631
|
-
visitExpression(visitor, context) { }
|
|
632
|
-
isEquivalent(e) {
|
|
633
|
-
return e instanceof SlotLiteralExpr && e.slot === this.slot;
|
|
634
|
-
}
|
|
635
|
-
isConstant() {
|
|
636
|
-
return true;
|
|
637
|
-
}
|
|
638
|
-
clone() {
|
|
639
|
-
return new SlotLiteralExpr(this.slot);
|
|
640
|
-
}
|
|
641
|
-
transformInternalExpressions() { }
|
|
642
|
-
}
|
|
643
|
-
export class ConditionalCaseExpr extends ExpressionBase {
|
|
644
|
-
/**
|
|
645
|
-
* Create an expression for one branch of a conditional.
|
|
646
|
-
* @param expr The expression to be tested for this case. Might be null, as in an `else` case.
|
|
647
|
-
* @param target The Xref of the view to be displayed if this condition is true.
|
|
648
|
-
*/
|
|
649
|
-
constructor(expr, target, targetSlot, alias = null) {
|
|
650
|
-
super();
|
|
651
|
-
this.expr = expr;
|
|
652
|
-
this.target = target;
|
|
653
|
-
this.targetSlot = targetSlot;
|
|
654
|
-
this.alias = alias;
|
|
655
|
-
this.kind = ExpressionKind.ConditionalCase;
|
|
656
|
-
}
|
|
657
|
-
visitExpression(visitor, context) {
|
|
658
|
-
if (this.expr !== null) {
|
|
659
|
-
this.expr.visitExpression(visitor, context);
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
isEquivalent(e) {
|
|
663
|
-
return e instanceof ConditionalCaseExpr && e.expr === this.expr;
|
|
664
|
-
}
|
|
665
|
-
isConstant() {
|
|
666
|
-
return true;
|
|
667
|
-
}
|
|
668
|
-
clone() {
|
|
669
|
-
return new ConditionalCaseExpr(this.expr, this.target, this.targetSlot);
|
|
670
|
-
}
|
|
671
|
-
transformInternalExpressions(transform, flags) {
|
|
672
|
-
if (this.expr !== null) {
|
|
673
|
-
this.expr = transformExpressionsInExpression(this.expr, transform, flags);
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
export class ConstCollectedExpr extends ExpressionBase {
|
|
678
|
-
constructor(expr) {
|
|
679
|
-
super();
|
|
680
|
-
this.expr = expr;
|
|
681
|
-
this.kind = ExpressionKind.ConstCollected;
|
|
682
|
-
}
|
|
683
|
-
transformInternalExpressions(transform, flags) {
|
|
684
|
-
this.expr = transform(this.expr, flags);
|
|
685
|
-
}
|
|
686
|
-
visitExpression(visitor, context) {
|
|
687
|
-
this.expr.visitExpression(visitor, context);
|
|
688
|
-
}
|
|
689
|
-
isEquivalent(e) {
|
|
690
|
-
if (!(e instanceof ConstCollectedExpr)) {
|
|
691
|
-
return false;
|
|
692
|
-
}
|
|
693
|
-
return this.expr.isEquivalent(e.expr);
|
|
694
|
-
}
|
|
695
|
-
isConstant() {
|
|
696
|
-
return this.expr.isConstant();
|
|
697
|
-
}
|
|
698
|
-
clone() {
|
|
699
|
-
return new ConstCollectedExpr(this.expr);
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
/**
|
|
703
|
-
* Visits all `Expression`s in the AST of `op` with the `visitor` function.
|
|
704
|
-
*/
|
|
705
|
-
export function visitExpressionsInOp(op, visitor) {
|
|
706
|
-
transformExpressionsInOp(op, (expr, flags) => {
|
|
707
|
-
visitor(expr, flags);
|
|
708
|
-
return expr;
|
|
709
|
-
}, VisitorContextFlag.None);
|
|
710
|
-
}
|
|
711
|
-
export var VisitorContextFlag;
|
|
712
|
-
(function (VisitorContextFlag) {
|
|
713
|
-
VisitorContextFlag[VisitorContextFlag["None"] = 0] = "None";
|
|
714
|
-
VisitorContextFlag[VisitorContextFlag["InChildOperation"] = 1] = "InChildOperation";
|
|
715
|
-
})(VisitorContextFlag || (VisitorContextFlag = {}));
|
|
716
|
-
function transformExpressionsInInterpolation(interpolation, transform, flags) {
|
|
717
|
-
for (let i = 0; i < interpolation.expressions.length; i++) {
|
|
718
|
-
interpolation.expressions[i] = transformExpressionsInExpression(interpolation.expressions[i], transform, flags);
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
/**
|
|
722
|
-
* Transform all `Expression`s in the AST of `op` with the `transform` function.
|
|
723
|
-
*
|
|
724
|
-
* All such operations will be replaced with the result of applying `transform`, which may be an
|
|
725
|
-
* identity transformation.
|
|
726
|
-
*/
|
|
727
|
-
export function transformExpressionsInOp(op, transform, flags) {
|
|
728
|
-
switch (op.kind) {
|
|
729
|
-
case OpKind.StyleProp:
|
|
730
|
-
case OpKind.StyleMap:
|
|
731
|
-
case OpKind.ClassProp:
|
|
732
|
-
case OpKind.ClassMap:
|
|
733
|
-
case OpKind.Binding:
|
|
734
|
-
if (op.expression instanceof Interpolation) {
|
|
735
|
-
transformExpressionsInInterpolation(op.expression, transform, flags);
|
|
736
|
-
}
|
|
737
|
-
else {
|
|
738
|
-
op.expression = transformExpressionsInExpression(op.expression, transform, flags);
|
|
739
|
-
}
|
|
740
|
-
break;
|
|
741
|
-
case OpKind.Property:
|
|
742
|
-
case OpKind.HostProperty:
|
|
743
|
-
case OpKind.Attribute:
|
|
744
|
-
if (op.expression instanceof Interpolation) {
|
|
745
|
-
transformExpressionsInInterpolation(op.expression, transform, flags);
|
|
746
|
-
}
|
|
747
|
-
else {
|
|
748
|
-
op.expression = transformExpressionsInExpression(op.expression, transform, flags);
|
|
749
|
-
}
|
|
750
|
-
op.sanitizer =
|
|
751
|
-
op.sanitizer && transformExpressionsInExpression(op.sanitizer, transform, flags);
|
|
752
|
-
break;
|
|
753
|
-
case OpKind.TwoWayProperty:
|
|
754
|
-
op.expression = transformExpressionsInExpression(op.expression, transform, flags);
|
|
755
|
-
op.sanitizer =
|
|
756
|
-
op.sanitizer && transformExpressionsInExpression(op.sanitizer, transform, flags);
|
|
757
|
-
break;
|
|
758
|
-
case OpKind.I18nExpression:
|
|
759
|
-
op.expression = transformExpressionsInExpression(op.expression, transform, flags);
|
|
760
|
-
break;
|
|
761
|
-
case OpKind.InterpolateText:
|
|
762
|
-
transformExpressionsInInterpolation(op.interpolation, transform, flags);
|
|
763
|
-
break;
|
|
764
|
-
case OpKind.Statement:
|
|
765
|
-
transformExpressionsInStatement(op.statement, transform, flags);
|
|
766
|
-
break;
|
|
767
|
-
case OpKind.Variable:
|
|
768
|
-
op.initializer = transformExpressionsInExpression(op.initializer, transform, flags);
|
|
769
|
-
break;
|
|
770
|
-
case OpKind.Conditional:
|
|
771
|
-
for (const condition of op.conditions) {
|
|
772
|
-
if (condition.expr === null) {
|
|
773
|
-
// This is a default case.
|
|
774
|
-
continue;
|
|
775
|
-
}
|
|
776
|
-
condition.expr = transformExpressionsInExpression(condition.expr, transform, flags);
|
|
777
|
-
}
|
|
778
|
-
if (op.processed !== null) {
|
|
779
|
-
op.processed = transformExpressionsInExpression(op.processed, transform, flags);
|
|
780
|
-
}
|
|
781
|
-
if (op.contextValue !== null) {
|
|
782
|
-
op.contextValue = transformExpressionsInExpression(op.contextValue, transform, flags);
|
|
783
|
-
}
|
|
784
|
-
break;
|
|
785
|
-
case OpKind.Listener:
|
|
786
|
-
case OpKind.TwoWayListener:
|
|
787
|
-
for (const innerOp of op.handlerOps) {
|
|
788
|
-
transformExpressionsInOp(innerOp, transform, flags | VisitorContextFlag.InChildOperation);
|
|
789
|
-
}
|
|
790
|
-
break;
|
|
791
|
-
case OpKind.ExtractedAttribute:
|
|
792
|
-
op.expression =
|
|
793
|
-
op.expression && transformExpressionsInExpression(op.expression, transform, flags);
|
|
794
|
-
op.trustedValueFn =
|
|
795
|
-
op.trustedValueFn && transformExpressionsInExpression(op.trustedValueFn, transform, flags);
|
|
796
|
-
break;
|
|
797
|
-
case OpKind.RepeaterCreate:
|
|
798
|
-
op.track = transformExpressionsInExpression(op.track, transform, flags);
|
|
799
|
-
if (op.trackByFn !== null) {
|
|
800
|
-
op.trackByFn = transformExpressionsInExpression(op.trackByFn, transform, flags);
|
|
801
|
-
}
|
|
802
|
-
break;
|
|
803
|
-
case OpKind.Repeater:
|
|
804
|
-
op.collection = transformExpressionsInExpression(op.collection, transform, flags);
|
|
805
|
-
break;
|
|
806
|
-
case OpKind.Defer:
|
|
807
|
-
if (op.loadingConfig !== null) {
|
|
808
|
-
op.loadingConfig = transformExpressionsInExpression(op.loadingConfig, transform, flags);
|
|
809
|
-
}
|
|
810
|
-
if (op.placeholderConfig !== null) {
|
|
811
|
-
op.placeholderConfig = transformExpressionsInExpression(op.placeholderConfig, transform, flags);
|
|
812
|
-
}
|
|
813
|
-
if (op.resolverFn !== null) {
|
|
814
|
-
op.resolverFn = transformExpressionsInExpression(op.resolverFn, transform, flags);
|
|
815
|
-
}
|
|
816
|
-
break;
|
|
817
|
-
case OpKind.I18nMessage:
|
|
818
|
-
for (const [placeholder, expr] of op.params) {
|
|
819
|
-
op.params.set(placeholder, transformExpressionsInExpression(expr, transform, flags));
|
|
820
|
-
}
|
|
821
|
-
for (const [placeholder, expr] of op.postprocessingParams) {
|
|
822
|
-
op.postprocessingParams.set(placeholder, transformExpressionsInExpression(expr, transform, flags));
|
|
823
|
-
}
|
|
824
|
-
break;
|
|
825
|
-
case OpKind.DeferWhen:
|
|
826
|
-
op.expr = transformExpressionsInExpression(op.expr, transform, flags);
|
|
827
|
-
break;
|
|
828
|
-
case OpKind.StoreLet:
|
|
829
|
-
op.value = transformExpressionsInExpression(op.value, transform, flags);
|
|
830
|
-
break;
|
|
831
|
-
case OpKind.Advance:
|
|
832
|
-
case OpKind.Container:
|
|
833
|
-
case OpKind.ContainerEnd:
|
|
834
|
-
case OpKind.ContainerStart:
|
|
835
|
-
case OpKind.DeferOn:
|
|
836
|
-
case OpKind.DisableBindings:
|
|
837
|
-
case OpKind.Element:
|
|
838
|
-
case OpKind.ElementEnd:
|
|
839
|
-
case OpKind.ElementStart:
|
|
840
|
-
case OpKind.EnableBindings:
|
|
841
|
-
case OpKind.I18n:
|
|
842
|
-
case OpKind.I18nApply:
|
|
843
|
-
case OpKind.I18nContext:
|
|
844
|
-
case OpKind.I18nEnd:
|
|
845
|
-
case OpKind.I18nStart:
|
|
846
|
-
case OpKind.IcuEnd:
|
|
847
|
-
case OpKind.IcuStart:
|
|
848
|
-
case OpKind.Namespace:
|
|
849
|
-
case OpKind.Pipe:
|
|
850
|
-
case OpKind.Projection:
|
|
851
|
-
case OpKind.ProjectionDef:
|
|
852
|
-
case OpKind.Template:
|
|
853
|
-
case OpKind.Text:
|
|
854
|
-
case OpKind.I18nAttributes:
|
|
855
|
-
case OpKind.IcuPlaceholder:
|
|
856
|
-
case OpKind.DeclareLet:
|
|
857
|
-
// These operations contain no expressions.
|
|
858
|
-
break;
|
|
859
|
-
default:
|
|
860
|
-
throw new Error(`AssertionError: transformExpressionsInOp doesn't handle ${OpKind[op.kind]}`);
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
/**
|
|
864
|
-
* Transform all `Expression`s in the AST of `expr` with the `transform` function.
|
|
865
|
-
*
|
|
866
|
-
* All such operations will be replaced with the result of applying `transform`, which may be an
|
|
867
|
-
* identity transformation.
|
|
868
|
-
*/
|
|
869
|
-
export function transformExpressionsInExpression(expr, transform, flags) {
|
|
870
|
-
if (expr instanceof ExpressionBase) {
|
|
871
|
-
expr.transformInternalExpressions(transform, flags);
|
|
872
|
-
}
|
|
873
|
-
else if (expr instanceof o.BinaryOperatorExpr) {
|
|
874
|
-
expr.lhs = transformExpressionsInExpression(expr.lhs, transform, flags);
|
|
875
|
-
expr.rhs = transformExpressionsInExpression(expr.rhs, transform, flags);
|
|
876
|
-
}
|
|
877
|
-
else if (expr instanceof o.UnaryOperatorExpr) {
|
|
878
|
-
expr.expr = transformExpressionsInExpression(expr.expr, transform, flags);
|
|
879
|
-
}
|
|
880
|
-
else if (expr instanceof o.ReadPropExpr) {
|
|
881
|
-
expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
|
|
882
|
-
}
|
|
883
|
-
else if (expr instanceof o.ReadKeyExpr) {
|
|
884
|
-
expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
|
|
885
|
-
expr.index = transformExpressionsInExpression(expr.index, transform, flags);
|
|
886
|
-
}
|
|
887
|
-
else if (expr instanceof o.WritePropExpr) {
|
|
888
|
-
expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
|
|
889
|
-
expr.value = transformExpressionsInExpression(expr.value, transform, flags);
|
|
890
|
-
}
|
|
891
|
-
else if (expr instanceof o.WriteKeyExpr) {
|
|
892
|
-
expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
|
|
893
|
-
expr.index = transformExpressionsInExpression(expr.index, transform, flags);
|
|
894
|
-
expr.value = transformExpressionsInExpression(expr.value, transform, flags);
|
|
895
|
-
}
|
|
896
|
-
else if (expr instanceof o.InvokeFunctionExpr) {
|
|
897
|
-
expr.fn = transformExpressionsInExpression(expr.fn, transform, flags);
|
|
898
|
-
for (let i = 0; i < expr.args.length; i++) {
|
|
899
|
-
expr.args[i] = transformExpressionsInExpression(expr.args[i], transform, flags);
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
else if (expr instanceof o.LiteralArrayExpr) {
|
|
903
|
-
for (let i = 0; i < expr.entries.length; i++) {
|
|
904
|
-
expr.entries[i] = transformExpressionsInExpression(expr.entries[i], transform, flags);
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
else if (expr instanceof o.LiteralMapExpr) {
|
|
908
|
-
for (let i = 0; i < expr.entries.length; i++) {
|
|
909
|
-
expr.entries[i].value = transformExpressionsInExpression(expr.entries[i].value, transform, flags);
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
else if (expr instanceof o.ConditionalExpr) {
|
|
913
|
-
expr.condition = transformExpressionsInExpression(expr.condition, transform, flags);
|
|
914
|
-
expr.trueCase = transformExpressionsInExpression(expr.trueCase, transform, flags);
|
|
915
|
-
if (expr.falseCase !== null) {
|
|
916
|
-
expr.falseCase = transformExpressionsInExpression(expr.falseCase, transform, flags);
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
|
-
else if (expr instanceof o.TypeofExpr) {
|
|
920
|
-
expr.expr = transformExpressionsInExpression(expr.expr, transform, flags);
|
|
921
|
-
}
|
|
922
|
-
else if (expr instanceof o.WriteVarExpr) {
|
|
923
|
-
expr.value = transformExpressionsInExpression(expr.value, transform, flags);
|
|
924
|
-
}
|
|
925
|
-
else if (expr instanceof o.LocalizedString) {
|
|
926
|
-
for (let i = 0; i < expr.expressions.length; i++) {
|
|
927
|
-
expr.expressions[i] = transformExpressionsInExpression(expr.expressions[i], transform, flags);
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
else if (expr instanceof o.NotExpr) {
|
|
931
|
-
expr.condition = transformExpressionsInExpression(expr.condition, transform, flags);
|
|
932
|
-
}
|
|
933
|
-
else if (expr instanceof o.TaggedTemplateExpr) {
|
|
934
|
-
expr.tag = transformExpressionsInExpression(expr.tag, transform, flags);
|
|
935
|
-
expr.template.expressions = expr.template.expressions.map((e) => transformExpressionsInExpression(e, transform, flags));
|
|
936
|
-
}
|
|
937
|
-
else if (expr instanceof o.ArrowFunctionExpr) {
|
|
938
|
-
if (Array.isArray(expr.body)) {
|
|
939
|
-
for (let i = 0; i < expr.body.length; i++) {
|
|
940
|
-
transformExpressionsInStatement(expr.body[i], transform, flags);
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
else {
|
|
944
|
-
expr.body = transformExpressionsInExpression(expr.body, transform, flags);
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
else if (expr instanceof o.WrappedNodeExpr) {
|
|
948
|
-
// TODO: Do we need to transform any TS nodes nested inside of this expression?
|
|
949
|
-
}
|
|
950
|
-
else if (expr instanceof o.ReadVarExpr ||
|
|
951
|
-
expr instanceof o.ExternalExpr ||
|
|
952
|
-
expr instanceof o.LiteralExpr) {
|
|
953
|
-
// No action for these types.
|
|
954
|
-
}
|
|
955
|
-
else {
|
|
956
|
-
throw new Error(`Unhandled expression kind: ${expr.constructor.name}`);
|
|
957
|
-
}
|
|
958
|
-
return transform(expr, flags);
|
|
959
|
-
}
|
|
960
|
-
/**
|
|
961
|
-
* Transform all `Expression`s in the AST of `stmt` with the `transform` function.
|
|
962
|
-
*
|
|
963
|
-
* All such operations will be replaced with the result of applying `transform`, which may be an
|
|
964
|
-
* identity transformation.
|
|
965
|
-
*/
|
|
966
|
-
export function transformExpressionsInStatement(stmt, transform, flags) {
|
|
967
|
-
if (stmt instanceof o.ExpressionStatement) {
|
|
968
|
-
stmt.expr = transformExpressionsInExpression(stmt.expr, transform, flags);
|
|
969
|
-
}
|
|
970
|
-
else if (stmt instanceof o.ReturnStatement) {
|
|
971
|
-
stmt.value = transformExpressionsInExpression(stmt.value, transform, flags);
|
|
972
|
-
}
|
|
973
|
-
else if (stmt instanceof o.DeclareVarStmt) {
|
|
974
|
-
if (stmt.value !== undefined) {
|
|
975
|
-
stmt.value = transformExpressionsInExpression(stmt.value, transform, flags);
|
|
976
|
-
}
|
|
977
|
-
}
|
|
978
|
-
else if (stmt instanceof o.IfStmt) {
|
|
979
|
-
stmt.condition = transformExpressionsInExpression(stmt.condition, transform, flags);
|
|
980
|
-
for (const caseStatement of stmt.trueCase) {
|
|
981
|
-
transformExpressionsInStatement(caseStatement, transform, flags);
|
|
982
|
-
}
|
|
983
|
-
for (const caseStatement of stmt.falseCase) {
|
|
984
|
-
transformExpressionsInStatement(caseStatement, transform, flags);
|
|
985
|
-
}
|
|
986
|
-
}
|
|
987
|
-
else {
|
|
988
|
-
throw new Error(`Unhandled statement kind: ${stmt.constructor.name}`);
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
/**
|
|
992
|
-
* Checks whether the given expression is a string literal.
|
|
993
|
-
*/
|
|
994
|
-
export function isStringLiteral(expr) {
|
|
995
|
-
return expr instanceof o.LiteralExpr && typeof expr.value === 'string';
|
|
996
|
-
}
|
|
997
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy90ZW1wbGF0ZS9waXBlbGluZS9pci9zcmMvZXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7O0FBRUgsT0FBTyxLQUFLLENBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUluRCxPQUFPLEVBQUMsY0FBYyxFQUFFLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUkvQyxPQUFPLEVBQUMsYUFBYSxFQUFnQixNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUVwQixhQUFhLEdBRWQsTUFBTSxVQUFVLENBQUM7QUFxQ2xCOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFrQjtJQUMvQyxPQUFPLElBQUksWUFBWSxjQUFjLENBQUM7QUFDeEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixjQUFlLFNBQVEsQ0FBQyxDQUFDLFVBQVU7SUFHdkQsWUFBWSxhQUFxQyxJQUFJO1FBQ25ELEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQVVGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxjQUFjO0lBR2pELFlBQXFCLElBQVk7UUFDL0IsS0FBSyxFQUFFLENBQUM7UUFEVyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBRmYsU0FBSSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7SUFJcEQsQ0FBQztJQUVRLGVBQWUsQ0FBQyxPQUE0QixFQUFFLE9BQVksSUFBUyxDQUFDO0lBRXBFLFlBQVksQ0FBQyxLQUFzQjtRQUMxQywwRkFBMEY7UUFDMUYsZ0NBQWdDO1FBQ2hDLGdDQUFnQztRQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxD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QUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLEtBQUssR0FBRyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5RSxDQUFDO1NBQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLEtBQUssR0FBRyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5RSxDQUFDO1NBQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLEtBQUssR0FBRyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsS0FBSyxHQUFHLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlFLENBQUM7U0FBTSxJQUFJLElBQUksWUFBWSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsRUFBRSxHQUFHLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0NB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QUMsU0FBUyxFQUFFLENBQUM7WUFDM0MsK0JBQStCLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBa0I7SUFDaEQsT0FBTyxJQUFJLFlBQVksQ0FBQyxDQUFDLFdBQVcsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgbyBmcm9tICcuLi8uLi8uLi8uLi9vdXRwdXQvb3V0cHV0X2FzdCc7XG5pbXBvcnQgdHlwZSB7UGFyc2VTb3VyY2VTcGFufSBmcm9tICcuLi8uLi8uLi8uLi9wYXJzZV91dGlsJztcblxuaW1wb3J0ICogYXMgdCBmcm9tICcuLi8uLi8uLi8uLi9yZW5kZXIzL3IzX2FzdCc7XG5pbXBvcnQge0V4cHJlc3Npb25LaW5kLCBPcEtpbmR9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHtTbG90SGFuZGxlfSBmcm9tICcuL2hhbmRsZSc7XG5pbXBvcnQgdHlwZSB7WHJlZklkfSBmcm9tICcuL29wZXJhdGlvbnMnO1xuaW1wb3J0IHR5cGUge0NyZWF0ZU9wfSBmcm9tICcuL29wcy9jcmVhdGUnO1xuaW1wb3J0IHtJbnRlcnBvbGF0aW9uLCB0eXBlIFVwZGF0ZU9wfSBmcm9tICcuL29wcy91cGRhdGUnO1xuaW1wb3J0IHtcbiAgQ29uc3VtZXNWYXJzVHJhaXQsXG4gIERlcGVuZHNPblNsb3RDb250ZXh0LFxuICBEZXBlbmRzT25TbG90Q29udGV4dE9wVHJhaXQsXG4gIFVzZXNWYXJPZmZzZXQsXG4gIFVzZXNWYXJPZmZzZXRUcmFpdCxcbn0gZnJvbSAnLi90cmFpdHMnO1xuXG4vKipcbiAqIEFuIGBvLkV4cHJlc3Npb25gIHN1YnR5cGUgcmVwcmVzZW50aW5nIGEgbG9naWNhbCBleHByZXNzaW9uIGluIHRoZSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb24gPVxuICB8IExleGljYWxSZWFkRXhwclxuICB8IFJlZmVyZW5jZUV4cHJcbiAgfCBDb250ZXh0RXhwclxuICB8IE5leHRDb250ZXh0RXhwclxuICB8IEdldEN1cnJlbnRWaWV3RXhwclxuICB8IFJlc3RvcmVWaWV3RXhwclxuICB8IFJlc2V0Vmlld0V4cHJcbiAgfCBSZWFkVmFyaWFibGVFeHByXG4gIHwgUHVyZUZ1bmN0aW9uRXhwclxuICB8IFB1cmVGdW5jdGlvblBhcmFtZXRlckV4cHJcbiAgfCBQaXBlQmluZGluZ0V4cHJcbiAgfCBQaXBlQmluZGluZ1ZhcmlhZGljRXhwclxuICB8IFNhZmVQcm9wZXJ0eVJlYWRFeHByXG4gIHwgU2FmZUtleWVkUmVhZEV4cHJcbiAgfCBTYWZlSW52b2tlRnVuY3Rpb25FeHByXG4gIHwgRW1wdHlFeHByXG4gIHwgQXNzaWduVGVtcG9yYXJ5RXhwclxuICB8IFJlYWRUZW1wb3JhcnlFeHByXG4gIHwgU2xvdExpdGVyYWxFeHByXG4gIHwgQ29uZGl0aW9uYWxDYXNlRXhwclxuICB8IENvbnN0Q29sbGVjdGVkRXhwclxuICB8IFR3b1dheUJpbmRpbmdTZXRFeHByXG4gIHwgQ29udGV4dExldFJlZmVyZW5jZUV4cHJcbiAgfCBTdG9yZUxldEV4cHI7XG5cbi8qKlxuICogVHJhbnNmb3JtZXIgdHlwZSB3aGljaCBjb252ZXJ0cyBleHByZXNzaW9ucyBpbnRvIGdlbmVyYWwgYG8uRXhwcmVzc2lvbmBzICh3aGljaCBtYXkgYmUgYW5cbiAqIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uKS5cbiAqL1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvblRyYW5zZm9ybSA9IChleHByOiBvLkV4cHJlc3Npb24sIGZsYWdzOiBWaXNpdG9yQ29udGV4dEZsYWcpID0+IG8uRXhwcmVzc2lvbjtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gYG8uRXhwcmVzc2lvbmAgaXMgYSBsb2dpY2FsIElSIGV4cHJlc3Npb24gdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSXJFeHByZXNzaW9uKGV4cHI6IG8uRXhwcmVzc2lvbik6IGV4cHIgaXMgRXhwcmVzc2lvbiB7XG4gIHJldHVybiBleHByIGluc3RhbmNlb2YgRXhwcmVzc2lvbkJhc2U7XG59XG5cbi8qKlxuICogQmFzZSB0eXBlIHVzZWQgZm9yIGFsbCBsb2dpY2FsIElSIGV4cHJlc3Npb25zLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbkJhc2UgZXh0ZW5kcyBvLkV4cHJlc3Npb24ge1xuICBhYnN0cmFjdCByZWFkb25seSBraW5kOiBFeHByZXNzaW9uS2luZDtcblxuICBjb25zdHJ1Y3Rvcihzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsID0gbnVsbCkge1xuICAgIHN1cGVyKG51bGwsIHNvdXJjZVNwYW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgdHJhbnNmb3JtZXIgYWdhaW5zdCBhbnkgbmVzdGVkIGV4cHJlc3Npb25zIHdoaWNoIG1heSBiZSBwcmVzZW50IGluIHRoaXMgSVIgZXhwcmVzc2lvblxuICAgKiBzdWJ0eXBlLlxuICAgKi9cbiAgYWJzdHJhY3QgdHJhbnNmb3JtSW50ZXJuYWxFeHByZXNzaW9ucyhcbiAgICB0cmFuc2Zvcm06IEV4cHJlc3Npb25UcmFuc2Zvcm0sXG4gICAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbiAgKTogdm9pZDtcbn1cblxuLyoqXG4gKiBMb2dpY2FsIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgbGV4aWNhbCByZWFkIG9mIGEgdmFyaWFibGUgbmFtZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExleGljYWxSZWFkRXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLkxleGljYWxSZWFkO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24odmlzaXRvcjogby5FeHByZXNzaW9uVmlzaXRvciwgY29udGV4dDogYW55KTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudChvdGhlcjogTGV4aWNhbFJlYWRFeHByKTogYm9vbGVhbiB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGxleGljYWwgcmVhZHMgYXJlIGluIHRoZSBzYW1lIGNvbnRleHQsIHdoaWNoIG11c3QgYmUgdHJ1ZSBmb3IgcGFyZW50XG4gICAgLy8gZXhwcmVzc2lvbnMgdG8gYmUgZXF1aXZhbGVudC5cbiAgICAvLyBUT0RPOiBpcyB0aGlzIGdlbmVyYWxseSBzYWZlP1xuICAgIHJldHVybiB0aGlzLm5hbWUgPT09IG90aGVyLm5hbWU7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IExleGljYWxSZWFkRXhwciB7XG4gICAgcmV0dXJuIG5ldyBMZXhpY2FsUmVhZEV4cHIodGhpcy5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnRpbWUgb3BlcmF0aW9uIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIGxvY2FsIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5SZWZlcmVuY2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgdGFyZ2V0OiBYcmVmSWQsXG4gICAgcmVhZG9ubHkgdGFyZ2V0U2xvdDogU2xvdEhhbmRsZSxcbiAgICByZWFkb25seSBvZmZzZXQ6IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbigpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KGU6IG8uRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgUmVmZXJlbmNlRXhwciAmJiBlLnRhcmdldCA9PT0gdGhpcy50YXJnZXQ7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IFJlZmVyZW5jZUV4cHIge1xuICAgIHJldHVybiBuZXcgUmVmZXJlbmNlRXhwcih0aGlzLnRhcmdldCwgdGhpcy50YXJnZXRTbG90LCB0aGlzLm9mZnNldCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JlTGV0RXhwclxuICBleHRlbmRzIEV4cHJlc3Npb25CYXNlXG4gIGltcGxlbWVudHMgQ29uc3VtZXNWYXJzVHJhaXQsIERlcGVuZHNPblNsb3RDb250ZXh0T3BUcmFpdFxue1xuICBvdmVycmlkZSByZWFkb25seSBraW5kID0gRXhwcmVzc2lvbktpbmQuU3RvcmVMZXQ7XG4gIHJlYWRvbmx5IFtDb25zdW1lc1ZhcnNUcmFpdF0gPSB0cnVlO1xuICByZWFkb25seSBbRGVwZW5kc09uU2xvdENvbnRleHRdID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0YXJnZXQ6IFhyZWZJZCxcbiAgICBwdWJsaWMgdmFsdWU6IG8uRXhwcmVzc2lvbixcbiAgICBvdmVycmlkZSBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24oKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudChlOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZSBpbnN0YW5jZW9mIFN0b3JlTGV0RXhwciAmJiBlLnRhcmdldCA9PT0gdGhpcy50YXJnZXQgJiYgZS52YWx1ZS5pc0VxdWl2YWxlbnQodGhpcy52YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKFxuICAgIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgICBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24odGhpcy52YWx1ZSwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH1cblxuICBvdmVycmlkZSBjbG9uZSgpOiBTdG9yZUxldEV4cHIge1xuICAgIHJldHVybiBuZXcgU3RvcmVMZXRFeHByKHRoaXMudGFyZ2V0LCB0aGlzLnZhbHVlLCB0aGlzLnNvdXJjZVNwYW4pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0TGV0UmVmZXJlbmNlRXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLkNvbnRleHRMZXRSZWZlcmVuY2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgdGFyZ2V0OiBYcmVmSWQsXG4gICAgcmVhZG9ubHkgdGFyZ2V0U2xvdDogU2xvdEhhbmRsZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbigpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KGU6IG8uRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgQ29udGV4dExldFJlZmVyZW5jZUV4cHIgJiYgZS50YXJnZXQgPT09IHRoaXMudGFyZ2V0O1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKCk6IHZvaWQge31cblxuICBvdmVycmlkZSBjbG9uZSgpOiBDb250ZXh0TGV0UmVmZXJlbmNlRXhwciB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0TGV0UmVmZXJlbmNlRXhwcih0aGlzLnRhcmdldCwgdGhpcy50YXJnZXRTbG90KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHZpZXcgY29udGV4dCAodXN1YWxseSB0aGUgYGN0eGAgdmFyaWFibGUgaW4gYSB0ZW1wbGF0ZSBmdW5jdGlvbikuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZXh0RXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLkNvbnRleHQ7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgdmlldzogWHJlZklkKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbigpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KGU6IG8uRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgQ29udGV4dEV4cHIgJiYgZS52aWV3ID09PSB0aGlzLnZpZXc7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IENvbnRleHRFeHByIHtcbiAgICByZXR1cm4gbmV3IENvbnRleHRFeHByKHRoaXMudmlldyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB2aWV3IGNvbnRleHQgaW5zaWRlIGEgdHJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFja0NvbnRleHRFeHByIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2Uge1xuICBvdmVycmlkZSByZWFkb25seSBraW5kID0gRXhwcmVzc2lvbktpbmQuVHJhY2tDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHZpZXc6IFhyZWZJZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24oKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudChlOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFRyYWNrQ29udGV4dEV4cHIgJiYgZS52aWV3ID09PSB0aGlzLnZpZXc7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IFRyYWNrQ29udGV4dEV4cHIge1xuICAgIHJldHVybiBuZXcgVHJhY2tDb250ZXh0RXhwcih0aGlzLnZpZXcpO1xuICB9XG59XG5cbi8qKlxuICogUnVudGltZSBvcGVyYXRpb24gdG8gbmF2aWdhdGUgdG8gdGhlIG5leHQgdmlldyBjb250ZXh0IGluIHRoZSB2aWV3IGhpZXJhcmNoeS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRDb250ZXh0RXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLk5leHRDb250ZXh0O1xuXG4gIHN0ZXBzID0gMTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmlzaXRFeHByZXNzaW9uKCk6IHZvaWQge31cblxuICBvdmVycmlkZSBpc0VxdWl2YWxlbnQoZTogby5FeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBOZXh0Q29udGV4dEV4cHIgJiYgZS5zdGVwcyA9PT0gdGhpcy5zdGVwcztcbiAgfVxuXG4gIG92ZXJyaWRlIGlzQ29uc3RhbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtSW50ZXJuYWxFeHByZXNzaW9ucygpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogTmV4dENvbnRleHRFeHByIHtcbiAgICBjb25zdCBleHByID0gbmV3IE5leHRDb250ZXh0RXhwcigpO1xuICAgIGV4cHIuc3RlcHMgPSB0aGlzLnN0ZXBzO1xuICAgIHJldHVybiBleHByO1xuICB9XG59XG5cbi8qKlxuICogUnVudGltZSBvcGVyYXRpb24gdG8gc25hcHNob3QgdGhlIGN1cnJlbnQgdmlldyBjb250ZXh0LlxuICpcbiAqIFRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gY2FuIGJlIHN0b3JlZCBpbiBhIHZhcmlhYmxlIGFuZCBsYXRlciB1c2VkIHdpdGggdGhlIGBSZXN0b3JlVmlld2BcbiAqIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEdldEN1cnJlbnRWaWV3RXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLkdldEN1cnJlbnRWaWV3O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24oKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudChlOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEdldEN1cnJlbnRWaWV3RXhwcjtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzQ29uc3RhbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtSW50ZXJuYWxFeHByZXNzaW9ucygpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogR2V0Q3VycmVudFZpZXdFeHByIHtcbiAgICByZXR1cm4gbmV3IEdldEN1cnJlbnRWaWV3RXhwcigpO1xuICB9XG59XG5cbi8qKlxuICogUnVudGltZSBvcGVyYXRpb24gdG8gcmVzdG9yZSBhIHNuYXBzaG90dGVkIHZpZXcuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0b3JlVmlld0V4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5SZXN0b3JlVmlldztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlldzogWHJlZklkIHwgby5FeHByZXNzaW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMudmlldyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMudmlldy52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KGU6IG8uRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIGlmICghKGUgaW5zdGFuY2VvZiBSZXN0b3JlVmlld0V4cHIpIHx8IHR5cGVvZiBlLnZpZXcgIT09IHR5cGVvZiB0aGlzLnZpZXcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMudmlldyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpZXcgPT09IGUudmlldztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudmlldy5pc0VxdWl2YWxlbnQoZS52aWV3IGFzIG8uRXhwcmVzc2lvbik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKFxuICAgIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgICBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnLFxuICApOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMudmlldyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMudmlldyA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHRoaXMudmlldywgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogUmVzdG9yZVZpZXdFeHByIHtcbiAgICByZXR1cm4gbmV3IFJlc3RvcmVWaWV3RXhwcih0aGlzLnZpZXcgaW5zdGFuY2VvZiBvLkV4cHJlc3Npb24gPyB0aGlzLnZpZXcuY2xvbmUoKSA6IHRoaXMudmlldyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW50aW1lIG9wZXJhdGlvbiB0byByZXNldCB0aGUgY3VycmVudCB2aWV3IGNvbnRleHQgYWZ0ZXIgYFJlc3RvcmVWaWV3YC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc2V0Vmlld0V4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5SZXNldFZpZXc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGV4cHI6IG8uRXhwcmVzc2lvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24odmlzaXRvcjogby5FeHByZXNzaW9uVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICB0aGlzLmV4cHIudmlzaXRFeHByZXNzaW9uKHZpc2l0b3IsIGNvbnRleHQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KGU6IG8uRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgUmVzZXRWaWV3RXhwciAmJiB0aGlzLmV4cHIuaXNFcXVpdmFsZW50KGUuZXhwcik7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoXG4gICAgdHJhbnNmb3JtOiBFeHByZXNzaW9uVHJhbnNmb3JtLFxuICAgIGZsYWdzOiBWaXNpdG9yQ29udGV4dEZsYWcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZXhwciA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHRoaXMuZXhwciwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH1cblxuICBvdmVycmlkZSBjbG9uZSgpOiBSZXNldFZpZXdFeHByIHtcbiAgICByZXR1cm4gbmV3IFJlc2V0Vmlld0V4cHIodGhpcy5leHByLmNsb25lKCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUd29XYXlCaW5kaW5nU2V0RXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLlR3b1dheUJpbmRpbmdTZXQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRhcmdldDogby5FeHByZXNzaW9uLFxuICAgIHB1YmxpYyB2YWx1ZTogby5FeHByZXNzaW9uLFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmlzaXRFeHByZXNzaW9uKHZpc2l0b3I6IG8uRXhwcmVzc2lvblZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudGFyZ2V0LnZpc2l0RXhwcmVzc2lvbih2aXNpdG9yLCBjb250ZXh0KTtcbiAgICB0aGlzLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih2aXNpdG9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudChvdGhlcjogVHdvV2F5QmluZGluZ1NldEV4cHIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQuaXNFcXVpdmFsZW50KG90aGVyLnRhcmdldCkgJiYgdGhpcy52YWx1ZS5pc0VxdWl2YWxlbnQob3RoZXIudmFsdWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSwgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZykge1xuICAgIHRoaXMudGFyZ2V0ID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24odGhpcy50YXJnZXQsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIHRoaXMudmFsdWUgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLnZhbHVlLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IFR3b1dheUJpbmRpbmdTZXRFeHByIHtcbiAgICByZXR1cm4gbmV3IFR3b1dheUJpbmRpbmdTZXRFeHByKHRoaXMudGFyZ2V0LCB0aGlzLnZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWQgb2YgYSB2YXJpYWJsZSBkZWNsYXJlZCBhcyBhbiBgaXIuVmFyaWFibGVPcGAgYW5kIHJlZmVyZW5jZWQgdGhyb3VnaCBpdHMgYGlyLlhyZWZJZGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFkVmFyaWFibGVFeHByIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2Uge1xuICBvdmVycmlkZSByZWFkb25seSBraW5kID0gRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlO1xuICBuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgeHJlZjogWHJlZklkKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbigpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KG90aGVyOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBSZWFkVmFyaWFibGVFeHByICYmIG90aGVyLnhyZWYgPT09IHRoaXMueHJlZjtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzQ29uc3RhbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtSW50ZXJuYWxFeHByZXNzaW9ucygpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogUmVhZFZhcmlhYmxlRXhwciB7XG4gICAgY29uc3QgZXhwciA9IG5ldyBSZWFkVmFyaWFibGVFeHByKHRoaXMueHJlZik7XG4gICAgZXhwci5uYW1lID0gdGhpcy5uYW1lO1xuICAgIHJldHVybiBleHByO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJlRnVuY3Rpb25FeHByXG4gIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2VcbiAgaW1wbGVtZW50cyBDb25zdW1lc1ZhcnNUcmFpdCwgVXNlc1Zhck9mZnNldFRyYWl0XG57XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5QdXJlRnVuY3Rpb25FeHByO1xuICByZWFkb25seSBbQ29uc3VtZXNWYXJzVHJhaXRdID0gdHJ1ZTtcbiAgcmVhZG9ubHkgW1VzZXNWYXJPZmZzZXRdID0gdHJ1ZTtcblxuICB2YXJPZmZzZXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgYmUgbWVtb2l6ZWQgYXMgYSBwdXJlIGNvbXB1dGF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGV4cHJlc3Npb24gY29udGFpbnMgaW50ZXJuYWwgYFB1cmVGdW5jdGlvblBhcmFtZXRlckV4cHJgcywgd2hpY2ggYXJlIHBsYWNlaG9sZGVycyBmb3IgdGhlXG4gICAqIHBvc2l0aW9uYWwgYXJndW1lbnQgZXhwcmVzc2lvbnMgaW4gYGFyZ3MuXG4gICAqL1xuICBib2R5OiBvLkV4cHJlc3Npb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBQb3NpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgcHVyZSBmdW5jdGlvbiB3aGljaCB3aWxsIG1lbW9pemUgdGhlIGBib2R5YCBleHByZXNzaW9uLCB3aGljaCBhY3RcbiAgICogYXMgbWVtb2l6YXRpb24ga2V5cy5cbiAgICovXG4gIGFyZ3M6IG8uRXhwcmVzc2lvbltdO1xuXG4gIC8qKlxuICAgKiBPbmNlIGV4dHJhY3RlZCB0byB0aGUgYENvbnN0YW50UG9vbGAsIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiB3aGljaCBkZWZpbmVzIHRoZSBjb21wdXRhdGlvblxuICAgKiBvZiBgYm9keWAuXG4gICAqL1xuICBmbjogby5FeHByZXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogby5FeHByZXNzaW9uIHwgbnVsbCwgYXJnczogby5FeHByZXNzaW9uW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYm9keSA9IGV4cHJlc3Npb247XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpIHtcbiAgICB0aGlzLmJvZHk/LnZpc2l0RXhwcmVzc2lvbih2aXNpdG9yLCBjb250ZXh0KTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgIGFyZy52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KG90aGVyOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFB1cmVGdW5jdGlvbkV4cHIpIHx8IG90aGVyLmFyZ3MubGVuZ3RoICE9PSB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIG90aGVyLmJvZHkgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuYm9keSAhPT0gbnVsbCAmJlxuICAgICAgb3RoZXIuYm9keS5pc0VxdWl2YWxlbnQodGhpcy5ib2R5KSAmJlxuICAgICAgb3RoZXIuYXJncy5ldmVyeSgoYXJnLCBpZHgpID0+IGFyZy5pc0VxdWl2YWxlbnQodGhpcy5hcmdzW2lkeF0pKVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoXG4gICAgdHJhbnNmb3JtOiBFeHByZXNzaW9uVHJhbnNmb3JtLFxuICAgIGZsYWdzOiBWaXNpdG9yQ29udGV4dEZsYWcsXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJvZHkgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgcmlnaHQgZmxhZyB0byBwYXNzIGhlcmUuXG4gICAgICB0aGlzLmJvZHkgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihcbiAgICAgICAgdGhpcy5ib2R5LFxuICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgIGZsYWdzIHwgVmlzaXRvckNvbnRleHRGbGFnLkluQ2hpbGRPcGVyYXRpb24sXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mbiAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5mbiA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHRoaXMuZm4sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFyZ3NbaV0gPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLmFyZ3NbaV0sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IFB1cmVGdW5jdGlvbkV4cHIge1xuICAgIGNvbnN0IGV4cHIgPSBuZXcgUHVyZUZ1bmN0aW9uRXhwcihcbiAgICAgIHRoaXMuYm9keT8uY2xvbmUoKSA/PyBudWxsLFxuICAgICAgdGhpcy5hcmdzLm1hcCgoYXJnKSA9PiBhcmcuY2xvbmUoKSksXG4gICAgKTtcbiAgICBleHByLmZuID0gdGhpcy5mbj8uY2xvbmUoKSA/PyBudWxsO1xuICAgIGV4cHIudmFyT2Zmc2V0ID0gdGhpcy52YXJPZmZzZXQ7XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFB1cmVGdW5jdGlvblBhcmFtZXRlckV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5QdXJlRnVuY3Rpb25QYXJhbWV0ZXJFeHByO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbigpOiB2b2lkIHt9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KG90aGVyOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQdXJlRnVuY3Rpb25QYXJhbWV0ZXJFeHByICYmIG90aGVyLmluZGV4ID09PSB0aGlzLmluZGV4O1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IFB1cmVGdW5jdGlvblBhcmFtZXRlckV4cHIge1xuICAgIHJldHVybiBuZXcgUHVyZUZ1bmN0aW9uUGFyYW1ldGVyRXhwcih0aGlzLmluZGV4KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGlwZUJpbmRpbmdFeHByXG4gIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2VcbiAgaW1wbGVtZW50cyBDb25zdW1lc1ZhcnNUcmFpdCwgVXNlc1Zhck9mZnNldFRyYWl0XG57XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5QaXBlQmluZGluZztcbiAgcmVhZG9ubHkgW0NvbnN1bWVzVmFyc1RyYWl0XSA9IHRydWU7XG4gIHJlYWRvbmx5IFtVc2VzVmFyT2Zmc2V0XSA9IHRydWU7XG5cbiAgdmFyT2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0YXJnZXQ6IFhyZWZJZCxcbiAgICByZWFkb25seSB0YXJnZXRTbG90OiBTbG90SGFuZGxlLFxuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICByZWFkb25seSBhcmdzOiBvLkV4cHJlc3Npb25bXSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgIGFyZy52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzQ29uc3RhbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtSW50ZXJuYWxFeHByZXNzaW9ucyhcbiAgICB0cmFuc2Zvcm06IEV4cHJlc3Npb25UcmFuc2Zvcm0sXG4gICAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbiAgKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5hcmdzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIHRoaXMuYXJnc1tpZHhdID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24odGhpcy5hcmdzW2lkeF0sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCkge1xuICAgIGNvbnN0IHIgPSBuZXcgUGlwZUJpbmRpbmdFeHByKFxuICAgICAgdGhpcy50YXJnZXQsXG4gICAgICB0aGlzLnRhcmdldFNsb3QsXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICB0aGlzLmFyZ3MubWFwKChhKSA9PiBhLmNsb25lKCkpLFxuICAgICk7XG4gICAgci52YXJPZmZzZXQgPSB0aGlzLnZhck9mZnNldDtcbiAgICByZXR1cm4gcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGlwZUJpbmRpbmdWYXJpYWRpY0V4cHJcbiAgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZVxuICBpbXBsZW1lbnRzIENvbnN1bWVzVmFyc1RyYWl0LCBVc2VzVmFyT2Zmc2V0VHJhaXRcbntcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLlBpcGVCaW5kaW5nVmFyaWFkaWM7XG4gIHJlYWRvbmx5IFtDb25zdW1lc1ZhcnNUcmFpdF0gPSB0cnVlO1xuICByZWFkb25seSBbVXNlc1Zhck9mZnNldF0gPSB0cnVlO1xuXG4gIHZhck9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgdGFyZ2V0OiBYcmVmSWQsXG4gICAgcmVhZG9ubHkgdGFyZ2V0U2xvdDogU2xvdEhhbmRsZSxcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGFyZ3M6IG8uRXhwcmVzc2lvbixcbiAgICBwdWJsaWMgbnVtQXJnczogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmlzaXRFeHByZXNzaW9uKHZpc2l0b3I6IG8uRXhwcmVzc2lvblZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuYXJncy52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gIH1cblxuICBvdmVycmlkZSBpc0VxdWl2YWxlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKFxuICAgIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgICBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFyZ3MgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLmFyZ3MsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogUGlwZUJpbmRpbmdWYXJpYWRpY0V4cHIge1xuICAgIGNvbnN0IHIgPSBuZXcgUGlwZUJpbmRpbmdWYXJpYWRpY0V4cHIoXG4gICAgICB0aGlzLnRhcmdldCxcbiAgICAgIHRoaXMudGFyZ2V0U2xvdCxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMuYXJncy5jbG9uZSgpLFxuICAgICAgdGhpcy5udW1BcmdzLFxuICAgICk7XG4gICAgci52YXJPZmZzZXQgPSB0aGlzLnZhck9mZnNldDtcbiAgICByZXR1cm4gcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZVByb3BlcnR5UmVhZEV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5TYWZlUHJvcGVydHlSZWFkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWNlaXZlcjogby5FeHByZXNzaW9uLFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvLyBBbiBhbGlhcyBmb3IgbmFtZSwgd2hpY2ggYWxsb3dzIG90aGVyIGxvZ2ljIHRvIGhhbmRsZSBwcm9wZXJ0eSByZWFkcyBhbmQga2V5ZWQgcmVhZHMgdG9nZXRoZXIuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmlzaXRFeHByZXNzaW9uKHZpc2l0b3I6IG8uRXhwcmVzc2lvblZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gIH1cblxuICBvdmVycmlkZSBpc0VxdWl2YWxlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKFxuICAgIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgICBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlY2VpdmVyID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24odGhpcy5yZWNlaXZlciwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH1cblxuICBvdmVycmlkZSBjbG9uZSgpOiBTYWZlUHJvcGVydHlSZWFkRXhwciB7XG4gICAgcmV0dXJuIG5ldyBTYWZlUHJvcGVydHlSZWFkRXhwcih0aGlzLnJlY2VpdmVyLmNsb25lKCksIHRoaXMubmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhZmVLZXllZFJlYWRFeHByIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2Uge1xuICBvdmVycmlkZSByZWFkb25seSBraW5kID0gRXhwcmVzc2lvbktpbmQuU2FmZUtleWVkUmVhZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVjZWl2ZXI6IG8uRXhwcmVzc2lvbixcbiAgICBwdWJsaWMgaW5kZXg6IG8uRXhwcmVzc2lvbixcbiAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICApIHtcbiAgICBzdXBlcihzb3VyY2VTcGFuKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHRoaXMucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHZpc2l0b3IsIGNvbnRleHQpO1xuICAgIHRoaXMuaW5kZXgudmlzaXRFeHByZXNzaW9uKHZpc2l0b3IsIGNvbnRleHQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzQ29uc3RhbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtSW50ZXJuYWxFeHByZXNzaW9ucyhcbiAgICB0cmFuc2Zvcm06IEV4cHJlc3Npb25UcmFuc2Zvcm0sXG4gICAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZWNlaXZlciA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHRoaXMucmVjZWl2ZXIsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIHRoaXMuaW5kZXggPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLmluZGV4LCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IFNhZmVLZXllZFJlYWRFeHByIHtcbiAgICByZXR1cm4gbmV3IFNhZmVLZXllZFJlYWRFeHByKHRoaXMucmVjZWl2ZXIuY2xvbmUoKSwgdGhpcy5pbmRleC5jbG9uZSgpLCB0aGlzLnNvdXJjZVNwYW4pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTYWZlSW52b2tlRnVuY3Rpb25FeHByIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2Uge1xuICBvdmVycmlkZSByZWFkb25seSBraW5kID0gRXhwcmVzc2lvbktpbmQuU2FmZUludm9rZUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWNlaXZlcjogby5FeHByZXNzaW9uLFxuICAgIHB1YmxpYyBhcmdzOiBvLkV4cHJlc3Npb25bXSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHRoaXMucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHZpc2l0b3IsIGNvbnRleHQpO1xuICAgIGZvciAoY29uc3QgYSBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgIGEudmlzaXRFeHByZXNzaW9uKHZpc2l0b3IsIGNvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoXG4gICAgdHJhbnNmb3JtOiBFeHByZXNzaW9uVHJhbnNmb3JtLFxuICAgIGZsYWdzOiBWaXNpdG9yQ29udGV4dEZsYWcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVjZWl2ZXIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLnJlY2VpdmVyLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hcmdzW2ldID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24odGhpcy5hcmdzW2ldLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjbG9uZSgpOiBTYWZlSW52b2tlRnVuY3Rpb25FeHByIHtcbiAgICByZXR1cm4gbmV3IFNhZmVJbnZva2VGdW5jdGlvbkV4cHIoXG4gICAgICB0aGlzLnJlY2VpdmVyLmNsb25lKCksXG4gICAgICB0aGlzLmFyZ3MubWFwKChhKSA9PiBhLmNsb25lKCkpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhZmVUZXJuYXJ5RXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLlNhZmVUZXJuYXJ5RXhwcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZ3VhcmQ6IG8uRXhwcmVzc2lvbixcbiAgICBwdWJsaWMgZXhwcjogby5FeHByZXNzaW9uLFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdmlzaXRFeHByZXNzaW9uKHZpc2l0b3I6IG8uRXhwcmVzc2lvblZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5ndWFyZC52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gICAgdGhpcy5leHByLnZpc2l0RXhwcmVzc2lvbih2aXNpdG9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoXG4gICAgdHJhbnNmb3JtOiBFeHByZXNzaW9uVHJhbnNmb3JtLFxuICAgIGZsYWdzOiBWaXNpdG9yQ29udGV4dEZsYWcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZ3VhcmQgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLmd1YXJkLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICB0aGlzLmV4cHIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLmV4cHIsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogU2FmZVRlcm5hcnlFeHByIHtcbiAgICByZXR1cm4gbmV3IFNhZmVUZXJuYXJ5RXhwcih0aGlzLmd1YXJkLmNsb25lKCksIHRoaXMuZXhwci5jbG9uZSgpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW1wdHlFeHByIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2Uge1xuICBvdmVycmlkZSByZWFkb25seSBraW5kID0gRXhwcmVzc2lvbktpbmQuRW1wdHlFeHByO1xuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge31cblxuICBvdmVycmlkZSBpc0VxdWl2YWxlbnQoZTogRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgRW1wdHlFeHByO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IEVtcHR5RXhwciB7XG4gICAgcmV0dXJuIG5ldyBFbXB0eUV4cHIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnMoKTogdm9pZCB7fVxufVxuXG5leHBvcnQgY2xhc3MgQXNzaWduVGVtcG9yYXJ5RXhwciBleHRlbmRzIEV4cHJlc3Npb25CYXNlIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkga2luZCA9IEV4cHJlc3Npb25LaW5kLkFzc2lnblRlbXBvcmFyeUV4cHI7XG5cbiAgcHVibGljIG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBleHByOiBvLkV4cHJlc3Npb24sXG4gICAgcHVibGljIHhyZWY6IFhyZWZJZCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHRoaXMuZXhwci52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gIH1cblxuICBvdmVycmlkZSBpc0VxdWl2YWxlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKFxuICAgIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgICBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmV4cHIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLmV4cHIsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogQXNzaWduVGVtcG9yYXJ5RXhwciB7XG4gICAgY29uc3QgYSA9IG5ldyBBc3NpZ25UZW1wb3JhcnlFeHByKHRoaXMuZXhwci5jbG9uZSgpLCB0aGlzLnhyZWYpO1xuICAgIGEubmFtZSA9IHRoaXMubmFtZTtcbiAgICByZXR1cm4gYTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVhZFRlbXBvcmFyeUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5SZWFkVGVtcG9yYXJ5RXhwcjtcblxuICBwdWJsaWMgbmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHhyZWY6IFhyZWZJZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24odmlzaXRvcjogby5FeHByZXNzaW9uVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHt9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnhyZWYgPT09IHRoaXMueHJlZjtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzQ29uc3RhbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtSW50ZXJuYWxFeHByZXNzaW9ucyhcbiAgICB0cmFuc2Zvcm06IEV4cHJlc3Npb25UcmFuc2Zvcm0sXG4gICAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbiAgKTogdm9pZCB7fVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IFJlYWRUZW1wb3JhcnlFeHByIHtcbiAgICBjb25zdCByID0gbmV3IFJlYWRUZW1wb3JhcnlFeHByKHRoaXMueHJlZik7XG4gICAgci5uYW1lID0gdGhpcy5uYW1lO1xuICAgIHJldHVybiByO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTbG90TGl0ZXJhbEV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5TbG90TGl0ZXJhbEV4cHI7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgc2xvdDogU2xvdEhhbmRsZSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24odmlzaXRvcjogby5FeHByZXNzaW9uVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHt9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KGU6IEV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFNsb3RMaXRlcmFsRXhwciAmJiBlLnNsb3QgPT09IHRoaXMuc2xvdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzQ29uc3RhbnQoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvdmVycmlkZSBjbG9uZSgpOiBTbG90TGl0ZXJhbEV4cHIge1xuICAgIHJldHVybiBuZXcgU2xvdExpdGVyYWxFeHByKHRoaXMuc2xvdCk7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKCk6IHZvaWQge31cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQ2FzZUV4cHIgZXh0ZW5kcyBFeHByZXNzaW9uQmFzZSB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGtpbmQgPSBFeHByZXNzaW9uS2luZC5Db25kaXRpb25hbENhc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleHByZXNzaW9uIGZvciBvbmUgYnJhbmNoIG9mIGEgY29uZGl0aW9uYWwuXG4gICAqIEBwYXJhbSBleHByIFRoZSBleHByZXNzaW9uIHRvIGJlIHRlc3RlZCBmb3IgdGhpcyBjYXNlLiBNaWdodCBiZSBudWxsLCBhcyBpbiBhbiBgZWxzZWAgY2FzZS5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgWHJlZiBvZiB0aGUgdmlldyB0byBiZSBkaXNwbGF5ZWQgaWYgdGhpcyBjb25kaXRpb24gaXMgdHJ1ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBleHByOiBvLkV4cHJlc3Npb24gfCBudWxsLFxuICAgIHJlYWRvbmx5IHRhcmdldDogWHJlZklkLFxuICAgIHJlYWRvbmx5IHRhcmdldFNsb3Q6IFNsb3RIYW5kbGUsXG4gICAgcmVhZG9ubHkgYWxpYXM6IHQuVmFyaWFibGUgfCBudWxsID0gbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZpc2l0RXhwcmVzc2lvbih2aXNpdG9yOiBvLkV4cHJlc3Npb25WaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmV4cHIgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZXhwci52aXNpdEV4cHJlc3Npb24odmlzaXRvciwgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgaXNFcXVpdmFsZW50KGU6IEV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZSBpbnN0YW5jZW9mIENvbmRpdGlvbmFsQ2FzZUV4cHIgJiYgZS5leHByID09PSB0aGlzLmV4cHI7XG4gIH1cblxuICBvdmVycmlkZSBpc0NvbnN0YW50KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogQ29uZGl0aW9uYWxDYXNlRXhwciB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbENhc2VFeHByKHRoaXMuZXhwciwgdGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0U2xvdCk7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKFxuICAgIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgICBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnLFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leHByICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmV4cHIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbih0aGlzLmV4cHIsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uc3RDb2xsZWN0ZWRFeHByIGV4dGVuZHMgRXhwcmVzc2lvbkJhc2Uge1xuICBvdmVycmlkZSByZWFkb25seSBraW5kID0gRXhwcmVzc2lvbktpbmQuQ29uc3RDb2xsZWN0ZWQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGV4cHI6IG8uRXhwcmVzc2lvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1JbnRlcm5hbEV4cHJlc3Npb25zKFxuICAgIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgICBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmV4cHIgPSB0cmFuc2Zvcm0odGhpcy5leHByLCBmbGFncyk7XG4gIH1cblxuICBvdmVycmlkZSB2aXNpdEV4cHJlc3Npb24odmlzaXRvcjogby5FeHByZXNzaW9uVmlzaXRvciwgY29udGV4dDogYW55KSB7XG4gICAgdGhpcy5leHByLnZpc2l0RXhwcmVzc2lvbih2aXNpdG9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGlzRXF1aXZhbGVudChlOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgICBpZiAoIShlIGluc3RhbmNlb2YgQ29uc3RDb2xsZWN0ZWRFeHByKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leHByLmlzRXF1aXZhbGVudChlLmV4cHIpO1xuICB9XG5cbiAgb3ZlcnJpZGUgaXNDb25zdGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHByLmlzQ29uc3RhbnQoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IENvbnN0Q29sbGVjdGVkRXhwciB7XG4gICAgcmV0dXJuIG5ldyBDb25zdENvbGxlY3RlZEV4cHIodGhpcy5leHByKTtcbiAgfVxufVxuXG4vKipcbiAqIFZpc2l0cyBhbGwgYEV4cHJlc3Npb25gcyBpbiB0aGUgQVNUIG9mIGBvcGAgd2l0aCB0aGUgYHZpc2l0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRFeHByZXNzaW9uc0luT3AoXG4gIG9wOiBDcmVhdGVPcCB8IFVwZGF0ZU9wLFxuICB2aXNpdG9yOiAoZXhwcjogby5FeHByZXNzaW9uLCBmbGFnczogVmlzaXRvckNvbnRleHRGbGFnKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIHRyYW5zZm9ybUV4cHJlc3Npb25zSW5PcChcbiAgICBvcCxcbiAgICAoZXhwciwgZmxhZ3MpID0+IHtcbiAgICAgIHZpc2l0b3IoZXhwciwgZmxhZ3MpO1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfSxcbiAgICBWaXNpdG9yQ29udGV4dEZsYWcuTm9uZSxcbiAgKTtcbn1cblxuZXhwb3J0IGVudW0gVmlzaXRvckNvbnRleHRGbGFnIHtcbiAgTm9uZSA9IDBiMDAwMCxcbiAgSW5DaGlsZE9wZXJhdGlvbiA9IDBiMDAwMSxcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkludGVycG9sYXRpb24oXG4gIGludGVycG9sYXRpb246IEludGVycG9sYXRpb24sXG4gIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbikge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVycG9sYXRpb24uZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpbnRlcnBvbGF0aW9uLmV4cHJlc3Npb25zW2ldID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oXG4gICAgICBpbnRlcnBvbGF0aW9uLmV4cHJlc3Npb25zW2ldLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgZmxhZ3MsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbGwgYEV4cHJlc3Npb25gcyBpbiB0aGUgQVNUIG9mIGBvcGAgd2l0aCB0aGUgYHRyYW5zZm9ybWAgZnVuY3Rpb24uXG4gKlxuICogQWxsIHN1Y2ggb3BlcmF0aW9ucyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlc3VsdCBvZiBhcHBseWluZyBgdHJhbnNmb3JtYCwgd2hpY2ggbWF5IGJlIGFuXG4gKiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybUV4cHJlc3Npb25zSW5PcChcbiAgb3A6IENyZWF0ZU9wIHwgVXBkYXRlT3AsXG4gIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbik6IHZvaWQge1xuICBzd2l0Y2ggKG9wLmtpbmQpIHtcbiAgICBjYXNlIE9wS2luZC5TdHlsZVByb3A6XG4gICAgY2FzZSBPcEtpbmQuU3R5bGVNYXA6XG4gICAgY2FzZSBPcEtpbmQuQ2xhc3NQcm9wOlxuICAgIGNhc2UgT3BLaW5kLkNsYXNzTWFwOlxuICAgIGNhc2UgT3BLaW5kLkJpbmRpbmc6XG4gICAgICBpZiAob3AuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEludGVycG9sYXRpb24pIHtcbiAgICAgICAgdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkludGVycG9sYXRpb24ob3AuZXhwcmVzc2lvbiwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcC5leHByZXNzaW9uID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AuZXhwcmVzc2lvbiwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIE9wS2luZC5Qcm9wZXJ0eTpcbiAgICBjYXNlIE9wS2luZC5Ib3N0UHJvcGVydHk6XG4gICAgY2FzZSBPcEtpbmQuQXR0cmlidXRlOlxuICAgICAgaWYgKG9wLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBJbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgIHRyYW5zZm9ybUV4cHJlc3Npb25zSW5JbnRlcnBvbGF0aW9uKG9wLmV4cHJlc3Npb24sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3AuZXhwcmVzc2lvbiA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKG9wLmV4cHJlc3Npb24sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgICAgfVxuICAgICAgb3Auc2FuaXRpemVyID1cbiAgICAgICAgb3Auc2FuaXRpemVyICYmIHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKG9wLnNhbml0aXplciwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE9wS2luZC5Ud29XYXlQcm9wZXJ0eTpcbiAgICAgIG9wLmV4cHJlc3Npb24gPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihvcC5leHByZXNzaW9uLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIG9wLnNhbml0aXplciA9XG4gICAgICAgIG9wLnNhbml0aXplciAmJiB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihvcC5zYW5pdGl6ZXIsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBPcEtpbmQuSTE4bkV4cHJlc3Npb246XG4gICAgICBvcC5leHByZXNzaW9uID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AuZXhwcmVzc2lvbiwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE9wS2luZC5JbnRlcnBvbGF0ZVRleHQ6XG4gICAgICB0cmFuc2Zvcm1FeHByZXNzaW9uc0luSW50ZXJwb2xhdGlvbihvcC5pbnRlcnBvbGF0aW9uLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgT3BLaW5kLlN0YXRlbWVudDpcbiAgICAgIHRyYW5zZm9ybUV4cHJlc3Npb25zSW5TdGF0ZW1lbnQob3Auc3RhdGVtZW50LCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgT3BLaW5kLlZhcmlhYmxlOlxuICAgICAgb3AuaW5pdGlhbGl6ZXIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihvcC5pbml0aWFsaXplciwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE9wS2luZC5Db25kaXRpb25hbDpcbiAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIG9wLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbi5leHByID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGRlZmF1bHQgY2FzZS5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25kaXRpb24uZXhwciA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGNvbmRpdGlvbi5leHByLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcC5wcm9jZXNzZWQgIT09IG51bGwpIHtcbiAgICAgICAgb3AucHJvY2Vzc2VkID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AucHJvY2Vzc2VkLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcC5jb250ZXh0VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgb3AuY29udGV4dFZhbHVlID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AuY29udGV4dFZhbHVlLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgT3BLaW5kLkxpc3RlbmVyOlxuICAgIGNhc2UgT3BLaW5kLlR3b1dheUxpc3RlbmVyOlxuICAgICAgZm9yIChjb25zdCBpbm5lck9wIG9mIG9wLmhhbmRsZXJPcHMpIHtcbiAgICAgICAgdHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKGlubmVyT3AsIHRyYW5zZm9ybSwgZmxhZ3MgfCBWaXNpdG9yQ29udGV4dEZsYWcuSW5DaGlsZE9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIE9wS2luZC5FeHRyYWN0ZWRBdHRyaWJ1dGU6XG4gICAgICBvcC5leHByZXNzaW9uID1cbiAgICAgICAgb3AuZXhwcmVzc2lvbiAmJiB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihvcC5leHByZXNzaW9uLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIG9wLnRydXN0ZWRWYWx1ZUZuID1cbiAgICAgICAgb3AudHJ1c3RlZFZhbHVlRm4gJiYgdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AudHJ1c3RlZFZhbHVlRm4sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBPcEtpbmQuUmVwZWF0ZXJDcmVhdGU6XG4gICAgICBvcC50cmFjayA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKG9wLnRyYWNrLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIGlmIChvcC50cmFja0J5Rm4gIT09IG51bGwpIHtcbiAgICAgICAgb3AudHJhY2tCeUZuID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AudHJhY2tCeUZuLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgT3BLaW5kLlJlcGVhdGVyOlxuICAgICAgb3AuY29sbGVjdGlvbiA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKG9wLmNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBPcEtpbmQuRGVmZXI6XG4gICAgICBpZiAob3AubG9hZGluZ0NvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICBvcC5sb2FkaW5nQ29uZmlnID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AubG9hZGluZ0NvbmZpZywgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICB9XG4gICAgICBpZiAob3AucGxhY2Vob2xkZXJDb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgb3AucGxhY2Vob2xkZXJDb25maWcgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihcbiAgICAgICAgICBvcC5wbGFjZWhvbGRlckNvbmZpZyxcbiAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgZmxhZ3MsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAob3AucmVzb2x2ZXJGbiAhPT0gbnVsbCkge1xuICAgICAgICBvcC5yZXNvbHZlckZuID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AucmVzb2x2ZXJGbiwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIE9wS2luZC5JMThuTWVzc2FnZTpcbiAgICAgIGZvciAoY29uc3QgW3BsYWNlaG9sZGVyLCBleHByXSBvZiBvcC5wYXJhbXMpIHtcbiAgICAgICAgb3AucGFyYW1zLnNldChwbGFjZWhvbGRlciwgdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oZXhwciwgdHJhbnNmb3JtLCBmbGFncykpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbcGxhY2Vob2xkZXIsIGV4cHJdIG9mIG9wLnBvc3Rwcm9jZXNzaW5nUGFyYW1zKSB7XG4gICAgICAgIG9wLnBvc3Rwcm9jZXNzaW5nUGFyYW1zLnNldChcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLCB0cmFuc2Zvcm0sIGZsYWdzKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgT3BLaW5kLkRlZmVyV2hlbjpcbiAgICAgIG9wLmV4cHIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihvcC5leHByLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgT3BLaW5kLlN0b3JlTGV0OlxuICAgICAgb3AudmFsdWUgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihvcC52YWx1ZSwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE9wS2luZC5BZHZhbmNlOlxuICAgIGNhc2UgT3BLaW5kLkNvbnRhaW5lcjpcbiAgICBjYXNlIE9wS2luZC5Db250YWluZXJFbmQ6XG4gICAgY2FzZSBPcEtpbmQuQ29udGFpbmVyU3RhcnQ6XG4gICAgY2FzZSBPcEtpbmQuRGVmZXJPbjpcbiAgICBjYXNlIE9wS2luZC5EaXNhYmxlQmluZGluZ3M6XG4gICAgY2FzZSBPcEtpbmQuRWxlbWVudDpcbiAgICBjYXNlIE9wS2luZC5FbGVtZW50RW5kOlxuICAgIGNhc2UgT3BLaW5kLkVsZW1lbnRTdGFydDpcbiAgICBjYXNlIE9wS2luZC5FbmFibGVCaW5kaW5nczpcbiAgICBjYXNlIE9wS2luZC5JMThuOlxuICAgIGNhc2UgT3BLaW5kLkkxOG5BcHBseTpcbiAgICBjYXNlIE9wS2luZC5JMThuQ29udGV4dDpcbiAgICBjYXNlIE9wS2luZC5JMThuRW5kOlxuICAgIGNhc2UgT3BLaW5kLkkxOG5TdGFydDpcbiAgICBjYXNlIE9wS2luZC5JY3VFbmQ6XG4gICAgY2FzZSBPcEtpbmQuSWN1U3RhcnQ6XG4gICAgY2FzZSBPcEtpbmQuTmFtZXNwYWNlOlxuICAgIGNhc2UgT3BLaW5kLlBpcGU6XG4gICAgY2FzZSBPcEtpbmQuUHJvamVjdGlvbjpcbiAgICBjYXNlIE9wS2luZC5Qcm9qZWN0aW9uRGVmOlxuICAgIGNhc2UgT3BLaW5kLlRlbXBsYXRlOlxuICAgIGNhc2UgT3BLaW5kLlRleHQ6XG4gICAgY2FzZSBPcEtpbmQuSTE4bkF0dHJpYnV0ZXM6XG4gICAgY2FzZSBPcEtpbmQuSWN1UGxhY2Vob2xkZXI6XG4gICAgY2FzZSBPcEtpbmQuRGVjbGFyZUxldDpcbiAgICAgIC8vIFRoZXNlIG9wZXJhdGlvbnMgY29udGFpbiBubyBleHByZXNzaW9ucy5cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2VydGlvbkVycm9yOiB0cmFuc2Zvcm1FeHByZXNzaW9uc0luT3AgZG9lc24ndCBoYW5kbGUgJHtPcEtpbmRbb3Aua2luZF19YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYWxsIGBFeHByZXNzaW9uYHMgaW4gdGhlIEFTVCBvZiBgZXhwcmAgd2l0aCB0aGUgYHRyYW5zZm9ybWAgZnVuY3Rpb24uXG4gKlxuICogQWxsIHN1Y2ggb3BlcmF0aW9ucyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlc3VsdCBvZiBhcHBseWluZyBgdHJhbnNmb3JtYCwgd2hpY2ggbWF5IGJlIGFuXG4gKiBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKFxuICBleHByOiBvLkV4cHJlc3Npb24sXG4gIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbik6IG8uRXhwcmVzc2lvbiB7XG4gIGlmIChleHByIGluc3RhbmNlb2YgRXhwcmVzc2lvbkJhc2UpIHtcbiAgICBleHByLnRyYW5zZm9ybUludGVybmFsRXhwcmVzc2lvbnModHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uQmluYXJ5T3BlcmF0b3JFeHByKSB7XG4gICAgZXhwci5saHMgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLmxocywgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgZXhwci5yaHMgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLnJocywgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uVW5hcnlPcGVyYXRvckV4cHIpIHtcbiAgICBleHByLmV4cHIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLmV4cHIsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBvLlJlYWRQcm9wRXhwcikge1xuICAgIGV4cHIucmVjZWl2ZXIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLnJlY2VpdmVyLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2Ygby5SZWFkS2V5RXhwcikge1xuICAgIGV4cHIucmVjZWl2ZXIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLnJlY2VpdmVyLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICBleHByLmluZGV4ID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oZXhwci5pbmRleCwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uV3JpdGVQcm9wRXhwcikge1xuICAgIGV4cHIucmVjZWl2ZXIgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLnJlY2VpdmVyLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICBleHByLnZhbHVlID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oZXhwci52YWx1ZSwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uV3JpdGVLZXlFeHByKSB7XG4gICAgZXhwci5yZWNlaXZlciA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIucmVjZWl2ZXIsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIGV4cHIuaW5kZXggPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLmluZGV4LCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICBleHByLnZhbHVlID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oZXhwci52YWx1ZSwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uSW52b2tlRnVuY3Rpb25FeHByKSB7XG4gICAgZXhwci5mbiA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIuZm4sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5hcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHByLmFyZ3NbaV0gPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLmFyZ3NbaV0sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2Ygby5MaXRlcmFsQXJyYXlFeHByKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByLmVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cHIuZW50cmllc1tpXSA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIuZW50cmllc1tpXSwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBvLkxpdGVyYWxNYXBFeHByKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByLmVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cHIuZW50cmllc1tpXS52YWx1ZSA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKFxuICAgICAgICBleHByLmVudHJpZXNbaV0udmFsdWUsXG4gICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgZmxhZ3MsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2Ygby5Db25kaXRpb25hbEV4cHIpIHtcbiAgICBleHByLmNvbmRpdGlvbiA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIuY29uZGl0aW9uLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICBleHByLnRydWVDYXNlID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oZXhwci50cnVlQ2FzZSwgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgaWYgKGV4cHIuZmFsc2VDYXNlICE9PSBudWxsKSB7XG4gICAgICBleHByLmZhbHNlQ2FzZSA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIuZmFsc2VDYXNlLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uVHlwZW9mRXhwcikge1xuICAgIGV4cHIuZXhwciA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIuZXhwciwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uV3JpdGVWYXJFeHByKSB7XG4gICAgZXhwci52YWx1ZSA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIudmFsdWUsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBvLkxvY2FsaXplZFN0cmluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwci5leHByZXNzaW9uc1tpXSA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbnNbaV0sIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2Ygby5Ob3RFeHByKSB7XG4gICAgZXhwci5jb25kaXRpb24gPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLmNvbmRpdGlvbiwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uVGFnZ2VkVGVtcGxhdGVFeHByKSB7XG4gICAgZXhwci50YWcgPSB0cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihleHByLnRhZywgdHJhbnNmb3JtLCBmbGFncyk7XG4gICAgZXhwci50ZW1wbGF0ZS5leHByZXNzaW9ucyA9IGV4cHIudGVtcGxhdGUuZXhwcmVzc2lvbnMubWFwKChlKSA9PlxuICAgICAgdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oZSwgdHJhbnNmb3JtLCBmbGFncyksXG4gICAgKTtcbiAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2Ygby5BcnJvd0Z1bmN0aW9uRXhwcikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHIuYm9keSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5ib2R5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyYW5zZm9ybUV4cHJlc3Npb25zSW5TdGF0ZW1lbnQoZXhwci5ib2R5W2ldLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZXhwci5ib2R5ID0gdHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24oZXhwci5ib2R5LCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIG8uV3JhcHBlZE5vZGVFeHByKSB7XG4gICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byB0cmFuc2Zvcm0gYW55IFRTIG5vZGVzIG5lc3RlZCBpbnNpZGUgb2YgdGhpcyBleHByZXNzaW9uP1xuICB9IGVsc2UgaWYgKFxuICAgIGV4cHIgaW5zdGFuY2VvZiBvLlJlYWRWYXJFeHByIHx8XG4gICAgZXhwciBpbnN0YW5jZW9mIG8uRXh0ZXJuYWxFeHByIHx8XG4gICAgZXhwciBpbnN0YW5jZW9mIG8uTGl0ZXJhbEV4cHJcbiAgKSB7XG4gICAgLy8gTm8gYWN0aW9uIGZvciB0aGVzZSB0eXBlcy5cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBleHByZXNzaW9uIGtpbmQ6ICR7ZXhwci5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICB9XG4gIHJldHVybiB0cmFuc2Zvcm0oZXhwciwgZmxhZ3MpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbGwgYEV4cHJlc3Npb25gcyBpbiB0aGUgQVNUIG9mIGBzdG10YCB3aXRoIHRoZSBgdHJhbnNmb3JtYCBmdW5jdGlvbi5cbiAqXG4gKiBBbGwgc3VjaCBvcGVyYXRpb25zIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGB0cmFuc2Zvcm1gLCB3aGljaCBtYXkgYmUgYW5cbiAqIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtRXhwcmVzc2lvbnNJblN0YXRlbWVudChcbiAgc3RtdDogby5TdGF0ZW1lbnQsXG4gIHRyYW5zZm9ybTogRXhwcmVzc2lvblRyYW5zZm9ybSxcbiAgZmxhZ3M6IFZpc2l0b3JDb250ZXh0RmxhZyxcbik6IHZvaWQge1xuICBpZiAoc3RtdCBpbnN0YW5jZW9mIG8uRXhwcmVzc2lvblN0YXRlbWVudCkge1xuICAgIHN0bXQuZXhwciA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHN0bXQuZXhwciwgdHJhbnNmb3JtLCBmbGFncyk7XG4gIH0gZWxzZSBpZiAoc3RtdCBpbnN0YW5jZW9mIG8uUmV0dXJuU3RhdGVtZW50KSB7XG4gICAgc3RtdC52YWx1ZSA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHN0bXQudmFsdWUsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICB9IGVsc2UgaWYgKHN0bXQgaW5zdGFuY2VvZiBvLkRlY2xhcmVWYXJTdG10KSB7XG4gICAgaWYgKHN0bXQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RtdC52YWx1ZSA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHN0bXQudmFsdWUsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzdG10IGluc3RhbmNlb2Ygby5JZlN0bXQpIHtcbiAgICBzdG10LmNvbmRpdGlvbiA9IHRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKHN0bXQuY29uZGl0aW9uLCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICBmb3IgKGNvbnN0IGNhc2VTdGF0ZW1lbnQgb2Ygc3RtdC50cnVlQ2FzZSkge1xuICAgICAgdHJhbnNmb3JtRXhwcmVzc2lvbnNJblN0YXRlbWVudChjYXNlU3RhdGVtZW50LCB0cmFuc2Zvcm0sIGZsYWdzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYXNlU3RhdGVtZW50IG9mIHN0bXQuZmFsc2VDYXNlKSB7XG4gICAgICB0cmFuc2Zvcm1FeHByZXNzaW9uc0luU3RhdGVtZW50KGNhc2VTdGF0ZW1lbnQsIHRyYW5zZm9ybSwgZmxhZ3MpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBzdGF0ZW1lbnQga2luZDogJHtzdG10LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBhIHN0cmluZyBsaXRlcmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdMaXRlcmFsKGV4cHI6IG8uRXhwcmVzc2lvbik6IGV4cHIgaXMgby5MaXRlcmFsRXhwciAmIHt2YWx1ZTogc3RyaW5nfSB7XG4gIHJldHVybiBleHByIGluc3RhbmNlb2Ygby5MaXRlcmFsRXhwciAmJiB0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG4iXX0=
|