@glimmer/syntax
Version:
374 lines (321 loc) • 32.1 kB
JavaScript
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
// eslint-disable-next-line import/no-extraneous-dependencies
import { UNKNOWN_POSITION } from '../location';
import { match, MatchAny } from './match';
import { span } from './span';
/**
* Used to indicate that an attempt to convert a `SourcePosition` to a character offset failed. It
* is separate from `null` so that `null` can be used to indicate that the computation wasn't yet
* attempted (and therefore to cache the failure)
*/
export var BROKEN = 'BROKEN';
/**
* A `SourceOffset` represents a single position in the source.
*
* There are three kinds of backing data for `SourceOffset` objects:
*
* - `CharPosition`, which contains a character offset into the raw source string
* - `HbsPosition`, which contains a `SourcePosition` from the Handlebars AST, which can be
* converted to a `CharPosition` on demand.
* - `InvisiblePosition`, which represents a position not in source (@see {InvisiblePosition})
*/
export var SourceOffset = /*#__PURE__*/function () {
function SourceOffset(data) {
this.data = data;
}
/**
* Create a `SourceOffset` from a Handlebars `SourcePosition`. It's stored as-is, and converted
* into a character offset on demand, which avoids unnecessarily computing the offset of every
* `SourceLocation`, but also means that broken `SourcePosition`s are not always detected.
*/
SourceOffset.forHbsPos = function forHbsPos(source, pos) {
return new HbsPosition(source, pos, null).wrap();
}
/**
* Create a `SourceOffset` that corresponds to a broken `SourcePosition`. This means that the
* calling code determined (or knows) that the `SourceLocation` doesn't correspond correctly to
* any part of the source.
*/
;
SourceOffset.broken = function broken(pos) {
if (pos === void 0) {
pos = UNKNOWN_POSITION;
}
return new InvisiblePosition("Broken"
/* Broken */
, pos).wrap();
}
/**
* Get the character offset for this `SourceOffset`, if possible.
*/
;
var _proto = SourceOffset.prototype;
/**
* Compare this offset with another one.
*
* If both offsets are `HbsPosition`s, they're equivalent as long as their lines and columns are
* the same. This avoids computing offsets unnecessarily.
*
* Otherwise, two `SourceOffset`s are equivalent if their successfully computed character offsets
* are the same.
*/
_proto.eql = function eql(right) {
return _eql(this.data, right.data);
}
/**
* Create a span that starts from this source offset and ends with another source offset. Avoid
* computing character offsets if both `SourceOffset`s are still lazy.
*/
;
_proto.until = function until(other) {
return span(this.data, other.data);
}
/**
* Create a `SourceOffset` by moving the character position represented by this source offset
* forward or backward (if `by` is negative), if possible.
*
* If this `SourceOffset` can't compute a valid character offset, `move` returns a broken offset.
*
* If the resulting character offset is less than 0 or greater than the size of the source, `move`
* returns a broken offset.
*/
;
_proto.move = function move(by) {
var charPos = this.data.toCharPos();
if (charPos === null) {
return SourceOffset.broken();
} else {
var result = charPos.offset + by;
if (charPos.source.check(result)) {
return new CharPosition(charPos.source, result).wrap();
} else {
return SourceOffset.broken();
}
}
}
/**
* Create a new `SourceSpan` that represents a collapsed range at this source offset. Avoid
* computing the character offset if it has not already been computed.
*/
;
_proto.collapsed = function collapsed() {
return span(this.data, this.data);
}
/**
* Convert this `SourceOffset` into a Handlebars {@see SourcePosition} for compatibility with
* existing plugins.
*/
;
_proto.toJSON = function toJSON() {
return this.data.toJSON();
};
_createClass(SourceOffset, [{
key: "offset",
get: function get() {
var charPos = this.data.toCharPos();
return charPos === null ? null : charPos.offset;
}
}]);
return SourceOffset;
}();
export var CharPosition = /*#__PURE__*/function () {
function CharPosition(source, charPos) {
this.source = source;
this.charPos = charPos;
this.kind = "CharPosition"
/* CharPosition */
;
/** Computed from char offset */
this._locPos = null;
}
/**
* This is already a `CharPosition`.
*
* {@see HbsPosition} for the alternative.
*
* @implements {PositionData}
*/
var _proto2 = CharPosition.prototype;
_proto2.toCharPos = function toCharPos() {
return this;
}
/**
* Produce a Handlebars {@see SourcePosition} for this `CharPosition`. If this `CharPosition` was
* computed using {@see SourceOffset#move}, this will compute the `SourcePosition` for the offset.
*
* @implements {PositionData}
*/
;
_proto2.toJSON = function toJSON() {
var hbs = this.toHbsPos();
return hbs === null ? UNKNOWN_POSITION : hbs.toJSON();
};
_proto2.wrap = function wrap() {
return new SourceOffset(this);
}
/**
* A `CharPosition` always has an offset it can produce without any additional computation.
*/
;
/**
* Convert the current character offset to an `HbsPosition`, if it was not already computed. Once
* a `CharPosition` has computed its `HbsPosition`, it will not need to do compute it again, and
* the same `CharPosition` is retained when used as one of the ends of a `SourceSpan`, so
* computing the `HbsPosition` should be a one-time operation.
*/
_proto2.toHbsPos = function toHbsPos() {
var locPos = this._locPos;
if (locPos === null) {
var hbsPos = this.source.hbsPosFor(this.charPos);
if (hbsPos === null) {
this._locPos = locPos = BROKEN;
} else {
this._locPos = locPos = new HbsPosition(this.source, hbsPos, this.charPos);
}
}
return locPos === BROKEN ? null : locPos;
};
_createClass(CharPosition, [{
key: "offset",
get: function get() {
return this.charPos;
}
}]);
return CharPosition;
}();
export var HbsPosition = /*#__PURE__*/function () {
function HbsPosition(source, hbsPos, charPos) {
if (charPos === void 0) {
charPos = null;
}
this.source = source;
this.hbsPos = hbsPos;
this.kind = "HbsPosition"
/* HbsPosition */
;
this._charPos = charPos === null ? null : new CharPosition(source, charPos);
}
/**
* Lazily compute the character offset from the {@see SourcePosition}. Once an `HbsPosition` has
* computed its `CharPosition`, it will not need to do compute it again, and the same
* `HbsPosition` is retained when used as one of the ends of a `SourceSpan`, so computing the
* `CharPosition` should be a one-time operation.
*
* @implements {PositionData}
*/
var _proto3 = HbsPosition.prototype;
_proto3.toCharPos = function toCharPos() {
var charPos = this._charPos;
if (charPos === null) {
var charPosNumber = this.source.charPosFor(this.hbsPos);
if (charPosNumber === null) {
this._charPos = charPos = BROKEN;
} else {
this._charPos = charPos = new CharPosition(this.source, charPosNumber);
}
}
return charPos === BROKEN ? null : charPos;
}
/**
* Return the {@see SourcePosition} that this `HbsPosition` was instantiated with. This operation
* does not need to compute anything.
*
* @implements {PositionData}
*/
;
_proto3.toJSON = function toJSON() {
return this.hbsPos;
};
_proto3.wrap = function wrap() {
return new SourceOffset(this);
}
/**
* This is already an `HbsPosition`.
*
* {@see CharPosition} for the alternative.
*/
;
_proto3.toHbsPos = function toHbsPos() {
return this;
};
return HbsPosition;
}();
export var InvisiblePosition = /*#__PURE__*/function () {
function InvisiblePosition(kind, // whatever was provided, possibly broken
pos) {
this.kind = kind;
this.pos = pos;
}
/**
* A broken position cannot be turned into a {@see CharacterPosition}.
*/
var _proto4 = InvisiblePosition.prototype;
_proto4.toCharPos = function toCharPos() {
return null;
}
/**
* The serialization of an `InvisiblePosition is whatever Handlebars {@see SourcePosition} was
* originally identified as broken, non-existent or synthetic.
*
* If an `InvisiblePosition` never had an source offset at all, this method returns
* {@see UNKNOWN_POSITION} for compatibility.
*/
;
_proto4.toJSON = function toJSON() {
return this.pos;
};
_proto4.wrap = function wrap() {
return new SourceOffset(this);
};
_createClass(InvisiblePosition, [{
key: "offset",
get: function get() {
return null;
}
}]);
return InvisiblePosition;
}();
/**
* Compare two {@see AnyPosition} and determine whether they are equal.
*
* @see {SourceOffset#eql}
*/
var _eql = match(function (m) {
return m.when("HbsPosition"
/* HbsPosition */
, "HbsPosition"
/* HbsPosition */
, function (_ref, _ref2) {
var left = _ref.hbsPos;
var right = _ref2.hbsPos;
return left.column === right.column && left.line === right.line;
}).when("CharPosition"
/* CharPosition */
, "CharPosition"
/* CharPosition */
, function (_ref3, _ref4) {
var left = _ref3.charPos;
var right = _ref4.charPos;
return left === right;
}).when("CharPosition"
/* CharPosition */
, "HbsPosition"
/* HbsPosition */
, function (_ref5, right) {
var left = _ref5.offset;
var _a;
return left === ((_a = right.toCharPos()) === null || _a === void 0 ? void 0 : _a.offset);
}).when("HbsPosition"
/* HbsPosition */
, "CharPosition"
/* CharPosition */
, function (left, _ref6) {
var right = _ref6.offset;
var _a;
return ((_a = left.toCharPos()) === null || _a === void 0 ? void 0 : _a.offset) === right;
}).when(MatchAny, MatchAny, function () {
return false;
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc291cmNlL2xvYy9vZmZzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0EsU0FBQSxnQkFBQSxRQUFBLGFBQUE7QUFFQSxTQUFBLEtBQUEsRUFBQSxRQUFBLFFBQUEsU0FBQTtBQUNBLFNBQUEsSUFBQSxRQUFBLFFBQUE7QUE0Q0E7Ozs7OztBQUtBLE9BQU8sSUFBTSxNQUFNLEdBQVosUUFBQTtBQUtQOzs7Ozs7Ozs7OztBQVVBLFdBQU0sWUFBTjtBQW1CRSx3QkFBQSxJQUFBLEVBQXFEO0FBQWhDLFNBQUEsSUFBQSxHQUFBLElBQUE7QUFBb0M7QUFsQnpEOzs7Ozs7O0FBREYsZUFNRSxTQU5GLEdBTUUsbUJBQUEsTUFBQSxFQUFBLEdBQUEsRUFBb0Q7QUFDbEQsV0FBTyxJQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsRUFBUCxJQUFPLEVBQVA7QUFDRDtBQUVEOzs7OztBQVZGOztBQUFBLGVBZUUsTUFmRixHQWVFLGdCQUFjLEdBQWQsRUFBb0Q7QUFBQSxRQUF0QyxHQUFzQztBQUF0QyxNQUFBLEdBQXNDLEdBQXBELGdCQUFvRDtBQUFBOztBQUNsRCxXQUFPLElBQUEsaUJBQUEsQ0FBcUI7QUFBQTtBQUFyQixNQUFBLEdBQUEsRUFBUCxJQUFPLEVBQVA7QUFDRDtBQUlEOzs7QUFyQkY7O0FBQUE7O0FBNkJFOzs7Ozs7Ozs7QUE3QkYsU0FzQ0UsR0F0Q0YsR0FzQ0UsYUFBRyxLQUFILEVBQXVCO0FBQ3JCLFdBQU8sSUFBRyxDQUFDLEtBQUQsSUFBQSxFQUFZLEtBQUssQ0FBM0IsSUFBVSxDQUFWO0FBQ0Q7QUFFRDs7OztBQTFDRjs7QUFBQSxTQThDRSxLQTlDRixHQThDRSxlQUFLLEtBQUwsRUFBeUI7QUFDdkIsV0FBTyxJQUFJLENBQUMsS0FBRCxJQUFBLEVBQVksS0FBSyxDQUE1QixJQUFXLENBQVg7QUFDRDtBQUVE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QXNCLEtBQXRCLENBQUEsR0FBc0IsRUFBQSxDQUExQixNQUFJLENBQUo7QUFmakMsR0FBQSxFQUFBLElBQUEsQ0FpQk87QUFBQTtBQWpCUCxJQWlCTztBQUFBO0FBakJQLElBb0JJLFVBQUEsSUFBQSxTQUE0QjtBQUFBLFFBQVgsS0FBVyxTQUFuQixNQUFtQjs7QUFBQSxRQUFBLEVBQUE7O0FBQUMsV0FBQSxDQUFBLENBQUEsRUFBQSxHQUFBLElBQUksQ0FBSixTQUFBLEVBQUEsTUFBQSxJQUFBLElBQWdCLEVBQUEsS0FBQSxLQUFoQixDQUFBLEdBQWdCLEtBQWhCLENBQUEsR0FBZ0IsRUFBQSxDQUFoQixNQUFBLE1BQUEsS0FBQTtBQXBCakMsR0FBQSxFQUFBLElBQUEsQ0FBQSxRQUFBLEVBQUEsUUFBQSxFQXNCNEI7QUFBQSxXQXZCOUIsS0F1QjhCO0FBQUEsR0F0QjVCLENBRHlCO0FBQUEsQ0FBVixDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7IFNvdXJjZVBvc2l0aW9uLCBVTktOT1dOX1BPU0lUSU9OIH0gZnJvbSAnLi4vbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi4vc291cmNlJztcbmltcG9ydCB7IG1hdGNoLCBNYXRjaEFueSB9IGZyb20gJy4vbWF0Y2gnO1xuaW1wb3J0IHsgU291cmNlU3Bhbiwgc3BhbiB9IGZyb20gJy4vc3Bhbic7XG5cbmV4cG9ydCBjb25zdCBlbnVtIE9mZnNldEtpbmQge1xuICAvKipcbiAgICogV2UgaGF2ZSBhbHJlYWR5IGNvbXB1dGVkIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgdGhpcyBvZmZzZXQgb3Igc3Bhbi5cbiAgICovXG4gIENoYXJQb3NpdGlvbiA9ICdDaGFyUG9zaXRpb24nLFxuXG4gIC8qKlxuICAgKiBUaGlzIG9mZnNldCBvciBzcGFuIHdhcyBpbnN0YW50aWF0ZWQgd2l0aCBhIEhhbmRsZWJhcnMgU291cmNlUG9zaXRpb24gb3IgU291cmNlTG9jYXRpb24uIEl0c1xuICAgKiBjaGFyYWN0ZXIgcG9zaXRpb24gd2lsbCBiZSBjb21wdXRlZCBvbiBkZW1hbmQuXG4gICAqL1xuICBIYnNQb3NpdGlvbiA9ICdIYnNQb3NpdGlvbicsXG5cbiAgLyoqXG4gICAqIGZvciAocmFyZSkgc2l0dWF0aW9ucyB3aGVyZSBhIG5vZGUgaXMgY3JlYXRlZCBidXQgdGhlcmUgd2FzIG5vIHNvdXJjZSBsb2NhdGlvbiAoZS5nLiB0aGUgbmFtZVxuICAgKiBcImRlZmF1bHRcIiBpbiBkZWZhdWx0IGJsb2NrcyB3aGVuIHRoZSB3b3JkIFwiZGVmYXVsdFwiIG5ldmVyIGFwcGVhcmVkIGluIHNvdXJjZSkuIFRoaXMgaXMgdXNlZFxuICAgKiBieSB0aGUgaW50ZXJuYWxzIHdoZW4gdGhlcmUgaXMgYSBsZWdpdGltYXRlIHJlYXNvbiBmb3IgdGhlIGludGVybmFscyB0byBzeW50aGVzaXplIGEgbm9kZVxuICAgKiB3aXRoIG5vIGxvY2F0aW9uLlxuICAgKi9cbiAgSW50ZXJuYWxzU3ludGhldGljID0gJ0ludGVybmFsc1N5bnRoZXRpYycsXG4gIC8qKlxuICAgKiBGb3Igc2l0dWF0aW9ucyB3aGVyZSBhIG5vZGUgcmVwcmVzZW50cyB6ZXJvIHBhcnRzIG9mIHRoZSBzb3VyY2UgKGZvciBleGFtcGxlLCBlbXB0eSBhcmd1bWVudHMpLlxuICAgKiBJbiBnZW5lcmFsLCB3ZSBhdHRlbXB0IHRvIGFzc2lnbiB0aGVzZSBub2RlcyAqc29tZSogcG9zaXRpb24gKGVtcHR5IGFyZ3VtZW50cyBjYW4gYmVcbiAgICogcG9zaXRpb25lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbGVlKSwgYnV0IGl0J3Mgbm90IGFsd2F5cyBwb3NzaWJsZVxuICAgKi9cbiAgTm9uRXhpc3RlbnQgPSAnTm9uRXhpc3RlbnQnLFxuICAvKipcbiAgICogRm9yIHNpdHVhdGlvbnMgd2hlcmUgYSBzb3VyY2UgbG9jYXRpb24gd2FzIGV4cGVjdGVkLCBidXQgaXQgZGlkbid0IGNvcnJlc3BvbmQgdG8gdGhlIG5vZGUgaW5cbiAgICogdGhlIHNvdXJjZS4gVGhpcyBoYXBwZW5zIGlmIGEgcGx1Z2luIGNyZWF0ZXMgYnJva2VuIGxvY2F0aW9ucy5cbiAgICovXG4gIEJyb2tlbiA9ICdCcm9rZW4nLFxufVxuXG4vKipcbiAqIEFsbCBwb3NpdGlvbnMgaGF2ZSB0aGVzZSBkZXRhaWxzIGluIGNvbW1vbi4gTW9zdCBub3RhYmx5LCBhbGwgdGhyZWUga2luZHMgb2YgcG9zaXRpb25zIGNhblxuICogbXVzdCBiZSBhYmxlIHRvIGF0dGVtcHQgdG8gY29udmVydCB0aGVtc2VsdmVzIGludG8ge0BzZWUgQ2hhclBvc2l0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3NpdGlvbkRhdGEge1xuICByZWFkb25seSBraW5kOiBPZmZzZXRLaW5kO1xuICB0b0NoYXJQb3MoKTogQ2hhclBvc2l0aW9uIHwgbnVsbDtcbiAgdG9KU09OKCk6IFNvdXJjZVBvc2l0aW9uO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbiBhdHRlbXB0IHRvIGNvbnZlcnQgYSBgU291cmNlUG9zaXRpb25gIHRvIGEgY2hhcmFjdGVyIG9mZnNldCBmYWlsZWQuIEl0XG4gKiBpcyBzZXBhcmF0ZSBmcm9tIGBudWxsYCBzbyB0aGF0IGBudWxsYCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21wdXRhdGlvbiB3YXNuJ3QgeWV0XG4gKiBhdHRlbXB0ZWQgKGFuZCB0aGVyZWZvcmUgdG8gY2FjaGUgdGhlIGZhaWx1cmUpXG4gKi9cbmV4cG9ydCBjb25zdCBCUk9LRU4gPSAnQlJPS0VOJztcbmV4cG9ydCB0eXBlIEJST0tFTiA9ICdCUk9LRU4nO1xuXG5leHBvcnQgdHlwZSBBbnlQb3NpdGlvbiA9IEhic1Bvc2l0aW9uIHwgQ2hhclBvc2l0aW9uIHwgSW52aXNpYmxlUG9zaXRpb247XG5cbi8qKlxuICogQSBgU291cmNlT2Zmc2V0YCByZXByZXNlbnRzIGEgc2luZ2xlIHBvc2l0aW9uIGluIHRoZSBzb3VyY2UuXG4gKlxuICogVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGJhY2tpbmcgZGF0YSBmb3IgYFNvdXJjZU9mZnNldGAgb2JqZWN0czpcbiAqXG4gKiAtIGBDaGFyUG9zaXRpb25gLCB3aGljaCBjb250YWlucyBhIGNoYXJhY3RlciBvZmZzZXQgaW50byB0aGUgcmF3IHNvdXJjZSBzdHJpbmdcbiAqIC0gYEhic1Bvc2l0aW9uYCwgd2hpY2ggY29udGFpbnMgYSBgU291cmNlUG9zaXRpb25gIGZyb20gdGhlIEhhbmRsZWJhcnMgQVNULCB3aGljaCBjYW4gYmVcbiAqICAgY29udmVydGVkIHRvIGEgYENoYXJQb3NpdGlvbmAgb24gZGVtYW5kLlxuICogLSBgSW52aXNpYmxlUG9zaXRpb25gLCB3aGljaCByZXByZXNlbnRzIGEgcG9zaXRpb24gbm90IGluIHNvdXJjZSAoQHNlZSB7SW52aXNpYmxlUG9zaXRpb259KVxuICovXG5leHBvcnQgY2xhc3MgU291cmNlT2Zmc2V0IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIGBTb3VyY2VPZmZzZXRgIGZyb20gYSBIYW5kbGViYXJzIGBTb3VyY2VQb3NpdGlvbmAuIEl0J3Mgc3RvcmVkIGFzLWlzLCBhbmQgY29udmVydGVkXG4gICAqIGludG8gYSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIGRlbWFuZCwgd2hpY2ggYXZvaWRzIHVubmVjZXNzYXJpbHkgY29tcHV0aW5nIHRoZSBvZmZzZXQgb2YgZXZlcnlcbiAgICogYFNvdXJjZUxvY2F0aW9uYCwgYnV0IGFsc28gbWVhbnMgdGhhdCBicm9rZW4gYFNvdXJjZVBvc2l0aW9uYHMgYXJlIG5vdCBhbHdheXMgZGV0ZWN0ZWQuXG4gICAqL1xuICBzdGF0aWMgZm9ySGJzUG9zKHNvdXJjZTogU291cmNlLCBwb3M6IFNvdXJjZVBvc2l0aW9uKTogU291cmNlT2Zmc2V0IHtcbiAgICByZXR1cm4gbmV3IEhic1Bvc2l0aW9uKHNvdXJjZSwgcG9zLCBudWxsKS53cmFwKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYFNvdXJjZU9mZnNldGAgdGhhdCBjb3JyZXNwb25kcyB0byBhIGJyb2tlbiBgU291cmNlUG9zaXRpb25gLiBUaGlzIG1lYW5zIHRoYXQgdGhlXG4gICAqIGNhbGxpbmcgY29kZSBkZXRlcm1pbmVkIChvciBrbm93cykgdGhhdCB0aGUgYFNvdXJjZUxvY2F0aW9uYCBkb2Vzbid0IGNvcnJlc3BvbmQgY29ycmVjdGx5IHRvXG4gICAqIGFueSBwYXJ0IG9mIHRoZSBzb3VyY2UuXG4gICAqL1xuICBzdGF0aWMgYnJva2VuKHBvczogU291cmNlUG9zaXRpb24gPSBVTktOT1dOX1BPU0lUSU9OKTogU291cmNlT2Zmc2V0IHtcbiAgICByZXR1cm4gbmV3IEludmlzaWJsZVBvc2l0aW9uKE9mZnNldEtpbmQuQnJva2VuLCBwb3MpLndyYXAoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGRhdGE6IFBvc2l0aW9uRGF0YSAmIEFueVBvc2l0aW9uKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgZm9yIHRoaXMgYFNvdXJjZU9mZnNldGAsIGlmIHBvc3NpYmxlLlxuICAgKi9cbiAgZ2V0IG9mZnNldCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBsZXQgY2hhclBvcyA9IHRoaXMuZGF0YS50b0NoYXJQb3MoKTtcbiAgICByZXR1cm4gY2hhclBvcyA9PT0gbnVsbCA/IG51bGwgOiBjaGFyUG9zLm9mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIHRoaXMgb2Zmc2V0IHdpdGggYW5vdGhlciBvbmUuXG4gICAqXG4gICAqIElmIGJvdGggb2Zmc2V0cyBhcmUgYEhic1Bvc2l0aW9uYHMsIHRoZXkncmUgZXF1aXZhbGVudCBhcyBsb25nIGFzIHRoZWlyIGxpbmVzIGFuZCBjb2x1bW5zIGFyZVxuICAgKiB0aGUgc2FtZS4gVGhpcyBhdm9pZHMgY29tcHV0aW5nIG9mZnNldHMgdW5uZWNlc3NhcmlseS5cbiAgICpcbiAgICogT3RoZXJ3aXNlLCB0d28gYFNvdXJjZU9mZnNldGBzIGFyZSBlcXVpdmFsZW50IGlmIHRoZWlyIHN1Y2Nlc3NmdWxseSBjb21wdXRlZCBjaGFyYWN0ZXIgb2Zmc2V0c1xuICAgKiBhcmUgdGhlIHNhbWUuXG4gICAqL1xuICBlcWwocmlnaHQ6IFNvdXJjZU9mZnNldCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlcWwodGhpcy5kYXRhLCByaWdodC5kYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzcGFuIHRoYXQgc3RhcnRzIGZyb20gdGhpcyBzb3VyY2Ugb2Zmc2V0IGFuZCBlbmRzIHdpdGggYW5vdGhlciBzb3VyY2Ugb2Zmc2V0LiBBdm9pZFxuICAgKiBjb21wdXRpbmcgY2hhcmFjdGVyIG9mZnNldHMgaWYgYm90aCBgU291cmNlT2Zmc2V0YHMgYXJlIHN0aWxsIGxhenkuXG4gICAqL1xuICB1bnRpbChvdGhlcjogU291cmNlT2Zmc2V0KTogU291cmNlU3BhbiB7XG4gICAgcmV0dXJuIHNwYW4odGhpcy5kYXRhLCBvdGhlci5kYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgU291cmNlT2Zmc2V0YCBieSBtb3ZpbmcgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSBvZmZzZXRcbiAgICogZm9yd2FyZCBvciBiYWNrd2FyZCAoaWYgYGJ5YCBpcyBuZWdhdGl2ZSksIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBJZiB0aGlzIGBTb3VyY2VPZmZzZXRgIGNhbid0IGNvbXB1dGUgYSB2YWxpZCBjaGFyYWN0ZXIgb2Zmc2V0LCBgbW92ZWAgcmV0dXJucyBhIGJyb2tlbiBvZmZzZXQuXG4gICAqXG4gICAqIElmIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyIG9mZnNldCBpcyBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIHNvdXJjZSwgYG1vdmVgXG4gICAqIHJldHVybnMgYSBicm9rZW4gb2Zmc2V0LlxuICAgKi9cbiAgbW92ZShieTogbnVtYmVyKTogU291cmNlT2Zmc2V0IHtcbiAgICBsZXQgY2hhclBvcyA9IHRoaXMuZGF0YS50b0NoYXJQb3MoKTtcblxuICAgIGlmIChjaGFyUG9zID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gU291cmNlT2Zmc2V0LmJyb2tlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVzdWx0ID0gY2hhclBvcy5vZmZzZXQgKyBieTtcblxuICAgICAgaWYgKGNoYXJQb3Muc291cmNlLmNoZWNrKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFyUG9zaXRpb24oY2hhclBvcy5zb3VyY2UsIHJlc3VsdCkud3JhcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFNvdXJjZU9mZnNldC5icm9rZW4oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBTb3VyY2VTcGFuYCB0aGF0IHJlcHJlc2VudHMgYSBjb2xsYXBzZWQgcmFuZ2UgYXQgdGhpcyBzb3VyY2Ugb2Zmc2V0LiBBdm9pZFxuICAgKiBjb21wdXRpbmcgdGhlIGNoYXJhY3RlciBvZmZzZXQgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuXG4gICAqL1xuICBjb2xsYXBzZWQoKTogU291cmNlU3BhbiB7XG4gICAgcmV0dXJuIHNwYW4odGhpcy5kYXRhLCB0aGlzLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhpcyBgU291cmNlT2Zmc2V0YCBpbnRvIGEgSGFuZGxlYmFycyB7QHNlZSBTb3VyY2VQb3NpdGlvbn0gZm9yIGNvbXBhdGliaWxpdHkgd2l0aFxuICAgKiBleGlzdGluZyBwbHVnaW5zLlxuICAgKi9cbiAgdG9KU09OKCk6IFNvdXJjZVBvc2l0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnRvSlNPTigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFyUG9zaXRpb24gaW1wbGVtZW50cyBQb3NpdGlvbkRhdGEge1xuICByZWFkb25seSBraW5kID0gT2Zmc2V0S2luZC5DaGFyUG9zaXRpb247XG5cbiAgLyoqIENvbXB1dGVkIGZyb20gY2hhciBvZmZzZXQgKi9cbiAgX2xvY1BvczogSGJzUG9zaXRpb24gfCBCUk9LRU4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBzb3VyY2U6IFNvdXJjZSwgcmVhZG9ubHkgY2hhclBvczogbnVtYmVyKSB7fVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGFscmVhZHkgYSBgQ2hhclBvc2l0aW9uYC5cbiAgICpcbiAgICoge0BzZWUgSGJzUG9zaXRpb259IGZvciB0aGUgYWx0ZXJuYXRpdmUuXG4gICAqXG4gICAqIEBpbXBsZW1lbnRzIHtQb3NpdGlvbkRhdGF9XG4gICAqL1xuICB0b0NoYXJQb3MoKTogQ2hhclBvc2l0aW9uIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlIGEgSGFuZGxlYmFycyB7QHNlZSBTb3VyY2VQb3NpdGlvbn0gZm9yIHRoaXMgYENoYXJQb3NpdGlvbmAuIElmIHRoaXMgYENoYXJQb3NpdGlvbmAgd2FzXG4gICAqIGNvbXB1dGVkIHVzaW5nIHtAc2VlIFNvdXJjZU9mZnNldCNtb3ZlfSwgdGhpcyB3aWxsIGNvbXB1dGUgdGhlIGBTb3VyY2VQb3NpdGlvbmAgZm9yIHRoZSBvZmZzZXQuXG4gICAqXG4gICAqIEBpbXBsZW1lbnRzIHtQb3NpdGlvbkRhdGF9XG4gICAqL1xuICB0b0pTT04oKTogU291cmNlUG9zaXRpb24ge1xuICAgIGxldCBoYnMgPSB0aGlzLnRvSGJzUG9zKCk7XG4gICAgcmV0dXJuIGhicyA9PT0gbnVsbCA/IFVOS05PV05fUE9TSVRJT04gOiBoYnMudG9KU09OKCk7XG4gIH1cblxuICB3cmFwKCk6IFNvdXJjZU9mZnNldCB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VPZmZzZXQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBgQ2hhclBvc2l0aW9uYCBhbHdheXMgaGFzIGFuIG9mZnNldCBpdCBjYW4gcHJvZHVjZSB3aXRob3V0IGFueSBhZGRpdGlvbmFsIGNvbXB1dGF0aW9uLlxuICAgKi9cbiAgZ2V0IG9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNoYXJQb3M7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgb2Zmc2V0IHRvIGFuIGBIYnNQb3NpdGlvbmAsIGlmIGl0IHdhcyBub3QgYWxyZWFkeSBjb21wdXRlZC4gT25jZVxuICAgKiBhIGBDaGFyUG9zaXRpb25gIGhhcyBjb21wdXRlZCBpdHMgYEhic1Bvc2l0aW9uYCwgaXQgd2lsbCBub3QgbmVlZCB0byBkbyBjb21wdXRlIGl0IGFnYWluLCBhbmRcbiAgICogdGhlIHNhbWUgYENoYXJQb3NpdGlvbmAgaXMgcmV0YWluZWQgd2hlbiB1c2VkIGFzIG9uZSBvZiB0aGUgZW5kcyBvZiBhIGBTb3VyY2VTcGFuYCwgc29cbiAgICogY29tcHV0aW5nIHRoZSBgSGJzUG9zaXRpb25gIHNob3VsZCBiZSBhIG9uZS10aW1lIG9wZXJhdGlvbi5cbiAgICovXG4gIHRvSGJzUG9zKCk6IEhic1Bvc2l0aW9uIHwgbnVsbCB7XG4gICAgbGV0IGxvY1BvcyA9IHRoaXMuX2xvY1BvcztcblxuICAgIGlmIChsb2NQb3MgPT09IG51bGwpIHtcbiAgICAgIGxldCBoYnNQb3MgPSB0aGlzLnNvdXJjZS5oYnNQb3NGb3IodGhpcy5jaGFyUG9zKTtcblxuICAgICAgaWYgKGhic1BvcyA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9sb2NQb3MgPSBsb2NQb3MgPSBCUk9LRU47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2NQb3MgPSBsb2NQb3MgPSBuZXcgSGJzUG9zaXRpb24odGhpcy5zb3VyY2UsIGhic1BvcywgdGhpcy5jaGFyUG9zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbG9jUG9zID09PSBCUk9LRU4gPyBudWxsIDogbG9jUG9zO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIYnNQb3NpdGlvbiBpbXBsZW1lbnRzIFBvc2l0aW9uRGF0YSB7XG4gIHJlYWRvbmx5IGtpbmQgPSBPZmZzZXRLaW5kLkhic1Bvc2l0aW9uO1xuXG4gIF9jaGFyUG9zOiBDaGFyUG9zaXRpb24gfCBCUk9LRU4gfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHNvdXJjZTogU291cmNlLFxuICAgIHJlYWRvbmx5IGhic1BvczogU291cmNlUG9zaXRpb24sXG4gICAgY2hhclBvczogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgKSB7XG4gICAgdGhpcy5fY2hhclBvcyA9IGNoYXJQb3MgPT09IG51bGwgPyBudWxsIDogbmV3IENoYXJQb3NpdGlvbihzb3VyY2UsIGNoYXJQb3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSBjb21wdXRlIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGZyb20gdGhlIHtAc2VlIFNvdXJjZVBvc2l0aW9ufS4gT25jZSBhbiBgSGJzUG9zaXRpb25gIGhhc1xuICAgKiBjb21wdXRlZCBpdHMgYENoYXJQb3NpdGlvbmAsIGl0IHdpbGwgbm90IG5lZWQgdG8gZG8gY29tcHV0ZSBpdCBhZ2FpbiwgYW5kIHRoZSBzYW1lXG4gICAqIGBIYnNQb3NpdGlvbmAgaXMgcmV0YWluZWQgd2hlbiB1c2VkIGFzIG9uZSBvZiB0aGUgZW5kcyBvZiBhIGBTb3VyY2VTcGFuYCwgc28gY29tcHV0aW5nIHRoZVxuICAgKiBgQ2hhclBvc2l0aW9uYCBzaG91bGQgYmUgYSBvbmUtdGltZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBpbXBsZW1lbnRzIHtQb3NpdGlvbkRhdGF9XG4gICAqL1xuICB0b0NoYXJQb3MoKTogQ2hhclBvc2l0aW9uIHwgbnVsbCB7XG4gICAgbGV0IGNoYXJQb3MgPSB0aGlzLl9jaGFyUG9zO1xuXG4gICAgaWYgKGNoYXJQb3MgPT09IG51bGwpIHtcbiAgICAgIGxldCBjaGFyUG9zTnVtYmVyID0gdGhpcy5zb3VyY2UuY2hhclBvc0Zvcih0aGlzLmhic1Bvcyk7XG5cbiAgICAgIGlmIChjaGFyUG9zTnVtYmVyID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2NoYXJQb3MgPSBjaGFyUG9zID0gQlJPS0VOO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2hhclBvcyA9IGNoYXJQb3MgPSBuZXcgQ2hhclBvc2l0aW9uKHRoaXMuc291cmNlLCBjaGFyUG9zTnVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhclBvcyA9PT0gQlJPS0VOID8gbnVsbCA6IGNoYXJQb3M7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB7QHNlZSBTb3VyY2VQb3NpdGlvbn0gdGhhdCB0aGlzIGBIYnNQb3NpdGlvbmAgd2FzIGluc3RhbnRpYXRlZCB3aXRoLiBUaGlzIG9wZXJhdGlvblxuICAgKiBkb2VzIG5vdCBuZWVkIHRvIGNvbXB1dGUgYW55dGhpbmcuXG4gICAqXG4gICAqIEBpbXBsZW1lbnRzIHtQb3NpdGlvbkRhdGF9XG4gICAqL1xuICB0b0pTT04oKTogU291cmNlUG9zaXRpb24ge1xuICAgIHJldHVybiB0aGlzLmhic1BvcztcbiAgfVxuXG4gIHdyYXAoKTogU291cmNlT2Zmc2V0IHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZU9mZnNldCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGFscmVhZHkgYW4gYEhic1Bvc2l0aW9uYC5cbiAgICpcbiAgICoge0BzZWUgQ2hhclBvc2l0aW9ufSBmb3IgdGhlIGFsdGVybmF0aXZlLlxuICAgKi9cbiAgdG9IYnNQb3MoKTogSGJzUG9zaXRpb24ge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZpc2libGVQb3NpdGlvbiBpbXBsZW1lbnRzIFBvc2l0aW9uRGF0YSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IE9mZnNldEtpbmQuQnJva2VuIHwgT2Zmc2V0S2luZC5JbnRlcm5hbHNTeW50aGV0aWMgfCBPZmZzZXRLaW5kLk5vbkV4aXN0ZW50LFxuICAgIC8vIHdoYXRldmVyIHdhcyBwcm92aWRlZCwgcG9zc2libHkgYnJva2VuXG4gICAgcmVhZG9ubHkgcG9zOiBTb3VyY2VQb3NpdGlvblxuICApIHt9XG5cbiAgLyoqXG4gICAqIEEgYnJva2VuIHBvc2l0aW9uIGNhbm5vdCBiZSB0dXJuZWQgaW50byBhIHtAc2VlIENoYXJhY3RlclBvc2l0aW9ufS5cbiAgICovXG4gIHRvQ2hhclBvcygpOiBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VyaWFsaXphdGlvbiBvZiBhbiBgSW52aXNpYmxlUG9zaXRpb24gaXMgd2hhdGV2ZXIgSGFuZGxlYmFycyB7QHNlZSBTb3VyY2VQb3NpdGlvbn0gd2FzXG4gICAqIG9yaWdpbmFsbHkgaWRlbnRpZmllZCBhcyBicm9rZW4sIG5vbi1leGlzdGVudCBvciBzeW50aGV0aWMuXG4gICAqXG4gICAqIElmIGFuIGBJbnZpc2libGVQb3NpdGlvbmAgbmV2ZXIgaGFkIGFuIHNvdXJjZSBvZmZzZXQgYXQgYWxsLCB0aGlzIG1ldGhvZCByZXR1cm5zXG4gICAqIHtAc2VlIFVOS05PV05fUE9TSVRJT059IGZvciBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgdG9KU09OKCk6IFNvdXJjZVBvc2l0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5wb3M7XG4gIH1cblxuICB3cmFwKCk6IFNvdXJjZU9mZnNldCB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VPZmZzZXQodGhpcyk7XG4gIH1cblxuICBnZXQgb2Zmc2V0KCk6IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28ge0BzZWUgQW55UG9zaXRpb259IGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGV5IGFyZSBlcXVhbC5cbiAqXG4gKiBAc2VlIHtTb3VyY2VPZmZzZXQjZXFsfVxuICovXG5jb25zdCBlcWwgPSBtYXRjaDxib29sZWFuPigobSkgPT5cbiAgbVxuICAgIC53aGVuKFxuICAgICAgT2Zmc2V0S2luZC5IYnNQb3NpdGlvbixcbiAgICAgIE9mZnNldEtpbmQuSGJzUG9zaXRpb24sXG4gICAgICAoeyBoYnNQb3M6IGxlZnQgfSwgeyBoYnNQb3M6IHJpZ2h0IH0pID0+XG4gICAgICAgIGxlZnQuY29sdW1uID09PSByaWdodC5jb2x1bW4gJiYgbGVmdC5saW5lID09PSByaWdodC5saW5lXG4gICAgKVxuICAgIC53aGVuKFxuICAgICAgT2Zmc2V0S2luZC5DaGFyUG9zaXRpb24sXG4gICAgICBPZmZzZXRLaW5kLkNoYXJQb3NpdGlvbixcbiAgICAgICh7IGNoYXJQb3M6IGxlZnQgfSwgeyBjaGFyUG9zOiByaWdodCB9KSA9PiBsZWZ0ID09PSByaWdodFxuICAgIClcbiAgICAud2hlbihcbiAgICAgIE9mZnNldEtpbmQuQ2hhclBvc2l0aW9uLFxuICAgICAgT2Zmc2V0S2luZC5IYnNQb3NpdGlvbixcbiAgICAgICh7IG9mZnNldDogbGVmdCB9LCByaWdodCkgPT4gbGVmdCA9PT0gcmlnaHQudG9DaGFyUG9zKCk/Lm9mZnNldFxuICAgIClcbiAgICAud2hlbihcbiAgICAgIE9mZnNldEtpbmQuSGJzUG9zaXRpb24sXG4gICAgICBPZmZzZXRLaW5kLkNoYXJQb3NpdGlvbixcbiAgICAgIChsZWZ0LCB7IG9mZnNldDogcmlnaHQgfSkgPT4gbGVmdC50b0NoYXJQb3MoKT8ub2Zmc2V0ID09PSByaWdodFxuICAgIClcbiAgICAud2hlbihNYXRjaEFueSwgTWF0Y2hBbnksICgpID0+IGZhbHNlKVxuKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=