UNPKG

ember-legacy-class-transform

Version:
513 lines (434 loc) 58.9 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"); } } import { CachedReference, combineTagged, isConst as isConstReference, isModified, ReferenceCache } from '@glimmer/reference'; import { APPEND_OPCODES, UpdatingOpcode } from '../../opcodes'; import { NULL_REFERENCE, PrimitiveReference } from '../../references'; import { Assert } from './vm'; APPEND_OPCODES.add(24 /* Text */, function (vm, _ref) { var text = _ref.op1; vm.elements().appendText(vm.constants.getString(text)); }); APPEND_OPCODES.add(25 /* Comment */, function (vm, _ref2) { var text = _ref2.op1; vm.elements().appendComment(vm.constants.getString(text)); }); APPEND_OPCODES.add(27 /* OpenElement */, function (vm, _ref3) { var tag = _ref3.op1; vm.elements().openElement(vm.constants.getString(tag)); }); APPEND_OPCODES.add(28 /* OpenElementWithOperations */, function (vm, _ref4) { var tag = _ref4.op1; var tagName = vm.constants.getString(tag); var operations = vm.stack.pop(); vm.elements().openElement(tagName, operations); }); APPEND_OPCODES.add(29 /* OpenDynamicElement */, function (vm) { var operations = vm.stack.pop(); var tagName = vm.stack.pop().value(); vm.elements().openElement(tagName, operations); }); APPEND_OPCODES.add(36 /* PushRemoteElement */, function (vm) { var elementRef = vm.stack.pop(); var nextSiblingRef = vm.stack.pop(); var element = void 0; var nextSibling = void 0; if (isConstReference(elementRef)) { element = elementRef.value(); } else { var cache = new ReferenceCache(elementRef); element = cache.peek(); vm.updateWith(new Assert(cache)); } if (isConstReference(nextSiblingRef)) { nextSibling = nextSiblingRef.value(); } else { var _cache = new ReferenceCache(nextSiblingRef); nextSibling = _cache.peek(); vm.updateWith(new Assert(_cache)); } vm.elements().pushRemoteElement(element, nextSibling); }); APPEND_OPCODES.add(37 /* PopRemoteElement */, function (vm) { return vm.elements().popRemoteElement(); }); var ClassList = function () { function ClassList() { _classCallCheck(this, ClassList); this.list = null; this.isConst = true; } ClassList.prototype.append = function append(reference) { var list = this.list, isConst = this.isConst; if (list === null) list = this.list = []; list.push(reference); this.isConst = isConst && isConstReference(reference); }; ClassList.prototype.toReference = function toReference() { var list = this.list, isConst = this.isConst; if (!list) return NULL_REFERENCE; if (isConst) return PrimitiveReference.create(toClassName(list)); return new ClassListReference(list); }; return ClassList; }(); var ClassListReference = function (_CachedReference) { _inherits(ClassListReference, _CachedReference); function ClassListReference(list) { _classCallCheck(this, ClassListReference); var _this = _possibleConstructorReturn(this, _CachedReference.call(this)); _this.list = []; _this.tag = combineTagged(list); _this.list = list; return _this; } ClassListReference.prototype.compute = function compute() { return toClassName(this.list); }; return ClassListReference; }(CachedReference); function toClassName(list) { var ret = []; for (var i = 0; i < list.length; i++) { var value = list[i].value(); if (value !== false && value !== null && value !== undefined) ret.push(value); } return ret.length === 0 ? null : ret.join(' '); } export var SimpleElementOperations = function () { function SimpleElementOperations(env) { _classCallCheck(this, SimpleElementOperations); this.env = env; this.opcodes = null; this.classList = null; } SimpleElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) { if (name === 'class') { this.addClass(PrimitiveReference.create(value)); } else { this.env.getAppendOperations().setAttribute(element, name, value); } }; SimpleElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) { this.env.getAppendOperations().setAttribute(element, name, value, namespace); }; SimpleElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference, isTrusting) { if (name === 'class') { this.addClass(reference); } else { var attributeManager = this.env.attributeFor(element, name, isTrusting); var attribute = new DynamicAttribute(element, attributeManager, name, reference); this.addAttribute(attribute); } }; SimpleElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference, isTrusting) { var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace); var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace); this.addAttribute(nsAttribute); }; SimpleElementOperations.prototype.flush = function flush(element, vm) { var env = vm.env; var opcodes = this.opcodes, classList = this.classList; for (var i = 0; opcodes && i < opcodes.length; i++) { vm.updateWith(opcodes[i]); } if (classList) { var attributeManager = env.attributeFor(element, 'class', false); var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference()); var opcode = attribute.flush(env); if (opcode) { vm.updateWith(opcode); } } this.opcodes = null; this.classList = null; }; SimpleElementOperations.prototype.addClass = function addClass(reference) { var classList = this.classList; if (!classList) { classList = this.classList = new ClassList(); } classList.append(reference); }; SimpleElementOperations.prototype.addAttribute = function addAttribute(attribute) { var opcode = attribute.flush(this.env); if (opcode) { var opcodes = this.opcodes; if (!opcodes) { opcodes = this.opcodes = []; } opcodes.push(opcode); } }; return SimpleElementOperations; }(); export var ComponentElementOperations = function () { function ComponentElementOperations(env) { _classCallCheck(this, ComponentElementOperations); this.env = env; this.attributeNames = null; this.attributes = null; this.classList = null; } ComponentElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) { if (name === 'class') { this.addClass(PrimitiveReference.create(value)); } else if (this.shouldAddAttribute(name)) { this.addAttribute(name, new StaticAttribute(element, name, value)); } }; ComponentElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) { if (this.shouldAddAttribute(name)) { this.addAttribute(name, new StaticAttribute(element, name, value, namespace)); } }; ComponentElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference, isTrusting) { if (name === 'class') { this.addClass(reference); } else if (this.shouldAddAttribute(name)) { var attributeManager = this.env.attributeFor(element, name, isTrusting); var attribute = new DynamicAttribute(element, attributeManager, name, reference); this.addAttribute(name, attribute); } }; ComponentElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference, isTrusting) { if (this.shouldAddAttribute(name)) { var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace); var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace); this.addAttribute(name, nsAttribute); } }; ComponentElementOperations.prototype.flush = function flush(element, vm) { var env = this.env; var attributes = this.attributes, classList = this.classList; for (var i = 0; attributes && i < attributes.length; i++) { var opcode = attributes[i].flush(env); if (opcode) { vm.updateWith(opcode); } } if (classList) { var attributeManager = env.attributeFor(element, 'class', false); var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference()); var _opcode = attribute.flush(env); if (_opcode) { vm.updateWith(_opcode); } } }; ComponentElementOperations.prototype.shouldAddAttribute = function shouldAddAttribute(name) { return !this.attributeNames || this.attributeNames.indexOf(name) === -1; }; ComponentElementOperations.prototype.addClass = function addClass(reference) { var classList = this.classList; if (!classList) { classList = this.classList = new ClassList(); } classList.append(reference); }; ComponentElementOperations.prototype.addAttribute = function addAttribute(name, attribute) { var attributeNames = this.attributeNames, attributes = this.attributes; if (!attributeNames) { attributeNames = this.attributeNames = []; attributes = this.attributes = []; } attributeNames.push(name); attributes.push(attribute); }; return ComponentElementOperations; }(); APPEND_OPCODES.add(33 /* FlushElement */, function (vm) { var stack = vm.elements(); var action = 'FlushElementOpcode#evaluate'; stack.expectOperations(action).flush(stack.expectConstructing(action), vm); stack.flushElement(); }); APPEND_OPCODES.add(34 /* CloseElement */, function (vm) { return vm.elements().closeElement(); }); APPEND_OPCODES.add(30 /* StaticAttr */, function (vm, _ref5) { var _name = _ref5.op1, _value = _ref5.op2, _namespace = _ref5.op3; var name = vm.constants.getString(_name); var value = vm.constants.getString(_value); if (_namespace) { var namespace = vm.constants.getString(_namespace); vm.elements().setStaticAttributeNS(namespace, name, value); } else { vm.elements().setStaticAttribute(name, value); } }); APPEND_OPCODES.add(35 /* Modifier */, function (vm, _ref6) { var _manager = _ref6.op1; var manager = vm.constants.getOther(_manager); var stack = vm.stack; var args = stack.pop(); var tag = args.tag; var _vm$elements = vm.elements(), element = _vm$elements.constructing, updateOperations = _vm$elements.updateOperations; var dynamicScope = vm.dynamicScope(); var modifier = manager.create(element, args, dynamicScope, updateOperations); args.clear(); vm.env.scheduleInstallModifier(modifier, manager); var destructor = manager.getDestructor(modifier); if (destructor) { vm.newDestroyable(destructor); } vm.updateWith(new UpdateModifierOpcode(tag, manager, modifier)); }); export var UpdateModifierOpcode = function (_UpdatingOpcode) { _inherits(UpdateModifierOpcode, _UpdatingOpcode); function UpdateModifierOpcode(tag, manager, modifier) { _classCallCheck(this, UpdateModifierOpcode); var _this2 = _possibleConstructorReturn(this, _UpdatingOpcode.call(this)); _this2.tag = tag; _this2.manager = manager; _this2.modifier = modifier; _this2.type = 'update-modifier'; _this2.lastUpdated = tag.value(); return _this2; } UpdateModifierOpcode.prototype.evaluate = function evaluate(vm) { var manager = this.manager, modifier = this.modifier, tag = this.tag, lastUpdated = this.lastUpdated; if (!tag.validate(lastUpdated)) { vm.env.scheduleUpdateModifier(modifier, manager); this.lastUpdated = tag.value(); } }; UpdateModifierOpcode.prototype.toJSON = function toJSON() { return { guid: this._guid, type: this.type }; }; return UpdateModifierOpcode; }(UpdatingOpcode); export var StaticAttribute = function () { function StaticAttribute(element, name, value, namespace) { _classCallCheck(this, StaticAttribute); this.element = element; this.name = name; this.value = value; this.namespace = namespace; } StaticAttribute.prototype.flush = function flush(env) { env.getAppendOperations().setAttribute(this.element, this.name, this.value, this.namespace); return null; }; return StaticAttribute; }(); export var DynamicAttribute = function () { function DynamicAttribute(element, attributeManager, name, reference, namespace) { _classCallCheck(this, DynamicAttribute); this.element = element; this.attributeManager = attributeManager; this.name = name; this.reference = reference; this.namespace = namespace; this.cache = null; this.tag = reference.tag; } DynamicAttribute.prototype.patch = function patch(env) { var element = this.element, cache = this.cache; var value = cache.revalidate(); if (isModified(value)) { this.attributeManager.updateAttribute(env, element, value, this.namespace); } }; DynamicAttribute.prototype.flush = function flush(env) { var reference = this.reference, element = this.element; if (isConstReference(reference)) { var value = reference.value(); this.attributeManager.setAttribute(env, element, value, this.namespace); return null; } else { var cache = this.cache = new ReferenceCache(reference); var _value2 = cache.peek(); this.attributeManager.setAttribute(env, element, _value2, this.namespace); return new PatchElementOpcode(this); } }; DynamicAttribute.prototype.toJSON = function toJSON() { var element = this.element, namespace = this.namespace, name = this.name, cache = this.cache; var formattedElement = formatElement(element); var lastValue = cache.peek(); if (namespace) { return { element: formattedElement, lastValue: lastValue, name: name, namespace: namespace, type: 'attribute' }; } return { element: formattedElement, lastValue: lastValue, name: name, namespace: namespace === undefined ? null : namespace, type: 'attribute' }; }; return DynamicAttribute; }(); function formatElement(element) { return JSON.stringify('<' + element.tagName.toLowerCase() + ' />'); } APPEND_OPCODES.add(32 /* DynamicAttrNS */, function (vm, _ref7) { var _name = _ref7.op1, _namespace = _ref7.op2, trusting = _ref7.op3; var name = vm.constants.getString(_name); var namespace = vm.constants.getString(_namespace); var reference = vm.stack.pop(); vm.elements().setDynamicAttributeNS(namespace, name, reference, !!trusting); }); APPEND_OPCODES.add(31 /* DynamicAttr */, function (vm, _ref8) { var _name = _ref8.op1, trusting = _ref8.op2; var name = vm.constants.getString(_name); var reference = vm.stack.pop(); vm.elements().setDynamicAttribute(name, reference, !!trusting); }); export var PatchElementOpcode = function (_UpdatingOpcode2) { _inherits(PatchElementOpcode, _UpdatingOpcode2); function PatchElementOpcode(operation) { _classCallCheck(this, PatchElementOpcode); var _this3 = _possibleConstructorReturn(this, _UpdatingOpcode2.call(this)); _this3.type = 'patch-element'; _this3.tag = operation.tag; _this3.operation = operation; return _this3; } PatchElementOpcode.prototype.evaluate = function evaluate(vm) { this.operation.patch(vm.env); }; PatchElementOpcode.prototype.toJSON = function toJSON() { var _guid = this._guid, type = this.type, operation = this.operation; return { details: operation.toJSON(), guid: _guid, type: type }; }; return PatchElementOpcode; }(UpdatingOpcode); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2RvbS5qcyJdLCJuYW1lcyI6WyJDYWNoZWRSZWZlcmVuY2UiLCJjb21iaW5lVGFnZ2VkIiwiaXNDb25zdCIsImlzQ29uc3RSZWZlcmVuY2UiLCJpc01vZGlmaWVkIiwiUmVmZXJlbmNlQ2FjaGUiLCJBUFBFTkRfT1BDT0RFUyIsIlVwZGF0aW5nT3Bjb2RlIiwiTlVMTF9SRUZFUkVOQ0UiLCJQcmltaXRpdmVSZWZlcmVuY2UiLCJBc3NlcnQiLCJhZGQiLCJ2bSIsInRleHQiLCJvcDEiLCJlbGVtZW50cyIsImFwcGVuZFRleHQiLCJjb25zdGFudHMiLCJnZXRTdHJpbmciLCJhcHBlbmRDb21tZW50IiwidGFnIiwib3BlbkVsZW1lbnQiLCJ0YWdOYW1lIiwib3BlcmF0aW9ucyIsInN0YWNrIiwicG9wIiwidmFsdWUiLCJlbGVtZW50UmVmIiwibmV4dFNpYmxpbmdSZWYiLCJlbGVtZW50IiwibmV4dFNpYmxpbmciLCJjYWNoZSIsInBlZWsiLCJ1cGRhdGVXaXRoIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiQ2xhc3NMaXN0IiwibGlzdCIsImFwcGVuZCIsInJlZmVyZW5jZSIsInB1c2giLCJ0b1JlZmVyZW5jZSIsImNyZWF0ZSIsInRvQ2xhc3NOYW1lIiwiQ2xhc3NMaXN0UmVmZXJlbmNlIiwiY29tcHV0ZSIsInJldCIsImkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwiU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMiLCJlbnYiLCJvcGNvZGVzIiwiY2xhc3NMaXN0IiwiYWRkU3RhdGljQXR0cmlidXRlIiwibmFtZSIsImFkZENsYXNzIiwiZ2V0QXBwZW5kT3BlcmF0aW9ucyIsInNldEF0dHJpYnV0ZSIsImFkZFN0YXRpY0F0dHJpYnV0ZU5TIiwibmFtZXNwYWNlIiwiYWRkRHluYW1pY0F0dHJpYnV0ZSIsImlzVHJ1c3RpbmciLCJhdHRyaWJ1dGVNYW5hZ2VyIiwiYXR0cmlidXRlRm9yIiwiYXR0cmlidXRlIiwiRHluYW1pY0F0dHJpYnV0ZSIsImFkZEF0dHJpYnV0ZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVOUyIsIm5zQXR0cmlidXRlIiwiZmx1c2giLCJvcGNvZGUiLCJDb21wb25lbnRFbGVtZW50T3BlcmF0aW9ucyIsImF0dHJpYnV0ZU5hbWVzIiwiYXR0cmlidXRlcyIsInNob3VsZEFkZEF0dHJpYnV0ZSIsIlN0YXRpY0F0dHJpYnV0ZSIsImluZGV4T2YiLCJhY3Rpb24iLCJleHBlY3RPcGVyYXRpb25zIiwiZXhwZWN0Q29uc3RydWN0aW5nIiwiZmx1c2hFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwiX25hbWUiLCJfdmFsdWUiLCJvcDIiLCJfbmFtZXNwYWNlIiwib3AzIiwic2V0U3RhdGljQXR0cmlidXRlTlMiLCJzZXRTdGF0aWNBdHRyaWJ1dGUiLCJfbWFuYWdlciIsIm1hbmFnZXIiLCJnZXRPdGhlciIsImFyZ3MiLCJjb25zdHJ1Y3RpbmciLCJ1cGRhdGVPcGVyYXRpb25zIiwiZHluYW1pY1Njb3BlIiwibW9kaWZpZXIiLCJjbGVhciIsInNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyIiwiZGVzdHJ1Y3RvciIsImdldERlc3RydWN0b3IiLCJuZXdEZXN0cm95YWJsZSIsIlVwZGF0ZU1vZGlmaWVyT3Bjb2RlIiwidHlwZSIsImxhc3RVcGRhdGVkIiwiZXZhbHVhdGUiLCJ2YWxpZGF0ZSIsInNjaGVkdWxlVXBkYXRlTW9kaWZpZXIiLCJ0b0pTT04iLCJndWlkIiwiX2d1aWQiLCJwYXRjaCIsInJldmFsaWRhdGUiLCJ1cGRhdGVBdHRyaWJ1dGUiLCJQYXRjaEVsZW1lbnRPcGNvZGUiLCJmb3JtYXR0ZWRFbGVtZW50IiwiZm9ybWF0RWxlbWVudCIsImxhc3RWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b0xvd2VyQ2FzZSIsInRydXN0aW5nIiwic2V0RHluYW1pY0F0dHJpYnV0ZU5TIiwic2V0RHluYW1pY0F0dHJpYnV0ZSIsIm9wZXJhdGlvbiIsImRldGFpbHMiXSwibWFwcGluZ3MiOiI7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NUIsQ0FDQ0EsS0FERDtBQUFBLFlBQ1FQLElBRFIsR0FDNEIsSUFENUIsQ0FDUUEsSUFEUjtBQUFBLFlBQ2NxQixTQURkLEdBQzRCLElBRDVCLENBQ2NBLFNBRGQ7O0FBRUwsZUFBTztBQUNIQyxxQkFBU0QsVUFBVWhCLE1BQVYsRUFETjtBQUVIQyxrQkFBTUMsS0FGSDtBQUdIUDtBQUhHLFNBQVA7QUFLSCxLQWpCTDs7QUFBQTtBQUFBLEVBQXdDbEcsY0FBeEMiLCJmaWxlIjoibGliL2NvbXBpbGVkL29wY29kZXMvZG9tLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVkUmVmZXJlbmNlLCBjb21iaW5lVGFnZ2VkLCBpc0NvbnN0IGFzIGlzQ29uc3RSZWZlcmVuY2UsIGlzTW9kaWZpZWQsIFJlZmVyZW5jZUNhY2hlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGV4cGVjdCwgdW53cmFwIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUywgVXBkYXRpbmdPcGNvZGUgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IE5VTExfUkVGRVJFTkNFLCBQcmltaXRpdmVSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9yZWZlcmVuY2VzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI0IC8qIFRleHQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kVGV4dCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI1IC8qIENvbW1lbnQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kQ29tbWVudCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI3IC8qIE9wZW5FbGVtZW50ICovLCAodm0sIHsgb3AxOiB0YWcgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodm0uY29uc3RhbnRzLmdldFN0cmluZyh0YWcpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi8sICh2bSwgeyBvcDE6IHRhZyB9KSA9PiB7XG4gICAgbGV0IHRhZ05hbWUgPSB2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRhZyk7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICB2bS5lbGVtZW50cygpLm9wZW5FbGVtZW50KHRhZ05hbWUsIG9wZXJhdGlvbnMpO1xufSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMjkgLyogT3BlbkR5bmFtaWNFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgdGFnTmFtZSA9IHZtLnN0YWNrLnBvcCgpLnZhbHVlKCk7XG4gICAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh0YWdOYW1lLCBvcGVyYXRpb25zKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDM2IC8qIFB1c2hSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IGVsZW1lbnRSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgbmV4dFNpYmxpbmdSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgZWxlbWVudDtcbiAgICBsZXQgbmV4dFNpYmxpbmc7XG4gICAgaWYgKGlzQ29uc3RSZWZlcmVuY2UoZWxlbWVudFJlZikpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRSZWYudmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY2FjaGUgPSBuZXcgUmVmZXJlbmNlQ2FjaGUoZWxlbWVudFJlZik7XG4gICAgICAgIGVsZW1lbnQgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChjYWNoZSkpO1xuICAgIH1cbiAgICBpZiAoaXNDb25zdFJlZmVyZW5jZShuZXh0U2libGluZ1JlZikpIHtcbiAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZ1JlZi52YWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjYWNoZSA9IG5ldyBSZWZlcmVuY2VDYWNoZShuZXh0U2libGluZ1JlZik7XG4gICAgICAgIG5leHRTaWJsaW5nID0gY2FjaGUucGVlaygpO1xuICAgICAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoY2FjaGUpKTtcbiAgICB9XG4gICAgdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBuZXh0U2libGluZyk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgzNyAvKiBQb3BSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB2bS5lbGVtZW50cygpLnBvcFJlbW90ZUVsZW1lbnQoKSk7XG5jbGFzcyBDbGFzc0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSB0cnVlO1xuICAgIH1cbiAgICBhcHBlbmQocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmIChsaXN0ID09PSBudWxsKSBsaXN0ID0gdGhpcy5saXN0ID0gW107XG4gICAgICAgIGxpc3QucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0ICYmIGlzQ29uc3RSZWZlcmVuY2UocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgdG9SZWZlcmVuY2UoKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGlzdCkgcmV0dXJuIE5VTExfUkVGRVJFTkNFO1xuICAgICAgICBpZiAoaXNDb25zdCkgcmV0dXJuIFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUodG9DbGFzc05hbWUobGlzdCkpO1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdFJlZmVyZW5jZShsaXN0KTtcbiAgICB9XG59XG5jbGFzcyBDbGFzc0xpc3RSZWZlcmVuY2UgZXh0ZW5kcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKGxpc3QpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgICAgIHRoaXMudGFnID0gY29tYmluZVRhZ2dlZChsaXN0KTtcbiAgICAgICAgdGhpcy5saXN0ID0gbGlzdDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvQ2xhc3NOYW1lKHRoaXMubGlzdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9DbGFzc05hbWUobGlzdCkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbGlzdFtpXS52YWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHJldC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0LmpvaW4oJyAnKTtcbn1cbmV4cG9ydCBjbGFzcyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoZW52KSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLm9wY29kZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCkuc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKS5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGFkZER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENsYXNzKHJlZmVyZW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlTWFuYWdlciA9IHRoaXMuZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCBuYW1lLCBpc1RydXN0aW5nKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCBuYW1lLCByZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGREeW5hbWljQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgbGV0IG5zQXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlLCBuYW1lc3BhY2UpO1xuICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZShuc0F0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGZsdXNoKGVsZW1lbnQsIHZtKSB7XG4gICAgICAgIGxldCB7IGVudiB9ID0gdm07XG4gICAgICAgIGxldCB7IG9wY29kZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IG9wY29kZXMgJiYgaSA8IG9wY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSBlbnYuYXR0cmlidXRlRm9yKGVsZW1lbnQsICdjbGFzcycsIGZhbHNlKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCAnY2xhc3MnLCBjbGFzc0xpc3QudG9SZWZlcmVuY2UoKSk7XG4gICAgICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0ID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKHRoaXMuZW52KTtcbiAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgbGV0IHsgb3Bjb2RlcyB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghb3Bjb2Rlcykge1xuICAgICAgICAgICAgICAgIG9wY29kZXMgPSB0aGlzLm9wY29kZXMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wY29kZXMucHVzaChvcGNvZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEVsZW1lbnRPcGVyYXRpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5ldyBTdGF0aWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUobmFtZSwgbmV3IFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3MocmVmZXJlbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZyk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZU5TKGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIGxldCBuc0F0dHJpYnV0ZSA9IG5ldyBEeW5hbWljQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU1hbmFnZXIsIG5hbWUsIHJlZmVyZW5jZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5zQXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaChlbGVtZW50LCB2bSkge1xuICAgICAgICBsZXQgeyBlbnYgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGF0dHJpYnV0ZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGF0dHJpYnV0ZXMgJiYgaSA8IGF0dHJpY