UNPKG

ember-legacy-class-transform

Version:
311 lines (305 loc) 37.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.InstanceMeta = exports.ClassMeta = exports.EMPTY_CACHE = undefined; exports.turbocharge = turbocharge; var _objectReference = require('@glimmer/object-reference'); var _util = require('@glimmer/util'); var _mixin = require('./mixin'); var _utils = require('./utils'); const { isArray } = Array; const EMPTY_CACHE = exports.EMPTY_CACHE = function EMPTY_CACHE() {}; const CLASS_META = "df8be4c8-4e89-44e2-a8f9-550c8dacdca7"; function turbocharge(obj) { // function Dummy() {} // Dummy.prototype = obj; return obj; } class SealedMeta extends _objectReference.Meta { addReferenceTypeFor(..._args) { throw new Error("Cannot modify reference types on a sealed meta"); } } class ClassMeta { constructor() { this.referenceTypes = (0, _util.dict)(); this.propertyMetadata = (0, _util.dict)(); this.concatenatedProperties = (0, _util.dict)(); this.hasConcatenatedProperties = false; this.mergedProperties = (0, _util.dict)(); this.hasMergedProperties = false; this.mixins = []; this.appliedMixins = []; this.staticMixins = []; this.subclasses = []; this.slots = []; this.InstanceMetaConstructor = null; } static fromParent(parent) { let meta = new this(); meta.reset(parent); return meta; } static for(object) { if (CLASS_META in object) return object[CLASS_META];else if (object.constructor) return object.constructor[CLASS_META] || null;else return null; } init(object, attrs) { if (typeof attrs !== 'object' || attrs === null) return; if (this.hasConcatenatedProperties) { let concatProps = this.concatenatedProperties; for (let prop in concatProps) { if (prop in attrs) { let concat = concatProps[prop].slice(); object[prop] = concat.concat(attrs[prop]); } } } if (this.hasMergedProperties) { let mergedProps = this.mergedProperties; for (let prop in mergedProps) { if (prop in attrs) { let merged = (0, _util.assign)({}, mergedProps[prop]); object[prop] = (0, _util.assign)(merged, attrs[prop]); } } } } addStaticMixin(mixin) { this.staticMixins.push(mixin); } addMixin(mixin) { this.mixins.push(mixin); } getStaticMixins() { return this.staticMixins; } getMixins() { return this.mixins; } addAppliedMixin(mixin) { this.appliedMixins.push(mixin); } hasAppliedMixin(mixin) { return this.appliedMixins.indexOf(mixin) !== -1; } getAppliedMixins() { return this.appliedMixins; } hasStaticMixin(mixin) { return this.staticMixins.indexOf(mixin) !== -1; } static applyAllMixins(Subclass, Parent) { Subclass[CLASS_META].getMixins().forEach(m => m.extendPrototypeOnto(Subclass, Parent)); Subclass[CLASS_META].getStaticMixins().forEach(m => m.extendStatic(Subclass)); Subclass[CLASS_META].seal(); } addSubclass(constructor) { this.subclasses.push(constructor); } getSubclasses() { return this.subclasses; } addPropertyMetadata(property, value) { this.propertyMetadata[property] = value; } metadataForProperty(property) { return this.propertyMetadata[property]; } addReferenceTypeFor(property, type) { this.referenceTypes[property] = type; } addSlotFor(property) { this.slots.push(property); } hasConcatenatedProperty(property) { if (!this.hasConcatenatedProperties) return false; return property in this.concatenatedProperties; } getConcatenatedProperty(property) { return this.concatenatedProperties[property]; } getConcatenatedProperties() { return Object.keys(this.concatenatedProperties); } addConcatenatedProperty(property, value) { this.hasConcatenatedProperties = true; if (property in this.concatenatedProperties) { let val = this.concatenatedProperties[property].concat(value); this.concatenatedProperties[property] = val; } else { this.concatenatedProperties[property] = value; } } hasMergedProperty(property) { if (!this.hasMergedProperties) return false; return property in this.mergedProperties; } getMergedProperty(property) { return this.mergedProperties[property]; } getMergedProperties() { return Object.keys(this.mergedProperties); } addMergedProperty(property, value) { this.hasMergedProperties = true; if (isArray(value)) { throw new Error(`You passed in \`${JSON.stringify(value)}\` as the value for \`foo\` but \`foo\` cannot be an Array`); } if (property in this.mergedProperties && this.mergedProperties[property] && value) { this.mergedProperties[property] = mergeMergedProperties(value, this.mergedProperties[property]); } else { value = value === null ? value : value || {}; this.mergedProperties[property] = value; } } getReferenceTypes() { return this.referenceTypes; } getPropertyMetadata() { return this.propertyMetadata; } reset(parent) { this.referenceTypes = (0, _util.dict)(); this.propertyMetadata = (0, _util.dict)(); this.concatenatedProperties = (0, _util.dict)(); this.mergedProperties = (0, _util.dict)(); if (parent) { this.hasConcatenatedProperties = parent.hasConcatenatedProperties; for (let prop in parent.concatenatedProperties) { this.concatenatedProperties[prop] = parent.concatenatedProperties[prop].slice(); } this.hasMergedProperties = parent.hasMergedProperties; for (let prop in parent.mergedProperties) { this.mergedProperties[prop] = (0, _util.assign)({}, parent.mergedProperties[prop]); } (0, _util.assign)(this.referenceTypes, parent.referenceTypes); (0, _util.assign)(this.propertyMetadata, parent.propertyMetadata); } } reseal(obj) { let meta = _objectReference.Meta.for(obj); let fresh = new this.InstanceMetaConstructor(obj, {}); let referenceTypes = meta.getReferenceTypes(); let slots = meta.getSlots(); turbocharge((0, _util.assign)(referenceTypes, this.referenceTypes)); turbocharge((0, _util.assign)(slots, fresh.getSlots())); } seal() { let referenceTypes = turbocharge((0, _util.assign)({}, this.referenceTypes)); turbocharge(this.concatenatedProperties); turbocharge(this.mergedProperties); if (!this.hasMergedProperties && !this.hasConcatenatedProperties) { this.init = function () {}; } let slots = this.slots; class Slots { constructor() { slots.forEach(name => { this[name] = EMPTY_CACHE; }); } } this.InstanceMetaConstructor = class extends SealedMeta { constructor() { super(...arguments); this.slots = new Slots(); this.referenceTypes = referenceTypes; } getReferenceTypes() { return this.referenceTypes; } referenceTypeFor(property) { return this.referenceTypes[property] || _objectReference.PropertyReference; } getSlots() { return this.slots; } }; turbocharge(this); } } exports.ClassMeta = ClassMeta; function mergeMergedProperties(attrs, parent) { let merged = (0, _util.assign)({}, parent); for (let prop in attrs) { if (prop in parent && typeof parent[prop] === 'function' && typeof attrs[prop] === 'function') { let wrapped = (0, _mixin.wrapMethod)(parent, prop, attrs[prop]); merged[prop] = wrapped; } else { merged[prop] = attrs[prop]; } } return merged; } class InstanceMeta extends ClassMeta { constructor() { super(...arguments); this["df8be4c8-4e89-44e2-a8f9-550c8dacdca7"] = ClassMeta.fromParent(null); } static fromParent(parent) { return super.fromParent(parent); } reset(parent) { super.reset(parent); if (parent) this[CLASS_META].reset(parent[CLASS_META]); } seal() { super.seal(); this[CLASS_META].seal(); } } exports.InstanceMeta = InstanceMeta; class GlimmerObject { constructor(attrs) { this._super = _utils.ROOT; this._meta = null; if (attrs) (0, _util.assign)(this, attrs); this.constructor[CLASS_META].init(this, attrs || null); this._super = _utils.ROOT; (0, _util.initializeGuid)(this); this.init(); } static extend(...extensions) { return (0, _mixin.extend)(this, ...extensions); } static create(attrs) { return new this(attrs); } static reopen(extensions) { (0, _mixin.toMixin)(extensions).extendPrototype(this); this[CLASS_META].seal(); (0, _mixin.relinkSubclasses)(this); } static reopenClass(extensions) { (0, _mixin.toMixin)(extensions).extendStatic(this); this[CLASS_META].seal(); } static metaForProperty(property) { let value = this[CLASS_META].metadataForProperty(property); if (!value) throw new Error(`metaForProperty() could not find a computed property with key '${property}'.`); return value; } static eachComputedProperty(callback) { let metadata = this[CLASS_META].getPropertyMetadata(); if (!metadata) return; for (let prop in metadata) { callback(prop, metadata[prop]); } } init() {} get(key) { return this[key]; } set(key, value) { this[key] = value; } setProperties(attrs) { (0, _util.assign)(this, attrs); } destroy() {} } exports.default = GlimmerObject; GlimmerObject["df8be4c8-4e89-44e2-a8f9-550c8dacdca7"] = InstanceMeta.fromParent(null); GlimmerObject.isClass = true; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9vYmplY3QuanMiXSwibmFtZXMiOlsidHVyYm9jaGFyZ2UiLCJpc0FycmF5IiwiQXJyYXkiLCJFTVBUWV9DQUNIRSIsIkNMQVNTX01FVEEiLCJvYmoiLCJTZWFsZWRNZXRhIiwiYWRkUmVmZXJlbmNlVHlwZUZvciIsIl9hcmdzIiwiRXJyb3IiLCJDbGFzc01ldGEiLCJjb25zdHJ1Y3RvciIsInJlZmVyZW5jZVR5cGVzIiwicHJvcGVydHlNZXRhZGF0YSIsImNvbmNhdGVuYXRlZFByb3BlcnRpZXMiLCJoYXNDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzIiwibWVyZ2VkUHJvcGVydGllcyIsImhhc01lcmdlZFByb3BlcnRpZXMiLCJtaXhpbnMiLCJhcHBsaWVkTWl4aW5zIiwic3RhdGljTWl4aW5zIiwic3ViY2xhc3NlcyIsInNsb3RzIiwiSW5zdGFuY2VNZXRhQ29uc3RydWN0b3IiLCJmcm9tUGFyZW50IiwicGFyZW50IiwibWV0YSIsInJlc2V0IiwiZm9yIiwib2JqZWN0IiwiaW5pdCIsImF0dHJzIiwiY29uY2F0UHJvcHMiLCJwcm9wIiwiY29uY2F0Iiwic2xpY2UiLCJtZXJnZWRQcm9wcyIsIm1lcmdlZCIsImFkZFN0YXRpY01peGluIiwibWl4aW4iLCJwdXNoIiwiYWRkTWl4aW4iLCJnZXRTdGF0aWNNaXhpbnMiLCJnZXRNaXhpbnMiLCJhZGRBcHBsaWVkTWl4aW4iLCJoYXNBcHBsaWVkTWl4aW4iLCJpbmRleE9mIiwiZ2V0QXBwbGllZE1peGlucyIsImhhc1N0YXRpY01peGluIiwiYXBwbHlBbGxNaXhpbnMiLCJTdWJjbGFzcyIsIlBhcmVudCIsImZvckVhY2giLCJtIiwiZXh0ZW5kUHJvdG90eXBlT250byIsImV4dGVuZFN0YXRpYyIsInNlYWwiLCJhZGRTdWJjbGFzcyIsImdldFN1YmNsYXNzZXMiLCJhZGRQcm9wZXJ0eU1ldGFkYXRhIiwicHJvcGVydHkiLCJ2YWx1ZSIsIm1ldGFkYXRhRm9yUHJvcGVydHkiLCJ0eXBlIiwiYWRkU2xvdEZvciIsImhhc0NvbmNhdGVuYXRlZFByb3BlcnR5IiwiZ2V0Q29uY2F0ZW5hdGVkUHJvcGVydHkiLCJnZXRDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzIiwiT2JqZWN0Iiwia2V5cyIsImFkZENvbmNhdGVuYXRlZFByb3BlcnR5IiwidmFsIiwiaGFzTWVyZ2VkUHJvcGVydHkiLCJnZXRNZXJnZWRQcm9wZXJ0eSIsImdldE1lcmdlZFByb3BlcnRpZXMiLCJhZGRNZXJnZWRQcm9wZXJ0eSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtZXJnZU1lcmdlZFByb3BlcnRpZXMiLCJnZXRSZWZlcmVuY2VUeXBlcyIsImdldFByb3BlcnR5TWV0YWRhdGEiLCJyZXNlYWwiLCJmcmVzaCIsImdldFNsb3RzIiwiU2xvdHMiLCJuYW1lIiwiYXJndW1lbnRzIiwicmVmZXJlbmNlVHlwZUZvciIsIndyYXBwZWQiLCJJbnN0YW5jZU1ldGEiLCJHbGltbWVyT2JqZWN0IiwiX3N1cGVyIiwiX21ldGEiLCJleHRlbmQiLCJleHRlbnNpb25zIiwiY3JlYXRlIiwicmVvcGVuIiwiZXh0ZW5kUHJvdG90eXBlIiwicmVvcGVuQ2xhc3MiLCJtZXRhRm9yUHJvcGVydHkiLCJlYWNoQ29tcHV0ZWRQcm9wZXJ0eSIsImNhbGxiYWNrIiwibWV0YWRhdGEiLCJnZXQiLCJrZXkiLCJzZXQiLCJzZXRQcm9wZXJ0aWVzIiwiZGVzdHJveSIsImlzQ2xhc3MiXSwibWFwcGluZ3MiOiI7Ozs7OztRQU9nQkEsVyxHQUFBQSxXOztBQVBoQjs7QUFDQTs7QUFDQTs7QUFFQTs7QUFEQSxNQUFNLEVBQUVDLE9BQUYsS0FBY0MsS0FBcEI7QUFFTyxNQUFNQyxvQ0FBYyxTQUFTQSxXQUFULEdBQXVCLENBQUUsQ0FBN0M7QUFDUCxNQUFNQyxhQUFhLHNDQUFuQjtBQUNPLFNBQVNKLFdBQVQsQ0FBcUJLLEdBQXJCLEVBQTBCO0FBQzdCO0FBQ0E7QUFDQSxXQUFPQSxHQUFQO0FBQ0g7QUFDRCxNQUFNQyxVQUFOLCtCQUE4QjtBQUMxQkMsd0JBQW9CLEdBQUdDLEtBQXZCLEVBQThC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QUNBLGFBQUtuRCxVQUFMLEVBQWlCb0QsSUFBakI7QUFDSDtBQUNELFdBQU8yQyxlQUFQLENBQXVCdkMsUUFBdkIsRUFBaUM7QUFDN0IsWUFBSUMsUUFBUSxLQUFLekQsVUFBTCxFQUFpQjBELG1CQUFqQixDQUFxQ0YsUUFBckMsQ0FBWjtBQUNBLFlBQUksQ0FBQ0MsS0FBTCxFQUFZLE1BQU0sSUFBSXBELEtBQUosQ0FBVyxrRUFBaUVtRCxRQUFTLElBQXJGLENBQU47QUFDWixlQUFPQyxLQUFQO0FBQ0g7QUFDRCxXQUFPdUMsb0JBQVAsQ0FBNEJDLFFBQTVCLEVBQXNDO0FBQ2xDLFlBQUlDLFdBQVcsS0FBS2xHLFVBQUwsRUFBaUI0RSxtQkFBakIsRUFBZjtBQUNBLFlBQUksQ0FBQ3NCLFFBQUwsRUFBZTtBQUNmLGFBQUssSUFBSXJFLElBQVQsSUFBaUJxRSxRQUFqQixFQUEyQjtBQUN2QkQscUJBQVNwRSxJQUFULEVBQWVxRSxTQUFTckUsSUFBVCxDQUFmO0FBQ0g7QUFDSjtBQUNESCxXQUFPLENBQUU7QUFDVHlFLFFBQUlDLEdBQUosRUFBUztBQUNMLGVBQU8sS0FBS0EsR0FBTCxDQUFQO0FBQ0g7QUFDREMsUUFBSUQsR0FBSixFQUFTM0MsS0FBVCxFQUFnQjtBQUNaLGFBQUsyQyxHQUFMLElBQVkzQyxLQUFaO0FBQ0g7QUFDRDZDLGtCQUFjM0UsS0FBZCxFQUFxQjtBQUNqQiwwQkFBTyxJQUFQLEVBQWFBLEtBQWI7QUFDSDtBQUNENEUsY0FBVSxDQUFFO0FBL0NtQjtrQkFBZGpCLGE7QUFpRHJCQSxjQUFjLHNDQUFkLElBQXdERCxhQUFhakUsVUFBYixDQUF3QixJQUF4QixDQUF4RDtBQUNBa0UsY0FBY2tCLE9BQWQsR0FBd0IsSUFBeEIiLCJmaWxlIjoibGliL29iamVjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1ldGEsIFByb3BlcnR5UmVmZXJlbmNlIH0gZnJvbSAnQGdsaW1tZXIvb2JqZWN0LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBkaWN0LCBhc3NpZ24sIGluaXRpYWxpemVHdWlkIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBleHRlbmQgYXMgZXh0ZW5kQ2xhc3MsIHRvTWl4aW4sIHJlbGlua1N1YmNsYXNzZXMsIHdyYXBNZXRob2QgfSBmcm9tICcuL21peGluJztcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5pbXBvcnQgeyBST09UIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgY29uc3QgRU1QVFlfQ0FDSEUgPSBmdW5jdGlvbiBFTVBUWV9DQUNIRSgpIHt9O1xuY29uc3QgQ0xBU1NfTUVUQSA9IFwiZGY4YmU0YzgtNGU4OS00NGUyLWE4ZjktNTUwYzhkYWNkY2E3XCI7XG5leHBvcnQgZnVuY3Rpb24gdHVyYm9jaGFyZ2Uob2JqKSB7XG4gICAgLy8gZnVuY3Rpb24gRHVtbXkoKSB7fVxuICAgIC8vIER1bW15LnByb3RvdHlwZSA9IG9iajtcbiAgICByZXR1cm4gb2JqO1xufVxuY2xhc3MgU2VhbGVkTWV0YSBleHRlbmRzIE1ldGEge1xuICAgIGFkZFJlZmVyZW5jZVR5cGVGb3IoLi4uX2FyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IG1vZGlmeSByZWZlcmVuY2UgdHlwZXMgb24gYSBzZWFsZWQgbWV0YVwiKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ2xhc3NNZXRhIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VUeXBlcyA9IGRpY3QoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU1ldGFkYXRhID0gZGljdCgpO1xuICAgICAgICB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1lcmdlZFByb3BlcnRpZXMgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1peGlucyA9IFtdO1xuICAgICAgICB0aGlzLmFwcGxpZWRNaXhpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGF0aWNNaXhpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zdWJjbGFzc2VzID0gW107XG4gICAgICAgIHRoaXMuc2xvdHMgPSBbXTtcbiAgICAgICAgdGhpcy5JbnN0YW5jZU1ldGFDb25zdHJ1Y3RvciA9IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tUGFyZW50KHBhcmVudCkge1xuICAgICAgICBsZXQgbWV0YSA9IG5ldyB0aGlzKCk7XG4gICAgICAgIG1ldGEucmVzZXQocGFyZW50KTtcbiAgICAgICAgcmV0dXJuIG1ldGE7XG4gICAgfVxuICAgIHN0YXRpYyBmb3Iob2JqZWN0KSB7XG4gICAgICAgIGlmIChDTEFTU19NRVRBIGluIG9iamVjdCkgcmV0dXJuIG9iamVjdFtDTEFTU19NRVRBXTtlbHNlIGlmIChvYmplY3QuY29uc3RydWN0b3IpIHJldHVybiBvYmplY3QuY29uc3RydWN0b3JbQ0xBU1NfTUVUQV0gfHwgbnVsbDtlbHNlIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpbml0KG9iamVjdCwgYXR0cnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhdHRycyAhPT0gJ29iamVjdCcgfHwgYXR0cnMgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcykge1xuICAgICAgICAgICAgbGV0IGNvbmNhdFByb3BzID0gdGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBjb25jYXRQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wIGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25jYXQgPSBjb25jYXRQcm9wc1twcm9wXS5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RbcHJvcF0gPSBjb25jYXQuY29uY2F0KGF0dHJzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcykge1xuICAgICAgICAgICAgbGV0IG1lcmdlZFByb3BzID0gdGhpcy5tZXJnZWRQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBtZXJnZWRQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wIGluIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXJnZWQgPSBhc3NpZ24oe30sIG1lcmdlZFByb3BzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BdID0gYXNzaWduKG1lcmdlZCwgYXR0cnNbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNNaXhpbihtaXhpbikge1xuICAgICAgICB0aGlzLnN0YXRpY01peGlucy5wdXNoKG1peGluKTtcbiAgICB9XG4gICAgYWRkTWl4aW4obWl4aW4pIHtcbiAgICAgICAgdGhpcy5taXhpbnMucHVzaChtaXhpbik7XG4gICAgfVxuICAgIGdldFN0YXRpY01peGlucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljTWl4aW5zO1xuICAgIH1cbiAgICBnZXRNaXhpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1peGlucztcbiAgICB9XG4gICAgYWRkQXBwbGllZE1peGluKG1peGluKSB7XG4gICAgICAgIHRoaXMuYXBwbGllZE1peGlucy5wdXNoKG1peGluKTtcbiAgICB9XG4gICAgaGFzQXBwbGllZE1peGluKG1peGluKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGxpZWRNaXhpbnMuaW5kZXhPZihtaXhpbikgIT09IC0xO1xuICAgIH1cbiAgICBnZXRBcHBsaWVkTWl4aW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBsaWVkTWl4aW5zO1xuICAgIH1cbiAgICBoYXNTdGF0aWNNaXhpbihtaXhpbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNNaXhpbnMuaW5kZXhPZihtaXhpbikgIT09IC0xO1xuICAgIH1cbiAgICBzdGF0aWMgYXBwbHlBbGxNaXhpbnMoU3ViY2xhc3MsIFBhcmVudCkge1xuICAgICAgICBTdWJjbGFzc1tDTEFTU19NRVRBXS5nZXRNaXhpbnMoKS5mb3JFYWNoKG0gPT4gbS5leHRlbmRQcm90b3R5cGVPbnRvKFN1YmNsYXNzLCBQYXJlbnQpKTtcbiAgICAgICAgU3ViY2xhc3NbQ0xBU1NfTUVUQV0uZ2V0U3RhdGljTWl4aW5zKCkuZm9yRWFjaChtID0+IG0uZXh0ZW5kU3RhdGljKFN1YmNsYXNzKSk7XG4gICAgICAgIFN1YmNsYXNzW0NMQVNTX01FVEFdLnNlYWwoKTtcbiAgICB9XG4gICAgYWRkU3ViY2xhc3MoY29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhpcy5zdWJjbGFzc2VzLnB1c2goY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICBnZXRTdWJjbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJjbGFzc2VzO1xuICAgIH1cbiAgICBhZGRQcm9wZXJ0eU1ldGFkYXRhKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnByb3BlcnR5TWV0YWRhdGFbcHJvcGVydHldID0gdmFsdWU7XG4gICAgfVxuICAgIG1ldGFkYXRhRm9yUHJvcGVydHkocHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlNZXRhZGF0YVtwcm9wZXJ0eV07XG4gICAgfVxuICAgIGFkZFJlZmVyZW5jZVR5cGVGb3IocHJvcGVydHksIHR5cGUpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VUeXBlc1twcm9wZXJ0eV0gPSB0eXBlO1xuICAgIH1cbiAgICBhZGRTbG90Rm9yKHByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMuc2xvdHMucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICAgIGhhc0NvbmNhdGVuYXRlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXM7XG4gICAgfVxuICAgIGdldENvbmNhdGVuYXRlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgIH1cbiAgICBnZXRDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgYWRkQ29uY2F0ZW5hdGVkUHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IHRydWU7XG4gICAgICAgIGlmIChwcm9wZXJ0eSBpbiB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcGVydHldLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcGVydHldID0gdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25jYXRlbmF0ZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc01lcmdlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNNZXJnZWRQcm9wZXJ0aWVzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzLm1lcmdlZFByb3BlcnRpZXM7XG4gICAgfVxuICAgIGdldE1lcmdlZFByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmdlZFByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgIH1cbiAgICBnZXRNZXJnZWRQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5tZXJnZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgYWRkTWVyZ2VkUHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcyA9IHRydWU7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgcGFzc2VkIGluIFxcYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfVxcYCBhcyB0aGUgdmFsdWUgZm9yIFxcYGZvb1xcYCBidXQgXFxgZm9vXFxgIGNhbm5vdCBiZSBhbiBBcnJheWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eSBpbiB0aGlzLm1lcmdlZFByb3BlcnRpZXMgJiYgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSA9IG1lcmdlTWVyZ2VkUHJvcGVydGllcyh2YWx1ZSwgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBudWxsID8gdmFsdWUgOiB2YWx1ZSB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMubWVyZ2VkUHJvcGVydGllc1twcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRSZWZlcmVuY2VUeXBlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlVHlwZXM7XG4gICAgfVxuICAgIGdldFByb3BlcnR5TWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5TWV0YWRhdGE7XG4gICAgfVxuICAgIHJlc2V0KHBhcmVudCkge1xuICAgICAgICB0aGlzLnJlZmVyZW5jZVR5cGVzID0gZGljdCgpO1xuICAgICAgICB0aGlzLnByb3BlcnR5TWV0YWRhdGEgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMuY29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IGRpY3QoKTtcbiAgICAgICAgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzID0gZGljdCgpO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmhhc0NvbmNhdGVuYXRlZFByb3BlcnRpZXMgPSBwYXJlbnQuaGFzQ29uY2F0ZW5hdGVkUHJvcGVydGllcztcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gcGFyZW50LmNvbmNhdGVuYXRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXNbcHJvcF0gPSBwYXJlbnQuY29uY2F0ZW5hdGVkUHJvcGVydGllc1twcm9wXS5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYXNNZXJnZWRQcm9wZXJ0aWVzID0gcGFyZW50Lmhhc01lcmdlZFByb3BlcnRpZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBhcmVudC5tZXJnZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXJnZWRQcm9wZXJ0aWVzW3Byb3BdID0gYXNzaWduKHt9LCBwYXJlbnQubWVyZ2VkUHJvcGVydGllc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NpZ24odGhpcy5yZWZlcmVuY2VUeXBlcywgcGFyZW50LnJlZmVyZW5jZVR5cGVzKTtcbiAgICAgICAgICAgIGFzc2lnbih0aGlzLnByb3BlcnR5TWV0YWRhdGEsIHBhcmVudC5wcm9wZXJ0eU1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXNlYWwob2JqKSB7XG4gICAgICAgIGxldCBtZXRhID0gTWV0YS5mb3Iob2JqKTtcbiAgICAgICAgbGV0IGZyZXNoID0gbmV3IHRoaXMuSW5zdGFuY2VNZXRhQ29uc3RydWN0b3Iob2JqLCB7fSk7XG4gICAgICAgIGxldCByZWZlcmVuY2VUeXBlcyA9IG1ldGEuZ2V0UmVmZXJlbmNlVHlwZXMoKTtcbiAgICAgICAgbGV0IHNsb3RzID0gbWV0YS5nZXRTbG90cygpO1xuICAgICAgICB0dXJib2NoYXJnZShhc3NpZ24ocmVmZXJlbmNlVHlwZXMsIHRoaXMucmVmZXJlbmNlVHlwZXMpKTtcbiAgICAgICAgdHVyYm9jaGFyZ2UoYXNzaWduKHNsb3RzLCBmcmVzaC5nZXRTbG90cygpKSk7XG4gICAgfVxuICAgIHNlYWwoKSB7XG4gICAgICAgIGxldCByZWZlcmVuY2VUeXBlcyA9IHR1cmJvY2hhcmdlKGFzc2lnbih7fSwgdGhpcy5yZWZlcmVuY2VUeXBlcykpO1xuICAgICAgICB0dXJib2NoYXJnZSh0aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMpO1xuICAgICAgICB0dXJib2NoYXJnZSh0aGlzLm1lcmdlZFByb3BlcnRpZXMpO1xuICAgICAgICBpZiAoIXRoaXMuaGFzTWVyZ2VkUHJvcGVydGllcyAmJiAhdGhpcy5oYXNDb25jYXRlbmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLmluaXQgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2xvdHMgPSB0aGlzLnNsb3RzO1xuICAgICAgICBjbGFzcyBTbG90cyB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICBzbG90cy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW25hbWVdID0gRU1QVFlfQ0FDSEU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5JbnN0YW5jZU1ldGFDb25zdHJ1Y3RvciA9IGNsYXNzIGV4dGVuZHMgU2VhbGVkTWV0YSB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2xvdHMgPSBuZXcgU2xvdHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVR5cGVzID0gcmVmZXJlbmNlVHlwZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRSZWZlcmVuY2VUeXBlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VUeXBlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZmVyZW5jZVR5cGVGb3IocHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VUeXBlc1twcm9wZXJ0eV0gfHwgUHJvcGVydHlSZWZlcmVuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRTbG90cygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zbG90cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdHVyYm9jaGFyZ2UodGhpcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VNZXJnZWRQcm9wZXJ0aWVzKGF0dHJzLCBwYXJlbnQpIHtcbiAgICBsZXQgbWVyZ2VkID0gYXNzaWduKHt9LCBwYXJlbnQpO1xuICAgIGZvciAobGV0IHByb3AgaW4gYXR0cnMpIHtcbiAgICAgICAgaWYgKHByb3AgaW4gcGFyZW50ICYmIHR5cGVvZiBwYXJlbnRbcHJvcF0gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGF0dHJzW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZCA9IHdyYXBNZXRob2QocGFyZW50LCBwcm9wLCBhdHRyc1twcm9wXSk7XG4gICAgICAgICAgICBtZXJnZWRbcHJvcF0gPSB3cmFwcGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVyZ2VkW3Byb3BdID0gYXR0cnNbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cbmV4cG9ydCBjbGFzcyBJbnN0YW5jZU1ldGEgZXh0ZW5kcyBDbGFzc01ldGEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzW1wiZGY4YmU0YzgtNGU4OS00NGUyLWE4ZjktNTUwYzhkYWNkY2E3XCJdID0gQ2xhc3NNZXRhLmZyb21QYXJlbnQobnVsbCk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tUGFyZW50KHBhcmVudCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZnJvbVBhcmVudChwYXJlbnQpO1xuICAgIH1cbiAgICByZXNldChwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIucmVzZXQocGFyZW50KTtcbiAgICAgICAgaWYgKHBhcmVudCkgdGhpc1tDTEFTU19NRVRBXS5yZXNldChwYXJlbnRbQ0xBU1NfTUVUQV0pO1xuICAgIH1cbiAgICBzZWFsKCkge1xuICAgICAgICBzdXBlci5zZWFsKCk7XG4gICAgICAgIHRoaXNbQ0xBU1NfTUVUQV0uc2VhbCgpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdsaW1tZXJPYmplY3Qge1xuICAgIGNvbnN0cnVjdG9yKGF0dHJzKSB7XG4gICAgICAgIHRoaXMuX3N1cGVyID0gUk9PVDtcbiAgICAgICAgdGhpcy5fbWV0YSA9IG51bGw7XG4gICAgICAgIGlmIChhdHRycykgYXNzaWduKHRoaXMsIGF0dHJzKTtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvcltDTEFTU19NRVRBXS5pbml0KHRoaXMsIGF0dHJzIHx8IG51bGwpO1xuICAgICAgICB0aGlzLl9zdXBlciA9IFJPT1Q7XG4gICAgICAgIGluaXRpYWxpemVHdWlkKHRoaXMpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gICAgc3RhdGljIGV4dGVuZCguLi5leHRlbnNpb25zKSB7XG4gICAgICAgIHJldHVybiBleHRlbmRDbGFzcyh0aGlzLCAuLi5leHRlbnNpb25zKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhdHRycykge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoYXR0cnMpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVvcGVuKGV4dGVuc2lvbnMpIHtcbiAgICAgICAgdG9NaXhpbihleHRlbnNpb25zKS5leHRlbmRQcm90b3R5cGUodGhpcyk7XG4gICAgICAgIHRoaXNbQ0xBU1NfTUVUQV0uc2VhbCgpO1xuICAgICAgICByZWxpbmtTdWJjbGFzc2VzKHRoaXMpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVvcGVuQ2xhc3MoZXh0ZW5zaW9ucykge1xuICAgICAgICB0b01peGluKGV4dGVuc2lvbnMpLmV4dGVuZFN0YXRpYyh0aGlzKTtcbiAgICAgICAgdGhpc1tDTEFTU19NRVRBXS5zZWFsKCk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXRhRm9yUHJvcGVydHkocHJvcGVydHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpc1tDTEFTU19NRVRBXS5tZXRhZGF0YUZvclByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgdGhyb3cgbmV3IEVycm9yKGBtZXRhRm9yUHJvcGVydHkoKSBjb3VsZCBub3QgZmluZCBhIGNvbXB1dGVkIHByb3BlcnR5IHdpdGgga2V5ICcke3Byb3BlcnR5fScuYCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc3RhdGljIGVhY2hDb21wdXRlZFByb3BlcnR5KGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBtZXRhZGF0YSA9IHRoaXNbQ0xBU1NfTUVUQV0uZ2V0UHJvcGVydHlNZXRhZGF0YSgpO1xuICAgICAgICBpZiAoIW1ldGFkYXRhKSByZXR1cm47XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gbWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHByb3AsIG1ldGFkYXRhW3Byb3BdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0KCkge31cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzW2tleV07XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBzZXRQcm9wZXJ0aWVzKGF0dHJzKSB7XG4gICAgICAgIGFzc2lnbih0aGlzLCBhdHRycyk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7fVxufVxuR2xpbW1lck9iamVjdFtcImRmOGJlNGM4LTRlODktNDRlMi1hOGY5LTU1MGM4ZGFjZGNhN1wiXSA9IEluc3RhbmNlTWV0YS5mcm9tUGFyZW50KG51bGwpO1xuR2xpbW1lck9iamVjdC5pc0NsYXNzID0gdHJ1ZTsiXX0=