@angular/compiler 19.0.0-next.1 → 19.0.0-next.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/fesm2022/compiler.mjs +5465 -4675
  3. package/fesm2022/compiler.mjs.map +1 -1
  4. package/index.d.ts +115 -15
  5. package/package.json +2 -4
  6. package/esm2022/compiler.mjs +0 -13
  7. package/esm2022/index.mjs +0 -13
  8. package/esm2022/public_api.mjs +0 -15
  9. package/esm2022/src/assertions.mjs +0 -31
  10. package/esm2022/src/chars.mjs +0 -90
  11. package/esm2022/src/compiler.mjs +0 -88
  12. package/esm2022/src/compiler_facade_interface.mjs +0 -29
  13. package/esm2022/src/config.mjs +0 -20
  14. package/esm2022/src/constant_pool.mjs +0 -285
  15. package/esm2022/src/core.mjs +0 -96
  16. package/esm2022/src/expression_parser/ast.mjs +0 -755
  17. package/esm2022/src/expression_parser/lexer.mjs +0 -421
  18. package/esm2022/src/expression_parser/parser.mjs +0 -1222
  19. package/esm2022/src/i18n/digest.mjs +0 -322
  20. package/esm2022/src/i18n/extractor_merger.mjs +0 -409
  21. package/esm2022/src/i18n/i18n_ast.mjs +0 -212
  22. package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
  23. package/esm2022/src/i18n/i18n_parser.mjs +0 -247
  24. package/esm2022/src/i18n/index.mjs +0 -16
  25. package/esm2022/src/i18n/message_bundle.mjs +0 -93
  26. package/esm2022/src/i18n/parse_util.mjs +0 -17
  27. package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
  28. package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
  29. package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
  30. package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
  31. package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
  32. package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
  33. package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
  34. package/esm2022/src/i18n/translation_bundle.mjs +0 -164
  35. package/esm2022/src/injectable_compiler_2.mjs +0 -138
  36. package/esm2022/src/jit_compiler_facade.mjs +0 -681
  37. package/esm2022/src/ml_parser/ast.mjs +0 -167
  38. package/esm2022/src/ml_parser/defaults.mjs +0 -24
  39. package/esm2022/src/ml_parser/entities.mjs +0 -2144
  40. package/esm2022/src/ml_parser/html_parser.mjs +0 -18
  41. package/esm2022/src/ml_parser/html_tags.mjs +0 -156
  42. package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
  43. package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
  44. package/esm2022/src/ml_parser/lexer.mjs +0 -1210
  45. package/esm2022/src/ml_parser/parser.mjs +0 -539
  46. package/esm2022/src/ml_parser/tags.mjs +0 -47
  47. package/esm2022/src/ml_parser/tokens.mjs +0 -9
  48. package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
  49. package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
  50. package/esm2022/src/output/abstract_emitter.mjs +0 -524
  51. package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
  52. package/esm2022/src/output/map_util.mjs +0 -19
  53. package/esm2022/src/output/output_ast.mjs +0 -1301
  54. package/esm2022/src/output/output_jit.mjs +0 -138
  55. package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
  56. package/esm2022/src/output/source_map.mjs +0 -150
  57. package/esm2022/src/parse_util.mjs +0 -198
  58. package/esm2022/src/render3/partial/api.mjs +0 -9
  59. package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
  60. package/esm2022/src/render3/partial/component.mjs +0 -197
  61. package/esm2022/src/render3/partial/directive.mjs +0 -264
  62. package/esm2022/src/render3/partial/factory.mjs +0 -35
  63. package/esm2022/src/render3/partial/injectable.mjs +0 -67
  64. package/esm2022/src/render3/partial/injector.mjs +0 -41
  65. package/esm2022/src/render3/partial/ng_module.mjs +0 -63
  66. package/esm2022/src/render3/partial/pipe.mjs +0 -50
  67. package/esm2022/src/render3/partial/util.mjs +0 -79
  68. package/esm2022/src/render3/r3_ast.mjs +0 -493
  69. package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
  70. package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
  71. package/esm2022/src/render3/r3_control_flow.mjs +0 -421
  72. package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
  73. package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
  74. package/esm2022/src/render3/r3_factory.mjs +0 -200
  75. package/esm2022/src/render3/r3_identifiers.mjs +0 -480
  76. package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
  77. package/esm2022/src/render3/r3_jit.mjs +0 -29
  78. package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
  79. package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
  80. package/esm2022/src/render3/r3_template_transform.mjs +0 -560
  81. package/esm2022/src/render3/util.mjs +0 -90
  82. package/esm2022/src/render3/view/api.mjs +0 -14
  83. package/esm2022/src/render3/view/compiler.mjs +0 -546
  84. package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
  85. package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
  86. package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
  87. package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
  88. package/esm2022/src/render3/view/i18n/util.mjs +0 -70
  89. package/esm2022/src/render3/view/query_generation.mjs +0 -182
  90. package/esm2022/src/render3/view/t2_api.mjs +0 -9
  91. package/esm2022/src/render3/view/t2_binder.mjs +0 -823
  92. package/esm2022/src/render3/view/template.mjs +0 -113
  93. package/esm2022/src/render3/view/util.mjs +0 -192
  94. package/esm2022/src/resource_loader.mjs +0 -17
  95. package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
  96. package/esm2022/src/schema/dom_security_schema.mjs +0 -96
  97. package/esm2022/src/schema/element_schema_registry.mjs +0 -10
  98. package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
  99. package/esm2022/src/selector.mjs +0 -400
  100. package/esm2022/src/shadow_css.mjs +0 -1053
  101. package/esm2022/src/style_url_resolver.mjs +0 -17
  102. package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
  103. package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
  104. package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
  105. package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
  106. package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
  107. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
  108. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
  109. package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
  110. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
  111. package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
  112. package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
  113. package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
  114. package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
  115. package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
  116. package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
  117. package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
  118. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
  119. package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
  120. package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
  121. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
  122. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
  123. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
  124. package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
  125. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
  126. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
  127. package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
  128. package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
  129. package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
  130. package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
  131. package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
  132. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
  133. package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
  134. package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
  135. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
  136. package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
  137. package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
  138. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
  139. package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
  140. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
  141. package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
  142. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
  143. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
  144. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
  145. package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
  146. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
  147. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
  148. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
  149. package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
  150. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
  151. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
  152. package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
  153. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
  154. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
  155. package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
  156. package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
  157. package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
  158. package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
  159. package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
  160. package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
  161. package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
  162. package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
  163. package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
  164. package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
  165. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
  166. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
  167. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
  168. package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
  169. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
  170. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
  171. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
  172. package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
  173. package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
  174. package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
  175. package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
  176. package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
  177. package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
  178. package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
  179. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
  180. package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
  181. package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
  182. package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
  183. package/esm2022/src/template_parser/binding_parser.mjs +0 -465
  184. package/esm2022/src/template_parser/template_preparser.mjs +0 -84
  185. package/esm2022/src/util.mjs +0 -124
  186. package/esm2022/src/version.mjs +0 -15
@@ -1,113 +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
- import * as ir from '../../ir';
9
- /**
10
- * Some `defer` conditions can reference other elements in the template, using their local reference
11
- * names. However, the semantics are quite different from the normal local reference system: in
12
- * particular, we need to look at local reference names in enclosing views. This phase resolves
13
- * all such references to actual xrefs.
14
- */
15
- export function resolveDeferTargetNames(job) {
16
- const scopes = new Map();
17
- function getScopeForView(view) {
18
- if (scopes.has(view.xref)) {
19
- return scopes.get(view.xref);
20
- }
21
- const scope = new Scope();
22
- for (const op of view.create) {
23
- // add everything that can be referenced.
24
- if (!ir.isElementOrContainerOp(op) || op.localRefs === null) {
25
- continue;
26
- }
27
- if (!Array.isArray(op.localRefs)) {
28
- throw new Error('LocalRefs were already processed, but were needed to resolve defer targets.');
29
- }
30
- for (const ref of op.localRefs) {
31
- if (ref.target !== '') {
32
- continue;
33
- }
34
- scope.targets.set(ref.name, { xref: op.xref, slot: op.handle });
35
- }
36
- }
37
- scopes.set(view.xref, scope);
38
- return scope;
39
- }
40
- function resolveTrigger(deferOwnerView, op, placeholderView) {
41
- switch (op.trigger.kind) {
42
- case ir.DeferTriggerKind.Idle:
43
- case ir.DeferTriggerKind.Immediate:
44
- case ir.DeferTriggerKind.Timer:
45
- return;
46
- case ir.DeferTriggerKind.Hover:
47
- case ir.DeferTriggerKind.Interaction:
48
- case ir.DeferTriggerKind.Viewport:
49
- if (op.trigger.targetName === null) {
50
- // A `null` target name indicates we should default to the first element in the
51
- // placeholder block.
52
- if (placeholderView === null) {
53
- throw new Error('defer on trigger with no target name must have a placeholder block');
54
- }
55
- const placeholder = job.views.get(placeholderView);
56
- if (placeholder == undefined) {
57
- throw new Error('AssertionError: could not find placeholder view for defer on trigger');
58
- }
59
- for (const placeholderOp of placeholder.create) {
60
- if (ir.hasConsumesSlotTrait(placeholderOp) &&
61
- (ir.isElementOrContainerOp(placeholderOp) ||
62
- placeholderOp.kind === ir.OpKind.Projection)) {
63
- op.trigger.targetXref = placeholderOp.xref;
64
- op.trigger.targetView = placeholderView;
65
- op.trigger.targetSlotViewSteps = -1;
66
- op.trigger.targetSlot = placeholderOp.handle;
67
- return;
68
- }
69
- }
70
- return;
71
- }
72
- let view = placeholderView !== null ? job.views.get(placeholderView) : deferOwnerView;
73
- let step = placeholderView !== null ? -1 : 0;
74
- while (view !== null) {
75
- const scope = getScopeForView(view);
76
- if (scope.targets.has(op.trigger.targetName)) {
77
- const { xref, slot } = scope.targets.get(op.trigger.targetName);
78
- op.trigger.targetXref = xref;
79
- op.trigger.targetView = view.xref;
80
- op.trigger.targetSlotViewSteps = step;
81
- op.trigger.targetSlot = slot;
82
- return;
83
- }
84
- view = view.parent !== null ? job.views.get(view.parent) : null;
85
- step++;
86
- }
87
- break;
88
- default:
89
- throw new Error(`Trigger kind ${op.trigger.kind} not handled`);
90
- }
91
- }
92
- // Find the defer ops, and assign the data about their targets.
93
- for (const unit of job.units) {
94
- const defers = new Map();
95
- for (const op of unit.create) {
96
- switch (op.kind) {
97
- case ir.OpKind.Defer:
98
- defers.set(op.xref, op);
99
- break;
100
- case ir.OpKind.DeferOn:
101
- const deferOp = defers.get(op.defer);
102
- resolveTrigger(unit, op, deferOp.placeholderView);
103
- break;
104
- }
105
- }
106
- }
107
- }
108
- class Scope {
109
- constructor() {
110
- this.targets = new Map();
111
- }
112
- }
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXJfcmVzb2x2ZV90YXJnZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvZGVmZXJfcmVzb2x2ZV90YXJnZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEdBQTRCO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBRTNDLFNBQVMsZUFBZSxDQUFDLElBQXlCO1FBQ2hELElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBRSxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLHlDQUF5QztZQUN6QyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzVELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkVBQTZFLENBQzlFLENBQUM7WUFDSixDQUFDO1lBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQy9CLElBQUksR0FB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RSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDeEIsTUFBTTtnQkFDUixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztvQkFDcEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFFLENBQUM7b0JBQ3RDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDbEQsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLEtBQUs7SUFBWDtRQUNFLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0QsQ0FBQztJQUN0RSxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHR5cGUge0NvbXBvbmVudENvbXBpbGF0aW9uSm9iLCBWaWV3Q29tcGlsYXRpb25Vbml0fSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogU29tZSBgZGVmZXJgIGNvbmRpdGlvbnMgY2FuIHJlZmVyZW5jZSBvdGhlciBlbGVtZW50cyBpbiB0aGUgdGVtcGxhdGUsIHVzaW5nIHRoZWlyIGxvY2FsIHJlZmVyZW5jZVxuICogbmFtZXMuIEhvd2V2ZXIsIHRoZSBzZW1hbnRpY3MgYXJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwgbG9jYWwgcmVmZXJlbmNlIHN5c3RlbTogaW5cbiAqIHBhcnRpY3VsYXIsIHdlIG5lZWQgdG8gbG9vayBhdCBsb2NhbCByZWZlcmVuY2UgbmFtZXMgaW4gZW5jbG9zaW5nIHZpZXdzLiBUaGlzIHBoYXNlIHJlc29sdmVzXG4gKiBhbGwgc3VjaCByZWZlcmVuY2VzIHRvIGFjdHVhbCB4cmVmcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZWZlclRhcmdldE5hbWVzKGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgY29uc3Qgc2NvcGVzID0gbmV3IE1hcDxpci5YcmVmSWQsIFNjb3BlPigpO1xuXG4gIGZ1bmN0aW9uIGdldFNjb3BlRm9yVmlldyh2aWV3OiBWaWV3Q29tcGlsYXRpb25Vbml0KTogU2NvcGUge1xuICAgIGlmIChzY29wZXMuaGFzKHZpZXcueHJlZikpIHtcbiAgICAgIHJldHVybiBzY29wZXMuZ2V0KHZpZXcueHJlZikhO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKCk7XG4gICAgZm9yIChjb25zdCBvcCBvZiB2aWV3LmNyZWF0ZSkge1xuICAgICAgLy8gYWRkIGV2ZXJ5dGhpbmcgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZC5cbiAgICAgIGlmICghaXIuaXNFbGVtZW50T3JDb250YWluZXJPcChvcCkgfHwgb3AubG9jYWxSZWZzID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wLmxvY2FsUmVmcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdMb2NhbFJlZnMgd2VyZSBhbHJlYWR5IHByb2Nlc3NlZCwgYnV0IHdlcmUgbmVlZGVkIHRvIHJlc29sdmUgZGVmZXIgdGFyZ2V0cy4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlZiBvZiBvcC5sb2NhbFJlZnMpIHtcbiAgICAgICAgaWYgKHJlZi50YXJnZXQgIT09ICcnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUudGFyZ2V0cy5zZXQocmVmLm5hbWUsIHt4cmVmOiBvcC54cmVmLCBzbG90OiBvcC5oYW5kbGV9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY29wZXMuc2V0KHZpZXcueHJlZiwgc2NvcGUpO1xuICAgIHJldHVybiBzY29wZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVUcmlnZ2VyKFxuICAgIGRlZmVyT3duZXJWaWV3OiBWaWV3Q29tcGlsYXRpb25Vbml0LFxuICAgIG9wOiBpci5EZWZlck9uT3AsXG4gICAgcGxhY2Vob2xkZXJWaWV3OiBpci5YcmVmSWQgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG9wLnRyaWdnZXIua2luZCkge1xuICAgICAgY2FzZSBpci5EZWZlclRyaWdnZXJLaW5kLklkbGU6XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuSW1tZWRpYXRlOlxuICAgICAgY2FzZSBpci5EZWZlclRyaWdnZXJLaW5kLlRpbWVyOlxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuSG92ZXI6XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuSW50ZXJhY3Rpb246XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuVmlld3BvcnQ6XG4gICAgICAgIGlmIChvcC50cmlnZ2VyLnRhcmdldE5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBIGBudWxsYCB0YXJnZXQgbmFtZSBpbmRpY2F0ZXMgd2Ugc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlXG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIgYmxvY2suXG4gICAgICAgICAgaWYgKHBsYWNlaG9sZGVyVmlldyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZWZlciBvbiB0cmlnZ2VyIHdpdGggbm8gdGFyZ2V0IG5hbWUgbXVzdCBoYXZlIGEgcGxhY2Vob2xkZXIgYmxvY2snKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBqb2Iudmlld3MuZ2V0KHBsYWNlaG9sZGVyVmlldyk7XG4gICAgICAgICAgaWYgKHBsYWNlaG9sZGVyID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NlcnRpb25FcnJvcjogY291bGQgbm90IGZpbmQgcGxhY2Vob2xkZXIgdmlldyBmb3IgZGVmZXIgb24gdHJpZ2dlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlaG9sZGVyT3Agb2YgcGxhY2Vob2xkZXIuY3JlYXRlKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlyLmhhc0NvbnN1bWVzU2xvdFRyYWl0KHBsYWNlaG9sZGVyT3ApICYmXG4gICAgICAgICAgICAgIChpci5pc0VsZW1lbnRPckNvbnRhaW5lck9wKHBsYWNlaG9sZGVyT3ApIHx8XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJPcC5raW5kID09PSBpci5PcEtpbmQuUHJvamVjdGlvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBvcC50cmlnZ2VyLnRhcmdldFhyZWYgPSBwbGFjZWhvbGRlck9wLnhyZWY7XG4gICAgICAgICAgICAgIG9wLnRyaWdnZXIudGFyZ2V0VmlldyA9IHBsYWNlaG9sZGVyVmlldztcbiAgICAgICAgICAgICAgb3AudHJpZ2dlci50YXJnZXRTbG90Vmlld1N0ZXBzID0gLTE7XG4gICAgICAgICAgICAgIG9wLnRyaWdnZXIudGFyZ2V0U2xvdCA9IHBsYWNlaG9sZGVyT3AuaGFuZGxlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlldzogVmlld0NvbXBpbGF0aW9uVW5pdCB8IG51bGwgPVxuICAgICAgICAgIHBsYWNlaG9sZGVyVmlldyAhPT0gbnVsbCA/IGpvYi52aWV3cy5nZXQocGxhY2Vob2xkZXJWaWV3KSEgOiBkZWZlck93bmVyVmlldztcbiAgICAgICAgbGV0IHN0ZXAgPSBwbGFjZWhvbGRlclZpZXcgIT09IG51bGwgPyAtMSA6IDA7XG5cbiAgICAgICAgd2hpbGUgKHZpZXcgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBzY29wZSA9IGdldFNjb3BlRm9yVmlldyh2aWV3KTtcbiAgICAgICAgICBpZiAoc2NvcGUudGFyZ2V0cy5oYXMob3AudHJpZ2dlci50YXJnZXROYW1lKSkge1xuICAgICAgICAgICAgY29uc3Qge3hyZWYsIHNsb3R9ID0gc2NvcGUudGFyZ2V0cy5nZXQob3AudHJpZ2dlci50YXJnZXROYW1lKSE7XG5cbiAgICAgICAgICAgIG9wLnRyaWdnZXIudGFyZ2V0WHJlZiA9IHhyZWY7XG4gICAgICAgICAgICBvcC50cmlnZ2VyLnRhcmdldFZpZXcgPSB2aWV3LnhyZWY7XG4gICAgICAgICAgICBvcC50cmlnZ2VyLnRhcmdldFNsb3RWaWV3U3RlcHMgPSBzdGVwO1xuICAgICAgICAgICAgb3AudHJpZ2dlci50YXJnZXRTbG90ID0gc2xvdDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2aWV3ID0gdmlldy5wYXJlbnQgIT09IG51bGwgPyBqb2Iudmlld3MuZ2V0KHZpZXcucGFyZW50KSEgOiBudWxsO1xuICAgICAgICAgIHN0ZXArKztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZ2dlciBraW5kICR7KG9wLnRyaWdnZXIgYXMgYW55KS5raW5kfSBub3QgaGFuZGxlZGApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGRlZmVyIG9wcywgYW5kIGFzc2lnbiB0aGUgZGF0YSBhYm91dCB0aGVpciB0YXJnZXRzLlxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgY29uc3QgZGVmZXJzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLkRlZmVyT3A+KCk7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgc3dpdGNoIChvcC5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkRlZmVyOlxuICAgICAgICAgIGRlZmVycy5zZXQob3AueHJlZiwgb3ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5EZWZlck9uOlxuICAgICAgICAgIGNvbnN0IGRlZmVyT3AgPSBkZWZlcnMuZ2V0KG9wLmRlZmVyKSE7XG4gICAgICAgICAgcmVzb2x2ZVRyaWdnZXIodW5pdCwgb3AsIGRlZmVyT3AucGxhY2Vob2xkZXJWaWV3KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU2NvcGUge1xuICB0YXJnZXRzID0gbmV3IE1hcDxzdHJpbmcsIHt4cmVmOiBpci5YcmVmSWQ7IHNsb3Q6IGlyLlNsb3RIYW5kbGV9PigpO1xufVxuIl19
@@ -1,47 +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
- import * as ir from '../../ir';
9
- const REPLACEMENTS = new Map([
10
- [ir.OpKind.ElementEnd, [ir.OpKind.ElementStart, ir.OpKind.Element]],
11
- [ir.OpKind.ContainerEnd, [ir.OpKind.ContainerStart, ir.OpKind.Container]],
12
- [ir.OpKind.I18nEnd, [ir.OpKind.I18nStart, ir.OpKind.I18n]],
13
- ]);
14
- /**
15
- * Op kinds that should not prevent merging of start/end ops.
16
- */
17
- const IGNORED_OP_KINDS = new Set([ir.OpKind.Pipe]);
18
- /**
19
- * Replace sequences of mergable instructions (e.g. `ElementStart` and `ElementEnd`) with a
20
- * consolidated instruction (e.g. `Element`).
21
- */
22
- export function collapseEmptyInstructions(job) {
23
- for (const unit of job.units) {
24
- for (const op of unit.create) {
25
- // Find end ops that may be able to be merged.
26
- const opReplacements = REPLACEMENTS.get(op.kind);
27
- if (opReplacements === undefined) {
28
- continue;
29
- }
30
- const [startKind, mergedKind] = opReplacements;
31
- // Locate the previous (non-ignored) op.
32
- let prevOp = op.prev;
33
- while (prevOp !== null && IGNORED_OP_KINDS.has(prevOp.kind)) {
34
- prevOp = prevOp.prev;
35
- }
36
- // If the previous op is the corresponding start op, we can megre.
37
- if (prevOp !== null && prevOp.kind === startKind) {
38
- // Transmute the start instruction to the merged version. This is safe as they're designed
39
- // to be identical apart from the `kind`.
40
- prevOp.kind = mergedKind;
41
- // Remove the end instruction.
42
- ir.OpList.remove(op);
43
- }
44
- }
45
- }
46
- }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHlfZWxlbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9lbXB0eV9lbGVtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBb0M7SUFDOUQsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDM0QsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxHQUFtQjtJQUMzRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3Qiw4Q0FBOEM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakQsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxjQUFjLENBQUM7WUFFL0Msd0NBQXdDO1lBQ3hDLElBQUksTUFBTSxHQUF1QixFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3pDLE9BQU8sTUFBTSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzVELE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxrRUFBa0U7WUFDbEUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pELDBGQUEwRjtnQkFDMUYseUNBQXlDO2dCQUN4QyxNQUE2QixDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7Z0JBRWpELDhCQUE4QjtnQkFDOUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7WUFDcEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQgdHlwZSB7Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuY29uc3QgUkVQTEFDRU1FTlRTID0gbmV3IE1hcDxpci5PcEtpbmQsIFtpci5PcEtpbmQsIGlyLk9wS2luZF0+KFtcbiAgW2lyLk9wS2luZC5FbGVtZW50RW5kLCBbaXIuT3BLaW5kLkVsZW1lbnRTdGFydCwgaXIuT3BLaW5kLkVsZW1lbnRdXSxcbiAgW2lyLk9wS2luZC5Db250YWluZXJFbmQsIFtpci5PcEtpbmQuQ29udGFpbmVyU3RhcnQsIGlyLk9wS2luZC5Db250YWluZXJdXSxcbiAgW2lyLk9wS2luZC5JMThuRW5kLCBbaXIuT3BLaW5kLkkxOG5TdGFydCwgaXIuT3BLaW5kLkkxOG5dXSxcbl0pO1xuXG4vKipcbiAqIE9wIGtpbmRzIHRoYXQgc2hvdWxkIG5vdCBwcmV2ZW50IG1lcmdpbmcgb2Ygc3RhcnQvZW5kIG9wcy5cbiAqL1xuY29uc3QgSUdOT1JFRF9PUF9LSU5EUyA9IG5ldyBTZXQoW2lyLk9wS2luZC5QaXBlXSk7XG5cbi8qKlxuICogUmVwbGFjZSBzZXF1ZW5jZXMgb2YgbWVyZ2FibGUgaW5zdHJ1Y3Rpb25zIChlLmcuIGBFbGVtZW50U3RhcnRgIGFuZCBgRWxlbWVudEVuZGApIHdpdGggYVxuICogY29uc29saWRhdGVkIGluc3RydWN0aW9uIChlLmcuIGBFbGVtZW50YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZUVtcHR5SW5zdHJ1Y3Rpb25zKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIC8vIEZpbmQgZW5kIG9wcyB0aGF0IG1heSBiZSBhYmxlIHRvIGJlIG1lcmdlZC5cbiAgICAgIGNvbnN0IG9wUmVwbGFjZW1lbnRzID0gUkVQTEFDRU1FTlRTLmdldChvcC5raW5kKTtcbiAgICAgIGlmIChvcFJlcGxhY2VtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgW3N0YXJ0S2luZCwgbWVyZ2VkS2luZF0gPSBvcFJlcGxhY2VtZW50cztcblxuICAgICAgLy8gTG9jYXRlIHRoZSBwcmV2aW91cyAobm9uLWlnbm9yZWQpIG9wLlxuICAgICAgbGV0IHByZXZPcDogaXIuQ3JlYXRlT3AgfCBudWxsID0gb3AucHJldjtcbiAgICAgIHdoaWxlIChwcmV2T3AgIT09IG51bGwgJiYgSUdOT1JFRF9PUF9LSU5EUy5oYXMocHJldk9wLmtpbmQpKSB7XG4gICAgICAgIHByZXZPcCA9IHByZXZPcC5wcmV2O1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcHJldmlvdXMgb3AgaXMgdGhlIGNvcnJlc3BvbmRpbmcgc3RhcnQgb3AsIHdlIGNhbiBtZWdyZS5cbiAgICAgIGlmIChwcmV2T3AgIT09IG51bGwgJiYgcHJldk9wLmtpbmQgPT09IHN0YXJ0S2luZCkge1xuICAgICAgICAvLyBUcmFuc211dGUgdGhlIHN0YXJ0IGluc3RydWN0aW9uIHRvIHRoZSBtZXJnZWQgdmVyc2lvbi4gVGhpcyBpcyBzYWZlIGFzIHRoZXkncmUgZGVzaWduZWRcbiAgICAgICAgLy8gdG8gYmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIGBraW5kYC5cbiAgICAgICAgKHByZXZPcCBhcyBpci5PcDxpci5DcmVhdGVPcD4pLmtpbmQgPSBtZXJnZWRLaW5kO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZW5kIGluc3RydWN0aW9uLlxuICAgICAgICBpci5PcExpc3QucmVtb3ZlPGlyLkNyZWF0ZU9wPihvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,192 +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
- import * as o from '../../../../output/output_ast';
9
- import * as ir from '../../ir';
10
- /**
11
- * Safe read expressions such as `a?.b` have different semantics in Angular templates as
12
- * compared to JavaScript. In particular, they default to `null` instead of `undefined`. This phase
13
- * finds all unresolved safe read expressions, and converts them into the appropriate output AST
14
- * reads, guarded by null checks. We generate temporaries as needed, to avoid re-evaluating the same
15
- * sub-expression multiple times.
16
- */
17
- export function expandSafeReads(job) {
18
- for (const unit of job.units) {
19
- for (const op of unit.ops()) {
20
- ir.transformExpressionsInOp(op, (e) => safeTransform(e, { job }), ir.VisitorContextFlag.None);
21
- ir.transformExpressionsInOp(op, ternaryTransform, ir.VisitorContextFlag.None);
22
- }
23
- }
24
- }
25
- // A lookup set of all the expression kinds that require a temporary variable to be generated.
26
- const requiresTemporary = [
27
- o.InvokeFunctionExpr,
28
- o.LiteralArrayExpr,
29
- o.LiteralMapExpr,
30
- ir.SafeInvokeFunctionExpr,
31
- ir.PipeBindingExpr,
32
- ].map((e) => e.constructor.name);
33
- function needsTemporaryInSafeAccess(e) {
34
- // TODO: We probably want to use an expression visitor to recursively visit all descendents.
35
- // However, that would potentially do a lot of extra work (because it cannot short circuit), so we
36
- // implement the logic ourselves for now.
37
- if (e instanceof o.UnaryOperatorExpr) {
38
- return needsTemporaryInSafeAccess(e.expr);
39
- }
40
- else if (e instanceof o.BinaryOperatorExpr) {
41
- return needsTemporaryInSafeAccess(e.lhs) || needsTemporaryInSafeAccess(e.rhs);
42
- }
43
- else if (e instanceof o.ConditionalExpr) {
44
- if (e.falseCase && needsTemporaryInSafeAccess(e.falseCase))
45
- return true;
46
- return needsTemporaryInSafeAccess(e.condition) || needsTemporaryInSafeAccess(e.trueCase);
47
- }
48
- else if (e instanceof o.NotExpr) {
49
- return needsTemporaryInSafeAccess(e.condition);
50
- }
51
- else if (e instanceof ir.AssignTemporaryExpr) {
52
- return needsTemporaryInSafeAccess(e.expr);
53
- }
54
- else if (e instanceof o.ReadPropExpr) {
55
- return needsTemporaryInSafeAccess(e.receiver);
56
- }
57
- else if (e instanceof o.ReadKeyExpr) {
58
- return needsTemporaryInSafeAccess(e.receiver) || needsTemporaryInSafeAccess(e.index);
59
- }
60
- // TODO: Switch to a method which is exhaustive of newly added expression subtypes.
61
- return (e instanceof o.InvokeFunctionExpr ||
62
- e instanceof o.LiteralArrayExpr ||
63
- e instanceof o.LiteralMapExpr ||
64
- e instanceof ir.SafeInvokeFunctionExpr ||
65
- e instanceof ir.PipeBindingExpr);
66
- }
67
- function temporariesIn(e) {
68
- const temporaries = new Set();
69
- // TODO: Although it's not currently supported by the transform helper, we should be able to
70
- // short-circuit exploring the tree to do less work. In particular, we don't have to penetrate
71
- // into the subexpressions of temporary assignments.
72
- ir.transformExpressionsInExpression(e, (e) => {
73
- if (e instanceof ir.AssignTemporaryExpr) {
74
- temporaries.add(e.xref);
75
- }
76
- return e;
77
- }, ir.VisitorContextFlag.None);
78
- return temporaries;
79
- }
80
- function eliminateTemporaryAssignments(e, tmps, ctx) {
81
- // TODO: We can be more efficient than the transform helper here. We don't need to visit any
82
- // descendents of temporary assignments.
83
- ir.transformExpressionsInExpression(e, (e) => {
84
- if (e instanceof ir.AssignTemporaryExpr && tmps.has(e.xref)) {
85
- const read = new ir.ReadTemporaryExpr(e.xref);
86
- // `TemplateDefinitionBuilder` has the (accidental?) behavior of generating assignments of
87
- // temporary variables to themselves. This happens because some subexpression that the
88
- // temporary refers to, possibly through nested temporaries, has a function call. We copy that
89
- // behavior here.
90
- return ctx.job.compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder
91
- ? new ir.AssignTemporaryExpr(read, read.xref)
92
- : read;
93
- }
94
- return e;
95
- }, ir.VisitorContextFlag.None);
96
- return e;
97
- }
98
- /**
99
- * Creates a safe ternary guarded by the input expression, and with a body generated by the provided
100
- * callback on the input expression. Generates a temporary variable assignment if needed, and
101
- * deduplicates nested temporary assignments if needed.
102
- */
103
- function safeTernaryWithTemporary(guard, body, ctx) {
104
- let result;
105
- if (needsTemporaryInSafeAccess(guard)) {
106
- const xref = ctx.job.allocateXrefId();
107
- result = [new ir.AssignTemporaryExpr(guard, xref), new ir.ReadTemporaryExpr(xref)];
108
- }
109
- else {
110
- result = [guard, guard.clone()];
111
- // Consider an expression like `a?.[b?.c()]?.d`. The `b?.c()` will be transformed first,
112
- // introducing a temporary assignment into the key. Then, as part of expanding the `?.d`. That
113
- // assignment will be duplicated into both the guard and expression sides. We de-duplicate it,
114
- // by transforming it from an assignment into a read on the expression side.
115
- eliminateTemporaryAssignments(result[1], temporariesIn(result[0]), ctx);
116
- }
117
- return new ir.SafeTernaryExpr(result[0], body(result[1]));
118
- }
119
- function isSafeAccessExpression(e) {
120
- return (e instanceof ir.SafePropertyReadExpr ||
121
- e instanceof ir.SafeKeyedReadExpr ||
122
- e instanceof ir.SafeInvokeFunctionExpr);
123
- }
124
- function isUnsafeAccessExpression(e) {
125
- return (e instanceof o.ReadPropExpr || e instanceof o.ReadKeyExpr || e instanceof o.InvokeFunctionExpr);
126
- }
127
- function isAccessExpression(e) {
128
- return isSafeAccessExpression(e) || isUnsafeAccessExpression(e);
129
- }
130
- function deepestSafeTernary(e) {
131
- if (isAccessExpression(e) && e.receiver instanceof ir.SafeTernaryExpr) {
132
- let st = e.receiver;
133
- while (st.expr instanceof ir.SafeTernaryExpr) {
134
- st = st.expr;
135
- }
136
- return st;
137
- }
138
- return null;
139
- }
140
- // TODO: When strict compatibility with TemplateDefinitionBuilder is not required, we can use `&&`
141
- // instead to save some code size.
142
- function safeTransform(e, ctx) {
143
- if (!isAccessExpression(e)) {
144
- return e;
145
- }
146
- const dst = deepestSafeTernary(e);
147
- if (dst) {
148
- if (e instanceof o.InvokeFunctionExpr) {
149
- dst.expr = dst.expr.callFn(e.args);
150
- return e.receiver;
151
- }
152
- if (e instanceof o.ReadPropExpr) {
153
- dst.expr = dst.expr.prop(e.name);
154
- return e.receiver;
155
- }
156
- if (e instanceof o.ReadKeyExpr) {
157
- dst.expr = dst.expr.key(e.index);
158
- return e.receiver;
159
- }
160
- if (e instanceof ir.SafeInvokeFunctionExpr) {
161
- dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.callFn(e.args), ctx);
162
- return e.receiver;
163
- }
164
- if (e instanceof ir.SafePropertyReadExpr) {
165
- dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.prop(e.name), ctx);
166
- return e.receiver;
167
- }
168
- if (e instanceof ir.SafeKeyedReadExpr) {
169
- dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.key(e.index), ctx);
170
- return e.receiver;
171
- }
172
- }
173
- else {
174
- if (e instanceof ir.SafeInvokeFunctionExpr) {
175
- return safeTernaryWithTemporary(e.receiver, (r) => r.callFn(e.args), ctx);
176
- }
177
- if (e instanceof ir.SafePropertyReadExpr) {
178
- return safeTernaryWithTemporary(e.receiver, (r) => r.prop(e.name), ctx);
179
- }
180
- if (e instanceof ir.SafeKeyedReadExpr) {
181
- return safeTernaryWithTemporary(e.receiver, (r) => r.key(e.index), ctx);
182
- }
183
- }
184
- return e;
185
- }
186
- function ternaryTransform(e) {
187
- if (!(e instanceof ir.SafeTernaryExpr)) {
188
- return e;
189
- }
190
- return new o.ConditionalExpr(new o.BinaryOperatorExpr(o.BinaryOperator.Equals, e.guard, o.NULL_EXPR), o.NULL_EXPR, e.expr);
191
- }
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kX3NhZmVfcmVhZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9leHBhbmRfc2FmZV9yZWFkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssQ0FBQyxNQUFNLCtCQUErQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBTy9COzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBbUI7SUFDakQsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUYsRUFBRSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEYsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsOEZBQThGO0FBQzlGLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsQ0FBQyxDQUFDLGtCQUFrQjtJQUNwQixDQUFDLENBQUMsZ0JBQWdCO0lBQ2xCLENBQUMsQ0FBQyxjQUFjO0lBQ2hCLEVBQUUsQ0FBQyxzQkFBc0I7SUFDekIsRUFBRSxDQUFDLGVBQWU7Q0FDbkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMs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SUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLENBQWU7SUFDdkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLENBQUMsZUFBZSxDQUMxQixJQUFJLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFDdkUsQ0FBQyxDQUFDLFNBQVMsRUFDWCxDQUFDLENBQUMsSUFBSSxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG5pbnRlcmZhY2UgU2FmZVRyYW5zZm9ybUNvbnRleHQge1xuICBqb2I6IENvbXBpbGF0aW9uSm9iO1xufVxuXG4vKipcbiAqIFNhZmUgcmVhZCBleHByZXNzaW9ucyBzdWNoIGFzIGBhPy5iYCBoYXZlIGRpZmZlcmVudCBzZW1hbnRpY3MgaW4gQW5ndWxhciB0ZW1wbGF0ZXMgYXNcbiAqIGNvbXBhcmVkIHRvIEphdmFTY3JpcHQuIEluIHBhcnRpY3VsYXIsIHRoZXkgZGVmYXVsdCB0byBgbnVsbGAgaW5zdGVhZCBvZiBgdW5kZWZpbmVkYC4gVGhpcyBwaGFzZVxuICogZmluZHMgYWxsIHVucmVzb2x2ZWQgc2FmZSByZWFkIGV4cHJlc3Npb25zLCBhbmQgY29udmVydHMgdGhlbSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgQVNUXG4gKiByZWFkcywgZ3VhcmRlZCBieSBudWxsIGNoZWNrcy4gV2UgZ2VuZXJhdGUgdGVtcG9yYXJpZXMgYXMgbmVlZGVkLCB0byBhdm9pZCByZS1ldmFsdWF0aW5nIHRoZSBzYW1lXG4gKiBzdWItZXhwcmVzc2lvbiBtdWx0aXBsZSB0aW1lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZFNhZmVSZWFkcyhqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQub3BzKCkpIHtcbiAgICAgIGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5PcChvcCwgKGUpID0+IHNhZmVUcmFuc2Zvcm0oZSwge2pvYn0pLCBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSk7XG4gICAgICBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3Aob3AsIHRlcm5hcnlUcmFuc2Zvcm0sIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBsb29rdXAgc2V0IG9mIGFsbCB0aGUgZXhwcmVzc2lvbiBraW5kcyB0aGF0IHJlcXVpcmUgYSB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gYmUgZ2VuZXJhdGVkLlxuY29uc3QgcmVxdWlyZXNUZW1wb3JhcnkgPSBbXG4gIG8uSW52b2tlRnVuY3Rpb25FeHByLFxuICBvLkxpdGVyYWxBcnJheUV4cHIsXG4gIG8uTGl0ZXJhbE1hcEV4cHIsXG4gIGlyLlNhZmVJbnZva2VGdW5jdGlvbkV4cHIsXG4gIGlyLlBpcGVCaW5kaW5nRXhwcixcbl0ubWFwKChlKSA9PiBlLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG5mdW5jdGlvbiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgLy8gVE9ETzogV2UgcHJvYmFibHkgd2FudCB0byB1c2UgYW4gZXhwcmVzc2lvbiB2aXNpdG9yIHRvIHJlY3Vyc2l2ZWx5IHZpc2l0IGFsbCBkZXNjZW5kZW50cy5cbiAgLy8gSG93ZXZlciwgdGhhdCB3b3VsZCBwb3RlbnRpYWxseSBkbyBhIGxvdCBvZiBleHRyYSB3b3JrIChiZWNhdXNlIGl0IGNhbm5vdCBzaG9ydCBjaXJjdWl0KSwgc28gd2VcbiAgLy8gaW1wbGVtZW50IHRoZSBsb2dpYyBvdXJzZWx2ZXMgZm9yIG5vdy5cbiAgaWYgKGUgaW5zdGFuY2VvZiBvLlVuYXJ5T3BlcmF0b3JFeHByKSB7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuZXhwcik7XG4gIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG8uQmluYXJ5T3BlcmF0b3JFeHByKSB7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUubGhzKSB8fCBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnJocyk7XG4gIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG8uQ29uZGl0aW9uYWxFeHByKSB7XG4gICAgaWYgKGUuZmFsc2VDYXNlICYmIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuZmFsc2VDYXNlKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuY29uZGl0aW9uKSB8fCBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnRydWVDYXNlKTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2Ygby5Ob3RFeHByKSB7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuY29uZGl0aW9uKTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgaXIuQXNzaWduVGVtcG9yYXJ5RXhwcikge1xuICAgIHJldHVybiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLmV4cHIpO1xuICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBvLlJlYWRQcm9wRXhwcikge1xuICAgIHJldHVybiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnJlY2VpdmVyKTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2Ygby5SZWFkS2V5RXhwcikge1xuICAgIHJldHVybiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnJlY2VpdmVyKSB8fCBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLmluZGV4KTtcbiAgfVxuICAvLyBUT0RPOiBTd2l0Y2ggdG8gYSBtZXRob2Qgd2hpY2ggaXMgZXhoYXVzdGl2ZSBvZiBuZXdseSBhZGRlZCBleHByZXNzaW9uIHN1YnR5cGVzLlxuICByZXR1cm4gKFxuICAgIGUgaW5zdGFuY2VvZiBvLkludm9rZUZ1bmN0aW9uRXhwciB8fFxuICAgIGUgaW5zdGFuY2VvZiBvLkxpdGVyYWxBcnJheUV4cHIgfHxcbiAgICBlIGluc3RhbmNlb2Ygby5MaXRlcmFsTWFwRXhwciB8fFxuICAgIGUgaW5zdGFuY2VvZiBpci5TYWZlSW52b2tlRnVuY3Rpb25FeHByIHx8XG4gICAgZSBpbnN0YW5jZW9mIGlyLlBpcGVCaW5kaW5nRXhwclxuICApO1xufVxuXG5mdW5jdGlvbiB0ZW1wb3Jhcmllc0luKGU6IG8uRXhwcmVzc2lvbik6IFNldDxpci5YcmVmSWQ+IHtcbiAgY29uc3QgdGVtcG9yYXJpZXMgPSBuZXcgU2V0PGlyLlhyZWZJZD4oKTtcbiAgLy8gVE9ETzogQWx0aG91Z2ggaXQncyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgdHJhbnNmb3JtIGhlbHBlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG9cbiAgLy8gc2hvcnQtY2lyY3VpdCBleHBsb3JpbmcgdGhlIHRyZWUgdG8gZG8gbGVzcyB3b3JrLiBJbiBwYXJ0aWN1bGFyLCB3ZSBkb24ndCBoYXZlIHRvIHBlbmV0cmF0ZVxuICAvLyBpbnRvIHRoZSBzdWJleHByZXNzaW9ucyBvZiB0ZW1wb3JhcnkgYXNzaWdubWVudHMuXG4gIGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKFxuICAgIGUsXG4gICAgKGUpID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgaXIuQXNzaWduVGVtcG9yYXJ5RXhwcikge1xuICAgICAgICB0ZW1wb3Jhcmllcy5hZGQoZS54cmVmKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlO1xuICAgIH0sXG4gICAgaXIuVmlzaXRvckNvbnRleHRGbGFnLk5vbmUsXG4gICk7XG4gIHJldHVybiB0ZW1wb3Jhcmllcztcbn1cblxuZnVuY3Rpb24gZWxpbWluYXRlVGVtcG9yYXJ5QXNzaWdubWVudHMoXG4gIGU6IG8uRXhwcmVzc2lvbixcbiAgdG1wczogU2V0PGlyLlhyZWZJZD4sXG4gIGN0eDogU2FmZVRyYW5zZm9ybUNvbnRleHQsXG4pOiBvLkV4cHJlc3Npb24ge1xuICAvLyBUT0RPOiBXZSBjYW4gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgdHJhbnNmb3JtIGhlbHBlciBoZXJlLiBXZSBkb24ndCBuZWVkIHRvIHZpc2l0IGFueVxuICAvLyBkZXNjZW5kZW50cyBvZiB0ZW1wb3JhcnkgYXNzaWdubWVudHMuXG4gIGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKFxuICAgIGUsXG4gICAgKGUpID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgaXIuQXNzaWduVGVtcG9yYXJ5RXhwciAmJiB0bXBzLmhhcyhlLnhyZWYpKSB7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBuZXcgaXIuUmVhZFRlbXBvcmFyeUV4cHIoZS54cmVmKTtcbiAgICAgICAgLy8gYFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXJgIGhhcyB0aGUgKGFjY2lkZW50YWw/KSBiZWhhdmlvciBvZiBnZW5lcmF0aW5nIGFzc2lnbm1lbnRzIG9mXG4gICAgICAgIC8vIHRlbXBvcmFyeSB2YXJpYWJsZXMgdG8gdGhlbXNlbHZlcy4gVGhpcyBoYXBwZW5zIGJlY2F1c2Ugc29tZSBzdWJleHByZXNzaW9uIHRoYXQgdGhlXG4gICAgICAgIC8vIHRlbXBvcmFyeSByZWZlcnMgdG8sIHBvc3NpYmx5IHRocm91Z2ggbmVzdGVkIHRlbXBvcmFyaWVzLCBoYXMgYSBmdW5jdGlvbiBjYWxsLiBXZSBjb3B5IHRoYXRcbiAgICAgICAgLy8gYmVoYXZpb3IgaGVyZS5cbiAgICAgICAgcmV0dXJuIGN0eC5qb2IuY29tcGF0aWJpbGl0eSA9PT0gaXIuQ29tcGF0aWJpbGl0eU1vZGUuVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlclxuICAgICAgICAgID8gbmV3IGlyLkFzc2lnblRlbXBvcmFyeUV4cHIocmVhZCwgcmVhZC54cmVmKVxuICAgICAgICAgIDogcmVhZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlO1xuICAgIH0sXG4gICAgaXIuVmlzaXRvckNvbnRleHRGbGFnLk5vbmUsXG4gICk7XG4gIHJldHVybiBlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYWZlIHRlcm5hcnkgZ3VhcmRlZCBieSB0aGUgaW5wdXQgZXhwcmVzc2lvbiwgYW5kIHdpdGggYSBib2R5IGdlbmVyYXRlZCBieSB0aGUgcHJvdmlkZWRcbiAqIGNhbGxiYWNrIG9uIHRoZSBpbnB1dCBleHByZXNzaW9uLiBHZW5lcmF0ZXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgYXNzaWdubWVudCBpZiBuZWVkZWQsIGFuZFxuICogZGVkdXBsaWNhdGVzIG5lc3RlZCB0ZW1wb3JhcnkgYXNzaWdubWVudHMgaWYgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoXG4gIGd1YXJkOiBvLkV4cHJlc3Npb24sXG4gIGJvZHk6IChlOiBvLkV4cHJlc3Npb24pID0+IG8uRXhwcmVzc2lvbixcbiAgY3R4OiBTYWZlVHJhbnNmb3JtQ29udGV4dCxcbik6IGlyLlNhZmVUZXJuYXJ5RXhwciB7XG4gIGxldCByZXN1bHQ6IFtvLkV4cHJlc3Npb24sIG8uRXhwcmVzc2lvbl07XG4gIGlmIChuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhndWFyZCkpIHtcbiAgICBjb25zdCB4cmVmID0gY3R4LmpvYi5hbGxvY2F0ZVhyZWZJZCgpO1xuICAgIHJlc3VsdCA9IFtuZXcgaXIuQXNzaWduVGVtcG9yYXJ5RXhwcihndWFyZCwgeHJlZiksIG5ldyBpci5SZWFkVGVtcG9yYXJ5RXhwcih4cmVmKV07XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gW2d1YXJkLCBndWFyZC5jbG9uZSgpXTtcbiAgICAvLyBDb25zaWRlciBhbiBleHByZXNzaW9uIGxpa2UgYGE/LltiPy5jKCldPy5kYC4gVGhlIGBiPy5jKClgIHdpbGwgYmUgdHJhbnNmb3JtZWQgZmlyc3QsXG4gICAgLy8gaW50cm9kdWNpbmcgYSB0ZW1wb3JhcnkgYXNzaWdubWVudCBpbnRvIHRoZSBrZXkuIFRoZW4sIGFzIHBhcnQgb2YgZXhwYW5kaW5nIHRoZSBgPy5kYC4gVGhhdFxuICAgIC8vIGFzc2lnbm1lbnQgd2lsbCBiZSBkdXBsaWNhdGVkIGludG8gYm90aCB0aGUgZ3VhcmQgYW5kIGV4cHJlc3Npb24gc2lkZXMuIFdlIGRlLWR1cGxpY2F0ZSBpdCxcbiAgICAvLyBieSB0cmFuc2Zvcm1pbmcgaXQgZnJvbSBhbiBhc3NpZ25tZW50IGludG8gYSByZWFkIG9uIHRoZSBleHByZXNzaW9uIHNpZGUuXG4gICAgZWxpbWluYXRlVGVtcG9yYXJ5QXNzaWdubWVudHMocmVzdWx0WzFdLCB0ZW1wb3Jhcmllc0luKHJlc3VsdFswXSksIGN0eCk7XG4gIH1cbiAgcmV0dXJuIG5ldyBpci5TYWZlVGVybmFyeUV4cHIocmVzdWx0WzBdLCBib2R5KHJlc3VsdFsxXSkpO1xufVxuXG5mdW5jdGlvbiBpc1NhZmVBY2Nlc3NFeHByZXNzaW9uKFxuICBlOiBvLkV4cHJlc3Npb24sXG4pOiBlIGlzIGlyLlNhZmVQcm9wZXJ0eVJlYWRFeHByIHwgaXIuU2FmZUtleWVkUmVhZEV4cHIgfCBpci5TYWZlSW52b2tlRnVuY3Rpb25FeHByIHtcbiAgcmV0dXJuIChcbiAgICBlIGluc3RhbmNlb2YgaXIuU2FmZVByb3BlcnR5UmVhZEV4cHIgfHxcbiAgICBlIGluc3RhbmNlb2YgaXIuU2FmZUtleWVkUmVhZEV4cHIgfHxcbiAgICBlIGluc3RhbmNlb2YgaXIuU2FmZUludm9rZUZ1bmN0aW9uRXhwclxuICApO1xufVxuXG5mdW5jdGlvbiBpc1Vuc2FmZUFjY2Vzc0V4cHJlc3Npb24oXG4gIGU6IG8uRXhwcmVzc2lvbixcbik6IGUgaXMgby5SZWFkUHJvcEV4cHIgfCBvLlJlYWRLZXlFeHByIHwgby5JbnZva2VGdW5jdGlvbkV4cHIge1xuICByZXR1cm4gKFxuICAgIGUgaW5zdGFuY2VvZiBvLlJlYWRQcm9wRXhwciB8fCBlIGluc3RhbmNlb2Ygby5SZWFkS2V5RXhwciB8fCBlIGluc3RhbmNlb2Ygby5JbnZva2VGdW5jdGlvbkV4cHJcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNBY2Nlc3NFeHByZXNzaW9uKFxuICBlOiBvLkV4cHJlc3Npb24sXG4pOiBlIGlzXG4gIHwgby5SZWFkUHJvcEV4cHJcbiAgfCBpci5TYWZlUHJvcGVydHlSZWFkRXhwclxuICB8IG8uUmVhZEtleUV4cHJcbiAgfCBpci5TYWZlS2V5ZWRSZWFkRXhwclxuICB8IG8uSW52b2tlRnVuY3Rpb25FeHByXG4gIHwgaXIuU2FmZUludm9rZUZ1bmN0aW9uRXhwciB7XG4gIHJldHVybiBpc1NhZmVBY2Nlc3NFeHByZXNzaW9uKGUpIHx8IGlzVW5zYWZlQWNjZXNzRXhwcmVzc2lvbihlKTtcbn1cblxuZnVuY3Rpb24gZGVlcGVzdFNhZmVUZXJuYXJ5KGU6IG8uRXhwcmVzc2lvbik6IGlyLlNhZmVUZXJuYXJ5RXhwciB8IG51bGwge1xuICBpZiAoaXNBY2Nlc3NFeHByZXNzaW9uKGUpICYmIGUucmVjZWl2ZXIgaW5zdGFuY2VvZiBpci5TYWZlVGVybmFyeUV4cHIpIHtcbiAgICBsZXQgc3QgPSBlLnJlY2VpdmVyO1xuICAgIHdoaWxlIChzdC5leHByIGluc3RhbmNlb2YgaXIuU2FmZVRlcm5hcnlFeHByKSB7XG4gICAgICBzdCA9IHN0LmV4cHI7XG4gICAgfVxuICAgIHJldHVybiBzdDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVE9ETzogV2hlbiBzdHJpY3QgY29tcGF0aWJpbGl0eSB3aXRoIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgaXMgbm90IHJlcXVpcmVkLCB3ZSBjYW4gdXNlIGAmJmBcbi8vIGluc3RlYWQgdG8gc2F2ZSBzb21lIGNvZGUgc2l6ZS5cbmZ1bmN0aW9uIHNhZmVUcmFuc2Zvcm0oZTogby5FeHByZXNzaW9uLCBjdHg6IFNhZmVUcmFuc2Zvcm1Db250ZXh0KTogby5FeHByZXNzaW9uIHtcbiAgaWYgKCFpc0FjY2Vzc0V4cHJlc3Npb24oZSkpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxuXG4gIGNvbnN0IGRzdCA9IGRlZXBlc3RTYWZlVGVybmFyeShlKTtcblxuICBpZiAoZHN0KSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBvLkludm9rZUZ1bmN0aW9uRXhwcikge1xuICAgICAgZHN0LmV4cHIgPSBkc3QuZXhwci5jYWxsRm4oZS5hcmdzKTtcbiAgICAgIHJldHVybiBlLnJlY2VpdmVyO1xuICAgIH1cbiAgICBpZiAoZSBpbnN0YW5jZW9mIG8uUmVhZFByb3BFeHByKSB7XG4gICAgICBkc3QuZXhwciA9IGRzdC5leHByLnByb3AoZS5uYW1lKTtcbiAgICAgIHJldHVybiBlLnJlY2VpdmVyO1xuICAgIH1cbiAgICBpZiAoZSBpbnN0YW5jZW9mIG8uUmVhZEtleUV4cHIpIHtcbiAgICAgIGRzdC5leHByID0gZHN0LmV4cHIua2V5KGUuaW5kZXgpO1xuICAgICAgcmV0dXJuIGUucmVjZWl2ZXI7XG4gICAgfVxuICAgIGlmIChlIGluc3RhbmNlb2YgaXIuU2FmZUludm9rZUZ1bmN0aW9uRXhwcikge1xuICAgICAgZHN0LmV4cHIgPSBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoZHN0LmV4cHIsIChyOiBvLkV4cHJlc3Npb24pID0+IHIuY2FsbEZuKGUuYXJncyksIGN0eCk7XG4gICAgICByZXR1cm4gZS5yZWNlaXZlcjtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBpci5TYWZlUHJvcGVydHlSZWFkRXhwcikge1xuICAgICAgZHN0LmV4cHIgPSBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoZHN0LmV4cHIsIChyOiBvLkV4cHJlc3Npb24pID0+IHIucHJvcChlLm5hbWUpLCBjdHgpO1xuICAgICAgcmV0dXJuIGUucmVjZWl2ZXI7XG4gICAgfVxuICAgIGlmIChlIGluc3RhbmNlb2YgaXIuU2FmZUtleWVkUmVhZEV4cHIpIHtcbiAgICAgIGRzdC5leHByID0gc2FmZVRlcm5hcnlXaXRoVGVtcG9yYXJ5KGRzdC5leHByLCAocjogby5FeHByZXNzaW9uKSA9PiByLmtleShlLmluZGV4KSwgY3R4KTtcbiAgICAgIHJldHVybiBlLnJlY2VpdmVyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIGlyLlNhZmVJbnZva2VGdW5jdGlvbkV4cHIpIHtcbiAgICAgIHJldHVybiBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoZS5yZWNlaXZlciwgKHI6IG8uRXhwcmVzc2lvbikgPT4gci5jYWxsRm4oZS5hcmdzKSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBpci5TYWZlUHJvcGVydHlSZWFkRXhwcikge1xuICAgICAgcmV0dXJuIHNhZmVUZXJuYXJ5V2l0aFRlbXBvcmFyeShlLnJlY2VpdmVyLCAocjogby5FeHByZXNzaW9uKSA9PiByLnByb3AoZS5uYW1lKSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBpci5TYWZlS2V5ZWRSZWFkRXhwcikge1xuICAgICAgcmV0dXJuIHNhZmVUZXJuYXJ5V2l0aFRlbXBvcmFyeShlLnJlY2VpdmVyLCAocjogby5FeHByZXNzaW9uKSA9PiByLmtleShlLmluZGV4KSwgY3R4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZTtcbn1cblxuZnVuY3Rpb24gdGVybmFyeVRyYW5zZm9ybShlOiBvLkV4cHJlc3Npb24pOiBvLkV4cHJlc3Npb24ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgaXIuU2FmZVRlcm5hcnlFeHByKSkge1xuICAgIHJldHVybiBlO1xuICB9XG4gIHJldHVybiBuZXcgby5Db25kaXRpb25hbEV4cHIoXG4gICAgbmV3IG8uQmluYXJ5T3BlcmF0b3JFeHByKG8uQmluYXJ5T3BlcmF0b3IuRXF1YWxzLCBlLmd1YXJkLCBvLk5VTExfRVhQUiksXG4gICAgby5OVUxMX0VYUFIsXG4gICAgZS5leHByLFxuICApO1xufVxuIl19