UNPKG

ember-legacy-class-transform

Version:
384 lines (313 loc) 31.6 kB
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } export var CONSTANT = 0; export var INITIAL = 1; export var VOLATILE = NaN; export var RevisionTag = function () { function RevisionTag() { _classCallCheck(this, RevisionTag); } RevisionTag.prototype.validate = function validate(snapshot) { return this.value() === snapshot; }; return RevisionTag; }(); RevisionTag.id = 0; var VALUE = []; var VALIDATE = []; export var TagWrapper = function () { function TagWrapper(type, inner) { _classCallCheck(this, TagWrapper); this.type = type; this.inner = inner; } TagWrapper.prototype.value = function value() { var func = VALUE[this.type]; return func(this.inner); }; TagWrapper.prototype.validate = function validate(snapshot) { var func = VALIDATE[this.type]; return func(this.inner, snapshot); }; return TagWrapper; }(); function register(Type) { var type = VALUE.length; VALUE.push(function (tag) { return tag.value(); }); VALIDATE.push(function (tag, snapshot) { return tag.validate(snapshot); }); Type.id = type; } /// // CONSTANT: 0 VALUE.push(function () { return CONSTANT; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === CONSTANT; }); export var CONSTANT_TAG = new TagWrapper(0, null); // VOLATILE: 1 VALUE.push(function () { return VOLATILE; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === VOLATILE; }); export var VOLATILE_TAG = new TagWrapper(1, null); // CURRENT: 2 VALUE.push(function () { return $REVISION; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === $REVISION; }); export var CURRENT_TAG = new TagWrapper(2, null); /// var $REVISION = INITIAL; export var DirtyableTag = function (_RevisionTag) { _inherits(DirtyableTag, _RevisionTag); DirtyableTag.create = function create() { var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION; return new TagWrapper(this.id, new DirtyableTag(revision)); }; function DirtyableTag() { var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION; _classCallCheck(this, DirtyableTag); var _this = _possibleConstructorReturn(this, _RevisionTag.call(this)); _this.revision = revision; return _this; } DirtyableTag.prototype.value = function value() { return this.revision; }; DirtyableTag.prototype.dirty = function dirty() { this.revision = ++$REVISION; }; return DirtyableTag; }(RevisionTag); register(DirtyableTag); export function combineTagged(tagged) { var optimized = []; for (var i = 0, l = tagged.length; i < l; i++) { var tag = tagged[i].tag; if (tag === VOLATILE_TAG) return VOLATILE_TAG; if (tag === CONSTANT_TAG) continue; optimized.push(tag); } return _combine(optimized); } export function combineSlice(slice) { var optimized = []; var node = slice.head(); while (node !== null) { var tag = node.tag; if (tag === VOLATILE_TAG) return VOLATILE_TAG; if (tag !== CONSTANT_TAG) optimized.push(tag); node = slice.nextNode(node); } return _combine(optimized); } export function combine(tags) { var optimized = []; for (var i = 0, l = tags.length; i < l; i++) { var tag = tags[i]; if (tag === VOLATILE_TAG) return VOLATILE_TAG; if (tag === CONSTANT_TAG) continue; optimized.push(tag); } return _combine(optimized); } function _combine(tags) { switch (tags.length) { case 0: return CONSTANT_TAG; case 1: return tags[0]; case 2: return TagsPair.create(tags[0], tags[1]); default: return TagsCombinator.create(tags); } ; } export var CachedTag = function (_RevisionTag2) { _inherits(CachedTag, _RevisionTag2); function CachedTag() { _classCallCheck(this, CachedTag); var _this2 = _possibleConstructorReturn(this, _RevisionTag2.apply(this, arguments)); _this2.lastChecked = null; _this2.lastValue = null; return _this2; } CachedTag.prototype.value = function value() { var lastChecked = this.lastChecked, lastValue = this.lastValue; if (lastChecked !== $REVISION) { this.lastChecked = $REVISION; this.lastValue = lastValue = this.compute(); } return this.lastValue; }; CachedTag.prototype.invalidate = function invalidate() { this.lastChecked = null; }; return CachedTag; }(RevisionTag); var TagsPair = function (_CachedTag) { _inherits(TagsPair, _CachedTag); TagsPair.create = function create(first, second) { return new TagWrapper(this.id, new TagsPair(first, second)); }; function TagsPair(first, second) { _classCallCheck(this, TagsPair); var _this3 = _possibleConstructorReturn(this, _CachedTag.call(this)); _this3.first = first; _this3.second = second; return _this3; } TagsPair.prototype.compute = function compute() { return Math.max(this.first.value(), this.second.value()); }; return TagsPair; }(CachedTag); register(TagsPair); var TagsCombinator = function (_CachedTag2) { _inherits(TagsCombinator, _CachedTag2); TagsCombinator.create = function create(tags) { return new TagWrapper(this.id, new TagsCombinator(tags)); }; function TagsCombinator(tags) { _classCallCheck(this, TagsCombinator); var _this4 = _possibleConstructorReturn(this, _CachedTag2.call(this)); _this4.tags = tags; return _this4; } TagsCombinator.prototype.compute = function compute() { var tags = this.tags; var max = -1; for (var i = 0; i < tags.length; i++) { var value = tags[i].value(); max = Math.max(value, max); } return max; }; return TagsCombinator; }(CachedTag); register(TagsCombinator); export var UpdatableTag = function (_CachedTag3) { _inherits(UpdatableTag, _CachedTag3); UpdatableTag.create = function create(tag) { return new TagWrapper(this.id, new UpdatableTag(tag)); }; function UpdatableTag(tag) { _classCallCheck(this, UpdatableTag); var _this5 = _possibleConstructorReturn(this, _CachedTag3.call(this)); _this5.tag = tag; _this5.lastUpdated = INITIAL; return _this5; } UpdatableTag.prototype.compute = function compute() { return Math.max(this.lastUpdated, this.tag.value()); }; UpdatableTag.prototype.update = function update(tag) { if (tag !== this.tag) { this.tag = tag; this.lastUpdated = $REVISION; this.invalidate(); } }; return UpdatableTag; }(CachedTag); register(UpdatableTag); export var CachedReference = function () { function CachedReference() { _classCallCheck(this, CachedReference); this.lastRevision = null; this.lastValue = null; } CachedReference.prototype.value = function value() { var tag = this.tag, lastRevision = this.lastRevision, lastValue = this.lastValue; if (!lastRevision || !tag.validate(lastRevision)) { lastValue = this.lastValue = this.compute(); this.lastRevision = tag.value(); } return lastValue; }; CachedReference.prototype.invalidate = function invalidate() { this.lastRevision = null; }; return CachedReference; }(); var MapperReference = function (_CachedReference) { _inherits(MapperReference, _CachedReference); function MapperReference(reference, mapper) { _classCallCheck(this, MapperReference); var _this6 = _possibleConstructorReturn(this, _CachedReference.call(this)); _this6.tag = reference.tag; _this6.reference = reference; _this6.mapper = mapper; return _this6; } MapperReference.prototype.compute = function compute() { var reference = this.reference, mapper = this.mapper; return mapper(reference.value()); }; return MapperReference; }(CachedReference); export function map(reference, mapper) { return new MapperReference(reference, mapper); } ////////// export var ReferenceCache = function () { function ReferenceCache(reference) { _classCallCheck(this, ReferenceCache); this.lastValue = null; this.lastRevision = null; this.initialized = false; this.tag = reference.tag; this.reference = reference; } ReferenceCache.prototype.peek = function peek() { if (!this.initialized) { return this.initialize(); } return this.lastValue; }; ReferenceCache.prototype.revalidate = function revalidate() { if (!this.initialized) { return this.initialize(); } var reference = this.reference, lastRevision = this.lastRevision; var tag = reference.tag; if (tag.validate(lastRevision)) return NOT_MODIFIED; this.lastRevision = tag.value(); var lastValue = this.lastValue; var value = reference.value(); if (value === lastValue) return NOT_MODIFIED; this.lastValue = value; return value; }; ReferenceCache.prototype.initialize = function initialize() { var reference = this.reference; var value = this.lastValue = reference.value(); this.lastRevision = reference.tag.value(); this.initialized = true; return value; }; return ReferenceCache; }(); var NOT_MODIFIED = "adb3b78e-3d22-4e4b-877a-6317c2c5c145"; export function isModified(value) { return value !== NOT_MODIFIED; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92YWxpZGF0b3JzLmpzIl0sIm5hbWVzIjpbIkNPTlNUQU5UIiwiSU5JVElBTCIsIlZPTEFUSUxFIiwiTmFOIiwiUmV2aXNpb25UYWciLCJ2YWxpZGF0ZSIsInNuYXBzaG90IiwidmFsdWUiLCJpZCIsIlZBTFVFIiwiVkFMSURBVEUiLCJUYWdXcmFwcGVyIiwidHlwZSIsImlubmVyIiwiZnVuYyIsInJlZ2lzdGVyIiwiVHlwZSIsImxlbmd0aCIsInB1c2giLCJ0YWciLCJfdGFnIiwiQ09OU1RBTlRfVEFHIiwiVk9MQVRJTEVfVEFHIiwiJFJFVklTSU9OIiwiQ1VSUkVOVF9UQUciLCJEaXJ0eWFibGVUYWciLCJjcmVhdGUiLCJyZXZpc2lvbiIsImRpcnR5IiwiY29tYmluZVRhZ2dlZCIsInRhZ2dlZCIsIm9wdGltaXplZCIsImkiLCJsIiwiX2NvbWJpbmUiLCJjb21iaW5lU2xpY2UiLCJzbGljZSIsIm5vZGUiLCJoZWFkIiwibmV4dE5vZGUiLCJjb21iaW5lIiwidGFncyIsIlRhZ3NQYWlyIiwiVGFnc0NvbWJpbmF0b3IiLCJDYWNoZWRUYWciLCJhcmd1bWVudHMiLCJsYXN0Q2hlY2tlZCIsImxhc3RWYWx1ZSIsImNvbXB1dGUiLCJpbnZhbGlkYXRlIiwiZmlyc3QiLCJzZWNvbmQiLCJNYXRoIiwibWF4IiwiVXBkYXRhYmxlVGFnIiwibGFzdFVwZGF0ZWQiLCJ1cGRhdGUiLCJDYWNoZWRSZWZlcmVuY2UiLCJsYXN0UmV2aXNpb24iLCJNYXBwZXJSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJtYXBwZXIiLCJtYXAiLCJSZWZlcmVuY2VDYWNoZSIsImluaXRpYWxpemVkIiwicGVlayIsImluaXRpYWxpemUiLCJyZXZhbGlkYXRlIiwiTk9UX01PRElGSUVEIiwiaXNNb2RpZmllZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxPQUFPLElBQU1BLFdBQVcsQ0FBakI7QUFDUCxPQUFPLElBQU1DLFVBQVUsQ0FBaEI7QUFDUCxPQUFPLElBQU1DLFdBQVdDLEdB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b0I5RCxLQUFwQixFQUEyQjtBQUM5QixXQUFPQSxVQUFVNkQsWUFBakI7QUFDSCIsImZpbGUiOiJsaWIvdmFsaWRhdG9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDT05TVEFOVCA9IDA7XG5leHBvcnQgY29uc3QgSU5JVElBTCA9IDE7XG5leHBvcnQgY29uc3QgVk9MQVRJTEUgPSBOYU47XG5leHBvcnQgY2xhc3MgUmV2aXNpb25UYWcge1xuICAgIHZhbGlkYXRlKHNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKCkgPT09IHNuYXBzaG90O1xuICAgIH1cbn1cblJldmlzaW9uVGFnLmlkID0gMDtcbmNvbnN0IFZBTFVFID0gW107XG5jb25zdCBWQUxJREFURSA9IFtdO1xuZXhwb3J0IGNsYXNzIFRhZ1dyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGlubmVyKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCBmdW5jID0gVkFMVUVbdGhpcy50eXBlXTtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcy5pbm5lcik7XG4gICAgfVxuICAgIHZhbGlkYXRlKHNuYXBzaG90KSB7XG4gICAgICAgIGxldCBmdW5jID0gVkFMSURBVEVbdGhpcy50eXBlXTtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcy5pbm5lciwgc25hcHNob3QpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyKFR5cGUpIHtcbiAgICBsZXQgdHlwZSA9IFZBTFVFLmxlbmd0aDtcbiAgICBWQUxVRS5wdXNoKHRhZyA9PiB0YWcudmFsdWUoKSk7XG4gICAgVkFMSURBVEUucHVzaCgodGFnLCBzbmFwc2hvdCkgPT4gdGFnLnZhbGlkYXRlKHNuYXBzaG90KSk7XG4gICAgVHlwZS5pZCA9IHR5cGU7XG59XG4vLy9cbi8vIENPTlNUQU5UOiAwXG5WQUxVRS5wdXNoKCgpID0+IENPTlNUQU5UKTtcblZBTElEQVRFLnB1c2goKF90YWcsIHNuYXBzaG90KSA9PiBzbmFwc2hvdCA9PT0gQ09OU1RBTlQpO1xuZXhwb3J0IGNvbnN0IENPTlNUQU5UX1RBRyA9IG5ldyBUYWdXcmFwcGVyKDAsIG51bGwpO1xuLy8gVk9MQVRJTEU6IDFcblZBTFVFLnB1c2goKCkgPT4gVk9MQVRJTEUpO1xuVkFMSURBVEUucHVzaCgoX3RhZywgc25hcHNob3QpID0+IHNuYXBzaG90ID09PSBWT0xBVElMRSk7XG5leHBvcnQgY29uc3QgVk9MQVRJTEVfVEFHID0gbmV3IFRhZ1dyYXBwZXIoMSwgbnVsbCk7XG4vLyBDVVJSRU5UOiAyXG5WQUxVRS5wdXNoKCgpID0+ICRSRVZJU0lPTik7XG5WQUxJREFURS5wdXNoKChfdGFnLCBzbmFwc2hvdCkgPT4gc25hcHNob3QgPT09ICRSRVZJU0lPTik7XG5leHBvcnQgY29uc3QgQ1VSUkVOVF9UQUcgPSBuZXcgVGFnV3JhcHBlcigyLCBudWxsKTtcbi8vL1xubGV0ICRSRVZJU0lPTiA9IElOSVRJQUw7XG5leHBvcnQgY2xhc3MgRGlydHlhYmxlVGFnIGV4dGVuZHMgUmV2aXNpb25UYWcge1xuICAgIHN0YXRpYyBjcmVhdGUocmV2aXNpb24gPSAkUkVWSVNJT04pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdXcmFwcGVyKHRoaXMuaWQsIG5ldyBEaXJ0eWFibGVUYWcocmV2aXNpb24pKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IocmV2aXNpb24gPSAkUkVWSVNJT04pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZXZpc2lvbiA9IHJldmlzaW9uO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2aXNpb247XG4gICAgfVxuICAgIGRpcnR5KCkge1xuICAgICAgICB0aGlzLnJldmlzaW9uID0gKyskUkVWSVNJT047XG4gICAgfVxufVxucmVnaXN0ZXIoRGlydHlhYmxlVGFnKTtcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lVGFnZ2VkKHRhZ2dlZCkge1xuICAgIGxldCBvcHRpbWl6ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRhZ2dlZC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHRhZyA9IHRhZ2dlZFtpXS50YWc7XG4gICAgICAgIGlmICh0YWcgPT09IFZPTEFUSUxFX1RBRykgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyA9PT0gQ09OU1RBTlRfVEFHKSBjb250aW51ZTtcbiAgICAgICAgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVNsaWNlKHNsaWNlKSB7XG4gICAgbGV0IG9wdGltaXplZCA9IFtdO1xuICAgIGxldCBub2RlID0gc2xpY2UuaGVhZCgpO1xuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSBub2RlLnRhZztcbiAgICAgICAgaWYgKHRhZyA9PT0gVk9MQVRJTEVfVEFHKSByZXR1cm4gVk9MQVRJTEVfVEFHO1xuICAgICAgICBpZiAodGFnICE9PSBDT05TVEFOVF9UQUcpIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gICAgICAgIG5vZGUgPSBzbGljZS5uZXh0Tm9kZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZSh0YWdzKSB7XG4gICAgbGV0IG9wdGltaXplZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGFncy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHRhZyA9IHRhZ3NbaV07XG4gICAgICAgIGlmICh0YWcgPT09IFZPTEFUSUxFX1RBRykgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyA9PT0gQ09OU1RBTlRfVEFHKSBjb250aW51ZTtcbiAgICAgICAgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5mdW5jdGlvbiBfY29tYmluZSh0YWdzKSB7XG4gICAgc3dpdGNoICh0YWdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gQ09OU1RBTlRfVEFHO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gdGFnc1swXTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIFRhZ3NQYWlyLmNyZWF0ZSh0YWdzWzBdLCB0YWdzWzFdKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBUYWdzQ29tYmluYXRvci5jcmVhdGUodGFncyk7XG4gICAgfVxuICAgIDtcbn1cbmV4cG9ydCBjbGFzcyBDYWNoZWRUYWcgZXh0ZW5kcyBSZXZpc2lvblRhZyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICBsZXQgeyBsYXN0Q2hlY2tlZCwgbGFzdFZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBpZiAobGFzdENoZWNrZWQgIT09ICRSRVZJU0lPTikge1xuICAgICAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9ICRSRVZJU0lPTjtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gbGFzdFZhbHVlID0gdGhpcy5jb21wdXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZhbHVlO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBUYWdzUGFpciBleHRlbmRzIENhY2hlZFRhZyB7XG4gICAgc3RhdGljIGNyZWF0ZShmaXJzdCwgc2Vjb25kKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgVGFnc1BhaXIoZmlyc3QsIHNlY29uZCkpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihmaXJzdCwgc2Vjb25kKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdDtcbiAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmZpcnN0LnZhbHVlKCksIHRoaXMuc2Vjb25kLnZhbHVlKCkpO1xuICAgIH1cbn1cbnJlZ2lzdGVyKFRhZ3NQYWlyKTtcbmNsYXNzIFRhZ3NDb21iaW5hdG9yIGV4dGVuZHMgQ2FjaGVkVGFnIHtcbiAgICBzdGF0aWMgY3JlYXRlKHRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdXcmFwcGVyKHRoaXMuaWQsIG5ldyBUYWdzQ29tYmluYXRvcih0YWdzKSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgbGV0IHsgdGFncyB9ID0gdGhpcztcbiAgICAgICAgbGV0IG1heCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRhZ3NbaV0udmFsdWUoKTtcbiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KHZhbHVlLCBtYXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxucmVnaXN0ZXIoVGFnc0NvbWJpbmF0b3IpO1xuZXhwb3J0IGNsYXNzIFVwZGF0YWJsZVRhZyBleHRlbmRzIENhY2hlZFRhZyB7XG4gICAgc3RhdGljIGNyZWF0ZSh0YWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdXcmFwcGVyKHRoaXMuaWQsIG5ldyBVcGRhdGFibGVUYWcodGFnKSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IElOSVRJQUw7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmxhc3RVcGRhdGVkLCB0aGlzLnRhZy52YWx1ZSgpKTtcbiAgICB9XG4gICAgdXBkYXRlKHRhZykge1xuICAgICAgICBpZiAodGFnICE9PSB0aGlzLnRhZykge1xuICAgICAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gJFJFVklTSU9OO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5yZWdpc3RlcihVcGRhdGFibGVUYWcpO1xuZXhwb3J0IGNsYXNzIENhY2hlZFJlZmVyZW5jZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgbGV0IHsgdGFnLCBsYXN0UmV2aXNpb24sIGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFsYXN0UmV2aXNpb24gfHwgIXRhZy52YWxpZGF0ZShsYXN0UmV2aXNpb24pKSB7XG4gICAgICAgICAgICBsYXN0VmFsdWUgPSB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSB0YWcudmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFzdFZhbHVlO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgfVxufVxuY2xhc3MgTWFwcGVyUmVmZXJlbmNlIGV4dGVuZHMgQ2FjaGVkUmVmZXJlbmNlIHtcbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UsIG1hcHBlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgbGV0IHsgcmVmZXJlbmNlLCBtYXBwZXIgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBtYXBwZXIocmVmZXJlbmNlLnZhbHVlKCkpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXAocmVmZXJlbmNlLCBtYXBwZXIpIHtcbiAgICByZXR1cm4gbmV3IE1hcHBlclJlZmVyZW5jZShyZWZlcmVuY2UsIG1hcHBlcik7XG59XG4vLy8vLy8vLy8vXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKHJlZmVyZW5jZSkge1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbiAgICBwZWVrKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0VmFsdWU7XG4gICAgfVxuICAgIHJldmFsaWRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHJlZmVyZW5jZSwgbGFzdFJldmlzaW9uIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdGFnID0gcmVmZXJlbmNlLnRhZztcbiAgICAgICAgaWYgKHRhZy52YWxpZGF0ZShsYXN0UmV2aXNpb24pKSByZXR1cm4gTk9UX01PRElGSUVEO1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHRhZy52YWx1ZSgpO1xuICAgICAgICBsZXQgeyBsYXN0VmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJlZmVyZW5jZS52YWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09IGxhc3RWYWx1ZSkgcmV0dXJuIE5PVF9NT0RJRklFRDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICBsZXQgeyByZWZlcmVuY2UgfSA9IHRoaXM7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMubGFzdFZhbHVlID0gcmVmZXJlbmNlLnZhbHVlKCk7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gcmVmZXJlbmNlLnRhZy52YWx1ZSgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbmNvbnN0IE5PVF9NT0RJRklFRCA9IFwiYWRiM2I3OGUtM2QyMi00ZTRiLTg3N2EtNjMxN2MyYzVjMTQ1XCI7XG5leHBvcnQgZnVuY3Rpb24gaXNNb2RpZmllZCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gTk9UX01PRElGSUVEO1xufSJdfQ==