UNPKG

@angular/compiler

Version:

Angular - the compiler library

561 lines • 81.5 kB
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define("@angular/compiler/src/render3/view/t2_binder", ["require", "exports", "tslib", "@angular/compiler/src/expression_parser/ast", "@angular/compiler/src/render3/r3_ast", "@angular/compiler/src/render3/view/template", "@angular/compiler/src/render3/view/util"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.R3BoundTarget = exports.R3TargetBinder = void 0; var tslib_1 = require("tslib"); var ast_1 = require("@angular/compiler/src/expression_parser/ast"); var r3_ast_1 = require("@angular/compiler/src/render3/r3_ast"); var template_1 = require("@angular/compiler/src/render3/view/template"); var util_1 = require("@angular/compiler/src/render3/view/util"); /** * Processes `Target`s with a given set of directives and performs a binding operation, which * returns an object similar to TypeScript's `ts.TypeChecker` that contains knowledge about the * target. */ var R3TargetBinder = /** @class */ (function () { function R3TargetBinder(directiveMatcher) { this.directiveMatcher = directiveMatcher; } /** * Perform a binding operation on the given `Target` and return a `BoundTarget` which contains * metadata about the types referenced in the template. */ R3TargetBinder.prototype.bind = function (target) { if (!target.template) { // TODO(alxhub): handle targets which contain things like HostBindings, etc. throw new Error('Binding without a template not yet supported'); } // First, parse the template into a `Scope` structure. This operation captures the syntactic // scopes in the template and makes them available for later use. var scope = Scope.apply(target.template); // Use the `Scope` to extract the entities present at every level of the template. var templateEntities = extractTemplateEntities(scope); // Next, perform directive matching on the template using the `DirectiveBinder`. This returns: // - directives: Map of nodes (elements & ng-templates) to the directives on them. // - bindings: Map of inputs, outputs, and attributes to the directive/element that claims // them. TODO(alxhub): handle multiple directives claiming an input/output/etc. // - references: Map of #references to their targets. var _a = DirectiveBinder.apply(target.template, this.directiveMatcher), directives = _a.directives, bindings = _a.bindings, references = _a.references; // Finally, run the TemplateBinder to bind references, variables, and other entities within the // template. This extracts all the metadata that doesn't depend on directive matching. var _b = TemplateBinder.apply(target.template, scope), expressions = _b.expressions, symbols = _b.symbols, nestingLevel = _b.nestingLevel, usedPipes = _b.usedPipes; return new R3BoundTarget(target, directives, bindings, references, expressions, symbols, nestingLevel, templateEntities, usedPipes); }; return R3TargetBinder; }()); exports.R3TargetBinder = R3TargetBinder; /** * Represents a binding scope within a template. * * Any variables, references, or other named entities declared within the template will * be captured and available by name in `namedEntities`. Additionally, child templates will * be analyzed and have their child `Scope`s available in `childScopes`. */ var Scope = /** @class */ (function () { function Scope(parentScope, template) { this.parentScope = parentScope; this.template = template; /** * Named members of the `Scope`, such as `Reference`s or `Variable`s. */ this.namedEntities = new Map(); /** * Child `Scope`s for immediately nested `Template`s. */ this.childScopes = new Map(); } Scope.newRootScope = function () { return new Scope(null, null); }; /** * Process a template (either as a `Template` sub-template with variables, or a plain array of * template `Node`s) and construct its `Scope`. */ Scope.apply = function (template) { var scope = Scope.newRootScope(); scope.ingest(template); return scope; }; /** * Internal method to process the template and populate the `Scope`. */ Scope.prototype.ingest = function (template) { var _this = this; if (template instanceof r3_ast_1.Template) { // Variables on an <ng-template> are defined in the inner scope. template.variables.forEach(function (node) { return _this.visitVariable(node); }); // Process the nodes of the template. template.children.forEach(function (node) { return node.visit(_this); }); } else { // No overarching `Template` instance, so process the nodes directly. template.forEach(function (node) { return node.visit(_this); }); } }; Scope.prototype.visitElement = function (element) { var _this = this; // `Element`s in the template may have `Reference`s which are captured in the scope. element.references.forEach(function (node) { return _this.visitReference(node); }); // Recurse into the `Element`'s children. element.children.forEach(function (node) { return node.visit(_this); }); }; Scope.prototype.visitTemplate = function (template) { var _this = this; // References on a <ng-template> are defined in the outer scope, so capture them before // processing the template's child scope. template.references.forEach(function (node) { return _this.visitReference(node); }); // Next, create an inner scope and process the template within it. var scope = new Scope(this, template); scope.ingest(template); this.childScopes.set(template, scope); }; Scope.prototype.visitVariable = function (variable) { // Declare the variable if it's not already. this.maybeDeclare(variable); }; Scope.prototype.visitReference = function (reference) { // Declare the variable if it's not already. this.maybeDeclare(reference); }; // Unused visitors. Scope.prototype.visitContent = function (content) { }; Scope.prototype.visitBoundAttribute = function (attr) { }; Scope.prototype.visitBoundEvent = function (event) { }; Scope.prototype.visitBoundText = function (text) { }; Scope.prototype.visitText = function (text) { }; Scope.prototype.visitTextAttribute = function (attr) { }; Scope.prototype.visitIcu = function (icu) { }; Scope.prototype.maybeDeclare = function (thing) { // Declare something with a name, as long as that name isn't taken. if (!this.namedEntities.has(thing.name)) { this.namedEntities.set(thing.name, thing); } }; /** * Look up a variable within this `Scope`. * * This can recurse into a parent `Scope` if it's available. */ Scope.prototype.lookup = function (name) { if (this.namedEntities.has(name)) { // Found in the local scope. return this.namedEntities.get(name); } else if (this.parentScope !== null) { // Not in the local scope, but there's a parent scope so check there. return this.parentScope.lookup(name); } else { // At the top level and it wasn't found. return null; } }; /** * Get the child scope for a `Template`. * * This should always be defined. */ Scope.prototype.getChildScope = function (template) { var res = this.childScopes.get(template); if (res === undefined) { throw new Error("Assertion error: child scope for " + template + " not found"); } return res; }; return Scope; }()); /** * Processes a template and matches directives on nodes (elements and templates). * * Usually used via the static `apply()` method. */ var DirectiveBinder = /** @class */ (function () { function DirectiveBinder(matcher, directives, bindings, references) { this.matcher = matcher; this.directives = directives; this.bindings = bindings; this.references = references; } /** * Process a template (list of `Node`s) and perform directive matching against each node. * * @param template the list of template `Node`s to match (recursively). * @param selectorMatcher a `SelectorMatcher` containing the directives that are in scope for * this template. * @returns three maps which contain information about directives in the template: the * `directives` map which lists directives matched on each node, the `bindings` map which * indicates which directives claimed which bindings (inputs, outputs, etc), and the `references` * map which resolves #references (`Reference`s) within the template to the named directive or * template node. */ DirectiveBinder.apply = function (template, selectorMatcher) { var directives = new Map(); var bindings = new Map(); var references = new Map(); var matcher = new DirectiveBinder(selectorMatcher, directives, bindings, references); matcher.ingest(template); return { directives: directives, bindings: bindings, references: references }; }; DirectiveBinder.prototype.ingest = function (template) { var _this = this; template.forEach(function (node) { return node.visit(_this); }); }; DirectiveBinder.prototype.visitElement = function (element) { this.visitElementOrTemplate(element.name, element); }; DirectiveBinder.prototype.visitTemplate = function (template) { this.visitElementOrTemplate('ng-template', template); }; DirectiveBinder.prototype.visitElementOrTemplate = function (elementName, node) { var _this = this; // First, determine the HTML shape of the node for the purpose of directive matching. // Do this by building up a `CssSelector` for the node. var cssSelector = template_1.createCssSelector(elementName, util_1.getAttrsForDirectiveMatching(node)); // Next, use the `SelectorMatcher` to get the list of directives on the node. var directives = []; this.matcher.match(cssSelector, function (_, directive) { return directives.push(directive); }); if (directives.length > 0) { this.directives.set(node, directives); } // Resolve any references that are created on this node. node.references.forEach(function (ref) { var dirTarget = null; // If the reference expression is empty, then it matches the "primary" directive on the node // (if there is one). Otherwise it matches the host node itself (either an element or // <ng-template> node). if (ref.value.trim() === '') { // This could be a reference to a component if there is one. dirTarget = directives.find(function (dir) { return dir.isComponent; }) || null; } else { // This should be a reference to a directive exported via exportAs. dirTarget = directives.find(function (dir) { return dir.exportAs !== null && dir.exportAs.some(function (value) { return value === ref.value; }); }) || null; // Check if a matching directive was found. if (dirTarget === null) { // No matching directive was found - this reference points to an unknown target. Leave it // unmapped. return; } } if (dirTarget !== null) { // This reference points to a directive. _this.references.set(ref, { directive: dirTarget, node: node }); } else { // This reference points to the node itself. _this.references.set(ref, node); } }); var setAttributeBinding = function (attribute, ioType) { var dir = directives.find(function (dir) { return dir[ioType].hasBindingPropertyName(attribute.name); }); var binding = dir !== undefined ? dir : node; _this.bindings.set(attribute, binding); }; // Node inputs (bound attributes) and text attributes can be bound to an // input on a directive. node.inputs.forEach(function (input) { return setAttributeBinding(input, 'inputs'); }); node.attributes.forEach(function (attr) { return setAttributeBinding(attr, 'inputs'); }); if (node instanceof r3_ast_1.Template) { node.templateAttrs.forEach(function (attr) { return setAttributeBinding(attr, 'inputs'); }); } // Node outputs (bound events) can be bound to an output on a directive. node.outputs.forEach(function (output) { return setAttributeBinding(output, 'outputs'); }); // Recurse into the node's children. node.children.forEach(function (child) { return child.visit(_this); }); }; // Unused visitors. DirectiveBinder.prototype.visitContent = function (content) { }; DirectiveBinder.prototype.visitVariable = function (variable) { }; DirectiveBinder.prototype.visitReference = function (reference) { }; DirectiveBinder.prototype.visitTextAttribute = function (attribute) { }; DirectiveBinder.prototype.visitBoundAttribute = function (attribute) { }; DirectiveBinder.prototype.visitBoundEvent = function (attribute) { }; DirectiveBinder.prototype.visitBoundAttributeOrEvent = function (node) { }; DirectiveBinder.prototype.visitText = function (text) { }; DirectiveBinder.prototype.visitBoundText = function (text) { }; DirectiveBinder.prototype.visitIcu = function (icu) { }; return DirectiveBinder; }()); /** * Processes a template and extract metadata about expressions and symbols within. * * This is a companion to the `DirectiveBinder` that doesn't require knowledge of directives matched * within the template in order to operate. * * Expressions are visited by the superclass `RecursiveAstVisitor`, with custom logic provided * by overridden methods from that visitor. */ var TemplateBinder = /** @class */ (function (_super) { tslib_1.__extends(TemplateBinder, _super); function TemplateBinder(bindings, symbols, usedPipes, nestingLevel, scope, template, level) { var _this = _super.call(this) || this; _this.bindings = bindings; _this.symbols = symbols; _this.usedPipes = usedPipes; _this.nestingLevel = nestingLevel; _this.scope = scope; _this.template = template; _this.level = level; _this.pipesUsed = []; // Save a bit of processing time by constructing this closure in advance. _this.visitNode = function (node) { return node.visit(_this); }; return _this; } // This method is defined to reconcile the type of TemplateBinder since both // RecursiveAstVisitor and Visitor define the visit() method in their // interfaces. TemplateBinder.prototype.visit = function (node, context) { if (node instanceof ast_1.AST) { node.visit(this, context); } else { node.visit(this); } }; /** * Process a template and extract metadata about expressions and symbols within. * * @param template the nodes of the template to process * @param scope the `Scope` of the template being processed. * @returns three maps which contain metadata about the template: `expressions` which interprets * special `AST` nodes in expressions as pointing to references or variables declared within the * template, `symbols` which maps those variables and references to the nested `Template` which * declares them, if any, and `nestingLevel` which associates each `Template` with a integer * nesting level (how many levels deep within the template structure the `Template` is), starting * at 1. */ TemplateBinder.apply = function (template, scope) { var expressions = new Map(); var symbols = new Map(); var nestingLevel = new Map(); var usedPipes = new Set(); // The top-level template has nesting level 0. var binder = new TemplateBinder(expressions, symbols, usedPipes, nestingLevel, scope, template instanceof r3_ast_1.Template ? template : null, 0); binder.ingest(template); return { expressions: expressions, symbols: symbols, nestingLevel: nestingLevel, usedPipes: usedPipes }; }; TemplateBinder.prototype.ingest = function (template) { if (template instanceof r3_ast_1.Template) { // For <ng-template>s, process only variables and child nodes. Inputs, outputs, templateAttrs, // and references were all processed in the scope of the containing template. template.variables.forEach(this.visitNode); template.children.forEach(this.visitNode); // Set the nesting level. this.nestingLevel.set(template, this.level); } else { // Visit each node from the top-level template. template.forEach(this.visitNode); } }; TemplateBinder.prototype.visitElement = function (element) { // Visit the inputs, outputs, and children of the element. element.inputs.forEach(this.visitNode); element.outputs.forEach(this.visitNode); element.children.forEach(this.visitNode); }; TemplateBinder.prototype.visitTemplate = function (template) { // First, visit inputs, outputs and template attributes of the template node. template.inputs.forEach(this.visitNode); template.outputs.forEach(this.visitNode); template.templateAttrs.forEach(this.visitNode); // References are also evaluated in the outer context. template.references.forEach(this.visitNode); // Next, recurse into the template using its scope, and bumping the nesting level up by one. var childScope = this.scope.getChildScope(template); var binder = new TemplateBinder(this.bindings, this.symbols, this.usedPipes, this.nestingLevel, childScope, template, this.level + 1); binder.ingest(template); }; TemplateBinder.prototype.visitVariable = function (variable) { // Register the `Variable` as a symbol in the current `Template`. if (this.template !== null) { this.symbols.set(variable, this.template); } }; TemplateBinder.prototype.visitReference = function (reference) { // Register the `Reference` as a symbol in the current `Template`. if (this.template !== null) { this.symbols.set(reference, this.template); } }; // Unused template visitors TemplateBinder.prototype.visitText = function (text) { }; TemplateBinder.prototype.visitContent = function (content) { }; TemplateBinder.prototype.visitTextAttribute = function (attribute) { }; TemplateBinder.prototype.visitIcu = function (icu) { var _this = this; Object.keys(icu.vars).forEach(function (key) { return icu.vars[key].visit(_this); }); Object.keys(icu.placeholders).forEach(function (key) { return icu.placeholders[key].visit(_this); }); }; // The remaining visitors are concerned with processing AST expressions within template bindings TemplateBinder.prototype.visitBoundAttribute = function (attribute) { attribute.value.visit(this); }; TemplateBinder.prototype.visitBoundEvent = function (event) { event.handler.visit(this); }; TemplateBinder.prototype.visitBoundText = function (text) { text.value.visit(this); }; TemplateBinder.prototype.visitPipe = function (ast, context) { this.usedPipes.add(ast.name); return _super.prototype.visitPipe.call(this, ast, context); }; // These five types of AST expressions can refer to expression roots, which could be variables // or references in the current scope. TemplateBinder.prototype.visitPropertyRead = function (ast, context) { this.maybeMap(context, ast, ast.name); return _super.prototype.visitPropertyRead.call(this, ast, context); }; TemplateBinder.prototype.visitSafePropertyRead = function (ast, context) { this.maybeMap(context, ast, ast.name); return _super.prototype.visitSafePropertyRead.call(this, ast, context); }; TemplateBinder.prototype.visitPropertyWrite = function (ast, context) { this.maybeMap(context, ast, ast.name); return _super.prototype.visitPropertyWrite.call(this, ast, context); }; TemplateBinder.prototype.visitMethodCall = function (ast, context) { this.maybeMap(context, ast, ast.name); return _super.prototype.visitMethodCall.call(this, ast, context); }; TemplateBinder.prototype.visitSafeMethodCall = function (ast, context) { this.maybeMap(context, ast, ast.name); return _super.prototype.visitSafeMethodCall.call(this, ast, context); }; TemplateBinder.prototype.maybeMap = function (scope, ast, name) { // If the receiver of the expression isn't the `ImplicitReceiver`, this isn't the root of an // `AST` expression that maps to a `Variable` or `Reference`. if (!(ast.receiver instanceof ast_1.ImplicitReceiver)) { return; } // Check whether the name exists in the current scope. If so, map it. Otherwise, the name is // probably a property on the top-level component context. var target = this.scope.lookup(name); if (target !== null) { this.bindings.set(ast, target); } }; return TemplateBinder; }(ast_1.RecursiveAstVisitor)); /** * Metadata container for a `Target` that allows queries for specific bits of metadata. * * See `BoundTarget` for documentation on the individual methods. */ var R3BoundTarget = /** @class */ (function () { function R3BoundTarget(target, directives, bindings, references, exprTargets, symbols, nestingLevel, templateEntities, usedPipes) { this.target = target; this.directives = directives; this.bindings = bindings; this.references = references; this.exprTargets = exprTargets; this.symbols = symbols; this.nestingLevel = nestingLevel; this.templateEntities = templateEntities; this.usedPipes = usedPipes; } R3BoundTarget.prototype.getEntitiesInTemplateScope = function (template) { var _a; return (_a = this.templateEntities.get(template)) !== null && _a !== void 0 ? _a : new Set(); }; R3BoundTarget.prototype.getDirectivesOfNode = function (node) { return this.directives.get(node) || null; }; R3BoundTarget.prototype.getReferenceTarget = function (ref) { return this.references.get(ref) || null; }; R3BoundTarget.prototype.getConsumerOfBinding = function (binding) { return this.bindings.get(binding) || null; }; R3BoundTarget.prototype.getExpressionTarget = function (expr) { return this.exprTargets.get(expr) || null; }; R3BoundTarget.prototype.getTemplateOfSymbol = function (symbol) { return this.symbols.get(symbol) || null; }; R3BoundTarget.prototype.getNestingLevel = function (template) { return this.nestingLevel.get(template) || 0; }; R3BoundTarget.prototype.getUsedDirectives = function () { var set = new Set(); this.directives.forEach(function (dirs) { return dirs.forEach(function (dir) { return set.add(dir); }); }); return Array.from(set.values()); }; R3BoundTarget.prototype.getUsedPipes = function () { return Array.from(this.usedPipes); }; return R3BoundTarget; }()); exports.R3BoundTarget = R3BoundTarget; function extractTemplateEntities(rootScope) { var e_1, _a, e_2, _b; var entityMap = new Map(); function extractScopeEntities(scope) { if (entityMap.has(scope.template)) { return entityMap.get(scope.template); } var currentEntities = scope.namedEntities; var templateEntities; if (scope.parentScope !== null) { templateEntities = new Map(tslib_1.__spread(extractScopeEntities(scope.parentScope), currentEntities)); } else { templateEntities = new Map(currentEntities); } entityMap.set(scope.template, templateEntities); return templateEntities; } var scopesToProcess = [rootScope]; while (scopesToProcess.length > 0) { var scope = scopesToProcess.pop(); try { for (var _c = (e_1 = void 0, tslib_1.__values(scope.childScopes.values())), _d = _c.next(); !_d.done; _d = _c.next()) { var childScope = _d.value; scopesToProcess.push(childScope); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } extractScopeEntities(scope); } var templateEntities = new Map(); try { for (var entityMap_1 = tslib_1.__values(entityMap), entityMap_1_1 = entityMap_1.next(); !entityMap_1_1.done; entityMap_1_1 = entityMap_1.next()) { var _e = tslib_1.__read(entityMap_1_1.value, 2), template = _e[0], entities = _e[1]; templateEntities.set(template, new Set(entities.values())); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (entityMap_1_1 && !entityMap_1_1.done && (_b = entityMap_1.return)) _b.call(entityMap_1); } finally { if (e_2) throw e_2.error; } } return templateEntities; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidDJfYmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3JlbmRlcjMvdmlldy90Ml9iaW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7OztJQUVILG1FQUErSztJQUUvSywrREFBMEo7SUFHMUosd0VBQTZDO0lBQzdDLGdFQUFvRDtJQUdwRDs7OztPQUlHO0lBQ0g7UUFDRSx3QkFBb0IsZ0JBQTZDO1lBQTdDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBNkI7UUFBRyxDQUFDO1FBRXJFOzs7V0FHRztRQUNILDZCQUFJLEdBQUosVUFBSyxNQUFjO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNwQiw0RUFBNEU7Z0JBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQzthQUNqRTtZQUVELDRGQUE0RjtZQUM1RixpRUFBaUU7WUFDakUsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFHM0Msa0ZBQWtGO1lBQ2xGLElBQU0sZ0JBQWdCLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEQsOEZBQThGO1lBQzlGLG9GQUFvRjtZQUNwRiw0RkFBNEY7WUFDNUYsbUZBQW1GO1lBQ25GLHVEQUF1RDtZQUNqRCxJQUFBLEtBQ0YsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUQxRCxVQUFVLGdCQUFBLEVBQUUsUUFBUSxjQUFBLEVBQUUsVUFBVSxnQkFDMEIsQ0FBQztZQUNsRSwrRkFBK0Y7WUFDL0Ysc0ZBQXNGO1lBQ2hGLElBQUEsS0FDRixjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFD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QzVCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM1RDs7Ozs7Ozs7O1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7QVNULCBCaW5kaW5nUGlwZSwgSW1wbGljaXRSZWNlaXZlciwgTWV0aG9kQ2FsbCwgUHJvcGVydHlSZWFkLCBQcm9wZXJ0eVdyaXRlLCBSZWN1cnNpdmVBc3RWaXNpdG9yLCBTYWZlTWV0aG9kQ2FsbCwgU2FmZVByb3BlcnR5UmVhZH0gZnJvbSAnLi4vLi4vZXhwcmVzc2lvbl9wYXJzZXIvYXN0Jzt