UNPKG

ember-legacy-class-transform

Version:
412 lines (340 loc) 31.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.combineTagged = combineTagged; exports.combineSlice = combineSlice; exports.combine = combine; exports.map = map; exports.isModified = isModified; 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"); } } var CONSTANT = exports.CONSTANT = 0; var INITIAL = exports.INITIAL = 1; var VOLATILE = exports.VOLATILE = NaN; var RevisionTag = exports.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 = []; var TagWrapper = exports.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; }); var CONSTANT_TAG = exports.CONSTANT_TAG = new TagWrapper(0, null); // VOLATILE: 1 VALUE.push(function () { return VOLATILE; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === VOLATILE; }); var VOLATILE_TAG = exports.VOLATILE_TAG = new TagWrapper(1, null); // CURRENT: 2 VALUE.push(function () { return $REVISION; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === $REVISION; }); var CURRENT_TAG = exports.CURRENT_TAG = new TagWrapper(2, null); /// var $REVISION = INITIAL; var DirtyableTag = exports.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); 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); } 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); } 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); } ; } var CachedTag = exports.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); var UpdatableTag = exports.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); var CachedReference = exports.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); function map(reference, mapper) { return new MapperReference(reference, mapper); } ////////// var ReferenceCache = exports.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"; function isModified(value) { return value !== NOT_MODIFIED; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92YWxpZGF0b3JzLmpzIl0sIm5hbWVzIjpbIkNPTlNUQU5UIiwiSU5JVElBTCIsIlZPTEFUSUxFIiwiTmFOIiwiUmV2aXNpb25UYWciLCJ2YWxpZGF0ZSIsInNuYXBzaG90IiwidmFsdWUiLCJpZCIsIlZBTFVFIiwiVkFMSURBVEUiLCJUYWdXcmFwcGVyIiwidHlwZSIsImlubmVyIiwiZnVuYyIsInJlZ2lzdGVyIiwiVHlwZSIsImxlbmd0aCIsInB1c2giLCJ0YWciLCJfdGFnIiwiQ09OU1RBTlRfVEFHIiwiVk9MQVRJTEVfVEFHIiwiJFJFVklTSU9OIiwiQ1VSUkVOVF9UQUciLCJEaXJ0eWFibGVUYWciLCJjcmVhdGUiLCJyZXZpc2lvbiIsImRpcnR5IiwiY29tYmluZVRhZ2dlZCIsInRhZ2dlZCIsIm9wdGltaXplZCIsImkiLCJsIiwiX2NvbWJpbmUiLCJjb21iaW5lU2xpY2UiLCJzbGljZSIsIm5vZGUiLCJoZWFkIiwibmV4dE5vZGUiLCJjb21iaW5lIiwidGFncyIsIlRhZ3NQYWlyIiwiVGFnc0NvbWJpbmF0b3IiLCJDYWNoZWRUYWciLCJhcmd1bWVudHMiLCJsYXN0Q2hlY2tlZCIsImxhc3RWYWx1ZSIsImNvbXB1dGUiLCJpbnZhbGlkYXRlIiwiZmlyc3QiLCJzZWNvbmQiLCJNYXRoIiwibWF4IiwiVXBkYXRhYmxlVGFnIiwibGFzdFVwZGF0ZWQiLCJ1cGRhdGUiLCJDYWNoZWRSZWZlcmVuY2UiLCJsYXN0UmV2aXNpb24iLCJNYXBwZXJSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJtYXBwZXIiLCJtYXAiLCJSZWZlcmVuY2VDYWNoZSIsImluaXRpYWxpemVkIiwicGVlayIsImluaXRpYWxpemUiLCJyZXZhbGlkYXRlIiwiTk9UX01PRElGSUVEIiwiaXNNb2RpZmllZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUE4RE8sQUFBUztRQVVULEFBQVM7UUFXVCxBQUFTO1FBNEhULEFBQVM7UUF5Q1QsQUFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXhQ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QUFBTyxBQUNWO0FBM0JMOzs2QkFBQSxBQTRCSSxtQ0FBYTtZQUFBLEFBQ0gsWUFERyxBQUNXLEtBRFgsQUFDSCxBQUNOOztZQUFJLFFBQVEsS0FBQSxBQUFLLFlBQVksVUFBN0IsQUFBNkIsQUFBVSxBQUN2QzthQUFBLEFBQUssZUFBZSxVQUFBLEFBQVUsSUFBOUIsQUFBb0IsQUFBYyxBQUNsQzthQUFBLEFBQUssY0FBTCxBQUFtQixBQUNuQjtlQUFBLEFBQU8sQUFDVjtBQWxDTDs7V0FBQTs7QUFvQ0EsSUFBTSxlQUFOLEFBQXFCLEFBQ3JCO0FBQU8sb0JBQUEsQUFBb0IsT0FBTyxBQUM5QjtXQUFPLFVBQVAsQUFBaUIsQUFDcEIiLCJmaWxlIjoibGliL3ZhbGlkYXRvcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQ09OU1RBTlQgPSAwO1xuZXhwb3J0IGNvbnN0IElOSVRJQUwgPSAxO1xuZXhwb3J0IGNvbnN0IFZPTEFUSUxFID0gTmFOO1xuZXhwb3J0IGNsYXNzIFJldmlzaW9uVGFnIHtcbiAgICB2YWxpZGF0ZShzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSgpID09PSBzbmFwc2hvdDtcbiAgICB9XG59XG5SZXZpc2lvblRhZy5pZCA9IDA7XG5jb25zdCBWQUxVRSA9IFtdO1xuY29uc3QgVkFMSURBVEUgPSBbXTtcbmV4cG9ydCBjbGFzcyBUYWdXcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBpbm5lcikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICBsZXQgZnVuYyA9IFZBTFVFW3RoaXMudHlwZV07XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMuaW5uZXIpO1xuICAgIH1cbiAgICB2YWxpZGF0ZShzbmFwc2hvdCkge1xuICAgICAgICBsZXQgZnVuYyA9IFZBTElEQVRFW3RoaXMudHlwZV07XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMuaW5uZXIsIHNuYXBzaG90KTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWdpc3RlcihUeXBlKSB7XG4gICAgbGV0IHR5cGUgPSBWQUxVRS5sZW5ndGg7XG4gICAgVkFMVUUucHVzaCh0YWcgPT4gdGFnLnZhbHVlKCkpO1xuICAgIFZBTElEQVRFLnB1c2goKHRhZywgc25hcHNob3QpID0+IHRhZy52YWxpZGF0ZShzbmFwc2hvdCkpO1xuICAgIFR5cGUuaWQgPSB0eXBlO1xufVxuLy8vXG4vLyBDT05TVEFOVDogMFxuVkFMVUUucHVzaCgoKSA9PiBDT05TVEFOVCk7XG5WQUxJREFURS5wdXNoKChfdGFnLCBzbmFwc2hvdCkgPT4gc25hcHNob3QgPT09IENPTlNUQU5UKTtcbmV4cG9ydCBjb25zdCBDT05TVEFOVF9UQUcgPSBuZXcgVGFnV3JhcHBlcigwLCBudWxsKTtcbi8vIFZPTEFUSUxFOiAxXG5WQUxVRS5wdXNoKCgpID0+IFZPTEFUSUxFKTtcblZBTElEQVRFLnB1c2goKF90YWcsIHNuYXBzaG90KSA9PiBzbmFwc2hvdCA9PT0gVk9MQVRJTEUpO1xuZXhwb3J0IGNvbnN0IFZPTEFUSUxFX1RBRyA9IG5ldyBUYWdXcmFwcGVyKDEsIG51bGwpO1xuLy8gQ1VSUkVOVDogMlxuVkFMVUUucHVzaCgoKSA9PiAkUkVWSVNJT04pO1xuVkFMSURBVEUucHVzaCgoX3RhZywgc25hcHNob3QpID0+IHNuYXBzaG90ID09PSAkUkVWSVNJT04pO1xuZXhwb3J0IGNvbnN0IENVUlJFTlRfVEFHID0gbmV3IFRhZ1dyYXBwZXIoMiwgbnVsbCk7XG4vLy9cbmxldCAkUkVWSVNJT04gPSBJTklUSUFMO1xuZXhwb3J0IGNsYXNzIERpcnR5YWJsZVRhZyBleHRlbmRzIFJldmlzaW9uVGFnIHtcbiAgICBzdGF0aWMgY3JlYXRlKHJldmlzaW9uID0gJFJFVklTSU9OKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgRGlydHlhYmxlVGFnKHJldmlzaW9uKSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHJldmlzaW9uID0gJFJFVklTSU9OKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmV2aXNpb24gPSByZXZpc2lvbjtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmlzaW9uO1xuICAgIH1cbiAgICBkaXJ0eSgpIHtcbiAgICAgICAgdGhpcy5yZXZpc2lvbiA9ICsrJFJFVklTSU9OO1xuICAgIH1cbn1cbnJlZ2lzdGVyKERpcnR5YWJsZVRhZyk7XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVRhZ2dlZCh0YWdnZWQpIHtcbiAgICBsZXQgb3B0aW1pemVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0YWdnZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGxldCB0YWcgPSB0YWdnZWRbaV0udGFnO1xuICAgICAgICBpZiAodGFnID09PSBWT0xBVElMRV9UQUcpIHJldHVybiBWT0xBVElMRV9UQUc7XG4gICAgICAgIGlmICh0YWcgPT09IENPTlNUQU5UX1RBRykgY29udGludWU7XG4gICAgICAgIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gICAgfVxuICAgIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVTbGljZShzbGljZSkge1xuICAgIGxldCBvcHRpbWl6ZWQgPSBbXTtcbiAgICBsZXQgbm9kZSA9IHNsaWNlLmhlYWQoKTtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgdGFnID0gbm9kZS50YWc7XG4gICAgICAgIGlmICh0YWcgPT09IFZPTEFUSUxFX1RBRykgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyAhPT0gQ09OU1RBTlRfVEFHKSBvcHRpbWl6ZWQucHVzaCh0YWcpO1xuICAgICAgICBub2RlID0gc2xpY2UubmV4dE5vZGUobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmUodGFncykge1xuICAgIGxldCBvcHRpbWl6ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRhZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGxldCB0YWcgPSB0YWdzW2ldO1xuICAgICAgICBpZiAodGFnID09PSBWT0xBVElMRV9UQUcpIHJldHVybiBWT0xBVElMRV9UQUc7XG4gICAgICAgIGlmICh0YWcgPT09IENPTlNUQU5UX1RBRykgY29udGludWU7XG4gICAgICAgIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gICAgfVxuICAgIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuZnVuY3Rpb24gX2NvbWJpbmUodGFncykge1xuICAgIHN3aXRjaCAodGFncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIENPTlNUQU5UX1RBRztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIHRhZ3NbMF07XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBUYWdzUGFpci5jcmVhdGUodGFnc1swXSwgdGFnc1sxXSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gVGFnc0NvbWJpbmF0b3IuY3JlYXRlKHRhZ3MpO1xuICAgIH1cbiAgICA7XG59XG5leHBvcnQgY2xhc3MgQ2FjaGVkVGFnIGV4dGVuZHMgUmV2aXNpb25UYWcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgbGV0IHsgbGFzdENoZWNrZWQsIGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGxhc3RDaGVja2VkICE9PSAkUkVWSVNJT04pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSAkUkVWSVNJT047XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IGxhc3RWYWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IG51bGw7XG4gICAgfVxufVxuY2xhc3MgVGFnc1BhaXIgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICAgIHN0YXRpYyBjcmVhdGUoZmlyc3QsIHNlY29uZCkge1xuICAgICAgICByZXR1cm4gbmV3IFRhZ1dyYXBwZXIodGhpcy5pZCwgbmV3IFRhZ3NQYWlyKGZpcnN0LCBzZWNvbmQpKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoZmlyc3QsIHNlY29uZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7XG4gICAgICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kO1xuICAgIH1cbiAgICBjb21wdXRlKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5maXJzdC52YWx1ZSgpLCB0aGlzLnNlY29uZC52YWx1ZSgpKTtcbiAgICB9XG59XG5yZWdpc3RlcihUYWdzUGFpcik7XG5jbGFzcyBUYWdzQ29tYmluYXRvciBleHRlbmRzIENhY2hlZFRhZyB7XG4gICAgc3RhdGljIGNyZWF0ZSh0YWdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgVGFnc0NvbWJpbmF0b3IodGFncykpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0YWdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIGxldCB7IHRhZ3MgfSA9IHRoaXM7XG4gICAgICAgIGxldCBtYXggPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0YWdzW2ldLnZhbHVlKCk7XG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heCh2YWx1ZSwgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cbnJlZ2lzdGVyKFRhZ3NDb21iaW5hdG9yKTtcbmV4cG9ydCBjbGFzcyBVcGRhdGFibGVUYWcgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICAgIHN0YXRpYyBjcmVhdGUodGFnKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFnV3JhcHBlcih0aGlzLmlkLCBuZXcgVXBkYXRhYmxlVGFnKHRhZykpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSBJTklUSUFMO1xuICAgIH1cbiAgICBjb21wdXRlKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5sYXN0VXBkYXRlZCwgdGhpcy50YWcudmFsdWUoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh0YWcpIHtcbiAgICAgICAgaWYgKHRhZyAhPT0gdGhpcy50YWcpIHtcbiAgICAgICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9ICRSRVZJU0lPTjtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxucmVnaXN0ZXIoVXBkYXRhYmxlVGFnKTtcbmV4cG9ydCBjbGFzcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCB7IHRhZywgbGFzdFJldmlzaW9uLCBsYXN0VmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGFzdFJldmlzaW9uIHx8ICF0YWcudmFsaWRhdGUobGFzdFJldmlzaW9uKSkge1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmNvbXB1dGUoKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gdGFnLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RWYWx1ZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSBudWxsO1xuICAgIH1cbn1cbmNsYXNzIE1hcHBlclJlZmVyZW5jZSBleHRlbmRzIENhY2hlZFJlZmVyZW5jZSB7XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlLCBtYXBwZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWcgPSByZWZlcmVuY2UudGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICAgICAgdGhpcy5tYXBwZXIgPSBtYXBwZXI7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIGxldCB7IHJlZmVyZW5jZSwgbWFwcGVyIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gbWFwcGVyKHJlZmVyZW5jZS52YWx1ZSgpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gbWFwKHJlZmVyZW5jZSwgbWFwcGVyKSB7XG4gICAgcmV0dXJuIG5ldyBNYXBwZXJSZWZlcmVuY2UocmVmZXJlbmNlLCBtYXBwZXIpO1xufVxuLy8vLy8vLy8vL1xuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UpIHtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50YWcgPSByZWZlcmVuY2UudGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB9XG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZhbHVlO1xuICAgIH1cbiAgICByZXZhbGlkYXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyByZWZlcmVuY2UsIGxhc3RSZXZpc2lvbiB9ID0gdGhpcztcbiAgICAgICAgbGV0IHRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgICAgIGlmICh0YWcudmFsaWRhdGUobGFzdFJldmlzaW9uKSkgcmV0dXJuIE5PVF9NT0RJRklFRDtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSB0YWcudmFsdWUoKTtcbiAgICAgICAgbGV0IHsgbGFzdFZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmFsdWUgPSByZWZlcmVuY2UudmFsdWUoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBsYXN0VmFsdWUpIHJldHVybiBOT1RfTU9ESUZJRUQ7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgbGV0IHsgcmVmZXJlbmNlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmxhc3RWYWx1ZSA9IHJlZmVyZW5jZS52YWx1ZSgpO1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHJlZmVyZW5jZS50YWcudmFsdWUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5jb25zdCBOT1RfTU9ESUZJRUQgPSBcImFkYjNiNzhlLTNkMjItNGU0Yi04NzdhLTYzMTdjMmM1YzE0NVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kaWZpZWQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE5PVF9NT0RJRklFRDtcbn0iXX0=