@angular/compiler 17.0.0-next.8 → 17.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/esm2022/src/ml_parser/ast.mjs +3 -2
  2. package/esm2022/src/ml_parser/html_tags.mjs +4 -4
  3. package/esm2022/src/ml_parser/html_whitespaces.mjs +2 -2
  4. package/esm2022/src/ml_parser/icu_ast_expander.mjs +2 -2
  5. package/esm2022/src/ml_parser/lexer.mjs +2 -13
  6. package/esm2022/src/ml_parser/parser.mjs +3 -3
  7. package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
  8. package/esm2022/src/render3/partial/directive.mjs +1 -1
  9. package/esm2022/src/render3/partial/factory.mjs +1 -1
  10. package/esm2022/src/render3/partial/injectable.mjs +1 -1
  11. package/esm2022/src/render3/partial/injector.mjs +1 -1
  12. package/esm2022/src/render3/partial/ng_module.mjs +1 -1
  13. package/esm2022/src/render3/partial/pipe.mjs +1 -1
  14. package/esm2022/src/render3/r3_ast.mjs +3 -2
  15. package/esm2022/src/render3/r3_control_flow.mjs +2 -2
  16. package/esm2022/src/render3/r3_template_transform.mjs +2 -2
  17. package/esm2022/src/shadow_css.mjs +10 -5
  18. package/esm2022/src/template/pipeline/ir/src/enums.mjs +81 -26
  19. package/esm2022/src/template/pipeline/ir/src/expression.mjs +65 -3
  20. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +41 -6
  21. package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +3 -2
  22. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +25 -3
  23. package/esm2022/src/template/pipeline/ir/src/variable.mjs +1 -1
  24. package/esm2022/src/template/pipeline/src/compilation.mjs +6 -1
  25. package/esm2022/src/template/pipeline/src/emit.mjs +17 -6
  26. package/esm2022/src/template/pipeline/src/ingest.mjs +92 -11
  27. package/esm2022/src/template/pipeline/src/instruction.mjs +28 -7
  28. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +3 -3
  29. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +1 -1
  30. package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +31 -0
  31. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +4 -1
  32. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +11 -6
  33. package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +2 -2
  34. package/esm2022/src/template/pipeline/src/phases/i18n_message_extraction.mjs +14 -4
  35. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +2 -2
  36. package/esm2022/src/template/pipeline/src/phases/icu_extraction.mjs +53 -0
  37. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +1 -2
  38. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +2 -2
  39. package/esm2022/src/template/pipeline/src/phases/naming.mjs +23 -4
  40. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +1 -6
  41. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +40 -31
  42. package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +8 -8
  43. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +15 -3
  44. package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +2 -1
  45. package/esm2022/src/template/pipeline/src/phases/reify.mjs +33 -2
  46. package/esm2022/src/template/pipeline/src/phases/repeater_derived_vars.mjs +40 -0
  47. package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +5 -1
  48. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_placeholders.mjs +134 -36
  49. package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +2 -1
  50. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +5 -6
  51. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +3 -3
  52. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +3 -3
  53. package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +49 -0
  54. package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +75 -0
  55. package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +31 -0
  56. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +36 -3
  57. package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +43 -3
  58. package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +34 -0
  59. package/esm2022/src/template/pipeline/src/util/elements.mjs +6 -6
  60. package/esm2022/src/version.mjs +1 -1
  61. package/fesm2022/compiler.mjs +1106 -370
  62. package/fesm2022/compiler.mjs.map +1 -1
  63. package/index.d.ts +5 -3
  64. package/package.json +2 -2
  65. package/esm2022/src/template/pipeline/src/phases/align_pipe_variadic_var_offset.mjs +0 -42
  66. package/esm2022/src/template/pipeline/src/phases/propagate_i18n_placeholders.mjs +0 -39
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.8
2
+ * @license Angular v17.0.0-rc.1
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -442,9 +442,10 @@ export declare class Block implements BaseNode {
442
442
  parameters: BlockParameter[];
443
443
  children: Node_2[];
444
444
  sourceSpan: ParseSourceSpan;
445
+ nameSpan: ParseSourceSpan;
445
446
  startSourceSpan: ParseSourceSpan;
446
447
  endSourceSpan: ParseSourceSpan | null;
447
- constructor(name: string, parameters: BlockParameter[], children: Node_2[], sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan?: ParseSourceSpan | null);
448
+ constructor(name: string, parameters: BlockParameter[], children: Node_2[], sourceSpan: ParseSourceSpan, nameSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan?: ParseSourceSpan | null);
448
449
  visit(visitor: Visitor, context: any): any;
449
450
  }
450
451
 
@@ -5112,7 +5113,8 @@ export declare class TmplAstTimerDeferredTrigger extends TmplAstDeferredTrigger
5112
5113
  export declare class TmplAstUnknownBlock implements TmplAstNode {
5113
5114
  name: string;
5114
5115
  sourceSpan: ParseSourceSpan;
5115
- constructor(name: string, sourceSpan: ParseSourceSpan);
5116
+ nameSpan: ParseSourceSpan;
5117
+ constructor(name: string, sourceSpan: ParseSourceSpan, nameSpan: ParseSourceSpan);
5116
5118
  visit<Result>(visitor: Visitor_3<Result>): Result;
5117
5119
  }
5118
5120
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/compiler",
3
- "version": "17.0.0-next.8",
3
+ "version": "17.0.0-rc.1",
4
4
  "description": "Angular - the compiler library",
5
5
  "author": "angular",
6
6
  "license": "MIT",
@@ -11,7 +11,7 @@
11
11
  "tslib": "^2.3.0"
12
12
  },
13
13
  "peerDependencies": {
14
- "@angular/core": "17.0.0-next.8"
14
+ "@angular/core": "17.0.0-rc.1"
15
15
  },
16
16
  "peerDependenciesMeta": {
17
17
  "@angular/core": {
@@ -1,42 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import * as ir from '../../ir';
9
- import { varsUsedByIrExpression } from './var_counting';
10
- export function phaseAlignPipeVariadicVarOffset(job) {
11
- for (const unit of job.units) {
12
- for (const op of unit.update) {
13
- ir.visitExpressionsInOp(op, expr => {
14
- if (!(expr instanceof ir.PipeBindingVariadicExpr)) {
15
- return expr;
16
- }
17
- if (!(expr.args instanceof ir.PureFunctionExpr)) {
18
- return expr;
19
- }
20
- if (expr.varOffset === null || expr.args.varOffset === null) {
21
- throw new Error(`Must run after variable counting`);
22
- }
23
- // The structure of this variadic pipe expression is:
24
- // PipeBindingVariadic(#, Y, PureFunction(X, ...ARGS))
25
- // Where X and Y are the slot offsets for the variables used by these operations, and Y > X.
26
- // In `TemplateDefinitionBuilder` the PipeBindingVariadic variable slots are allocated
27
- // before the PureFunction slots, which is unusually out-of-order.
28
- //
29
- // To maintain identical output for the tests in question, we adjust the variable offsets of
30
- // these two calls to emulate TDB's behavior. This is not perfect, because the ARGS of the
31
- // PureFunction call may also allocate slots which by TDB's ordering would come after X, and
32
- // we don't account for that. Still, this should be enough to pass the existing pipe tests.
33
- // Put the PipeBindingVariadic vars where the PureFunction vars were previously allocated.
34
- expr.varOffset = expr.args.varOffset;
35
- // Put the PureFunction vars following the PipeBindingVariadic vars.
36
- expr.args.varOffset = expr.varOffset + varsUsedByIrExpression(expr);
37
- return undefined;
38
- });
39
- }
40
- }
41
- }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpZ25fcGlwZV92YXJpYWRpY192YXJfb2Zmc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvYWxpZ25fcGlwZV92YXJpYWRpY192YXJfb2Zmc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9CLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxHQUFtQjtJQUNqRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7UUFDNUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzVCLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsdUJBQXVCLENBQUMsRUFBRTtvQkFDakQsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtvQkFDL0MsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7b0JBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztpQkFDckQ7Z0JBRUQscURBQXFEO2dCQUNyRCxzREFBc0Q7Z0JBQ3RELDRGQUE0RjtnQkFFNUYsc0ZBQXNGO2dCQUN0RixrRUFBa0U7Z0JBQ2xFLEVBQUU7Z0JBQ0YsNEZBQTRGO2dCQUM1RiwwRkFBMEY7Z0JBQzFGLDRGQUE0RjtnQkFDNUYsMkZBQTJGO2dCQUUzRiwwRkFBMEY7Z0JBQzFGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBRXJDLG9FQUFvRTtnQkFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7U0FDSjtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5cbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuaW1wb3J0IHt2YXJzVXNlZEJ5SXJFeHByZXNzaW9ufSBmcm9tICcuL3Zhcl9jb3VudGluZyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwaGFzZUFsaWduUGlwZVZhcmlhZGljVmFyT2Zmc2V0KGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC51cGRhdGUpIHtcbiAgICAgIGlyLnZpc2l0RXhwcmVzc2lvbnNJbk9wKG9wLCBleHByID0+IHtcbiAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIGlyLlBpcGVCaW5kaW5nVmFyaWFkaWNFeHByKSkge1xuICAgICAgICAgIHJldHVybiBleHByO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEoZXhwci5hcmdzIGluc3RhbmNlb2YgaXIuUHVyZUZ1bmN0aW9uRXhwcikpIHtcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHByLnZhck9mZnNldCA9PT0gbnVsbCB8fCBleHByLmFyZ3MudmFyT2Zmc2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdXN0IHJ1biBhZnRlciB2YXJpYWJsZSBjb3VudGluZ2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHN0cnVjdHVyZSBvZiB0aGlzIHZhcmlhZGljIHBpcGUgZXhwcmVzc2lvbiBpczpcbiAgICAgICAgLy8gUGlwZUJpbmRpbmdWYXJpYWRpYygjLCBZLCBQdXJlRnVuY3Rpb24oWCwgLi4uQVJHUykpXG4gICAgICAgIC8vIFdoZXJlIFggYW5kIFkgYXJlIHRoZSBzbG90IG9mZnNldHMgZm9yIHRoZSB2YXJpYWJsZXMgdXNlZCBieSB0aGVzZSBvcGVyYXRpb25zLCBhbmQgWSA+IFguXG5cbiAgICAgICAgLy8gSW4gYFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXJgIHRoZSBQaXBlQmluZGluZ1ZhcmlhZGljIHZhcmlhYmxlIHNsb3RzIGFyZSBhbGxvY2F0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBQdXJlRnVuY3Rpb24gc2xvdHMsIHdoaWNoIGlzIHVudXN1YWxseSBvdXQtb2Ytb3JkZXIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRvIG1haW50YWluIGlkZW50aWNhbCBvdXRwdXQgZm9yIHRoZSB0ZXN0cyBpbiBxdWVzdGlvbiwgd2UgYWRqdXN0IHRoZSB2YXJpYWJsZSBvZmZzZXRzIG9mXG4gICAgICAgIC8vIHRoZXNlIHR3byBjYWxscyB0byBlbXVsYXRlIFREQidzIGJlaGF2aW9yLiBUaGlzIGlzIG5vdCBwZXJmZWN0LCBiZWNhdXNlIHRoZSBBUkdTIG9mIHRoZVxuICAgICAgICAvLyBQdXJlRnVuY3Rpb24gY2FsbCBtYXkgYWxzbyBhbGxvY2F0ZSBzbG90cyB3aGljaCBieSBUREIncyBvcmRlcmluZyB3b3VsZCBjb21lIGFmdGVyIFgsIGFuZFxuICAgICAgICAvLyB3ZSBkb24ndCBhY2NvdW50IGZvciB0aGF0LiBTdGlsbCwgdGhpcyBzaG91bGQgYmUgZW5vdWdoIHRvIHBhc3MgdGhlIGV4aXN0aW5nIHBpcGUgdGVzdHMuXG5cbiAgICAgICAgLy8gUHV0IHRoZSBQaXBlQmluZGluZ1ZhcmlhZGljIHZhcnMgd2hlcmUgdGhlIFB1cmVGdW5jdGlvbiB2YXJzIHdlcmUgcHJldmlvdXNseSBhbGxvY2F0ZWQuXG4gICAgICAgIGV4cHIudmFyT2Zmc2V0ID0gZXhwci5hcmdzLnZhck9mZnNldDtcblxuICAgICAgICAvLyBQdXQgdGhlIFB1cmVGdW5jdGlvbiB2YXJzIGZvbGxvd2luZyB0aGUgUGlwZUJpbmRpbmdWYXJpYWRpYyB2YXJzLlxuICAgICAgICBleHByLmFyZ3MudmFyT2Zmc2V0ID0gZXhwci52YXJPZmZzZXQgKyB2YXJzVXNlZEJ5SXJFeHByZXNzaW9uKGV4cHIpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,39 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import * as ir from '../../ir';
9
- export function phasePropagateI18nPlaceholders(job) {
10
- // Get all of the i18n ops.
11
- const i18nOps = new Map();
12
- for (const unit of job.units) {
13
- for (const op of unit.create) {
14
- if (op.kind === ir.OpKind.I18nStart) {
15
- i18nOps.set(op.xref, op);
16
- }
17
- }
18
- }
19
- // Propagate i18n params from sub-templates up to the root i18n op.
20
- for (const op of i18nOps.values()) {
21
- if (op.xref !== op.root) {
22
- const rootOp = i18nOps.get(op.root);
23
- for (const [placeholder, value] of op.params) {
24
- rootOp.params.set(placeholder, value);
25
- }
26
- }
27
- }
28
- // Validate the root i18n ops have all placeholders filled in.
29
- for (const op of i18nOps.values()) {
30
- if (op.xref === op.root) {
31
- for (const placeholder in op.message.placeholders) {
32
- if (!op.params.has(placeholder)) {
33
- throw Error(`Failed to resolve i18n placeholder: ${placeholder}`);
34
- }
35
- }
36
- }
37
- }
38
- }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGFnYXRlX2kxOG5fcGxhY2Vob2xkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvcHJvcGFnYXRlX2kxOG5fcGxhY2Vob2xkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9CLE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxHQUFtQjtJQUNoRSwyQkFBMkI7SUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7SUFDckQsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1FBQzVCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM1QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQzthQUMxQjtTQUNGO0tBQ0Y7SUFFRCxtRUFBbUU7SUFDbkUsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDakMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFFLENBQUM7WUFDckMsS0FBSyxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN2QztTQUNGO0tBQ0Y7SUFFRCw4REFBOEQ7SUFDOUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDakMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsS0FBSyxNQUFNLFdBQVcsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDakQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUMvQixNQUFNLEtBQUssQ0FBQyx1Q0FBdUMsV0FBVyxFQUFFLENBQUMsQ0FBQztpQkFDbkU7YUFDRjtTQUNGO0tBQ0Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB7Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBoYXNlUHJvcGFnYXRlSTE4blBsYWNlaG9sZGVycyhqb2I6IENvbXBpbGF0aW9uSm9iKSB7XG4gIC8vIEdldCBhbGwgb2YgdGhlIGkxOG4gb3BzLlxuICBjb25zdCBpMThuT3BzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLkkxOG5TdGFydE9wPigpO1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5JMThuU3RhcnQpIHtcbiAgICAgICAgaTE4bk9wcy5zZXQob3AueHJlZiwgb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb3BhZ2F0ZSBpMThuIHBhcmFtcyBmcm9tIHN1Yi10ZW1wbGF0ZXMgdXAgdG8gdGhlIHJvb3QgaTE4biBvcC5cbiAgZm9yIChjb25zdCBvcCBvZiBpMThuT3BzLnZhbHVlcygpKSB7XG4gICAgaWYgKG9wLnhyZWYgIT09IG9wLnJvb3QpIHtcbiAgICAgIGNvbnN0IHJvb3RPcCA9IGkxOG5PcHMuZ2V0KG9wLnJvb3QpITtcbiAgICAgIGZvciAoY29uc3QgW3BsYWNlaG9sZGVyLCB2YWx1ZV0gb2Ygb3AucGFyYW1zKSB7XG4gICAgICAgIHJvb3RPcC5wYXJhbXMuc2V0KHBsYWNlaG9sZGVyLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgdGhlIHJvb3QgaTE4biBvcHMgaGF2ZSBhbGwgcGxhY2Vob2xkZXJzIGZpbGxlZCBpbi5cbiAgZm9yIChjb25zdCBvcCBvZiBpMThuT3BzLnZhbHVlcygpKSB7XG4gICAgaWYgKG9wLnhyZWYgPT09IG9wLnJvb3QpIHtcbiAgICAgIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgaW4gb3AubWVzc2FnZS5wbGFjZWhvbGRlcnMpIHtcbiAgICAgICAgaWYgKCFvcC5wYXJhbXMuaGFzKHBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBpMThuIHBsYWNlaG9sZGVyOiAke3BsYWNlaG9sZGVyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=