@angular/compiler 17.0.0-rc.0 → 17.0.0-rc.2
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/esm2022/src/ml_parser/ast.mjs +3 -2
- package/esm2022/src/ml_parser/html_whitespaces.mjs +2 -2
- package/esm2022/src/ml_parser/icu_ast_expander.mjs +2 -2
- package/esm2022/src/ml_parser/lexer.mjs +2 -13
- package/esm2022/src/ml_parser/parser.mjs +3 -3
- package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
- package/esm2022/src/render3/partial/directive.mjs +1 -1
- package/esm2022/src/render3/partial/factory.mjs +1 -1
- package/esm2022/src/render3/partial/injectable.mjs +1 -1
- package/esm2022/src/render3/partial/injector.mjs +1 -1
- package/esm2022/src/render3/partial/ng_module.mjs +1 -1
- package/esm2022/src/render3/partial/pipe.mjs +1 -1
- package/esm2022/src/render3/r3_ast.mjs +57 -62
- package/esm2022/src/render3/r3_control_flow.mjs +18 -14
- package/esm2022/src/render3/r3_deferred_blocks.mjs +7 -8
- package/esm2022/src/render3/r3_deferred_triggers.mjs +46 -27
- package/esm2022/src/render3/r3_template_transform.mjs +2 -2
- package/esm2022/src/render3/view/t2_api.mjs +1 -1
- package/esm2022/src/render3/view/t2_binder.mjs +22 -10
- package/esm2022/src/render3/view/template.mjs +54 -5
- package/esm2022/src/template/pipeline/ir/index.mjs +2 -1
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +124 -38
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +127 -64
- package/esm2022/src/template/pipeline/ir/src/handle.mjs +13 -0
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +71 -50
- package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +3 -2
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +19 -8
- package/esm2022/src/template/pipeline/ir/src/traits.mjs +1 -32
- package/esm2022/src/template/pipeline/ir/src/variable.mjs +1 -1
- package/esm2022/src/template/pipeline/src/compilation.mjs +6 -1
- package/esm2022/src/template/pipeline/src/conversion.mjs +2 -2
- package/esm2022/src/template/pipeline/src/emit.mjs +118 -99
- package/esm2022/src/template/pipeline/src/ingest.mjs +204 -50
- package/esm2022/src/template/pipeline/src/instruction.mjs +57 -12
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +4 -3
- package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +31 -0
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +9 -6
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +30 -0
- package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +93 -0
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +7 -4
- package/esm2022/src/template/pipeline/src/phases/format_i18n_params.mjs +114 -0
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +13 -6
- package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +28 -0
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +8 -2
- package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +129 -7
- package/esm2022/src/template/pipeline/src/phases/i18n_message_extraction.mjs +4 -105
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +9 -6
- package/esm2022/src/template/pipeline/src/phases/icu_extraction.mjs +8 -5
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +27 -11
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +8 -2
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +46 -32
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +9 -9
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +23 -6
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +7 -3
- package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +2 -2
- package/esm2022/src/template/pipeline/src/phases/propagate_i18n_placeholders.mjs +61 -0
- package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +3 -2
- package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +77 -26
- package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +5 -2
- package/esm2022/src/template/pipeline/src/phases/repeater_derived_vars.mjs +45 -0
- package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +7 -3
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +109 -0
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +58 -0
- package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +4 -3
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +16 -11
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +5 -30
- package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +49 -0
- package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +81 -0
- package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +36 -0
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +37 -4
- package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +47 -7
- package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +2 -2
- package/esm2022/src/template/pipeline/src/util/elements.mjs +6 -6
- package/esm2022/src/version.mjs +1 -1
- package/fesm2022/compiler.mjs +2004 -1048
- package/fesm2022/compiler.mjs.map +1 -1
- package/index.d.ts +45 -60
- package/package.json +3 -3
- package/esm2022/src/template/pipeline/src/phases/align_pipe_variadic_var_offset.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/has_const_trait_collection.mjs +0 -34
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_placeholders.mjs +0 -288
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
* Generate track functions that need to be extracted to the constant pool. This entails wrapping
|
|
12
|
+
* them in an arrow (or traditional) function, replacing context reads with `this.`, and storing
|
|
13
|
+
* them in the constant pool.
|
|
14
|
+
*
|
|
15
|
+
* Note that, if a track function was previously optimized, it will not need to be extracted, and
|
|
16
|
+
* this phase is a no-op.
|
|
17
|
+
*/
|
|
18
|
+
export function generateTrackFns(job) {
|
|
19
|
+
for (const unit of job.units) {
|
|
20
|
+
for (const op of unit.create) {
|
|
21
|
+
if (op.kind !== ir.OpKind.RepeaterCreate) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (op.trackByFn !== null) {
|
|
25
|
+
// The final track function was already set, probably because it was optimized.
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
// Find all component context reads.
|
|
29
|
+
let usesComponentContext = false;
|
|
30
|
+
op.track = ir.transformExpressionsInExpression(op.track, expr => {
|
|
31
|
+
if (expr instanceof ir.TrackContextExpr) {
|
|
32
|
+
usesComponentContext = true;
|
|
33
|
+
return o.variable('this');
|
|
34
|
+
}
|
|
35
|
+
return expr;
|
|
36
|
+
}, ir.VisitorContextFlag.None);
|
|
37
|
+
let fn;
|
|
38
|
+
const fnParams = [new o.FnParam('$index'), new o.FnParam('$item')];
|
|
39
|
+
if (usesComponentContext) {
|
|
40
|
+
fn = new o.FunctionExpr(fnParams, [new o.ReturnStatement(op.track)]);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
fn = o.arrowFn(fnParams, op.track);
|
|
44
|
+
}
|
|
45
|
+
op.trackByFn = job.pool.getSharedFunctionReference(fn, '_forTrack');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tfZm5fZ2VuZXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy90ZW1wbGF0ZS9waXBlbGluZS9zcmMvcGhhc2VzL3RyYWNrX2ZuX2dlbmVyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLENBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUkvQjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQW1CO0lBQ2xELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtRQUM1QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO2dCQUN4QyxTQUFTO2FBQ1Y7WUFDRCxJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO2dCQUN6QiwrRUFBK0U7Z0JBQy9FLFNBQVM7YUFDVjtZQUVELG9DQUFvQztZQUNwQyxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNqQyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUM5RCxJQUFJLElBQUksWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3ZDLG9CQUFvQixHQUFHLElBQUksQ0FBQztvQkFDNUIsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUMzQjtnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0IsSUFBSSxFQUFzQyxDQUFDO1lBRTNDLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ25FLElBQUksb0JBQW9CLEVBQUU7Z0JBQ3hCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEU7aUJBQU07Z0JBQ0wsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNwQztZQUVELEVBQUUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDckU7S0FDRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgbyBmcm9tICcuLi8uLi8uLi8uLi9vdXRwdXQvb3V0cHV0X2FzdCc7XG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5cbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIEdlbmVyYXRlIHRyYWNrIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgZXh0cmFjdGVkIHRvIHRoZSBjb25zdGFudCBwb29sLiBUaGlzIGVudGFpbHMgd3JhcHBpbmdcbiAqIHRoZW0gaW4gYW4gYXJyb3cgKG9yIHRyYWRpdGlvbmFsKSBmdW5jdGlvbiwgcmVwbGFjaW5nIGNvbnRleHQgcmVhZHMgd2l0aCBgdGhpcy5gLCBhbmQgc3RvcmluZ1xuICogdGhlbSBpbiB0aGUgY29uc3RhbnQgcG9vbC5cbiAqXG4gKiBOb3RlIHRoYXQsIGlmIGEgdHJhY2sgZnVuY3Rpb24gd2FzIHByZXZpb3VzbHkgb3B0aW1pemVkLCBpdCB3aWxsIG5vdCBuZWVkIHRvIGJlIGV4dHJhY3RlZCwgYW5kXG4gKiB0aGlzIHBoYXNlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRyYWNrRm5zKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIGlmIChvcC5raW5kICE9PSBpci5PcEtpbmQuUmVwZWF0ZXJDcmVhdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAob3AudHJhY2tCeUZuICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFRoZSBmaW5hbCB0cmFjayBmdW5jdGlvbiB3YXMgYWxyZWFkeSBzZXQsIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIG9wdGltaXplZC5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgYWxsIGNvbXBvbmVudCBjb250ZXh0IHJlYWRzLlxuICAgICAgbGV0IHVzZXNDb21wb25lbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICBvcC50cmFjayA9IGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKG9wLnRyYWNrLCBleHByID0+IHtcbiAgICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBpci5UcmFja0NvbnRleHRFeHByKSB7XG4gICAgICAgICAgdXNlc0NvbXBvbmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBvLnZhcmlhYmxlKCd0aGlzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICB9LCBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSk7XG5cbiAgICAgIGxldCBmbjogby5GdW5jdGlvbkV4cHJ8by5BcnJvd0Z1bmN0aW9uRXhwcjtcblxuICAgICAgY29uc3QgZm5QYXJhbXMgPSBbbmV3IG8uRm5QYXJhbSgnJGluZGV4JyksIG5ldyBvLkZuUGFyYW0oJyRpdGVtJyldO1xuICAgICAgaWYgKHVzZXNDb21wb25lbnRDb250ZXh0KSB7XG4gICAgICAgIGZuID0gbmV3IG8uRnVuY3Rpb25FeHByKGZuUGFyYW1zLCBbbmV3IG8uUmV0dXJuU3RhdGVtZW50KG9wLnRyYWNrKV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm4gPSBvLmFycm93Rm4oZm5QYXJhbXMsIG9wLnRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgb3AudHJhY2tCeUZuID0gam9iLnBvb2wuZ2V0U2hhcmVkRnVuY3Rpb25SZWZlcmVuY2UoZm4sICdfZm9yVHJhY2snKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,81 @@
|
|
|
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 { Identifiers } from '../../../../render3/r3_identifiers';
|
|
10
|
+
import * as ir from '../../ir';
|
|
11
|
+
/**
|
|
12
|
+
* `track` functions in `for` repeaters can sometimes be "optimized," i.e. transformed into inline
|
|
13
|
+
* expressions, in lieu of an external function call. For example, tracking by `$index` can be be
|
|
14
|
+
* optimized into an inline `trackByIndex` reference. This phase checks track expressions for
|
|
15
|
+
* optimizable cases.
|
|
16
|
+
*/
|
|
17
|
+
export function optimizeTrackFns(job) {
|
|
18
|
+
for (const unit of job.units) {
|
|
19
|
+
for (const op of unit.create) {
|
|
20
|
+
if (op.kind !== ir.OpKind.RepeaterCreate) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (op.track instanceof o.ReadVarExpr && op.track.name === '$index') {
|
|
24
|
+
// Top-level access of `$index` uses the built in `repeaterTrackByIndex`.
|
|
25
|
+
op.trackByFn = o.importExpr(Identifiers.repeaterTrackByIndex);
|
|
26
|
+
}
|
|
27
|
+
else if (op.track instanceof o.ReadVarExpr && op.track.name === '$item') {
|
|
28
|
+
// Top-level access of the item uses the built in `repeaterTrackByIdentity`.
|
|
29
|
+
op.trackByFn = o.importExpr(Identifiers.repeaterTrackByIdentity);
|
|
30
|
+
}
|
|
31
|
+
else if (isTrackByFunctionCall(job.root.xref, op.track)) {
|
|
32
|
+
// Top-level method calls in the form of `fn($index, item)` can be passed in directly.
|
|
33
|
+
if (op.track.receiver.receiver.view === unit.xref) {
|
|
34
|
+
// TODO: this may be wrong
|
|
35
|
+
op.trackByFn = op.track.receiver;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// This is a plain method call, but not in the component's root view.
|
|
39
|
+
// We need to get the component instance, and then call the method on it.
|
|
40
|
+
op.trackByFn =
|
|
41
|
+
o.importExpr(Identifiers.componentInstance).callFn([]).prop(op.track.receiver.name);
|
|
42
|
+
// Because the context is not avaiable (without a special function), we don't want to
|
|
43
|
+
// try to resolve it later. Let's get rid of it by overwriting the original track
|
|
44
|
+
// expression (which won't be used anyway).
|
|
45
|
+
op.track = op.trackByFn;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// The track function could not be optimized.
|
|
50
|
+
// Replace context reads with a special IR expression, since context reads in a track
|
|
51
|
+
// function are emitted specially.
|
|
52
|
+
op.track = ir.transformExpressionsInExpression(op.track, expr => {
|
|
53
|
+
if (expr instanceof ir.ContextExpr) {
|
|
54
|
+
op.usesComponentInstance = true;
|
|
55
|
+
return new ir.TrackContextExpr(expr.view);
|
|
56
|
+
}
|
|
57
|
+
return expr;
|
|
58
|
+
}, ir.VisitorContextFlag.None);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function isTrackByFunctionCall(rootView, expr) {
|
|
64
|
+
if (!(expr instanceof o.InvokeFunctionExpr) || expr.args.length !== 2) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (!(expr.receiver instanceof o.ReadPropExpr &&
|
|
68
|
+
expr.receiver.receiver instanceof ir.ContextExpr) ||
|
|
69
|
+
expr.receiver.receiver.view !== rootView) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const [arg0, arg1] = expr.args;
|
|
73
|
+
if (!(arg0 instanceof o.ReadVarExpr) || arg0.name !== '$index') {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (!(arg1 instanceof o.ReadVarExpr) || arg1.name !== '$item') {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tfZm5fb3B0aW1pemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdHJhY2tfZm5fb3B0aW1pemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSS9COzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQW1CO0lBQ2xELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtRQUM1QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO2dCQUN4QyxTQUFTO2FBQ1Y7WUFDRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ25FLHlFQUF5RTtnQkFDekUsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQy9EO2lCQUFNLElBQUksRUFBRSxDQUFDLEtBQUssWUFBWSxDQUFDLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFDekUsNEVBQTRFO2dCQUM1RSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7YUFDbEU7aUJBQU0sSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3pELHNGQUFzRjtnQkFDdEYsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ2pELDBCQUEwQjtvQkFDMUIsRUFBRSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztpQkFDbEM7cUJBQU07b0JBQ0wscUVBQXFFO29CQUNyRSx5RUFBeUU7b0JBQ3pFLEVBQUUsQ0FBQyxTQUFTO3dCQUNSLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEYscUZBQXFGO29CQUNyRixpRkFBaUY7b0JBQ2pGLDJDQUEyQztvQkFDM0MsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUN6QjthQUNGO2lCQUFNO2dCQUNMLDZDQUE2QztnQkFDN0MscUZBQXFGO2dCQUNyRixrQ0FBa0M7Z0JBQ2xDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQzlELElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQyxXQUFXLEVBQUU7d0JBQ2xDLEVBQUUsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7d0JBQ2hDLE9BQU8sSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMzQztvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hDO1NBQ0Y7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUMxQixRQUFtQixFQUFFLElBQWtCO0lBTXpDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckUsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLFlBQVksQ0FBQyxDQUFDLFlBQVk7UUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDL0IsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM5RCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtRQUM3RCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuaW1wb3J0IHtJZGVudGlmaWVyc30gZnJvbSAnLi4vLi4vLi4vLi4vcmVuZGVyMy9yM19pZGVudGlmaWVycyc7XG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5cbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIGB0cmFja2AgZnVuY3Rpb25zIGluIGBmb3JgIHJlcGVhdGVycyBjYW4gc29tZXRpbWVzIGJlIFwib3B0aW1pemVkLFwiIGkuZS4gdHJhbnNmb3JtZWQgaW50byBpbmxpbmVcbiAqIGV4cHJlc3Npb25zLCBpbiBsaWV1IG9mIGFuIGV4dGVybmFsIGZ1bmN0aW9uIGNhbGwuIEZvciBleGFtcGxlLCB0cmFja2luZyBieSBgJGluZGV4YCBjYW4gYmUgYmVcbiAqIG9wdGltaXplZCBpbnRvIGFuIGlubGluZSBgdHJhY2tCeUluZGV4YCByZWZlcmVuY2UuIFRoaXMgcGhhc2UgY2hlY2tzIHRyYWNrIGV4cHJlc3Npb25zIGZvclxuICogb3B0aW1pemFibGUgY2FzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpbWl6ZVRyYWNrRm5zKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIGlmIChvcC5raW5kICE9PSBpci5PcEtpbmQuUmVwZWF0ZXJDcmVhdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAob3AudHJhY2sgaW5zdGFuY2VvZiBvLlJlYWRWYXJFeHByICYmIG9wLnRyYWNrLm5hbWUgPT09ICckaW5kZXgnKSB7XG4gICAgICAgIC8vIFRvcC1sZXZlbCBhY2Nlc3Mgb2YgYCRpbmRleGAgdXNlcyB0aGUgYnVpbHQgaW4gYHJlcGVhdGVyVHJhY2tCeUluZGV4YC5cbiAgICAgICAgb3AudHJhY2tCeUZuID0gby5pbXBvcnRFeHByKElkZW50aWZpZXJzLnJlcGVhdGVyVHJhY2tCeUluZGV4KTtcbiAgICAgIH0gZWxzZSBpZiAob3AudHJhY2sgaW5zdGFuY2VvZiBvLlJlYWRWYXJFeHByICYmIG9wLnRyYWNrLm5hbWUgPT09ICckaXRlbScpIHtcbiAgICAgICAgLy8gVG9wLWxldmVsIGFjY2VzcyBvZiB0aGUgaXRlbSB1c2VzIHRoZSBidWlsdCBpbiBgcmVwZWF0ZXJUcmFja0J5SWRlbnRpdHlgLlxuICAgICAgICBvcC50cmFja0J5Rm4gPSBvLmltcG9ydEV4cHIoSWRlbnRpZmllcnMucmVwZWF0ZXJUcmFja0J5SWRlbnRpdHkpO1xuICAgICAgfSBlbHNlIGlmIChpc1RyYWNrQnlGdW5jdGlvbkNhbGwoam9iLnJvb3QueHJlZiwgb3AudHJhY2spKSB7XG4gICAgICAgIC8vIFRvcC1sZXZlbCBtZXRob2QgY2FsbHMgaW4gdGhlIGZvcm0gb2YgYGZuKCRpbmRleCwgaXRlbSlgIGNhbiBiZSBwYXNzZWQgaW4gZGlyZWN0bHkuXG4gICAgICAgIGlmIChvcC50cmFjay5yZWNlaXZlci5yZWNlaXZlci52aWV3ID09PSB1bml0LnhyZWYpIHtcbiAgICAgICAgICAvLyBUT0RPOiB0aGlzIG1heSBiZSB3cm9uZ1xuICAgICAgICAgIG9wLnRyYWNrQnlGbiA9IG9wLnRyYWNrLnJlY2VpdmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBwbGFpbiBtZXRob2QgY2FsbCwgYnV0IG5vdCBpbiB0aGUgY29tcG9uZW50J3Mgcm9vdCB2aWV3LlxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBjb21wb25lbnQgaW5zdGFuY2UsIGFuZCB0aGVuIGNhbGwgdGhlIG1ldGhvZCBvbiBpdC5cbiAgICAgICAgICBvcC50cmFja0J5Rm4gPVxuICAgICAgICAgICAgICBvLmltcG9ydEV4cHIoSWRlbnRpZmllcnMuY29tcG9uZW50SW5zdGFuY2UpLmNhbGxGbihbXSkucHJvcChvcC50cmFjay5yZWNlaXZlci5uYW1lKTtcbiAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZXh0IGlzIG5vdCBhdmFpYWJsZSAod2l0aG91dCBhIHNwZWNpYWwgZnVuY3Rpb24pLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgLy8gdHJ5IHRvIHJlc29sdmUgaXQgbGF0ZXIuIExldCdzIGdldCByaWQgb2YgaXQgYnkgb3ZlcndyaXRpbmcgdGhlIG9yaWdpbmFsIHRyYWNrXG4gICAgICAgICAgLy8gZXhwcmVzc2lvbiAod2hpY2ggd29uJ3QgYmUgdXNlZCBhbnl3YXkpLlxuICAgICAgICAgIG9wLnRyYWNrID0gb3AudHJhY2tCeUZuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgdHJhY2sgZnVuY3Rpb24gY291bGQgbm90IGJlIG9wdGltaXplZC5cbiAgICAgICAgLy8gUmVwbGFjZSBjb250ZXh0IHJlYWRzIHdpdGggYSBzcGVjaWFsIElSIGV4cHJlc3Npb24sIHNpbmNlIGNvbnRleHQgcmVhZHMgaW4gYSB0cmFja1xuICAgICAgICAvLyBmdW5jdGlvbiBhcmUgZW1pdHRlZCBzcGVjaWFsbHkuXG4gICAgICAgIG9wLnRyYWNrID0gaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbkV4cHJlc3Npb24ob3AudHJhY2ssIGV4cHIgPT4ge1xuICAgICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgaXIuQ29udGV4dEV4cHIpIHtcbiAgICAgICAgICAgIG9wLnVzZXNDb21wb25lbnRJbnN0YW5jZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGlyLlRyYWNrQ29udGV4dEV4cHIoZXhwci52aWV3KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICAgIH0sIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUcmFja0J5RnVuY3Rpb25DYWxsKFxuICAgIHJvb3RWaWV3OiBpci5YcmVmSWQsIGV4cHI6IG8uRXhwcmVzc2lvbik6IGV4cHIgaXMgby5JbnZva2VGdW5jdGlvbkV4cHIme1xuICByZWNlaXZlcjogby5SZWFkUHJvcEV4cHIgJlxuICAgICAge1xuICAgICAgICByZWNlaXZlcjogaXIuQ29udGV4dEV4cHJcbiAgICAgIH1cbn0ge1xuICBpZiAoIShleHByIGluc3RhbmNlb2Ygby5JbnZva2VGdW5jdGlvbkV4cHIpIHx8IGV4cHIuYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIShleHByLnJlY2VpdmVyIGluc3RhbmNlb2Ygby5SZWFkUHJvcEV4cHIgJiZcbiAgICAgICAgZXhwci5yZWNlaXZlci5yZWNlaXZlciBpbnN0YW5jZW9mIGlyLkNvbnRleHRFeHByKSB8fFxuICAgICAgZXhwci5yZWNlaXZlci5yZWNlaXZlci52aWV3ICE9PSByb290Vmlldykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IFthcmcwLCBhcmcxXSA9IGV4cHIuYXJncztcbiAgaWYgKCEoYXJnMCBpbnN0YW5jZW9mIG8uUmVhZFZhckV4cHIpIHx8IGFyZzAubmFtZSAhPT0gJyRpbmRleCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCEoYXJnMSBpbnN0YW5jZW9mIG8uUmVhZFZhckV4cHIpIHx8IGFyZzEubmFtZSAhPT0gJyRpdGVtJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
* Inside the `track` expression on a `for` repeater, the `$index` and `$item` variables are
|
|
12
|
+
* ambiently available. In this phase, we find those variable usages, and replace them with the
|
|
13
|
+
* appropriate output read.
|
|
14
|
+
*/
|
|
15
|
+
export function generateTrackVariables(job) {
|
|
16
|
+
for (const unit of job.units) {
|
|
17
|
+
for (const op of unit.create) {
|
|
18
|
+
if (op.kind !== ir.OpKind.RepeaterCreate) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
op.track = ir.transformExpressionsInExpression(op.track, expr => {
|
|
22
|
+
if (expr instanceof ir.LexicalReadExpr) {
|
|
23
|
+
if (expr.name === op.varNames.$index) {
|
|
24
|
+
return o.variable('$index');
|
|
25
|
+
}
|
|
26
|
+
else if (expr.name === op.varNames.$implicit) {
|
|
27
|
+
return o.variable('$item');
|
|
28
|
+
}
|
|
29
|
+
// TODO: handle prohibited context variables (emit as globals?)
|
|
30
|
+
}
|
|
31
|
+
return expr;
|
|
32
|
+
}, ir.VisitorContextFlag.None);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tfdmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdHJhY2tfdmFyaWFibGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJL0I7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxHQUFtQjtJQUN4RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7UUFDNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzVCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRTtnQkFDeEMsU0FBUzthQUNWO1lBRUQsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDOUQsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRTtvQkFDdEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO3dCQUNwQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzdCO3lCQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTt3QkFDOUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUM1QjtvQkFFRCwrREFBK0Q7aUJBQ2hFO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBvIGZyb20gJy4uLy4uLy4uLy4uL291dHB1dC9vdXRwdXRfYXN0JztcbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcblxuaW1wb3J0IHR5cGUge0NvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogSW5zaWRlIHRoZSBgdHJhY2tgIGV4cHJlc3Npb24gb24gYSBgZm9yYCByZXBlYXRlciwgdGhlIGAkaW5kZXhgIGFuZCBgJGl0ZW1gIHZhcmlhYmxlcyBhcmVcbiAqIGFtYmllbnRseSBhdmFpbGFibGUuIEluIHRoaXMgcGhhc2UsIHdlIGZpbmQgdGhvc2UgdmFyaWFibGUgdXNhZ2VzLCBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlXG4gKiBhcHByb3ByaWF0ZSBvdXRwdXQgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJhY2tWYXJpYWJsZXMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgaWYgKG9wLmtpbmQgIT09IGlyLk9wS2luZC5SZXBlYXRlckNyZWF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgb3AudHJhY2sgPSBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luRXhwcmVzc2lvbihvcC50cmFjaywgZXhwciA9PiB7XG4gICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgaXIuTGV4aWNhbFJlYWRFeHByKSB7XG4gICAgICAgICAgaWYgKGV4cHIubmFtZSA9PT0gb3AudmFyTmFtZXMuJGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gby52YXJpYWJsZSgnJGluZGV4Jyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChleHByLm5hbWUgPT09IG9wLnZhck5hbWVzLiRpbXBsaWNpdCkge1xuICAgICAgICAgICAgcmV0dXJuIG8udmFyaWFibGUoJyRpdGVtJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVE9ETzogaGFuZGxlIHByb2hpYml0ZWQgY29udGV4dCB2YXJpYWJsZXMgKGVtaXQgYXMgZ2xvYmFscz8pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICB9LCBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -11,7 +11,7 @@ import { ComponentCompilationJob } from '../compilation';
|
|
|
11
11
|
* Counts the number of variable slots used within each view, and stores that on the view itself, as
|
|
12
12
|
* well as propagates it to the `ir.TemplateOp` for embedded views.
|
|
13
13
|
*/
|
|
14
|
-
export function
|
|
14
|
+
export function countVariables(job) {
|
|
15
15
|
// First, count the vars used in each view, and update the view-level counter.
|
|
16
16
|
for (const unit of job.units) {
|
|
17
17
|
let varCount = 0;
|
|
@@ -29,6 +29,13 @@ export function phaseVarCounting(job) {
|
|
|
29
29
|
if (!ir.isIrExpression(expr)) {
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
+
// TemplateDefinitionBuilder assigns variable offsets for everything but pure functions
|
|
33
|
+
// first, and then assigns offsets to pure functions lazily. We emulate that behavior by
|
|
34
|
+
// assigning offsets in two passes instead of one, only in compatibility mode.
|
|
35
|
+
if (job.compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder &&
|
|
36
|
+
expr instanceof ir.PureFunctionExpr) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
32
39
|
// Some expressions require knowledge of the number of variable slots consumed.
|
|
33
40
|
if (ir.hasUsesVarOffsetTrait(expr)) {
|
|
34
41
|
expr.varOffset = varCount;
|
|
@@ -38,6 +45,23 @@ export function phaseVarCounting(job) {
|
|
|
38
45
|
}
|
|
39
46
|
});
|
|
40
47
|
}
|
|
48
|
+
// Compatiblity mode pass for pure function offsets (as explained above).
|
|
49
|
+
if (job.compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder) {
|
|
50
|
+
for (const op of unit.ops()) {
|
|
51
|
+
ir.visitExpressionsInOp(op, expr => {
|
|
52
|
+
if (!ir.isIrExpression(expr) || !(expr instanceof ir.PureFunctionExpr)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Some expressions require knowledge of the number of variable slots consumed.
|
|
56
|
+
if (ir.hasUsesVarOffsetTrait(expr)) {
|
|
57
|
+
expr.varOffset = varCount;
|
|
58
|
+
}
|
|
59
|
+
if (ir.hasConsumesVarsTrait(expr)) {
|
|
60
|
+
varCount += varsUsedByIrExpression(expr);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
41
65
|
unit.vars = varCount;
|
|
42
66
|
}
|
|
43
67
|
if (job instanceof ComponentCompilationJob) {
|
|
@@ -45,7 +69,7 @@ export function phaseVarCounting(job) {
|
|
|
45
69
|
// an embedded view).
|
|
46
70
|
for (const unit of job.units) {
|
|
47
71
|
for (const op of unit.create) {
|
|
48
|
-
if (op.kind !== ir.OpKind.Template) {
|
|
72
|
+
if (op.kind !== ir.OpKind.Template && op.kind !== ir.OpKind.RepeaterCreate) {
|
|
49
73
|
continue;
|
|
50
74
|
}
|
|
51
75
|
const childView = job.views.get(op.xref);
|
|
@@ -67,7 +91,7 @@ function varsUsedByOp(op) {
|
|
|
67
91
|
// All of these bindings use 1 variable slot, plus 1 slot for every interpolated expression,
|
|
68
92
|
// if any.
|
|
69
93
|
slots = 1;
|
|
70
|
-
if (op.expression instanceof ir.Interpolation) {
|
|
94
|
+
if (op.expression instanceof ir.Interpolation && !isSingletonInterpolation(op.expression)) {
|
|
71
95
|
slots += op.expression.expressions.length;
|
|
72
96
|
}
|
|
73
97
|
return slots;
|
|
@@ -104,4 +128,13 @@ export function varsUsedByIrExpression(expr) {
|
|
|
104
128
|
throw new Error(`AssertionError: unhandled ConsumesVarsTrait expression ${expr.constructor.name}`);
|
|
105
129
|
}
|
|
106
130
|
}
|
|
107
|
-
|
|
131
|
+
function isSingletonInterpolation(expr) {
|
|
132
|
+
if (expr.expressions.length !== 1 || expr.strings.length !== 2) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
if (expr.strings[0] !== '' || expr.strings[1] !== '') {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyX2NvdW50aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdmFyX2NvdW50aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQW1CO0lBQ2hELDhFQUE4RTtJQUM5RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7UUFDNUIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWpCLHFGQUFxRjtRQUNyRixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMzQixJQUFJLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDL0IsUUFBUSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBRUQsZ0dBQWdHO1FBQ2hHLGdHQUFnRztRQUNoRyw4REFBOEQ7UUFDOUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDM0IsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzVCLE9BQU87aUJBQ1I7Z0JBRUQsdUZBQXVGO2dCQUN2Rix3RkFBd0Y7Z0JBQ3hGLDhFQUE4RTtnQkFDOUUsSUFBSSxHQUFHLENBQUMsYUFBYSxLQUFLLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUI7b0JB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SUFBSSxLQUFLLENBQ1gsMERBQTBELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUMxRjtBQUNILENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLElBQXNCO0lBQ3RELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5RCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNwRCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB7Q29tcGlsYXRpb25Kb2IsIENvbXBvbmVudENvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogQ291bnRzIHRoZSBudW1iZXIgb2YgdmFyaWFibGUgc2xvdHMgdXNlZCB3aXRoaW4gZWFjaCB2aWV3LCBhbmQgc3RvcmVzIHRoYXQgb24gdGhlIHZpZXcgaXRzZWxmLCBhc1xuICogd2VsbCBhcyBwcm9wYWdhdGVzIGl0IHRvIHRoZSBgaXIuVGVtcGxhdGVPcGAgZm9yIGVtYmVkZGVkIHZpZXdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnRWYXJpYWJsZXMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICAvLyBGaXJzdCwgY291bnQgdGhlIHZhcnMgdXNlZCBpbiBlYWNoIHZpZXcsIGFuZCB1cGRhdGUgdGhlIHZpZXctbGV2ZWwgY291bnRlci5cbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGxldCB2YXJDb3VudCA9IDA7XG5cbiAgICAvLyBDb3VudCB2YXJpYWJsZXMgb24gdG9wLWxldmVsIG9wcyBmaXJzdC4gRG9uJ3QgZXhwbG9yZSBuZXN0ZWQgZXhwcmVzc2lvbnMganVzdCB5ZXQuXG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0Lm9wcygpKSB7XG4gICAgICBpZiAoaXIuaGFzQ29uc3VtZXNWYXJzVHJhaXQob3ApKSB7XG4gICAgICAgIHZhckNvdW50ICs9IHZhcnNVc2VkQnlPcChvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ291bnQgdmFyaWFibGVzIG9uIGV4cHJlc3Npb25zIGluc2lkZSBvcHMuIFdlIGRvIHRoaXMgbGF0ZXIgYmVjYXVzZSBzb21lIG9mIHRoZXNlIGV4cHJlc3Npb25zXG4gICAgLy8gbWlnaHQgYmUgY29uZGl0aW9uYWwgKGUuZy4gYHBpcGVCaW5kaW5nYCBpbnNpZGUgb2YgYSB0ZXJuYXJ5KSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gaW50ZXJmZXJlXG4gICAgLy8gd2l0aCBpbmRpY2VzIGZvciB0b3AtbGV2ZWwgYmluZGluZyBzbG90cyAoZS5nLiBgcHJvcGVydHlgKS5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQub3BzKCkpIHtcbiAgICAgIGlyLnZpc2l0RXhwcmVzc2lvbnNJbk9wKG9wLCBleHByID0+IHtcbiAgICAgICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgYXNzaWducyB2YXJpYWJsZSBvZmZzZXRzIGZvciBldmVyeXRoaW5nIGJ1dCBwdXJlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBmaXJzdCwgYW5kIHRoZW4gYXNzaWducyBvZmZzZXRzIHRvIHB1cmUgZnVuY3Rpb25zIGxhemlseS4gV2UgZW11bGF0ZSB0aGF0IGJlaGF2aW9yIGJ5XG4gICAgICAgIC8vIGFzc2lnbmluZyBvZmZzZXRzIGluIHR3byBwYXNzZXMgaW5zdGVhZCBvZiBvbmUsIG9ubHkgaW4gY29tcGF0aWJpbGl0eSBtb2RlLlxuICAgICAgICBpZiAoam9iLmNvbXBhdGliaWxpdHkgPT09IGlyLkNvbXBhdGliaWxpdHlNb2RlLlRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgJiZcbiAgICAgICAgICAgIGV4cHIgaW5zdGFuY2VvZiBpci5QdXJlRnVuY3Rpb25FeHByKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29tZSBleHByZXNzaW9ucyByZXF1aXJlIGtub3dsZWRnZSBvZiB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlIHNsb3RzIGNvbnN1bWVkLlxuICAgICAgICBpZiAoaXIuaGFzVXNlc1Zhck9mZnNldFRyYWl0KGV4cHIpKSB7XG4gICAgICAgICAgZXhwci52YXJPZmZzZXQgPSB2YXJDb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpci5oYXNDb25zdW1lc1ZhcnNUcmFpdChleHByKSkge1xuICAgICAgICAgIHZhckNvdW50ICs9IHZhcnNVc2VkQnlJckV4cHJlc3Npb24oZXhwcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXBhdGlibGl0eSBtb2RlIHBhc3MgZm9yIHB1cmUgZnVuY3Rpb24gb2Zmc2V0cyAoYXMgZXhwbGFpbmVkIGFib3ZlKS5cbiAgICBpZiAoam9iLmNvbXBhdGliaWxpdHkgPT09IGlyLkNvbXBhdGliaWxpdHlNb2RlLlRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIpIHtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5vcHMoKSkge1xuICAgICAgICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgZXhwciA9PiB7XG4gICAgICAgICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSB8fCAhKGV4cHIgaW5zdGFuY2VvZiBpci5QdXJlRnVuY3Rpb25FeHByKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNvbWUgZXhwcmVzc2lvbnMgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgdGhlIG51bWJlciBvZiB2YXJpYWJsZSBzbG90cyBjb25zdW1lZC5cbiAgICAgICAgICBpZiAoaXIuaGFzVXNlc1Zhck9mZnNldFRyYWl0KGV4cHIpKSB7XG4gICAgICAgICAgICBleHByLnZhck9mZnNldCA9IHZhckNvdW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpci5oYXNDb25zdW1lc1ZhcnNUcmFpdChleHByKSkge1xuICAgICAgICAgICAgdmFyQ291bnQgKz0gdmFyc1VzZWRCeUlyRXhwcmVzc2lvbihleHByKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVuaXQudmFycyA9IHZhckNvdW50O1xuICB9XG5cbiAgaWYgKGpvYiBpbnN0YW5jZW9mIENvbXBvbmVudENvbXBpbGF0aW9uSm9iKSB7XG4gICAgLy8gQWRkIHZhciBjb3VudHMgZm9yIGVhY2ggdmlldyB0byB0aGUgYGlyLlRlbXBsYXRlT3BgIHdoaWNoIGRlY2xhcmVzIHRoYXQgdmlldyAoaWYgdGhlIHZpZXcgaXNcbiAgICAvLyBhbiBlbWJlZGRlZCB2aWV3KS5cbiAgICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICAgIGlmIChvcC5raW5kICE9PSBpci5PcEtpbmQuVGVtcGxhdGUgJiYgb3Aua2luZCAhPT0gaXIuT3BLaW5kLlJlcGVhdGVyQ3JlYXRlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGlsZFZpZXcgPSBqb2Iudmlld3MuZ2V0KG9wLnhyZWYpITtcbiAgICAgICAgb3AudmFycyA9IGNoaWxkVmlldy52YXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERpZmZlcmVudCBvcGVyYXRpb25zIHRoYXQgaW1wbGVtZW50IGBpci5Vc2VzVmFyc1RyYWl0YCB1c2UgZGlmZmVyZW50IG51bWJlcnMgb2YgdmFyaWFibGVzLCBzb1xuICogY291bnQgdGhlIHZhcmlhYmxlcyB1c2VkIGJ5IGFueSBwYXJ0aWN1bGFyIGBvcGAuXG4gKi9cbmZ1bmN0aW9uIHZhcnNVc2VkQnlPcChvcDogKGlyLkNyZWF0ZU9wfGlyLlVwZGF0ZU9wKSZpci5Db25zdW1lc1ZhcnNUcmFpdCk6IG51bWJlciB7XG4gIGxldCBzbG90czogbnVtYmVyO1xuICBzd2l0Y2ggKG9wLmtpbmQpIHtcbiAgICBjYXNlIGlyLk9wS2luZC5Qcm9wZXJ0eTpcbiAgICBjYXNlIGlyLk9wS2luZC5Ib3N0UHJvcGVydHk6XG4gICAgY2FzZSBpci5PcEtpbmQuQXR0cmlidXRlOlxuICAgICAgLy8gQWxsIG9mIHRoZXNlIGJpbmRpbmdzIHVzZSAxIHZhcmlhYmxlIHNsb3QsIHBsdXMgMSBzbG90IGZvciBldmVyeSBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbixcbiAgICAgIC8vIGlmIGFueS5cbiAgICAgIHNsb3RzID0gMTtcbiAgICAgIGlmIChvcC5leHByZXNzaW9uIGluc3RhbmNlb2YgaXIuSW50ZXJwb2xhdGlvbiAmJiAhaXNTaW5nbGV0b25JbnRlcnBvbGF0aW9uKG9wLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIHNsb3RzICs9IG9wLmV4cHJlc3Npb24uZXhwcmVzc2lvbnMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNsb3RzO1xuICAgIGNhc2UgaXIuT3BLaW5kLlN0eWxlUHJvcDpcbiAgICBjYXNlIGlyLk9wS2luZC5DbGFzc1Byb3A6XG4gICAgY2FzZSBpci5PcEtpbmQuU3R5bGVNYXA6XG4gICAgY2FzZSBpci5PcEtpbmQuQ2xhc3NNYXA6XG4gICAgICAvLyBTdHlsZSAmIGNsYXNzIGJpbmRpbmdzIHVzZSAyIHZhcmlhYmxlIHNsb3RzLCBwbHVzIDEgc2xvdCBmb3IgZXZlcnkgaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24sXG4gICAgICAvLyBpZiBhbnkuXG4gICAgICBzbG90cyA9IDI7XG4gICAgICBpZiAob3AuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIGlyLkludGVycG9sYXRpb24pIHtcbiAgICAgICAgc2xvdHMgKz0gb3AuZXhwcmVzc2lvbi5leHByZXNzaW9ucy5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2xvdHM7XG4gICAgY2FzZSBpci5PcEtpbmQuSW50ZXJwb2xhdGVUZXh0OlxuICAgICAgLy8gYGlyLkludGVycG9sYXRlVGV4dE9wYHMgdXNlIGEgdmFyaWFibGUgc2xvdCBmb3IgZWFjaCBkeW5hbWljIGV4cHJlc3Npb24uXG4gICAgICByZXR1cm4gb3AuaW50ZXJwb2xhdGlvbi5leHByZXNzaW9ucy5sZW5ndGg7XG4gICAgY2FzZSBpci5PcEtpbmQuSTE4bkV4cHJlc3Npb246XG4gICAgY2FzZSBpci5PcEtpbmQuQ29uZGl0aW9uYWw6XG4gICAgICByZXR1cm4gMTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgb3A6ICR7aXIuT3BLaW5kW29wLmtpbmRdfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YXJzVXNlZEJ5SXJFeHByZXNzaW9uKGV4cHI6IGlyLkV4cHJlc3Npb24maXIuQ29uc3VtZXNWYXJzVHJhaXQpOiBudW1iZXIge1xuICBzd2l0Y2ggKGV4cHIua2luZCkge1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUHVyZUZ1bmN0aW9uRXhwcjpcbiAgICAgIHJldHVybiAxICsgZXhwci5hcmdzLmxlbmd0aDtcbiAgICBjYXNlIGlyLkV4cHJlc3Npb25LaW5kLlBpcGVCaW5kaW5nOlxuICAgICAgcmV0dXJuIDEgKyBleHByLmFyZ3MubGVuZ3RoO1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUGlwZUJpbmRpbmdWYXJpYWRpYzpcbiAgICAgIHJldHVybiAxICsgZXhwci5udW1BcmdzO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFzc2VydGlvbkVycm9yOiB1bmhhbmRsZWQgQ29uc3VtZXNWYXJzVHJhaXQgZXhwcmVzc2lvbiAke2V4cHIuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NpbmdsZXRvbkludGVycG9sYXRpb24oZXhwcjogaXIuSW50ZXJwb2xhdGlvbik6IGJvb2xlYW4ge1xuICBpZiAoZXhwci5leHByZXNzaW9ucy5sZW5ndGggIT09IDEgfHwgZXhwci5zdHJpbmdzLmxlbmd0aCAhPT0gMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZXhwci5zdHJpbmdzWzBdICE9PSAnJyB8fCBleHByLnN0cmluZ3NbMV0gIT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl19
|
|
@@ -25,8 +25,15 @@ import * as ir from '../../ir';
|
|
|
25
25
|
* To guarantee correctness, analysis of "fences" in the instruction lists is used to determine
|
|
26
26
|
* which optimizations are safe to perform.
|
|
27
27
|
*/
|
|
28
|
-
export function
|
|
28
|
+
export function optimizeVariables(job) {
|
|
29
29
|
for (const unit of job.units) {
|
|
30
|
+
inlineAlwaysInlineVariables(unit.create);
|
|
31
|
+
inlineAlwaysInlineVariables(unit.update);
|
|
32
|
+
for (const op of unit.create) {
|
|
33
|
+
if (op.kind === ir.OpKind.Listener) {
|
|
34
|
+
inlineAlwaysInlineVariables(op.handlerOps);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
30
37
|
optimizeVariablesInOpList(unit.create, job.compatibility);
|
|
31
38
|
optimizeVariablesInOpList(unit.update, job.compatibility);
|
|
32
39
|
for (const op of unit.create) {
|
|
@@ -60,7 +67,7 @@ var Fence;
|
|
|
60
67
|
* Note that all `ContextWrite` fences are implicitly `ContextRead` fences as operations which
|
|
61
68
|
* change the view context do so based on the current one.
|
|
62
69
|
*/
|
|
63
|
-
Fence[Fence["ViewContextWrite"] =
|
|
70
|
+
Fence[Fence["ViewContextWrite"] = 2] = "ViewContextWrite";
|
|
64
71
|
/**
|
|
65
72
|
* Indicates that a call is required for its side-effects, even if nothing reads its result.
|
|
66
73
|
*
|
|
@@ -69,6 +76,30 @@ var Fence;
|
|
|
69
76
|
*/
|
|
70
77
|
Fence[Fence["SideEffectful"] = 4] = "SideEffectful";
|
|
71
78
|
})(Fence || (Fence = {}));
|
|
79
|
+
function inlineAlwaysInlineVariables(ops) {
|
|
80
|
+
const vars = new Map();
|
|
81
|
+
for (const op of ops) {
|
|
82
|
+
if (op.kind === ir.OpKind.Variable && op.flags & ir.VariableFlags.AlwaysInline) {
|
|
83
|
+
ir.visitExpressionsInOp(op, expr => {
|
|
84
|
+
if (ir.isIrExpression(expr) && fencesForIrExpression(expr) !== Fence.None) {
|
|
85
|
+
throw new Error(`AssertionError: A context-sensitive variable was marked AlwaysInline`);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
vars.set(op.xref, op);
|
|
89
|
+
}
|
|
90
|
+
ir.transformExpressionsInOp(op, expr => {
|
|
91
|
+
if (expr instanceof ir.ReadVariableExpr && vars.has(expr.xref)) {
|
|
92
|
+
const varOp = vars.get(expr.xref);
|
|
93
|
+
// Inline by cloning, because we might inline into multiple places.
|
|
94
|
+
return varOp.initializer.clone();
|
|
95
|
+
}
|
|
96
|
+
return expr;
|
|
97
|
+
}, ir.VisitorContextFlag.None);
|
|
98
|
+
}
|
|
99
|
+
for (const op of vars.values()) {
|
|
100
|
+
ir.OpList.remove(op);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
72
103
|
/**
|
|
73
104
|
* Process a list of operations and optimize variables within that list.
|
|
74
105
|
*/
|
|
@@ -138,10 +169,15 @@ function optimizeVariablesInOpList(ops, compatibility) {
|
|
|
138
169
|
// Next, inline any remaining variables with exactly one usage.
|
|
139
170
|
const toInline = [];
|
|
140
171
|
for (const [id, count] of varUsages) {
|
|
172
|
+
const decl = varDecls.get(id);
|
|
173
|
+
const varInfo = opMap.get(decl);
|
|
141
174
|
// We can inline variables that:
|
|
142
|
-
// - are used once
|
|
175
|
+
// - are used exactly once, and
|
|
143
176
|
// - are not used remotely
|
|
144
|
-
|
|
177
|
+
// OR
|
|
178
|
+
// - are marked for always inlining
|
|
179
|
+
const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline);
|
|
180
|
+
if (count !== 1 || isAlwaysInline) {
|
|
145
181
|
// We can't inline this variable as it's used more than once.
|
|
146
182
|
continue;
|
|
147
183
|
}
|
|
@@ -157,6 +193,10 @@ function optimizeVariablesInOpList(ops, compatibility) {
|
|
|
157
193
|
// no future operation will make inlining legal.
|
|
158
194
|
const decl = varDecls.get(candidate);
|
|
159
195
|
const varInfo = opMap.get(decl);
|
|
196
|
+
const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline);
|
|
197
|
+
if (isAlwaysInline) {
|
|
198
|
+
throw new Error(`AssertionError: Found an 'AlwaysInline' variable after the always inlining pass.`);
|
|
199
|
+
}
|
|
160
200
|
// Scan operations following the variable declaration and look for the point where that variable
|
|
161
201
|
// is used. There should only be one usage given the precondition above.
|
|
162
202
|
for (let targetOp = decl.next; targetOp.kind !== ir.OpKind.ListEnd; targetOp = targetOp.next) {
|
|
@@ -207,9 +247,9 @@ function optimizeVariablesInOpList(ops, compatibility) {
|
|
|
207
247
|
function fencesForIrExpression(expr) {
|
|
208
248
|
switch (expr.kind) {
|
|
209
249
|
case ir.ExpressionKind.NextContext:
|
|
210
|
-
return Fence.ViewContextWrite;
|
|
250
|
+
return Fence.ViewContextRead | Fence.ViewContextWrite;
|
|
211
251
|
case ir.ExpressionKind.RestoreView:
|
|
212
|
-
return Fence.ViewContextWrite | Fence.SideEffectful;
|
|
252
|
+
return Fence.ViewContextRead | Fence.ViewContextWrite | Fence.SideEffectful;
|
|
213
253
|
case ir.ExpressionKind.Reference:
|
|
214
254
|
return Fence.ViewContextRead;
|
|
215
255
|
default:
|
|
@@ -377,4 +417,4 @@ function allowConservativeInlining(decl, target) {
|
|
|
377
417
|
return true;
|
|
378
418
|
}
|
|
379
419
|
}
|
|
380
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVfb3B0aW1pemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdmFyaWFibGVfb3B0aW1pemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0I7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEdBQW1CO0lBQzNELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtRQUM1Qix5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUxRCxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNsQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM3RDtTQUNGO0tBQ0Y7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxJQUFLLEtBNEJKO0FBNUJELFdBQUssS0FBSztJQUNSOztPQUVHO0lBQ0gsaUNBQVksQ0FBQTtJQUVaOzs7T0FHRztJQUNILHVEQUF1QixDQUFBO0lBRXZCOzs7Ozs7T0FNRztJQUNILHlEQUF3QixDQUFBO0lBRXhCOzs7OztPQUtHO0lBQ0gsbURBQXFCLENBQUE7QUFDdkIsQ0FB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c0M7SUFDdEYsaUdBQWlHO0lBQ2pHLHNCQUFzQjtJQUN0QixRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1FBQzFCLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDLFVBQVU7WUFDckMsSUFBSSxJQUFJLENBQUMsV0FBVyxZQUFZLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO2dCQUNoRix3RkFBd0Y7Z0JBQ3hGLHlGQUF5RjtnQkFDekYsMEZBQTBGO2dCQUMxRixhQUFhO2dCQUNiLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDLE9BQU87WUFDbEMsb0RBQW9EO1lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUM1QztZQUNFLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIE9wdGltaXplIHZhcmlhYmxlcyBkZWNsYXJlZCBhbmQgdXNlZCBpbiB0aGUgSVIuXG4gKlxuICogVmFyaWFibGVzIGFyZSBlYWdlcmx5IGdlbmVyYXRlZCBieSBwaXBlbGluZSBzdGFnZXMgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMgdGhhdCBjb3VsZCBiZVxuICogcmVmZXJlbmNlZC4gVGhpcyBzdGFnZSBwcm9jZXNzZXMgdGhlIGxpc3Qgb2YgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBhbGwgdmFyaWFibGUgdXNhZ2VzLFxuICogYW5kIG9wdGltaXplcyB3aGVyZSBwb3NzaWJsZS4gSXQgcGVyZm9ybXMgMyBtYWluIG9wdGltaXphdGlvbnM6XG4gKlxuICogICAqIEl0IHRyYW5zZm9ybXMgdmFyaWFibGUgZGVjbGFyYXRpb25zIHRvIHNpZGUgZWZmZWN0ZnVsIGV4cHJlc3Npb25zIHdoZW4gdGhlXG4gKiAgICAgdmFyaWFibGUgaXMgbm90IHVzZWQsIGJ1dCBpdHMgaW5pdGlhbGl6ZXIgaGFzIGdsb2JhbCBlZmZlY3RzIHdoaWNoIG90aGVyXG4gKiAgICAgb3BlcmF0aW9ucyByZWx5IHVwb24uXG4gKiAgICogSXQgcmVtb3ZlcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgaWYgdGhvc2UgdmFyaWFibGVzIGFyZSBub3QgcmVmZXJlbmNlZCBhbmRcbiAqICAgICBlaXRoZXIgdGhleSBkbyBub3QgaGF2ZSBnbG9iYWwgZWZmZWN0cywgb3Igbm90aGluZyByZWxpZXMgb24gdGhlbS5cbiAqICAgKiBJdCBpbmxpbmVzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyB3aGVuIHRob3NlIHZhcmlhYmxlcyBhcmUgb25seSB1c2VkIG9uY2VcbiAqICAgICBhbmQgdGhlIGlubGluaW5nIGlzIHNlbWFudGljYWxseSBzYWZlLlxuICpcbiAqIFRvIGd1YXJhbnRlZSBjb3JyZWN0bmVzcywgYW5hbHlzaXMgb2YgXCJmZW5jZXNcIiBpbiB0aGUgaW5zdHJ1Y3Rpb24gbGlzdHMgaXMgdXNlZCB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIG9wdGltaXphdGlvbnMgYXJlIHNhZmUgdG8gcGVyZm9ybS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBoYXNlVmFyaWFibGVPcHRpbWl6YXRpb24oam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgb3B0aW1pemVWYXJpYWJsZXNJbk9wTGlzdCh1bml0LmNyZWF0ZSwgam9iLmNvbXBhdGliaWxpdHkpO1xuICAgIG9wdGltaXplVmFyaWFibGVzSW5PcExpc3QodW5pdC51cGRhdGUsIGpvYi5jb21wYXRpYmlsaXR5KTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuTGlzdGVuZXIpIHtcbiAgICAgICAgb3B0aW1pemVWYXJpYWJsZXNJbk9wTGlzdChvcC5oYW5kbGVyT3BzLCBqb2IuY29tcGF0aWJpbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBbZmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01lbW9yeV9iYXJyaWVyKSBmbGFnIGZvciBhbiBleHByZXNzaW9uIHdoaWNoIGluZGljYXRlc1xuICogaG93IHRoYXQgZXhwcmVzc2lvbiBjYW4gYmUgb3B0aW1pemVkIGluIHJlbGF0aW9uIHRvIG90aGVyIGV4cHJlc3Npb25zIG9yIGluc3RydWN0aW9ucy5cbiAqXG4gKiBgRmVuY2VgcyBhcmUgYSBiaXRmaWVsZCwgc28gbXVsdGlwbGUgZmxhZ3MgbWF5IGJlIHNldCBvbiBhIHNpbmdsZSBleHByZXNzaW9uLlxuICovXG5lbnVtIEZlbmNlIHtcbiAgLyoqXG4gICAqIEVtcHR5IGZsYWcgKG5vIGZlbmNlIGV4aXN0cykuXG4gICAqL1xuICBOb25lID0gMGIwMDAsXG5cbiAgLyoqXG4gICAqIEEgY29udGV4dCByZWFkIGZlbmNlLCBtZWFuaW5nIHRoYXQgdGhlIGV4cHJlc3Npb24gaW4gcXVlc3Rpb24gcmVhZHMgZnJvbSB0aGUgXCJjdXJyZW50IHZpZXdcIlxuICAgKiBjb250ZXh0IG9mIHRoZSBydW50aW1lLlxuICAgKi9cbiAgVmlld0NvbnRleHRSZWFkID0gMGIwMDEsXG5cbiAgLyoqXG4gICAqIEEgY29udGV4dCB3cml0ZSBmZW5jZSwgbWVhbmluZyB0aGF0IHRoZSBleHByZXNzaW9uIGluIHF1ZXN0aW9uIHdyaXRlcyB0byB0aGUgXCJjdXJyZW50IHZpZXdcIlxuICAgKiBjb250ZXh0IG9mIHRoZSBydW50aW1lLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYWxsIGBDb250ZXh0V3JpdGVgIGZlbmNlcyBhcmUgaW1wbGljaXRseSBgQ29udGV4dFJlYWRgIGZlbmNlcyBhcyBvcGVyYXRpb25zIHdoaWNoXG4gICAqIGNoYW5nZSB0aGUgdmlldyBjb250ZXh0IGRvIHNvIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIFZpZXdDb250ZXh0V3JpdGUgPSAwYjAxMSxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgYSBjYWxsIGlzIHJlcXVpcmVkIGZvciBpdHMgc2lkZS1lZmZlY3RzLCBldmVuIGlmIG5vdGhpbmcgcmVhZHMgaXRzIHJlc3VsdC5cbiAgICpcbiAgICogVGhpcyBpcyBhbHNvIHRydWUgb2YgYFZpZXdDb250ZXh0V3JpdGVgIG9wZXJhdGlvbnMgKippZioqIHRoZXkgYXJlIGZvbGxvd2VkIGJ5IGFcbiAgICogYFZpZXdDb250ZXh0UmVhZGAuXG4gICAqL1xuICBTaWRlRWZmZWN0ZnVsID0gMGIxMDAsXG59XG5cbi8qKlxuICogU3VtbWFyeSBkYXRhIGNvbGxlY3RlZCBmb3IgZWFjaCBgT3BgIGluIGEgbGlzdC5cbiAqXG4gKiBUcmFja2luZyB0aGlzIGRhdGEgcGVyIG9wZXJhdGlvbiBhbGxvd3MgdGhlIG9wdGltaXplciB0byBwcm9jZXNzIG9wZXJhdGlvbnMgYXQgYSBoaWdoZXIgbGV2ZWxcbiAqIHRoYW4gYWx3YXlzIHNjYW5uaW5nIGV4cHJlc3Npb25zLlxuICovXG5pbnRlcmZhY2UgT3BJbmZvIHtcbiAgLyoqXG4gICAqIEEgYFNldGAgb2YgdmFyaWFibGVzIHJlZmVyZW5jZWQgYnkgZXhwcmVzc2lvbnMgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAqL1xuICB2YXJpYWJsZXNVc2VkOiBTZXQ8aXIuWHJlZklkPjtcblxuICAvKipcbiAgICogRmxhZ3MgaW5kaWNhdGluZyBhbnkgYEZlbmNlYHMgcHJlc2VudCBmb3IgdGhpcyBvcGVyYXRpb24uXG4gICAqL1xuICBmZW5jZXM6IEZlbmNlO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgYSBsaXN0IG9mIG9wZXJhdGlvbnMgYW5kIG9wdGltaXplIHZhcmlhYmxlcyB3aXRoaW4gdGhhdCBsaXN0LlxuICovXG5mdW5jdGlvbiBvcHRpbWl6ZVZhcmlhYmxlc0luT3BMaXN0KFxuICAgIG9wczogaXIuT3BMaXN0PGlyLkNyZWF0ZU9wfGlyLlVwZGF0ZU9wPiwgY29tcGF0aWJpbGl0eTogaXIuQ29tcGF0aWJpbGl0eU1vZGUpOiB2b2lkIHtcbiAgY29uc3QgdmFyRGVjbHMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgaXIuVmFyaWFibGVPcDxpci5DcmVhdGVPcHxpci5VcGRhdGVPcD4+KCk7XG4gIGNvbnN0IHZhclVzYWdlcyA9IG5ldyBNYXA8aXIuWHJlZklkLCBudW1iZXI+KCk7XG5cbiAgLy8gVHJhY2sgdmFyaWFibGVzIHRoYXQgYXJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhdGlvbiBsaXN0LiBGb3IgZXhhbXBsZSwgd2l0aGluXG4gIC8vIGBMaXN0ZW5lck9wYCBoYW5kbGVyIG9wZXJhdGlvbnMgb2YgbGlzdGVuZXJzIGluIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBsaXN0LlxuICBjb25zdCB2YXJSZW1vdGVVc2FnZXMgPSBuZXcgU2V0PGlyLlhyZWZJZD4oKTtcbiAgY29uc3Qgb3BNYXAgPSBuZXcgTWFwPGlyLkNyZWF0ZU9wfGlyLlVwZGF0ZU9wLCBPcEluZm8+KCk7XG5cbiAgLy8gRmlyc3QsIGV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgdmFyaWFibGVzIGRlY2xhcmVkIG9yIHVzZWQgd2l0aGluIHRoZSB3aG9sZSBsaXN0LlxuICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGUpIHtcbiAgICAgIGlmICh2YXJEZWNscy5oYXMob3AueHJlZikgfHwgdmFyVXNhZ2VzLmhhcyhvcC54cmVmKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNob3VsZCBub3Qgc2VlIHR3byBkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgdmFyaWFibGU6ICR7b3AueHJlZn1gKTtcbiAgICAgIH1cbiAgICAgIHZhckRlY2xzLnNldChvcC54cmVmLCBvcCk7XG4gICAgICB2YXJVc2FnZXMuc2V0KG9wLnhyZWYsIDApO1xuICAgIH1cblxuICAgIG9wTWFwLnNldChvcCwgY29sbGVjdE9wSW5mbyhvcCkpO1xuICAgIGNvdW50VmFyaWFibGVVc2FnZXMob3AsIHZhclVzYWdlcywgdmFyUmVtb3RlVXNhZ2VzKTtcbiAgfVxuXG4gIC8vIFRoZSBuZXh0IHN0ZXAgaXMgdG8gcmVtb3ZlIGFueSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCB1c2VkLiBUaGVcbiAgLy8gdmFyaWFibGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMgbWF5IGJlIHNpZGUtZWZmZWN0ZnVsLCBzbyB0aGV5IG1heSBuZWVkIHRvIGJlIHJldGFpbmVkIGFzXG4gIC8vIGV4cHJlc3Npb24gc3RhdGVtZW50cy5cblxuICAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIHNlZW4gYW4gb3BlcmF0aW9uIHdoaWNoIHJlYWRzIGZyb20gdGhlIHZpZXcgY29udGV4dCB5ZXQuIFRoaXMgaXMgdXNlZCB0b1xuICAvLyBkZXRlcm1pbmUgd2hldGhlciBhIHdyaXRlIHRvIHRoZSB2aWV3IGNvbnRleHQgaW4gYSB2YXJpYWJsZSBpbml0aWFsaXplciBjYW4gYmUgb2JzZXJ2ZWQuXG4gIGxldCBjb250ZXh0SXNVc2VkID0gZmFsc2U7XG5cbiAgLy8gTm90ZSB0aGF0IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsaXN0IGhhcHBlbnMgaW4gcmV2ZXJzZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHdlJ2xsIHByb2Nlc3NcbiAgLy8gYWxsIHJlYWRzIG9mIGEgdmFyaWFibGUgcHJpb3IgdG8gcHJvY2Vzc2luZyBpdHMgZGVjbGFyYXRpb24uXG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzLnJldmVyc2VkKCkpIHtcbiAgICBjb25zdCBvcEluZm8gPSBvcE1hcC5nZXQob3ApITtcblxuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGUgJiYgdmFyVXNhZ2VzLmdldChvcC54cmVmKSEgPT09IDApIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgdW51c2VkIGFuZCBjYW4gYmUgcmVtb3ZlZC4gV2UgbWlnaHQgbmVlZCB0byBrZWVwIHRoZSBpbml0aWFsaXplciBhcm91bmQsXG4gICAgICAvLyB0aG91Z2gsIGlmIHNvbWV0aGluZyBkZXBlbmRzIG9uIGl0IHJ1bm5pbmcuXG4gICAgICBpZiAoKGNvbnRleHRJc1VzZWQgJiYgb3BJbmZvLmZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0V3JpdGUpIHx8XG4gICAgICAgICAgKG9wSW5mby5mZW5jZXMgJiBGZW5jZS5TaWRlRWZmZWN0ZnVsKSkge1xuICAgICAgICAvLyBUaGlzIHZhcmlhYmxlIGluaXRpYWxpemVyIGhhcyBhIHNpZGUgZWZmZWN0IHdoaWNoIG11c3QgYmUgcmV0YWluZWQuIEVpdGhlcjpcbiAgICAgICAgLy8gICogaXQgd3JpdGVzIHRvIHRoZSB2aWV3IGNvbnRleHQsIGFuZCB3ZSBrbm93IHRoZXJlIGlzIGEgZnV0dXJlIG9wZXJhdGlvbiB3aGljaCBkZXBlbmRzXG4gICAgICAgIC8vICAgIG9uIHRoYXQgd3JpdGUsIG9yXG4gICAgICAgIC8vICAqIGl0J3MgYW4gb3BlcmF0aW9uIHdoaWNoIGlzIGluaGVyZW50bHkgc2lkZS1lZmZlY3RmdWwuXG4gICAgICAgIC8vIFdlIGNhbid0IHJlbW92ZSB0aGUgaW5pdGlhbGl6ZXIsIGJ1dCB3ZSBjYW4gcmVtb3ZlIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBpdHNlbGYgYW5kXG4gICAgICAgIC8vIHJlcGxhY2UgaXQgd2l0aCBhIHNpZGUtZWZmZWN0ZnVsIHN0YXRlbWVudC5cbiAgICAgICAgY29uc3Qgc3RtdE9wID0gaXIuY3JlYXRlU3RhdGVtZW50T3Aob3AuaW5pdGlhbGl6ZXIudG9TdG10KCkpIGFzIGlyLlVwZGF0ZU9wO1xuICAgICAgICBvcE1hcC5zZXQoc3RtdE9wLCBvcEluZm8pO1xuICAgICAgICBpci5PcExpc3QucmVwbGFjZShvcCBhcyBpci5VcGRhdGVPcCwgc3RtdE9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEl0J3Mgc2FmZSB0byBkZWxldGUgdGhpcyBlbnRpcmUgdmFyaWFibGUgZGVjbGFyYXRpb24gYXMgbm90aGluZyBkZXBlbmRzIG9uIGl0LCBldmVuXG4gICAgICAgIC8vIHNpZGUtZWZmZWN0ZnVsbHkuIE5vdGUgdGhhdCBkb2luZyB0aGlzIG1pZ2h0IG1ha2Ugb3RoZXIgdmFyaWFibGVzIHVudXNlZC4gU2luY2Ugd2UncmVcbiAgICAgICAgLy8gaXRlcmF0aW5nIGluIHJldmVyc2Ugb3JkZXIsIHdlIHNob3VsZCBhbHdheXMgYmUgcHJvY2Vzc2luZyB1c2FnZXMgYmVmb3JlIGRlY2xhcmF0aW9uc1xuICAgICAgICAvLyBhbmQgdGhlcmVmb3JlIGJ5IHRoZSB0aW1lIHdlIGdldCB0byBhIGRlY2xhcmF0aW9uLCBhbGwgcmVtb3ZhYmxlIHVzYWdlcyB3aWxsIGhhdmUgYmVlblxuICAgICAgICAvLyByZW1vdmVkLlxuICAgICAgICB1bmNvdW50VmFyaWFibGVVc2FnZXMob3AsIHZhclVzYWdlcyk7XG4gICAgICAgIGlyLk9wTGlzdC5yZW1vdmUob3AgYXMgaXIuVXBkYXRlT3ApO1xuICAgICAgfVxuXG4gICAgICBvcE1hcC5kZWxldGUob3ApO1xuICAgICAgdmFyRGVjbHMuZGVsZXRlKG9wLnhyZWYpO1xuICAgICAgdmFyVXNhZ2VzLmRlbGV0ZShvcC54cmVmKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERvZXMgdGhpcyBvcGVyYXRpb24gZGVwZW5kIG9uIHRoZSB2aWV3IGNvbnRleHQ/XG4gICAgaWYgKG9wSW5mby5mZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFJlYWQpIHtcbiAgICAgIGNvbnRleHRJc1VzZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5leHQsIGlubGluZSBhbnkgcmVtYWluaW5nIHZhcmlhYmxlcyB3aXRoIGV4YWN0bHkgb25lIHVzYWdlLlxuICBjb25zdCB0b0lubGluZTogaXIuWHJlZklkW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaWQsIGNvdW50XSBvZiB2YXJVc2FnZXMpIHtcbiAgICAvLyBXZSBjYW4gaW5saW5lIHZhcmlhYmxlcyB0aGF0OlxuICAgIC8vICAtIGFyZSB1c2VkIG9uY2VcbiAgICAvLyAgLSBhcmUgbm90IHVzZWQgcmVtb3RlbHlcbiAgICBpZiAoY291bnQgIT09IDEpIHtcbiAgICAgIC8vIFdlIGNhbid0IGlubGluZSB0aGlzIHZhcmlhYmxlIGFzIGl0J3MgdXNlZCBtb3JlIHRoYW4gb25jZS5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YXJSZW1vdGVVc2FnZXMuaGFzKGlkKSkge1xuICAgICAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIG9uY2UsIGJ1dCBhY3Jvc3MgYW4gb3BlcmF0aW9uIGJvdW5kYXJ5LCBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkLlxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdG9JbmxpbmUucHVzaChpZCk7XG4gIH1cblxuICBsZXQgY2FuZGlkYXRlOiBpci5YcmVmSWR8dW5kZWZpbmVkO1xuICB3aGlsZSAoY2FuZGlkYXRlID0gdG9JbmxpbmUucG9wKCkpIHtcbiAgICAvLyBXZSB3aWxsIGF0dGVtcHQgdG8gaW5saW5lIHRoaXMgdmFyaWFibGUuIElmIGlubGluaW5nIGZhaWxzIChkdWUgdG8gZmVuY2VzIGZvciBleGFtcGxlKSxcbiAgICAvLyBubyBmdXR1cmUgb3BlcmF0aW9uIHdpbGwgbWFrZSBpbmxpbmluZyBsZWdhbC5cbiAgICBjb25zdCBkZWNsID0gdmFyRGVjbHMuZ2V0KGNhbmRpZGF0ZSkhO1xuICAgIGNvbnN0IHZhckluZm8gPSBvcE1hcC5nZXQoZGVjbCBhcyBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wKSE7XG5cbiAgICAvLyBTY2FuIG9wZXJhdGlvbnMgZm9sbG93aW5nIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbmQgbG9vayBmb3IgdGhlIHBvaW50IHdoZXJlIHRoYXQgdmFyaWFibGVcbiAgICAvLyBpcyB1c2VkLiBUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgdXNhZ2UgZ2l2ZW4gdGhlIHByZWNvbmRpdGlvbiBhYm92ZS5cbiAgICBmb3IgKGxldCB0YXJnZXRPcCA9IGRlY2wubmV4dCE7IHRhcmdldE9wLmtpbmQgIT09IGlyLk9wS2luZC5MaXN0RW5kO1xuICAgICAgICAgdGFyZ2V0T3AgPSB0YXJnZXRPcC5uZXh0ISkge1xuICAgICAgY29uc3Qgb3BJbmZvID0gb3BNYXAuZ2V0KHRhcmdldE9wKSE7XG5cbiAgICAgIC8vIElzIHRoZSB2YXJpYWJsZSB1c2VkIGluIHRoaXMgb3BlcmF0aW9uP1xuICAgICAgaWYgKG9wSW5mby52YXJpYWJsZXNVc2VkLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIGlmIChjb21wYXRpYmlsaXR5ID09PSBpci5Db21wYXRpYmlsaXR5TW9kZS5UZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyICYmXG4gICAgICAgICAgICAhYWxsb3dDb25zZXJ2YXRpdmVJbmxpbmluZyhkZWNsLCB0YXJnZXRPcCkpIHtcbiAgICAgICAgICAvLyBXZSdyZSBpbiBjb25zZXJ2YXRpdmUgbW9kZSwgYW5kIHRoaXMgdmFyaWFibGUgaXMgbm90IGVsaWdpYmxlIGZvciBpbmxpbmluZyBpbnRvIHRoZVxuICAgICAgICAgIC8vIHRhcmdldCBvcGVyYXRpb24gaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWWVzLCB0cnkgdG8gaW5saW5lIGl0LiBJbmxpbmluZyBtYXkgbm90IGJlIHN1Y2Nlc3NmdWwgaWYgZmVuY2VzIGluIHRoaXMgb3BlcmF0aW9uIGJlZm9yZVxuICAgICAgICAvLyB0aGUgdmFyaWFibGUncyB1c2FnZSBjYW5ub3QgYmUgc2FmZWx5IGNyb3NzZWQuXG4gICAgICAgIGlmICh0cnlJbmxpbmVWYXJpYWJsZUluaXRpYWxpemVyKGNhbmRpZGF0ZSwgZGVjbC5pbml0aWFsaXplciwgdGFyZ2V0T3AsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAgIC8vIElubGluaW5nIHdhcyBzdWNjZXNzZnVsISBVcGRhdGUgdGhlIHRyYWNraW5nIHN0cnVjdHVyZXMgdG8gcmVmbGVjdCB0aGUgaW5saW5lZFxuICAgICAgICAgIC8vIHZhcmlhYmxlLlxuICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmRlbGV0ZShjYW5kaWRhdGUpO1xuXG4gICAgICAgICAgLy8gQWRkIGFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgdmFyaWFibGUncyBpbml0aWFsaXplciB0byBpdHMgbmV3IHVzYWdlIHNpdGUuXG4gICAgICAgICAgZm9yIChjb25zdCBpZCBvZiB2YXJJbmZvLnZhcmlhYmxlc1VzZWQpIHtcbiAgICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmFkZChpZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWVyZ2UgZmVuY2VzIGluIHRoZSB2YXJpYWJsZSdzIGluaXRpYWxpemVyIGludG8gaXRzIG5ldyB1c2FnZSBzaXRlLlxuICAgICAgICAgIG9wSW5mby5mZW5jZXMgfD0gdmFySW5mby5mZW5jZXM7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdHJhY2tpbmcgaW5mbyByZWxhdGVkIHRvIHRoZSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICB2YXJEZWNscy5kZWxldGUoY2FuZGlkYXRlKTtcbiAgICAgICAgICB2YXJVc2FnZXMuZGVsZXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgb3BNYXAuZGVsZXRlKGRlY2wgYXMgaXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcCk7XG5cbiAgICAgICAgICAvLyBBbmQgZmluYWxseSwgZGVsZXRlIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBvcGVyYXRpb24gbGlzdC5cbiAgICAgICAgICBpci5PcExpc3QucmVtb3ZlKGRlY2wgYXMgaXIuVXBkYXRlT3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hldGhlciBpbmxpbmluZyBzdWNjZWVkZWQgb3IgZmFpbGVkLCB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB2YXJpYWJsZSBpcyBub3QgdXNlZCBpbiB0aGlzIG9wZXJhdGlvbiwgdGhlbiB3ZSdkIG5lZWQgdG8gaW5saW5lIGFjcm9zcyBpdC4gQ2hlY2sgaWZcbiAgICAgIC8vIHRoYXQncyBzYWZlIHRvIGRvLlxuICAgICAgaWYgKCFzYWZlVG9JbmxpbmVQYXN0RmVuY2VzKG9wSW5mby5mZW5jZXMsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAvLyBXZSBjYW4ndCBzYWZlbHkgaW5saW5lIHRoaXMgdmFyaWFibGUgYmV5b25kIHRoaXMgb3BlcmF0aW9uLCBzbyBkb24ndCBwcm9jZWVkIHdpdGhcbiAgICAgICAgLy8gaW5saW5pbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYGlyLkV4cHJlc3Npb25gLCByZXR1cm5zIHRoZSBgRmVuY2VgIGZsYWdzIGZvciB0aGF0IGV4cHJlc3Npb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gZmVuY2VzRm9ySXJFeHByZXNzaW9uKGV4cHI6IGlyLkV4cHJlc3Npb24pOiBGZW5jZSB7XG4gIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5OZXh0Q29udGV4dDpcbiAgICAgIHJldHVybiBGZW5jZS5WaWV3Q29udGV4dFdyaXRlO1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVzdG9yZVZpZXc6XG4gICAgICByZXR1cm4gRmVuY2UuVmlld0NvbnRleHRXcml0ZSB8IEZlbmNlLlNpZGVFZmZlY3RmdWw7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5SZWZlcmVuY2U6XG4gICAgICByZXR1cm4gRmVuY2UuVmlld0NvbnRleHRSZWFkO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRmVuY2UuTm9uZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgT3BJbmZvYCBzdHJ1Y3R1cmUgZm9yIHRoZSBnaXZlbiBgb3BgLiBUaGlzIHBlcmZvcm1zIHR3byBvcGVyYXRpb25zOlxuICpcbiAqICAqIEl0IHRyYWNrcyB3aGljaCB2YXJpYWJsZXMgYXJlIHVzZWQgaW4gdGhlIG9wZXJhdGlvbidzIGV4cHJlc3Npb25zLlxuICogICogSXQgcm9sbHMgdXAgZmVuY2UgZmxhZ3MgZm9yIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgb3BlcmF0aW9uLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0T3BJbmZvKG9wOiBpci5DcmVhdGVPcHxpci5VcGRhdGVPcCk6IE9wSW5mbyB7XG4gIGxldCBmZW5jZXMgPSBGZW5jZS5Ob25lO1xuICBjb25zdCB2YXJpYWJsZXNVc2VkID0gbmV3IFNldDxpci5YcmVmSWQ+KCk7XG4gIGlyLnZpc2l0RXhwcmVzc2lvbnNJbk9wKG9wLCBleHByID0+IHtcbiAgICBpZiAoIWlyLmlzSXJFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICB2YXJpYWJsZXNVc2VkLmFkZChleHByLnhyZWYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZlbmNlcyB8PSBmZW5jZXNGb3JJckV4cHJlc3Npb24oZXhwcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtmZW5jZXMsIHZhcmlhYmxlc1VzZWR9O1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgdXNhZ2VzIG9mIGVhY2ggdmFyaWFibGUsIGJlaW5nIGNhcmVmdWwgdG8gdHJhY2sgd2hldGhlciB0aG9zZSB1c2FnZXMgYXJlXG4gKiBsb2NhbCBvciByZW1vdGUuXG4gKi9cbmZ1bmN0aW9uIGNvdW50VmFyaWFibGVVc2FnZXMoXG4gICAgb3A6IGlyLkNyZWF0ZU9wfGlyLlVwZGF0ZU9wLCB2YXJVc2FnZXM6IE1hcDxpci5YcmVmSWQsIG51bWJlcj4sXG4gICAgdmFyUmVtb3RlVXNhZ2U6IFNldDxpci5YcmVmSWQ+KTogdm9pZCB7XG4gIGlyLnZpc2l0RXhwcmVzc2lvbnNJbk9wKG9wLCAoZXhwciwgZmxhZ3MpID0+IHtcbiAgICBpZiAoIWlyLmlzSXJFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4cHIua2luZCAhPT0gaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSB2YXJVc2FnZXMuZ2V0KGV4cHIueHJlZik7XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3V0c2lkZSB0aGUgY3VycmVudCBzY29wZSBvZiBvcHRpbWl6YXRpb24uXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhclVzYWdlcy5zZXQoZXhwci54cmVmLCBjb3VudCArIDEpO1xuXG4gICAgaWYgKGZsYWdzICYgaXIuVmlzaXRvckNvbnRleHRGbGFnLkluQ2hpbGRPcGVyYXRpb24pIHtcbiAgICAgIHZhclJlbW90ZVVzYWdlLmFkZChleHByLnhyZWYpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHVzYWdlcyBvZiBhIHZhcmlhYmxlIGluIGBvcGAgZnJvbSB0aGUgYHZhclVzYWdlc2AgdHJhY2tpbmcuXG4gKi9cbmZ1bmN0aW9uIHVuY291bnRWYXJpYWJsZVVzYWdlcyhcbiAgICBvcDogaXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3AsIHZhclVzYWdlczogTWFwPGlyLlhyZWZJZCwgbnVtYmVyPik6IHZvaWQge1xuICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgZXhwciA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleHByLmtpbmQgIT09IGlyLkV4cHJlc3Npb25LaW5kLlJlYWRWYXJpYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdmFyVXNhZ2VzLmdldChleHByLnhyZWYpO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGN1cnJlbnQgc2NvcGUgb2Ygb3B0aW1pemF0aW9uLlxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5hY2N1cmF0ZSB2YXJpYWJsZSBjb3VudDogJHtleHByLnhyZWZ9IC0gZm91bmQgYW5vdGhlciByZWFkIGJ1dCBjb3VudCBpcyBhbHJlYWR5IDBgKTtcbiAgICB9XG4gICAgdmFyVXNhZ2VzLnNldChleHByLnhyZWYsIGNvdW50IC0gMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGl0J3Mgc2FmZSB0byBpbmxpbmUgYSB2YXJpYWJsZSBhY3Jvc3MgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmVuY2VzIHRoZSBmZW5jZXMgb2YgdGhlIG9wZXJhdGlvbiB3aGljaCB0aGUgaW5saW5pbmcgd2lsbCBjcm9zc1xuICogQHBhcmFtIGRlY2xGZW5jZXMgdGhlIGZlbmNlcyBvZiB0aGUgdmFyaWFibGUgYmVpbmcgaW5saW5lZC5cbiAqL1xuZnVuY3Rpb24gc2FmZVRvSW5saW5lUGFzdEZlbmNlcyhmZW5jZXM6IEZlbmNlLCBkZWNsRmVuY2VzOiBGZW5jZSk6IGJvb2xlYW4ge1xuICBpZiAoZmVuY2VzICYgRmVuY2UuVmlld0NvbnRleHRXcml0ZSkge1xuICAgIC8vIEl0J3Mgbm90IHNhZmUgdG8gaW5saW5lIGNvbnRleHQgcmVhZHMgYWNyb3NzIGNvbnRleHQgd3JpdGVzLlxuICAgIGlmIChkZWNsRmVuY2VzICYgRmVuY2UuVmlld0NvbnRleHRSZWFkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZCkge1xuICAgIC8vIEl0J3Mgbm90IHNhZmUgdG8gaW5saW5lIGNvbnRleHQgd3JpdGVzIGFjcm9zcyBjb250ZXh0IHJlYWRzLlxuICAgIGlmIChkZWNsRmVuY2VzICYgRmVuY2UuVmlld0NvbnRleHRXcml0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIGlubGluZSB0aGUgaW5pdGlhbGl6ZXIgb2YgYSB2YXJpYWJsZSBpbnRvIGEgdGFyZ2V0IG9wZXJhdGlvbidzIGV4cHJlc3Npb25zLlxuICpcbiAqIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgc2FmZSB0byBkby4gRm9yIGV4YW1wbGUsIHRoZSB2YXJpYWJsZSBjb3VsZCBiZSByZWFkIGZvbGxvd2luZyB0aGVcbiAqIGV4ZWN1dGlvbiBvZiBhbiBleHByZXNzaW9uIHdpdGggZmVuY2VzIHRoYXQgZG9uJ3QgcGVybWl0IHRoZSB2YXJpYWJsZSB0byBiZSBpbmxpbmVkIGFjcm9zcyB0aGVtLlxuICovXG5mdW5jdGlvbiB0cnlJbmxpbmVWYXJpYWJsZUluaXRpYWxpemVyKFxuICAgIGlkOiBpci5YcmVmSWQsIGluaXRpYWxpemVyOiBvLkV4cHJlc3Npb24sIHRhcmdldDogaXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3AsXG4gICAgZGVjbEZlbmNlczogRmVuY2UpOiBib29sZWFuIHtcbiAgLy8gV2UgdXNlIGBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3BgIHRvIHdhbGsgdGhlIGV4cHJlc3Npb25zIGFuZCBpbmxpbmUgdGhlIHZhcmlhYmxlIGlmXG4gIC8vIHBvc3NpYmxlLiBTaW5jZSB0aGlzIG9wZXJhdGlvbiBpcyBjYWxsYmFjay1iYXNlZCwgb25jZSBpbmxpbmluZyBzdWNjZWVkcyBvciBmYWlscyB3ZSBjYW4ndFxuICAvLyBcInN0b3BcIiB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLCBhbmQgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaW5saW5pbmcgaGFzIHN1Y2NlZWRlZCBvclxuICAvLyBpcyBubyBsb25nZXIgYWxsb3dlZC5cbiAgbGV0IGlubGluZWQgPSBmYWxzZTtcbiAgbGV0IGlubGluaW5nQWxsb3dlZCA9IHRydWU7XG5cbiAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKHRhcmdldCwgKGV4cHIsIGZsYWdzKSA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgaWYgKGlubGluZWQgfHwgIWlubGluaW5nQWxsb3dlZCkge1xuICAgICAgLy8gRWl0aGVyIHRoZSBpbmxpbmluZyBoYXMgYWxyZWFkeSBzdWNjZWVkZWQsIG9yIHdlJ3ZlIHBhc3NlZCBhIGZlbmNlIHRoYXQgZGlzYWxsb3dzIGlubGluaW5nXG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCBzbyBkb24ndCB0cnkuXG4gICAgICByZXR1cm4gZXhwcjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoZmxhZ3MgJiBpci5WaXNpdG9yQ29udGV4dEZsYWcuSW5DaGlsZE9wZXJhdGlvbikgJiYgKGRlY2xGZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFJlYWQpKSB7XG4gICAgICAvLyBXZSBjYW5ub3QgaW5saW5lIHZhcmlhYmxlcyB0aGF0IGFyZSBzZW5zaXRpdmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dCBhY3Jvc3Mgb3BlcmF0aW9uXG4gICAgICAvLyBib3VuZGFyaWVzLlxuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICBpZiAoZXhwci54cmVmID09PSBpZCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHVzYWdlIHNpdGUgb2YgdGhlIHZhcmlhYmxlLiBTaW5jZSBub3RoaW5nIGhhcyBkaXNhbGxvd2VkIGlubGluaW5nLCBpdCdzXG4gICAgICAgICAgLy8gc2FmZSB0byBpbmxpbmUgdGhlIGluaXRpYWxpemVyIGhlcmUuXG4gICAgICAgICAgaW5saW5lZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemVyO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRm9yIG90aGVyIHR5cGVzIG9mIGBpci5FeHByZXNzaW9uYHMsIHdoZXRoZXIgaW5saW5pbmcgaXMgYWxsb3dlZCBkZXBlbmRzIG9uIHRoZWlyIGZlbmNlcy5cbiAgICAgICAgY29uc3QgZXhwckZlbmNlcyA9IGZlbmNlc0ZvcklyRXhwcmVzc2lvbihleHByKTtcbiAgICAgICAgaW5saW5pbmdBbGxvd2VkID0gaW5saW5pbmdBbGxvd2VkICYmIHNhZmVUb0lubGluZVBhc3RGZW5jZXMoZXhwckZlbmNlcywgZGVjbEZlbmNlcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfSwgaXIuVmlzaXRvckNvbnRleHRGbGFnLk5vbmUpO1xuICByZXR1cm4gaW5saW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgaW5saW5pbmcgb2YgYGRlY2xgIHNob3VsZCBiZSBhbGxvd2VkIGluIFwiY29uc2VydmF0aXZlXCIgbW9kZS5cbiAqXG4gKiBJbiBjb25zZXJ2YXRpdmUgbW9kZSwgaW5saW5pbmcgYmVoYXZpb3IgaXMgbGltaXRlZCB0byB0aG9zZSBvcGVyYXRpb25zIHdoaWNoIHRoZVxuICogYFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXJgIHN1cHBvcnRlZCwgd2l0aCB0aGUgZ29hbCBvZiBwcm9kdWNpbmcgZXF1aXZhbGVudCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGFsbG93Q29uc2VydmF0aXZlSW5saW5pbmcoXG4gICAgZGVjbDogaXIuVmFyaWFibGVPcDxpci5DcmVhdGVPcHxpci5VcGRhdGVPcD4sIHRhcmdldDogaXIuT3A8aXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3A+KTogYm9vbGVhbiB7XG4gIC8vIFRPRE8oYWx4aHViKTogdW5kZXJzdGFuZCBleGFjdGx5IGhvdyBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyIGFwcHJvYWNoZXMgaW5saW5pbmcsIGFuZCByZWNvcmRcbiAgLy8gdGhhdCBiZWhhdmlvciBoZXJlLlxuICBzd2l0Y2ggKGRlY2wudmFyaWFibGUua2luZCkge1xuICAgIGNhc2UgaXIuU2VtYW50aWNWYXJpYWJsZUtpbmQuSWRlbnRpZmllcjpcbiAgICAgIGlmIChkZWNsLmluaXRpYWxpemVyIGluc3RhbmNlb2Ygby5SZWFkVmFyRXhwciAmJiBkZWNsLmluaXRpYWxpemVyLm5hbWUgPT09ICdjdHgnKSB7XG4gICAgICAgIC8vIEFsdGhvdWdoIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgaXMgY2F1dGlvdXMgYWJvdXQgaW5saW5pbmcsIHdlIHN0aWxsIHdhbnQgdG8gZG8gc29cbiAgICAgICAgLy8gd2hlbiB0aGUgdmFyaWFibGUgaXMgdGhlIGNvbnRleHQsIHRvIGltaXRhdGUgaXRzIGJlaGF2aW9yIHdpdGggYWxpYXNlcyBpbiBjb250cm9sIGZsb3dcbiAgICAgICAgLy8gYmxvY2tzLiBUaGlzIHF1aXJreSBiZWhhdmlvciB3aWxsIGJlY29tZSBkZWFkIGNvZGUgb25jZSBjb21wYXRpYmlsaXR5IG1vZGUgaXMgbm8gbG9uZ2VyXG4gICAgICAgIC8vIHN1cHBvcnRlZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBpci5TZW1hbnRpY1ZhcmlhYmxlS2luZC5Db250ZXh0OlxuICAgICAgLy8gQ29udGV4dCBjYW4gb25seSBiZSBpbmxpbmVkIGludG8gb3RoZXIgdmFyaWFibGVzLlxuICAgICAgcmV0dXJuIHRhcmdldC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|
|
420
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVfb3B0aW1pemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdmFyaWFibGVfb3B0aW1pemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0I7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQW1CO0lBQ25ELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtRQUM1QiwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM1QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM1QztTQUNGO1FBRUQseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFMUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzVCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDbEMseUJBQXlCLENBQUMs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Q0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO2dCQUNoRix3RkFBd0Y7Z0JBQ3hGLHlGQUF5RjtnQkFDekYsMEZBQTBGO2dCQUMxRixhQUFhO2dCQUNiLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDLE9BQU87WUFDbEMsb0RBQW9EO1lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUM1QztZQUNFLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIE9wdGltaXplIHZhcmlhYmxlcyBkZWNsYXJlZCBhbmQgdXNlZCBpbiB0aGUgSVIuXG4gKlxuICogVmFyaWFibGVzIGFyZSBlYWdlcmx5IGdlbmVyYXRlZCBieSBwaXBlbGluZSBzdGFnZXMgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMgdGhhdCBjb3VsZCBiZVxuICogcmVmZXJlbmNlZC4gVGhpcyBzdGFnZSBwcm9jZXNzZXMgdGhlIGxpc3Qgb2YgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBhbGwgdmFyaWFibGUgdXNhZ2VzLFxuICogYW5kIG9wdGltaXplcyB3aGVyZSBwb3NzaWJsZS4gSXQgcGVyZm9ybXMgMyBtYWluIG9wdGltaXphdGlvbnM6XG4gKlxuICogICAqIEl0IHRyYW5zZm9ybXMgdmFyaWFibGUgZGVjbGFyYXRpb25zIHRvIHNpZGUgZWZmZWN0ZnVsIGV4cHJlc3Npb25zIHdoZW4gdGhlXG4gKiAgICAgdmFyaWFibGUgaXMgbm90IHVzZWQsIGJ1dCBpdHMgaW5pdGlhbGl6ZXIgaGFzIGdsb2JhbCBlZmZlY3RzIHdoaWNoIG90aGVyXG4gKiAgICAgb3BlcmF0aW9ucyByZWx5IHVwb24uXG4gKiAgICogSXQgcmVtb3ZlcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgaWYgdGhvc2UgdmFyaWFibGVzIGFyZSBub3QgcmVmZXJlbmNlZCBhbmRcbiAqICAgICBlaXRoZXIgdGhleSBkbyBub3QgaGF2ZSBnbG9iYWwgZWZmZWN0cywgb3Igbm90aGluZyByZWxpZXMgb24gdGhlbS5cbiAqICAgKiBJdCBpbmxpbmVzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyB3aGVuIHRob3NlIHZhcmlhYmxlcyBhcmUgb25seSB1c2VkIG9uY2VcbiAqICAgICBhbmQgdGhlIGlubGluaW5nIGlzIHNlbWFudGljYWxseSBzYWZlLlxuICpcbiAqIFRvIGd1YXJhbnRlZSBjb3JyZWN0bmVzcywgYW5hbHlzaXMgb2YgXCJmZW5jZXNcIiBpbiB0aGUgaW5zdHJ1Y3Rpb24gbGlzdHMgaXMgdXNlZCB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIG9wdGltaXphdGlvbnMgYXJlIHNhZmUgdG8gcGVyZm9ybS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGltaXplVmFyaWFibGVzKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGlubGluZUFsd2F5c0lubGluZVZhcmlhYmxlcyh1bml0LmNyZWF0ZSk7XG4gICAgaW5saW5lQWx3YXlzSW5saW5lVmFyaWFibGVzKHVuaXQudXBkYXRlKTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuTGlzdGVuZXIpIHtcbiAgICAgICAgaW5saW5lQWx3YXlzSW5saW5lVmFyaWFibGVzKG9wLmhhbmRsZXJPcHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9wdGltaXplVmFyaWFibGVzSW5PcExpc3QodW5pdC5jcmVhdGUsIGpvYi5jb21wYXRpYmlsaXR5KTtcbiAgICBvcHRpbWl6ZVZhcmlhYmxlc0luT3BMaXN0KHVuaXQudXBkYXRlLCBqb2IuY29tcGF0aWJpbGl0eSk7XG5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLkxpc3RlbmVyKSB7XG4gICAgICAgIG9wdGltaXplVmFyaWFibGVzSW5PcExpc3Qob3AuaGFuZGxlck9wcywgam9iLmNvbXBhdGliaWxpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgW2ZlbmNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZW1vcnlfYmFycmllcikgZmxhZyBmb3IgYW4gZXhwcmVzc2lvbiB3aGljaCBpbmRpY2F0ZXNcbiAqIGhvdyB0aGF0IGV4cHJlc3Npb24gY2FuIGJlIG9wdGltaXplZCBpbiByZWxhdGlvbiB0byBvdGhlciBleHByZXNzaW9ucyBvciBpbnN0cnVjdGlvbnMuXG4gKlxuICogYEZlbmNlYHMgYXJlIGEgYml0ZmllbGQsIHNvIG11bHRpcGxlIGZsYWdzIG1heSBiZSBzZXQgb24gYSBzaW5nbGUgZXhwcmVzc2lvbi5cbiAqL1xuZW51bSBGZW5jZSB7XG4gIC8qKlxuICAgKiBFbXB0eSBmbGFnIChubyBmZW5jZSBleGlzdHMpLlxuICAgKi9cbiAgTm9uZSA9IDBiMDAwLFxuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgcmVhZCBmZW5jZSwgbWVhbmluZyB0aGF0IHRoZSBleHByZXNzaW9uIGluIHF1ZXN0aW9uIHJlYWRzIGZyb20gdGhlIFwiY3VycmVudCB2aWV3XCJcbiAgICogY29udGV4dCBvZiB0aGUgcnVudGltZS5cbiAgICovXG4gIFZpZXdDb250ZXh0UmVhZCA9IDBiMDAxLFxuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgd3JpdGUgZmVuY2UsIG1lYW5pbmcgdGhhdCB0aGUgZXhwcmVzc2lvbiBpbiBxdWVzdGlvbiB3cml0ZXMgdG8gdGhlIFwiY3VycmVudCB2aWV3XCJcbiAgICogY29udGV4dCBvZiB0aGUgcnVudGltZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IGFsbCBgQ29udGV4dFdyaXRlYCBmZW5jZXMgYXJlIGltcGxpY2l0bHkgYENvbnRleHRSZWFkYCBmZW5jZXMgYXMgb3BlcmF0aW9ucyB3aGljaFxuICAgKiBjaGFuZ2UgdGhlIHZpZXcgY29udGV4dCBkbyBzbyBiYXNlZCBvbiB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBWaWV3Q29udGV4dFdyaXRlID0gMGIwMTAsXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IGEgY2FsbCBpcyByZXF1aXJlZCBmb3IgaXRzIHNpZGUtZWZmZWN0cywgZXZlbiBpZiBub3RoaW5nIHJlYWRzIGl0cyByZXN1bHQuXG4gICAqXG4gICAqIFRoaXMgaXMgYWxzbyB0cnVlIG9mIGBWaWV3Q29udGV4dFdyaXRlYCBvcGVyYXRpb25zICoqaWYqKiB0aGV5IGFyZSBmb2xsb3dlZCBieSBhXG4gICAqIGBWaWV3Q29udGV4dFJlYWRgLlxuICAgKi9cbiAgU2lkZUVmZmVjdGZ1bCA9IDBiMTAwLFxufVxuXG4vKipcbiAqIFN1bW1hcnkgZGF0YSBjb2xsZWN0ZWQgZm9yIGVhY2ggYE9wYCBpbiBhIGxpc3QuXG4gKlxuICogVHJhY2tpbmcgdGhpcyBkYXRhIHBlciBvcGVyYXRpb24gYWxsb3dzIHRoZSBvcHRpbWl6ZXIgdG8gcHJvY2VzcyBvcGVyYXRpb25zIGF0IGEgaGlnaGVyIGxldmVsXG4gKiB0aGFuIGFsd2F5cyBzY2FubmluZyBleHByZXNzaW9ucy5cbiAqL1xuaW50ZXJmYWNlIE9wSW5mbyB7XG4gIC8qKlxuICAgKiBBIGBTZXRgIG9mIHZhcmlhYmxlcyByZWZlcmVuY2VkIGJ5IGV4cHJlc3Npb25zIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgKi9cbiAgdmFyaWFibGVzVXNlZDogU2V0PGlyLlhyZWZJZD47XG5cbiAgLyoqXG4gICAqIEZsYWdzIGluZGljYXRpbmcgYW55IGBGZW5jZWBzIHByZXNlbnQgZm9yIHRoaXMgb3BlcmF0aW9uLlxuICAgKi9cbiAgZmVuY2VzOiBGZW5jZTtcbn1cblxuZnVuY3Rpb24gaW5saW5lQWx3YXlzSW5saW5lVmFyaWFibGVzKG9wczogaXIuT3BMaXN0PGlyLkNyZWF0ZU9wfGlyLlVwZGF0ZU9wPik6IHZvaWQge1xuICBjb25zdCB2YXJzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLlZhcmlhYmxlT3A8aXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3A+PigpO1xuICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGUgJiYgb3AuZmxhZ3MgJiBpci5WYXJpYWJsZUZsYWdzLkFsd2F5c0lubGluZSkge1xuICAgICAgaXIudmlzaXRFeHByZXNzaW9uc0luT3Aob3AsIGV4cHIgPT4ge1xuICAgICAgICBpZiAoaXIuaXNJckV4cHJlc3Npb24oZXhwcikgJiYgZmVuY2VzRm9ySXJFeHByZXNzaW9uKGV4cHIpICE9PSBGZW5jZS5Ob25lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NlcnRpb25FcnJvcjogQSBjb250ZXh0LXNlbnNpdGl2ZSB2YXJpYWJsZSB3YXMgbWFya2VkIEFsd2F5c0lubGluZWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhcnMuc2V0KG9wLnhyZWYsIG9wKTtcbiAgICB9XG5cbiAgICBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3Aob3AsIGV4cHIgPT4ge1xuICAgICAgaWYgKGV4cHIgaW5zdGFuY2VvZiBpci5SZWFkVmFyaWFibGVFeHByICYmIHZhcnMuaGFzKGV4cHIueHJlZikpIHtcbiAgICAgICAgY29uc3QgdmFyT3AgPSB2YXJzLmdldChleHByLnhyZWYpITtcbiAgICAgICAgLy8gSW5saW5lIGJ5IGNsb25pbmcsIGJlY2F1c2Ugd2UgbWlnaHQgaW5saW5lIGludG8gbXVsdGlwbGUgcGxhY2VzLlxuICAgICAgICByZXR1cm4gdmFyT3AuaW5pdGlhbGl6ZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHByO1xuICAgIH0sIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgb3Agb2YgdmFycy52YWx1ZXMoKSkge1xuICAgIGlyLk9wTGlzdC5yZW1vdmUob3AgYXMgaXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzIGEgbGlzdCBvZiBvcGVyYXRpb25zIGFuZCBvcHRpbWl6ZSB2YXJpYWJsZXMgd2l0aGluIHRoYXQgbGlzdC5cbiAqL1xuZnVuY3Rpb24gb3B0aW1pemVWYXJpYWJsZXNJbk9wTGlzdChcbiAgICBvcHM6IGlyLk9wTGlzdDxpci5DcmVhdGVPcHxpci5VcGRhdGVPcD4sIGNvbXBhdGliaWxpdHk6IGlyLkNvbXBhdGliaWxpdHlNb2RlKTogdm9pZCB7XG4gIGNvbnN0IHZhckRlY2xzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLlZhcmlhYmxlT3A8aXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3A+PigpO1xuICBjb25zdCB2YXJVc2FnZXMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgbnVtYmVyPigpO1xuXG4gIC8vIFRyYWNrIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIG91dHNpZGUgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYXRpb24gbGlzdC4gRm9yIGV4YW1wbGUsIHdpdGhpblxuICAvLyBgTGlzdGVuZXJPcGAgaGFuZGxlciBvcGVyYXRpb25zIG9mIGxpc3RlbmVycyBpbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbGlzdC5cbiAgY29uc3QgdmFyUmVtb3RlVXNhZ2VzID0gbmV3IFNldDxpci5YcmVmSWQ+KCk7XG4gIGNvbnN0IG9wTWFwID0gbmV3IE1hcDxpci5DcmVhdGVPcHxpci5VcGRhdGVPcCwgT3BJbmZvPigpO1xuXG4gIC8vIEZpcnN0LCBleHRyYWN0IGluZm9ybWF0aW9uIGFib3V0IHZhcmlhYmxlcyBkZWNsYXJlZCBvciB1c2VkIHdpdGhpbiB0aGUgd2hvbGUgbGlzdC5cbiAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLlZhcmlhYmxlKSB7XG4gICAgICBpZiAodmFyRGVjbHMuaGFzKG9wLnhyZWYpIHx8IHZhclVzYWdlcy5oYXMob3AueHJlZikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaG91bGQgbm90IHNlZSB0d28gZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lIHZhcmlhYmxlOiAke29wLnhyZWZ9YCk7XG4gICAgICB9XG4gICAgICB2YXJEZWNscy5zZXQob3AueHJlZiwgb3ApO1xuICAgICAgdmFyVXNhZ2VzLnNldChvcC54cmVmLCAwKTtcbiAgICB9XG5cbiAgICBvcE1hcC5zZXQob3AsIGNvbGxlY3RPcEluZm8ob3ApKTtcbiAgICBjb3VudFZhcmlhYmxlVXNhZ2VzKG9wLCB2YXJVc2FnZXMsIHZhclJlbW90ZVVzYWdlcyk7XG4gIH1cblxuICAvLyBUaGUgbmV4dCBzdGVwIGlzIHRvIHJlbW92ZSBhbnkgdmFyaWFibGUgZGVjbGFyYXRpb25zIGZvciB2YXJpYWJsZXMgdGhhdCBhcmVuJ3QgdXNlZC4gVGhlXG4gIC8vIHZhcmlhYmxlIGluaXRpYWxpemVyIGV4cHJlc3Npb25zIG1heSBiZSBzaWRlLWVmZmVjdGZ1bCwgc28gdGhleSBtYXkgbmVlZCB0byBiZSByZXRhaW5lZCBhc1xuICAvLyBleHByZXNzaW9uIHN0YXRlbWVudHMuXG5cbiAgLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBzZWVuIGFuIG9wZXJhdGlvbiB3aGljaCByZWFkcyBmcm9tIHRoZSB2aWV3IGNvbnRleHQgeWV0LiBUaGlzIGlzIHVzZWQgdG9cbiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgYSB3cml0ZSB0byB0aGUgdmlldyBjb250ZXh0IGluIGEgdmFyaWFibGUgaW5pdGlhbGl6ZXIgY2FuIGJlIG9ic2VydmVkLlxuICBsZXQgY29udGV4dElzVXNlZCA9IGZhbHNlO1xuXG4gIC8vIE5vdGUgdGhhdCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgbGlzdCBoYXBwZW5zIGluIHJldmVyc2UsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB3ZSdsbCBwcm9jZXNzXG4gIC8vIGFsbCByZWFkcyBvZiBhIHZhcmlhYmxlIHByaW9yIHRvIHByb2Nlc3NpbmcgaXRzIGRlY2xhcmF0aW9uLlxuICBmb3IgKGNvbnN0IG9wIG9mIG9wcy5yZXZlcnNlZCgpKSB7XG4gICAgY29uc3Qgb3BJbmZvID0gb3BNYXAuZ2V0KG9wKSE7XG5cbiAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLlZhcmlhYmxlICYmIHZhclVzYWdlcy5nZXQob3AueHJlZikhID09PSAwKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVudXNlZCBhbmQgY2FuIGJlIHJlbW92ZWQuIFdlIG1pZ2h0IG5lZWQgdG8ga2VlcCB0aGUgaW5pdGlhbGl6ZXIgYXJvdW5kLFxuICAgICAgLy8gdGhvdWdoLCBpZiBzb21ldGhpbmcgZGVwZW5kcyBvbiBpdCBydW5uaW5nLlxuICAgICAgaWYgKChjb250ZXh0SXNVc2VkICYmIG9wSW5mby5mZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFdyaXRlKSB8fFxuICAgICAgICAgIChvcEluZm8uZmVuY2VzICYgRmVuY2UuU2lkZUVmZmVjdGZ1bCkpIHtcbiAgICAgICAgLy8gVGhpcyB2YXJpYWJsZSBpbml0aWFsaXplciBoYXMgYSBzaWRlIGVmZmVjdCB3aGljaCBtdXN0IGJlIHJldGFpbmVkLiBFaXRoZXI6XG4gICAgICAgIC8vICAqIGl0IHdyaXRlcyB0byB0aGUgdmlldyBjb250ZXh0LCBhbmQgd2Uga25vdyB0aGVyZSBpcyBhIGZ1dHVyZSBvcGVyYXRpb24gd2hpY2ggZGVwZW5kc1xuICAgICAgICAvLyAgICBvbiB0aGF0IHdyaXRlLCBvclxuICAgICAgICAvLyAgKiBpdCdzIGFuIG9wZXJhdGlvbiB3aGljaCBpcyBpbmhlcmVudGx5IHNpZGUtZWZmZWN0ZnVsLlxuICAgICAgICAvLyBXZSBjYW4ndCByZW1vdmUgdGhlIGluaXRpYWxpemVyLCBidXQgd2UgY2FuIHJlbW92ZSB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaXRzZWxmIGFuZFxuICAgICAgICAvLyByZXBsYWNlIGl0IHdpdGggYSBzaWRlLWVmZmVjdGZ1bCBzdGF0ZW1lbnQuXG4gICAgICAgIGNvbnN0IHN0bXRPcCA9IGlyLmNyZWF0ZVN0YXRlbWVudE9wKG9wLmluaXRpYWxpemVyLnRvU3RtdCgpKSBhcyBpci5VcGRhdGVPcDtcbiAgICAgICAgb3BNYXAuc2V0KHN0bXRPcCwgb3BJbmZvKTtcbiAgICAgICAgaXIuT3BMaXN0LnJlcGxhY2Uob3AgYXMgaXIuVXBkYXRlT3AsIHN0bXRPcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIHNhZmUgdG8gZGVsZXRlIHRoaXMgZW50aXJlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGFzIG5vdGhpbmcgZGVwZW5kcyBvbiBpdCwgZXZlblxuICAgICAgICAvLyBzaWRlLWVmZmVjdGZ1bGx5LiBOb3RlIHRoYXQgZG9pbmcgdGhpcyBtaWdodCBtYWtlIG90aGVyIHZhcmlhYmxlcyB1bnVzZWQuIFNpbmNlIHdlJ3JlXG4gICAgICAgIC8vIGl0ZXJhdGluZyBpbiByZXZlcnNlIG9yZGVyLCB3ZSBzaG91bGQgYWx3YXlzIGJlIHByb2Nlc3NpbmcgdXNhZ2VzIGJlZm9yZSBkZWNsYXJhdGlvbnNcbiAgICAgICAgLy8gYW5kIHRoZXJlZm9yZSBieSB0aGUgdGltZSB3ZSBnZXQgdG8gYSBkZWNsYXJhdGlvbiwgYWxsIHJlbW92YWJsZSB1c2FnZXMgd2lsbCBoYXZlIGJlZW5cbiAgICAgICAgLy8gcmVtb3ZlZC5cbiAgICAgICAgdW5jb3VudFZhcmlhYmxlVXNhZ2VzKG9wLCB2YXJVc2FnZXMpO1xuICAgICAgICBpci5PcExpc3QucmVtb3ZlKG9wIGFzIGlyLlVwZGF0ZU9wKTtcbiAgICAgIH1cblxuICAgICAgb3BNYXAuZGVsZXRlKG9wKTtcbiAgICAgIHZhckRlY2xzLmRlbGV0ZShvcC54cmVmKTtcbiAgICAgIHZhclVzYWdlcy5kZWxldGUob3AueHJlZik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEb2VzIHRoaXMgb3BlcmF0aW9uIGRlcGVuZCBvbiB0aGUgdmlldyBjb250ZXh0P1xuICAgIGlmIChvcEluZm8uZmVuY2VzICYgRmVuY2UuVmlld0NvbnRleHRSZWFkKSB7XG4gICAgICBjb250ZXh0SXNVc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBOZXh0LCBpbmxpbmUgYW55IHJlbWFpbmluZyB2YXJpYWJsZXMgd2l0aCBleGFjdGx5IG9uZSB1c2FnZS5cbiAgY29uc3QgdG9JbmxpbmU6IGlyLlhyZWZJZFtdID0gW107XG4gIGZvciAoY29uc3QgW2lkLCBjb3VudF0gb2YgdmFyVXNhZ2VzKSB7XG4gICAgY29uc3QgZGVjbCA9IHZhckRlY2xzLmdldChpZCkhO1xuICAgIGNvbnN0IHZhckluZm8gPSBvcE1hcC5nZXQoZGVjbCBhcyBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wKSE7XG4gICAgLy8gV2UgY2FuIGlubGluZSB2YXJpYWJsZXMgdGhhdDpcbiAgICAvLyAgLSBhcmUgdXNlZCBleGFjdGx5IG9uY2UsIGFuZFxuICAgIC8vICAtIGFyZSBub3QgdXNlZCByZW1vdGVseVxuICAgIC8vIE9SXG4gICAgLy8gIC0gYXJlIG1hcmtlZCBmb3IgYWx3YXlzIGlubGluaW5nXG4gICAgY29uc3QgaXNBbHdheXNJbmxpbmUgPSAhIShkZWNsLmZsYWdzICYgaXIuVmFyaWFibGVGbGFncy5BbHdheXNJbmxpbmUpO1xuICAgIGlmIChjb3VudCAhPT0gMSB8fCBpc0Fsd2F5c0lubGluZSkge1xuICAgICAgLy8gV2UgY2FuJ3QgaW5saW5lIHRoaXMgdmFyaWFibGUgYXMgaXQncyB1c2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhclJlbW90ZVVzYWdlcy5oYXMoaWQpKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgb25jZSwgYnV0IGFjcm9zcyBhbiBvcGVyYXRpb24gYm91bmRhcnksIHNvIGl0IGNhbid0IGJlIGlubGluZWQuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0b0lubGluZS5wdXNoKGlkKTtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGU6IGlyLlhyZWZJZHx1bmRlZmluZWQ7XG4gIHdoaWxlIChjYW5kaWRhdGUgPSB0b0lubGluZS5wb3AoKSkge1xuICAgIC8vIFdlIHdpbGwgYXR0ZW1wdCB0byBpbmxpbmUgdGhpcyB2YXJpYWJsZS4gSWYgaW5saW5pbmcgZmFpbHMgKGR1ZSB0byBmZW5jZXMgZm9yIGV4YW1wbGUpLFxuICAgIC8vIG5vIGZ1dHVyZSBvcGVyYXRpb24gd2lsbCBtYWtlIGlubGluaW5nIGxlZ2FsLlxuICAgIGNvbnN0IGRlY2wgPSB2YXJEZWNscy5nZXQoY2FuZGlkYXRlKSE7XG4gICAgY29uc3QgdmFySW5mbyA9IG9wTWFwLmdldChkZWNsIGFzIGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3ApITtcbiAgICBjb25zdCBpc0Fsd2F5c0lubGluZSA9ICEhKGRlY2wuZmxhZ3MgJiBpci5WYXJpYWJsZUZsYWdzLkFsd2F5c0lubGluZSk7XG5cbiAgICBpZiAoaXNBbHdheXNJbmxpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQXNzZXJ0aW9uRXJyb3I6IEZvdW5kIGFuICdBbHdheXNJbmxpbmUnIHZhcmlhYmxlIGFmdGVyIHRoZSBhbHdheXMgaW5saW5pbmcgcGFzcy5gKTtcbiAgICB9XG5cbiAgICAvLyBTY2FuIG9wZXJhdGlvbnMgZm9sbG93aW5nIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbmQgbG9vayBmb3IgdGhlIHBvaW50IHdoZXJlIHRoYXQgdmFyaWFibGVcbiAgICAvLyBpcyB1c2VkLiBUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgdXNhZ2UgZ2l2ZW4gdGhlIHByZWNvbmRpdGlvbiBhYm92ZS5cbiAgICBmb3IgKGxldCB0YXJnZXRPcCA9IGRlY2wubmV4dCE7IHRhcmdldE9wLmtpbmQgIT09IGlyLk9wS2luZC5MaXN0RW5kO1xuICAgICAgICAgdGFyZ2V0T3AgPSB0YXJnZXRPcC5uZXh0ISkge1xuICAgICAgY29uc3Qgb3BJbmZvID0gb3BNYXAuZ2V0KHRhcmdldE9wKSE7XG5cbiAgICAgIC8vIElzIHRoZSB2YXJpYWJsZSB1c2VkIGluIHRoaXMgb3BlcmF0aW9uP1xuICAgICAgaWYgKG9wSW5mby52YXJpYWJsZXNVc2VkLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIGlmIChjb21wYXRpYmlsaXR5ID09PSBpci5Db21wYXRpYmlsaXR5TW9kZS5UZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyICYmXG4gICAgICAgICAgICAhYWxsb3dDb25zZXJ2YXRpdmVJbmxpbmluZyhkZWNsLCB0YXJnZXRPcCkpIHtcbiAgICAgICAgICAvLyBXZSdyZSBpbiBjb25zZXJ2YXRpdmUgbW9kZSwgYW5kIHRoaXMgdmFyaWFibGUgaXMgbm90IGVsaWdpYmxlIGZvciBpbmxpbmluZyBpbnRvIHRoZVxuICAgICAgICAgIC8vIHRhcmdldCBvcGVyYXRpb24gaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWWVzLCB0cnkgdG8gaW5saW5lIGl0LiBJbmxpbmluZyBtYXkgbm90IGJlIHN1Y2Nlc3NmdWwgaWYgZmVuY2VzIGluIHRoaXMgb3BlcmF0aW9uIGJlZm9yZVxuICAgICAgICAvLyB0aGUgdmFyaWFibGUncyB1c2FnZSBjYW5ub3QgYmUgc2FmZWx5IGNyb3NzZWQuXG4gICAgICAgIGlmICh0cnlJbmxpbmVWYXJpYWJsZUluaXRpYWxpemVyKGNhbmRpZGF0ZSwgZGVjbC5pbml0aWFsaXplciwgdGFyZ2V0T3AsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAgIC8vIElubGluaW5nIHdhcyBzdWNjZXNzZnVsISBVcGRhdGUgdGhlIHRyYWNraW5nIHN0cnVjdHVyZXMgdG8gcmVmbGVjdCB0aGUgaW5saW5lZFxuICAgICAgICAgIC8vIHZhcmlhYmxlLlxuICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmRlbGV0ZShjYW5kaWRhdGUpO1xuXG4gICAgICAgICAgLy8gQWRkIGFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgdmFyaWFibGUncyBpbml0aWFsaXplciB0byBpdHMgbmV3IHVzYWdlIHNpdGUuXG4gICAgICAgICAgZm9yIChjb25zdCBpZCBvZiB2YXJJbmZvLnZhcmlhYmxlc1VzZWQpIHtcbiAgICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmFkZChpZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWVyZ2UgZmVuY2VzIGluIHRoZSB2YXJpYWJsZSdzIGluaXRpYWxpemVyIGludG8gaXRzIG5ldyB1c2FnZSBzaXRlLlxuICAgICAgICAgIG9wSW5mby5mZW5jZXMgfD0gdmFySW5mby5mZW5jZXM7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdHJhY2tpbmcgaW5mbyByZWxhdGVkIHRvIHRoZSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICB2YXJEZWNscy5kZWxldGUoY2FuZGlkYXRlKTtcbiAgICAgICAgICB2YXJVc2FnZXMuZGVsZXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgb3BNYXAuZGVsZXRlKGRlY2wgYXMgaXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcCk7XG5cbiAgICAgICAgICAvLyBBbmQgZmluYWxseSwgZGVsZXRlIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBvcGVyYXRpb24gbGlzdC5cbiAgICAgICAgICBpci5PcExpc3QucmVtb3ZlKGRlY2wgYXMgaXIuVXBkYXRlT3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hldGhlciBpbmxpbmluZyBzdWNjZWVkZWQgb3IgZmFpbGVkLCB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB2YXJpYWJsZSBpcyBub3QgdXNlZCBpbiB0aGlzIG9wZXJhdGlvbiwgdGhlbiB3ZSdkIG5lZWQgdG8gaW5saW5lIGFjcm9zcyBpdC4gQ2hlY2sgaWZcbiAgICAgIC8vIHRoYXQncyBzYWZlIHRvIGRvLlxuICAgICAgaWYgKCFzYWZlVG9JbmxpbmVQYXN0RmVuY2VzKG9wSW5mby5mZW5jZXMsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAvLyBXZSBjYW4ndCBzYWZlbHkgaW5saW5lIHRoaXMgdmFyaWFibGUgYmV5b25kIHRoaXMgb3BlcmF0aW9uLCBzbyBkb24ndCBwcm9jZWVkIHdpdGhcbiAgICAgICAgLy8gaW5saW5pbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYGlyLkV4cHJlc3Npb25gLCByZXR1cm5zIHRoZSBgRmVuY2VgIGZsYWdzIGZvciB0aGF0IGV4cHJlc3Npb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gZmVuY2VzRm9ySXJFeHByZXNzaW9uKGV4cHI6IGlyLkV4cHJlc3Npb24pOiBGZW5jZSB7XG4gIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5OZXh0Q29udGV4dDpcbiAgICAgIHJldHVybiBGZW5jZS5WaWV3Q29udGV4dFJlYWQgfCBGZW5jZS5WaWV3Q29udGV4dFdyaXRlO1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVzdG9yZVZpZXc6XG4gICAgICByZXR1cm4gRmVuY2UuVmlld0NvbnRleHRSZWFkIHwgRmVuY2UuVmlld0NvbnRleHRXcml0ZSB8IEZlbmNlLlNpZGVFZmZlY3RmdWw7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5SZWZlcmVuY2U6XG4gICAgICByZXR1cm4gRmVuY2UuVmlld0NvbnRleHRSZWFkO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRmVuY2UuTm9uZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgT3BJbmZvYCBzdHJ1Y3R1cmUgZm9yIHRoZSBnaXZlbiBgb3BgLiBUaGlzIHBlcmZvcm1zIHR3byBvcGVyYXRpb25zOlxuICpcbiAqICAqIEl0IHRyYWNrcyB3aGljaCB2YXJpYWJsZXMgYXJlIHVzZWQgaW4gdGhlIG9wZXJhdGlvbidzIGV4cHJlc3Npb25zLlxuICogICogSXQgcm9sbHMgdXAgZmVuY2UgZmxhZ3MgZm9yIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgb3BlcmF0aW9uLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0T3BJbmZvKG9wOiBpci5DcmVhdGVPcHxpci5VcGRhdGVPcCk6IE9wSW5mbyB7XG4gIGxldCBmZW5jZXMgPSBGZW5jZS5Ob25lO1xuICBjb25zdCB2YXJpYWJsZXNVc2VkID0gbmV3IFNldDxpci5YcmVmSWQ+KCk7XG4gIGlyLnZpc2l0RXhwcmVzc2lvbnNJbk9wKG9wLCBleHByID0+IHtcbiAgICBpZiAoIWlyLmlzSXJFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICB2YXJpYWJsZXNVc2VkLmFkZChleHByLnhyZWYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZlbmNlcyB8PSBmZW5jZXNGb3JJckV4cHJlc3Npb24oZXhwcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtmZW5jZXMsIHZhcmlhYmxlc1VzZWR9O1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgdXNhZ2VzIG9mIGVhY2ggdmFyaWFibGUsIGJlaW5nIGNhcmVmdWwgdG8gdHJhY2sgd2hldGhlciB0aG9zZSB1c2FnZXMgYXJlXG4gKiBsb2NhbCBvciByZW1vdGUuXG4gKi9cbmZ1bmN0aW9uIGNvdW50VmFyaWFibGVVc2FnZXMoXG4gICAgb3A6IGlyLkNyZWF0ZU9wfGlyLlVwZGF0ZU9wLCB2YXJVc2FnZXM6IE1hcDxpci5YcmVmSWQsIG51bWJlcj4sXG4gICAgdmFyUmVtb3RlVXNhZ2U6IFNldDxpci5YcmVmSWQ+KTogdm9pZCB7XG4gIGlyLnZpc2l0RXhwcmVzc2lvbnNJbk9wKG9wLCAoZXhwciwgZmxhZ3MpID0+IHtcbiAgICBpZiAoIWlyLmlzSXJFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4cHIua2luZCAhPT0gaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSB2YXJVc2FnZXMuZ2V0KGV4cHIueHJlZik7XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3V0c2lkZSB0aGUgY3VycmVudCBzY29wZSBvZiBvcHRpbWl6YXRpb24uXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhclVzYWdlcy5zZXQoZXhwci54cmVmLCBjb3VudCArIDEpO1xuXG4gICAgaWYgKGZsYWdzICYgaXIuVmlzaXRvckNvbnRleHRGbGFnLkluQ2hpbGRPcGVyYXRpb24pIHtcbiAgICAgIHZhclJlbW90ZVVzYWdlLmFkZChleHByLnhyZWYpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHVzYWdlcyBvZiBhIHZhcmlhYmxlIGluIGBvcGAgZnJvbSB0aGUgYHZhclVzYWdlc2AgdHJhY2tpbmcuXG4gKi9cbmZ1bmN0aW9uIHVuY291bnRWYXJpYWJsZVVzYWdlcyhcbiAgICBvcDogaXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3AsIHZhclVzYWdlczogTWFwPGlyLlhyZWZJZCwgbnVtYmVyPik6IHZvaWQge1xuICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgZXhwciA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleHByLmtpbmQgIT09IGlyLkV4cHJlc3Npb25LaW5kLlJlYWRWYXJpYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdmFyVXNhZ2VzLmdldChleHByLnhyZWYpO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGN1cnJlbnQgc2NvcGUgb2Ygb3B0aW1pemF0aW9uLlxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW5hY2N1cmF0ZSB2YXJpYWJsZSBjb3VudDogJHtleHByLnhyZWZ9IC0gZm91bmQgYW5vdGhlciByZWFkIGJ1dCBjb3VudCBpcyBhbHJlYWR5IDBgKTtcbiAgICB9XG4gICAgdmFyVXNhZ2VzLnNldChleHByLnhyZWYsIGNvdW50IC0gMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGl0J3Mgc2FmZSB0byBpbmxpbmUgYSB2YXJpYWJsZSBhY3Jvc3MgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmVuY2VzIHRoZSBmZW5jZXMgb2YgdGhlIG9wZXJhdGlvbiB3aGljaCB0aGUgaW5saW5pbmcgd2lsbCBjcm9zc1xuICogQHBhcmFtIGRlY2xGZW5jZXMgdGhlIGZlbmNlcyBvZiB0aGUgdmFyaWFibGUgYmVpbmcgaW5saW5lZC5cbiAqL1xuZnVuY3Rpb24gc2FmZVRvSW5saW5lUGFzdEZlbmNlcyhmZW5jZXM6IEZlbmNlLCBkZWNsRmVuY2VzOiBGZW5jZSk6IGJvb2xlYW4ge1xuICBpZiAoZmVuY2VzICYgRmVuY2UuVmlld0NvbnRleHRXcml0ZSkge1xuICAgIC8vIEl0J3Mgbm90IHNhZmUgdG8gaW5saW5lIGNvbnRleHQgcmVhZHMgYWNyb3NzIGNvbnRleHQgd3JpdGVzLlxuICAgIGlmIChkZWNsRmVuY2VzICYgRmVuY2UuVmlld0NvbnRleHRSZWFkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZCkge1xuICAgIC8vIEl0J3Mgbm90IHNhZmUgdG8gaW5saW5lIGNvbnRleHQgd3JpdGVzIGFjcm9zcyBjb250ZXh0IHJlYWRzLlxuICAgIGlmIChkZWNsRmVuY2VzICYgRmVuY2UuVmlld0NvbnRleHRXcml0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIGlubGluZSB0aGUgaW5pdGlhbGl6ZXIgb2YgYSB2YXJpYWJsZSBpbnRvIGEgdGFyZ2V0IG9wZXJhdGlvbidzIGV4cHJlc3Npb25zLlxuICpcbiAqIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgc2FmZSB0byBkby4gRm9yIGV4YW1wbGUsIHRoZSB2YXJpYWJsZSBjb3VsZCBiZSByZWFkIGZvbGxvd2luZyB0aGVcbiAqIGV4ZWN1dGlvbiBvZiBhbiBleHByZXNzaW9uIHdpdGggZmVuY2VzIHRoYXQgZG9uJ3QgcGVybWl0IHRoZSB2YXJpYWJsZSB0byBiZSBpbmxpbmVkIGFjcm9zcyB0aGVtLlxuICovXG5mdW5jdGlvbiB0cnlJbmxpbmVWYXJpYWJsZUluaXRpYWxpemVyKFxuICAgIGlkOiBpci5YcmVmSWQsIGluaXRpYWxpemVyOiBvLkV4cHJlc3Npb24sIHRhcmdldDogaXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3AsXG4gICAgZGVjbEZlbmNlczogRmVuY2UpOiBib29sZWFuIHtcbiAgLy8gV2UgdXNlIGBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3BgIHRvIHdhbGsgdGhlIGV4cHJlc3Npb25zIGFuZCBpbmxpbmUgdGhlIHZhcmlhYmxlIGlmXG4gIC8vIHBvc3NpYmxlLiBTaW5jZSB0aGlzIG9wZXJhdGlvbiBpcyBjYWxsYmFjay1iYXNlZCwgb25jZSBpbmxpbmluZyBzdWNjZWVkcyBvciBmYWlscyB3ZSBjYW4ndFxuICAvLyBcInN0b3BcIiB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLCBhbmQgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaW5saW5pbmcgaGFzIHN1Y2NlZWRlZCBvclxuICAvLyBpcyBubyBsb25nZXIgYWxsb3dlZC5cbiAgbGV0IGlubGluZWQgPSBmYWxzZTtcbiAgbGV0IGlubGluaW5nQWxsb3dlZCA9IHRydWU7XG5cbiAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKHRhcmdldCwgKGV4cHIsIGZsYWdzKSA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgaWYgKGlubGluZWQgfHwgIWlubGluaW5nQWxsb3dlZCkge1xuICAgICAgLy8gRWl0aGVyIHRoZSBpbmxpbmluZyBoYXMgYWxyZWFkeSBzdWNjZWVkZWQsIG9yIHdlJ3ZlIHBhc3NlZCBhIGZlbmNlIHRoYXQgZGlzYWxsb3dzIGlubGluaW5nXG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCBzbyBkb24ndCB0cnkuXG4gICAgICByZXR1cm4gZXhwcjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoZmxhZ3MgJiBpci5WaXNpdG9yQ29udGV4dEZsYWcuSW5DaGlsZE9wZXJhdGlvbikgJiYgKGRlY2xGZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFJlYWQpKSB7XG4gICAgICAvLyBXZSBjYW5ub3QgaW5saW5lIHZhcmlhYmxlcyB0aGF0IGFyZSBzZW5zaXRpdmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dCBhY3Jvc3Mgb3BlcmF0aW9uXG4gICAgICAvLyBib3VuZGFyaWVzLlxuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuXG4gICAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICBpZiAoZXhwci54cmVmID09PSBpZCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHVzYWdlIHNpdGUgb2YgdGhlIHZhcmlhYmxlLiBTaW5jZSBub3RoaW5nIGhhcyBkaXNhbGxvd2VkIGlubGluaW5nLCBpdCdzXG4gICAgICAgICAgLy8gc2FmZSB0byBpbmxpbmUgdGhlIGluaXRpYWxpemVyIGhlcmUuXG4gICAgICAgICAgaW5saW5lZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemVyO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRm9yIG90aGVyIHR5cGVzIG9mIGBpci5FeHByZXNzaW9uYHMsIHdoZXRoZXIgaW5saW5pbmcgaXMgYWxsb3dlZCBkZXBlbmRzIG9uIHRoZWlyIGZlbmNlcy5cbiAgICAgICAgY29uc3QgZXhwckZlbmNlcyA9IGZlbmNlc0ZvcklyRXhwcmVzc2lvbihleHByKTtcbiAgICAgICAgaW5saW5pbmdBbGxvd2VkID0gaW5saW5pbmdBbGxvd2VkICYmIHNhZmVUb0lubGluZVBhc3RGZW5jZXMoZXhwckZlbmNlcywgZGVjbEZlbmNlcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfSwgaXIuVmlzaXRvckNvbnRleHRGbGFnLk5vbmUpO1xuICByZXR1cm4gaW5saW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgaW5saW5pbmcgb2YgYGRlY2xgIHNob3VsZCBiZSBhbGxvd2VkIGluIFwiY29uc2VydmF0aXZlXCIgbW9kZS5cbiAqXG4gKiBJbiBjb25zZXJ2YXRpdmUgbW9kZSwgaW5saW5pbmcgYmVoYXZpb3IgaXMgbGltaXRlZCB0byB0aG9zZSBvcGVyYXRpb25zIHdoaWNoIHRoZVxuICogYFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXJgIHN1cHBvcnRlZCwgd2l0aCB0aGUgZ29hbCBvZiBwcm9kdWNpbmcgZXF1aXZhbGVudCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGFsbG93Q29uc2VydmF0aXZlSW5saW5pbmcoXG4gICAgZGVjbDogaXIuVmFyaWFibGVPcDxpci5DcmVhdGVPcHxpci5VcGRhdGVPcD4sIHRhcmdldDogaXIuT3A8aXIuQ3JlYXRlT3B8aXIuVXBkYXRlT3A+KTogYm9vbGVhbiB7XG4gIC8vIFRPRE8oYWx4aHViKTogdW5kZXJzdGFuZCBleGFjdGx5IGhvdyBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyIGFwcHJvYWNoZXMgaW5saW5pbmcsIGFuZCByZWNvcmRcbiAgLy8gdGhhdCBiZWhhdmlvciBoZXJlLlxuICBzd2l0Y2ggKGRlY2wudmFyaWFibGUua2luZCkge1xuICAgIGNhc2UgaXIuU2VtYW50aWNWYXJpYWJsZUtpbmQuSWRlbnRpZmllcjpcbiAgICAgIGlmIChkZWNsLmluaXRpYWxpemVyIGluc3RhbmNlb2Ygby5SZWFkVmFyRXhwciAmJiBkZWNsLmluaXRpYWxpemVyLm5hbWUgPT09ICdjdHgnKSB7XG4gICAgICAgIC8vIEFsdGhvdWdoIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgaXMgY2F1dGlvdXMgYWJvdXQgaW5saW5pbmcsIHdlIHN0aWxsIHdhbnQgdG8gZG8gc29cbiAgICAgICAgLy8gd2hlbiB0aGUgdmFyaWFibGUgaXMgdGhlIGNvbnRleHQsIHRvIGltaXRhdGUgaXRzIGJlaGF2aW9yIHdpdGggYWxpYXNlcyBpbiBjb250cm9sIGZsb3dcbiAgICAgICAgLy8gYmxvY2tzLiBUaGlzIHF1aXJreSBiZWhhdmlvciB3aWxsIGJlY29tZSBkZWFkIGNvZGUgb25jZSBjb21wYXRpYmlsaXR5IG1vZGUgaXMgbm8gbG9uZ2VyXG4gICAgICAgIC8vIHN1cHBvcnRlZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBpci5TZW1hbnRpY1ZhcmlhYmxlS2luZC5Db250ZXh0OlxuICAgICAgLy8gQ29udGV4dCBjYW4gb25seSBiZSBpbmxpbmVkIGludG8gb3RoZXIgdmFyaWFibGVzLlxuICAgICAgcmV0dXJuIHRhcmdldC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|
|
@@ -9,7 +9,7 @@ import * as ir from '../../ir';
|
|
|
9
9
|
/**
|
|
10
10
|
* Wraps ICUs that do not already belong to an i18n block in a new i18n block.
|
|
11
11
|
*/
|
|
12
|
-
export function
|
|
12
|
+
export function wrapI18nIcus(job) {
|
|
13
13
|
for (const unit of job.units) {
|
|
14
14
|
let currentI18nOp = null;
|
|
15
15
|
for (const op of unit.create) {
|
|
@@ -31,4 +31,4 @@ export function phaseWrapIcus(job) {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcF9pY3VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvd3JhcF9pY3VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFtQjtJQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7UUFDNUIsSUFBSSxhQUFhLEdBQXdCLElBQUksQ0FBQztRQUM5QyxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDNUIsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFO2dCQUNmLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUN0QixhQUFhLEdBQUcsRUFBRSxDQUFDO29CQUNuQixNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUNwQixhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUNyQixNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHO29CQUNoQixJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUU7d0JBQzFCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDaEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQWMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQzlFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFjLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQ2hFO29CQUNELE1BQU07YUFDVDtTQUNGO0tBQ0Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB7Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuLyoqXG4gKiBXcmFwcyBJQ1VzIHRoYXQgZG8gbm90IGFscmVhZHkgYmVsb25nIHRvIGFuIGkxOG4gYmxvY2sgaW4gYSBuZXcgaTE4biBibG9jay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJMThuSWN1cyhqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICBsZXQgY3VycmVudEkxOG5PcDogaXIuSTE4blN0YXJ0T3B8bnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgc3dpdGNoIChvcC5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5TdGFydDpcbiAgICAgICAgICBjdXJyZW50STE4bk9wID0gb3A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5FbmQ6XG4gICAgICAgICAgY3VycmVudEkxOG5PcCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkljdTpcbiAgICAgICAgICBpZiAoY3VycmVudEkxOG5PcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBqb2IuYWxsb2NhdGVYcmVmSWQoKTtcbiAgICAgICAgICAgIGlyLk9wTGlzdC5pbnNlcnRCZWZvcmU8aXIuQ3JlYXRlT3A+KGlyLmNyZWF0ZUkxOG5TdGFydE9wKGlkLCBvcC5tZXNzYWdlKSwgb3ApO1xuICAgICAgICAgICAgaXIuT3BMaXN0Lmluc2VydEFmdGVyPGlyLkNyZWF0ZU9wPihpci5jcmVhdGVJMThuRW5kT3AoaWQpLCBvcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|