UNPKG

ember-legacy-class-transform

Version:
186 lines (180 loc) 22.4 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.OPTION_SELECTED_MANAGER = exports.INPUT_VALUE_PROPERTY_MANAGER = exports.PropertyManager = exports.AttributeManager = undefined; exports.defaultManagers = defaultManagers; exports.defaultPropertyManagers = defaultPropertyManagers; exports.defaultAttributeManagers = defaultAttributeManagers; exports.readDOMAttr = readDOMAttr; var _sanitizedValues = require('./sanitized-values'); var _props = require('./props'); var _helper = require('./helper'); var _content = require('../compiled/opcodes/content'); function defaultManagers(element, attr, _isTrusting, _namespace) { let tagName = element.tagName; let isSVG = element.namespaceURI === _helper.SVG_NAMESPACE; if (isSVG) { return defaultAttributeManagers(tagName, attr); } let { type, normalized } = (0, _props.normalizeProperty)(element, attr); if (type === 'attr') { return defaultAttributeManagers(tagName, normalized); } else { return defaultPropertyManagers(tagName, normalized); } } function defaultPropertyManagers(tagName, attr) { if ((0, _sanitizedValues.requiresSanitization)(tagName, attr)) { return new SafePropertyManager(attr); } if (isUserInputValue(tagName, attr)) { return INPUT_VALUE_PROPERTY_MANAGER; } if (isOptionSelected(tagName, attr)) { return OPTION_SELECTED_MANAGER; } return new PropertyManager(attr); } function defaultAttributeManagers(tagName, attr) { if ((0, _sanitizedValues.requiresSanitization)(tagName, attr)) { return new SafeAttributeManager(attr); } return new AttributeManager(attr); } function readDOMAttr(element, attr) { let isSVG = element.namespaceURI === _helper.SVG_NAMESPACE; let { type, normalized } = (0, _props.normalizeProperty)(element, attr); if (isSVG) { return element.getAttribute(normalized); } if (type === 'attr') { return element.getAttribute(normalized); } { return element[normalized]; } } ; class AttributeManager { constructor(attr) { this.attr = attr; } setAttribute(env, element, value, namespace) { let dom = env.getAppendOperations(); let normalizedValue = normalizeAttributeValue(value); if (!isAttrRemovalValue(normalizedValue)) { dom.setAttribute(element, this.attr, normalizedValue, namespace); } } updateAttribute(env, element, value, namespace) { if (value === null || value === undefined || value === false) { if (namespace) { env.getDOM().removeAttributeNS(element, namespace, this.attr); } else { env.getDOM().removeAttribute(element, this.attr); } } else { this.setAttribute(env, element, value); } } } exports.AttributeManager = AttributeManager; ; class PropertyManager extends AttributeManager { setAttribute(_env, element, value, _namespace) { if (!isAttrRemovalValue(value)) { element[this.attr] = value; } } removeAttribute(env, element, namespace) { // TODO this sucks but to preserve properties first and to meet current // semantics we must do this. let { attr } = this; if (namespace) { env.getDOM().removeAttributeNS(element, namespace, attr); } else { env.getDOM().removeAttribute(element, attr); } } updateAttribute(env, element, value, namespace) { // ensure the property is always updated element[this.attr] = value; if (isAttrRemovalValue(value)) { this.removeAttribute(env, element, namespace); } } } exports.PropertyManager = PropertyManager; ; function normalizeAttributeValue(value) { if (value === false || value === undefined || value === null) { return null; } if (value === true) { return ''; } // onclick function etc in SSR if (typeof value === 'function') { return null; } return String(value); } function isAttrRemovalValue(value) { return value === null || value === undefined; } class SafePropertyManager extends PropertyManager { setAttribute(env, element, value) { super.setAttribute(env, element, (0, _sanitizedValues.sanitizeAttributeValue)(env, element, this.attr, value)); } updateAttribute(env, element, value) { super.updateAttribute(env, element, (0, _sanitizedValues.sanitizeAttributeValue)(env, element, this.attr, value)); } } function isUserInputValue(tagName, attribute) { return (tagName === 'INPUT' || tagName === 'TEXTAREA') && attribute === 'value'; } class InputValuePropertyManager extends AttributeManager { setAttribute(_env, element, value) { let input = element; input.value = (0, _content.normalizeTextValue)(value); } updateAttribute(_env, element, value) { let input = element; let currentValue = input.value; let normalizedValue = (0, _content.normalizeTextValue)(value); if (currentValue !== normalizedValue) { input.value = normalizedValue; } } } const INPUT_VALUE_PROPERTY_MANAGER = exports.INPUT_VALUE_PROPERTY_MANAGER = new InputValuePropertyManager('value'); function isOptionSelected(tagName, attribute) { return tagName === 'OPTION' && attribute === 'selected'; } class OptionSelectedManager extends PropertyManager { setAttribute(_env, element, value) { if (value !== null && value !== undefined && value !== false) { let option = element; option.selected = true; } } updateAttribute(_env, element, value) { let option = element; if (value) { option.selected = true; } else { option.selected = false; } } } const OPTION_SELECTED_MANAGER = exports.OPTION_SELECTED_MANAGER = new OptionSelectedManager('selected'); class SafeAttributeManager extends AttributeManager { setAttribute(env, element, value) { super.setAttribute(env, element, (0, _sanitizedValues.sanitizeAttributeValue)(env, element, this.attr, value)); } updateAttribute(env, element, value, _namespace) { super.updateAttribute(env, element, (0, _sanitizedValues.sanitizeAttributeValue)(env, element, this.attr, value)); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kb20vYXR0cmlidXRlLW1hbmFnZXJzLmpzIl0sIm5hbWVzIjpbImRlZmF1bHRNYW5hZ2VycyIsImRlZmF1bHRQcm9wZXJ0eU1hbmFnZXJzIiwiZGVmYXVsdEF0dHJpYnV0ZU1hbmFnZXJzIiwicmVhZERPTUF0dHIiLCJlbGVtZW50IiwiYXR0ciIsIl9pc1RydXN0aW5nIiwiX25hbWVzcGFjZSIsInRhZ05hbWUiLCJpc1NWRyIsIm5hbWVzcGFjZVVSSSIsInR5cGUiLCJub3JtYWxpemVkIiwiU2FmZVByb3BlcnR5TWFuYWdlciIsImlzVXNlcklucHV0VmFsdWUiLCJJTlBVVF9WQUxVRV9QUk9QRVJUWV9NQU5BR0VSIiwiaXNPcHRpb25TZWxlY3RlZCIsIk9QVElPTl9TRUxFQ1RFRF9NQU5BR0VSIiwiUHJvcGVydHlNYW5hZ2VyIiwiU2FmZUF0dHJpYnV0ZU1hbmFnZXIiLCJBdHRyaWJ1dGVNYW5hZ2VyIiwiZ2V0QXR0cmlidXRlIiwiY29uc3RydWN0b3IiLCJzZXRBdHRyaWJ1dGUiLCJlbnYiLCJ2YWx1ZSIsIm5hbWVzcGFjZSIsImRvbSIsImdldEFwcGVuZE9wZXJhdGlvbnMiLCJub3JtYWxpemVkVmFsdWUiLCJub3JtYWxpemVBdHRyaWJ1dGVWYWx1ZSIsImlzQXR0clJlbW92YWxWYWx1ZSIsInVwZGF0ZUF0dHJpYnV0ZSIsInVuZGVmaW5lZCIsImdldERPTSIsInJlbW92ZUF0dHJpYnV0ZU5TIiwicmVtb3ZlQXR0cmlidXRlIiwiX2VudiIsIlN0cmluZyIsImF0dHJpYnV0ZSIsIklucHV0VmFsdWVQcm9wZXJ0eU1hbmFnZXIiLCJpbnB1dCIsImN1cnJlbnRWYWx1ZSIsIk9wdGlvblNlbGVjdGVkTWFuYWdlciIsIm9wdGlvbiIsInNlbGVjdGVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUFJZ0JBLGUsR0FBQUEsZTtRQWFBQyx1QixHQUFBQSx1QjtRQVlBQyx3QixHQUFBQSx3QjtRQU1BQyxXLEdBQUFBLFc7O0FBbkNoQjs7QUFDQTs7QUFDQTs7QUFD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QUFXO0FBQ1BtQixtQkFBT0MsUUFBUCxHQUFrQixJQUFsQjtBQUNILFNBRkQsTUFFTztBQUNIRCxtQkFBT0MsUUFBUCxHQUFrQixLQUFsQjtBQUNIO0FBQ0o7QUFkK0M7QUFnQjdDLE1BQU01Qiw0REFBMEIsSUFBSTBCLHFCQUFKLENBQTBCLFVBQTFCLENBQWhDO0FBQ1AsTUFBTXhCLG9CQUFOLFNBQW1DQyxnQkFBbkMsQ0FBb0Q7QUFDaERHLGlCQUFhQyxHQUFiLEVBQWtCcEIsT0FBbEIsRUFBMkJxQixLQUEzQixFQUFrQztBQUM5QixjQUFNRixZQUFOLENBQW1CQyxHQUFuQixFQUF3QnBCLE9BQXhCLEVBQWlDLDZDQUF1Qm9CLEdBQXZCLEVBQTRCcEIsT0FBNUIsRUFBcUMsS0FBS0MsSUFBMUMsRUFBZ0RvQixLQUFoRCxDQUFqQztBQUNIO0FBQ0RPLG9CQUFnQlIsR0FBaEIsRUFBcUJwQixPQUFyQixFQUE4QnFCLEtBQTlCLEVBQXFDbEIsVUFBckMsRUFBaUQ7QUFDN0MsY0FBTXlCLGVBQU4sQ0FBc0JSLEdBQXRCLEVBQTJCcEIsT0FBM0IsRUFBb0MsNkNBQXVCb0IsR0FBdkIsRUFBNEJwQixPQUE1QixFQUFxQyxLQUFLQyxJQUExQyxFQUFnRG9CLEtBQWhELENBQXBDO0FBQ0g7QUFOK0MiLCJmaWxlIjoibGliL2RvbS9hdHRyaWJ1dGUtbWFuYWdlcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlLCByZXF1aXJlc1Nhbml0aXphdGlvbiB9IGZyb20gJy4vc2FuaXRpemVkLXZhbHVlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVQcm9wZXJ0eSB9IGZyb20gJy4vcHJvcHMnO1xuaW1wb3J0IHsgU1ZHX05BTUVTUEFDRSB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IG5vcm1hbGl6ZVRleHRWYWx1ZSB9IGZyb20gJy4uL2NvbXBpbGVkL29wY29kZXMvY29udGVudCc7XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1hbmFnZXJzKGVsZW1lbnQsIGF0dHIsIF9pc1RydXN0aW5nLCBfbmFtZXNwYWNlKSB7XG4gICAgbGV0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7XG4gICAgbGV0IGlzU1ZHID0gZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0U7XG4gICAgaWYgKGlzU1ZHKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0QXR0cmlidXRlTWFuYWdlcnModGFnTmFtZSwgYXR0cik7XG4gICAgfVxuICAgIGxldCB7IHR5cGUsIG5vcm1hbGl6ZWQgfSA9IG5vcm1hbGl6ZVByb3BlcnR5KGVsZW1lbnQsIGF0dHIpO1xuICAgIGlmICh0eXBlID09PSAnYXR0cicpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRBdHRyaWJ1dGVNYW5hZ2Vycyh0YWdOYW1lLCBub3JtYWxpemVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BlcnR5TWFuYWdlcnModGFnTmFtZSwgbm9ybWFsaXplZCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQcm9wZXJ0eU1hbmFnZXJzKHRhZ05hbWUsIGF0dHIpIHtcbiAgICBpZiAocmVxdWlyZXNTYW5pdGl6YXRpb24odGFnTmFtZSwgYXR0cikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYWZlUHJvcGVydHlNYW5hZ2VyKGF0dHIpO1xuICAgIH1cbiAgICBpZiAoaXNVc2VySW5wdXRWYWx1ZSh0YWdOYW1lLCBhdHRyKSkge1xuICAgICAgICByZXR1cm4gSU5QVVRfVkFMVUVfUFJPUEVSVFlfTUFOQUdFUjtcbiAgICB9XG4gICAgaWYgKGlzT3B0aW9uU2VsZWN0ZWQodGFnTmFtZSwgYXR0cikpIHtcbiAgICAgICAgcmV0dXJuIE9QVElPTl9TRUxFQ1RFRF9NQU5BR0VSO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3BlcnR5TWFuYWdlcihhdHRyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0QXR0cmlidXRlTWFuYWdlcnModGFnTmFtZSwgYXR0cikge1xuICAgIGlmIChyZXF1aXJlc1Nhbml0aXphdGlvbih0YWdOYW1lLCBhdHRyKSkge1xuICAgICAgICByZXR1cm4gbmV3IFNhZmVBdHRyaWJ1dGVNYW5hZ2VyKGF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoYXR0cik7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVhZERPTUF0dHIoZWxlbWVudCwgYXR0cikge1xuICAgIGxldCBpc1NWRyA9IGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFO1xuICAgIGxldCB7IHR5cGUsIG5vcm1hbGl6ZWQgfSA9IG5vcm1hbGl6ZVByb3BlcnR5KGVsZW1lbnQsIGF0dHIpO1xuICAgIGlmIChpc1NWRykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobm9ybWFsaXplZCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnYXR0cicpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5vcm1hbGl6ZWQpO1xuICAgIH1cbiAgICB7XG4gICAgICAgIHJldHVybiBlbGVtZW50W25vcm1hbGl6ZWRdO1xuICAgIH1cbn1cbjtcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVNYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcihhdHRyKSB7XG4gICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgfVxuICAgIHNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIHZhbHVlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgbGV0IGRvbSA9IGVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCk7XG4gICAgICAgIGxldCBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNBdHRyUmVtb3ZhbFZhbHVlKG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgdGhpcy5hdHRyLCBub3JtYWxpemVkVmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQXR0cmlidXRlKGVudiwgZWxlbWVudCwgdmFsdWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICBlbnYuZ2V0RE9NKCkucmVtb3ZlQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCB0aGlzLmF0dHIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbnYuZ2V0RE9NKCkucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIHRoaXMuYXR0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbjtcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eU1hbmFnZXIgZXh0ZW5kcyBBdHRyaWJ1dGVNYW5hZ2VyIHtcbiAgICBzZXRBdHRyaWJ1dGUoX2VudiwgZWxlbWVudCwgdmFsdWUsIF9uYW1lc3BhY2UpIHtcbiAgICAgICAgaWYgKCFpc0F0dHJSZW1vdmFsVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICBlbGVtZW50W3RoaXMuYXR0cl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVBdHRyaWJ1dGUoZW52LCBlbGVtZW50LCBuYW1lc3BhY2UpIHtcbiAgICAgICAgLy8gVE9ETyB0aGlzIHN1Y2tzIGJ1dCB0byBwcmVzZXJ2ZSBwcm9wZXJ0aWVzIGZpcnN0IGFuZCB0byBtZWV0IGN1cnJlbnRcbiAgICAgICAgLy8gc2VtYW50aWNzIHdlIG11c3QgZG8gdGhpcy5cbiAgICAgICAgbGV0IHsgYXR0ciB9ID0gdGhpcztcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgZW52LmdldERPTSgpLnJlbW92ZUF0dHJpYnV0ZU5TKGVsZW1lbnQsIG5hbWVzcGFjZSwgYXR0cik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbnYuZ2V0RE9NKCkucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIHZhbHVlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgLy8gZW5zdXJlIHRoZSBwcm9wZXJ0eSBpcyBhbHdheXMgdXBkYXRlZFxuICAgICAgICBlbGVtZW50W3RoaXMuYXR0cl0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKGlzQXR0clJlbW92YWxWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGVudiwgZWxlbWVudCwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbjtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBvbmNsaWNrIGZ1bmN0aW9uIGV0YyBpbiBTU1JcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzQXR0clJlbW92YWxWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuY2xhc3MgU2FmZVByb3BlcnR5TWFuYWdlciBleHRlbmRzIFByb3BlcnR5TWFuYWdlciB7XG4gICAgc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZShlbnYsIGVsZW1lbnQsIHRoaXMuYXR0ciwgdmFsdWUpKTtcbiAgICB9XG4gICAgdXBkYXRlQXR0cmlidXRlKGVudiwgZWxlbWVudCwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlQXR0cmlidXRlKGVudiwgZWxlbWVudCwgc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZShlbnYsIGVsZW1lbnQsIHRoaXMuYXR0ciwgdmFsdWUpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1VzZXJJbnB1dFZhbHVlKHRhZ05hbWUsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiAodGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09PSAnVEVYVEFSRUEnKSAmJiBhdHRyaWJ1dGUgPT09ICd2YWx1ZSc7XG59XG5jbGFzcyBJbnB1dFZhbHVlUHJvcGVydHlNYW5hZ2VyIGV4dGVuZHMgQXR0cmlidXRlTWFuYWdlciB7XG4gICAgc2V0QXR0cmlidXRlKF9lbnYsIGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgICAgIGxldCBpbnB1dCA9IGVsZW1lbnQ7XG4gICAgICAgIGlucHV0LnZhbHVlID0gbm9ybWFsaXplVGV4dFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgdXBkYXRlQXR0cmlidXRlKF9lbnYsIGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgICAgIGxldCBpbnB1dCA9IGVsZW1lbnQ7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVRleHRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IG5vcm1hbGl6ZWRWYWx1ZSkge1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBub3JtYWxpemVkVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY29uc3QgSU5QVVRfVkFMVUVfUFJPUEVSVFlfTUFOQUdFUiA9IG5ldyBJbnB1dFZhbHVlUHJvcGVydHlNYW5hZ2VyKCd2YWx1ZScpO1xuZnVuY3Rpb24gaXNPcHRpb25TZWxlY3RlZCh0YWdOYW1lLCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ09QVElPTicgJiYgYXR0cmlidXRlID09PSAnc2VsZWN0ZWQnO1xufVxuY2xhc3MgT3B0aW9uU2VsZWN0ZWRNYW5hZ2VyIGV4dGVuZHMgUHJvcGVydHlNYW5hZ2VyIHtcbiAgICBzZXRBdHRyaWJ1dGUoX2VudiwgZWxlbWVudCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBsZXQgb3B0aW9uID0gZWxlbWVudDtcbiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQXR0cmlidXRlKF9lbnYsIGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgICAgIGxldCBvcHRpb24gPSBlbGVtZW50O1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBPUFRJT05fU0VMRUNURURfTUFOQUdFUiA9IG5ldyBPcHRpb25TZWxlY3RlZE1hbmFnZXIoJ3NlbGVjdGVkJyk7XG5jbGFzcyBTYWZlQXR0cmlidXRlTWFuYWdlciBleHRlbmRzIEF0dHJpYnV0ZU1hbmFnZXIge1xuICAgIHNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIHNhbml0aXplQXR0cmlidXRlVmFsdWUoZW52LCBlbGVtZW50LCB0aGlzLmF0dHIsIHZhbHVlKSk7XG4gICAgfVxuICAgIHVwZGF0ZUF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIHZhbHVlLCBfbmFtZXNwYWNlKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZUF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIHNhbml0aXplQXR0cmlidXRlVmFsdWUoZW52LCBlbGVtZW50LCB0aGlzLmF0dHIsIHZhbHVlKSk7XG4gICAgfVxufSJdfQ==