UNPKG

@glimmer/syntax

Version:
301 lines (270 loc) 22.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadResolution = loadResolution; exports.ARGUMENT_RESOLUTION = exports.LooseModeResolution = exports.STRICT_RESOLUTION = exports.StrictResolution = void 0; /** * A free variable is resolved according to a resolution rule: * * 1. Strict resolution * 2. Namespaced resolution * 3. Fallback resolution */ /** * Strict resolution is used: * * 1. in a strict mode template * 2. in an unambiguous invocation with dot paths */ class StrictResolution { constructor() { this.isAngleBracket = false; } resolution() { return 31 /* GetStrictFree */ ; } serialize() { return 'Strict'; } } exports.StrictResolution = StrictResolution; const STRICT_RESOLUTION = new StrictResolution(); /** * A `LooseModeResolution` includes: * * - 0 or more namespaces to resolve the variable in * - optional fallback behavior * * In practice, there are a limited number of possible combinations of these degrees of freedom, * and they are captured by the `Ambiguity` union below. */ exports.STRICT_RESOLUTION = STRICT_RESOLUTION; class LooseModeResolution { constructor(ambiguity, isAngleBracket = false) { this.ambiguity = ambiguity; this.isAngleBracket = isAngleBracket; } /** * Namespaced resolution is used in an unambiguous syntax position: * * 1. `(sexp)` (namespace: `Helper`) * 2. `{{#block}}` (namespace: `Component`) * 3. `<a {{modifier}}>` (namespace: `Modifier`) * 4. `<Component />` (namespace: `Component`) * * @see {NamespacedAmbiguity} */ static namespaced(namespace, isAngleBracket = false) { return new LooseModeResolution({ namespaces: [namespace], fallback: false }, isAngleBracket); } /** * Fallback resolution is used when no namespaced resolutions are possible, but fallback * resolution is still allowed. * * ```hbs * {{x.y}} * ``` * * @see {FallbackAmbiguity} */ static fallback() { return new LooseModeResolution({ namespaces: [], fallback: true }); } /** * Append resolution is used when the variable should be resolved in both the `component` and * `helper` namespaces. Fallback resolution is optional. * * ```hbs * {{x}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces with fallback resolution. * * ```hbs * {{x y}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces without fallback * resolution. * * @see {ComponentOrHelperAmbiguity} */ static append({ invoke }) { return new LooseModeResolution({ namespaces: ["Component" /* Component */ , "Helper" /* Helper */ ], fallback: !invoke }); } /** * Trusting append resolution is used when the variable should be resolved in both the `component` and * `helper` namespaces. Fallback resolution is optional. * * ```hbs * {{{x}}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces with fallback resolution. * * ```hbs * {{{x y}}} * ``` * * ^ `x` should be resolved in the `component` and `helper` namespaces without fallback * resolution. * * @see {HelperAmbiguity} */ static trustingAppend({ invoke }) { return new LooseModeResolution({ namespaces: ["Helper" /* Helper */ ], fallback: !invoke }); } /** * Attribute resolution is used when the variable should be resolved as a `helper` with fallback * resolution. * * ```hbs * <a href={{x}} /> * <a href="{{x}}.html" /> * ``` * * ^ resolved in the `helper` namespace with fallback * * @see {HelperAmbiguity} */ static attr() { return new LooseModeResolution({ namespaces: ["Helper" /* Helper */ ], fallback: true }); } resolution() { if (this.ambiguity.namespaces.length === 0) { return 31 /* GetStrictFree */ ; } else if (this.ambiguity.namespaces.length === 1) { if (this.ambiguity.fallback) { // simple namespaced resolution with fallback must be attr={{x}} return 36 /* GetFreeAsHelperHeadOrThisFallback */ ; } else { // simple namespaced resolution without fallback switch (this.ambiguity.namespaces[0]) { case "Helper" /* Helper */ : return 37 /* GetFreeAsHelperHead */ ; case "Modifier" /* Modifier */ : return 38 /* GetFreeAsModifierHead */ ; case "Component" /* Component */ : return 39 /* GetFreeAsComponentHead */ ; } } } else if (this.ambiguity.fallback) { // component or helper + fallback ({{something}}) return 34 /* GetFreeAsComponentOrHelperHeadOrThisFallback */ ; } else { // component or helper without fallback ({{something something}}) return 35 /* GetFreeAsComponentOrHelperHead */ ; } } serialize() { if (this.ambiguity.namespaces.length === 0) { return 'Loose'; } else if (this.ambiguity.namespaces.length === 1) { if (this.ambiguity.fallback) { // simple namespaced resolution with fallback must be attr={{x}} return ['ambiguous', "Attr" /* Attr */ ]; } else { return ['ns', this.ambiguity.namespaces[0]]; } } else if (this.ambiguity.fallback) { // component or helper + fallback ({{something}}) return ['ambiguous', "Append" /* Append */ ]; } else { // component or helper without fallback ({{something something}}) return ['ambiguous', "Invoke" /* Invoke */ ]; } } } exports.LooseModeResolution = LooseModeResolution; const ARGUMENT_RESOLUTION = LooseModeResolution.fallback(); exports.ARGUMENT_RESOLUTION = ARGUMENT_RESOLUTION; function loadResolution(resolution) { if (typeof resolution === 'string') { switch (resolution) { case 'Loose': return LooseModeResolution.fallback(); case 'Strict': return STRICT_RESOLUTION; } } switch (resolution[0]) { case 'ambiguous': switch (resolution[1]) { case "Append" /* Append */ : return LooseModeResolution.append({ invoke: false }); case "Attr" /* Attr */ : return LooseModeResolution.attr(); case "Invoke" /* Invoke */ : return LooseModeResolution.append({ invoke: true }); } case 'ns': return LooseModeResolution.namespaced(resolution[1]); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9vYmplY3RzL3Jlc29sdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7QUFVQTs7Ozs7O0FBTU0sTUFBQSxnQkFBQSxDQUF1QjtBQUE3QixFQUFBLFdBQUEsR0FBQTtBQVNXLFNBQUEsY0FBQSxHQUFBLEtBQUE7QUFDVjs7QUFUQyxFQUFBLFVBQVUsR0FBQTtBQUNSLFdBQUE7QUFBQTtBQUFBO0FBQ0Q7O0FBRUQsRUFBQSxTQUFTLEdBQUE7QUFDUCxXQUFBLFFBQUE7QUFDRDs7QUFQMEI7OztBQVl0QixNQUFNLGlCQUFpQixHQUFHLElBQTFCLGdCQUEwQixFQUExQjtBQUVQOzs7Ozs7Ozs7Ozs7QUFTTSxNQUFBLG1CQUFBLENBQTBCO0FBd0c5QixFQUFBLFdBQUEsQ0FBQSxTQUFBLEVBQW9ELGNBQUEsR0FBcEQsS0FBQSxFQUEwRTtBQUFyRCxTQUFBLFNBQUEsR0FBQSxTQUFBO0FBQStCLFNBQUEsY0FBQSxHQUFBLGNBQUE7QUFBMEI7QUF2RzlFOzs7Ozs7Ozs7Ozs7QUFVQSxTQUFBLFVBQUEsQ0FBQSxTQUFBLEVBQStDLGNBQWMsR0FBN0QsS0FBQSxFQUFxRTtBQUNuRSxXQUFPLElBQUEsbUJBQUEsQ0FDTDtBQUNFLE1BQUEsVUFBVSxFQUFFLENBRGQsU0FDYyxDQURkO0FBRUUsTUFBQSxRQUFRLEVBQUU7QUFGWixLQURLLEVBQVAsY0FBTyxDQUFQO0FBT0Q7QUFFRDs7Ozs7Ozs7Ozs7O0FBVUEsU0FBQSxRQUFBLEdBQWU7QUFDYixXQUFPLElBQUEsbUJBQUEsQ0FBd0I7QUFBRSxNQUFBLFVBQVUsRUFBWixFQUFBO0FBQWtCLE1BQUEsUUFBUSxFQUFFO0FBQTVCLEtBQXhCLENBQVA7QUFDRDtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsU0FBQSxNQUFBLENBQWM7QUFBRSxJQUFBO0FBQUYsR0FBZCxFQUE2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QUFDRSxjQUFRLFVBQVUsQ0FBbEIsQ0FBa0IsQ0FBbEI7QUFDRSxhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLG1CQUFtQixDQUFuQixNQUFBLENBQTJCO0FBQUUsWUFBQSxNQUFNLEVBQUU7QUFBVixXQUEzQixDQUFQOztBQUNGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sbUJBQW1CLENBQTFCLElBQU8sRUFBUDs7QUFDRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLG1CQUFtQixDQUFuQixNQUFBLENBQTJCO0FBQUUsWUFBQSxNQUFNLEVBQUU7QUFBVixXQUEzQixDQUFQO0FBTko7O0FBU0YsU0FBQSxJQUFBO0FBQ0UsYUFBTyxtQkFBbUIsQ0FBbkIsVUFBQSxDQUErQixVQUFVLENBQWhELENBQWdELENBQXpDLENBQVA7QUFaSjtBQWNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIGZyZWUgdmFyaWFibGUgaXMgcmVzb2x2ZWQgYWNjb3JkaW5nIHRvIGEgcmVzb2x1dGlvbiBydWxlOlxuICpcbiAqIDEuIFN0cmljdCByZXNvbHV0aW9uXG4gKiAyLiBOYW1lc3BhY2VkIHJlc29sdXRpb25cbiAqIDMuIEZhbGxiYWNrIHJlc29sdXRpb25cbiAqL1xuXG5pbXBvcnQgeyBHZXRDb250ZXh0dWFsRnJlZU9wLCBTZXhwT3Bjb2RlcyB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIFN0cmljdCByZXNvbHV0aW9uIGlzIHVzZWQ6XG4gKlxuICogMS4gaW4gYSBzdHJpY3QgbW9kZSB0ZW1wbGF0ZVxuICogMi4gaW4gYW4gdW5hbWJpZ3VvdXMgaW52b2NhdGlvbiB3aXRoIGRvdCBwYXRoc1xuICovXG5leHBvcnQgY2xhc3MgU3RyaWN0UmVzb2x1dGlvbiB7XG4gIHJlc29sdXRpb24oKTogR2V0Q29udGV4dHVhbEZyZWVPcCB7XG4gICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldFN0cmljdEZyZWU7XG4gIH1cblxuICBzZXJpYWxpemUoKTogU2VyaWFsaXplZFJlc29sdXRpb24ge1xuICAgIHJldHVybiAnU3RyaWN0JztcbiAgfVxuXG4gIHJlYWRvbmx5IGlzQW5nbGVCcmFja2V0ID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBTVFJJQ1RfUkVTT0xVVElPTiA9IG5ldyBTdHJpY3RSZXNvbHV0aW9uKCk7XG5cbi8qKlxuICogQSBgTG9vc2VNb2RlUmVzb2x1dGlvbmAgaW5jbHVkZXM6XG4gKlxuICogLSAwIG9yIG1vcmUgbmFtZXNwYWNlcyB0byByZXNvbHZlIHRoZSB2YXJpYWJsZSBpblxuICogLSBvcHRpb25hbCBmYWxsYmFjayBiZWhhdmlvclxuICpcbiAqIEluIHByYWN0aWNlLCB0aGVyZSBhcmUgYSBsaW1pdGVkIG51bWJlciBvZiBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlc2UgZGVncmVlcyBvZiBmcmVlZG9tLFxuICogYW5kIHRoZXkgYXJlIGNhcHR1cmVkIGJ5IHRoZSBgQW1iaWd1aXR5YCB1bmlvbiBiZWxvdy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvb3NlTW9kZVJlc29sdXRpb24ge1xuICAvKipcbiAgICogTmFtZXNwYWNlZCByZXNvbHV0aW9uIGlzIHVzZWQgaW4gYW4gdW5hbWJpZ3VvdXMgc3ludGF4IHBvc2l0aW9uOlxuICAgKlxuICAgKiAxLiBgKHNleHApYCAobmFtZXNwYWNlOiBgSGVscGVyYClcbiAgICogMi4gYHt7I2Jsb2NrfX1gIChuYW1lc3BhY2U6IGBDb21wb25lbnRgKVxuICAgKiAzLiBgPGEge3ttb2RpZmllcn19PmAgKG5hbWVzcGFjZTogYE1vZGlmaWVyYClcbiAgICogNC4gYDxDb21wb25lbnQgLz5gIChuYW1lc3BhY2U6IGBDb21wb25lbnRgKVxuICAgKlxuICAgKiBAc2VlIHtOYW1lc3BhY2VkQW1iaWd1aXR5fVxuICAgKi9cbiAgc3RhdGljIG5hbWVzcGFjZWQobmFtZXNwYWNlOiBGcmVlVmFyTmFtZXNwYWNlLCBpc0FuZ2xlQnJhY2tldCA9IGZhbHNlKTogTG9vc2VNb2RlUmVzb2x1dGlvbiB7XG4gICAgcmV0dXJuIG5ldyBMb29zZU1vZGVSZXNvbHV0aW9uKFxuICAgICAge1xuICAgICAgICBuYW1lc3BhY2VzOiBbbmFtZXNwYWNlXSxcbiAgICAgICAgZmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGlzQW5nbGVCcmFja2V0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayByZXNvbHV0aW9uIGlzIHVzZWQgd2hlbiBubyBuYW1lc3BhY2VkIHJlc29sdXRpb25zIGFyZSBwb3NzaWJsZSwgYnV0IGZhbGxiYWNrXG4gICAqIHJlc29sdXRpb24gaXMgc3RpbGwgYWxsb3dlZC5cbiAgICpcbiAgICogYGBgaGJzXG4gICAqIHt7eC55fX1cbiAgICogYGBgXG4gICAqXG4gICAqIEBzZWUge0ZhbGxiYWNrQW1iaWd1aXR5fVxuICAgKi9cbiAgc3RhdGljIGZhbGxiYWNrKCk6IExvb3NlTW9kZVJlc29sdXRpb24ge1xuICAgIHJldHVybiBuZXcgTG9vc2VNb2RlUmVzb2x1dGlvbih7IG5hbWVzcGFjZXM6IFtdLCBmYWxsYmFjazogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgcmVzb2x1dGlvbiBpcyB1c2VkIHdoZW4gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSByZXNvbHZlZCBpbiBib3RoIHRoZSBgY29tcG9uZW50YCBhbmRcbiAgICogYGhlbHBlcmAgbmFtZXNwYWNlcy4gRmFsbGJhY2sgcmVzb2x1dGlvbiBpcyBvcHRpb25hbC5cbiAgICpcbiAgICogYGBgaGJzXG4gICAqIHt7eH19XG4gICAqIGBgYFxuICAgKlxuICAgKiBeIGB4YCBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gdGhlIGBjb21wb25lbnRgIGFuZCBgaGVscGVyYCBuYW1lc3BhY2VzIHdpdGggZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogYGBgaGJzXG4gICAqIHt7eCB5fX1cbiAgICogYGBgXG4gICAqXG4gICAqIF4gYHhgIHNob3VsZCBiZSByZXNvbHZlZCBpbiB0aGUgYGNvbXBvbmVudGAgYW5kIGBoZWxwZXJgIG5hbWVzcGFjZXMgd2l0aG91dCBmYWxsYmFja1xuICAgKiByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBAc2VlIHtDb21wb25lbnRPckhlbHBlckFtYmlndWl0eX1cbiAgICovXG4gIHN0YXRpYyBhcHBlbmQoeyBpbnZva2UgfTogeyBpbnZva2U6IGJvb2xlYW4gfSk6IExvb3NlTW9kZVJlc29sdXRpb24ge1xuICAgIHJldHVybiBuZXcgTG9vc2VNb2RlUmVzb2x1dGlvbih7XG4gICAgICBuYW1lc3BhY2VzOiBbRnJlZVZhck5hbWVzcGFjZS5Db21wb25lbnQsIEZyZWVWYXJOYW1lc3BhY2UuSGVscGVyXSxcbiAgICAgIGZhbGxiYWNrOiAhaW52b2tlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydXN0aW5nIGFwcGVuZCByZXNvbHV0aW9uIGlzIHVzZWQgd2hlbiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHJlc29sdmVkIGluIGJvdGggdGhlIGBjb21wb25lbnRgIGFuZFxuICAgKiBgaGVscGVyYCBuYW1lc3BhY2VzLiBGYWxsYmFjayByZXNvbHV0aW9uIGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBgYGBoYnNcbiAgICoge3t7eH19fVxuICAgKiBgYGBcbiAgICpcbiAgICogXiBgeGAgc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBgY29tcG9uZW50YCBhbmQgYGhlbHBlcmAgbmFtZXNwYWNlcyB3aXRoIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAqXG4gICAqIGBgYGhic1xuICAgKiB7e3t4IHl9fX1cbiAgICogYGBgXG4gICAqXG4gICAqIF4gYHhgIHNob3VsZCBiZSByZXNvbHZlZCBpbiB0aGUgYGNvbXBvbmVudGAgYW5kIGBoZWxwZXJgIG5hbWVzcGFjZXMgd2l0aG91dCBmYWxsYmFja1xuICAgKiByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBAc2VlIHtIZWxwZXJBbWJpZ3VpdHl9XG4gICAqL1xuICBzdGF0aWMgdHJ1c3RpbmdBcHBlbmQoeyBpbnZva2UgfTogeyBpbnZva2U6IGJvb2xlYW4gfSk6IExvb3NlTW9kZVJlc29sdXRpb24ge1xuICAgIHJldHVybiBuZXcgTG9vc2VNb2RlUmVzb2x1dGlvbih7XG4gICAgICBuYW1lc3BhY2VzOiBbRnJlZVZhck5hbWVzcGFjZS5IZWxwZXJdLFxuICAgICAgZmFsbGJhY2s6ICFpbnZva2UsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0cmlidXRlIHJlc29sdXRpb24gaXMgdXNlZCB3aGVuIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgcmVzb2x2ZWQgYXMgYSBgaGVscGVyYCB3aXRoIGZhbGxiYWNrXG4gICAqIHJlc29sdXRpb24uXG4gICAqXG4gICAqIGBgYGhic1xuICAgKiA8YSBocmVmPXt7eH19IC8+XG4gICAqIDxhIGhyZWY9XCJ7e3h9fS5odG1sXCIgLz5cbiAgICogYGBgXG4gICAqXG4gICAqIF4gcmVzb2x2ZWQgaW4gdGhlIGBoZWxwZXJgIG5hbWVzcGFjZSB3aXRoIGZhbGxiYWNrXG4gICAqXG4gICAqIEBzZWUge0hlbHBlckFtYmlndWl0eX1cbiAgICovXG4gIHN0YXRpYyBhdHRyKCk6IExvb3NlTW9kZVJlc29sdXRpb24ge1xuICAgIHJldHVybiBuZXcgTG9vc2VNb2RlUmVzb2x1dGlvbih7IG5hbWVzcGFjZXM6IFtGcmVlVmFyTmFtZXNwYWNlLkhlbHBlcl0sIGZhbGxiYWNrOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgYW1iaWd1aXR5OiBBbWJpZ3VpdHksIHJlYWRvbmx5IGlzQW5nbGVCcmFja2V0ID0gZmFsc2UpIHt9XG5cbiAgcmVzb2x1dGlvbigpOiBHZXRDb250ZXh0dWFsRnJlZU9wIHtcbiAgICBpZiAodGhpcy5hbWJpZ3VpdHkubmFtZXNwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRTdHJpY3RGcmVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hbWJpZ3VpdHkubmFtZXNwYWNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmICh0aGlzLmFtYmlndWl0eS5mYWxsYmFjaykge1xuICAgICAgICAvLyBzaW1wbGUgbmFtZXNwYWNlZCByZXNvbHV0aW9uIHdpdGggZmFsbGJhY2sgbXVzdCBiZSBhdHRyPXt7eH19XG4gICAgICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaW1wbGUgbmFtZXNwYWNlZCByZXNvbHV0aW9uIHdpdGhvdXQgZmFsbGJhY2tcbiAgICAgICAgc3dpdGNoICh0aGlzLmFtYmlndWl0eS5uYW1lc3BhY2VzWzBdKSB7XG4gICAgICAgICAgY2FzZSBGcmVlVmFyTmFtZXNwYWNlLkhlbHBlcjpcbiAgICAgICAgICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNIZWxwZXJIZWFkO1xuICAgICAgICAgIGNhc2UgRnJlZVZhck5hbWVzcGFjZS5Nb2RpZmllcjpcbiAgICAgICAgICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNNb2RpZmllckhlYWQ7XG4gICAgICAgICAgY2FzZSBGcmVlVmFyTmFtZXNwYWNlLkNvbXBvbmVudDpcbiAgICAgICAgICAgIHJldHVybiBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNDb21wb25lbnRIZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmFtYmlndWl0eS5mYWxsYmFjaykge1xuICAgICAgLy8gY29tcG9uZW50IG9yIGhlbHBlciArIGZhbGxiYWNrICh7e3NvbWV0aGluZ319KVxuICAgICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wb25lbnQgb3IgaGVscGVyIHdpdGhvdXQgZmFsbGJhY2sgKHt7c29tZXRoaW5nIHNvbWV0aGluZ319KVxuICAgICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZDtcbiAgICB9XG4gIH1cblxuICBzZXJpYWxpemUoKTogU2VyaWFsaXplZFJlc29sdXRpb24ge1xuICAgIGlmICh0aGlzLmFtYmlndWl0eS5uYW1lc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICdMb29zZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFtYmlndWl0eS5uYW1lc3BhY2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKHRoaXMuYW1iaWd1aXR5LmZhbGxiYWNrKSB7XG4gICAgICAgIC8vIHNpbXBsZSBuYW1lc3BhY2VkIHJlc29sdXRpb24gd2l0aCBmYWxsYmFjayBtdXN0IGJlIGF0dHI9e3t4fX1cbiAgICAgICAgcmV0dXJuIFsnYW1iaWd1b3VzJywgU2VyaWFsaXplZEFtYmlndWl0eS5BdHRyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbJ25zJywgdGhpcy5hbWJpZ3VpdHkubmFtZXNwYWNlc1swXV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmFtYmlndWl0eS5mYWxsYmFjaykge1xuICAgICAgLy8gY29tcG9uZW50IG9yIGhlbHBlciArIGZhbGxiYWNrICh7e3NvbWV0aGluZ319KVxuICAgICAgcmV0dXJuIFsnYW1iaWd1b3VzJywgU2VyaWFsaXplZEFtYmlndWl0eS5BcHBlbmRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wb25lbnQgb3IgaGVscGVyIHdpdGhvdXQgZmFsbGJhY2sgKHt7c29tZXRoaW5nIHNvbWV0aGluZ319KVxuICAgICAgcmV0dXJuIFsnYW1iaWd1b3VzJywgU2VyaWFsaXplZEFtYmlndWl0eS5JbnZva2VdO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQVJHVU1FTlRfUkVTT0xVVElPTiA9IExvb3NlTW9kZVJlc29sdXRpb24uZmFsbGJhY2soKTtcblxuZXhwb3J0IGNvbnN0IGVudW0gRnJlZVZhck5hbWVzcGFjZSB7XG4gIEhlbHBlciA9ICdIZWxwZXInLFxuICBNb2RpZmllciA9ICdNb2RpZmllcicsXG4gIENvbXBvbmVudCA9ICdDb21wb25lbnQnLFxufVxuXG4vKipcbiAqIEEgYENvbXBvbmVudE9ySGVscGVyQW1iaWd1aXR5YCBtaWdodCBiZSBhIGNvbXBvbmVudCBvciBhIGhlbHBlciwgd2l0aCBhbiBvcHRpb25hbCBmYWxsYmFja1xuICpcbiAqIGBgYGhic1xuICoge3t4fX1cbiAqIGBgYFxuICpcbiAqIF4gYHhgIGlzIHJlc29sdmVkIGluIHRoZSBgY29tcG9uZW50YCBhbmQgYGhlbHBlcmAgbmFtZXNwYWNlcywgd2l0aCBmYWxsYmFja1xuICpcbiAqIGBgYGhic1xuICoge3t4IHl9fVxuICogYGBgXG4gKlxuICogXiBgeGAgaXMgcmVzb2x2ZWQgaW4gdGhlIGBjb21wb25lbnRgIGFuZCBgaGVscGVyYCBuYW1lc3BhY2VzLCB3aXRob3V0IGZhbGxiYWNrXG4gKi9cbnR5cGUgQ29tcG9uZW50T3JIZWxwZXJBbWJpZ3VpdHkgPSB7XG4gIG5hbWVzcGFjZXM6IFtGcmVlVmFyTmFtZXNwYWNlLkNvbXBvbmVudCwgRnJlZVZhck5hbWVzcGFjZS5IZWxwZXJdO1xuICBmYWxsYmFjazogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQSBgSGVscGVyQW1iaWd1aXR5YCBtdXN0IGJlIGEgaGVscGVyLCBidXQgaXQgaGFzIGZhbGxiYWNrLiBJZiBpdCBkaWRuJ3QgaGF2ZSBmYWxsYmFjaywgaXQgd291bGRcbiAqIGJlIGEgYE5hbWVzcGFjZWRBbWJpZ3VpdHlgLlxuICpcbiAqIGBgYGhic1xuICogPGEgaHJlZj17e3h9fSAvPlxuICogPGEgaHJlZj1cInt7eH19Lmh0bWxcIiAvPlxuICogYGBgXG4gKlxuICogXiBgeGAgaXMgcmVzb2x2ZWQgaW4gdGhlIGBoZWxwZXJgIG5hbWVzcGFjZSB3aXRoIGZhbGxiYWNrXG4gKi9cbnR5cGUgSGVscGVyQW1iaWd1aXR5ID0geyBuYW1lc3BhY2VzOiBbRnJlZVZhck5hbWVzcGFjZS5IZWxwZXJdOyBmYWxsYmFjazogYm9vbGVhbiB9O1xuXG4vKipcbiAqIEEgYE5hbWVzcGFjZWRBbWJpZ3VpdHlgIG11c3QgYmUgcmVzb2x2ZWQgaW4gYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZSwgd2l0aG91dCBmYWxsYmFjay5cbiAqXG4gKiBgYGBoYnNcbiAqIDxYIC8+XG4gKiBgYGBcbiAqXG4gKiBeIGBYYCBpcyByZXNvbHZlZCBpbiB0aGUgYGNvbXBvbmVudGAgbmFtZXNwYWNlIHdpdGhvdXQgZmFsbGJhY2tcbiAqXG4gKiBgYGBoYnNcbiAqICh4KVxuICogYGBgXG4gKlxuICogXiBgeGAgaXMgcmVzb2x2ZWQgaW4gdGhlIGBoZWxwZXJgIG5hbWVzcGFjZSB3aXRob3V0IGZhbGxiYWNrXG4gKlxuICogYGBgaGJzXG4gKiA8YSB7e3h9fSAvPlxuICogYGBgXG4gKlxuICogXiBgeGAgaXMgcmVzb2x2ZWQgaW4gdGhlIGBtb2RpZmllcmAgbmFtZXNwYWNlIHdpdGhvdXQgZmFsbGJhY2tcbiAqL1xudHlwZSBOYW1lc3BhY2VkQW1iaWd1aXR5ID0ge1xuICBuYW1lc3BhY2VzOiBbRnJlZVZhck5hbWVzcGFjZS5Db21wb25lbnQgfCBGcmVlVmFyTmFtZXNwYWNlLkhlbHBlciB8IEZyZWVWYXJOYW1lc3BhY2UuTW9kaWZpZXJdO1xuICBmYWxsYmFjazogZmFsc2U7XG59O1xuXG50eXBlIEZhbGxiYWNrQW1iaWd1aXR5ID0ge1xuICBuYW1lc3BhY2VzOiBbXTtcbiAgZmFsbGJhY2s6IHRydWU7XG59O1xuXG50eXBlIEFtYmlndWl0eSA9XG4gIHwgQ29tcG9uZW50T3JIZWxwZXJBbWJpZ3VpdHlcbiAgfCBIZWxwZXJBbWJpZ3VpdHlcbiAgfCBOYW1lc3BhY2VkQW1iaWd1aXR5XG4gIHwgRmFsbGJhY2tBbWJpZ3VpdHk7XG5cbmV4cG9ydCB0eXBlIEZyZWVWYXJSZXNvbHV0aW9uID0gU3RyaWN0UmVzb2x1dGlvbiB8IExvb3NlTW9kZVJlc29sdXRpb247XG5cbi8vIFNlcmlhbGl6YXRpb25cblxuY29uc3QgZW51bSBTZXJpYWxpemVkQW1iaWd1aXR5IHtcbiAgLy8ge3t4fX1cbiAgQXBwZW5kID0gJ0FwcGVuZCcsXG4gIC8vIGhyZWY9e3t4fX1cbiAgQXR0ciA9ICdBdHRyJyxcbiAgLy8ge3t4IHl9fSAobm90IGF0dHIpXG4gIEludm9rZSA9ICdJbnZva2UnLFxufVxuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkUmVzb2x1dGlvbiA9XG4gIHwgJ1N0cmljdCdcbiAgfCAnTG9vc2UnXG4gIHwgWyducycsIEZyZWVWYXJOYW1lc3BhY2VdXG4gIHwgWydhbWJpZ3VvdXMnLCBTZXJpYWxpemVkQW1iaWd1aXR5XTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRSZXNvbHV0aW9uKHJlc29sdXRpb246IFNlcmlhbGl6ZWRSZXNvbHV0aW9uKTogRnJlZVZhclJlc29sdXRpb24ge1xuICBpZiAodHlwZW9mIHJlc29sdXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgc3dpdGNoIChyZXNvbHV0aW9uKSB7XG4gICAgICBjYXNlICdMb29zZSc6XG4gICAgICAgIHJldHVybiBMb29zZU1vZGVSZXNvbHV0aW9uLmZhbGxiYWNrKCk7XG4gICAgICBjYXNlICdTdHJpY3QnOlxuICAgICAgICByZXR1cm4gU1RSSUNUX1JFU09MVVRJT047XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoIChyZXNvbHV0aW9uWzBdKSB7XG4gICAgY2FzZSAnYW1iaWd1b3VzJzpcbiAgICAgIHN3aXRjaCAocmVzb2x1dGlvblsxXSkge1xuICAgICAgICBjYXNlIFNlcmlhbGl6ZWRBbWJpZ3VpdHkuQXBwZW5kOlxuICAgICAgICAgIHJldHVybiBMb29zZU1vZGVSZXNvbHV0aW9uLmFwcGVuZCh7IGludm9rZTogZmFsc2UgfSk7XG4gICAgICAgIGNhc2UgU2VyaWFsaXplZEFtYmlndWl0eS5BdHRyOlxuICAgICAgICAgIHJldHVybiBMb29zZU1vZGVSZXNvbHV0aW9uLmF0dHIoKTtcbiAgICAgICAgY2FzZSBTZXJpYWxpemVkQW1iaWd1aXR5Lkludm9rZTpcbiAgICAgICAgICByZXR1cm4gTG9vc2VNb2RlUmVzb2x1dGlvbi5hcHBlbmQoeyBpbnZva2U6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICBjYXNlICducyc6XG4gICAgICByZXR1cm4gTG9vc2VNb2RlUmVzb2x1dGlvbi5uYW1lc3BhY2VkKHJlc29sdXRpb25bMV0pO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9