dist/ember-template-compiler.js in ember-source-2.9.0.beta.1 vs dist/ember-template-compiler.js in ember-source-2.9.0.beta.2

- old
+ new

@@ -4,11 +4,11 @@ * @copyright Copyright 2011-2016 Tilde Inc. and contributors * Portions Copyright 2006-2011 Strobe Inc. * Portions Copyright 2008-2011 Apple Inc. All rights reserved. * @license Licensed under MIT license * See https://raw.github.com/emberjs/ember.js/master/LICENSE - * @version 2.9.0-beta.1 + * @version 2.9.0-beta.2 */ var enifed, requireModule, require, Ember; var mainContext = this; @@ -1198,1368 +1198,10 @@ exports['default'] = Backburner; Object.defineProperty(exports, '__esModule', { value: true }); }); -enifed('container/container', ['exports', 'ember-environment', 'ember-metal', 'container/owner'], function (exports, _emberEnvironment, _emberMetal, _containerOwner) { - 'use strict'; - - exports.default = Container; - exports.buildFakeContainerWithDeprecations = buildFakeContainerWithDeprecations; - - var CONTAINER_OVERRIDE = _emberMetal.symbol('CONTAINER_OVERRIDE'); - - /** - A container used to instantiate and cache objects. - - Every `Container` must be associated with a `Registry`, which is referenced - to determine the factory and options that should be used to instantiate - objects. - - The public API for `Container` is still in flux and should not be considered - stable. - - @private - @class Container - */ - - function Container(registry, options) { - this.registry = registry; - this.owner = options && options.owner ? options.owner : null; - this.cache = _emberMetal.dictionary(options && options.cache ? options.cache : null); - this.factoryCache = _emberMetal.dictionary(options && options.factoryCache ? options.factoryCache : null); - this.validationCache = _emberMetal.dictionary(options && options.validationCache ? options.validationCache : null); - this._fakeContainerToInject = buildFakeContainerWithDeprecations(this); - this[CONTAINER_OVERRIDE] = undefined; - this.isDestroyed = false; - } - - Container.prototype = { - /** - @private - @property owner - @type Object - */ - owner: null, - - /** - @private - @property registry - @type Registry - @since 1.11.0 - */ - registry: null, - - /** - @private - @property cache - @type InheritingDict - */ - cache: null, - - /** - @private - @property factoryCache - @type InheritingDict - */ - factoryCache: null, - - /** - @private - @property validationCache - @type InheritingDict - */ - validationCache: null, - - /** - Given a fullName return a corresponding instance. - The default behaviour is for lookup to return a singleton instance. - The singleton is scoped to the container, allowing multiple containers - to all have their own locally scoped singletons. - ```javascript - let registry = new Registry(); - let container = registry.container(); - registry.register('api:twitter', Twitter); - let twitter = container.lookup('api:twitter'); - twitter instanceof Twitter; // => true - // by default the container will return singletons - let twitter2 = container.lookup('api:twitter'); - twitter2 instanceof Twitter; // => true - twitter === twitter2; //=> true - ``` - If singletons are not wanted, an optional flag can be provided at lookup. - ```javascript - let registry = new Registry(); - let container = registry.container(); - registry.register('api:twitter', Twitter); - let twitter = container.lookup('api:twitter', { singleton: false }); - let twitter2 = container.lookup('api:twitter', { singleton: false }); - twitter === twitter2; //=> false - ``` - @private - @method lookup - @param {String} fullName - @param {Object} [options] - @param {String} [options.source] The fullname of the request source (used for local lookup) - @return {any} - */ - lookup: function (fullName, options) { - _emberMetal.assert('fullName must be a proper full name', this.registry.validateFullName(fullName)); - return lookup(this, this.registry.normalize(fullName), options); - }, - - /** - Given a fullName, return the corresponding factory. - @private - @method lookupFactory - @param {String} fullName - @param {Object} [options] - @param {String} [options.source] The fullname of the request source (used for local lookup) - @return {any} - */ - lookupFactory: function (fullName, options) { - _emberMetal.assert('fullName must be a proper full name', this.registry.validateFullName(fullName)); - return factoryFor(this, this.registry.normalize(fullName), options); - }, - - /** - A depth first traversal, destroying the container, its descendant containers and all - their managed objects. - @private - @method destroy - */ - destroy: function () { - eachDestroyable(this, function (item) { - if (item.destroy) { - item.destroy(); - } - }); - - this.isDestroyed = true; - }, - - /** - Clear either the entire cache or just the cache for a particular key. - @private - @method reset - @param {String} fullName optional key to reset; if missing, resets everything - */ - reset: function (fullName) { - if (arguments.length > 0) { - resetMember(this, this.registry.normalize(fullName)); - } else { - resetCache(this); - } - }, - - /** - Returns an object that can be used to provide an owner to a - manually created instance. - @private - @method ownerInjection - @returns { Object } - */ - ownerInjection: function () { - var _ref; - - return _ref = {}, _ref[_containerOwner.OWNER] = this.owner, _ref; - } - }; - - function isSingleton(container, fullName) { - return container.registry.getOption(fullName, 'singleton') !== false; - } - - function lookup(container, fullName) { - var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - - if (options.source) { - fullName = container.registry.expandLocalLookup(fullName, options); - - // if expandLocalLookup returns falsey, we do not support local lookup - if (!fullName) { - return; - } - } - - if (container.cache[fullName] !== undefined && options.singleton !== false) { - return container.cache[fullName]; - } - - var value = instantiate(container, fullName); - - if (value === undefined) { - return; - } - - if (isSingleton(container, fullName) && options.singleton !== false) { - container.cache[fullName] = value; - } - - return value; - } - - function markInjectionsAsDynamic(injections) { - injections._dynamic = true; - } - - function areInjectionsDynamic(injections) { - return !!injections._dynamic; - } - - function buildInjections() /* container, ...injections */{ - var hash = {}; - - if (arguments.length > 1) { - var container = arguments[0]; - var injections = []; - var injection = undefined; - - for (var i = 1; i < arguments.length; i++) { - if (arguments[i]) { - injections = injections.concat(arguments[i]); - } - } - - container.registry.validateInjections(injections); - - for (var i = 0; i < injections.length; i++) { - injection = injections[i]; - hash[injection.property] = lookup(container, injection.fullName); - if (!isSingleton(container, injection.fullName)) { - markInjectionsAsDynamic(hash); - } - } - } - - return hash; - } - - function factoryFor(container, fullName) { - var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - - var registry = container.registry; - - if (options.source) { - fullName = registry.expandLocalLookup(fullName, options); - - // if expandLocalLookup returns falsey, we do not support local lookup - if (!fullName) { - return; - } - } - - var cache = container.factoryCache; - if (cache[fullName]) { - return cache[fullName]; - } - var factory = registry.resolve(fullName); - if (factory === undefined) { - return; - } - - var type = fullName.split(':')[0]; - if (!factory || typeof factory.extend !== 'function' || !_emberEnvironment.ENV.MODEL_FACTORY_INJECTIONS && type === 'model') { - if (factory && typeof factory._onLookup === 'function') { - factory._onLookup(fullName); - } - - // TODO: think about a 'safe' merge style extension - // for now just fallback to create time injection - cache[fullName] = factory; - return factory; - } else { - var injections = injectionsFor(container, fullName); - var factoryInjections = factoryInjectionsFor(container, fullName); - var cacheable = !areInjectionsDynamic(injections) && !areInjectionsDynamic(factoryInjections); - - factoryInjections._toString = registry.makeToString(factory, fullName); - - var injectedFactory = factory.extend(injections); - - // TODO - remove all `container` injections when Ember reaches v3.0.0 - injectDeprecatedContainer(injectedFactory.prototype, container); - injectedFactory.reopenClass(factoryInjections); - - if (factory && typeof factory._onLookup === 'function') { - factory._onLookup(fullName); - } - - if (cacheable) { - cache[fullName] = injectedFactory; - } - - return injectedFactory; - } - } - - function injectionsFor(container, fullName) { - var registry = container.registry; - var splitName = fullName.split(':'); - var type = splitName[0]; - - var injections = buildInjections(container, registry.getTypeInjections(type), registry.getInjections(fullName)); - injections._debugContainerKey = fullName; - - _containerOwner.setOwner(injections, container.owner); - - return injections; - } - - function factoryInjectionsFor(container, fullName) { - var registry = container.registry; - var splitName = fullName.split(':'); - var type = splitName[0]; - - var factoryInjections = buildInjections(container, registry.getFactoryTypeInjections(type), registry.getFactoryInjections(fullName)); - factoryInjections._debugContainerKey = fullName; - - return factoryInjections; - } - - function instantiate(container, fullName) { - var factory = factoryFor(container, fullName); - var lazyInjections = undefined, - validationCache = undefined; - - if (container.registry.getOption(fullName, 'instantiate') === false) { - return factory; - } - - if (factory) { - if (typeof factory.create !== 'function') { - throw new Error('Failed to create an instance of \'' + fullName + '\'. Most likely an improperly defined class or' + ' an invalid module export.'); - } - - validationCache = container.validationCache; - - _emberMetal.runInDebug(function () { - // Ensure that all lazy injections are valid at instantiation time - if (!validationCache[fullName] && typeof factory._lazyInjections === 'function') { - lazyInjections = factory._lazyInjections(); - lazyInjections = container.registry.normalizeInjectionsHash(lazyInjections); - - container.registry.validateInjections(lazyInjections); - } - }); - - validationCache[fullName] = true; - - var obj = undefined; - - if (typeof factory.extend === 'function') { - // assume the factory was extendable and is already injected - obj = factory.create(); - } else { - // assume the factory was extendable - // to create time injections - // TODO: support new'ing for instantiation and merge injections for pure JS Functions - var injections = injectionsFor(container, fullName); - - // Ensure that a container is available to an object during instantiation. - // TODO - remove when Ember reaches v3.0.0 - // This "fake" container will be replaced after instantiation with a - // property that raises deprecations every time it is accessed. - injections.container = container._fakeContainerToInject; - obj = factory.create(injections); - - // TODO - remove when Ember reaches v3.0.0 - if (!Object.isFrozen(obj) && 'container' in obj) { - injectDeprecatedContainer(obj, container); - } - } - - return obj; - } - } - - // TODO - remove when Ember reaches v3.0.0 - function injectDeprecatedContainer(object, container) { - Object.defineProperty(object, 'container', { - configurable: true, - enumerable: false, - get: function () { - _emberMetal.deprecate('Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.', false, { id: 'ember-application.injected-container', until: '3.0.0', url: 'http://emberjs.com/deprecations/v2.x#toc_injected-container-access' }); - return this[CONTAINER_OVERRIDE] || container; - }, - - set: function (value) { - _emberMetal.deprecate('Providing the `container` property to ' + this + ' is deprecated. Please use `Ember.setOwner` or `owner.ownerInjection()` instead to provide an owner to the instance being created.', false, { id: 'ember-application.injected-container', until: '3.0.0', url: 'http://emberjs.com/deprecations/v2.x#toc_injected-container-access' }); - - this[CONTAINER_OVERRIDE] = value; - - return value; - } - }); - } - - function eachDestroyable(container, callback) { - var cache = container.cache; - var keys = Object.keys(cache); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var value = cache[key]; - - if (container.registry.getOption(key, 'instantiate') !== false) { - callback(value); - } - } - } - - function resetCache(container) { - eachDestroyable(container, function (value) { - if (value.destroy) { - value.destroy(); - } - }); - - container.cache.dict = _emberMetal.dictionary(null); - } - - function resetMember(container, fullName) { - var member = container.cache[fullName]; - - delete container.factoryCache[fullName]; - - if (member) { - delete container.cache[fullName]; - - if (member.destroy) { - member.destroy(); - } - } - } - - function buildFakeContainerWithDeprecations(container) { - var fakeContainer = {}; - var propertyMappings = { - lookup: 'lookup', - lookupFactory: '_lookupFactory' - }; - - for (var containerProperty in propertyMappings) { - fakeContainer[containerProperty] = buildFakeContainerFunction(container, containerProperty, propertyMappings[containerProperty]); - } - - return fakeContainer; - } - - function buildFakeContainerFunction(container, containerProperty, ownerProperty) { - return function () { - _emberMetal.deprecate('Using the injected `container` is deprecated. Please use the `getOwner` helper to access the owner of this object and then call `' + ownerProperty + '` instead.', false, { - id: 'ember-application.injected-container', - until: '3.0.0', - url: 'http://emberjs.com/deprecations/v2.x#toc_injected-container-access' - }); - return container[containerProperty].apply(container, arguments); - }; - } -}); -enifed('container/index', ['exports', 'container/registry', 'container/container', 'container/owner'], function (exports, _containerRegistry, _containerContainer, _containerOwner) { - /* - Public API for the container is still in flux. - The public API, specified on the application namespace should be considered the stable API. - // @module container - @private - */ - - 'use strict'; - - exports.Registry = _containerRegistry.default; - exports.privatize = _containerRegistry.privatize; - exports.Container = _containerContainer.default; - exports.buildFakeContainerWithDeprecations = _containerContainer.buildFakeContainerWithDeprecations; - exports.OWNER = _containerOwner.OWNER; - exports.getOwner = _containerOwner.getOwner; - exports.setOwner = _containerOwner.setOwner; -}); -enifed('container/owner', ['exports', 'ember-metal'], function (exports, _emberMetal) { - /** - @module ember - @submodule ember-runtime - */ - - 'use strict'; - - exports.getOwner = getOwner; - exports.setOwner = setOwner; - var OWNER = _emberMetal.symbol('OWNER'); - - exports.OWNER = OWNER; - /** - Framework objects in an Ember application (components, services, routes, etc.) - are created via a factory and dependency injection system. Each of these - objects is the responsibility of an "owner", which handled its - instantiation and manages its lifetime. - - `getOwner` fetches the owner object responsible for an instance. This can - be used to lookup or resolve other class instances, or register new factories - into the owner. - - For example, this component dynamically looks up a service based on the - `audioType` passed as an attribute: - - ``` - // app/components/play-audio.js - import Ember from 'ember'; - - // Usage: - // - // {{play-audio audioType=model.audioType audioFile=model.file}} - // - export default Ember.Component.extend({ - audioService: Ember.computed('audioType', function() { - let owner = Ember.getOwner(this); - return owner.lookup(`service:${this.get('audioType')}`); - }), - click() { - let player = this.get('audioService'); - player.play(this.get('audioFile')); - } - }); - ``` - - @method getOwner - @for Ember - @param {Object} object An object with an owner. - @return {Object} An owner object. - @since 2.3.0 - @public - */ - - function getOwner(object) { - return object[OWNER]; - } - - /** - `setOwner` forces a new owner on a given object instance. This is primarily - useful in some testing cases. - - @method setOwner - @for Ember - @param {Object} object An object with an owner. - @return {Object} An owner object. - @since 2.3.0 - @public - */ - - function setOwner(object, owner) { - object[OWNER] = owner; - } -}); -enifed('container/registry', ['exports', 'ember-metal', 'container/container'], function (exports, _emberMetal, _containerContainer) { - 'use strict'; - - exports.default = Registry; - exports.privatize = privatize; - - var VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+$/; - - /** - A registry used to store factory and option information keyed - by type. - - A `Registry` stores the factory and option information needed by a - `Container` to instantiate and cache objects. - - The API for `Registry` is still in flux and should not be considered stable. - - @private - @class Registry - @since 1.11.0 - */ - - function Registry(options) { - this.fallback = options && options.fallback ? options.fallback : null; - - if (options && options.resolver) { - this.resolver = options.resolver; - - if (typeof this.resolver === 'function') { - deprecateResolverFunction(this); - } - } - - this.registrations = _emberMetal.dictionary(options && options.registrations ? options.registrations : null); - - this._typeInjections = _emberMetal.dictionary(null); - this._injections = _emberMetal.dictionary(null); - this._factoryTypeInjections = _emberMetal.dictionary(null); - this._factoryInjections = _emberMetal.dictionary(null); - - this._localLookupCache = new _emberMetal.EmptyObject(); - this._normalizeCache = _emberMetal.dictionary(null); - this._resolveCache = _emberMetal.dictionary(null); - this._failCache = _emberMetal.dictionary(null); - - this._options = _emberMetal.dictionary(null); - this._typeOptions = _emberMetal.dictionary(null); - } - - Registry.prototype = { - /** - A backup registry for resolving registrations when no matches can be found. - @private - @property fallback - @type Registry - */ - fallback: null, - - /** - An object that has a `resolve` method that resolves a name. - @private - @property resolver - @type Resolver - */ - resolver: null, - - /** - @private - @property registrations - @type InheritingDict - */ - registrations: null, - - /** - @private - @property _typeInjections - @type InheritingDict - */ - _typeInjections: null, - - /** - @private - @property _injections - @type InheritingDict - */ - _injections: null, - - /** - @private - @property _factoryTypeInjections - @type InheritingDict - */ - _factoryTypeInjections: null, - - /** - @private - @property _factoryInjections - @type InheritingDict - */ - _factoryInjections: null, - - /** - @private - @property _normalizeCache - @type InheritingDict - */ - _normalizeCache: null, - - /** - @private - @property _resolveCache - @type InheritingDict - */ - _resolveCache: null, - - /** - @private - @property _options - @type InheritingDict - */ - _options: null, - - /** - @private - @property _typeOptions - @type InheritingDict - */ - _typeOptions: null, - - /** - Creates a container based on this registry. - @private - @method container - @param {Object} options - @return {Container} created container - */ - container: function (options) { - return new _containerContainer.default(this, options); - }, - - /** - Registers a factory for later injection. - Example: - ```javascript - let registry = new Registry(); - registry.register('model:user', Person, {singleton: false }); - registry.register('fruit:favorite', Orange); - registry.register('communication:main', Email, {singleton: false}); - ``` - @private - @method register - @param {String} fullName - @param {Function} factory - @param {Object} options - */ - register: function (fullName, factory) { - var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - - _emberMetal.assert('fullName must be a proper full name', this.validateFullName(fullName)); - - if (factory === undefined) { - throw new TypeError('Attempting to register an unknown factory: \'' + fullName + '\''); - } - - var normalizedName = this.normalize(fullName); - - if (this._resolveCache[normalizedName]) { - throw new Error('Cannot re-register: \'' + fullName + '\', as it has already been resolved.'); - } - - delete this._failCache[normalizedName]; - this.registrations[normalizedName] = factory; - this._options[normalizedName] = options; - }, - - /** - Unregister a fullName - ```javascript - let registry = new Registry(); - registry.register('model:user', User); - registry.resolve('model:user').create() instanceof User //=> true - registry.unregister('model:user') - registry.resolve('model:user') === undefined //=> true - ``` - @private - @method unregister - @param {String} fullName - */ - unregister: function (fullName) { - _emberMetal.assert('fullName must be a proper full name', this.validateFullName(fullName)); - - var normalizedName = this.normalize(fullName); - - this._localLookupCache = new _emberMetal.EmptyObject(); - - delete this.registrations[normalizedName]; - delete this._resolveCache[normalizedName]; - delete this._failCache[normalizedName]; - delete this._options[normalizedName]; - }, - - /** - Given a fullName return the corresponding factory. - By default `resolve` will retrieve the factory from - the registry. - ```javascript - let registry = new Registry(); - registry.register('api:twitter', Twitter); - registry.resolve('api:twitter') // => Twitter - ``` - Optionally the registry can be provided with a custom resolver. - If provided, `resolve` will first provide the custom resolver - the opportunity to resolve the fullName, otherwise it will fallback - to the registry. - ```javascript - let registry = new Registry(); - registry.resolver = function(fullName) { - // lookup via the module system of choice - }; - // the twitter factory is added to the module system - registry.resolve('api:twitter') // => Twitter - ``` - @private - @method resolve - @param {String} fullName - @param {Object} [options] - @param {String} [options.source] the fullname of the request source (used for local lookups) - @return {Function} fullName's factory - */ - resolve: function (fullName, options) { - _emberMetal.assert('fullName must be a proper full name', this.validateFullName(fullName)); - var factory = resolve(this, this.normalize(fullName), options); - if (factory === undefined && this.fallback) { - var _fallback; - - factory = (_fallback = this.fallback).resolve.apply(_fallback, arguments); - } - return factory; - }, - - /** - A hook that can be used to describe how the resolver will - attempt to find the factory. - For example, the default Ember `.describe` returns the full - class name (including namespace) where Ember's resolver expects - to find the `fullName`. - @private - @method describe - @param {String} fullName - @return {string} described fullName - */ - describe: function (fullName) { - if (this.resolver && this.resolver.lookupDescription) { - return this.resolver.lookupDescription(fullName); - } else if (this.fallback) { - return this.fallback.describe(fullName); - } else { - return fullName; - } - }, - - /** - A hook to enable custom fullName normalization behaviour - @private - @method normalizeFullName - @param {String} fullName - @return {string} normalized fullName - */ - normalizeFullName: function (fullName) { - if (this.resolver && this.resolver.normalize) { - return this.resolver.normalize(fullName); - } else if (this.fallback) { - return this.fallback.normalizeFullName(fullName); - } else { - return fullName; - } - }, - - /** - Normalize a fullName based on the application's conventions - @private - @method normalize - @param {String} fullName - @return {string} normalized fullName - */ - normalize: function (fullName) { - return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this.normalizeFullName(fullName)); - }, - - /** - @method makeToString - @private - @param {any} factory - @param {string} fullName - @return {function} toString function - */ - makeToString: function (factory, fullName) { - if (this.resolver && this.resolver.makeToString) { - return this.resolver.makeToString(factory, fullName); - } else if (this.fallback) { - return this.fallback.makeToString(factory, fullName); - } else { - return factory.toString(); - } - }, - - /** - Given a fullName check if the container is aware of its factory - or singleton instance. - @private - @method has - @param {String} fullName - @param {Object} [options] - @param {String} [options.source] the fullname of the request source (used for local lookups) - @return {Boolean} - */ - has: function (fullName, options) { - if (!this.isValidFullName(fullName)) { - return false; - } - - var source = options && options.source && this.normalize(options.source); - - return has(this, this.normalize(fullName), source); - }, - - /** - Allow registering options for all factories of a type. - ```javascript - let registry = new Registry(); - let container = registry.container(); - // if all of type `connection` must not be singletons - registry.optionsForType('connection', { singleton: false }); - registry.register('connection:twitter', TwitterConnection); - registry.register('connection:facebook', FacebookConnection); - let twitter = container.lookup('connection:twitter'); - let twitter2 = container.lookup('connection:twitter'); - twitter === twitter2; // => false - let facebook = container.lookup('connection:facebook'); - let facebook2 = container.lookup('connection:facebook'); - facebook === facebook2; // => false - ``` - @private - @method optionsForType - @param {String} type - @param {Object} options - */ - optionsForType: function (type, options) { - this._typeOptions[type] = options; - }, - - getOptionsForType: function (type) { - var optionsForType = this._typeOptions[type]; - if (optionsForType === undefined && this.fallback) { - optionsForType = this.fallback.getOptionsForType(type); - } - return optionsForType; - }, - - /** - @private - @method options - @param {String} fullName - @param {Object} options - */ - options: function (fullName) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - var normalizedName = this.normalize(fullName); - this._options[normalizedName] = options; - }, - - getOptions: function (fullName) { - var normalizedName = this.normalize(fullName); - var options = this._options[normalizedName]; - - if (options === undefined && this.fallback) { - options = this.fallback.getOptions(fullName); - } - return options; - }, - - getOption: function (fullName, optionName) { - var options = this._options[fullName]; - - if (options && options[optionName] !== undefined) { - return options[optionName]; - } - - var type = fullName.split(':')[0]; - options = this._typeOptions[type]; - - if (options && options[optionName] !== undefined) { - return options[optionName]; - } else if (this.fallback) { - return this.fallback.getOption(fullName, optionName); - } - }, - - /** - Used only via `injection`. - Provides a specialized form of injection, specifically enabling - all objects of one type to be injected with a reference to another - object. - For example, provided each object of type `controller` needed a `router`. - one would do the following: - ```javascript - let registry = new Registry(); - let container = registry.container(); - registry.register('router:main', Router); - registry.register('controller:user', UserController); - registry.register('controller:post', PostController); - registry.typeInjection('controller', 'router', 'router:main'); - let user = container.lookup('controller:user'); - let post = container.lookup('controller:post'); - user.router instanceof Router; //=> true - post.router instanceof Router; //=> true - // both controllers share the same router - user.router === post.router; //=> true - ``` - @private - @method typeInjection - @param {String} type - @param {String} property - @param {String} fullName - */ - typeInjection: function (type, property, fullName) { - _emberMetal.assert('fullName must be a proper full name', this.validateFullName(fullName)); - - var fullNameType = fullName.split(':')[0]; - if (fullNameType === type) { - throw new Error('Cannot inject a \'' + fullName + '\' on other ' + type + '(s).'); - } - - var injections = this._typeInjections[type] || (this._typeInjections[type] = []); - - injections.push({ - property: property, - fullName: fullName - }); - }, - - /** - Defines injection rules. - These rules are used to inject dependencies onto objects when they - are instantiated. - Two forms of injections are possible: - * Injecting one fullName on another fullName - * Injecting one fullName on a type - Example: - ```javascript - let registry = new Registry(); - let container = registry.container(); - registry.register('source:main', Source); - registry.register('model:user', User); - registry.register('model:post', Post); - // injecting one fullName on another fullName - // eg. each user model gets a post model - registry.injection('model:user', 'post', 'model:post'); - // injecting one fullName on another type - registry.injection('model', 'source', 'source:main'); - let user = container.lookup('model:user'); - let post = container.lookup('model:post'); - user.source instanceof Source; //=> true - post.source instanceof Source; //=> true - user.post instanceof Post; //=> true - // and both models share the same source - user.source === post.source; //=> true - ``` - @private - @method injection - @param {String} factoryName - @param {String} property - @param {String} injectionName - */ - injection: function (fullName, property, injectionName) { - this.validateFullName(injectionName); - var normalizedInjectionName = this.normalize(injectionName); - - if (fullName.indexOf(':') === -1) { - return this.typeInjection(fullName, property, normalizedInjectionName); - } - - _emberMetal.assert('fullName must be a proper full name', this.validateFullName(fullName)); - var normalizedName = this.normalize(fullName); - - var injections = this._injections[normalizedName] || (this._injections[normalizedName] = []); - - injections.push({ - property: property, - fullName: normalizedInjectionName - }); - }, - - /** - Used only via `factoryInjection`. - Provides a specialized form of injection, specifically enabling - all factory of one type to be injected with a reference to another - object. - For example, provided each factory of type `model` needed a `store`. - one would do the following: - ```javascript - let registry = new Registry(); - registry.register('store:main', SomeStore); - registry.factoryTypeInjection('model', 'store', 'store:main'); - let store = registry.lookup('store:main'); - let UserFactory = registry.lookupFactory('model:user'); - UserFactory.store instanceof SomeStore; //=> true - ``` - @private - @method factoryTypeInjection - @param {String} type - @param {String} property - @param {String} fullName - */ - factoryTypeInjection: function (type, property, fullName) { - var injections = this._factoryTypeInjections[type] || (this._factoryTypeInjections[type] = []); - - injections.push({ - property: property, - fullName: this.normalize(fullName) - }); - }, - - /** - Defines factory injection rules. - Similar to regular injection rules, but are run against factories, via - `Registry#lookupFactory`. - These rules are used to inject objects onto factories when they - are looked up. - Two forms of injections are possible: - * Injecting one fullName on another fullName - * Injecting one fullName on a type - Example: - ```javascript - let registry = new Registry(); - let container = registry.container(); - registry.register('store:main', Store); - registry.register('store:secondary', OtherStore); - registry.register('model:user', User); - registry.register('model:post', Post); - // injecting one fullName on another type - registry.factoryInjection('model', 'store', 'store:main'); - // injecting one fullName on another fullName - registry.factoryInjection('model:post', 'secondaryStore', 'store:secondary'); - let UserFactory = container.lookupFactory('model:user'); - let PostFactory = container.lookupFactory('model:post'); - let store = container.lookup('store:main'); - UserFactory.store instanceof Store; //=> true - UserFactory.secondaryStore instanceof OtherStore; //=> false - PostFactory.store instanceof Store; //=> true - PostFactory.secondaryStore instanceof OtherStore; //=> true - // and both models share the same source instance - UserFactory.store === PostFactory.store; //=> true - ``` - @private - @method factoryInjection - @param {String} factoryName - @param {String} property - @param {String} injectionName - */ - factoryInjection: function (fullName, property, injectionName) { - var normalizedName = this.normalize(fullName); - var normalizedInjectionName = this.normalize(injectionName); - - this.validateFullName(injectionName); - - if (fullName.indexOf(':') === -1) { - return this.factoryTypeInjection(normalizedName, property, normalizedInjectionName); - } - - var injections = this._factoryInjections[normalizedName] || (this._factoryInjections[normalizedName] = []); - - injections.push({ - property: property, - fullName: normalizedInjectionName - }); - }, - - /** - @private - @method knownForType - @param {String} type the type to iterate over - */ - knownForType: function (type) { - var fallbackKnown = undefined, - resolverKnown = undefined; - - var localKnown = _emberMetal.dictionary(null); - var registeredNames = Object.keys(this.registrations); - for (var index = 0; index < registeredNames.length; index++) { - var fullName = registeredNames[index]; - var itemType = fullName.split(':')[0]; - - if (itemType === type) { - localKnown[fullName] = true; - } - } - - if (this.fallback) { - fallbackKnown = this.fallback.knownForType(type); - } - - if (this.resolver && this.resolver.knownForType) { - resolverKnown = this.resolver.knownForType(type); - } - - return _emberMetal.assign({}, fallbackKnown, localKnown, resolverKnown); - }, - - validateFullName: function (fullName) { - if (!this.isValidFullName(fullName)) { - throw new TypeError('Invalid Fullname, expected: \'type:name\' got: ' + fullName); - } - - return true; - }, - - isValidFullName: function (fullName) { - return !!VALID_FULL_NAME_REGEXP.test(fullName); - }, - - validateInjections: function (injections) { - if (!injections) { - return; - } - - var fullName = undefined; - - for (var i = 0; i < injections.length; i++) { - fullName = injections[i].fullName; - - if (!this.has(fullName)) { - throw new Error('Attempting to inject an unknown injection: \'' + fullName + '\''); - } - } - }, - - normalizeInjectionsHash: function (hash) { - var injections = []; - - for (var key in hash) { - if (hash.hasOwnProperty(key)) { - _emberMetal.assert('Expected a proper full name, given \'' + hash[key] + '\'', this.validateFullName(hash[key])); - - injections.push({ - property: key, - fullName: hash[key] - }); - } - } - - return injections; - }, - - getInjections: function (fullName) { - var injections = this._injections[fullName] || []; - if (this.fallback) { - injections = injections.concat(this.fallback.getInjections(fullName)); - } - return injections; - }, - - getTypeInjections: function (type) { - var injections = this._typeInjections[type] || []; - if (this.fallback) { - injections = injections.concat(this.fallback.getTypeInjections(type)); - } - return injections; - }, - - getFactoryInjections: function (fullName) { - var injections = this._factoryInjections[fullName] || []; - if (this.fallback) { - injections = injections.concat(this.fallback.getFactoryInjections(fullName)); - } - return injections; - }, - - getFactoryTypeInjections: function (type) { - var injections = this._factoryTypeInjections[type] || []; - if (this.fallback) { - injections = injections.concat(this.fallback.getFactoryTypeInjections(type)); - } - return injections; - } - }; - - function deprecateResolverFunction(registry) { - _emberMetal.deprecate('Passing a `resolver` function into a Registry is deprecated. Please pass in a Resolver object with a `resolve` method.', false, { id: 'ember-application.registry-resolver-as-function', until: '3.0.0', url: 'http://emberjs.com/deprecations/v2.x#toc_registry-resolver-as-function' }); - registry.resolver = { - resolve: registry.resolver - }; - } - - /** - Given a fullName and a source fullName returns the fully resolved - fullName. Used to allow for local lookup. - - ```javascript - let registry = new Registry(); - - // the twitter factory is added to the module system - registry.expandLocalLookup('component:post-title', { source: 'template:post' }) // => component:post/post-title - ``` - - @private - @method expandLocalLookup - @param {String} fullName - @param {Object} [options] - @param {String} [options.source] the fullname of the request source (used for local lookups) - @return {String} fullName - */ - Registry.prototype.expandLocalLookup = function Registry_expandLocalLookup(fullName, options) { - if (this.resolver && this.resolver.expandLocalLookup) { - _emberMetal.assert('fullName must be a proper full name', this.validateFullName(fullName)); - _emberMetal.assert('options.source must be provided to expandLocalLookup', options && options.source); - _emberMetal.assert('options.source must be a proper full name', this.validateFullName(options.source)); - - var normalizedFullName = this.normalize(fullName); - var normalizedSource = this.normalize(options.source); - - return expandLocalLookup(this, normalizedFullName, normalizedSource); - } else if (this.fallback) { - return this.fallback.expandLocalLookup(fullName, options); - } else { - return null; - } - }; - - function expandLocalLookup(registry, normalizedName, normalizedSource) { - var cache = registry._localLookupCache; - var normalizedNameCache = cache[normalizedName]; - - if (!normalizedNameCache) { - normalizedNameCache = cache[normalizedName] = new _emberMetal.EmptyObject(); - } - - var cached = normalizedNameCache[normalizedSource]; - - if (cached !== undefined) { - return cached; - } - - var expanded = registry.resolver.expandLocalLookup(normalizedName, normalizedSource); - - return normalizedNameCache[normalizedSource] = expanded; - } - - function resolve(registry, normalizedName, options) { - if (options && options.source) { - // when `source` is provided expand normalizedName - // and source into the full normalizedName - normalizedName = registry.expandLocalLookup(normalizedName, options); - - // if expandLocalLookup returns falsey, we do not support local lookup - if (!normalizedName) { - return; - } - } - - var cached = registry._resolveCache[normalizedName]; - if (cached !== undefined) { - return cached; - } - if (registry._failCache[normalizedName]) { - return; - } - - var resolved = undefined; - - if (registry.resolver) { - resolved = registry.resolver.resolve(normalizedName); - } - - if (resolved === undefined) { - resolved = registry.registrations[normalizedName]; - } - - if (resolved === undefined) { - registry._failCache[normalizedName] = true; - } else { - registry._resolveCache[normalizedName] = resolved; - } - - return resolved; - } - - function has(registry, fullName, source) { - return registry.resolve(fullName, { source: source }) !== undefined; - } - - var privateNames = _emberMetal.dictionary(null); - var privateSuffix = '' + Math.random() + Date.now(); - - function privatize(_ref) { - var fullName = _ref[0]; - - var name = privateNames[fullName]; - if (name) { - return name; - } - - var _fullName$split = fullName.split(':'); - - var type = _fullName$split[0]; - var rawName = _fullName$split[1]; - - return privateNames[fullName] = _emberMetal.intern(type + ':' + rawName + '-' + privateSuffix); - } -}); enifed('ember-console/index', ['exports', 'ember-environment'], function (exports, _emberEnvironment) { 'use strict'; function K() {} @@ -3424,11 +2066,11 @@ Function: defaultTrue(obj.Function) }; } } }); -enifed('ember-metal/alias', ['exports', 'ember-metal/debug', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/dependent_keys'], function (exports, _emberMetalDebug, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalError, _emberMetalProperties, _emberMetalComputed, _emberMetalUtils, _emberMetalMeta, _emberMetalDependent_keys) { +enifed('ember-metal/alias', ['exports', 'ember-utils', 'ember-metal/debug', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/meta', 'ember-metal/dependent_keys'], function (exports, _emberUtils, _emberMetalDebug, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalError, _emberMetalProperties, _emberMetalComputed, _emberMetalMeta, _emberMetalDependent_keys) { 'use strict'; exports.default = alias; exports.AliasedProperty = AliasedProperty; @@ -3479,11 +2121,11 @@ this.set = AliasedProperty_readOnlySet; return this; }; function AliasedProperty_readOnlySet(obj, keyName, value) { - throw new _emberMetalError.default('Cannot set read-only property \'' + keyName + '\' on object: ' + _emberMetalUtils.inspect(obj)); + throw new _emberMetalError.default('Cannot set read-only property \'' + keyName + '\' on object: ' + _emberUtils.inspect(obj)); } AliasedProperty.prototype.oneWay = function () { this.set = AliasedProperty_oneWaySet; return this; @@ -3496,55 +2138,11 @@ // Backwards compatibility with Ember Data. AliasedProperty.prototype._meta = undefined; AliasedProperty.prototype.meta = _emberMetalComputed.ComputedProperty.prototype.meta; }); -enifed("ember-metal/assign", ["exports"], function (exports) { - /** - Copy properties from a source object to a target object. - - ```javascript - var a = { first: 'Yehuda' }; - var b = { last: 'Katz' }; - var c = { company: 'Tilde Inc.' }; - Ember.assign(a, b, c); // a === { first: 'Yehuda', last: 'Katz', company: 'Tilde Inc.' }, b === { last: 'Katz' }, c === { company: 'Tilde Inc.' } - ``` - - @method assign - @for Ember - @param {Object} original The object to assign into - @param {Object} ...args The objects to copy properties from - @return {Object} - @public - */ - "use strict"; - - exports.default = assign; - - function assign(original) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - for (var i = 0; i < args.length; i++) { - var arg = args[i]; - if (!arg) { - continue; - } - - var updates = Object.keys(arg); - - for (var _i = 0; _i < updates.length; _i++) { - var prop = updates[_i]; - original[prop] = arg[prop]; - } - } - - return original; - } -}); -enifed('ember-metal/binding', ['exports', 'ember-console', 'ember-environment', 'ember-metal/run_loop', 'ember-metal/debug', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/events', 'ember-metal/observer', 'ember-metal/path_cache'], function (exports, _emberConsole, _emberEnvironment, _emberMetalRun_loop, _emberMetalDebug, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalUtils, _emberMetalEvents, _emberMetalObserver, _emberMetalPath_cache) { +enifed('ember-metal/binding', ['exports', 'ember-utils', 'ember-console', 'ember-environment', 'ember-metal/run_loop', 'ember-metal/debug', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/events', 'ember-metal/observer', 'ember-metal/path_cache'], function (exports, _emberUtils, _emberConsole, _emberEnvironment, _emberMetalRun_loop, _emberMetalDebug, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalEvents, _emberMetalObserver, _emberMetalPath_cache) { 'use strict'; exports.bind = bind; /** @@ -3649,11 +2247,11 @@ @return {String} string representation of binding @public */ toString: function () { var oneWay = this._oneWay ? '[oneWay]' : ''; - return 'Ember.Binding<' + _emberMetalUtils.guidFor(this) + '>(' + this._from + ' -> ' + this._to + ')' + oneWay; + return 'Ember.Binding<' + _emberUtils.guidFor(this) + '>(' + this._from + ' -> ' + this._to + ')' + oneWay; }, // .......................................................... // CONNECT AND SYNC // @@ -4016,11 +2614,11 @@ return new Binding(to, from).connect(obj); } exports.Binding = Binding; }); -enifed('ember-metal/cache', ['exports', 'ember-metal/empty_object'], function (exports, _emberMetalEmpty_object) { +enifed('ember-metal/cache', ['exports', 'ember-utils'], function (exports, _emberUtils) { 'use strict'; var Cache = (function () { function Cache(limit, func, key, store) { babelHelpers.classCallCheck(this, Cache); @@ -4085,11 +2683,11 @@ var DefaultStore = (function () { function DefaultStore() { babelHelpers.classCallCheck(this, DefaultStore); - this.data = new _emberMetalEmpty_object.default(); + this.data = new _emberUtils.EmptyObject(); } DefaultStore.prototype.get = function get(key) { return this.data[key]; }; @@ -4097,17 +2695,17 @@ DefaultStore.prototype.set = function set(key, value) { this.data[key] = value; }; DefaultStore.prototype.clear = function clear() { - this.data = new _emberMetalEmpty_object.default(); + this.data = new _emberUtils.EmptyObject(); }; return DefaultStore; })(); }); -enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-metal/meta', 'ember-metal/watch_key', 'ember-metal/empty_object', 'ember-metal/watch_path'], function (exports, _emberMetalProperty_get, _emberMetalMeta, _emberMetalWatch_key, _emberMetalEmpty_object, _emberMetalWatch_path) { +enifed('ember-metal/chains', ['exports', 'ember-utils', 'ember-metal/property_get', 'ember-metal/meta', 'ember-metal/watch_key', 'ember-metal/watch_path'], function (exports, _emberUtils, _emberMetalProperty_get, _emberMetalMeta, _emberMetalWatch_key, _emberMetalWatch_path) { 'use strict'; exports.finishChains = finishChains; var FIRST_KEY = /^([^\.]+)/; @@ -4126,11 +2724,11 @@ function ChainWatchers() { // chain nodes that reference a key in this obj by key // we only create ChainWatchers when we are going to add them // so create this upfront - this.chains = new _emberMetalEmpty_object.default(); + this.chains = new _emberUtils.EmptyObject(); } ChainWatchers.prototype = { add: function (key, node) { var nodes = this.chains[key]; @@ -4358,11 +2956,11 @@ chain: function (key, path) { var chains = this._chains; var node = undefined; if (chains === undefined) { - chains = this._chains = new _emberMetalEmpty_object.default(); + chains = this._chains = new _emberUtils.EmptyObject(); } else { node = chains[key]; } if (node === undefined) { @@ -4461,11 +3059,11 @@ } exports.removeChainWatcher = removeChainWatcher; exports.ChainNode = ChainNode; }); -enifed('ember-metal/computed', ['exports', 'ember-metal/debug', 'ember-metal/property_set', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/property_events', 'ember-metal/dependent_keys'], function (exports, _emberMetalDebug, _emberMetalProperty_set, _emberMetalUtils, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) { +enifed('ember-metal/computed', ['exports', 'ember-utils', 'ember-metal/debug', 'ember-metal/property_set', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/error', 'ember-metal/properties', 'ember-metal/property_events', 'ember-metal/dependent_keys'], function (exports, _emberUtils, _emberMetalDebug, _emberMetalProperty_set, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalError, _emberMetalProperties, _emberMetalProperty_events, _emberMetalDependent_keys) { 'use strict'; exports.default = computed; /** @@ -4812,11 +3410,11 @@ return this.setWithSuspend(obj, keyName, value); }; ComputedPropertyPrototype._throwReadOnlyError = function computedPropertyThrowReadOnlyError(obj, keyName) { - throw new _emberMetalError.default('Cannot set read-only property "' + keyName + '" on object: ' + _emberMetalUtils.inspect(obj)); + throw new _emberMetalError.default('Cannot set read-only property "' + keyName + '" on object: ' + _emberUtils.inspect(obj)); }; ComputedPropertyPrototype.clobberSet = function computedPropertyClobberSet(obj, keyName, value) { var cachedValue = cacheFor(obj, keyName); _emberMetalProperties.defineProperty(obj, keyName, null, cachedValue); @@ -5283,56 +3881,10 @@ Descriptor.prototype.teardown = function teardown(obj, key) {}; return Descriptor; })(_emberMetalProperties.Descriptor); }); -enifed('ember-metal/dictionary', ['exports', 'ember-metal/empty_object'], function (exports, _emberMetalEmpty_object) { - 'use strict'; - - exports.default = makeDictionary; - - // the delete is meant to hint at runtimes that this object should remain in - // dictionary mode. This is clearly a runtime specific hack, but currently it - // appears worthwhile in some usecases. Please note, these deletes do increase - // the cost of creation dramatically over a plain Object.create. And as this - // only makes sense for long-lived dictionaries that aren't instantiated often. - - function makeDictionary(parent) { - var dict = undefined; - if (parent === null) { - dict = new _emberMetalEmpty_object.default(); - } else { - dict = Object.create(parent); - } - dict['_dict'] = null; - delete dict['_dict']; - return dict; - } -}); -enifed("ember-metal/empty_object", ["exports"], function (exports) { - // This exists because `Object.create(null)` is absurdly slow compared - // to `new EmptyObject()`. In either case, you want a null prototype - // when you're treating the object instances as arbitrary dictionaries - // and don't want your keys colliding with build-in methods on the - // default object prototype. - - "use strict"; - - var proto = Object.create(null, { - // without this, we will always still end up with (new - // EmptyObject()).constructor === Object - constructor: { - value: undefined, - enumerable: false, - writable: true - } - }); - - function EmptyObject() {} - EmptyObject.prototype = proto; - exports.default = EmptyObject; -}); enifed("ember-metal/error", ["exports"], function (exports) { /** A subclass of the JavaScript Error object for use in Ember. @@ -5429,11 +3981,11 @@ } else { _emberConsole.default.error(getStack(error)); } } }); -enifed('ember-metal/events', ['exports', 'ember-metal/debug', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/meta_listeners'], function (exports, _emberMetalDebug, _emberMetalUtils, _emberMetalMeta, _emberMetalMeta_listeners) { +enifed('ember-metal/events', ['exports', 'ember-utils', 'ember-metal/debug', 'ember-metal/meta', 'ember-metal/meta_listeners'], function (exports, _emberUtils, _emberMetalDebug, _emberMetalMeta, _emberMetalMeta_listeners) { 'no use strict'; // Remove "use strict"; from transpiled module until // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed /** @@ -5676,11 +4228,11 @@ if (!target) { target = obj; } if ('string' === typeof method) { if (params) { - _emberMetalUtils.applyStr(target, method, params); + _emberUtils.applyStr(target, method, params); } else { target[method](); } } else { if (params) { @@ -5843,11 +4395,11 @@ }); return all; } }); -enifed('ember-metal/features', ['exports', 'ember-environment', 'ember-metal/assign', 'ember/features'], function (exports, _emberEnvironment, _emberMetalAssign, _emberFeatures) { +enifed('ember-metal/features', ['exports', 'ember-utils', 'ember-environment', 'ember/features'], function (exports, _emberUtils, _emberEnvironment, _emberFeatures) { 'use strict'; exports.default = isEnabled; /** @@ -5861,11 +4413,11 @@ @namespace Ember @static @since 1.1.0 @public */ - var FEATURES = _emberMetalAssign.default(_emberFeatures.default, _emberEnvironment.ENV.FEATURES); + var FEATURES = _emberUtils.assign(_emberFeatures.default, _emberEnvironment.ENV.FEATURES); exports.FEATURES = FEATURES; /** Determine whether the specified `feature` is enabled. Used by Ember's build tools to exclude experimental features from beta/stable builds. @@ -5939,11 +4491,11 @@ ret[propertyNames[i]] = _emberMetalProperty_get.get(obj, propertyNames[i]); } return ret; } }); -enifed('ember-metal/index', ['exports', 'require', 'ember-metal/core', 'ember-metal/computed', 'ember-metal/alias', 'ember-metal/assign', 'ember-metal/merge', 'ember-metal/debug', 'ember-metal/instrumentation', 'ember-metal/utils', 'ember-metal/testing', 'ember-metal/error_handler', 'ember-metal/meta', 'ember-metal/error', 'ember-metal/cache', 'ember-metal/features', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/weak_map', 'ember-metal/events', 'ember-metal/is_none', 'ember-metal/is_empty', 'ember-metal/is_blank', 'ember-metal/is_present', 'ember-metal/run_loop', 'ember-metal/observer_set', 'ember-metal/property_events', 'ember-metal/properties', 'ember-metal/watch_key', 'ember-metal/chains', 'ember-metal/watch_path', 'ember-metal/watching', 'ember-metal/libraries', 'ember-metal/map', 'ember-metal/get_properties', 'ember-metal/set_properties', 'ember-metal/expand_properties', 'ember-metal/observer', 'ember-metal/mixin', 'ember-metal/binding', 'ember-metal/path_cache', 'ember-metal/symbol', 'ember-metal/dictionary', 'ember-metal/empty_object', 'ember-metal/injected_property', 'ember-metal/tags', 'ember-metal/replace', 'ember-metal/transaction', 'ember-metal/descriptor'], function (exports, _require, _emberMetalCore, _emberMetalComputed, _emberMetalAlias, _emberMetalAssign, _emberMetalMerge, _emberMetalDebug, _emberMetalInstrumentation, _emberMetalUtils, _emberMetalTesting, _emberMetalError_handler, _emberMetalMeta, _emberMetalError, _emberMetalCache, _emberMetalFeatures, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalWeak_map, _emberMetalEvents, _emberMetalIs_none, _emberMetalIs_empty, _emberMetalIs_blank, _emberMetalIs_present, _emberMetalRun_loop, _emberMetalObserver_set, _emberMetalProperty_events, _emberMetalProperties, _emberMetalWatch_key, _emberMetalChains, _emberMetalWatch_path, _emberMetalWatching, _emberMetalLibraries, _emberMetalMap, _emberMetalGet_properties, _emberMetalSet_properties, _emberMetalExpand_properties, _emberMetalObserver, _emberMetalMixin, _emberMetalBinding, _emberMetalPath_cache, _emberMetalSymbol, _emberMetalDictionary, _emberMetalEmpty_object, _emberMetalInjected_property, _emberMetalTags, _emberMetalReplace, _emberMetalTransaction, _emberMetalDescriptor) { +enifed('ember-metal/index', ['exports', 'require', 'ember-metal/core', 'ember-metal/computed', 'ember-metal/alias', 'ember-metal/merge', 'ember-metal/debug', 'ember-metal/instrumentation', 'ember-metal/testing', 'ember-metal/error_handler', 'ember-metal/meta', 'ember-metal/error', 'ember-metal/cache', 'ember-metal/features', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/weak_map', 'ember-metal/events', 'ember-metal/is_none', 'ember-metal/is_empty', 'ember-metal/is_blank', 'ember-metal/is_present', 'ember-metal/run_loop', 'ember-metal/observer_set', 'ember-metal/property_events', 'ember-metal/properties', 'ember-metal/watch_key', 'ember-metal/chains', 'ember-metal/watch_path', 'ember-metal/watching', 'ember-metal/libraries', 'ember-metal/map', 'ember-metal/get_properties', 'ember-metal/set_properties', 'ember-metal/expand_properties', 'ember-metal/observer', 'ember-metal/mixin', 'ember-metal/binding', 'ember-metal/path_cache', 'ember-metal/injected_property', 'ember-metal/tags', 'ember-metal/replace', 'ember-metal/transaction', 'ember-metal/descriptor'], function (exports, _require, _emberMetalCore, _emberMetalComputed, _emberMetalAlias, _emberMetalMerge, _emberMetalDebug, _emberMetalInstrumentation, _emberMetalTesting, _emberMetalError_handler, _emberMetalMeta, _emberMetalError, _emberMetalCache, _emberMetalFeatures, _emberMetalProperty_get, _emberMetalProperty_set, _emberMetalWeak_map, _emberMetalEvents, _emberMetalIs_none, _emberMetalIs_empty, _emberMetalIs_blank, _emberMetalIs_present, _emberMetalRun_loop, _emberMetalObserver_set, _emberMetalProperty_events, _emberMetalProperties, _emberMetalWatch_key, _emberMetalChains, _emberMetalWatch_path, _emberMetalWatching, _emberMetalLibraries, _emberMetalMap, _emberMetalGet_properties, _emberMetalSet_properties, _emberMetalExpand_properties, _emberMetalObserver, _emberMetalMixin, _emberMetalBinding, _emberMetalPath_cache, _emberMetalInjected_property, _emberMetalTags, _emberMetalReplace, _emberMetalTransaction, _emberMetalDescriptor) { /** @module ember @submodule ember-metal */ @@ -5953,11 +4505,10 @@ // reexports exports.computed = _emberMetalComputed.default; exports.cacheFor = _emberMetalComputed.cacheFor; exports.ComputedProperty = _emberMetalComputed.ComputedProperty; exports.alias = _emberMetalAlias.default; - exports.assign = _emberMetalAssign.default; exports.merge = _emberMetalMerge.default; exports.assert = _emberMetalDebug.assert; exports.info = _emberMetalDebug.info; exports.warn = _emberMetalDebug.warn; exports.debug = _emberMetalDebug.debug; @@ -5970,22 +4521,10 @@ exports.flaggedInstrument = _emberMetalInstrumentation.flaggedInstrument; exports._instrumentStart = _emberMetalInstrumentation._instrumentStart; exports.instrumentationReset = _emberMetalInstrumentation.reset; exports.instrumentationSubscribe = _emberMetalInstrumentation.subscribe; exports.instrumentationUnsubscribe = _emberMetalInstrumentation.unsubscribe; - exports.intern = _emberMetalUtils.intern; - exports.GUID_KEY = _emberMetalUtils.GUID_KEY; - exports.GUID_KEY_PROPERTY = _emberMetalUtils.GUID_KEY_PROPERTY; - exports.applyStr = _emberMetalUtils.applyStr; - exports.canInvoke = _emberMetalUtils.canInvoke; - exports.generateGuid = _emberMetalUtils.generateGuid; - exports.guidFor = _emberMetalUtils.guidFor; - exports.inspect = _emberMetalUtils.inspect; - exports.makeArray = _emberMetalUtils.makeArray; - exports.tryInvoke = _emberMetalUtils.tryInvoke; - exports.uuid = _emberMetalUtils.uuid; - exports.wrap = _emberMetalUtils.wrap; exports.isTesting = _emberMetalTesting.isTesting; exports.setTesting = _emberMetalTesting.setTesting; exports.getOnerror = _emberMetalError_handler.getOnerror; exports.setOnerror = _emberMetalError_handler.setOnerror; exports.dispatchError = _emberMetalError_handler.dispatchError; @@ -6069,13 +4608,10 @@ exports.clearUnprocessedMixins = _emberMetalMixin.clearUnprocessedMixins; exports.detectBinding = _emberMetalMixin.detectBinding; exports.Binding = _emberMetalBinding.Binding; exports.bind = _emberMetalBinding.bind; exports.isGlobalPath = _emberMetalPath_cache.isGlobalPath; - exports.symbol = _emberMetalSymbol.default; - exports.dictionary = _emberMetalDictionary.default; - exports.EmptyObject = _emberMetalEmpty_object.default; exports.InjectedProperty = _emberMetalInjected_property.default; exports.setHasViews = _emberMetalTags.setHasViews; exports.tagFor = _emberMetalTags.tagFor; exports.markObjectAsDirty = _emberMetalTags.markObjectAsDirty; exports.replace = _emberMetalReplace.default; @@ -6091,11 +4627,11 @@ if (_require.has('ember-debug')) { _require.default('ember-debug'); } }); -enifed('ember-metal/injected_property', ['exports', 'ember-metal/debug', 'ember-metal/computed', 'ember-metal/alias', 'ember-metal/properties', 'container'], function (exports, _emberMetalDebug, _emberMetalComputed, _emberMetalAlias, _emberMetalProperties, _container) { +enifed('ember-metal/injected_property', ['exports', 'ember-utils', 'ember-metal/debug', 'ember-metal/computed', 'ember-metal/alias', 'ember-metal/properties'], function (exports, _emberUtils, _emberMetalDebug, _emberMetalComputed, _emberMetalAlias, _emberMetalProperties) { 'use strict'; exports.default = InjectedProperty; /** @@ -6118,11 +4654,11 @@ AliasedPropertyPrototype.oneWay.call(this); } function injectedPropertyGet(keyName) { var desc = this[keyName]; - var owner = _container.getOwner(this) || this.container; // fallback to `container` for backwards compat + var owner = _emberUtils.getOwner(this) || this.container; // fallback to `container` for backwards compat _emberMetalDebug.assert('InjectedProperties should be defined with the Ember.inject computed property macros.', desc && desc.isDescriptor && desc.type); _emberMetalDebug.assert('Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container.', owner); return owner.lookup(desc.type + ':' + (desc.name || keyName)); @@ -6649,11 +5185,11 @@ }; } exports.default = new Libraries(); }); -enifed('ember-metal/map', ['exports', 'ember-metal/utils', 'ember-metal/empty_object'], function (exports, _emberMetalUtils, _emberMetalEmpty_object) { +enifed('ember-metal/map', ['exports', 'ember-utils'], function (exports, _emberUtils) { /** @module ember @submodule ember-metal */ @@ -6683,11 +5219,11 @@ function missingNew(name) { throw new TypeError('Constructor ' + name + ' requires \'new\''); } function copyNull(obj) { - var output = new _emberMetalEmpty_object.default(); + var output = new _emberUtils.EmptyObject(); for (var prop in obj) { // hasOwnPropery is not needed because obj is new EmptyObject(); output[prop] = obj[prop]; } @@ -6742,11 +5278,11 @@ /** @method clear @private */ clear: function () { - this.presenceSet = new _emberMetalEmpty_object.default(); + this.presenceSet = new _emberUtils.EmptyObject(); this.list = []; this.size = 0; }, /** @@ -6755,11 +5291,11 @@ @param guid (optional, and for internal use) @return {Ember.OrderedSet} @private */ add: function (obj, _guid) { - var guid = _guid || _emberMetalUtils.guidFor(obj); + var guid = _guid || _emberUtils.guidFor(obj); var presenceSet = this.presenceSet; var list = this.list; if (presenceSet[guid] !== true) { presenceSet[guid] = true; @@ -6776,11 +5312,11 @@ @param _guid (optional and for internal use only) @return {Boolean} @private */ delete: function (obj, _guid) { - var guid = _guid || _emberMetalUtils.guidFor(obj); + var guid = _guid || _emberUtils.guidFor(obj); var presenceSet = this.presenceSet; var list = this.list; if (presenceSet[guid] === true) { delete presenceSet[guid]; @@ -6813,11 +5349,11 @@ has: function (obj) { if (this.size === 0) { return false; } - var guid = _emberMetalUtils.guidFor(obj); + var guid = _emberUtils.guidFor(obj); var presenceSet = this.presenceSet; return presenceSet[guid] === true; }, @@ -6898,11 +5434,11 @@ */ function Map() { if (this instanceof Map) { this._keys = OrderedSet.create(); this._keys._silenceRemoveDeprecation = true; - this._values = new _emberMetalEmpty_object.default(); + this._values = new _emberUtils.EmptyObject(); this.size = 0; } else { missingNew('Map'); } } @@ -6941,11 +5477,11 @@ if (this.size === 0) { return; } var values = this._values; - var guid = _emberMetalUtils.guidFor(key); + var guid = _emberUtils.guidFor(key); return values[guid]; }, /** @@ -6958,11 +5494,11 @@ @private */ set: function (key, value) { var keys = this._keys; var values = this._values; - var guid = _emberMetalUtils.guidFor(key); + var guid = _emberUtils.guidFor(key); // ensure we don't store -0 var k = key === -0 ? 0 : key; keys.add(k, guid); @@ -6988,11 +5524,11 @@ } // don't use ES6 "delete" because it will be annoying // to use in browsers that are not ES6 friendly; var keys = this._keys; var values = this._values; - var guid = _emberMetalUtils.guidFor(key); + var guid = _emberUtils.guidFor(key); if (keys.delete(key, guid)) { delete values[guid]; this.size = keys.size; return true; @@ -7054,11 +5590,11 @@ @method clear @private */ clear: function () { this._keys.clear(); - this._values = new _emberMetalEmpty_object.default(); + this._values = new _emberUtils.EmptyObject(); this.size = 0; }, /** @method copy @@ -7179,11 +5715,11 @@ } return original; } }); -enifed('ember-metal/meta', ['exports', 'ember-metal/features', 'ember-metal/meta_listeners', 'ember-metal/empty_object', 'ember-metal/utils', 'ember-metal/symbol'], function (exports, _emberMetalFeatures, _emberMetalMeta_listeners, _emberMetalEmpty_object, _emberMetalUtils, _emberMetalSymbol) { +enifed('ember-metal/meta', ['exports', 'ember-utils', 'ember-metal/features', 'ember-metal/meta_listeners'], function (exports, _emberUtils, _emberMetalFeatures, _emberMetalMeta_listeners) { 'no use strict'; // Remove "use strict"; from transpiled module until // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed exports.meta = meta; @@ -7294,11 +5830,11 @@ } Meta.prototype._getOrCreateOwnMap = function (key) { var ret = this[key]; if (!ret) { - ret = this[key] = new _emberMetalEmpty_object.default(); + ret = this[key] = new _emberUtils.EmptyObject(); } return ret; }; // Implements a member that is a lazily created POJO with inheritable @@ -7316,11 +5852,11 @@ return this._findInherited(key, subkey); }; Meta.prototype['forEach' + capitalized] = function (fn) { var pointer = this; - var seen = new _emberMetalEmpty_object.default(); + var seen = new _emberUtils.EmptyObject(); while (pointer !== undefined) { var map = pointer[key]; if (map) { for (var _key in map) { if (!seen[_key]) { @@ -7368,11 +5904,11 @@ } pointer = pointer.parent; } }; - var UNDEFINED = _emberMetalSymbol.default('undefined'); + var UNDEFINED = _emberUtils.symbol('undefined'); exports.UNDEFINED = UNDEFINED; // Implements a member that provides a lazily created map of maps, // with inheritance at both levels. function inheritedMapOfMaps(name, Meta) { @@ -7381,11 +5917,11 @@ Meta.prototype['write' + capitalized] = function (subkey, itemkey, value) { var outerMap = this._getOrCreateOwnMap(key); var innerMap = outerMap[subkey]; if (!innerMap) { - innerMap = outerMap[subkey] = new _emberMetalEmpty_object.default(); + innerMap = outerMap[subkey] = new _emberUtils.EmptyObject(); } innerMap[itemkey] = value; }; Meta.prototype['peek' + capitalized] = function (subkey, itemkey) { @@ -7420,11 +5956,11 @@ }; } Meta.prototype._forEachIn = function (key, subkey, fn) { var pointer = this; - var seen = new _emberMetalEmpty_object.default(); + var seen = new _emberUtils.EmptyObject(); var calls = []; while (pointer !== undefined) { var map = pointer[key]; if (map) { var innerMap = map[subkey]; @@ -7531,11 +6067,11 @@ return UNDEFINED; }; Meta.prototype.writeValue = function (obj, key, value) { - var descriptor = _emberMetalUtils.lookupDescriptor(obj, key); + var descriptor = _emberUtils.lookupDescriptor(obj, key); var isMandatorySetter = descriptor && descriptor.set && descriptor.set.isMandatorySetter; if (isMandatorySetter) { this.writeValues(key, value); } else { @@ -7777,11 +6313,11 @@ } } destination.push(target, method, source[index + 3]); } }); -enifed('ember-metal/mixin', ['exports', 'ember-metal/error', 'ember-metal/debug', 'ember-metal/assign', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/binding', 'ember-metal/observer', 'ember-metal/events'], function (exports, _emberMetalError, _emberMetalDebug, _emberMetalAssign, _emberMetalUtils, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalProperties, _emberMetalComputed, _emberMetalBinding, _emberMetalObserver, _emberMetalEvents) { +enifed('ember-metal/mixin', ['exports', 'ember-utils', 'ember-metal/error', 'ember-metal/debug', 'ember-metal/meta', 'ember-metal/expand_properties', 'ember-metal/properties', 'ember-metal/computed', 'ember-metal/binding', 'ember-metal/observer', 'ember-metal/events'], function (exports, _emberUtils, _emberMetalError, _emberMetalDebug, _emberMetalMeta, _emberMetalExpand_properties, _emberMetalProperties, _emberMetalComputed, _emberMetalBinding, _emberMetalObserver, _emberMetalEvents) { 'no use strict'; // Remove "use strict"; from transpiled module until // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed /** @@ -7812,11 +6348,11 @@ function mixinProperties(mixinsMeta, mixin) { var guid = undefined; if (mixin instanceof Mixin) { - guid = _emberMetalUtils.guidFor(mixin); + guid = _emberUtils.guidFor(mixin); if (mixinsMeta.peekMixins(guid)) { return CONTINUE; } mixinsMeta.writeMixins(guid, mixin); return mixin.properties; @@ -7861,14 +6397,14 @@ // Since multiple mixins may inherit from the same parent, we need // to clone the computed property so that other mixins do not receive // the wrapped version. property = Object.create(property); - property._getter = _emberMetalUtils.wrap(property._getter, superProperty._getter); + property._getter = _emberUtils.wrap(property._getter, superProperty._getter); if (superProperty._setter) { if (property._setter) { - property._setter = _emberMetalUtils.wrap(property._setter, superProperty._setter); + property._setter = _emberUtils.wrap(property._setter, superProperty._setter); } else { property._setter = superProperty._setter; } } @@ -7891,11 +6427,11 @@ // Only wrap the new method if the original method was a function if (superMethod === undefined || 'function' !== typeof superMethod) { return method; } - return _emberMetalUtils.wrap(method, superMethod); + return _emberUtils.wrap(method, superMethod); } function applyConcatenatedProperties(obj, key, value, values) { var baseValue = values[key] || obj[key]; @@ -7905,14 +6441,14 @@ return baseValue; } else { return baseValue.concat(value); } } else { - return _emberMetalUtils.makeArray(baseValue).concat(value); + return _emberUtils.makeArray(baseValue).concat(value); } } else { - return _emberMetalUtils.makeArray(value); + return _emberUtils.makeArray(value); } } function applyMergedProperties(obj, key, value, values) { var baseValue = values[key] || obj[key]; @@ -7926,11 +6462,11 @@ if (!baseValue) { return value; } - var newBase = _emberMetalAssign.default({}, baseValue); + var newBase = _emberUtils.assign({}, baseValue); var hasFunction = false; for (var prop in value) { if (!value.hasOwnProperty(prop)) { continue; @@ -7984,12 +6520,11 @@ function mergeMixins(mixins, m, descs, values, base, keys) { var currentMixin = undefined, props = undefined, key = undefined, concats = undefined, - mergings = undefined, - meta = undefined; + mergings = undefined; function removeKeys(keyName) { delete descs[keyName]; delete values[keyName]; } @@ -8002,11 +6537,10 @@ if (props === CONTINUE) { continue; } if (props) { - meta = _emberMetalMeta.meta(base); if (base.willMergeMixin) { base.willMergeMixin(props); } concats = concatenatedMixinProperties('concatenatedProperties', props, values, base); mergings = concatenatedMixinProperties('mergedProperties', props, values, base); @@ -8014,11 +6548,11 @@ for (key in props) { if (!props.hasOwnProperty(key)) { continue; } keys.push(key); - addNormalizedProperty(base, key, props[key], meta, descs, values, concats, mergings); + addNormalizedProperty(base, key, props[key], m, descs, values, concats, mergings); } // manually copy toString() because some JS engines do not enumerate it if (props.hasOwnProperty('toString')) { base.toString = props.toString; @@ -8187,11 +6721,11 @@ applyMixin(obj, args, false); return obj; } - var NAME_KEY = _emberMetalUtils.GUID_KEY + '_name'; + var NAME_KEY = _emberUtils.GUID_KEY + '_name'; exports.NAME_KEY = NAME_KEY; /** The `Ember.Mixin` class allows you to create mixins, whose properties can be added to other classes. For instance, @@ -8271,11 +6805,11 @@ } else { this.mixins = undefined; } this.ownerConstructor = undefined; this._without = undefined; - this[_emberMetalUtils.GUID_KEY] = null; + this[_emberUtils.GUID_KEY] = null; this[NAME_KEY] = null; _emberMetalDebug.debugSeal(this); } Mixin._apply = applyMixin; @@ -8365,11 +6899,11 @@ }; MixinPrototype.toString = Object.toString; function _detect(curMixin, targetMixin, seen) { - var guid = _emberMetalUtils.guidFor(curMixin); + var guid = _emberUtils.guidFor(curMixin); if (seen[guid]) { return false; } seen[guid] = true; @@ -8402,11 +6936,11 @@ } var m = _emberMetalMeta.peekMeta(obj); if (!m) { return false; } - return !!m.peekMixins(_emberMetalUtils.guidFor(this)); + return !!m.peekMixins(_emberUtils.guidFor(this)); }; MixinPrototype.without = function () { var ret = new Mixin([this]); @@ -8417,14 +6951,14 @@ ret._without = args; return ret; }; function _keys(ret, mixin, seen) { - if (seen[_emberMetalUtils.guidFor(mixin)]) { + if (seen[_emberUtils.guidFor(mixin)]) { return; } - seen[_emberMetalUtils.guidFor(mixin)] = true; + seen[_emberUtils.guidFor(mixin)] = true; if (mixin.properties) { var props = Object.keys(mixin.properties); for (var i = 0; i < props.length; i++) { var key = props[i]; @@ -8785,11 +7319,11 @@ _emberMetalEvents.removeListener(obj, beforeEvent(path), target, method); return this; } }); -enifed('ember-metal/observer_set', ['exports', 'ember-metal/utils', 'ember-metal/events'], function (exports, _emberMetalUtils, _emberMetalEvents) { +enifed('ember-metal/observer_set', ['exports', 'ember-utils', 'ember-metal/events'], function (exports, _emberUtils, _emberMetalEvents) { 'use strict'; exports.default = ObserverSet; /* @@ -8816,11 +7350,11 @@ } ObserverSet.prototype.add = function (sender, keyName, eventName) { var observerSet = this.observerSet; var observers = this.observers; - var senderGuid = _emberMetalUtils.guidFor(sender); + var senderGuid = _emberUtils.guidFor(sender); var keySet = observerSet[senderGuid]; var index = undefined; if (!keySet) { observerSet[senderGuid] = keySet = {}; @@ -9161,14 +7695,14 @@ // https://github.com/ariya/phantomjs/issues/11856 Object.defineProperty(obj, keyName, { configurable: true, writable: true, value: 'iCry' }); Object.defineProperty(obj, keyName, desc); } }); -enifed('ember-metal/property_events', ['exports', 'ember-metal/utils', 'ember-metal/meta', 'ember-metal/events', 'ember-metal/tags', 'ember-metal/observer_set', 'ember-metal/symbol', 'ember-metal/features', 'ember-metal/transaction'], function (exports, _emberMetalUtils, _emberMetalMeta, _emberMetalEvents, _emberMetalTags, _emberMetalObserver_set, _emberMetalSymbol, _emberMetalFeatures, _emberMetalTransaction) { +enifed('ember-metal/property_events', ['exports', 'ember-utils', 'ember-metal/meta', 'ember-metal/events', 'ember-metal/tags', 'ember-metal/observer_set', 'ember-metal/features', 'ember-metal/transaction'], function (exports, _emberUtils, _emberMetalMeta, _emberMetalEvents, _emberMetalTags, _emberMetalObserver_set, _emberMetalFeatures, _emberMetalTransaction) { 'use strict'; - var PROPERTY_DID_CHANGE = _emberMetalSymbol.default('PROPERTY_DID_CHANGE'); + var PROPERTY_DID_CHANGE = _emberUtils.symbol('PROPERTY_DID_CHANGE'); exports.PROPERTY_DID_CHANGE = PROPERTY_DID_CHANGE; var beforeObserverSet = new _emberMetalObserver_set.default(); var observerSet = new _emberMetalObserver_set.default(); var deferred = 0; @@ -9317,11 +7851,11 @@ } function iterDeps(method, obj, depKey, seen, meta) { var possibleDesc = undefined, desc = undefined; - var guid = _emberMetalUtils.guidFor(obj); + var guid = _emberUtils.guidFor(obj); var current = seen[guid]; if (!current) { current = seen[guid] = {}; } @@ -9589,11 +8123,11 @@ return value; } exports.default = get; }); -enifed('ember-metal/property_set', ['exports', 'ember-metal/debug', 'ember-metal/features', 'ember-metal/property_get', 'ember-metal/property_events', 'ember-metal/error', 'ember-metal/path_cache', 'ember-metal/meta', 'ember-metal/utils'], function (exports, _emberMetalDebug, _emberMetalFeatures, _emberMetalProperty_get, _emberMetalProperty_events, _emberMetalError, _emberMetalPath_cache, _emberMetalMeta, _emberMetalUtils) { +enifed('ember-metal/property_set', ['exports', 'ember-utils', 'ember-metal/debug', 'ember-metal/features', 'ember-metal/property_get', 'ember-metal/property_events', 'ember-metal/error', 'ember-metal/path_cache', 'ember-metal/meta'], function (exports, _emberUtils, _emberMetalDebug, _emberMetalFeatures, _emberMetalProperty_get, _emberMetalProperty_events, _emberMetalError, _emberMetalPath_cache, _emberMetalMeta) { 'use strict'; exports.set = set; exports.trySet = trySet; @@ -9615,11 +8149,11 @@ function set(obj, keyName, value, tolerant) { _emberMetalDebug.assert('Set must be called with three or four arguments; an object, a property key, a value and tolerant true/false', arguments.length === 3 || arguments.length === 4); _emberMetalDebug.assert('Cannot call set with \'' + keyName + '\' on an undefined object.', obj && typeof obj === 'object' || typeof obj === 'function'); _emberMetalDebug.assert('The key provided to set must be a string, you passed ' + keyName, typeof keyName === 'string'); _emberMetalDebug.assert('\'this\' in paths is not supported', !_emberMetalPath_cache.hasThis(keyName)); - _emberMetalDebug.assert('calling set on destroyed object: ' + _emberMetalUtils.toString(obj) + '.' + keyName + ' = ' + _emberMetalUtils.toString(value), !obj.isDestroyed); + _emberMetalDebug.assert('calling set on destroyed object: ' + _emberUtils.toString(obj) + '.' + keyName + ' = ' + _emberUtils.toString(value), !obj.isDestroyed); if (_emberMetalPath_cache.isPath(keyName)) { return setPath(obj, keyName, value, tolerant); } @@ -9757,11 +8291,11 @@ ret = ret.concat(splice.apply(array, chunk)); } return ret; } }); -enifed('ember-metal/run_loop', ['exports', 'ember-metal/debug', 'ember-metal/testing', 'ember-metal/error_handler', 'ember-metal/utils', 'ember-metal/property_events', 'backburner'], function (exports, _emberMetalDebug, _emberMetalTesting, _emberMetalError_handler, _emberMetalUtils, _emberMetalProperty_events, _backburner) { +enifed('ember-metal/run_loop', ['exports', 'ember-utils', 'ember-metal/debug', 'ember-metal/testing', 'ember-metal/error_handler', 'ember-metal/property_events', 'backburner'], function (exports, _emberUtils, _emberMetalDebug, _emberMetalTesting, _emberMetalError_handler, _emberMetalProperty_events, _backburner) { 'use strict'; exports.default = run; function onBegin(current) { @@ -9780,11 +8314,11 @@ return _emberMetalError_handler.setOnerror(handler); } }; var backburner = new _backburner.default(['sync', 'actions', 'destroy'], { - GUID_KEY: _emberMetalUtils.GUID_KEY, + GUID_KEY: _emberUtils.GUID_KEY, sync: { before: _emberMetalProperty_events.beginPropertyChanges, after: _emberMetalProperty_events.endPropertyChanges }, defaultQueue: 'actions', @@ -10483,23 +9017,10 @@ } }); return properties; } }); -enifed('ember-metal/symbol', ['exports', 'ember-metal/utils'], function (exports, _emberMetalUtils) { - 'use strict'; - - exports.default = symbol; - - function symbol(debugName) { - // TODO: Investigate using platform symbols, but we do not - // want to require non-enumerability for this API, which - // would introduce a large cost. - - return _emberMetalUtils.intern(debugName + ' [id=' + _emberMetalUtils.GUID_KEY + Math.floor(Math.random() * new Date()) + ']'); - } -}); enifed('ember-metal/tags', ['exports', 'ember-metal/meta', 'require'], function (exports, _emberMetalMeta, _require2) { 'use strict'; exports.setHasViews = setHasViews; exports.tagFor = tagFor; @@ -10682,551 +9203,11 @@ exports.default = runInTransaction; exports.didRender = didRender; exports.assertNotRendered = assertNotRendered; }); -enifed('ember-metal/utils', ['exports'], function (exports) { - 'no use strict'; - // Remove "use strict"; from transpiled module until - // https://bugs.webkit.org/show_bug.cgi?id=138038 is fixed - - /** - @module ember-metal - */ - - /** - Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from - jQuery master. We'll just bootstrap our own uuid now. - - @private - @return {Number} the uuid - */ - exports.uuid = uuid; - exports.intern = intern; - exports.generateGuid = generateGuid; - exports.guidFor = guidFor; - exports.wrap = wrap; - exports.tryInvoke = tryInvoke; - exports.makeArray = makeArray; - exports.inspect = inspect; - exports.applyStr = applyStr; - exports.lookupDescriptor = lookupDescriptor; - exports.toString = toString; - var _uuid = 0; - - /** - Generates a universally unique identifier. This method - is used internally by Ember for assisting with - the generation of GUID's and other unique identifiers. - - @public - @return {Number} [description] - */ - - function uuid() { - return ++_uuid; - } - - /** - Prefix used for guids through out Ember. - @private - @property GUID_PREFIX - @for Ember - @type String - @final - */ - var GUID_PREFIX = 'ember'; - - // Used for guid generation... - var numberCache = []; - var stringCache = {}; - - /** - Strongly hint runtimes to intern the provided string. - - When do I need to use this function? - - For the most part, never. Pre-mature optimization is bad, and often the - runtime does exactly what you need it to, and more often the trade-off isn't - worth it. - - Why? - - Runtimes store strings in at least 2 different representations: - Ropes and Symbols (interned strings). The Rope provides a memory efficient - data-structure for strings created from concatenation or some other string - manipulation like splitting. - - Unfortunately checking equality of different ropes can be quite costly as - runtimes must resort to clever string comparison algorithms. These - algorithms typically cost in proportion to the length of the string. - Luckily, this is where the Symbols (interned strings) shine. As Symbols are - unique by their string content, equality checks can be done by pointer - comparison. - - How do I know if my string is a rope or symbol? - - Typically (warning general sweeping statement, but truthy in runtimes at - present) static strings created as part of the JS source are interned. - Strings often used for comparisons can be interned at runtime if some - criteria are met. One of these criteria can be the size of the entire rope. - For example, in chrome 38 a rope longer then 12 characters will not - intern, nor will segments of that rope. - - Some numbers: http://jsperf.com/eval-vs-keys/8 - - Known Trickâ„¢ - - @private - @return {String} interned version of the provided string - */ - - function intern(str) { - var obj = {}; - obj[str] = 1; - for (var key in obj) { - if (key === str) { - return key; - } - } - return str; - } - - /** - A unique key used to assign guids and other private metadata to objects. - If you inspect an object in your browser debugger you will often see these. - They can be safely ignored. - - On browsers that support it, these properties are added with enumeration - disabled so they won't show up when you iterate over your properties. - - @private - @property GUID_KEY - @for Ember - @type String - @final - */ - var GUID_KEY = intern('__ember' + +new Date()); - - var GUID_DESC = { - writable: true, - configurable: true, - enumerable: false, - value: null - }; - - exports.GUID_DESC = GUID_DESC; - var nullDescriptor = { - configurable: true, - writable: true, - enumerable: false, - value: null - }; - - var GUID_KEY_PROPERTY = { - name: GUID_KEY, - descriptor: nullDescriptor - }; - - exports.GUID_KEY_PROPERTY = GUID_KEY_PROPERTY; - /** - Generates a new guid, optionally saving the guid to the object that you - pass in. You will rarely need to use this method. Instead you should - call `Ember.guidFor(obj)`, which return an existing guid if available. - - @private - @method generateGuid - @for Ember - @param {Object} [obj] Object the guid will be used for. If passed in, the guid will - be saved on the object and reused whenever you pass the same object - again. - - If no object is passed, just generate a new guid. - @param {String} [prefix] Prefix to place in front of the guid. Useful when you want to - separate the guid into separate namespaces. - @return {String} the guid - */ - - function generateGuid(obj, prefix) { - if (!prefix) { - prefix = GUID_PREFIX; - } - - var ret = prefix + uuid(); - if (obj) { - if (obj[GUID_KEY] === null) { - obj[GUID_KEY] = ret; - } else { - GUID_DESC.value = ret; - if (obj.__defineNonEnumerable) { - obj.__defineNonEnumerable(GUID_KEY_PROPERTY); - } else { - Object.defineProperty(obj, GUID_KEY, GUID_DESC); - } - } - } - return ret; - } - - /** - Returns a unique id for the object. If the object does not yet have a guid, - one will be assigned to it. You can call this on any object, - `Ember.Object`-based or not, but be aware that it will add a `_guid` - property. - - You can also use this method on DOM Element objects. - - @public - @method guidFor - @for Ember - @param {Object} obj any object, string, number, Element, or primitive - @return {String} the unique guid for this instance. - */ - - function guidFor(obj) { - var type = typeof obj; - var isObject = type === 'object' && obj !== null; - var isFunction = type === 'function'; - - if ((isObject || isFunction) && obj[GUID_KEY]) { - return obj[GUID_KEY]; - } - - // special cases where we don't want to add a key to object - if (obj === undefined) { - return '(undefined)'; - } - - if (obj === null) { - return '(null)'; - } - - var ret = undefined; - - // Don't allow prototype changes to String etc. to change the guidFor - switch (type) { - case 'number': - ret = numberCache[obj]; - - if (!ret) { - ret = numberCache[obj] = 'nu' + obj; - } - - return ret; - - case 'string': - ret = stringCache[obj]; - - if (!ret) { - ret = stringCache[obj] = 'st' + uuid(); - } - - return ret; - - case 'boolean': - return obj ? '(true)' : '(false)'; - - default: - if (obj === Object) { - return '(Object)'; - } - - if (obj === Array) { - return '(Array)'; - } - - ret = GUID_PREFIX + uuid(); - - if (obj[GUID_KEY] === null) { - obj[GUID_KEY] = ret; - } else { - GUID_DESC.value = ret; - - if (obj.__defineNonEnumerable) { - obj.__defineNonEnumerable(GUID_KEY_PROPERTY); - } else { - Object.defineProperty(obj, GUID_KEY, GUID_DESC); - } - } - return ret; - } - } - - var HAS_SUPER_PATTERN = /\.(_super|call\(this|apply\(this)/; - var fnToString = Function.prototype.toString; - - var checkHasSuper = (function () { - var sourceAvailable = fnToString.call(function () { - return this; - }).indexOf('return this') > -1; - - if (sourceAvailable) { - return function checkHasSuper(func) { - return HAS_SUPER_PATTERN.test(fnToString.call(func)); - }; - } - - return function checkHasSuper() { - return true; - }; - })(); - - exports.checkHasSuper = checkHasSuper; - function ROOT() {} - ROOT.__hasSuper = false; - - function hasSuper(func) { - if (func.__hasSuper === undefined) { - func.__hasSuper = checkHasSuper(func); - } - return func.__hasSuper; - } - - /** - Wraps the passed function so that `this._super` will point to the superFunc - when the function is invoked. This is the primitive we use to implement - calls to super. - - @private - @method wrap - @for Ember - @param {Function} func The function to call - @param {Function} superFunc The super function. - @return {Function} wrapped function. - */ - - function wrap(func, superFunc) { - if (!hasSuper(func)) { - return func; - } - // ensure an unwrapped super that calls _super is wrapped with a terminal _super - if (!superFunc.wrappedFunction && hasSuper(superFunc)) { - return _wrap(func, _wrap(superFunc, ROOT)); - } - return _wrap(func, superFunc); - } - - function _wrap(func, superFunc) { - function superWrapper() { - var orig = this._super; - this._super = superFunc; - var ret = func.apply(this, arguments); - this._super = orig; - return ret; - } - - superWrapper.wrappedFunction = func; - superWrapper.__ember_observes__ = func.__ember_observes__; - superWrapper.__ember_observesBefore__ = func.__ember_observesBefore__; - superWrapper.__ember_listens__ = func.__ember_listens__; - - return superWrapper; - } - - /** - Checks to see if the `methodName` exists on the `obj`. - - ```javascript - let foo = { bar: function() { return 'bar'; }, baz: null }; - - Ember.canInvoke(foo, 'bar'); // true - Ember.canInvoke(foo, 'baz'); // false - Ember.canInvoke(foo, 'bat'); // false - ``` - - @method canInvoke - @for Ember - @param {Object} obj The object to check for the method - @param {String} methodName The method name to check for - @return {Boolean} - @private - */ - function canInvoke(obj, methodName) { - return !!(obj && typeof obj[methodName] === 'function'); - } - - /** - Checks to see if the `methodName` exists on the `obj`, - and if it does, invokes it with the arguments passed. - - ```javascript - let d = new Date('03/15/2013'); - - Ember.tryInvoke(d, 'getTime'); // 1363320000000 - Ember.tryInvoke(d, 'setFullYear', [2014]); // 1394856000000 - Ember.tryInvoke(d, 'noSuchMethod', [2014]); // undefined - ``` - - @method tryInvoke - @for Ember - @param {Object} obj The object to check for the method - @param {String} methodName The method name to check for - @param {Array} [args] The arguments to pass to the method - @return {*} the return value of the invoked method or undefined if it cannot be invoked - @public - */ - - function tryInvoke(obj, methodName, args) { - if (canInvoke(obj, methodName)) { - return args ? applyStr(obj, methodName, args) : applyStr(obj, methodName); - } - } - - // ........................................ - // TYPING & ARRAY MESSAGING - // - - var objectToString = Object.prototype.toString; - - /** - Forces the passed object to be part of an array. If the object is already - an array, it will return the object. Otherwise, it will add the object to - an array. If obj is `null` or `undefined`, it will return an empty array. - - ```javascript - Ember.makeArray(); // [] - Ember.makeArray(null); // [] - Ember.makeArray(undefined); // [] - Ember.makeArray('lindsay'); // ['lindsay'] - Ember.makeArray([1, 2, 42]); // [1, 2, 42] - - let controller = Ember.ArrayProxy.create({ content: [] }); - - Ember.makeArray(controller) === controller; // true - ``` - - @method makeArray - @for Ember - @param {Object} obj the object - @return {Array} - @private - */ - - function makeArray(obj) { - if (obj === null || obj === undefined) { - return []; - } - return Array.isArray(obj) ? obj : [obj]; - } - - /** - Convenience method to inspect an object. This method will attempt to - convert the object into a useful string description. - - It is a pretty simple implementation. If you want something more robust, - use something like JSDump: https://github.com/NV/jsDump - - @method inspect - @for Ember - @param {Object} obj The object you want to inspect. - @return {String} A description of the object - @since 1.4.0 - @private - */ - - function inspect(obj) { - if (obj === null) { - return 'null'; - } - if (obj === undefined) { - return 'undefined'; - } - if (Array.isArray(obj)) { - return '[' + obj + ']'; - } - // for non objects - var type = typeof obj; - if (type !== 'object' && type !== 'symbol') { - return '' + obj; - } - // overridden toString - if (typeof obj.toString === 'function' && obj.toString !== objectToString) { - return obj.toString(); - } - - // Object.prototype.toString === {}.toString - var v = undefined; - var ret = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - v = obj[key]; - if (v === 'toString') { - continue; - } // ignore useless items - if (typeof v === 'function') { - v = 'function() { ... }'; - } - - if (v && typeof v.toString !== 'function') { - ret.push(key + ': ' + objectToString.call(v)); - } else { - ret.push(key + ': ' + v); - } - } - } - return '{' + ret.join(', ') + '}'; - } - - /** - @param {Object} t target - @param {String} m method - @param {Array} a args - @private - */ - - function applyStr(t, m, a) { - var l = a && a.length; - if (!a || !l) { - return t[m](); - } - switch (l) { - case 1: - return t[m](a[0]); - case 2: - return t[m](a[0], a[1]); - case 3: - return t[m](a[0], a[1], a[2]); - case 4: - return t[m](a[0], a[1], a[2], a[3]); - case 5: - return t[m](a[0], a[1], a[2], a[3], a[4]); - default: - return t[m].apply(t, a); - } - } - - function lookupDescriptor(obj, keyName) { - var current = obj; - while (current) { - var descriptor = Object.getOwnPropertyDescriptor(current, keyName); - - if (descriptor) { - return descriptor; - } - - current = Object.getPrototypeOf(current); - } - - return null; - } - - // A `toString` util function that supports objects without a `toString` - // method, e.g. an object created with `Object.create(null)`. - - function toString(obj) { - if (obj && obj.toString) { - return obj.toString(); - } else { - return objectToString.call(obj); - } - } - - exports.GUID_KEY = GUID_KEY; - exports.makeArray = makeArray; - exports.canInvoke = canInvoke; -}); -enifed('ember-metal/watch_key', ['exports', 'ember-metal/features', 'ember-metal/meta', 'ember-metal/properties', 'ember-metal/utils'], function (exports, _emberMetalFeatures, _emberMetalMeta, _emberMetalProperties, _emberMetalUtils) { +enifed('ember-metal/watch_key', ['exports', 'ember-utils', 'ember-metal/features', 'ember-metal/meta', 'ember-metal/properties'], function (exports, _emberUtils, _emberMetalFeatures, _emberMetalMeta, _emberMetalProperties) { 'use strict'; exports.watchKey = watchKey; exports.unwatchKey = unwatchKey; @@ -11270,11 +9251,11 @@ // Future traveler, although this code looks scary. It merely exists in // development to aid in development asertions. Production builds of // ember strip this entire block out handleMandatorySetter = function handleMandatorySetter(m, obj, keyName) { - var descriptor = _emberMetalUtils.lookupDescriptor(obj, keyName); + var descriptor = _emberUtils.lookupDescriptor(obj, keyName); var configurable = descriptor ? descriptor.configurable : true; var isWritable = descriptor ? descriptor.writable : true; var hasValue = descriptor ? 'value' in descriptor : true; var possibleDesc = descriptor && descriptor.value; var isDescriptor = possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor; @@ -11330,11 +9311,11 @@ // Some further context: Once a property is watched by ember, bypassing `set` // for mutation, will bypass observation. This code exists to assert when // that occurs, and attempt to provide more helpful feedback. The alternative // is tricky to debug partially observable properties. if (!desc && keyName in obj) { - var maybeMandatoryDescriptor = _emberMetalUtils.lookupDescriptor(obj, keyName); + var maybeMandatoryDescriptor = _emberUtils.lookupDescriptor(obj, keyName); if (maybeMandatoryDescriptor.set && maybeMandatoryDescriptor.set.isMandatorySetter) { if (maybeMandatoryDescriptor.get && maybeMandatoryDescriptor.get.isInheritingGetter) { var possibleValue = m.readInheritedValue('values', keyName); if (possibleValue === _emberMetalMeta.UNDEFINED) { @@ -11501,11 +9482,11 @@ } } } } }); -enifed('ember-metal/weak_map', ['exports', 'ember-metal/utils', 'ember-metal/meta'], function (exports, _emberMetalUtils, _emberMetalMeta) { +enifed('ember-metal/weak_map', ['exports', 'ember-utils', 'ember-metal/meta'], function (exports, _emberUtils, _emberMetalMeta) { 'use strict'; exports.default = WeakMap; var id = 0; @@ -11533,11 +9514,11 @@ function WeakMap(iterable) { if (!(this instanceof WeakMap)) { throw new TypeError('Constructor WeakMap requires \'new\''); } - this._id = _emberMetalUtils.GUID_KEY + id++; + this._id = _emberUtils.GUID_KEY + id++; if (iterable === null || iterable === undefined) { return; } else if (Array.isArray(iterable)) { for (var i = 0; i < iterable.length; i++) { @@ -11647,11 +9628,11 @@ EmberHTMLBars.precompile = EmberHandlebars.precompile = _emberTemplateCompilerSystemPrecompile.default; EmberHTMLBars.compile = EmberHandlebars.compile = _emberTemplateCompilerSystemCompile.default; EmberHTMLBars.registerPlugin = _emberTemplateCompilerSystemCompileOptions.registerPlugin; }); // reexports -enifed('ember-template-compiler/index', ['exports', 'container', 'ember-metal', 'ember-environment', 'ember/version', 'ember-template-compiler/compat', 'ember-template-compiler/system/bootstrap', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/compile-options', 'ember-template-compiler/plugins'], function (exports, _container, _emberMetal, _emberEnvironment, _emberVersion, _emberTemplateCompilerCompat, _emberTemplateCompilerSystemBootstrap, _emberTemplateCompilerSystemPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemCompileOptions, _emberTemplateCompilerPlugins) { +enifed('ember-template-compiler/index', ['exports', 'ember-metal', 'ember-environment', 'ember/version', 'ember-template-compiler/compat', 'ember-template-compiler/system/bootstrap', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/compile-options', 'ember-template-compiler/plugins'], function (exports, _emberMetal, _emberEnvironment, _emberVersion, _emberTemplateCompilerCompat, _emberTemplateCompilerSystemBootstrap, _emberTemplateCompilerSystemPrecompile, _emberTemplateCompilerSystemCompile, _emberTemplateCompilerSystemCompileOptions, _emberTemplateCompilerPlugins) { 'use strict'; // private API used by ember-cli-htmlbars to setup ENV and FEATURES if (!_emberMetal.default.ENV) { _emberMetal.default.ENV = _emberEnvironment.ENV; @@ -12710,28 +10691,26 @@ } return moduleInfo; } }); -enifed('ember-template-compiler/system/compile-options', ['exports', 'ember-template-compiler/plugins', 'ember-metal'], function (exports, _emberTemplateCompilerPlugins, _emberMetal) { +enifed('ember-template-compiler/system/compile-options', ['exports', 'ember-utils', 'ember-template-compiler/plugins'], function (exports, _emberUtils, _emberTemplateCompilerPlugins) { 'use strict'; exports.default = compileOptions; exports.registerPlugin = registerPlugin; exports.removePlugin = removePlugin; var USER_PLUGINS = []; function compileOptions(_options) { - var options = _emberMetal.assign({ meta: {} }, _options); + var options = _emberUtils.assign({ meta: {} }, _options); // move `moduleName` into `meta` property if (options.moduleName) { var meta = options.meta; meta.moduleName = options.moduleName; - - delete options.moduleName; } if (!options.plugins) { options.plugins = { ast: [].concat(USER_PLUGINS, _emberTemplateCompilerPlugins.default) }; } else { @@ -12834,19 +10813,794 @@ } return glimmerPrecompile(templateString, _emberTemplateCompilerSystemCompileOptions.default(options)); } }); +enifed("ember-utils/apply-str", ["exports"], function (exports) { + /** + @param {Object} t target + @param {String} m method + @param {Array} a args + @private + */ + "use strict"; + + exports.default = applyStr; + + function applyStr(t, m, a) { + var l = a && a.length; + if (!a || !l) { + return t[m](); + } + switch (l) { + case 1: + return t[m](a[0]); + case 2: + return t[m](a[0], a[1]); + case 3: + return t[m](a[0], a[1], a[2]); + case 4: + return t[m](a[0], a[1], a[2], a[3]); + case 5: + return t[m](a[0], a[1], a[2], a[3], a[4]); + default: + return t[m].apply(t, a); + } + } +}); +enifed("ember-utils/assign", ["exports"], function (exports) { + /** + Copy properties from a source object to a target object. + + ```javascript + var a = { first: 'Yehuda' }; + var b = { last: 'Katz' }; + var c = { company: 'Tilde Inc.' }; + Ember.assign(a, b, c); // a === { first: 'Yehuda', last: 'Katz', company: 'Tilde Inc.' }, b === { last: 'Katz' }, c === { company: 'Tilde Inc.' } + ``` + + @method assign + @for Ember + @param {Object} original The object to assign into + @param {Object} ...args The objects to copy properties from + @return {Object} + @public + */ + "use strict"; + + exports.default = assign; + + function assign(original) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + if (!arg) { + continue; + } + + var updates = Object.keys(arg); + + for (var _i = 0; _i < updates.length; _i++) { + var prop = updates[_i]; + original[prop] = arg[prop]; + } + } + + return original; + } +}); +enifed('ember-utils/dictionary', ['exports', 'ember-utils/empty-object'], function (exports, _emberUtilsEmptyObject) { + 'use strict'; + + exports.default = makeDictionary; + + // the delete is meant to hint at runtimes that this object should remain in + // dictionary mode. This is clearly a runtime specific hack, but currently it + // appears worthwhile in some usecases. Please note, these deletes do increase + // the cost of creation dramatically over a plain Object.create. And as this + // only makes sense for long-lived dictionaries that aren't instantiated often. + + function makeDictionary(parent) { + var dict = undefined; + if (parent === null) { + dict = new _emberUtilsEmptyObject.default(); + } else { + dict = Object.create(parent); + } + dict['_dict'] = null; + delete dict['_dict']; + return dict; + } +}); +enifed("ember-utils/empty-object", ["exports"], function (exports) { + // This exists because `Object.create(null)` is absurdly slow compared + // to `new EmptyObject()`. In either case, you want a null prototype + // when you're treating the object instances as arbitrary dictionaries + // and don't want your keys colliding with build-in methods on the + // default object prototype. + + "use strict"; + + var proto = Object.create(null, { + // without this, we will always still end up with (new + // EmptyObject()).constructor === Object + constructor: { + value: undefined, + enumerable: false, + writable: true + } + }); + + function EmptyObject() {} + EmptyObject.prototype = proto; + exports.default = EmptyObject; +}); +enifed('ember-utils/guid', ['exports', 'ember-utils/intern'], function (exports, _emberUtilsIntern) { + 'use strict'; + + exports.uuid = uuid; + exports.generateGuid = generateGuid; + exports.guidFor = guidFor; + + /** + Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from + jQuery master. We'll just bootstrap our own uuid now. + + @private + @return {Number} the uuid + */ + var _uuid = 0; + + /** + Generates a universally unique identifier. This method + is used internally by Ember for assisting with + the generation of GUID's and other unique identifiers. + + @public + @return {Number} [description] + */ + + function uuid() { + return ++_uuid; + } + + /** + Prefix used for guids through out Ember. + @private + @property GUID_PREFIX + @for Ember + @type String + @final + */ + var GUID_PREFIX = 'ember'; + + // Used for guid generation... + var numberCache = []; + var stringCache = {}; + + /** + A unique key used to assign guids and other private metadata to objects. + If you inspect an object in your browser debugger you will often see these. + They can be safely ignored. + + On browsers that support it, these properties are added with enumeration + disabled so they won't show up when you iterate over your properties. + + @private + @property GUID_KEY + @for Ember + @type String + @final + */ + var GUID_KEY = _emberUtilsIntern.default('__ember' + +new Date()); + + exports.GUID_KEY = GUID_KEY; + var GUID_DESC = { + writable: true, + configurable: true, + enumerable: false, + value: null + }; + + exports.GUID_DESC = GUID_DESC; + var nullDescriptor = { + configurable: true, + writable: true, + enumerable: false, + value: null + }; + + var GUID_KEY_PROPERTY = { + name: GUID_KEY, + descriptor: nullDescriptor + }; + + exports.GUID_KEY_PROPERTY = GUID_KEY_PROPERTY; + /** + Generates a new guid, optionally saving the guid to the object that you + pass in. You will rarely need to use this method. Instead you should + call `Ember.guidFor(obj)`, which return an existing guid if available. + + @private + @method generateGuid + @for Ember + @param {Object} [obj] Object the guid will be used for. If passed in, the guid will + be saved on the object and reused whenever you pass the same object + again. + + If no object is passed, just generate a new guid. + @param {String} [prefix] Prefix to place in front of the guid. Useful when you want to + separate the guid into separate namespaces. + @return {String} the guid + */ + + function generateGuid(obj, prefix) { + if (!prefix) { + prefix = GUID_PREFIX; + } + + var ret = prefix + uuid(); + if (obj) { + if (obj[GUID_KEY] === null) { + obj[GUID_KEY] = ret; + } else { + GUID_DESC.value = ret; + if (obj.__defineNonEnumerable) { + obj.__defineNonEnumerable(GUID_KEY_PROPERTY); + } else { + Object.defineProperty(obj, GUID_KEY, GUID_DESC); + } + } + } + return ret; + } + + /** + Returns a unique id for the object. If the object does not yet have a guid, + one will be assigned to it. You can call this on any object, + `Ember.Object`-based or not, but be aware that it will add a `_guid` + property. + + You can also use this method on DOM Element objects. + + @public + @method guidFor + @for Ember + @param {Object} obj any object, string, number, Element, or primitive + @return {String} the unique guid for this instance. + */ + + function guidFor(obj) { + var type = typeof obj; + var isObject = type === 'object' && obj !== null; + var isFunction = type === 'function'; + + if ((isObject || isFunction) && obj[GUID_KEY]) { + return obj[GUID_KEY]; + } + + // special cases where we don't want to add a key to object + if (obj === undefined) { + return '(undefined)'; + } + + if (obj === null) { + return '(null)'; + } + + var ret = undefined; + + // Don't allow prototype changes to String etc. to change the guidFor + switch (type) { + case 'number': + ret = numberCache[obj]; + + if (!ret) { + ret = numberCache[obj] = 'nu' + obj; + } + + return ret; + + case 'string': + ret = stringCache[obj]; + + if (!ret) { + ret = stringCache[obj] = 'st' + uuid(); + } + + return ret; + + case 'boolean': + return obj ? '(true)' : '(false)'; + + default: + if (obj === Object) { + return '(Object)'; + } + + if (obj === Array) { + return '(Array)'; + } + + ret = GUID_PREFIX + uuid(); + + if (obj[GUID_KEY] === null) { + obj[GUID_KEY] = ret; + } else { + GUID_DESC.value = ret; + + if (obj.__defineNonEnumerable) { + obj.__defineNonEnumerable(GUID_KEY_PROPERTY); + } else { + Object.defineProperty(obj, GUID_KEY, GUID_DESC); + } + } + return ret; + } + } +}); +enifed('ember-utils/index', ['exports', 'ember-utils/symbol', 'ember-utils/owner', 'ember-utils/assign', 'ember-utils/empty-object', 'ember-utils/dictionary', 'ember-utils/guid', 'ember-utils/intern', 'ember-utils/super', 'ember-utils/inspect', 'ember-utils/lookup-descriptor', 'ember-utils/invoke', 'ember-utils/make-array', 'ember-utils/apply-str', 'ember-utils/to-string'], function (exports, _emberUtilsSymbol, _emberUtilsOwner, _emberUtilsAssign, _emberUtilsEmptyObject, _emberUtilsDictionary, _emberUtilsGuid, _emberUtilsIntern, _emberUtilsSuper, _emberUtilsInspect, _emberUtilsLookupDescriptor, _emberUtilsInvoke, _emberUtilsMakeArray, _emberUtilsApplyStr, _emberUtilsToString) { + /* + This package will be eagerly parsed and should have no dependencies on external + packages. + + It is intended to be used to share utility methods that will be needed + by every Ember application (and is **not** a dumping ground of useful utilities). + + Utility methods that are needed in < 80% of cases should be placed + elsewhere (so they can be lazily evaluated / parsed). + */ + 'use strict'; + + exports.symbol = _emberUtilsSymbol.default; + exports.getOwner = _emberUtilsOwner.getOwner; + exports.setOwner = _emberUtilsOwner.setOwner; + exports.OWNER = _emberUtilsOwner.OWNER; + exports.assign = _emberUtilsAssign.default; + exports.EmptyObject = _emberUtilsEmptyObject.default; + exports.dictionary = _emberUtilsDictionary.default; + exports.uuid = _emberUtilsGuid.uuid; + exports.GUID_KEY = _emberUtilsGuid.GUID_KEY; + exports.GUID_DESC = _emberUtilsGuid.GUID_DESC; + exports.GUID_KEY_PROPERTY = _emberUtilsGuid.GUID_KEY_PROPERTY; + exports.generateGuid = _emberUtilsGuid.generateGuid; + exports.guidFor = _emberUtilsGuid.guidFor; + exports.intern = _emberUtilsIntern.default; + exports.checkHasSuper = _emberUtilsSuper.checkHasSuper; + exports.ROOT = _emberUtilsSuper.ROOT; + exports.wrap = _emberUtilsSuper.wrap; + exports.inspect = _emberUtilsInspect.default; + exports.lookupDescriptor = _emberUtilsLookupDescriptor.default; + exports.canInvoke = _emberUtilsInvoke.canInvoke; + exports.tryInvoke = _emberUtilsInvoke.tryInvoke; + exports.makeArray = _emberUtilsMakeArray.default; + exports.applyStr = _emberUtilsApplyStr.default; + exports.toString = _emberUtilsToString.default; +}); +enifed('ember-utils/inspect', ['exports'], function (exports) { + 'use strict'; + + exports.default = inspect; + var objectToString = Object.prototype.toString; + + /** + Convenience method to inspect an object. This method will attempt to + convert the object into a useful string description. + + It is a pretty simple implementation. If you want something more robust, + use something like JSDump: https://github.com/NV/jsDump + + @method inspect + @for Ember + @param {Object} obj The object you want to inspect. + @return {String} A description of the object + @since 1.4.0 + @private + */ + + function inspect(obj) { + if (obj === null) { + return 'null'; + } + if (obj === undefined) { + return 'undefined'; + } + if (Array.isArray(obj)) { + return '[' + obj + ']'; + } + // for non objects + var type = typeof obj; + if (type !== 'object' && type !== 'symbol') { + return '' + obj; + } + // overridden toString + if (typeof obj.toString === 'function' && obj.toString !== objectToString) { + return obj.toString(); + } + + // Object.prototype.toString === {}.toString + var v = undefined; + var ret = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + v = obj[key]; + if (v === 'toString') { + continue; + } // ignore useless items + if (typeof v === 'function') { + v = 'function() { ... }'; + } + + if (v && typeof v.toString !== 'function') { + ret.push(key + ': ' + objectToString.call(v)); + } else { + ret.push(key + ': ' + v); + } + } + } + return '{' + ret.join(', ') + '}'; + } +}); +enifed("ember-utils/intern", ["exports"], function (exports) { + /** + Strongly hint runtimes to intern the provided string. + + When do I need to use this function? + + For the most part, never. Pre-mature optimization is bad, and often the + runtime does exactly what you need it to, and more often the trade-off isn't + worth it. + + Why? + + Runtimes store strings in at least 2 different representations: + Ropes and Symbols (interned strings). The Rope provides a memory efficient + data-structure for strings created from concatenation or some other string + manipulation like splitting. + + Unfortunately checking equality of different ropes can be quite costly as + runtimes must resort to clever string comparison algorithms. These + algorithms typically cost in proportion to the length of the string. + Luckily, this is where the Symbols (interned strings) shine. As Symbols are + unique by their string content, equality checks can be done by pointer + comparison. + + How do I know if my string is a rope or symbol? + + Typically (warning general sweeping statement, but truthy in runtimes at + present) static strings created as part of the JS source are interned. + Strings often used for comparisons can be interned at runtime if some + criteria are met. One of these criteria can be the size of the entire rope. + For example, in chrome 38 a rope longer then 12 characters will not + intern, nor will segments of that rope. + + Some numbers: http://jsperf.com/eval-vs-keys/8 + + Known Trickâ„¢ + + @private + @return {String} interned version of the provided string + */ + "use strict"; + + exports.default = intern; + + function intern(str) { + var obj = {}; + obj[str] = 1; + for (var key in obj) { + if (key === str) { + return key; + } + } + return str; + } +}); +enifed('ember-utils/invoke', ['exports', 'ember-utils/apply-str'], function (exports, _emberUtilsApplyStr) { + 'use strict'; + + exports.canInvoke = canInvoke; + exports.tryInvoke = tryInvoke; + + /** + Checks to see if the `methodName` exists on the `obj`. + + ```javascript + let foo = { bar: function() { return 'bar'; }, baz: null }; + + Ember.canInvoke(foo, 'bar'); // true + Ember.canInvoke(foo, 'baz'); // false + Ember.canInvoke(foo, 'bat'); // false + ``` + + @method canInvoke + @for Ember + @param {Object} obj The object to check for the method + @param {String} methodName The method name to check for + @return {Boolean} + @private + */ + + function canInvoke(obj, methodName) { + return !!(obj && typeof obj[methodName] === 'function'); + } + + /** + Checks to see if the `methodName` exists on the `obj`, + and if it does, invokes it with the arguments passed. + + ```javascript + let d = new Date('03/15/2013'); + + Ember.tryInvoke(d, 'getTime'); // 1363320000000 + Ember.tryInvoke(d, 'setFullYear', [2014]); // 1394856000000 + Ember.tryInvoke(d, 'noSuchMethod', [2014]); // undefined + ``` + + @method tryInvoke + @for Ember + @param {Object} obj The object to check for the method + @param {String} methodName The method name to check for + @param {Array} [args] The arguments to pass to the method + @return {*} the return value of the invoked method or undefined if it cannot be invoked + @public + */ + + function tryInvoke(obj, methodName, args) { + if (canInvoke(obj, methodName)) { + return args ? _emberUtilsApplyStr.default(obj, methodName, args) : _emberUtilsApplyStr.default(obj, methodName); + } + } +}); +enifed("ember-utils/lookup-descriptor", ["exports"], function (exports) { + "use strict"; + + exports.default = lookupDescriptor; + + function lookupDescriptor(obj, keyName) { + var current = obj; + while (current) { + var descriptor = Object.getOwnPropertyDescriptor(current, keyName); + + if (descriptor) { + return descriptor; + } + + current = Object.getPrototypeOf(current); + } + + return null; + } +}); +enifed("ember-utils/make-array", ["exports"], function (exports) { + /** + Forces the passed object to be part of an array. If the object is already + an array, it will return the object. Otherwise, it will add the object to + an array. If obj is `null` or `undefined`, it will return an empty array. + + ```javascript + Ember.makeArray(); // [] + Ember.makeArray(null); // [] + Ember.makeArray(undefined); // [] + Ember.makeArray('lindsay'); // ['lindsay'] + Ember.makeArray([1, 2, 42]); // [1, 2, 42] + + let controller = Ember.ArrayProxy.create({ content: [] }); + + Ember.makeArray(controller) === controller; // true + ``` + + @method makeArray + @for Ember + @param {Object} obj the object + @return {Array} + @private + */ + "use strict"; + + exports.default = makeArray; + + function makeArray(obj) { + if (obj === null || obj === undefined) { + return []; + } + return Array.isArray(obj) ? obj : [obj]; + } +}); +enifed('ember-utils/owner', ['exports', 'ember-utils/symbol'], function (exports, _emberUtilsSymbol) { + /** + @module ember + @submodule ember-runtime + */ + + 'use strict'; + + exports.getOwner = getOwner; + exports.setOwner = setOwner; + var OWNER = _emberUtilsSymbol.default('OWNER'); + + exports.OWNER = OWNER; + /** + Framework objects in an Ember application (components, services, routes, etc.) + are created via a factory and dependency injection system. Each of these + objects is the responsibility of an "owner", which handled its + instantiation and manages its lifetime. + + `getOwner` fetches the owner object responsible for an instance. This can + be used to lookup or resolve other class instances, or register new factories + into the owner. + + For example, this component dynamically looks up a service based on the + `audioType` passed as an attribute: + + ``` + // app/components/play-audio.js + import Ember from 'ember'; + + // Usage: + // + // {{play-audio audioType=model.audioType audioFile=model.file}} + // + export default Ember.Component.extend({ + audioService: Ember.computed('audioType', function() { + let owner = Ember.getOwner(this); + return owner.lookup(`service:${this.get('audioType')}`); + }), + click() { + let player = this.get('audioService'); + player.play(this.get('audioFile')); + } + }); + ``` + + @method getOwner + @for Ember + @param {Object} object An object with an owner. + @return {Object} An owner object. + @since 2.3.0 + @public + */ + + function getOwner(object) { + return object[OWNER]; + } + + /** + `setOwner` forces a new owner on a given object instance. This is primarily + useful in some testing cases. + + @method setOwner + @for Ember + @param {Object} object An object with an owner. + @return {Object} An owner object. + @since 2.3.0 + @public + */ + + function setOwner(object, owner) { + object[OWNER] = owner; + } +}); +enifed('ember-utils/super', ['exports'], function (exports) { + 'use strict'; + + exports.wrap = wrap; + var HAS_SUPER_PATTERN = /\.(_super|call\(this|apply\(this)/; + var fnToString = Function.prototype.toString; + + var checkHasSuper = (function () { + var sourceAvailable = fnToString.call(function () { + return this; + }).indexOf('return this') > -1; + + if (sourceAvailable) { + return function checkHasSuper(func) { + return HAS_SUPER_PATTERN.test(fnToString.call(func)); + }; + } + + return function checkHasSuper() { + return true; + }; + })(); + + exports.checkHasSuper = checkHasSuper; + function ROOT() {} + ROOT.__hasSuper = false; + + function hasSuper(func) { + if (func.__hasSuper === undefined) { + func.__hasSuper = checkHasSuper(func); + } + return func.__hasSuper; + } + + /** + Wraps the passed function so that `this._super` will point to the superFunc + when the function is invoked. This is the primitive we use to implement + calls to super. + + @private + @method wrap + @for Ember + @param {Function} func The function to call + @param {Function} superFunc The super function. + @return {Function} wrapped function. + */ + + function wrap(func, superFunc) { + if (!hasSuper(func)) { + return func; + } + // ensure an unwrapped super that calls _super is wrapped with a terminal _super + if (!superFunc.wrappedFunction && hasSuper(superFunc)) { + return _wrap(func, _wrap(superFunc, ROOT)); + } + return _wrap(func, superFunc); + } + + function _wrap(func, superFunc) { + function superWrapper() { + var orig = this._super; + this._super = superFunc; + var ret = func.apply(this, arguments); + this._super = orig; + return ret; + } + + superWrapper.wrappedFunction = func; + superWrapper.__ember_observes__ = func.__ember_observes__; + superWrapper.__ember_observesBefore__ = func.__ember_observesBefore__; + superWrapper.__ember_listens__ = func.__ember_listens__; + + return superWrapper; + } +}); +enifed('ember-utils/symbol', ['exports', 'ember-utils/guid', 'ember-utils/intern'], function (exports, _emberUtilsGuid, _emberUtilsIntern) { + 'use strict'; + + exports.default = symbol; + + function symbol(debugName) { + // TODO: Investigate using platform symbols, but we do not + // want to require non-enumerability for this API, which + // would introduce a large cost. + + return _emberUtilsIntern.default(debugName + ' [id=' + _emberUtilsGuid.GUID_KEY + Math.floor(Math.random() * new Date()) + ']'); + } +}); +enifed("ember-utils/to-string", ["exports"], function (exports) { + "use strict"; + + exports.default = toString; + var objectToString = Object.prototype.toString; + + /* + A `toString` util function that supports objects without a `toString` + method, e.g. an object created with `Object.create(null)`. + */ + + function toString(obj) { + if (obj && obj.toString) { + return obj.toString(); + } else { + return objectToString.call(obj); + } + } +}); enifed("ember/features", ["exports"], function (exports) { "use strict"; exports.default = { "features-stripped-test": false, "ember-routing-route-configured-query-params": false, "ember-libraries-isregistered": false, "ember-runtime-computed-uniq-by": true, "ember-improved-instrumentation": false, "ember-runtime-enumerable-includes": true, "ember-string-ishtmlsafe": true, "ember-testing-check-waiters": true, "ember-metal-weakmap": false, "ember-glimmer-allow-backtracking-rerender": false, "mandatory-setter": true, "ember-glimmer-detect-backtracking-rerender": true }; }); enifed("ember/version", ["exports"], function (exports) { "use strict"; - exports.default = "2.9.0-beta.1"; + exports.default = "2.9.0-beta.2"; }); enifed("glimmer-compiler/index", ["exports", "glimmer-compiler/lib/compiler", "glimmer-compiler/lib/template-visitor"], function (exports, _glimmerCompilerLibCompiler, _glimmerCompilerLibTemplateVisitor) { "use strict"; exports.precompile = _glimmerCompilerLibCompiler.precompile; @@ -14516,11 +13270,11 @@ function isModified(value) { return value !== NOT_MODIFIED; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcmVmZXJlbmNlL2xpYi92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBa0JPLFFBQU0sUUFBUSxHQUFhLENBQUMsQ0FBQzs7QUFDN0IsUUFBTSxPQUFPLEdBQWMsQ0FBQyxDQUFDOztBQUM3QixRQUFNLFFBQVEsR0FBYSxHQUFHLENBQUM7OztRQUVoQyxXQUFBO2lCQUFBLFdBQUE7O0FBQUEsbUJBQUEsV0FHSixRQUFRLEdBQUEsa0JBQUMsUUFBa0IsRUFBQTtBQUN6QixtQkFBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssUUFBUSxDQUFDO1NBQ2xDOztlQUxHLFdBQUE7Ozs7O0FBUU4sUUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDOztRQUVsQixZQUFvQjs4QkFBcEIsWUFBb0I7O0FBR3hCLGlCQUhJLFlBQW9CLEdBR1E7Z0JBQXBCLFFBQVEseURBQUcsU0FBUzs7QUFDOUIsbUNBQU8sQ0FBQztBQUNSLGdCQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUMxQjs7QUFORyxvQkFBb0IsV0FReEIsS0FBSyxHQUFBLGlCQUFBO0FBQ0gsbUJBQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUN0Qjs7QUFWRyxvQkFBb0IsV0FZeEIsS0FBSyxHQUFBLGlCQUFBO0FBQ0gsZ0JBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxTQUFTLENBQUM7U0FDN0I7O2VBZEcsWUFBb0I7T0FBUSxXQUFXOzs7O0FBaUJ2QyxhQUFBLGFBQUEsQ0FBd0IsTUFBMEIsRUFBQTtBQUN0RCxZQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFbkIsYUFBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxnQkFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN4QixnQkFB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LFNBQVM7O0FBQ2YsZ0JBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUM5QixnQkFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLE9BQU8sWUFBWSxDQUFDO0FBQzdDLGdCQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztBQUV2QixtQkFBTyxLQUFLLENBQUM7U0FDZDs7QUF0Q0csc0JBQUEsV0F3Q0ksVUFBVSxHQUFBLHNCQUFBO2dCQUNWLFNBQVMsR0FBSyxJQUFJLENBQWxCLFNBQVM7O0FBRWYsZ0JBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQy9DLGdCQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDMUMsZ0JBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRXhCLG1CQUFPLEtBQUssQ0FBQztTQUNkOztlQWhERyxjQUFBOzs7OztBQXVETixRQUFNLFlBQVksR0FBZ0Isc0NBQXNDLENBQUM7O0FBRW5FLGFBQUEsVUFBQSxDQUF3QixLQUFvQixFQUFBO0FBQ2hELGVBQU8sS0FBSyxLQUFLLFlBQVksQ0FBQztLQUMvQiIsImZpbGUiOiJ2YWxpZGF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlZmVyZW5jZSwgeyBQYXRoUmVmZXJlbmNlIH0gZnJvbSAnLi9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgT3BhcXVlLCBTbGljZSwgTGlua2VkTGlzdE5vZGUgfSBmcm9tICdnbGltbWVyLXV0aWwnO1xuXG4vLy8vLy8vLy8vXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5VGFnPFQ+IGV4dGVuZHMgUmVmZXJlbmNlPFQ+IHtcbiAgdmFsdWUoKTogVDtcbiAgdmFsaWRhdGUoc25hcHNob3Q6IFQpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ2dlZDxUPiB7XG4gIHRhZzogRW50aXR5VGFnPFQ+O1xufVxuXG4vLy8vLy8vLy8vXG5cbmV4cG9ydCB0eXBlIFJldmlzaW9uID0gbnVtYmVyO1xuXG5leHBvcnQgY29uc3QgQ09OU1RBTlQ6IFJldmlzaW9uID0gMDtcbmV4cG9ydCBjb25zdCBJTklUSUFMOiAgUmV2aXNpb24gPSAxO1xuZXhwb3J0IGNvbnN0IFZPTEFUSUxFOiBSZXZpc2lvbiA9IE5hTjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJldmlzaW9uVGFnIGltcGxlbWVudHMgUmV2aXNpb25UYWcge1xuICBhYnN0cmFjdCB2YWx1ZSgpOiBSZXZpc2lvbjtcblxuICB2YWxpZGF0ZShzbmFwc2hvdDogUmV2aXNpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSgpID09PSBzbmFwc2hvdDtcbiAgfVxufVxuXG5sZXQgJFJFVklTSU9OID0gSU5JVElBTDtcblxuZXhwb3J0IGNsYXNzIERpcnR5YWJsZVRhZyBleHRlbmRzIFJldmlzaW9uVGFnIHtcbiAgcHJpdmF0ZSByZXZpc2lvbjogUmV2aXNpb247XG5cbiAgY29uc3RydWN0b3IocmV2aXNpb24gPSAkUkVWSVNJT04pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmV2aXNpb24gPSByZXZpc2lvbjtcbiAgfVxuXG4gIHZhbHVlKCk6IFJldmlzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5yZXZpc2lvbjtcbiAgfVxuXG4gIGRpcnR5KCkge1xuICAgIHRoaXMucmV2aXNpb24gPSArKyRSRVZJU0lPTjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVRhZ2dlZCh0YWdnZWQ6IFRhZ2dlZDxSZXZpc2lvbj5bXSk6IFJldmlzaW9uVGFnIHtcbiAgbGV0IG9wdGltaXplZCA9IFtdO1xuXG4gIGZvciAobGV0IGk9MCwgbD10YWdnZWQubGVuZ3RoOyBpPGw7IGkrKykge1xuICAgIGxldCB0YWcgPSB0YWdnZWRbaV0udGFnO1xuICAgIGlmICh0YWcgPT09IFZPTEFUSUxFX1RBRykgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICBpZiAodGFnID09PSBDT05TVEFOVF9UQUcpIGNvbnRpbnVlO1xuICAgIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gIH1cblxuICByZXR1cm4gX2NvbWJpbmUob3B0aW1pemVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVTbGljZShzbGljZTogU2xpY2U8VGFnZ2VkPFJldmlzaW9uPiAmIExpbmtlZExpc3ROb2RlPik6IFJldmlzaW9uVGFnIHtcbiAgbGV0IG9wdGltaXplZCA9IFtdO1xuXG4gIGxldCBub2RlID0gc2xpY2UuaGVhZCgpO1xuXG4gIHdoaWxlKG5vZGUgIT09IG51bGwpIHtcbiAgICBsZXQgdGFnID0gbm9kZS50YWc7XG5cbiAgICBpZiAodGFnID09PSBWT0xBVElMRV9UQUcpIHJldHVybiBWT0xBVElMRV9UQUc7XG4gICAgaWYgKHRhZyAhPT0gQ09OU1RBTlRfVEFHKSBvcHRpbWl6ZWQucHVzaCh0YWcpO1xuXG4gICAgbm9kZSA9IHNsaWNlLm5leHROb2RlKG5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lKHRhZ3M6IFJldmlzaW9uVGFnW10pOiBSZXZpc2lvblRhZyB7XG4gIGxldCBvcHRpbWl6ZWQgPSBbXTtcblxuICBmb3IgKGxldCBpPTAsIGw9dGFncy5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgbGV0IHRhZyA9IHRhZ3NbaV07XG4gICAgaWYgKHRhZyA9PT0gVk9MQVRJTEVfVEFHKSByZXR1cm4gVk9MQVRJTEVfVEFHO1xuICAgIGlmICh0YWcgPT09IENPTlNUQU5UX1RBRykgY29udGludWU7XG4gICAgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgfVxuXG4gIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuXG5mdW5jdGlvbiBfY29tYmluZSh0YWdzOiBSZXZpc2lvblRhZ1tdKTogUmV2aXNpb25UYWcge1xuICBzd2l0Y2ggKHRhZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIENPTlNUQU5UX1RBRztcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gdGFnc1swXTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gbmV3IFRhZ3NQYWlyKHRhZ3NbMF0sIHRhZ3NbMV0pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IFRhZ3NDb21iaW5hdG9yKHRhZ3MpO1xuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FjaGVkVGFnIGV4dGVuZHMgUmV2aXNpb25UYWcge1xuICBwcml2YXRlIGxhc3RDaGVja2VkOiBSZXZpc2lvbiA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFZhbHVlOiBSZXZpc2lvbiA9IG51bGw7XG5cbiAgdmFsdWUoKTogUmV2aXNpb24ge1xuICAgIGxldCB7IGxhc3RDaGVja2VkLCBsYXN0VmFsdWUgfSA9IHRoaXM7XG5cbiAgICBpZiAobGFzdENoZWNrZWQgIT09ICRSRVZJU0lPTikge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9ICRSRVZJU0lPTjtcbiAgICAgIHRoaXMubGFzdFZhbHVlID0gbGFzdFZhbHVlID0gdGhpcy5jb21wdXRlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubGFzdFZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGludmFsaWRhdGUoKSB7XG4gICAgdGhpcy5sYXN0Q2hlY2tlZCA9IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY29tcHV0ZSgpOiBSZXZpc2lvbjtcbn1cblxuY2xhc3MgVGFnc1BhaXIgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICBwcml2YXRlIGZpcnN0OiBSZXZpc2lvblRhZztcbiAgcHJpdmF0ZSBzZWNvbmQ6IFJldmlzaW9uVGFnO1xuXG4gIGNvbnN0cnVjdG9yKGZpcnN0OiBSZXZpc2lvblRhZywgc2Vjb25kOiBSZXZpc2lvblRhZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5maXJzdCA9IGZpcnN0O1xuICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbXB1dGUoKTogUmV2aXNpb24ge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmZpcnN0LnZhbHVlKCksIHRoaXMuc2Vjb25kLnZhbHVlKCkpO1xuICB9XG59XG5cbmNsYXNzIFRhZ3NDb21iaW5hdG9yIGV4dGVuZHMgQ2FjaGVkVGFnIHtcbiAgcHJpdmF0ZSB0YWdzOiBSZXZpc2lvblRhZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKHRhZ3M6IFJldmlzaW9uVGFnW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcHV0ZSgpOiBSZXZpc2lvbiB7XG4gICAgbGV0IHsgdGFncyB9ID0gdGhpcztcblxuICAgIGxldCBtYXggPSAtMTtcblxuICAgIGZvciAobGV0IGk9MDsgaTx0YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdmFsdWUgPSB0YWdzW2ldLnZhbHVlKCk7XG4gICAgICBtYXggPSBNYXRoLm1heCh2YWx1ZSwgbWF4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGFibGVUYWcgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICBwcml2YXRlIHRhZzogUmV2aXNpb25UYWc7XG4gIHByaXZhdGUgbGFzdFVwZGF0ZWQ6IFJldmlzaW9uO1xuXG4gIGNvbnN0cnVjdG9yKHRhZzogUmV2aXNpb25UYWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFnID0gdGFnO1xuICAgIHRoaXMubGFzdFVwZGF0ZWQgPSBJTklUSUFMO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbXB1dGUoKTogUmV2aXNpb24ge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmxhc3RVcGRhdGVkLCB0aGlzLnRhZy52YWx1ZSgpKTtcbiAgfVxuXG4gIHVwZGF0ZSh0YWc6IFJldmlzaW9uVGFnKSB7XG4gICAgaWYgKHRhZyAhPT0gdGhpcy50YWcpIHtcbiAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9ICRSRVZJU0lPTjtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vLy8vLy8vLy8vXG5cbmV4cG9ydCBjb25zdCBDT05TVEFOVF9UQUc6IFJldmlzaW9uVGFnID0gbmV3IChcbiAgY2xhc3MgQ29uc3RhbnRUYWcgZXh0ZW5kcyBSZXZpc2lvblRhZyB7XG4gICAgdmFsdWUoKTogUmV2aXNpb24ge1xuICAgICAgcmV0dXJuIENPTlNUQU5UO1xuICAgIH1cbiAgfVxuKTtcblxuZXhwb3J0IGNvbnN0IFZPTEFUSUxFX1RBRzogUmV2aXNpb25UYWcgPSBuZXcgKFxuICBjbGFzcyBWb2xhdGlsZVRhZyBleHRlbmRzIFJldmlzaW9uVGFnIHtcbiAgICB2YWx1ZSgpOiBSZXZpc2lvbiB7XG4gICAgICByZXR1cm4gVk9MQVRJTEU7XG4gICAgfVxuICB9XG4pO1xuXG5leHBvcnQgY29uc3QgQ1VSUkVOVF9UQUc6IERpcnR5YWJsZVRhZyA9IG5ldyAoXG4gIGNsYXNzIEN1cnJlbnRUYWcgZXh0ZW5kcyBEaXJ0eWFibGVUYWcge1xuICAgIHZhbHVlKCk6IFJldmlzaW9uIHtcbiAgICAgIHJldHVybiAkUkVWSVNJT047XG4gICAgfVxuICB9XG4pO1xuXG4vLy8vLy8vLy8vXG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbmVkUmVmZXJlbmNlPFQ+IGV4dGVuZHMgUmVmZXJlbmNlPFQ+LCBUYWdnZWQ8UmV2aXNpb24+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbmVkUGF0aFJlZmVyZW5jZTxUPiBleHRlbmRzIFBhdGhSZWZlcmVuY2U8VD4sIFRhZ2dlZDxSZXZpc2lvbj4ge1xuICBnZXQocHJvcGVydHk6IHN0cmluZyk6IFZlcnNpb25lZFBhdGhSZWZlcmVuY2U8T3BhcXVlPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENhY2hlZFJlZmVyZW5jZTxUPiBpbXBsZW1lbnRzIFZlcnNpb25lZFJlZmVyZW5jZTxUPiB7XG4gIHB1YmxpYyBhYnN0cmFjdCB0YWc6IFJldmlzaW9uVGFnO1xuXG4gIHByaXZhdGUgbGFzdFJldmlzaW9uOiBSZXZpc2lvbiA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFZhbHVlOiBUID0gbnVsbDtcblxuICB2YWx1ZSgpOiBUIHtcbiAgICBsZXQgeyB0YWcsIGxhc3RSZXZpc2lvbiwgbGFzdFZhbHVlIH0gPSB0aGlzO1xuXG4gICAgaWYgKCFsYXN0UmV2aXNpb24gfHwgIXRhZy52YWxpZGF0ZShsYXN0UmV2aXNpb24pKSB7XG4gICAgICBsYXN0VmFsdWUgPSB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSB0YWcudmFsdWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFzdFZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbXB1dGUoKTogVDtcblxuICBwcm90ZWN0ZWQgaW52YWxpZGF0ZSgpIHtcbiAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gIH1cbn1cblxuLy8vLy8vLy8vL1xuXG50eXBlIE1hcHBlcjxULCBVPiA9ICh2YWx1ZTogVCkgPT4gVTtcblxuY2xhc3MgTWFwcGVyUmVmZXJlbmNlPFQsIFU+IGV4dGVuZHMgQ2FjaGVkUmVmZXJlbmNlPFU+IHtcbiAgcHVibGljIHRhZzogUmV2aXNpb25UYWc7XG5cbiAgcHJpdmF0ZSByZWZlcmVuY2U6IFZlcnNpb25lZFJlZmVyZW5jZTxUPjtcbiAgcHJpdmF0ZSBtYXBwZXI6IE1hcHBlcjxULCBVPjtcblxuICBjb25zdHJ1Y3RvcihyZWZlcmVuY2U6IFZlcnNpb25lZFJlZmVyZW5jZTxUPiwgbWFwcGVyOiBNYXBwZXI8VCwgVT4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFnID0gcmVmZXJlbmNlLnRhZztcbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb21wdXRlKCk6IFUge1xuICAgIGxldCB7IHJlZmVyZW5jZSwgbWFwcGVyIH0gPSB0aGlzO1xuICAgIHJldHVybiBtYXBwZXIocmVmZXJlbmNlLnZhbHVlKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXA8VCwgVT4ocmVmZXJlbmNlOiBWZXJzaW9uZWRSZWZlcmVuY2U8VD4sIG1hcHBlcjogTWFwcGVyPFQsIFU+KSB7XG4gIHJldHVybiBuZXcgTWFwcGVyUmVmZXJlbmNlKHJlZmVyZW5jZSwgbWFwcGVyKTtcbn1cblxuLy8vLy8vLy8vL1xuXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlQ2FjaGU8VD4gaW1wbGVtZW50cyBUYWdnZWQ8UmV2aXNpb24+IHtcbiAgcHVibGljIHRhZzogUmV2aXNpb25UYWc7XG5cbiAgcHJpdmF0ZSByZWZlcmVuY2U6IFZlcnNpb25lZFJlZmVyZW5jZTxUPjtcbiAgcHJpdmF0ZSBsYXN0VmFsdWU6IFQgPSBudWxsO1xuICBwcml2YXRlIGxhc3RSZXZpc2lvbjogUmV2aXNpb24gPSBudWxsO1xuICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocmVmZXJlbmNlOiBWZXJzaW9uZWRSZWZlcmVuY2U8VD4pIHtcbiAgICB0aGlzLnRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gIH1cblxuICBwZWVrKCk6IFQge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcbiAgfVxuXG4gIHJldmFsaWRhdGUoKTogVmFsaWRhdGlvbjxUPiB7XG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgbGV0IHsgcmVmZXJlbmNlLCBsYXN0UmV2aXNpb24gfSA9IHRoaXM7XG4gICAgbGV0IHRhZyA9IHJlZmVyZW5jZS50YWc7XG5cbiAgICBpZiAodGFnLnZhbGlkYXRlKGxhc3RSZXZpc2lvbikpIHJldHVybiBOT1RfTU9ESUZJRUQ7XG4gICAgdGhpcy5sYXN0UmV2aXNpb24gPSB0YWcudmFsdWUoKTtcblxuICAgIGxldCB7IGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICBsZXQgdmFsdWUgPSByZWZlcmVuY2UudmFsdWUoKTtcbiAgICBpZiAodmFsdWUgPT09IGxhc3RWYWx1ZSkgcmV0dXJuIE5PVF9NT0RJRklFRDtcbiAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplKCk6IFQge1xuICAgIGxldCB7IHJlZmVyZW5jZSB9ID0gdGhpcztcblxuICAgIGxldCB2YWx1ZSA9IHRoaXMubGFzdFZhbHVlID0gcmVmZXJlbmNlLnZhbHVlKCk7XG4gICAgdGhpcy5sYXN0UmV2aXNpb24gPSByZWZlcmVuY2UudGFnLnZhbHVlKCk7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdGlvbjxUPiA9IFQgfCBOb3RNb2RpZmllZDtcblxudHlwZSBOb3RNb2RpZmllZCA9IFwiYWRiM2I3OGUtM2QyMi00ZTRiLTg3N2EtNjMxN2MyYzVjMTQ1XCI7XG5cbmNvbnN0IE5PVF9NT0RJRklFRDogTm90TW9kaWZpZWQgPSBcImFkYjNiNzhlLTNkMjItNGU0Yi04NzdhLTYzMTdjMmM1YzE0NVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RpZmllZDxUPih2YWx1ZTogVmFsaWRhdGlvbjxUPik6IHZhbHVlIGlzIFQge1xuICByZXR1cm4gdmFsdWUgIT09IE5PVF9NT0RJRklFRDtcbn1cbiIsImV4cG9ydCBjb25zdCBDT05TVEFOVCA9IDA7XG5leHBvcnQgY29uc3QgSU5JVElBTCA9IDE7XG5leHBvcnQgY29uc3QgVk9MQVRJTEUgPSBOYU47XG5leHBvcnQgY2xhc3MgUmV2aXNpb25UYWcge1xuICAgIHZhbGlkYXRlKHNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKCkgPT09IHNuYXBzaG90O1xuICAgIH1cbn1cbmxldCAkUkVWSVNJT04gPSBJTklUSUFMO1xuZXhwb3J0IGNsYXNzIERpcnR5YWJsZVRhZyBleHRlbmRzIFJldmlzaW9uVGFnIHtcbiAgICBjb25zdHJ1Y3RvcihyZXZpc2lvbiA9ICRSRVZJU0lPTikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJldmlzaW9uID0gcmV2aXNpb247XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZpc2lvbjtcbiAgICB9XG4gICAgZGlydHkoKSB7XG4gICAgICAgIHRoaXMucmV2aXNpb24gPSArKyRSRVZJU0lPTjtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVRhZ2dlZCh0YWdnZWQpIHtcbiAgICBsZXQgb3B0aW1pemVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0YWdnZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGxldCB0YWcgPSB0YWdnZWRbaV0udGFnO1xuICAgICAgICBpZiAodGFnID09PSBWT0xBVElMRV9UQUcpXG4gICAgICAgICAgICByZXR1cm4gVk9MQVRJTEVfVEFHO1xuICAgICAgICBpZiAodGFnID09PSBDT05TVEFOVF9UQUcpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jb21iaW5lKG9wdGltaXplZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVNsaWNlKHNsaWNlKSB7XG4gICAgbGV0IG9wdGltaXplZCA9IFtdO1xuICAgIGxldCBub2RlID0gc2xpY2UuaGVhZCgpO1xuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgIGxldCB0YWcgPSBub2RlLnRhZztcbiAgICAgICAgaWYgKHRhZyA9PT0gVk9MQVRJTEVfVEFHKVxuICAgICAgICAgICAgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyAhPT0gQ09OU1RBTlRfVEFHKVxuICAgICAgICAgICAgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgICAgICAgbm9kZSA9IHNsaWNlLm5leHROb2RlKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gX2NvbWJpbmUob3B0aW1pemVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lKHRhZ3MpIHtcbiAgICBsZXQgb3B0aW1pemVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0YWdzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBsZXQgdGFnID0gdGFnc1tpXTtcbiAgICAgICAgaWYgKHRhZyA9PT0gVk9MQVRJTEVfVEFHKVxuICAgICAgICAgICAgcmV0dXJuIFZPTEFUSUxFX1RBRztcbiAgICAgICAgaWYgKHRhZyA9PT0gQ09OU1RBTlRfVEFHKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIG9wdGltaXplZC5wdXNoKHRhZyk7XG4gICAgfVxuICAgIHJldHVybiBfY29tYmluZShvcHRpbWl6ZWQpO1xufVxuZnVuY3Rpb24gX2NvbWJpbmUodGFncykge1xuICAgIHN3aXRjaCAodGFncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIENPTlNUQU5UX1RBRztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIHRhZ3NbMF07XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFnc1BhaXIodGFnc1swXSwgdGFnc1sxXSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhZ3NDb21iaW5hdG9yKHRhZ3MpO1xuICAgIH1cbiAgICA7XG59XG5leHBvcnQgY2xhc3MgQ2FjaGVkVGFnIGV4dGVuZHMgUmV2aXNpb25UYWcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgbGV0IHsgbGFzdENoZWNrZWQsIGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGxhc3RDaGVja2VkICE9PSAkUkVWSVNJT04pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSAkUkVWSVNJT047XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IGxhc3RWYWx1ZSA9IHRoaXMuY29tcHV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IG51bGw7XG4gICAgfVxufVxuY2xhc3MgVGFnc1BhaXIgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICAgIGNvbnN0cnVjdG9yKGZpcnN0LCBzZWNvbmQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5maXJzdCA9IGZpcnN0O1xuICAgICAgICB0aGlzLnNlY29uZCA9IHNlY29uZDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuZmlyc3QudmFsdWUoKSwgdGhpcy5zZWNvbmQudmFsdWUoKSk7XG4gICAgfVxufVxuY2xhc3MgVGFnc0NvbWJpbmF0b3IgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICAgIGNvbnN0cnVjdG9yKHRhZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgbGV0IHsgdGFncyB9ID0gdGhpcztcbiAgICAgICAgbGV0IG1heCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRhZ3NbaV0udmFsdWUoKTtcbiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KHZhbHVlLCBtYXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVwZGF0YWJsZVRhZyBleHRlbmRzIENhY2hlZFRhZyB7XG4gICAgY29uc3RydWN0b3IodGFnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gSU5JVElBTDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMubGFzdFVwZGF0ZWQsIHRoaXMudGFnLnZhbHVlKCkpO1xuICAgIH1cbiAgICB1cGRhdGUodGFnKSB7XG4gICAgICAgIGlmICh0YWcgIT09IHRoaXMudGFnKSB7XG4gICAgICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSAkUkVWSVNJT047XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vLy8vLy8vLy9cbmV4cG9ydCBjb25zdCBDT05TVEFOVF9UQUcgPSBuZXcgKGNsYXNzIENvbnN0YW50VGFnIGV4dGVuZHMgUmV2aXNpb25UYWcge1xuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gQ09OU1RBTlQ7XG4gICAgfVxufSk7XG5leHBvcnQgY29uc3QgVk9MQVRJTEVfVEFHID0gbmV3IChjbGFzcyBWb2xhdGlsZVRhZyBleHRlbmRzIFJldmlzaW9uVGFnIHtcbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIFZPTEFUSUxFO1xuICAgIH1cbn0pO1xuZXhwb3J0IGNvbnN0IENVUlJFTlRfVEFHID0gbmV3IChjbGFzcyBDdXJyZW50VGFnIGV4dGVuZHMgRGlydHlhYmxlVGFnIHtcbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuICRSRVZJU0lPTjtcbiAgICB9XG59KTtcbmV4cG9ydCBjbGFzcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCB7IHRhZywgbGFzdFJldmlzaW9uLCBsYXN0VmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGFzdFJldmlzaW9uIHx8ICF0YWcudmFsaWRhdGUobGFzdFJldmlzaW9uKSkge1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmNvbXB1dGUoKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gdGFnLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RWYWx1ZTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSBudWxsO1xuICAgIH1cbn1cbmNsYXNzIE1hcHBlclJlZmVyZW5jZSBleHRlbmRzIENhY2hlZFJlZmVyZW5jZSB7XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlLCBtYXBwZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWcgPSByZWZlcmVuY2UudGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICAgICAgdGhpcy5tYXBwZXIgPSBtYXBwZXI7XG4gICAgfVxuICAgIGNvbXB1dGUoKSB7XG4gICAgICAgIGxldCB7IHJlZmVyZW5jZSwgbWFwcGVyIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gbWFwcGVyKHJlZmVyZW5jZS52YWx1ZSgpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gbWFwKHJlZmVyZW5jZSwgbWFwcGVyKSB7XG4gICAgcmV0dXJuIG5ldyBNYXBwZXJSZWZlcmVuY2UocmVmZXJlbmNlLCBtYXBwZXIpO1xufVxuLy8vLy8vLy8vL1xuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UpIHtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50YWcgPSByZWZlcmVuY2UudGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB9XG4gICAgcGVlaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZhbHVlO1xuICAgIH1cbiAgICByZXZhbGlkYXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyByZWZlcmVuY2UsIGxhc3RSZXZpc2lvbiB9ID0gdGhpcztcbiAgICAgICAgbGV0IHRhZyA9IHJlZmVyZW5jZS50YWc7XG4gICAgICAgIGlmICh0YWcudmFsaWRhdGUobGFzdFJldmlzaW9uKSlcbiAgICAgICAgICAgIHJldHVybiBOT1RfTU9ESUZJRUQ7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gdGFnLnZhbHVlKCk7XG4gICAgICAgIGxldCB7IGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHZhbHVlID0gcmVmZXJlbmNlLnZhbHVlKCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbGFzdFZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIE5PVF9NT0RJRklFRDtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICBsZXQgeyByZWZlcmVuY2UgfSA9IHRoaXM7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMubGFzdFZhbHVlID0gcmVmZXJlbmNlLnZhbHVlKCk7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gcmVmZXJlbmNlLnRhZy52YWx1ZSgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbmNvbnN0IE5PVF9NT0RJRklFRCA9IFwiYWRiM2I3OGUtM2QyMi00ZTRiLTg3N2EtNjMxN2MyYzVjMTQ1XCI7XG5leHBvcnQgZnVuY3Rpb24gaXNNb2RpZmllZCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gTk9UX01PRElGSUVEO1xufVxuIl19 -enifed('glimmer-runtime/index', ['exports', 'glimmer-runtime/lib/dom/interfaces', 'glimmer-runtime/lib/syntax', 'glimmer-runtime/lib/template', 'glimmer-runtime/lib/symbol-table', 'glimmer-runtime/lib/references', 'glimmer-runtime/lib/syntax/core', 'glimmer-runtime/lib/compiler', 'glimmer-runtime/lib/opcode-builder', 'glimmer-runtime/lib/compiled/opcodes/builder', 'glimmer-runtime/lib/compiled/blocks', 'glimmer-runtime/lib/opcodes', 'glimmer-runtime/lib/compiled/opcodes/vm', 'glimmer-runtime/lib/compiled/opcodes/component', 'glimmer-runtime/lib/compiled/opcodes/dom', 'glimmer-runtime/lib/dom/change-lists', 'glimmer-runtime/lib/compiled/opcodes/content', 'glimmer-runtime/lib/compiled/expressions', 'glimmer-runtime/lib/compiled/expressions/args', 'glimmer-runtime/lib/compiled/expressions/value', 'glimmer-runtime/lib/compiled/expressions/function', 'glimmer-runtime/lib/compiled/opcodes/lists', 'glimmer-runtime/lib/helpers/get-dynamic-var', 'glimmer-runtime/lib/syntax/builtins/with-dynamic-vars', 'glimmer-runtime/lib/vm', 'glimmer-runtime/lib/upsert', 'glimmer-runtime/lib/environment', 'glimmer-runtime/lib/partial', 'glimmer-runtime/lib/component/interfaces', 'glimmer-runtime/lib/modifier/interfaces', 'glimmer-runtime/lib/dom/helper', 'glimmer-runtime/lib/builder', 'glimmer-runtime/lib/bounds'], function (exports, _glimmerRuntimeLibDomInterfaces, _glimmerRuntimeLibSyntax, _glimmerRuntimeLibTemplate, _glimmerRuntimeLibSymbolTable, _glimmerRuntimeLibReferences, _glimmerRuntimeLibSyntaxCore, _glimmerRuntimeLibCompiler, _glimmerRuntimeLibOpcodeBuilder, _glimmerRuntimeLibCompiledOpcodesBuilder, _glimmerRuntimeLibCompiledBlocks, _glimmerRuntimeLibOpcodes, _glimmerRuntimeLibCompiledOpcodesVm, _glimmerRuntimeLibCompiledOpcodesComponent, _glimmerRuntimeLibCompiledOpcodesDom, _glimmerRuntimeLibDomChangeLists, _glimmerRuntimeLibCompiledOpcodesContent, _glimmerRuntimeLibCompiledExpressions, _glimmerRuntimeLibCompiledExpressionsArgs, _glimmerRuntimeLibCompiledExpressionsValue, _glimmerRuntimeLibCompiledExpressionsFunction, _glimmerRuntimeLibCompiledOpcodesLists, _glimmerRuntimeLibHelpersGetDynamicVar, _glimmerRuntimeLibSyntaxBuiltinsWithDynamicVars, _glimmerRuntimeLibVm, _glimmerRuntimeLibUpsert, _glimmerRuntimeLibEnvironment, _glimmerRuntimeLibPartial, _glimmerRuntimeLibComponentInterfaces, _glimmerRuntimeLibModifierInterfaces, _glimmerRuntimeLibDomHelper, _glimmerRuntimeLibBuilder, _glimmerRuntimeLibBounds) { +enifed('glimmer-runtime/index', ['exports', 'glimmer-runtime/lib/dom/interfaces', 'glimmer-runtime/lib/syntax', 'glimmer-runtime/lib/template', 'glimmer-runtime/lib/symbol-table', 'glimmer-runtime/lib/references', 'glimmer-runtime/lib/syntax/core', 'glimmer-runtime/lib/compiled/opcodes/builder', 'glimmer-runtime/lib/compiler', 'glimmer-runtime/lib/opcode-builder', 'glimmer-runtime/lib/compiled/blocks', 'glimmer-runtime/lib/dom/change-lists', 'glimmer-runtime/lib/compiled/opcodes/content', 'glimmer-runtime/lib/compiled/expressions', 'glimmer-runtime/lib/compiled/expressions/args', 'glimmer-runtime/lib/compiled/expressions/value', 'glimmer-runtime/lib/compiled/expressions/function', 'glimmer-runtime/lib/helpers/get-dynamic-var', 'glimmer-runtime/lib/syntax/builtins/with-dynamic-vars', 'glimmer-runtime/lib/vm', 'glimmer-runtime/lib/upsert', 'glimmer-runtime/lib/environment', 'glimmer-runtime/lib/partial', 'glimmer-runtime/lib/component/interfaces', 'glimmer-runtime/lib/modifier/interfaces', 'glimmer-runtime/lib/dom/helper', 'glimmer-runtime/lib/builder', 'glimmer-runtime/lib/bounds'], function (exports, _glimmerRuntimeLibDomInterfaces, _glimmerRuntimeLibSyntax, _glimmerRuntimeLibTemplate, _glimmerRuntimeLibSymbolTable, _glimmerRuntimeLibReferences, _glimmerRuntimeLibSyntaxCore, _glimmerRuntimeLibCompiledOpcodesBuilder, _glimmerRuntimeLibCompiler, _glimmerRuntimeLibOpcodeBuilder, _glimmerRuntimeLibCompiledBlocks, _glimmerRuntimeLibDomChangeLists, _glimmerRuntimeLibCompiledOpcodesContent, _glimmerRuntimeLibCompiledExpressions, _glimmerRuntimeLibCompiledExpressionsArgs, _glimmerRuntimeLibCompiledExpressionsValue, _glimmerRuntimeLibCompiledExpressionsFunction, _glimmerRuntimeLibHelpersGetDynamicVar, _glimmerRuntimeLibSyntaxBuiltinsWithDynamicVars, _glimmerRuntimeLibVm, _glimmerRuntimeLibUpsert, _glimmerRuntimeLibEnvironment, _glimmerRuntimeLibPartial, _glimmerRuntimeLibComponentInterfaces, _glimmerRuntimeLibModifierInterfaces, _glimmerRuntimeLibDomHelper, _glimmerRuntimeLibBuilder, _glimmerRuntimeLibBounds) { 'use strict'; exports.ATTRIBUTE_SYNTAX = _glimmerRuntimeLibSyntax.ATTRIBUTE; exports.StatementSyntax = _glimmerRuntimeLibSyntax.Statement; exports.ExpressionSyntax = _glimmerRuntimeLibSyntax.Expression; @@ -14552,49 +13306,23 @@ exports.OpenElement = _glimmerRuntimeLibSyntaxCore.OpenElement; exports.HelperSyntax = _glimmerRuntimeLibSyntaxCore.Helper; exports.BlockSyntax = _glimmerRuntimeLibSyntaxCore.Block; exports.OpenPrimitiveElementSyntax = _glimmerRuntimeLibSyntaxCore.OpenPrimitiveElement; exports.CloseElementSyntax = _glimmerRuntimeLibSyntaxCore.CloseElement; + exports.OpcodeBuilderDSL = _glimmerRuntimeLibCompiledOpcodesBuilder.default; exports.Compiler = _glimmerRuntimeLibCompiler.default; exports.Compilable = _glimmerRuntimeLibCompiler.Compilable; exports.CompileIntoList = _glimmerRuntimeLibCompiler.CompileIntoList; exports.compileLayout = _glimmerRuntimeLibCompiler.compileLayout; exports.ComponentBuilder = _glimmerRuntimeLibOpcodeBuilder.ComponentBuilder; exports.StaticDefinition = _glimmerRuntimeLibOpcodeBuilder.StaticDefinition; exports.DynamicDefinition = _glimmerRuntimeLibOpcodeBuilder.DynamicDefinition; - exports.OpcodeBuilderDSL = _glimmerRuntimeLibCompiledOpcodesBuilder.default; exports.Block = _glimmerRuntimeLibCompiledBlocks.Block; exports.CompiledBlock = _glimmerRuntimeLibCompiledBlocks.CompiledBlock; exports.Layout = _glimmerRuntimeLibCompiledBlocks.Layout; exports.InlineBlock = _glimmerRuntimeLibCompiledBlocks.InlineBlock; exports.EntryPoint = _glimmerRuntimeLibCompiledBlocks.EntryPoint; - exports.Opcode = _glimmerRuntimeLibOpcodes.Opcode; - exports.OpSeq = _glimmerRuntimeLibOpcodes.OpSeq; - exports.OpSeqBuilder = _glimmerRuntimeLibOpcodes.OpSeqBuilder; - exports.inspectOpcodes = _glimmerRuntimeLibOpcodes.inspect; - exports.PushChildScopeOpcode = _glimmerRuntimeLibCompiledOpcodesVm.PushChildScopeOpcode; - exports.PopScopeOpcode = _glimmerRuntimeLibCompiledOpcodesVm.PopScopeOpcode; - exports.PushDynamicScopeOpcode = _glimmerRuntimeLibCompiledOpcodesVm.PushDynamicScopeOpcode; - exports.PopDynamicScopeOpcode = _glimmerRuntimeLibCompiledOpcodesVm.PopDynamicScopeOpcode; - exports.PutValueOpcode = _glimmerRuntimeLibCompiledOpcodesVm.PutValueOpcode; - exports.PutNullOpcode = _glimmerRuntimeLibCompiledOpcodesVm.PutNullOpcode; - exports.PutArgsOpcode = _glimmerRuntimeLibCompiledOpcodesVm.PutArgsOpcode; - exports.LabelOpcode = _glimmerRuntimeLibCompiledOpcodesVm.LabelOpcode; - exports.EnterOpcode = _glimmerRuntimeLibCompiledOpcodesVm.EnterOpcode; - exports.ExitOpcode = _glimmerRuntimeLibCompiledOpcodesVm.ExitOpcode; - exports.EvaluateOpcode = _glimmerRuntimeLibCompiledOpcodesVm.EvaluateOpcode; - exports.TestOpcode = _glimmerRuntimeLibCompiledOpcodesVm.TestOpcode; - exports.JumpOpcode = _glimmerRuntimeLibCompiledOpcodesVm.JumpOpcode; - exports.JumpIfOpcode = _glimmerRuntimeLibCompiledOpcodesVm.JumpIfOpcode; - exports.JumpUnlessOpcode = _glimmerRuntimeLibCompiledOpcodesVm.JumpUnlessOpcode; - exports.BindNamedArgsOpcode = _glimmerRuntimeLibCompiledOpcodesVm.BindNamedArgsOpcode; - exports.BindDynamicScopeOpcode = _glimmerRuntimeLibCompiledOpcodesVm.BindDynamicScopeOpcode; - exports.OpenComponentOpcode = _glimmerRuntimeLibCompiledOpcodesComponent.OpenComponentOpcode; - exports.CloseComponentOpcode = _glimmerRuntimeLibCompiledOpcodesComponent.CloseComponentOpcode; - exports.ShadowAttributesOpcode = _glimmerRuntimeLibCompiledOpcodesComponent.ShadowAttributesOpcode; - exports.OpenPrimitiveElementOpcode = _glimmerRuntimeLibCompiledOpcodesDom.OpenPrimitiveElementOpcode; - exports.CloseElementOpcode = _glimmerRuntimeLibCompiledOpcodesDom.CloseElementOpcode; exports.IChangeList = _glimmerRuntimeLibDomChangeLists.IChangeList; exports.AttributeChangeList = _glimmerRuntimeLibDomChangeLists.AttributeChangeList; exports.PropertyChangeList = _glimmerRuntimeLibDomChangeLists.PropertyChangeList; exports.SafeHrefAttributeChangeList = _glimmerRuntimeLibDomChangeLists.SafeHrefAttributeChangeList; exports.SafeHrefPropertyChangeList = _glimmerRuntimeLibDomChangeLists.SafeHrefPropertyChangeList; @@ -14611,14 +13339,10 @@ exports.EvaluatedArgs = _glimmerRuntimeLibCompiledExpressionsArgs.EvaluatedArgs; exports.EvaluatedNamedArgs = _glimmerRuntimeLibCompiledExpressionsArgs.EvaluatedNamedArgs; exports.EvaluatedPositionalArgs = _glimmerRuntimeLibCompiledExpressionsArgs.EvaluatedPositionalArgs; exports.ValueReference = _glimmerRuntimeLibCompiledExpressionsValue.ValueReference; exports.FunctionExpression = _glimmerRuntimeLibCompiledExpressionsFunction.FunctionExpression; - exports.EnterListOpcode = _glimmerRuntimeLibCompiledOpcodesLists.EnterListOpcode; - exports.ExitListOpcode = _glimmerRuntimeLibCompiledOpcodesLists.ExitListOpcode; - exports.EnterWithKeyOpcode = _glimmerRuntimeLibCompiledOpcodesLists.EnterWithKeyOpcode; - exports.NextIterOpcode = _glimmerRuntimeLibCompiledOpcodesLists.NextIterOpcode; exports.getDynamicVar = _glimmerRuntimeLibHelpersGetDynamicVar.default; exports.WithDynamicVarsSyntax = _glimmerRuntimeLibSyntaxBuiltinsWithDynamicVars.default; exports.VM = _glimmerRuntimeLibVm.PublicVM; exports.UpdatingVM = _glimmerRuntimeLibVm.UpdatingVM; exports.RenderResult = _glimmerRuntimeLibVm.RenderResult; @@ -14646,11 +13370,11 @@ exports.Simple = _glimmerRuntimeLibDomInterfaces; exports.ElementStack = _glimmerRuntimeLibBuilder.ElementStack; exports.ElementOperations = _glimmerRuntimeLibBuilder.ElementOperations; exports.Bounds = _glimmerRuntimeLibBounds.default; }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcnVudGltZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7VUFDZSxnQkFBZ0IsNEJBQTdCLFNBQVM7VUFDSSxlQUFlLDRCQUE1QixTQUFTO1VBQ0ssZ0JBQWdCLDRCQUE5QixVQUFVO1VBQ0csZUFBZSw0QkFBNUIsU0FBUztVQUNULDBCQUEwQiw0QkFBMUIsMEJBQTBCO1VBQzFCLFlBQVksNEJBQVosWUFBWTtVQUNaLFdBQVcsNEJBQVgsV0FBVztVQUNYLFdBQVcsNEJBQVgsV0FBVztVQUdPLGVBQWUsOEJBQTFCLE9BQU87VUFBcUIsZUFBZSw4QkFBZixlQUFlO1VBQUUsUUFBUSw4QkFBUixRQUFRO1VBRTFDLFdBQVcsaUNBQXRCLE9BQU87VUFFUCxvQkFBb0IsZ0NBQXBCLG9CQUFvQjtVQUFFLGNBQWMsZ0NBQWQsY0FBYztVQUFFLG1CQUFtQixnQ0FBbkIsbUJBQW1CO1VBR2hFLFNBQVMsZ0NBQVQsU0FBUztVQUNULGVBQWUsZ0NBQWYsZUFBZTtVQUNmLGlCQUFpQixnQ0FBakIsaUJBQWlCO1VBQ2pCLE9BQU8sZ0NBQVAsT0FBTztVQUNQLFVBQVUsZ0NBQVYsVUFBVTtVQUNWLFdBQVcsZ0NBQVgsV0FBVztVQUNILFVBQVUsZ0NBQWxCLElBQUk7VUFDUyxlQUFlLGdDQUE1QixTQUFTO1VBQ1Msb0JBQW9CLGdDQUF0QyxjQUFjO1VBQ1AsU0FBUyxnQ0FBaEIsR0FBRztVQUNZLHVCQUF1QixnQ0FBdEMsV0FBVztVQUNKLFNBQVMsZ0NBQWhCLEdBQUc7VUFDTSxXQUFXLGdDQUFwQixLQUFLO1VBQ0wsV0FBVyxnQ0FBWCxXQUFXO1VBQ0QsWUFBWSxnQ0FBdEIsTUFBTTtVQUNHLFdBQVcsZ0NBQXBCLEtBQUs7VUFDbUIsMEJBQTBCLGdDQUFsRCxvQkFBb0I7VUFDSixrQkFBa0IsZ0NBQWxDLFlBQVk7VUFJRCxRQUFRLDhCQUFuQixPQUFPO1VBQ1AsVUFBVSw4QkFBVixVQUFVO1VBQ1YsZUFBZSw4QkFBZixlQUFlO1VBQ2YsYUFB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Qix5Q0FBbkIsbUJBQW1CO1VBQ25CLHNCQUFzQix5Q0FBdEIsc0JBQXNCO1VBQ3RCLHFCQUFxQix5Q0FBckIscUJBQXFCO1VBQ3JCLHFCQUFxQix5Q0FBckIscUJBQXFCO1VBSXJCLGVBQWUsd0NBQWYsZUFBZTtVQUdHLFVBQVUsK0JBQXJCLE9BQU87VUFBOEIsV0FBVywrQkFBekIsVUFBVTtVQUFpQixtQkFBbUIsK0JBQW5CLG1CQUFtQjtVQUFFLFlBQVksK0JBQVosWUFBWTtVQUFFLGdCQUFnQiwrQkFBaEIsZ0JBQWdCO1VBRXJHLE1BQU07VUFDTixZQUFZLDZCQUFaLFlBQVk7VUFBRSxpQkFBaUIsNkJBQWpCLGlCQUFpQjtVQUNwQixNQUFNLDRCQUFqQixPQUFPIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgQVRUUklCVVRFIGFzIEFUVFJJQlVURV9TWU5UQVgsXG4gIFN0YXRlbWVudCBhcyBTdGF0ZW1lbnRTeW50YXgsXG4gIEV4cHJlc3Npb24gYXMgRXhwcmVzc2lvblN5bnRheCxcbiAgQXR0cmlidXRlIGFzIEF0dHJpYnV0ZVN5bnRheCxcbiAgU3RhdGVtZW50Q29tcGlsYXRpb25CdWZmZXIsXG4gIFN5bWJvbExvb2t1cCxcbiAgQ29tcGlsZUludG8sXG4gIGlzQXR0cmlidXRlXG59IGZyb20gJy4vbGliL3N5bnRheCc7XG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgdGVtcGxhdGVGYWN0b3J5LCBUZW1wbGF0ZUZhY3RvcnksIFRlbXBsYXRlIH0gZnJvbSAnLi9saWIvdGVtcGxhdGUnO1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIFN5bWJvbFRhYmxlIH0gZnJvbSAnLi9saWIvc3ltYm9sLXRhYmxlJztcblxuZXhwb3J0IHsgQ29uZGl0aW9uYWxSZWZlcmVuY2UsIE5VTExfUkVGRVJFTkNFLCBVTkRFRklORURfUkVGRVJFTkNFIH0gZnJvbSAnLi9saWIvcmVmZXJlbmNlcyc7XG5cbmV4cG9ydCB7XG4gIFRlbXBsYXRlcyxcbiAgT3B0aW1pemVkQXBwZW5kLFxuICBVbm9wdGltaXplZEFwcGVuZCxcbiAgVW5rbm93bixcbiAgU3RhdGljQXR0cixcbiAgRHluYW1pY0F0dHIsXG4gIEFyZ3MgYXMgQXJnc1N5bnRheCxcbiAgTmFtZWRBcmdzIGFzIE5hbWVkQXJnc1N5bnRheCxcbiAgUG9zaXRpb25hbEFyZ3MgYXMgUG9zaXRpb25hbEFyZ3NTeW50YXgsXG4gIFJlZiBhcyBSZWZTeW50YXgsXG4gIEdldEFyZ3VtZW50IGFzIEdldE5hbWVkUGFyYW1ldGVyU3ludGF4LFxuICBHZXQgYXMgR2V0U3ludGF4LFxuICBWYWx1ZSBhcyBWYWx1ZVN5bnRheCxcbiAgT3BlbkVsZW1lbnQsXG4gIEhlbHBlciBhcyBIZWxwZXJTeW50YXgsXG4gIEJsb2NrIGFzIEJsb2NrU3ludGF4LFxuICBPcGVuUHJpbWl0aXZlRWxlbWVudCBhcyBPcGVuUHJpbWl0aXZlRWxlbWVudFN5bnRheCxcbiAgQ2xvc2VFbGVtZW50IGFzIENsb3NlRWxlbWVudFN5bnRheFxufSBmcm9tICcuL2xpYi9zeW50YXgvY29yZSc7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgQ29tcGlsZXIsXG4gIENvbXBpbGFibGUsXG4gIENvbXBpbGVJbnRvTGlzdCxcbiAgY29tcGlsZUxheW91dFxufSBmcm9tICcuL2xpYi9jb21waWxlcic7XG5cbmV4cG9ydCB7XG4gIENvbXBvbmVudEJ1aWxkZXIsXG4gIFN0YXRpY0RlZmluaXRpb24sXG4gIER5bmFtaWNEZWZpbml0aW9uXG59IGZyb20gJy4vbGliL29wY29kZS1idWlsZGVyJztcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBPcGNvZGVCdWlsZGVyRFNMXG59IGZyb20gJy4vbGliL2NvbXBpbGVkL29wY29kZXMvYnVpbGRlcic7XG5cbmV4cG9ydCB7XG4gIEJsb2NrLFxuICBDb21waWxlZEJsb2NrLFxuICBMYXlvdXQsXG4gIElubGluZUJsb2NrLFxuICBFbnRyeVBvaW50XG59IGZyb20gJy4vbGliL2NvbXBpbGVkL2Jsb2Nrcyc7XG5cbmV4cG9ydCB7XG4gIE9wY29kZSxcbiAgT3BTZXEsXG4gIE9wU2VxQnVpbGRlcixcbiAgaW5zcGVjdCBhcyBpbnNwZWN0T3Bjb2Rlc1xufSBmcm9tICcuL2xpYi9vcGNvZGVzJztcblxuZXhwb3J0IHtcbiAgUHVzaENoaWxkU2NvcGVPcGNvZGUsXG4gIFBvcFNjb3BlT3Bjb2RlLFxuICBQdXNoRHluYW1pY1Njb3BlT3Bjb2RlLFxuICBQb3BEeW5hbWljU2NvcGVPcGNvZGUsXG4gIFB1dFZhbHVlT3Bjb2RlLFxuICBQdXROdWxsT3Bjb2RlLFxuICBQdXRBcmdzT3Bjb2RlLFxuICBMYWJlbE9wY29kZSxcbiAgRW50ZXJPcGNvZGUsXG4gIEV4aXRPcGNvZGUsXG4gIEV2YWx1YXRlT3Bjb2RlLFxuICBUZXN0T3Bjb2RlLFxuICBKdW1wT3Bjb2RlLFxuICBKdW1wSWZPcGNvZGUsXG4gIEp1bXBVbmxlc3NPcGNvZGUsXG4gIEJpbmROYW1lZEFyZ3NPcGNvZGUsXG4gIEJpbmREeW5hbWljU2NvcGVPcGNvZGVcbn0gZnJvbSAnLi9saWIvY29tcGlsZWQvb3Bjb2Rlcy92bSc7XG5cbmV4cG9ydCB7XG4gIE9wZW5Db21wb25lbnRPcGNvZGUsXG4gIENsb3NlQ29tcG9uZW50T3Bjb2RlLFxuICBTaGFkb3dBdHRyaWJ1dGVzT3Bjb2RlXG59IGZyb20gJy4vbGliL2NvbXBpbGVkL29wY29kZXMvY29tcG9uZW50JztcblxuZXhwb3J0IHtcbiAgT3BlblByaW1pdGl2ZUVsZW1lbnRPcGNvZGUsXG4gIENsb3NlRWxlbWVudE9wY29kZVxufSBmcm9tICcuL2xpYi9jb21waWxlZC9vcGNvZGVzL2RvbSc7XG5cbmV4cG9ydCB7XG4gIElDaGFuZ2VMaXN0LFxuICBBdHRyaWJ1dGVDaGFuZ2VMaXN0LFxuICBQcm9wZXJ0eUNoYW5nZUxpc3QsXG4gIFNhZmVIcmVmQXR0cmlidXRlQ2hhbmdlTGlzdCxcbiAgU2FmZUhyZWZQcm9wZXJ0eUNoYW5nZUxpc3QsXG4gIElucHV0VmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3QsXG4gIGRlZmF1bHRDaGFuZ2VMaXN0cyxcbiAgZGVmYXVsdEF0dHJpYnV0ZUNoYW5nZUxpc3RzLFxuICBkZWZhdWx0UHJvcGVydHlDaGFuZ2VMaXN0cyxcbiAgcmVhZERPTUF0dHJcbn0gZnJvbSAnLi9saWIvZG9tL2NoYW5nZS1saXN0cyc7XG5cbmV4cG9ydCB7XG4gIG5vcm1hbGl6ZVRleHRWYWx1ZVxufSBmcm9tICcuL2xpYi9jb21waWxlZC9vcGNvZGVzL2NvbnRlbnQnO1xuXG5leHBvcnQge1xuICBDb21waWxlZEV4cHJlc3Npb25cbn0gZnJvbSAnLi9saWIvY29tcGlsZWQvZXhwcmVzc2lvbnMnO1xuXG5leHBvcnQge1xuICBDb21waWxlZEFyZ3MsXG4gIENvbXBpbGVkTmFtZWRBcmdzLFxuICBDb21waWxlZFBvc2l0aW9uYWxBcmdzLFxuICBFdmFsdWF0ZWRBcmdzLFxuICBFdmFsdWF0ZWROYW1lZEFyZ3MsXG4gIEV2YWx1YXRlZFBvc2l0aW9uYWxBcmdzXG59IGZyb20gJy4vbGliL2NvbXBpbGVkL2V4cHJlc3Npb25zL2FyZ3MnO1xuXG5leHBvcnQge1xuICBWYWx1ZVJlZmVyZW5jZVxufSBmcm9tICcuL2xpYi9jb21waWxlZC9leHByZXNzaW9ucy92YWx1ZSc7XG5cbmV4cG9ydCB7XG4gIEZ1bmN0aW9uRXhwcmVzc2lvblxufSBmcm9tICcuL2xpYi9jb21waWxlZC9leHByZXNzaW9ucy9mdW5jdGlvbic7XG5cbmV4cG9ydCB7XG4gIEVudGVyTGlzdE9wY29kZSxcbiAgRXhpdExpc3RPcGNvZGUsXG4gIEVudGVyV2l0aEtleU9wY29kZSxcbiAgTmV4dEl0ZXJPcGNvZGVcbn0gZnJvbSAnLi9saWIvY29tcGlsZWQvb3Bjb2Rlcy9saXN0cyc7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgZ2V0RHluYW1pY1ZhclxufSBmcm9tICcuL2xpYi9oZWxwZXJzL2dldC1keW5hbWljLXZhcic7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgV2l0aER5bmFtaWNWYXJzU3ludGF4XG59IGZyb20gJy4vbGliL3N5bnRheC9idWlsdGlucy93aXRoLWR5bmFtaWMtdmFycyc7XG5cbmV4cG9ydCB7IFB1YmxpY1ZNIGFzIFZNLCBVcGRhdGluZ1ZNLCBSZW5kZXJSZXN1bHQgfSBmcm9tICcuL2xpYi92bSc7XG5cbmV4cG9ydCB7IFNhZmVTdHJpbmcsIGlzU2FmZVN0cmluZyB9IGZyb20gJy4vbGliL3Vwc2VydCc7XG5cbmV4cG9ydCB7XG4gIFNjb3BlLFxuICBkZWZhdWx0IGFzIEVudmlyb25tZW50LFxuICBIZWxwZXIsXG4gIFBhcnNlZFN0YXRlbWVudCxcbiAgRHluYW1pY1Njb3BlLFxufSBmcm9tICcuL2xpYi9lbnZpcm9ubWVudCc7XG5cbmV4cG9ydCB7XG4gIFBhcnRpYWxEZWZpbml0aW9uXG59IGZyb20gJy4vbGliL3BhcnRpYWwnO1xuXG5leHBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbXBvbmVudENsYXNzLFxuICBDb21wb25lbnRNYW5hZ2VyLFxuICBDb21wb25lbnREZWZpbml0aW9uLFxuICBDb21wb25lbnRMYXlvdXRCdWlsZGVyLFxuICBDb21wb25lbnRBdHRyc0J1aWxkZXIsXG4gIGlzQ29tcG9uZW50RGVmaW5pdGlvblxufSBmcm9tICcuL2xpYi9jb21wb25lbnQvaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB7XG4gIE1vZGlmaWVyTWFuYWdlclxufSBmcm9tICcuL2xpYi9tb2RpZmllci9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBET01DaGFuZ2VzLCBET01DaGFuZ2VzIGFzIElET01DaGFuZ2VzLCBET01UcmVlQ29uc3RydWN0aW9uLCBpc1doaXRlc3BhY2UsIGluc2VydEhUTUxCZWZvcmUgfSBmcm9tICcuL2xpYi9kb20vaGVscGVyJztcbmltcG9ydCAgKiBhcyBTaW1wbGUgZnJvbSAnLi9saWIvZG9tL2ludGVyZmFjZXMnO1xuZXhwb3J0IHsgU2ltcGxlIH07XG5leHBvcnQgeyBFbGVtZW50U3RhY2ssIEVsZW1lbnRPcGVyYXRpb25zIH0gZnJvbSAnLi9saWIvYnVpbGRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJvdW5kcyB9IGZyb20gJy4vbGliL2JvdW5kcyc7XG4iXX0= +//# sourceMappingURL=data:application/json;base64,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LEtBQUs7VUFDTSxXQUFXLGlDQUF0QixPQUFPO1VBQ1AsTUFBTSxpQ0FBTixNQUFNO1VBQ04sZUFBZSxpQ0FBZixlQUFlO1VBQ2YsWUFBWSxpQ0FBWixZQUFZO1VBSVosaUJBQWlCLDZCQUFqQixpQkFBaUI7VUFJakIsU0FBUyx5Q0FBVCxTQUFTO1VBQ1QsY0FBYyx5Q0FBZCxjQUFjO1VBQ2QsZ0JBQWdCLHlDQUFoQixnQkFBZ0I7VUFDaEIsbUJBQW1CLHlDQUFuQixtQkFBbUI7VUFDbkIsc0JBQXNCLHlDQUF0QixzQkFBc0I7VUFDdEIscUJBQXFCLHlDQUFyQixxQkFBcUI7VUFDckIscUJBQXFCLHlDQUFyQixxQkFBcUI7VUFJckIsZUFBZSx3Q0FBZixlQUFlO1VBR0csVUFBVSwrQkFBckIsT0FBTztVQUE4QixXQUFXLCtCQUF6QixVQUFVO1VBQWlCLG1CQUFtQiwrQkFBbkIsbUJBQW1CO1VBQUUsWUFBWSwrQkFBWixZQUFZO1VBQUUsZ0JBQWdCLCtCQUFoQixnQkFBZ0I7VUFFckcsTUFBTTtVQUNOLFlBQVksNkJBQVosWUFBWTtVQUFFLGlCQUFpQiw2QkFBakIsaUJBQWlCO1VBQ3BCLE1BQU0sNEJBQWpCLE9BQU8iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBBVFRSSUJVVEUgYXMgQVRUUklCVVRFX1NZTlRBWCxcbiAgU3RhdGVtZW50IGFzIFN0YXRlbWVudFN5bnRheCxcbiAgRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uU3ludGF4LFxuICBBdHRyaWJ1dGUgYXMgQXR0cmlidXRlU3ludGF4LFxuICBTdGF0ZW1lbnRDb21waWxhdGlvbkJ1ZmZlcixcbiAgU3ltYm9sTG9va3VwLFxuICBDb21waWxlSW50byxcbiAgaXNBdHRyaWJ1dGVcbn0gZnJvbSAnLi9saWIvc3ludGF4JztcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZW1wbGF0ZUZhY3RvcnksIFRlbXBsYXRlRmFjdG9yeSwgVGVtcGxhdGUgfSBmcm9tICcuL2xpYi90ZW1wbGF0ZSc7XG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3ltYm9sVGFibGUgfSBmcm9tICcuL2xpYi9zeW1ib2wtdGFibGUnO1xuXG5leHBvcnQgeyBDb25kaXRpb25hbFJlZmVyZW5jZSwgTlVMTF9SRUZFUkVOQ0UsIFVOREVGSU5FRF9SRUZFUkVOQ0UgfSBmcm9tICcuL2xpYi9yZWZlcmVuY2VzJztcblxuZXhwb3J0IHtcbiAgVGVtcGxhdGVzLFxuICBPcHRpbWl6ZWRBcHBlbmQsXG4gIFVub3B0aW1pemVkQXBwZW5kLFxuICBVbmtub3duLFxuICBTdGF0aWNBdHRyLFxuICBEeW5hbWljQXR0cixcbiAgQXJncyBhcyBBcmdzU3ludGF4LFxuICBOYW1lZEFyZ3MgYXMgTmFtZWRBcmdzU3ludGF4LFxuICBQb3NpdGlvbmFsQXJncyBhcyBQb3NpdGlvbmFsQXJnc1N5bnRheCxcbiAgUmVmIGFzIFJlZlN5bnRheCxcbiAgR2V0QXJndW1lbnQgYXMgR2V0TmFtZWRQYXJhbWV0ZXJTeW50YXgsXG4gIEdldCBhcyBHZXRTeW50YXgsXG4gIFZhbHVlIGFzIFZhbHVlU3ludGF4LFxuICBPcGVuRWxlbWVudCxcbiAgSGVscGVyIGFzIEhlbHBlclN5bnRheCxcbiAgQmxvY2sgYXMgQmxvY2tTeW50YXgsXG4gIE9wZW5QcmltaXRpdmVFbGVtZW50IGFzIE9wZW5QcmltaXRpdmVFbGVtZW50U3ludGF4LFxuICBDbG9zZUVsZW1lbnQgYXMgQ2xvc2VFbGVtZW50U3ludGF4XG59IGZyb20gJy4vbGliL3N5bnRheC9jb3JlJztcblxuZXhwb3J0IHtcbiAgIGRlZmF1bHQgYXMgT3Bjb2RlQnVpbGRlckRTTFxufSBmcm9tICcuL2xpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXInO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIENvbXBpbGVyLFxuICBDb21waWxhYmxlLFxuICBDb21waWxlSW50b0xpc3QsXG4gIGNvbXBpbGVMYXlvdXRcbn0gZnJvbSAnLi9saWIvY29tcGlsZXInO1xuXG5leHBvcnQge1xuICBDb21wb25lbnRCdWlsZGVyLFxuICBTdGF0aWNEZWZpbml0aW9uLFxuICBEeW5hbWljRGVmaW5pdGlvblxufSBmcm9tICcuL2xpYi9vcGNvZGUtYnVpbGRlcic7XG5cbmV4cG9ydCB7XG4gIEJsb2NrLFxuICBDb21waWxlZEJsb2NrLFxuICBMYXlvdXQsXG4gIElubGluZUJsb2NrLFxuICBFbnRyeVBvaW50XG59IGZyb20gJy4vbGliL2NvbXBpbGVkL2Jsb2Nrcyc7XG5cbmV4cG9ydCB7XG4gIElDaGFuZ2VMaXN0LFxuICBBdHRyaWJ1dGVDaGFuZ2VMaXN0LFxuICBQcm9wZXJ0eUNoYW5nZUxpc3QsXG4gIFNhZmVIcmVmQXR0cmlidXRlQ2hhbmdlTGlzdCxcbiAgU2FmZUhyZWZQcm9wZXJ0eUNoYW5nZUxpc3QsXG4gIElucHV0VmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3QsXG4gIGRlZmF1bHRDaGFuZ2VMaXN0cyxcbiAgZGVmYXVsdEF0dHJpYnV0ZUNoYW5nZUxpc3RzLFxuICBkZWZhdWx0UHJvcGVydHlDaGFuZ2VMaXN0cyxcbiAgcmVhZERPTUF0dHJcbn0gZnJvbSAnLi9saWIvZG9tL2NoYW5nZS1saXN0cyc7XG5cbmV4cG9ydCB7XG4gIG5vcm1hbGl6ZVRleHRWYWx1ZVxufSBmcm9tICcuL2xpYi9jb21waWxlZC9vcGNvZGVzL2NvbnRlbnQnO1xuXG5leHBvcnQge1xuICBDb21waWxlZEV4cHJlc3Npb25cbn0gZnJvbSAnLi9saWIvY29tcGlsZWQvZXhwcmVzc2lvbnMnO1xuXG5leHBvcnQge1xuICBDb21waWxlZEFyZ3MsXG4gIENvbXBpbGVkTmFtZWRBcmdzLFxuICBDb21waWxlZFBvc2l0aW9uYWxBcmdzLFxuICBFdmFsdWF0ZWRBcmdzLFxuICBFdmFsdWF0ZWROYW1lZEFyZ3MsXG4gIEV2YWx1YXRlZFBvc2l0aW9uYWxBcmdzXG59IGZyb20gJy4vbGliL2NvbXBpbGVkL2V4cHJlc3Npb25zL2FyZ3MnO1xuXG5leHBvcnQge1xuICBWYWx1ZVJlZmVyZW5jZVxufSBmcm9tICcuL2xpYi9jb21waWxlZC9leHByZXNzaW9ucy92YWx1ZSc7XG5cbmV4cG9ydCB7XG4gIEZ1bmN0aW9uRXhwcmVzc2lvblxufSBmcm9tICcuL2xpYi9jb21waWxlZC9leHByZXNzaW9ucy9mdW5jdGlvbic7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgZ2V0RHluYW1pY1ZhclxufSBmcm9tICcuL2xpYi9oZWxwZXJzL2dldC1keW5hbWljLXZhcic7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgV2l0aER5bmFtaWNWYXJzU3ludGF4XG59IGZyb20gJy4vbGliL3N5bnRheC9idWlsdGlucy93aXRoLWR5bmFtaWMtdmFycyc7XG5cbmV4cG9ydCB7IFB1YmxpY1ZNIGFzIFZNLCBVcGRhdGluZ1ZNLCBSZW5kZXJSZXN1bHQgfSBmcm9tICcuL2xpYi92bSc7XG5cbmV4cG9ydCB7IFNhZmVTdHJpbmcsIGlzU2FmZVN0cmluZyB9IGZyb20gJy4vbGliL3Vwc2VydCc7XG5cbmV4cG9ydCB7XG4gIFNjb3BlLFxuICBkZWZhdWx0IGFzIEVudmlyb25tZW50LFxuICBIZWxwZXIsXG4gIFBhcnNlZFN0YXRlbWVudCxcbiAgRHluYW1pY1Njb3BlLFxufSBmcm9tICcuL2xpYi9lbnZpcm9ubWVudCc7XG5cbmV4cG9ydCB7XG4gIFBhcnRpYWxEZWZpbml0aW9uXG59IGZyb20gJy4vbGliL3BhcnRpYWwnO1xuXG5leHBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbXBvbmVudENsYXNzLFxuICBDb21wb25lbnRNYW5hZ2VyLFxuICBDb21wb25lbnREZWZpbml0aW9uLFxuICBDb21wb25lbnRMYXlvdXRCdWlsZGVyLFxuICBDb21wb25lbnRBdHRyc0J1aWxkZXIsXG4gIGlzQ29tcG9uZW50RGVmaW5pdGlvblxufSBmcm9tICcuL2xpYi9jb21wb25lbnQvaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB7XG4gIE1vZGlmaWVyTWFuYWdlclxufSBmcm9tICcuL2xpYi9tb2RpZmllci9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBET01DaGFuZ2VzLCBET01DaGFuZ2VzIGFzIElET01DaGFuZ2VzLCBET01UcmVlQ29uc3RydWN0aW9uLCBpc1doaXRlc3BhY2UsIGluc2VydEhUTUxCZWZvcmUgfSBmcm9tICcuL2xpYi9kb20vaGVscGVyJztcbmltcG9ydCAgKiBhcyBTaW1wbGUgZnJvbSAnLi9saWIvZG9tL2ludGVyZmFjZXMnO1xuZXhwb3J0IHsgU2ltcGxlIH07XG5leHBvcnQgeyBFbGVtZW50U3RhY2ssIEVsZW1lbnRPcGVyYXRpb25zIH0gZnJvbSAnLi9saWIvYnVpbGRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJvdW5kcyB9IGZyb20gJy4vbGliL2JvdW5kcyc7XG4iXX0= enifed("glimmer-runtime/lib/bounds", ["exports"], function (exports) { "use strict"; exports.bounds = bounds; exports.single = single; @@ -17428,11 +16152,11 @@ }; return GuardedTrustingUpdateOpcode; })(GuardedUpdateOpcode); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcnVudGltZS9saWIvY29tcGlsZWQvb3Bjb2Rlcy9jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUErQkEsYUFBQSxPQUFBLENBQWlCLEtBQWEsRUFBQTtBQUM1QixlQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxVQUFVLENBQUM7S0FDekY7O0FBRUssYUFBQSxrQkFBQSxDQUE2QixLQUFhLEVBQUE7QUFDOUMsWUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbEIsbUJBQU8sRUFBRSxDQUFDO1NBQ1g7QUFDRCxlQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN0Qjs7QUFFSyxhQUFBLHFCQUFBLENBQWdDLEtBQWEsRUFBQTtBQUNqRCxZQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNsQixtQkFBTyxFQUFFLENBQUM7U0FDWDtBQUNELFlBQUkseUJBdkNKLFFBQVEsQ0F1Q0ssS0FBSyxDQUFDLEVBQUU7QUFDbkIsbUJBQU8sS0FBSyxDQUFDO1NBQ2Q7QUFDRCxZQUFJLHlCQTVDSixZQUFZLENBNENLLEtBQUssQ0FBQyxFQUFFO0FBQ3ZCLG1CQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN2QjtBQUNELFlBQUkseUJBOUNKLE1BQU0sQ0E4Q0ssS0FBSyxDQUFDLEVBQUU7QUFDakIsbUJBQU8sS0FBSyxDQUFDO1NBQ2Q7QUFDRCxlQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN0Qjs7QUFFSyxhQUFBLGNBQUEsQ0FBeUIsS0FBYSxFQUFBO0FBQzFDLFlBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ2xCLG1CQUFPLEVBQUUsQ0FBQztTQUNYO0FBQ0QsWUFBSSx5QkF2REosUUFBUSxDQXVESyxLQUFLLENBQUMsRUFBRTtBQUNuQixtQkFBTyxLQUFLLENBQUM7U0FDZDtBQUNELFlBQUkseUJBNURKLFlBQVksQ0E0REssS0FBSyxDQUFDLElBQUkseUJBM0QzQixNQUFNLENBMkQ0QixLQUFLLENBQUMsRUFBRTtBQUN4QyxtQkFBTyxLQUFLLENBQUM7U0FDZDtBQUNELGVBQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3RCOztRQUVLLFlBQWtEOzhCQUFsRCxZQUFrRDs7aUJBQWxELFlBQWtEOzs7O0FBQWxELG9CQUFrRCxXQUt0RCxRQUFRLEdBQUEsa0JBQUMsRUFBTSxFQUFBO0FBQ2IsZ0JBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDdEMsZ0JBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFM0MsZ0JBQUksS0FBSyxZQUFBO2dCQUFFLEtBQUssWUFBQSxDQUFDO0FBRWpCLGdCQUFJLGtCQS9Ec0QsT0FBTyxDQStEckQsU0FBUyxDQUFDLEVBQUU7QUFDdEIscUJBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDNUIsTUFBTTtBQUNMLHFCQUFLLEdBQUcsc0JBbEVNLGNBQWMsQ0FrRUQsVUFBVSxDQUFDLENBQUM7QUFDdkMscUJBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDdEI7QUFFRCxnQkFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3ZCLGdCQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckUsZ0JBQUksTUFBTSxHQUFHLDhCQXJFUixRQUFRLENBcUVhLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV6QyxpQkFBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV4QixnQkFBSSxLQUFLLGlDQUFpQztBQUN4QyxzQkFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2lCQUN0RTtTQUNGOztBQTNCRyxvQkFBa0QsV0E2QnRELE1BQU0sR0FBQSxrQkFBQTtBQUNKLG1CQUFPO0FBQ0wsb0JBQUksRUFBRSxJQUFJLENBQUMsS0FBSztBQUNoQixvQkFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO0FBQ2Ysb0JBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQzthQUNuQixDQUFDO1NBQ0g7O2VBbkNHLFlBQWtEO2lDQXpEeEMsTUFBTTs7OztRQStGaEIsbUJBQXlEOzhCQUF6RCxtQkFBeUQ7O0FBSTdELGlCQUpJLG1CQUF5RCxDQUl6QyxVQUFtQyxFQUFVLFdBQXdCLEVBQUE7QUFDdkYsb0NBQU8sQ0FBQztBQURVLGdCQUFBLENBQUEsVUFBVSxHQUFWLFVBQVUsQ0FBeUI7QUFBVSxnQkFBQSxDQUFBLFdBQVcsR0FBWCxXQUFXLENBQWE7QUFGakYsZ0JBQUEsQ0FBQSxPQUFPLEdBQVUsSUFBSSxDQUFDO1NBSTdCOztBQU5HLDJCQUF5RCxXQVE3RCxRQUFRLEdBQUEsa0JBQUMsRUFBTSxFQUFBO0FBQ2IsZ0JBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNoQixrQkFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDaEMsTUFBTTtBQUNMLGtCQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUVwQyxvQkFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUUxQyxvQkFBRyxzQ0FqSEEscUJBQXFCLENBaUhDLEtBQUssQ0FBQyxFQUFFO0FBQy9CLHNCQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3RDLE1BQU07QUFDTCw0Q0FBTSxRQUFRLEtBQUEsT0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDcEI7YUFDRjtTQUNGOztBQXRCRywyQkFBeUQsV0F3QnRELEtBQUssR0FBQSxlQUFDLEdBQWdCLEVBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QzNCLGdCQUFJLE1BQU0sR0FBRywrQkEzSlIsZUFBZSxDQTJKYSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsZ0JBQUksR0FBRyxHQUFHLHFEQUFxQixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUU5RCxlQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLFVBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUE7QUFDN0MsbUJBQUcsQ0FBQyxRQUFRLENBQUMsTUFBSyxVQUFVLENBQUMsQ0FBQztBQUM5QixtQkFBRyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoRCxtQkFBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN4QixtQkFBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2QixtQkFBRyxDQUFDLDZCQUE2QixFQUFFLENBQUM7QUFDcEMsbUJBQUcsQ0FBQyxhQUFhLENBQUMsNkJBaktmLElBQUksQ0FpS2dCLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDaEMsbUJBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUNyQixtQkFBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLG1CQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25CLG1CQUFHLENBQUMsTUFBTSxDQUFDLElBQUksTUFBSyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDLENBQUMsQ0FBQztBQUVILGdCQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Ozs7QUFPM0MsZ0JBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBRXZCLG1CQUFPLE9BQU8sQ0FBQztTQUNoQjs7QUEvRkcsMkJBQXlELFdBaUc3RCxNQUFNLEdBQUEsa0JBQUE7Z0JBQ1MsSUFBSSxHQUFvQixJQUFJLENBQW5DLEtBQUs7Z0JBQVEsSUFBSSxHQUFjLElBQUksQ0FBdEIsSUFBSTtnQkFBRSxPQUFPLEdBQUssSUFBSSxDQUFoQixPQUFPOztBQUVoQyxnQkFBSSxPQUFPLEVBQUU7QUFDWCx1QkFBTztBQUNMLHdCQUFJLEVBQUosSUFBSTtBQUNKLHdCQUFJLEVBQUosSUFBSTtBQUNKLDJCQUFPLEVBQUUsSUFBSTtBQUNiLDRCQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFBLEVBQUU7K0JBQUksRUFBRSxDQUFDLE1BQU0sRUFBRTtxQkFBQSxDQUFDO2lCQUNuRCxDQUFDO2FBQ0gsTUFBTTtBQUNMLHVCQUFPO0FBQ0wsd0JBQUksRUFBSixJQUFJO0FBQ0osd0JBQUksRUFBSixJQUFJO0FBQ0osd0JBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQ2pDLENBQUM7YUFDSDtTQUNGOztlQWxIRyxtQkFBeUQ7T0FBUSxZQUFlOzs7O1FBcUh0Riw4QkFBcUM7OEJBQXJDLDhCQUFxQzs7aUJBQXJDLDhCQUFxQzs7OztBQUFyQyxzQ0FBcUMsQ0FDNUIsTUFBTSxHQUFBLGdCQUFDLEtBQXdCLEVBQUE7QUFDcEMsbUJBQU8sSUFBSSw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsRDs7QUFISCxzQ0FBcUMsV0FLbkMsTUFBTSxHQUFBLGdCQUFDLEtBQWEsRUFBQTtBQUNsQixtQkFBTyxzQ0E1TkYscUJBQXFCLENBNE5HLEtBQUssQ0FBQyxDQUFDO1NBQ3JDOztlQVBILDhCQUFxQztvQ0F6TTVCLG9CQUFvQjs7UUFtTjdCLFlBQWlEOzhCQUFqRCxZQUFpRDs7QUFDL0MsaUJBREYsWUFBaUQsQ0FFbkMsS0FBd0IsRUFDeEIsTUFBZ0IsRUFDaEIsTUFBYyxFQUFBO0FBRXhCLHNDQUFPLENBQUM7QUFKRSxnQkFBQSxDQUFBLEtBQUssR0FBTCxLQUFLLENBQW1CO0FBQ3hCLGdCQUFBLENBQUEsTUFBTSxHQUFOLE1BQU0sQ0FBVTtBQUNoQixnQkFBQSxDQUFBLE1BQU0sR0FBTixNQUFNLENBQVE7QUFHeEIsZ0JBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUN0Qjs7QUFSSCxvQkFBaUQsV0FZL0MsUUFBUSxHQUFBLGtCQUFDLEVBQWMsRUFBQTtBQUNyQixnQkFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUVwQyxnQkFBSSxrQkF4TzBDLFVBQVUsQ0F3T3pDLEtBQUssQ0FBQyxFQUFFO29CQUNmLE1BQU0sR0FBYSxJQUFJLENBQXZCLE1BQU07b0JBQUUsTUFBTSxHQUFLLElBQUksQ0FBZixNQUFNO29CQUNkLEdBQUcsR0FBSyxFQUFFLENBQVYsR0FBRzs7QUFFVCxvQkFBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRTtBQUNsQyx3QkFBSSxNQUFNLEdBQUcsNkJBM09aLE1BQU0sQ0EyT2lCLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSx5QkEzT3ZDLEtBQUssQ0EyT3dDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0QsMEJBQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDakY7QUFFRCxzQkFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDOUI7U0FDRjs7QUExQkgsb0JBQWlELFdBNEIvQyxNQUFNLEdBQUEsa0JBQUE7Z0JBQ1MsSUFBSSxHQUFrQixJQUFJLENBQWpDLEtBQUs7Z0JBQVEsSUFBSSxHQUFZLElBQUksQ0FBcEIsSUFBSTtnQkFBRSxLQUFLLEdBQUssSUFBSSxDQUFkLEtBQUs7O0FBRTlCLG1CQUFPO0FBQ0wsb0JBQUksRUFBSixJQUFJO0FBQ0osb0JBQUksRUFBSixJQUFJO0FBQ0osdUJBQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2FBQ3JELENBQUM7U0FDSDs7ZUFwQ0gsWUFBaUQ7aUNBOU5iLGNBQWM7O1FBcVE1QyxtQkFBeUQ7OEJBQXpELG1CQUF5RDs7QUFJN0QsaUJBSkksbUJBQXlELENBS25ELFNBQTRCLEVBQ3BDLEtBQXdCLEVBQ3hCLE1BQWdCLEVBQ2hCLE1BQWMsRUFDTixZQUFvQyxFQUNwQyxLQUFjLEVBQUE7QUFFdEIscUNBQU0sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQVByQixnQkFBQSxDQUFBLFNBQVMsR0FBVCxTQUFTLENBQW1CO0FBSTVCLGdCQUFBLENBQUEsWUFBWSxHQUFaLFlBQVksQ0FBd0I7QUFDcEMsZ0JBQUEsQ0FBQSxLQUFLLEdBQUwsS0FBSyxDQUFTO0FBUmhCLGdCQUFBLENBQUEsT0FBTyxHQUFjLElBQUksQ0FBQztBQVdoQyxnQkFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLHNCQTdRUyxZQUFZLENBNlFKLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNuRDs7QUFkRywyQkFBeUQsV0FnQjdELFFBQVEsR0FBQSxrQkFBQyxFQUFjLEVBQUE7QUFDckIsZ0JBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNoQixrQkFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDakMsTUFBTTtBQUNMLG9CQUFJLHNDQTNSRCxxQkFBcUIsQ0EyUkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFO0FBQ2pELHdCQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNwQixNQUFNO0FBQ0wsNENBQU0sUUFBUSxLQUFBLE9BQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3BCO2FBQ0Y7U0FDRjs7QUExQkcsMkJBQXlELFdBNEJyRCxTQUFTLEdBQUEsbUJBQUMsRUFBYyxFQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0JBK0J4QixNQUFNLEdBQTBCLElBQUksQ0FBcEMsTUFBTTtnQkFBRSxZQUFZLEdBQVksSUFBSSxDQUE1QixZQUFZO2dCQUFFLEtBQUssR0FBSyxJQUFJLENBQWQsS0FBSzs7QUFFakMsZ0JBQUksU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLGdCQUFJLEtBQUssR0FBTyxTQUFTLENBQUMsSUFBSSxFQUFpQixDQUFDO0FBQ2hELGdCQUFJLEdBQUcsR0FBUyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBRTVCLGdCQUFJLE9BQU8sR0FBRyw4QkF4VFQscUJBQXFCLENBd1RjLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0FBQ2hFLG1CQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUUvQixnQkFBSSxRQUFRLEdBQUcsaUJBblVGLFVBQVUsRUFtVXdCLENBQUM7QUFFaEQsZ0JBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsK0JBeFV4QixTQUFTLENBd1U2QixHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUUxRSxnQkFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTlCLGNBQUUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsY0FBRSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7OztBQU9YLGdCQUFJLENBQUMsSUFBSSxHQUFXLElBQUksQ0FBQztBQUN6QixnQkFBSSxDQUFDLFNBQVMsR0FBTSxJQUFJLENBQUM7QUFDekIsZ0JBQUksQ0FBQyxLQUFLLEdBQVUsSUFBSSxDQUFDO0FBQ3pCLGdCQUFJLENBQUMsTUFBTSxHQUFTLElBQUksQ0FBQztBQUN6QixnQkFBSSxDQUFDLE1BQU0sR0FBUyxJQUFJLENBQUM7QUFDekIsZ0JBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLGdCQUFJLENBQUMsS0FBSyxHQUFVLElBQUksQ0FBQztTQUMxQjs7QUF6RkcsMkJBQXlELFdBMkY3RCxNQUFNLEdBQUEsa0JBQUE7Z0JBQ1MsSUFBSSxHQUFvQixJQUFJLENBQW5DLEtBQUs7Z0JBQVEsSUFBSSxHQUFjLElBQUksQ0FBdEIsSUFBSTtnQkFBRSxPQUFPLEdBQUssSUFBSSxDQUFoQixPQUFPOztBQUVoQyxnQkFBSSxPQUFPLEVBQUU7QUFDWCx1QkFBTztBQUNMLHdCQUFJLEVBQUosSUFBSTtBQUNKLHdCQUFJLEVBQUosSUFBSTtBQUNKLDJCQUFPLEVBQUUsSUFBSTtBQUNiLDRCQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQzdCLENBQUM7YUFDSCxNQUFNO0FBQ0wsdUJBQU8sd0JBQU0sTUFBTSxLQUFBLE1BQUUsQ0FBQzthQUN2QjtTQUNGOztlQXhHRyxtQkFBeUQ7T0FBUSxZQUFlOzs7O1FBMkdoRiw2QkFBcUM7OEJBQXJDLDZCQUFxQzs7QUFBM0MsaUJBQU0sNkJBQXFDLEdBQTNDO0FDckVRLHVDQUFTLFNBQVMsQ0FBQyxDQUFDO0FEc0UxQixnQkFBQSxDQUFBLElBQUksR0FBRywyQkFBMkIsQ0FBQztTQWFwQzs7QUFkSyxxQ0FBcUMsV0FHL0IsU0FBUyxHQUFBLG1CQUFDLFNBQTRCLEVBQUE7QUFDOUMsbUJBQU8sa0JBL1c0RCxHQUFHLENBK1czRCxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDdkM7O0FBTEcscUNBQXFDLFdBTy9CLE1BQU0sR0FBQSxnQkFBQyxHQUF3QixFQUFFLE1BQWMsRUFBRSxLQUF3QixFQUFBO0FBQ2pGLG1CQUFPLHlCQTdYVCxjQUFjLENBNlhVLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7O0FBVEcscUNBQXFDLFdBVy9CLFVBQVUsR0FBQSxvQkFBQyxFQUFNLEVBQUUsU0FBNEIsRUFBRSxLQUF3QyxFQUFFLE1BQWdCLEVBQUUsTUFBYyxFQUFBO0FBQ25JLG1CQUFPLElBQUksNkJBQTZCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNqRTs7ZUFiRyw2QkFBcUM7T0FBUSxZQUErQjs7OztRQWdCbEYsNkJBQW9DOzhCQUFwQyw2QkFBb0M7O0FBQXBDLGlCQUFBLDZCQUFvQyxHQUFwQztBQ3RFUSx1Q0FBUyxTQUFTLENBQUMsQ0FBQztBRHVFMUIsZ0JBQUEsQ0FBQSxJQUFJLEdBQUcsMkJBQTJCLENBQUM7U0FLcEM7O0FBTkQscUNBQW9DLFdBR3hCLE1BQU0sR0FBQSxnQkFBQyxHQUF3QixFQUFFLE1BQWMsRUFBRSxLQUF3QixFQUFBO0FBQ2pGLG1CQUFPLHlCQXpZVCxjQUFjLENBeVlVLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7O2VBTEgsNkJBQW9DO09BQVEsWUFBK0I7O1FBUXJFLDJCQUFtQzs4QkFBbkMsMkJBQW1DOztBQUF6QyxpQkFBTSwyQkFBbUMsR0FBekM7QUNyRVEsNkNBQVMsU0FBUyxDQUFDLENBQUM7QURzRTFCLGdCQUFBLENBQUEsSUFBSSxHQUFHLHlCQUF5QixDQUFDO0FBRXZCLGdCQUFBLENBQUEsWUFBWSxHQUFHLDZCQUE2QixDQUFDO1NBYXhEOztBQWhCSyxtQ0FBbUMsV0FLN0IsU0FBUyxHQUFBLG1CQUFDLFNBQTRCLEVBQUE7QUFDOUMsbUJBQU8sa0JBelk0RCxHQUFHLENBeVkzRCxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDdkM7O0FBUEcsbUNBQW1DLFdBUzdCLE1BQU0sR0FBQSxnQkFBQyxHQUF3QixFQUFFLE1BQWMsRUFBRSxLQUF3QixFQUFBO0FBQ2pGLG1CQUFPLHlCQXZaVCxjQUFjLENBdVpVLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7O0FBWEcsbUNBQW1DLFdBYTdCLFVBQVUsR0FBQSxvQkFBQyxFQUFNLEVBQUUsU0FBNEIsRUFBRSxLQUF3QyxFQUFFLE1BQWdCLEVBQUUsTUFBYyxFQUFBO0FBQ25JLG1CQUFPLElBQUksMkJBQTJCLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUM5Rjs7ZUFmRywyQkFBbUM7T0FBUSxtQkFBc0M7Ozs7UUFrQnZGLDJCQUFrQzs4QkFBbEMsMkJBQWtDOztBQUFsQyxpQkFBQSwyQkFBa0MsR0FBbEM7QUN2RVEsNkNBQVMsU0FBUyxDQUFDLENBQUM7QUR3RTFCLGdCQUFBLENBQUEsSUFBSSxHQUFHLHlCQUF5QixDQUFDO1NBS2xDOztBQU5ELG1DQUFrQyxXQUd0QixNQUFNLEdBQUEsZ0JBQUMsR0FBd0IsRUFBRSxNQUFjLEVBQUUsS0FBd0IsRUFBQTtBQUNqRixtQkFBTyx5QkFuYVQsY0FBYyxDQW1hVSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzNDOztlQUxILDJCQUFrQztPQUFRLG1CQUFzQzs7UUFRMUUsNkJBQXFDOzhCQUFyQyw2QkFBcUM7O0FBQTNDLGlCQUFNLDZCQUFxQyxHQUEzQztBQ3RFUSx1Q0FBUyxTQUFTLENBQUMsQ0FBQztBRHVFMUIsZ0JBQUEsQ0FBQSxJQUFJLEdBQUcsMkJBQTJCLENBQUM7U0FhcEM7O0FBZEsscUNBQXFDLFdBRy9CLFNBQVMsR0FBQSxtQkFBQyxTQUE0QixFQUFBO0FBQzlDLG1CQUFPLGtCQWphNEQsR0FBRyxDQWlhM0QsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7U0FDOUM7O0FBTEcscUNBQXFDLFdBTy9CLE1BQU0sR0FBQSxnQkFBQyxHQUF3QixFQUFFLE1BQWMsRUFBRSxLQUF3QixFQUFBO0FBQ2pGLG1CQUFPLHlCQTlhVCxjQUFjLENBOGFVLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7O0FBVEcscUNBQXFDLFdBVy9CLFVBQVUsR0FBQSxvQkFBQyxFQUFNLEVBQUUsU0FBNEIsRUFBRSxLQUF3QyxFQUFFLE1BQWdCLEVBQUUsTUFBYyxFQUFBO0FBQ25JLG1CQUFPLElBQUksNkJBQTZCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNqRTs7ZUFiRyw2QkFBcUM7T0FBUSxZQUErQjs7OztRQWdCbEYsNkJBQW9DOzhCQUFwQyw2QkFBb0M7O0FBQXBDLGlCQUFBLDZCQUFvQyxHQUFwQztBQ3ZFUSx1Q0FBUyxTQUFTLENBQUMsQ0FBQztBRHdFMUIsZ0JBQUEsQ0FBQSxJQUFJLEdBQUcsMkJBQTJCLENBQUM7U0FLcEM7O0FBTkQscUNBQW9DLFdBR3hCLE1BQU0sR0FBQSxnQkFBQyxHQUF3QixFQUFFLE1BQWMsRUFBRSxLQUF3QixFQUFBO0FBQ2pGLG1CQUFPLHlCQTFiVCxjQUFjLENBMGJVLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7O2VBTEgsNkJBQW9DO09BQVEsWUFBK0I7O1FBUXJFLDJCQUFtQzs4QkFBbkMsMkJBQW1DOztBQUF6QyxpQkFBTSwyQkFBbUMsR0FBekM7QUN0RVEsOENBQVMsU0FBUyxDQUFDLENBQUM7QUR1RTFCLGdCQUFBLENBQUEsSUFBSSxHQUFHLHlCQUF5QixDQUFDO0FBRXZCLGdCQUFBLENBQUEsWUFBWSxHQUFHLDZCQUE2QixDQUFDO1NBYXhEOztBQWhCSyxtQ0FBbUMsV0FLN0IsU0FBUyxHQUFBLG1CQUFDLFNBQTRCLEVBQUE7QUFDOUMsbUJBQU8sa0JBM2I0RCxHQUFHLENBMmIzRCxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztTQUM5Qzs7QUFQRyxtQ0FBbUMsV0FTN0IsTUFBTSxHQUFBLGdCQUFDLEdBQXdCLEVBQUUsTUFBYyxFQUFFLEtBQXdCLEVBQUE7QUFDakYsbUJBQU8seUJBeGNULGNBQWMsQ0F3Y1UsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzQzs7QUFYRyxtQ0FBbUMsV0FhN0IsVUFBVSxHQUFBLG9CQUFDLEVBQU0sRUFBRSxTQUE0QixFQUFFLEtBQXdDLEVBQUUsTUFBZ0IsRUFBRSxNQUFjLEVBQUE7QUFDbkksbUJBQU8sSUFBSSwyQkFBMkIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzlGOztlQWZHLDJCQUFtQztPQUFRLG1CQUFzQzs7OztRQWtCdkYsMkJBQWtDOzhCQUFsQywyQkFBa0M7O0FBQWxDLGlCQUFBLDJCQUFrQyxHQUFsQztBQ3hFUSw4Q0FBUyxTQUFTLENBQUMsQ0FBQztBRHlFMUIsZ0JBQUEsQ0FBQSxJQUFJLEdBQUcsaUJBQWlCLENBQUM7U0FLMUI7O0FBTkQsbUNBQWtDLFdBR3RCLE1BQU0sR0FBQSxnQkFBQyxHQUF3QixFQUFFLE1BQWMsRUFBRSxLQUF3QixFQUFBO0FBQ2pGLG1CQUFPLHlCQXBkVCxjQUFjLENBb2RVLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7O2VBTEgsMkJBQWtDO09BQVEsbUJBQXNDIiwiZmlsZSI6ImNvbnRlbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXBzZXJ0LCB7XG4gIEluc2VydGlvbixcbiAgQ2F1dGlvdXNJbnNlcnRpb24sXG4gIFRydXN0aW5nSW5zZXJ0aW9uLFxuXG4gIGlzU2FmZVN0cmluZyxcbiAgaXNOb2RlLFxuICBpc1N0cmluZyxcblxuICBjYXV0aW91c0luc2VydCxcbiAgdHJ1c3RpbmdJbnNlcnRcbn0gZnJvbSAnLi4vLi4vdXBzZXJ0JztcbmltcG9ydCB7IGlzQ29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvbXBvbmVudC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERPTVRyZWVDb25zdHJ1Y3Rpb24gfSBmcm9tICcuLi8uLi9kb20vaGVscGVyJztcbmltcG9ydCB7IE9wU2VxLCBPcGNvZGUsIE9wY29kZUpTT04sIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBDb21waWxlZEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9ucyc7XG5pbXBvcnQgeyBWTSwgVXBkYXRpbmdWTSB9IGZyb20gJy4uLy4uL3ZtJztcbmltcG9ydCB7IFRyeU9wY29kZSwgVk1TdGF0ZSB9IGZyb20gJy4uLy4uL3ZtL3VwZGF0ZSc7XG5pbXBvcnQgeyBFbnRlck9wY29kZSB9IGZyb20gJy4vdm0nO1xuaW1wb3J0IHsgUmVmZXJlbmNlLCBSZWZlcmVuY2VDYWNoZSwgVXBkYXRhYmxlVGFnLCBpc01vZGlmaWVkLCBpc0NvbnN0LCBtYXAgfSBmcm9tICdnbGltbWVyLXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBPcGFxdWUsIExpbmtlZExpc3QgfSBmcm9tICdnbGltbWVyLXV0aWwnO1xuaW1wb3J0IHsgQ3Vyc29yLCBjbGVhciB9IGZyb20gJy4uLy4uL2JvdW5kcyc7XG5pbXBvcnQgeyBGcmFnbWVudCB9IGZyb20gJy4uLy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgQ29tcGlsZUludG9MaXN0IH0gZnJvbSAnLi4vLi4vY29tcGlsZXInO1xuaW1wb3J0IE9wY29kZUJ1aWxkZXJEU0wgZnJvbSAnLi9idWlsZGVyJztcbmltcG9ydCB7IENvbmRpdGlvbmFsUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vcmVmZXJlbmNlcyc7XG5pbXBvcnQgeyBBcmdzIH0gZnJvbSAnLi4vLi4vc3ludGF4L2NvcmUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBVcGRhdGFibGVCbG9ja1RyYWNrZXIgfSBmcm9tICcuLi8uLi9idWlsZGVyJztcbmltcG9ydCBTeW1ib2xUYWJsZSBmcm9tICcuLi8uLi9zeW1ib2wtdGFibGUnO1xuXG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlOiBPcGFxdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlWyd0b1N0cmluZyddICE9PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGV4dFZhbHVlKHZhbHVlOiBPcGFxdWUpOiBzdHJpbmcge1xuICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUcnVzdGVkVmFsdWUodmFsdWU6IE9wYXF1ZSk6IFRydXN0aW5nSW5zZXJ0aW9uIHtcbiAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU2FmZVN0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUudG9IVE1MKCk7XG4gIH1cbiAgaWYgKGlzTm9kZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZTogT3BhcXVlKTogQ2F1dGlvdXNJbnNlcnRpb24ge1xuICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTYWZlU3RyaW5nKHZhbHVlKSB8fCBpc05vZGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBwZW5kT3Bjb2RlPFQgZXh0ZW5kcyBJbnNlcnRpb24+IGV4dGVuZHMgT3Bjb2RlIHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5vcm1hbGl6ZShyZWZlcmVuY2U6IFJlZmVyZW5jZTxPcGFxdWU+KTogUmVmZXJlbmNlPFQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW5zZXJ0KGRvbTogRE9NVHJlZUNvbnN0cnVjdGlvbiwgY3Vyc29yOiBDdXJzb3IsIHZhbHVlOiBUKTogVXBzZXJ0O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlV2l0aCh2bTogVk0sIHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4sIGNhY2hlOiBSZWZlcmVuY2VDYWNoZTxUPiwgYm91bmRzOiBGcmFnbWVudCwgdXBzZXJ0OiBVcHNlcnQpOiBVcGRhdGVPcGNvZGU8VD47XG5cbiAgZXZhbHVhdGUodm06IFZNKSB7XG4gICAgbGV0IHJlZmVyZW5jZSA9IHZtLmZyYW1lLmdldE9wZXJhbmQoKTtcbiAgICBsZXQgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplKHJlZmVyZW5jZSk7XG5cbiAgICBsZXQgdmFsdWUsIGNhY2hlO1xuXG4gICAgaWYgKGlzQ29uc3QocmVmZXJlbmNlKSkge1xuICAgICAgdmFsdWUgPSBub3JtYWxpemVkLnZhbHVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlID0gbmV3IFJlZmVyZW5jZUNhY2hlKG5vcm1hbGl6ZWQpO1xuICAgICAgdmFsdWUgPSBjYWNoZS5wZWVrKCk7XG4gICAgfVxuXG4gICAgbGV0IHN0YWNrID0gdm0uc3RhY2soKTtcbiAgICBsZXQgdXBzZXJ0ID0gdGhpcy5pbnNlcnQodm0uZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKSwgc3RhY2ssIHZhbHVlKTtcbiAgICBsZXQgYm91bmRzID0gbmV3IEZyYWdtZW50KHVwc2VydC5ib3VuZHMpO1xuXG4gICAgc3RhY2submV3Qm91bmRzKGJvdW5kcyk7XG5cbiAgICBpZiAoY2FjaGUgLyogaS5lLiAhaXNDb25zdChyZWZlcmVuY2UpICovKSB7XG4gICAgICB2bS51cGRhdGVXaXRoKHRoaXMudXBkYXRlV2l0aCh2bSwgcmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQpKTtcbiAgICB9XG4gIH1cblxuICB0b0pTT04oKTogT3Bjb2RlSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGd1aWQ6IHRoaXMuX2d1aWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBhcmdzOiBbXCIkT1BFUkFORFwiXVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEd1YXJkZWRBcHBlbmRPcGNvZGU8VCBleHRlbmRzIEluc2VydGlvbj4gZXh0ZW5kcyBBcHBlbmRPcGNvZGU8VD4ge1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgQXBwZW5kT3Bjb2RlOiB0eXBlb2YgT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUgfCB0eXBlb2YgT3B0aW1pemVkVHJ1c3RpbmdBcHBlbmRPcGNvZGU7XG4gIHByaXZhdGUgZGVvcHRlZDogT3BTZXEgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbjogQ29tcGlsZWRFeHByZXNzaW9uPGFueT4sIHByaXZhdGUgc3ltYm9sVGFibGU6IFN5bWJvbFRhYmxlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBWTSkge1xuICAgIGlmICh0aGlzLmRlb3B0ZWQpIHtcbiAgICAgIHZtLnB1c2hFdmFsRnJhbWUodGhpcy5kZW9wdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uZXZhbHVhdGVPcGVyYW5kKHRoaXMuZXhwcmVzc2lvbik7XG5cbiAgICAgIGxldCB2YWx1ZSA9IHZtLmZyYW1lLmdldE9wZXJhbmQoKS52YWx1ZSgpO1xuXG4gICAgICBpZihpc0NvbXBvbmVudERlZmluaXRpb24odmFsdWUpKSB7XG4gICAgICAgIHZtLnB1c2hFdmFsRnJhbWUodGhpcy5kZW9wdCh2bS5lbnYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLmV2YWx1YXRlKHZtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVvcHQoZW52OiBFbnZpcm9ubWVudCk6IE9wU2VxIHsgLy8gUHVibGljIGJlY2F1c2UgaXQncyB1c2VkIGluIHRoZSBsYXp5IGRlb3B0XG4gICAgLy8gQXQgY29tcGlsZSB0aW1lLCB3ZSBkZXRlcm1pbmVkIHRoYXQgdGhpcyBhcHBlbmQgY2FsbHNpdGUgbWlnaHQgcmVmZXJcbiAgICAvLyB0byBhIGxvY2FsIHZhcmlhYmxlL3Byb3BlcnR5IGxvb2t1cCB0aGF0IHJlc29sdmVzIHRvIGEgY29tcG9uZW50XG4gICAgLy8gZGVmaW5pdGlvbiBhdCBydW50aW1lLlxuICAgIC8vXG4gICAgLy8gV2UgY291bGQgaGF2ZSBlYWdlcmx5IGNvbXBpbGVkIHRoaXMgY2FsbHNpdGUgaW50byBzb21ldGhpbmcgbGlrZSB0aGlzOlxuICAgIC8vXG4gICAgLy8gICB7eyNpZiAoaXMtY29tcG9uZW50LWRlZmluaXRpb24gZm9vKX19XG4gICAgLy8gICAgIHt7Y29tcG9uZW50IGZvb319XG4gICAgLy8gICB7e2Vsc2V9fVxuICAgIC8vICAgICB7e2Zvb319XG4gICAgLy8gICB7ey9pZn19XG4gICAgLy9cbiAgICAvLyBIb3dldmVyLCBpbiBwcmFjdGljZSwgdGhlcmUgbWlnaHQgYmUgYSBsYXJnZSBhbW91dCBvZiB0aGVzZSBjYWxsc2l0ZXNcbiAgICAvLyBhbmQgbW9zdCBvZiB0aGVtIHdvdWxkIHJlc29sdmUgdG8gYSBzaW1wbGUgdmFsdWUgbG9va3VwLiBUaGVyZWZvcmUsIHdlXG4gICAgLy8gdHJpZWQgdG8gYmUgb3B0aW1pc3RpYyBhbmQgYXNzdW1lZCB0aGF0IHRoZSBjYWxsc2l0ZSB3aWxsIHJlc29sdmUgdG9cbiAgICAvLyBhcHBlbmRpbmcgYSBzaW1wbGUgdmFsdWUuXG4gICAgLy9cbiAgICAvLyBIb3dldmVyLCB3ZSBoYXZlIHJlYWNoZWQgaGVyZSBiZWNhdXNlIGF0IHJ1bnRpbWUsIHRoZSBndWFyZCBjb25kaXRpb25hbFxuICAgIC8vIGhhdmUgZGV0ZWN0ZWQgdGhhdCB0aGlzIGNhbGxzaXRlIGlzIGluZGVlZCByZWZlcnJpbmcgdG8gYSBjb21wb25lbnRcbiAgICAvLyBkZWZpbml0aW9uIG9iamVjdC4gU2luY2UgdGhpcyBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgdHJ1ZSBmb3Igb3RoZXJcbiAgICAvLyBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2FsbHNpdGUsIGl0IGlzIG5vdyBhcHByb3BpYXRlIHRvIGRlb3B0IGludG8gdGhlXG4gICAgLy8gZXhwYW5kZWQgdmVyc2lvbiB0aGF0IGhhbmRsZXMgYm90aCBjYXNlcy4gVGhlIGNvbXBpbGF0aW9uIHdvdWxkIGxvb2tcbiAgICAvLyBsaWtlIHRoaXM6XG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgIEVudGVyKEJFR0lOLCBFTkQpXG4gICAgLy8gICBCRUdJTjogICAgICBOb29wXG4gICAgLy8gICAgICAgICAgICAgICBUZXN0KGlzLWNvbXBvbmVudC1kZWZpbml0aW9uKVxuICAgIC8vICAgICAgICAgICAgICAgSnVtcFVubGVzcyhWQUxVRSlcbiAgICAvLyAgIENPTVBPTkVOVDogIE5vb3BcbiAgICAvLyAgICAgICAgICAgICAgIFB1dER5bmFtaWNDb21wb25lbnREZWZpbml0aW9uT3Bjb2RlXG4gICAgLy8gICAgICAgICAgICAgICBPcGVuQ29tcG9uZW50XG4gICAgLy8gICAgICAgICAgICAgICBDbG9zZUNvbXBvbmVudFxuICAgIC8vICAgICAgICAgICAgICAgSnVtcChFTkQpXG4gICAgLy8gICBWQUxVRTogICAgICBOb29wXG4gICAgLy8gICAgICAgICAgICAgICBPcHRpbWl6ZWRBcHBlbmRcbiAgICAvLyAgIEVORDogICAgICAgIE5vb3BcbiAgICAvLyAgICAgICAgICAgICAgIEV4aXRcbiAgICAvL1xuICAgIC8vIEtlZXAgaW4gbWluZCB0aGF0IGV2ZW4gaWYgd2UgKmRvbid0KiByZWFjaCBoZXJlIGF0IGluaXRpYWwgcmVuZGVyIHRpbWUsXG4gICAgLy8gaXQgaXMgc3RpbGwgcG9zc2libGUgKGFsdGhvdWdoIHF1aXRlIHJhcmUpIHRoYXQgdGhlIHNpbXBsZSB2YWx1ZSB3ZVxuICAgIC8vIGVuY291bnRlciBkdXJpbmcgaW5pdGlhbCByZW5kZXIgY291bGQgbGF0ZXIgY2hhbmdlIGludG8gYSBjb21wb25lbnRcbiAgICAvLyBkZWZpbml0aW9uIG9iamVjdCBhdCB1cGRhdGUgdGltZS4gVGhhdCBpcyBoYW5kbGVkIGJ5IHRoZSBcImxhenkgZGVvcHRcIlxuICAgIC8vIGNvZGUgb24gdGhlIHVwZGF0ZSBzaWRlIChzY3JvbGwgZG93biBmb3IgdGhlIG5leHQgYmlnIGJsb2NrIG9mIGNvbW1lbnQpLlxuXG4gICAgbGV0IGJ1ZmZlciA9IG5ldyBDb21waWxlSW50b0xpc3QoZW52LCBudWxsKTtcbiAgICBsZXQgZHNsID0gbmV3IE9wY29kZUJ1aWxkZXJEU0woYnVmZmVyLCB0aGlzLnN5bWJvbFRhYmxlLCBlbnYpO1xuXG4gICAgZHNsLmJsb2NrKHsgdGVtcGxhdGVzOiBudWxsIH0sIChkc2wsIEJFR0lOLCBFTkQpID0+IHtcbiAgICAgIGRzbC5wdXRWYWx1ZSh0aGlzLmV4cHJlc3Npb24pO1xuICAgICAgZHNsLnRlc3QoSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlLmNyZWF0ZSk7XG4gICAgICBkc2wuanVtcFVubGVzcygnVkFMVUUnKTtcbiAgICAgIGRzbC5sYWJlbCgnQ09NUE9ORU5UJyk7XG4gICAgICBkc2wucHV0RHluYW1pY0NvbXBvbmVudERlZmluaXRpb24oKTtcbiAgICAgIGRzbC5vcGVuQ29tcG9uZW50KEFyZ3MuZW1wdHkoKSk7XG4gICAgICBkc2wuY2xvc2VDb21wb25lbnQoKTtcbiAgICAgIGRzbC5qdW1wKEVORCk7XG4gICAgICBkc2wubGFiZWwoJ1ZBTFVFJyk7XG4gICAgICBkc2wuYXBwZW5kKG5ldyB0aGlzLkFwcGVuZE9wY29kZSgpKTtcbiAgICB9KTtcblxuICAgIGxldCBkZW9wdGVkID0gdGhpcy5kZW9wdGVkID0gZHNsLnRvT3BTZXEoKTtcblxuICAgIC8vIEZyb20gdGhpcyBwb2ludCBvbiwgd2UgaGF2ZSBlc3NlbnRpYWxseSByZXBsYWNlZCBvdXJzZWx2ZSB3aXRoIGEgbmV3IHNldFxuICAgIC8vIG9mIG9wY29kZXMuIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGluZyB0aGUgbmV3L2Rlb3B0ZWQgY29kZSwgaXQnc1xuICAgIC8vIGEgZ29vZCBpZGVhIChhcyBhIHBhdHRlcm4pIHRvIG51bGwgb3V0IGFueSB1bm5lZWRlZCBmaWVsZHMgaGVyZSB0byBhdm9pZFxuICAgIC8vIGhvbGRpbmcgb24gdG8gdW5uZWVkZWQvc3RhbGUgb2JqZWN0czpcblxuICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7XG5cbiAgICByZXR1cm4gZGVvcHRlZDtcbiAgfVxuXG4gIHRvSlNPTigpOiBPcGNvZGVKU09OIHtcbiAgICBsZXQgeyBfZ3VpZDogZ3VpZCwgdHlwZSwgZGVvcHRlZCB9ID0gdGhpcztcblxuICAgIGlmIChkZW9wdGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBndWlkLFxuICAgICAgICB0eXBlLFxuICAgICAgICBkZW9wdGVkOiB0cnVlLFxuICAgICAgICBjaGlsZHJlbjogZGVvcHRlZC50b0FycmF5KCkubWFwKG9wID0+IG9wLnRvSlNPTigpKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ3VpZCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYXJnczogW3RoaXMuZXhwcmVzc2lvbi50b0pTT04oKV1cbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIElzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSBleHRlbmRzIENvbmRpdGlvbmFsUmVmZXJlbmNlIHtcbiAgc3RhdGljIGNyZWF0ZShpbm5lcjogUmVmZXJlbmNlPE9wYXF1ZT4pOiBJc0NvbXBvbmVudERlZmluaXRpb25SZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlKGlubmVyKTtcbiAgfVxuXG4gIHRvQm9vbCh2YWx1ZTogT3BhcXVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQ29tcG9uZW50RGVmaW5pdGlvbih2YWx1ZSk7XG4gIH1cbn1cblxuYWJzdHJhY3QgY2xhc3MgVXBkYXRlT3Bjb2RlPFQgZXh0ZW5kcyBJbnNlcnRpb24+IGV4dGVuZHMgVXBkYXRpbmdPcGNvZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY2FjaGU6IFJlZmVyZW5jZUNhY2hlPFQ+LFxuICAgIHByb3RlY3RlZCBib3VuZHM6IEZyYWdtZW50LFxuICAgIHByb3RlY3RlZCB1cHNlcnQ6IFVwc2VydFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFnID0gY2FjaGUudGFnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogVCk6IFVwc2VydDtcblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FjaGUucmV2YWxpZGF0ZSgpO1xuXG4gICAgaWYgKGlzTW9kaWZpZWQodmFsdWUpKSB7XG4gICAgICBsZXQgeyBib3VuZHMsIHVwc2VydCB9ID0gdGhpcztcbiAgICAgIGxldCB7IGRvbSB9ID0gdm07XG5cbiAgICAgIGlmKCF0aGlzLnVwc2VydC51cGRhdGUoZG9tLCB2YWx1ZSkpIHtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBDdXJzb3IoYm91bmRzLnBhcmVudEVsZW1lbnQoKSwgY2xlYXIoYm91bmRzKSk7XG4gICAgICAgIHVwc2VydCA9IHRoaXMudXBzZXJ0ID0gdGhpcy5pbnNlcnQodm0uZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGJvdW5kcy51cGRhdGUodXBzZXJ0LmJvdW5kcyk7XG4gICAgfVxuICB9XG5cbiAgdG9KU09OKCk6IE9wY29kZUpTT04ge1xuICAgIGxldCB7IF9ndWlkOiBndWlkLCB0eXBlLCBjYWNoZSB9ID0gdGhpcztcblxuICAgIHJldHVybiB7XG4gICAgICBndWlkLFxuICAgICAgdHlwZSxcbiAgICAgIGRldGFpbHM6IHsgbGFzdFZhbHVlOiBKU09OLnN0cmluZ2lmeShjYWNoZS5wZWVrKCkpIH1cbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHdWFyZGVkVXBkYXRlT3Bjb2RlPFQgZXh0ZW5kcyBJbnNlcnRpb24+IGV4dGVuZHMgVXBkYXRlT3Bjb2RlPFQ+IHtcbiAgcHJpdmF0ZSBfdGFnOiBVcGRhdGFibGVUYWc7XG4gIHByaXZhdGUgZGVvcHRlZDogVHJ5T3Bjb2RlID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4sXG4gICAgY2FjaGU6IFJlZmVyZW5jZUNhY2hlPFQ+LFxuICAgIGJvdW5kczogRnJhZ21lbnQsXG4gICAgdXBzZXJ0OiBVcHNlcnQsXG4gICAgcHJpdmF0ZSBhcHBlbmRPcGNvZGU6IEd1YXJkZWRBcHBlbmRPcGNvZGU8VD4sXG4gICAgcHJpdmF0ZSBzdGF0ZTogVk1TdGF0ZVxuICApIHtcbiAgICBzdXBlcihjYWNoZSwgYm91bmRzLCB1cHNlcnQpO1xuICAgIHRoaXMudGFnID0gdGhpcy5fdGFnID0gbmV3IFVwZGF0YWJsZVRhZyh0aGlzLnRhZyk7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGlmICh0aGlzLmRlb3B0ZWQpIHtcbiAgICAgIHZtLmV2YWx1YXRlT3Bjb2RlKHRoaXMuZGVvcHRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc0NvbXBvbmVudERlZmluaXRpb24odGhpcy5yZWZlcmVuY2UudmFsdWUoKSkpIHtcbiAgICAgICAgdGhpcy5sYXp5RGVvcHQodm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VwZXIuZXZhbHVhdGUodm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbGF6eURlb3B0KHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgLy8gRHVyaWduIGluaXRpYWwgcmVuZGVyLCB3ZSBrbm93IHRoYXQgdGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBjb250YWluIGFcbiAgICAvLyBjb21wb25lbnQgZGVmaW5pdGlvbiwgc28gd2Ugb3B0aW1pc3RpY2FsbHkgYXNzdW1lZCB0aGF0IHRoaXMgYXBwZW5kXG4gICAgLy8gaXMganVzdCBhIG5vcm1hbCBhcHBlbmQuIEhvd2V2ZXIsIGF0IHVwZGF0ZSB0aW1lLCB3ZSBkaXNjb3ZlcmVkIHRoYXRcbiAgICAvLyB0aGUgcmVmZXJlbmNlIGhhcyBzd2l0Y2hlZCBpbnRvIGNvbnRhaW5pbmcgYSBjb21wb25lbnQgZGVmaW5pdGlvbiwgc29cbiAgICAvLyB3ZSBuZWVkIHRvIGRvIGEgXCJsYXp5IGRlb3B0XCIsIHNpbXVsYXRpbmcgd2hhdCB3b3VsZCBoYXZlIGhhcHBlbmVkIGlmXG4gICAgLy8gd2UgaGFkIGRlY2lkZWQgdG8gcGVyZm9ybSB0aGUgZGVvcHQgaW4gdGhlIGZpcnN0IHBsYWNlIGR1cmluZyBpbml0aWFsXG4gICAgLy8gcmVuZGVyLlxuICAgIC8vXG4gICAgLy8gTW9yZSBjb25jcmV0ZWx5LCB3ZSB3b3VsZCBoYXZlIGV4cGFuZGVkIHRoZSBjdXJseSBpbnRvIGEgaWYvZWxzZSwgYW5kXG4gICAgLy8gYmFzZWQgb24gd2hldGhlciB0aGUgdmFsdWUgaXMgYSBjb21wb25lbnQgZGVmaW5pdGlvbiBvciBub3QsIHdlIHdvdWxkXG4gICAgLy8gaGF2ZSBlbnRlcmVkIGVpdGhlciB0aGUgZHluYW1pYyBjb21wb25lbnQgYnJhbmNoIG9yIHRoZSBzaW1wbGUgdmFsdWVcbiAgICAvLyBicmFuY2guXG4gICAgLy9cbiAgICAvLyBTaW5jZSB3ZSByZW5kZXJlZCBhIHNpbXBsZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbCByZW5kZXIgKGFuZCBhbGwgdGhlXG4gICAgLy8gdXBkYXRlcyB1cCB1bnRpbCB0aGlzIHBvaW50KSwgd2UgbmVlZCB0byBwcmV0ZW5kIHRoYXQgdGhlIHJlc3VsdCBpc1xuICAgIC8vIHByb2R1Y2VkIGJ5IHRoZSBcIlZBTFVFXCIgYnJhbmNoIG9mIHRoZSBkZW9wdGVkIGFwcGVuZCBvcGNvZGU6XG4gICAgLy9cbiAgICAvLyAgIFRyeShCRUdJTiwgRU5EKVxuICAgIC8vICAgICBBc3NlcnQoSXNDb21wb25lbnREZWZpbml0aW9uLCBleHBlY3RlZD1mYWxzZSlcbiAgICAvLyAgICAgT3B0aW1pemVkVXBkYXRlXG4gICAgLy9cbiAgICAvLyBJbiB0aGlzIGNhc2UsIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBoYXMgc3dpdGNoZWQgZnJvbSBiZWluZyBhIHNpbXBsZVxuICAgIC8vIHZhbHVlIGludG8gYSBjb21wb25lbnQgZGVmaW5pdGlvbiwgd2hhdCB3b3VsZCBoYXZlIGhhcHBlbmVkIGlzIHRoYXRcbiAgICAvLyB0aGUgYXNzZXJ0IHdvdWxkIHRocm93LCBjYXVzaW5nIHRoZSBUcnkgb3Bjb2RlIHRvIHRlYXJkb3duIHRoZSBib3VuZHNcbiAgICAvLyBhbmQgcmVydW4gdGhlIG9yaWdpbmFsIGFwcGVuZCBvcGNvZGUuXG4gICAgLy9cbiAgICAvLyBTaW5jZSB0aGUgVHJ5IG9wY29kZSB3b3VsZCBoYXZlIG51a2VkIHRoZSB1cGRhdGluZyBvcGNvZGVzIGFueXdheSwgd2VcbiAgICAvLyB3b3VsZG4ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNpbXVsYXRpbmcgdGhvc2UuIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvXG4gICAgLy8gZXhlY3V0ZSB0aGUgVHJ5IG9wY29kZSBhbmQgaW1tZWRpYXRlbHkgdGhyb3cuXG5cbiAgICBsZXQgeyBib3VuZHMsIGFwcGVuZE9wY29kZSwgc3RhdGUgfSA9IHRoaXM7XG5cbiAgICBsZXQgYXBwZW5kT3BzID0gYXBwZW5kT3Bjb2RlLmRlb3B0KHZtLmVudik7XG4gICAgbGV0IGVudGVyICAgICA9IGFwcGVuZE9wcy5oZWFkKCkgYXMgRW50ZXJPcGNvZGU7XG4gICAgbGV0IG9wcyAgICAgICA9IGVudGVyLnNsaWNlO1xuXG4gICAgbGV0IHRyYWNrZXIgPSBuZXcgVXBkYXRhYmxlQmxvY2tUcmFja2VyKGJvdW5kcy5wYXJlbnRFbGVtZW50KCkpO1xuICAgIHRyYWNrZXIubmV3Qm91bmRzKHRoaXMuYm91bmRzKTtcblxuICAgIGxldCBjaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPigpO1xuXG4gICAgbGV0IGRlb3B0ZWQgPSB0aGlzLmRlb3B0ZWQgPSBuZXcgVHJ5T3Bjb2RlKG9wcywgc3RhdGUsIHRyYWNrZXIsIGNoaWxkcmVuKTtcblxuICAgIHRoaXMuX3RhZy51cGRhdGUoZGVvcHRlZC50YWcpO1xuXG4gICAgdm0uZXZhbHVhdGVPcGNvZGUoZGVvcHRlZCk7XG4gICAgdm0udGhyb3coKTtcblxuICAgIC8vIEZyb20gdGhpcyBwb2ludCBvbiwgd2UgaGF2ZSBlc3NlbnRpYWxseSByZXBsYWNlZCBvdXJzZWx2ZSB3aXRoIGEgbmV3XG4gICAgLy8gb3Bjb2RlLiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBleGVjdXRpbmcgdGhlIG5ldy9kZW9wdGVkIGNvZGUsIGl0J3MgYVxuICAgIC8vIGdvb2QgaWRlYSAoYXMgYSBwYXR0ZXJuKSB0byBudWxsIG91dCBhbnkgdW5uZWVkZWQgZmllbGRzIGhlcmUgdG8gYXZvaWRcbiAgICAvLyBob2xkaW5nIG9uIHRvIHVubmVlZGVkL3N0YWxlIG9iamVjdHM6XG5cbiAgICB0aGlzLl90YWcgICAgICAgICA9IG51bGw7XG4gICAgdGhpcy5yZWZlcmVuY2UgICAgPSBudWxsO1xuICAgIHRoaXMuY2FjaGUgICAgICAgID0gbnVsbDtcbiAgICB0aGlzLmJvdW5kcyAgICAgICA9IG51bGw7XG4gICAgdGhpcy51cHNlcnQgICAgICAgPSBudWxsO1xuICAgIHRoaXMuYXBwZW5kT3Bjb2RlID0gbnVsbDtcbiAgICB0aGlzLnN0YXRlICAgICAgICA9IG51bGw7XG4gIH1cblxuICB0b0pTT04oKTogT3Bjb2RlSlNPTiB7XG4gICAgbGV0IHsgX2d1aWQ6IGd1aWQsIHR5cGUsIGRlb3B0ZWQgfSA9IHRoaXM7XG5cbiAgICBpZiAoZGVvcHRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ3VpZCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZGVvcHRlZDogdHJ1ZSxcbiAgICAgICAgY2hpbGRyZW46IFtkZW9wdGVkLnRvSlNPTigpXVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTigpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUgZXh0ZW5kcyBBcHBlbmRPcGNvZGU8Q2F1dGlvdXNJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICdvcHRpbWl6ZWQtY2F1dGlvdXMtYXBwZW5kJztcblxuICBwcm90ZWN0ZWQgbm9ybWFsaXplKHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4pOiBSZWZlcmVuY2U8Q2F1dGlvdXNJbnNlcnRpb24+IHtcbiAgICByZXR1cm4gbWFwKHJlZmVyZW5jZSwgbm9ybWFsaXplVmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogQ2F1dGlvdXNJbnNlcnRpb24pOiBVcHNlcnQge1xuICAgIHJldHVybiBjYXV0aW91c0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVdpdGgodm06IFZNLCByZWZlcmVuY2U6IFJlZmVyZW5jZTxPcGFxdWU+LCBjYWNoZTogUmVmZXJlbmNlQ2FjaGU8Q2F1dGlvdXNJbnNlcnRpb24+LCBib3VuZHM6IEZyYWdtZW50LCB1cHNlcnQ6IFVwc2VydCk6IE9wdGltaXplZENhdXRpb3VzVXBkYXRlT3Bjb2RlIHtcbiAgICByZXR1cm4gbmV3IE9wdGltaXplZENhdXRpb3VzVXBkYXRlT3Bjb2RlKGNhY2hlLCBib3VuZHMsIHVwc2VydCk7XG4gIH1cbn1cblxuY2xhc3MgT3B0aW1pemVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUgZXh0ZW5kcyBVcGRhdGVPcGNvZGU8Q2F1dGlvdXNJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICdvcHRpbWl6ZWQtY2F1dGlvdXMtdXBkYXRlJztcblxuICBwcm90ZWN0ZWQgaW5zZXJ0KGRvbTogRE9NVHJlZUNvbnN0cnVjdGlvbiwgY3Vyc29yOiBDdXJzb3IsIHZhbHVlOiBDYXV0aW91c0luc2VydGlvbik6IFVwc2VydCB7XG4gICAgcmV0dXJuIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEd1YXJkZWRDYXV0aW91c0FwcGVuZE9wY29kZSBleHRlbmRzIEd1YXJkZWRBcHBlbmRPcGNvZGU8Q2F1dGlvdXNJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICdndWFyZGVkLWNhdXRpb3VzLWFwcGVuZCc7XG5cbiAgcHJvdGVjdGVkIEFwcGVuZE9wY29kZSA9IE9wdGltaXplZENhdXRpb3VzQXBwZW5kT3Bjb2RlO1xuXG4gIHByb3RlY3RlZCBub3JtYWxpemUocmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPik6IFJlZmVyZW5jZTxDYXV0aW91c0luc2VydGlvbj4ge1xuICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVWYWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5zZXJ0KGRvbTogRE9NVHJlZUNvbnN0cnVjdGlvbiwgY3Vyc29yOiBDdXJzb3IsIHZhbHVlOiBDYXV0aW91c0luc2VydGlvbik6IFVwc2VydCB7XG4gICAgcmV0dXJuIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlV2l0aCh2bTogVk0sIHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4sIGNhY2hlOiBSZWZlcmVuY2VDYWNoZTxDYXV0aW91c0luc2VydGlvbj4sIGJvdW5kczogRnJhZ21lbnQsIHVwc2VydDogVXBzZXJ0KTogR3VhcmRlZENhdXRpb3VzVXBkYXRlT3Bjb2RlIHtcbiAgICByZXR1cm4gbmV3IEd1YXJkZWRDYXV0aW91c1VwZGF0ZU9wY29kZShyZWZlcmVuY2UsIGNhY2hlLCBib3VuZHMsIHVwc2VydCwgdGhpcywgdm0uY2FwdHVyZSgpKTtcbiAgfVxufVxuXG5jbGFzcyBHdWFyZGVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUgZXh0ZW5kcyBHdWFyZGVkVXBkYXRlT3Bjb2RlPENhdXRpb3VzSW5zZXJ0aW9uPiB7XG4gIHR5cGUgPSAnZ3VhcmRlZC1jYXV0aW91cy11cGRhdGUnO1xuXG4gIHByb3RlY3RlZCBpbnNlcnQoZG9tOiBET01UcmVlQ29uc3RydWN0aW9uLCBjdXJzb3I6IEN1cnNvciwgdmFsdWU6IENhdXRpb3VzSW5zZXJ0aW9uKTogVXBzZXJ0IHtcbiAgICByZXR1cm4gY2F1dGlvdXNJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3B0aW1pemVkVHJ1c3RpbmdBcHBlbmRPcGNvZGUgZXh0ZW5kcyBBcHBlbmRPcGNvZGU8VHJ1c3RpbmdJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICdvcHRpbWl6ZWQtdHJ1c3RpbmctYXBwZW5kJztcblxuICBwcm90ZWN0ZWQgbm9ybWFsaXplKHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4pOiBSZWZlcmVuY2U8VHJ1c3RpbmdJbnNlcnRpb24+IHtcbiAgICByZXR1cm4gbWFwKHJlZmVyZW5jZSwgbm9ybWFsaXplVHJ1c3RlZFZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNlcnQoZG9tOiBET01UcmVlQ29uc3RydWN0aW9uLCBjdXJzb3I6IEN1cnNvciwgdmFsdWU6IFRydXN0aW5nSW5zZXJ0aW9uKTogVXBzZXJ0IHtcbiAgICByZXR1cm4gdHJ1c3RpbmdJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVXaXRoKHZtOiBWTSwgcmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPiwgY2FjaGU6IFJlZmVyZW5jZUNhY2hlPFRydXN0aW5nSW5zZXJ0aW9uPiwgYm91bmRzOiBGcmFnbWVudCwgdXBzZXJ0OiBVcHNlcnQpOiBPcHRpbWl6ZWRUcnVzdGluZ1VwZGF0ZU9wY29kZSB7XG4gICAgcmV0dXJuIG5ldyBPcHRpbWl6ZWRUcnVzdGluZ1VwZGF0ZU9wY29kZShjYWNoZSwgYm91bmRzLCB1cHNlcnQpO1xuICB9XG59XG5cbmNsYXNzIE9wdGltaXplZFRydXN0aW5nVXBkYXRlT3Bjb2RlIGV4dGVuZHMgVXBkYXRlT3Bjb2RlPFRydXN0aW5nSW5zZXJ0aW9uPiB7XG4gIHR5cGUgPSAnb3B0aW1pemVkLXRydXN0aW5nLXVwZGF0ZSc7XG5cbiAgcHJvdGVjdGVkIGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogVHJ1c3RpbmdJbnNlcnRpb24pOiBVcHNlcnQge1xuICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHdWFyZGVkVHJ1c3RpbmdBcHBlbmRPcGNvZGUgZXh0ZW5kcyBHdWFyZGVkQXBwZW5kT3Bjb2RlPFRydXN0aW5nSW5zZXJ0aW9uPiB7XG4gIHR5cGUgPSAnZ3VhcmRlZC10cnVzdGluZy1hcHBlbmQnO1xuXG4gIHByb3RlY3RlZCBBcHBlbmRPcGNvZGUgPSBPcHRpbWl6ZWRUcnVzdGluZ0FwcGVuZE9wY29kZTtcblxuICBwcm90ZWN0ZWQgbm9ybWFsaXplKHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4pOiBSZWZlcmVuY2U8VHJ1c3RpbmdJbnNlcnRpb24+IHtcbiAgICByZXR1cm4gbWFwKHJlZmVyZW5jZSwgbm9ybWFsaXplVHJ1c3RlZFZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNlcnQoZG9tOiBET01UcmVlQ29uc3RydWN0aW9uLCBjdXJzb3I6IEN1cnNvciwgdmFsdWU6IFRydXN0aW5nSW5zZXJ0aW9uKTogVXBzZXJ0IHtcbiAgICByZXR1cm4gdHJ1c3RpbmdJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVXaXRoKHZtOiBWTSwgcmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPiwgY2FjaGU6IFJlZmVyZW5jZUNhY2hlPFRydXN0aW5nSW5zZXJ0aW9uPiwgYm91bmRzOiBGcmFnbWVudCwgdXBzZXJ0OiBVcHNlcnQpOiBHdWFyZGVkVHJ1c3RpbmdVcGRhdGVPcGNvZGUge1xuICAgIHJldHVybiBuZXcgR3VhcmRlZFRydXN0aW5nVXBkYXRlT3Bjb2RlKHJlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0LCB0aGlzLCB2bS5jYXB0dXJlKCkpO1xuICB9XG59XG5cbmNsYXNzIEd1YXJkZWRUcnVzdGluZ1VwZGF0ZU9wY29kZSBleHRlbmRzIEd1YXJkZWRVcGRhdGVPcGNvZGU8VHJ1c3RpbmdJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICd0cnVzdGluZy11cGRhdGUnO1xuXG4gIHByb3RlY3RlZCBpbnNlcnQoZG9tOiBET01UcmVlQ29uc3RydWN0aW9uLCBjdXJzb3I6IEN1cnNvciwgdmFsdWU6IFRydXN0aW5nSW5zZXJ0aW9uKTogVXBzZXJ0IHtcbiAgICByZXR1cm4gdHJ1c3RpbmdJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNTYWZlU3RyaW5nLCBpc05vZGUsIGlzU3RyaW5nLCBjYXV0aW91c0luc2VydCwgdHJ1c3RpbmdJbnNlcnQgfSBmcm9tICcuLi8uLi91cHNlcnQnO1xuaW1wb3J0IHsgaXNDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgT3Bjb2RlLCBVcGRhdGluZ09wY29kZSB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgVHJ5T3Bjb2RlIH0gZnJvbSAnLi4vLi4vdm0vdXBkYXRlJztcbmltcG9ydCB7IFJlZmVyZW5jZUNhY2hlLCBVcGRhdGFibGVUYWcsIGlzTW9kaWZpZWQsIGlzQ29uc3QsIG1hcCB9IGZyb20gJ2dsaW1tZXItcmVmZXJlbmNlJztcbmltcG9ydCB7IExpbmtlZExpc3QgfSBmcm9tICdnbGltbWVyLXV0aWwnO1xuaW1wb3J0IHsgQ3Vyc29yLCBjbGVhciB9IGZyb20gJy4uLy4uL2JvdW5kcyc7XG5pbXBvcnQgeyBGcmFnbWVudCB9IGZyb20gJy4uLy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgQ29tcGlsZUludG9MaXN0IH0gZnJvbSAnLi4vLi4vY29tcGlsZXInO1xuaW1wb3J0IE9wY29kZUJ1aWxkZXJEU0wgZnJvbSAnLi9idWlsZGVyJztcbmltcG9ydCB7IENvbmRpdGlvbmFsUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vcmVmZXJlbmNlcyc7XG5pbXBvcnQgeyBBcmdzIH0gZnJvbSAnLi4vLi4vc3ludGF4L2NvcmUnO1xuaW1wb3J0IHsgVXBkYXRhYmxlQmxvY2tUcmFja2VyIH0gZnJvbSAnLi4vLi4vYnVpbGRlcic7XG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlWyd0b1N0cmluZyddICE9PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRleHRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRydXN0ZWRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTYWZlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9IVE1MKCk7XG4gICAgfVxuICAgIGlmIChpc05vZGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzU2FmZVN0cmluZyh2YWx1ZSkgfHwgaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuZXhwb3J0IGNsYXNzIEFwcGVuZE9wY29kZSBleHRlbmRzIE9wY29kZSB7XG4gICAgZXZhbHVhdGUodm0pIHtcbiAgICAgICAgbGV0IHJlZmVyZW5jZSA9IHZtLmZyYW1lLmdldE9wZXJhbmQoKTtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZShyZWZlcmVuY2UpO1xuICAgICAgICBsZXQgdmFsdWUsIGNhY2hlO1xuICAgICAgICBpZiAoaXNDb25zdChyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5vcm1hbGl6ZWQudmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlID0gbmV3IFJlZmVyZW5jZUNhY2hlKG5vcm1hbGl6ZWQpO1xuICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YWNrID0gdm0uc3RhY2soKTtcbiAgICAgICAgbGV0IHVwc2VydCA9IHRoaXMuaW5zZXJ0KHZtLmVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCksIHN0YWNrLCB2YWx1ZSk7XG4gICAgICAgIGxldCBib3VuZHMgPSBuZXcgRnJhZ21lbnQodXBzZXJ0LmJvdW5kcyk7XG4gICAgICAgIHN0YWNrLm5ld0JvdW5kcyhib3VuZHMpO1xuICAgICAgICBpZiAoY2FjaGUgLyogaS5lLiAhaXNDb25zdChyZWZlcmVuY2UpICovKSB7XG4gICAgICAgICAgICB2bS51cGRhdGVXaXRoKHRoaXMudXBkYXRlV2l0aCh2bSwgcmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBndWlkOiB0aGlzLl9ndWlkLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgYXJnczogW1wiJE9QRVJBTkRcIl1cbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgR3VhcmRlZEFwcGVuZE9wY29kZSBleHRlbmRzIEFwcGVuZE9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbiwgc3ltYm9sVGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5zeW1ib2xUYWJsZSA9IHN5bWJvbFRhYmxlO1xuICAgICAgICB0aGlzLmRlb3B0ZWQgPSBudWxsO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBpZiAodGhpcy5kZW9wdGVkKSB7XG4gICAgICAgICAgICB2bS5wdXNoRXZhbEZyYW1lKHRoaXMuZGVvcHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2bS5ldmFsdWF0ZU9wZXJhbmQodGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHZtLmZyYW1lLmdldE9wZXJhbmQoKS52YWx1ZSgpO1xuICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmaW5pdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2bS5wdXNoRXZhbEZyYW1lKHRoaXMuZGVvcHQodm0uZW52KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdXBlci5ldmFsdWF0ZSh2bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVvcHQoZW52KSB7XG4gICAgICAgIC8vIEF0IGNvbXBpbGUgdGltZSwgd2UgZGV0ZXJtaW5lZCB0aGF0IHRoaXMgYXBwZW5kIGNhbGxzaXRlIG1pZ2h0IHJlZmVyXG4gICAgICAgIC8vIHRvIGEgbG9jYWwgdmFyaWFibGUvcHJvcGVydHkgbG9va3VwIHRoYXQgcmVzb2x2ZXMgdG8gYSBjb21wb25lbnRcbiAgICAgICAgLy8gZGVmaW5pdGlvbiBhdCBydW50aW1lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSBjb3VsZCBoYXZlIGVhZ2VybHkgY29tcGlsZWQgdGhpcyBjYWxsc2l0ZSBpbnRvIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAge3sjaWYgKGlzLWNvbXBvbmVudC1kZWZpbml0aW9uIGZvbyl9fVxuICAgICAgICAvLyAgICAge3tjb21wb25lbnQgZm9vfX1cbiAgICAgICAgLy8gICB7e2Vsc2V9fVxuICAgICAgICAvLyAgICAge3tmb299fVxuICAgICAgICAvLyAgIHt7L2lmfX1cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSG93ZXZlciwgaW4gcHJhY3RpY2UsIHRoZXJlIG1pZ2h0IGJlIGEgbGFyZ2UgYW1vdXQgb2YgdGhlc2UgY2FsbHNpdGVzXG4gICAgICAgIC8vIGFuZCBtb3N0IG9mIHRoZW0gd291bGQgcmVzb2x2ZSB0byBhIHNpbXBsZSB2YWx1ZSBsb29rdXAuIFRoZXJlZm9yZSwgd2VcbiAgICAgICAgLy8gdHJpZWQgdG8gYmUgb3B0aW1pc3RpYyBhbmQgYXNzdW1lZCB0aGF0IHRoZSBjYWxsc2l0ZSB3aWxsIHJlc29sdmUgdG9cbiAgICAgICAgLy8gYXBwZW5kaW5nIGEgc2ltcGxlIHZhbHVlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBIb3dldmVyLCB3ZSBoYXZlIHJlYWNoZWQgaGVyZSBiZWNhdXNlIGF0IHJ1bnRpbWUsIHRoZSBndWFyZCBjb25kaXRpb25hbFxuICAgICAgICAvLyBoYXZlIGRldGVjdGVkIHRoYXQgdGhpcyBjYWxsc2l0ZSBpcyBpbmRlZWQgcmVmZXJyaW5nIHRvIGEgY29tcG9uZW50XG4gICAgICAgIC8vIGRlZmluaXRpb24gb2JqZWN0LiBTaW5jZSB0aGlzIGlzIGxpa2VseSBnb2luZyB0byBiZSB0cnVlIGZvciBvdGhlclxuICAgICAgICAvLyBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2FsbHNpdGUsIGl0IGlzIG5vdyBhcHByb3BpYXRlIHRvIGRlb3B0IGludG8gdGhlXG4gICAgICAgIC8vIGV4cGFuZGVkIHZlcnNpb24gdGhhdCBoYW5kbGVzIGJvdGggY2FzZXMuIFRoZSBjb21waWxhdGlvbiB3b3VsZCBsb29rXG4gICAgICAgIC8vIGxpa2UgdGhpczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAgICAgICBFbnRlcihCRUdJTiwgRU5EKVxuICAgICAgICAvLyAgIEJFR0lOOiAgICAgIE5vb3BcbiAgICAgICAgLy8gICAgICAgICAgICAgICBUZXN0KGlzLWNvbXBvbmVudC1kZWZpbml0aW9uKVxuICAgICAgICAvLyAgICAgICAgICAgICAgIEp1bXBVbmxlc3MoVkFMVUUpXG4gICAgICAgIC8vICAgQ09NUE9ORU5UOiAgTm9vcFxuICAgICAgICAvLyAgICAgICAgICAgICAgIFB1dER5bmFtaWNDb21wb25lbnREZWZpbml0aW9uT3Bjb2RlXG4gICAgICAgIC8vICAgICAgICAgICAgICAgT3BlbkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgICAgICAgICAgIENsb3NlQ29tcG9uZW50XG4gICAgICAgIC8vICAgICAgICAgICAgICAgSnVtcChFTkQpXG4gICAgICAgIC8vICAgVkFMVUU6ICAgICAgTm9vcFxuICAgICAgICAvLyAgICAgICAgICAgICAgIE9wdGltaXplZEFwcGVuZFxuICAgICAgICAvLyAgIEVORDogICAgICAgIE5vb3BcbiAgICAgICAgLy8gICAgICAgICAgICAgICBFeGl0XG4gICAgICAgIC8vXG4gICAgICAgIC8vIEtlZXAgaW4gbWluZCB0aGF0IGV2ZW4gaWYgd2UgKmRvbid0KiByZWFjaCBoZXJlIGF0IGluaXRpYWwgcmVuZGVyIHRpbWUsXG4gICAgICAgIC8vIGl0IGlzIHN0aWxsIHBvc3NpYmxlIChhbHRob3VnaCBxdWl0ZSByYXJlKSB0aGF0IHRoZSBzaW1wbGUgdmFsdWUgd2VcbiAgICAgICAgLy8gZW5jb3VudGVyIGR1cmluZyBpbml0aWFsIHJlbmRlciBjb3VsZCBsYXRlciBjaGFuZ2UgaW50byBhIGNvbXBvbmVudFxuICAgICAgICAvLyBkZWZpbml0aW9uIG9iamVjdCBhdCB1cGRhdGUgdGltZS4gVGhhdCBpcyBoYW5kbGVkIGJ5IHRoZSBcImxhenkgZGVvcHRcIlxuICAgICAgICAvLyBjb2RlIG9uIHRoZSB1cGRhdGUgc2lkZSAoc2Nyb2xsIGRvd24gZm9yIHRoZSBuZXh0IGJpZyBibG9jayBvZiBjb21tZW50KS5cbiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBDb21waWxlSW50b0xpc3QoZW52LCBudWxsKTtcbiAgICAgICAgbGV0IGRzbCA9IG5ldyBPcGNvZGVCdWlsZGVyRFNMKGJ1ZmZlciwgdGhpcy5zeW1ib2xUYWJsZSwgZW52KTtcbiAgICAgICAgZHNsLmJsb2NrKHsgdGVtcGxhdGVzOiBudWxsIH0sIChkc2wsIEJFR0lOLCBFTkQpID0+IHtcbiAgICAgICAgICAgIGRzbC5wdXRWYWx1ZSh0aGlzLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgZHNsLnRlc3QoSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlLmNyZWF0ZSk7XG4gICAgICAgICAgICBkc2wuanVtcFVubGVzcygnVkFMVUUnKTtcbiAgICAgICAgICAgIGRzbC5sYWJlbCgnQ09NUE9ORU5UJyk7XG4gICAgICAgICAgICBkc2wucHV0RHluYW1pY0NvbXBvbmVudERlZmluaXRpb24oKTtcbiAgICAgICAgICAgIGRzbC5vcGVuQ29tcG9uZW50KEFyZ3MuZW1wdHkoKSk7XG4gICAgICAgICAgICBkc2wuY2xvc2VDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGRzbC5qdW1wKEVORCk7XG4gICAgICAgICAgICBkc2wubGFiZWwoJ1ZBTFVFJyk7XG4gICAgICAgICAgICBkc2wuYXBwZW5kKG5ldyB0aGlzLkFwcGVuZE9wY29kZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBkZW9wdGVkID0gdGhpcy5kZW9wdGVkID0gZHNsLnRvT3BTZXEoKTtcbiAgICAgICAgLy8gRnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBoYXZlIGVzc2VudGlhbGx5IHJlcGxhY2VkIG91cnNlbHZlIHdpdGggYSBuZXcgc2V0XG4gICAgICAgIC8vIG9mIG9wY29kZXMuIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGluZyB0aGUgbmV3L2Rlb3B0ZWQgY29kZSwgaXQnc1xuICAgICAgICAvLyBhIGdvb2QgaWRlYSAoYXMgYSBwYXR0ZXJuKSB0byBudWxsIG91dCBhbnkgdW5uZWVkZWQgZmllbGRzIGhlcmUgdG8gYXZvaWRcbiAgICAgICAgLy8gaG9sZGluZyBvbiB0byB1bm5lZWRlZC9zdGFsZSBvYmplY3RzOlxuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBudWxsO1xuICAgICAgICByZXR1cm4gZGVvcHRlZDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgeyBfZ3VpZDogZ3VpZCwgdHlwZSwgZGVvcHRlZCB9ID0gdGhpcztcbiAgICAgICAgaWYgKGRlb3B0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZ3VpZCxcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIGRlb3B0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGRlb3B0ZWQudG9BcnJheSgpLm1hcChvcCA9PiBvcC50b0pTT04oKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGd1aWQsXG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBhcmdzOiBbdGhpcy5leHByZXNzaW9uLnRvSlNPTigpXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIElzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSBleHRlbmRzIENvbmRpdGlvbmFsUmVmZXJlbmNlIHtcbiAgICBzdGF0aWMgY3JlYXRlKGlubmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlKGlubmVyKTtcbiAgICB9XG4gICAgdG9Cb29sKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpc0NvbXBvbmVudERlZmluaXRpb24odmFsdWUpO1xuICAgIH1cbn1cbmNsYXNzIFVwZGF0ZU9wY29kZSBleHRlbmRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihjYWNoZSwgYm91bmRzLCB1cHNlcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IGJvdW5kcztcbiAgICAgICAgdGhpcy51cHNlcnQgPSB1cHNlcnQ7XG4gICAgICAgIHRoaXMudGFnID0gY2FjaGUudGFnO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmNhY2hlLnJldmFsaWRhdGUoKTtcbiAgICAgICAgaWYgKGlzTW9kaWZpZWQodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgeyBib3VuZHMsIHVwc2VydCB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB7IGRvbSB9ID0gdm07XG4gICAgICAgICAgICBpZiAoIXRoaXMudXBzZXJ0LnVwZGF0ZShkb20sIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3IgPSBuZXcgQ3Vyc29yKGJvdW5kcy5wYXJlbnRFbGVtZW50KCksIGNsZWFyKGJvdW5kcykpO1xuICAgICAgICAgICAgICAgIHVwc2VydCA9IHRoaXMudXBzZXJ0ID0gdGhpcy5pbnNlcnQodm0uZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBib3VuZHMudXBkYXRlKHVwc2VydC5ib3VuZHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IHsgX2d1aWQ6IGd1aWQsIHR5cGUsIGNhY2hlIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ3VpZCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBkZXRhaWxzOiB7IGxhc3RWYWx1ZTogSlNPTi5zdHJpbmdpZnkoY2FjaGUucGVlaygpKSB9XG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEd1YXJkZWRVcGRhdGVPcGNvZGUgZXh0ZW5kcyBVcGRhdGVPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKHJlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0LCBhcHBlbmRPcGNvZGUsIHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKGNhY2hlLCBib3VuZHMsIHVwc2VydCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgICAgICB0aGlzLmFwcGVuZE9wY29kZSA9IGFwcGVuZE9wY29kZTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLmRlb3B0ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLnRhZyA9IHRoaXMuX3RhZyA9IG5ldyBVcGRhdGFibGVUYWcodGhpcy50YWcpO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBpZiAodGhpcy5kZW9wdGVkKSB7XG4gICAgICAgICAgICB2bS5ldmFsdWF0ZU9wY29kZSh0aGlzLmRlb3B0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmaW5pdGlvbih0aGlzLnJlZmVyZW5jZS52YWx1ZSgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGF6eURlb3B0KHZtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1cGVyLmV2YWx1YXRlKHZtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsYXp5RGVvcHQodm0pIHtcbiAgICAgICAgLy8gRHVyaWduIGluaXRpYWwgcmVuZGVyLCB3ZSBrbm93IHRoYXQgdGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBjb250YWluIGFcbiAgICAgICAgLy8gY29tcG9uZW50IGRlZmluaXRpb24sIHNvIHdlIG9wdGltaXN0aWNhbGx5IGFzc3VtZWQgdGhhdCB0aGlzIGFwcGVuZFxuICAgICAgICAvLyBpcyBqdXN0IGEgbm9ybWFsIGFwcGVuZC4gSG93ZXZlciwgYXQgdXBkYXRlIHRpbWUsIHdlIGRpc2NvdmVyZWQgdGhhdFxuICAgICAgICAvLyB0aGUgcmVmZXJlbmNlIGhhcyBzd2l0Y2hlZCBpbnRvIGNvbnRhaW5pbmcgYSBjb21wb25lbnQgZGVmaW5pdGlvbiwgc29cbiAgICAgICAgLy8gd2UgbmVlZCB0byBkbyBhIFwibGF6eSBkZW9wdFwiLCBzaW11bGF0aW5nIHdoYXQgd291bGQgaGF2ZSBoYXBwZW5lZCBpZlxuICAgICAgICAvLyB3ZSBoYWQgZGVjaWRlZCB0byBwZXJmb3JtIHRoZSBkZW9wdCBpbiB0aGUgZmlyc3QgcGxhY2UgZHVyaW5nIGluaXRpYWxcbiAgICAgICAgLy8gcmVuZGVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBNb3JlIGNvbmNyZXRlbHksIHdlIHdvdWxkIGhhdmUgZXhwYW5kZWQgdGhlIGN1cmx5IGludG8gYSBpZi9lbHNlLCBhbmRcbiAgICAgICAgLy8gYmFzZWQgb24gd2hldGhlciB0aGUgdmFsdWUgaXMgYSBjb21wb25lbnQgZGVmaW5pdGlvbiBvciBub3QsIHdlIHdvdWxkXG4gICAgICAgIC8vIGhhdmUgZW50ZXJlZCBlaXRoZXIgdGhlIGR5bmFtaWMgY29tcG9uZW50IGJyYW5jaCBvciB0aGUgc2ltcGxlIHZhbHVlXG4gICAgICAgIC8vIGJyYW5jaC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2luY2Ugd2UgcmVuZGVyZWQgYSBzaW1wbGUgdmFsdWUgZHVyaW5nIGluaXRpYWwgcmVuZGVyIChhbmQgYWxsIHRoZVxuICAgICAgICAvLyB1cGRhdGVzIHVwIHVudGlsIHRoaXMgcG9pbnQpLCB3ZSBuZWVkIHRvIHByZXRlbmQgdGhhdCB0aGUgcmVzdWx0IGlzXG4gICAgICAgIC8vIHByb2R1Y2VkIGJ5IHRoZSBcIlZBTFVFXCIgYnJhbmNoIG9mIHRoZSBkZW9wdGVkIGFwcGVuZCBvcGNvZGU6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgVHJ5KEJFR0lOLCBFTkQpXG4gICAgICAgIC8vICAgICBBc3NlcnQoSXNDb21wb25lbnREZWZpbml0aW9uLCBleHBlY3RlZD1mYWxzZSlcbiAgICAgICAgLy8gICAgIE9wdGltaXplZFVwZGF0ZVxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBoYXMgc3dpdGNoZWQgZnJvbSBiZWluZyBhIHNpbXBsZVxuICAgICAgICAvLyB2YWx1ZSBpbnRvIGEgY29tcG9uZW50IGRlZmluaXRpb24sIHdoYXQgd291bGQgaGF2ZSBoYXBwZW5lZCBpcyB0aGF0XG4gICAgICAgIC8vIHRoZSBhc3NlcnQgd291bGQgdGhyb3csIGNhdXNpbmcgdGhlIFRyeSBvcGNvZGUgdG8gdGVhcmRvd24gdGhlIGJvdW5kc1xuICAgICAgICAvLyBhbmQgcmVydW4gdGhlIG9yaWdpbmFsIGFwcGVuZCBvcGNvZGUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNpbmNlIHRoZSBUcnkgb3Bjb2RlIHdvdWxkIGhhdmUgbnVrZWQgdGhlIHVwZGF0aW5nIG9wY29kZXMgYW55d2F5LCB3ZVxuICAgICAgICAvLyB3b3VsZG4ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNpbXVsYXRpbmcgdGhvc2UuIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIFRyeSBvcGNvZGUgYW5kIGltbWVkaWF0ZWx5IHRocm93LlxuICAgICAgICBsZXQgeyBib3VuZHMsIGFwcGVuZE9wY29kZSwgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBhcHBlbmRPcHMgPSBhcHBlbmRPcGNvZGUuZGVvcHQodm0uZW52KTtcbiAgICAgICAgbGV0IGVudGVyID0gYXBwZW5kT3BzLmhlYWQoKTtcbiAgICAgICAgbGV0IG9wcyA9IGVudGVyLnNsaWNlO1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBVcGRhdGFibGVCbG9ja1RyYWNrZXIoYm91bmRzLnBhcmVudEVsZW1lbnQoKSk7XG4gICAgICAgIHRyYWNrZXIubmV3Qm91bmRzKHRoaXMuYm91bmRzKTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgbGV0IGRlb3B0ZWQgPSB0aGlzLmRlb3B0ZWQgPSBuZXcgVHJ5T3Bjb2RlKG9wcywgc3RhdGUsIHRyYWNrZXIsIGNoaWxkcmVuKTtcbiAgICAgICAgdGhpcy5fdGFnLnVwZGF0ZShkZW9wdGVkLnRhZyk7XG4gICAgICAgIHZtLmV2YWx1YXRlT3Bjb2RlKGRlb3B0ZWQpO1xuICAgICAgICB2bS50aHJvdygpO1xuICAgICAgICAvLyBGcm9tIHRoaXMgcG9pbnQgb24sIHdlIGhhdmUgZXNzZW50aWFsbHkgcmVwbGFjZWQgb3Vyc2VsdmUgd2l0aCBhIG5ld1xuICAgICAgICAvLyBvcGNvZGUuIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGluZyB0aGUgbmV3L2Rlb3B0ZWQgY29kZSwgaXQncyBhXG4gICAgICAgIC8vIGdvb2QgaWRlYSAoYXMgYSBwYXR0ZXJuKSB0byBudWxsIG91dCBhbnkgdW5uZWVkZWQgZmllbGRzIGhlcmUgdG8gYXZvaWRcbiAgICAgICAgLy8gaG9sZGluZyBvbiB0byB1bm5lZWRlZC9zdGFsZSBvYmplY3RzOlxuICAgICAgICB0aGlzLl90YWcgPSBudWxsO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IG51bGw7XG4gICAgICAgIHRoaXMudXBzZXJ0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5hcHBlbmRPcGNvZGUgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgeyBfZ3VpZDogZ3VpZCwgdHlwZSwgZGVvcHRlZCB9ID0gdGhpcztcbiAgICAgICAgaWYgKGRlb3B0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZ3VpZCxcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIGRlb3B0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtkZW9wdGVkLnRvSlNPTigpXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci50b0pTT04oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZWRDYXV0aW91c0FwcGVuZE9wY29kZSBleHRlbmRzIEFwcGVuZE9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdvcHRpbWl6ZWQtY2F1dGlvdXMtYXBwZW5kJztcbiAgICB9XG4gICAgbm9ybWFsaXplKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gbWFwKHJlZmVyZW5jZSwgbm9ybWFsaXplVmFsdWUpO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjYXV0aW91c0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICB1cGRhdGVXaXRoKHZtLCByZWZlcmVuY2UsIGNhY2hlLCBib3VuZHMsIHVwc2VydCkge1xuICAgICAgICByZXR1cm4gbmV3IE9wdGltaXplZENhdXRpb3VzVXBkYXRlT3Bjb2RlKGNhY2hlLCBib3VuZHMsIHVwc2VydCk7XG4gICAgfVxufVxuY2xhc3MgT3B0aW1pemVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUgZXh0ZW5kcyBVcGRhdGVPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnb3B0aW1pemVkLWNhdXRpb3VzLXVwZGF0ZSc7XG4gICAgfVxuICAgIGluc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEd1YXJkZWRDYXV0aW91c0FwcGVuZE9wY29kZSBleHRlbmRzIEd1YXJkZWRBcHBlbmRPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZ3VhcmRlZC1jYXV0aW91cy1hcHBlbmQnO1xuICAgICAgICB0aGlzLkFwcGVuZE9wY29kZSA9IE9wdGltaXplZENhdXRpb3VzQXBwZW5kT3Bjb2RlO1xuICAgIH1cbiAgICBub3JtYWxpemUocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVWYWx1ZSk7XG4gICAgfVxuICAgIGluc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxuICAgIHVwZGF0ZVdpdGgodm0sIHJlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0KSB7XG4gICAgICAgIHJldHVybiBuZXcgR3VhcmRlZENhdXRpb3VzVXBkYXRlT3Bjb2RlKHJlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0LCB0aGlzLCB2bS5jYXB0dXJlKCkpO1xuICAgIH1cbn1cbmNsYXNzIEd1YXJkZWRDYXV0aW91c1VwZGF0ZU9wY29kZSBleHRlbmRzIEd1YXJkZWRVcGRhdGVPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZ3VhcmRlZC1jYXV0aW91cy11cGRhdGUnO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjYXV0aW91c0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZWRUcnVzdGluZ0FwcGVuZE9wY29kZSBleHRlbmRzIEFwcGVuZE9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdvcHRpbWl6ZWQtdHJ1c3RpbmctYXBwZW5kJztcbiAgICB9XG4gICAgbm9ybWFsaXplKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gbWFwKHJlZmVyZW5jZSwgbm9ybWFsaXplVHJ1c3RlZFZhbHVlKTtcbiAgICB9XG4gICAgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1c3RpbmdJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgdXBkYXRlV2l0aCh2bSwgcmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcHRpbWl6ZWRUcnVzdGluZ1VwZGF0ZU9wY29kZShjYWNoZSwgYm91bmRzLCB1cHNlcnQpO1xuICAgIH1cbn1cbmNsYXNzIE9wdGltaXplZFRydXN0aW5nVXBkYXRlT3Bjb2RlIGV4dGVuZHMgVXBkYXRlT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ29wdGltaXplZC10cnVzdGluZy11cGRhdGUnO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHdWFyZGVkVHJ1c3RpbmdBcHBlbmRPcGNvZGUgZXh0ZW5kcyBHdWFyZGVkQXBwZW5kT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2d1YXJkZWQtdHJ1c3RpbmctYXBwZW5kJztcbiAgICAgICAgdGhpcy5BcHBlbmRPcGNvZGUgPSBPcHRpbWl6ZWRUcnVzdGluZ0FwcGVuZE9wY29kZTtcbiAgICB9XG4gICAgbm9ybWFsaXplKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gbWFwKHJlZmVyZW5jZSwgbm9ybWFsaXplVHJ1c3RlZFZhbHVlKTtcbiAgICB9XG4gICAgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1c3RpbmdJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgdXBkYXRlV2l0aCh2bSwgcmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHdWFyZGVkVHJ1c3RpbmdVcGRhdGVPcGNvZGUocmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQsIHRoaXMsIHZtLmNhcHR1cmUoKSk7XG4gICAgfVxufVxuY2xhc3MgR3VhcmRlZFRydXN0aW5nVXBkYXRlT3Bjb2RlIGV4dGVuZHMgR3VhcmRlZFVwZGF0ZU9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICd0cnVzdGluZy11cGRhdGUnO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcnVudGltZS9saWIvY29tcGlsZWQvb3Bjb2Rlcy9jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUErQkEsYUFBQSxPQUFBLENBQWlCLEtBQWEsRUFBQTtBQUM1QixlQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxVQUFVLENBQUM7S0FDekY7O0FBRUssYUFBQSxrQkFBQSxDQUE2QixLQUFhLEVBQUE7QUFDOUMsWUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbEIsbUJBQU8sRUFBRSxDQUFDO1NBQ1g7QUFDRCxlQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN0Qjs7QUFFSyxhQUFBLHFCQUFBLENBQWdDLEtBQWEsRUFBQTtBQUNqRCxZQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNsQixtQkFBTyxFQUFFLENBQUM7U0FDWDtBQUNELFlBQUkseUJBdkNKLFFBQVEsQ0F1Q0ssS0FBSyxDQUFDLEVBQUU7QUFDbkIsbUJBQU8sS0FBSyxDQUFDO1NBQ2Q7QUFDRCxZQUFJLHlCQTVDSixZQUFZLENBNENLLEtBQUssQ0FBQyxFQUFFO0FBQ3ZCLG1CQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN2QjtBQUNELFlBQUkseUJBOUNKLE1BQU0sQ0E4Q0ssS0FBSyxDQUFDLEVBQUU7QUFDakIsbUJBQU8sS0FBSyxDQUFDO1NBQ2Q7QUFDRCxlQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN0Qjs7QUFFSyxhQUFBLGNBQUEsQ0FBeUIsS0FBYSxFQUFBO0FBQzFDLFlBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ2xCLG1CQUFPLEVBQUUsQ0FBQztTQUNYO0FBQ0QsWUFBSSx5QkF2REosUUFBUSxDQXVESyxLQUFLLENBQUMsRUFBRTtBQUNuQixtQkFBTyxLQUFLLENBQUM7U0FDZDtB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QUMzQzs7QUFYRyxtQ0FBbUMsV0FhN0IsVUFBVSxHQUFBLG9CQUFDLEVBQU0sRUFBRSxTQUE0QixFQUFFLEtBQXdDLEVBQUUsTUFBZ0IsRUFBRSxNQUFjLEVBQUE7QUFDbkksbUJBQU8sSUFBSSwyQkFBMkIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzlGOztlQWZHLDJCQUFtQztPQUFRLG1CQUFzQzs7OztRQWtCdkYsMkJBQWtDOzhCQUFsQywyQkFBa0M7O0FBQWxDLGlCQUFBLDJCQUFrQyxHQUFsQztBQ3hFUSw4Q0FBUyxTQUFTLENBQUMsQ0FBQztBRHlFMUIsZ0JBQUEsQ0FBQSxJQUFJLEdBQUcsaUJBQWlCLENBQUM7U0FLMUI7O0FBTkQsbUNBQWtDLFdBR3RCLE1BQU0sR0FBQSxnQkFBQyxHQUF3QixFQUFFLE1BQWMsRUFBRSxLQUF3QixFQUFBO0FBQ2pGLG1CQUFPLHlCQXBkVCxjQUFjLENBb2RVLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7O2VBTEgsMkJBQWtDO09BQVEsbUJBQXNDIiwiZmlsZSI6ImNvbnRlbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVXBzZXJ0LCB7XG4gIEluc2VydGlvbixcbiAgQ2F1dGlvdXNJbnNlcnRpb24sXG4gIFRydXN0aW5nSW5zZXJ0aW9uLFxuXG4gIGlzU2FmZVN0cmluZyxcbiAgaXNOb2RlLFxuICBpc1N0cmluZyxcblxuICBjYXV0aW91c0luc2VydCxcbiAgdHJ1c3RpbmdJbnNlcnRcbn0gZnJvbSAnLi4vLi4vdXBzZXJ0JztcbmltcG9ydCB7IGlzQ29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvbXBvbmVudC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERPTVRyZWVDb25zdHJ1Y3Rpb24gfSBmcm9tICcuLi8uLi9kb20vaGVscGVyJztcbmltcG9ydCB7IE9wU2VxLCBPcGNvZGUsIE9wY29kZUpTT04sIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBDb21waWxlZEV4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9ucyc7XG5pbXBvcnQgeyBWTSwgVXBkYXRpbmdWTSB9IGZyb20gJy4uLy4uL3ZtJztcbmltcG9ydCB7IFRyeU9wY29kZSwgVk1TdGF0ZSB9IGZyb20gJy4uLy4uL3ZtL3VwZGF0ZSc7XG5pbXBvcnQgeyBFbnRlck9wY29kZSB9IGZyb20gJy4vdm0nO1xuaW1wb3J0IHsgUmVmZXJlbmNlLCBSZWZlcmVuY2VDYWNoZSwgVXBkYXRhYmxlVGFnLCBpc01vZGlmaWVkLCBpc0NvbnN0LCBtYXAgfSBmcm9tICdnbGltbWVyLXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBPcGFxdWUsIExpbmtlZExpc3QgfSBmcm9tICdnbGltbWVyLXV0aWwnO1xuaW1wb3J0IHsgQ3Vyc29yLCBjbGVhciB9IGZyb20gJy4uLy4uL2JvdW5kcyc7XG5pbXBvcnQgeyBGcmFnbWVudCB9IGZyb20gJy4uLy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgQ29tcGlsZUludG9MaXN0IH0gZnJvbSAnLi4vLi4vY29tcGlsZXInO1xuaW1wb3J0IE9wY29kZUJ1aWxkZXJEU0wgZnJvbSAnLi9idWlsZGVyJztcbmltcG9ydCB7IENvbmRpdGlvbmFsUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vcmVmZXJlbmNlcyc7XG5pbXBvcnQgeyBBcmdzIH0gZnJvbSAnLi4vLi4vc3ludGF4L2NvcmUnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBVcGRhdGFibGVCbG9ja1RyYWNrZXIgfSBmcm9tICcuLi8uLi9idWlsZGVyJztcbmltcG9ydCBTeW1ib2xUYWJsZSBmcm9tICcuLi8uLi9zeW1ib2wtdGFibGUnO1xuXG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlOiBPcGFxdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlWyd0b1N0cmluZyddICE9PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGV4dFZhbHVlKHZhbHVlOiBPcGFxdWUpOiBzdHJpbmcge1xuICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUcnVzdGVkVmFsdWUodmFsdWU6IE9wYXF1ZSk6IFRydXN0aW5nSW5zZXJ0aW9uIHtcbiAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU2FmZVN0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUudG9IVE1MKCk7XG4gIH1cbiAgaWYgKGlzTm9kZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZTogT3BhcXVlKTogQ2F1dGlvdXNJbnNlcnRpb24ge1xuICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTYWZlU3RyaW5nKHZhbHVlKSB8fCBpc05vZGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBwZW5kT3Bjb2RlPFQgZXh0ZW5kcyBJbnNlcnRpb24+IGV4dGVuZHMgT3Bjb2RlIHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5vcm1hbGl6ZShyZWZlcmVuY2U6IFJlZmVyZW5jZTxPcGFxdWU+KTogUmVmZXJlbmNlPFQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW5zZXJ0KGRvbTogRE9NVHJlZUNvbnN0cnVjdGlvbiwgY3Vyc29yOiBDdXJzb3IsIHZhbHVlOiBUKTogVXBzZXJ0O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgdXBkYXRlV2l0aCh2bTogVk0sIHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4sIGNhY2hlOiBSZWZlcmVuY2VDYWNoZTxUPiwgYm91bmRzOiBGcmFnbWVudCwgdXBzZXJ0OiBVcHNlcnQpOiBVcGRhdGVPcGNvZGU8VD47XG5cbiAgZXZhbHVhdGUodm06IFZNKSB7XG4gICAgbGV0IHJlZmVyZW5jZSA9IHZtLmZyYW1lLmdldE9wZXJhbmQoKTtcbiAgICBsZXQgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplKHJlZmVyZW5jZSk7XG5cbiAgICBsZXQgdmFsdWUsIGNhY2hlO1xuXG4gICAgaWYgKGlzQ29uc3QocmVmZXJlbmNlKSkge1xuICAgICAgdmFsdWUgPSBub3JtYWxpemVkLnZhbHVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlID0gbmV3IFJlZmVyZW5jZUNhY2hlKG5vcm1hbGl6ZWQpO1xuICAgICAgdmFsdWUgPSBjYWNoZS5wZWVrKCk7XG4gICAgfVxuXG4gICAgbGV0IHN0YWNrID0gdm0uc3RhY2soKTtcbiAgICBsZXQgdXBzZXJ0ID0gdGhpcy5pbnNlcnQodm0uZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKSwgc3RhY2ssIHZhbHVlKTtcbiAgICBsZXQgYm91bmRzID0gbmV3IEZyYWdtZW50KHVwc2VydC5ib3VuZHMpO1xuXG4gICAgc3RhY2submV3Qm91bmRzKGJvdW5kcyk7XG5cbiAgICBpZiAoY2FjaGUgLyogaS5lLiAhaXNDb25zdChyZWZlcmVuY2UpICovKSB7XG4gICAgICB2bS51cGRhdGVXaXRoKHRoaXMudXBkYXRlV2l0aCh2bSwgcmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQpKTtcbiAgICB9XG4gIH1cblxuICB0b0pTT04oKTogT3Bjb2RlSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGd1aWQ6IHRoaXMuX2d1aWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBhcmdzOiBbXCIkT1BFUkFORFwiXVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEd1YXJkZWRBcHBlbmRPcGNvZGU8VCBleHRlbmRzIEluc2VydGlvbj4gZXh0ZW5kcyBBcHBlbmRPcGNvZGU8VD4ge1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgQXBwZW5kT3Bjb2RlOiB0eXBlb2YgT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUgfCB0eXBlb2YgT3B0aW1pemVkVHJ1c3RpbmdBcHBlbmRPcGNvZGU7XG4gIHByaXZhdGUgZGVvcHRlZDogT3BTZXEgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbjogQ29tcGlsZWRFeHByZXNzaW9uPGFueT4sIHByaXZhdGUgc3ltYm9sVGFibGU6IFN5bWJvbFRhYmxlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBWTSkge1xuICAgIGlmICh0aGlzLmRlb3B0ZWQpIHtcbiAgICAgIHZtLnB1c2hFdmFsRnJhbWUodGhpcy5kZW9wdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uZXZhbHVhdGVPcGVyYW5kKHRoaXMuZXhwcmVzc2lvbik7XG5cbiAgICAgIGxldCB2YWx1ZSA9IHZtLmZyYW1lLmdldE9wZXJhbmQoKS52YWx1ZSgpO1xuXG4gICAgICBpZihpc0NvbXBvbmVudERlZmluaXRpb24odmFsdWUpKSB7XG4gICAgICAgIHZtLnB1c2hFdmFsRnJhbWUodGhpcy5kZW9wdCh2bS5lbnYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cGVyLmV2YWx1YXRlKHZtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVvcHQoZW52OiBFbnZpcm9ubWVudCk6IE9wU2VxIHsgLy8gUHVibGljIGJlY2F1c2UgaXQncyB1c2VkIGluIHRoZSBsYXp5IGRlb3B0XG4gICAgLy8gQXQgY29tcGlsZSB0aW1lLCB3ZSBkZXRlcm1pbmVkIHRoYXQgdGhpcyBhcHBlbmQgY2FsbHNpdGUgbWlnaHQgcmVmZXJcbiAgICAvLyB0byBhIGxvY2FsIHZhcmlhYmxlL3Byb3BlcnR5IGxvb2t1cCB0aGF0IHJlc29sdmVzIHRvIGEgY29tcG9uZW50XG4gICAgLy8gZGVmaW5pdGlvbiBhdCBydW50aW1lLlxuICAgIC8vXG4gICAgLy8gV2UgY291bGQgaGF2ZSBlYWdlcmx5IGNvbXBpbGVkIHRoaXMgY2FsbHNpdGUgaW50byBzb21ldGhpbmcgbGlrZSB0aGlzOlxuICAgIC8vXG4gICAgLy8gICB7eyNpZiAoaXMtY29tcG9uZW50LWRlZmluaXRpb24gZm9vKX19XG4gICAgLy8gICAgIHt7Y29tcG9uZW50IGZvb319XG4gICAgLy8gICB7e2Vsc2V9fVxuICAgIC8vICAgICB7e2Zvb319XG4gICAgLy8gICB7ey9pZn19XG4gICAgLy9cbiAgICAvLyBIb3dldmVyLCBpbiBwcmFjdGljZSwgdGhlcmUgbWlnaHQgYmUgYSBsYXJnZSBhbW91dCBvZiB0aGVzZSBjYWxsc2l0ZXNcbiAgICAvLyBhbmQgbW9zdCBvZiB0aGVtIHdvdWxkIHJlc29sdmUgdG8gYSBzaW1wbGUgdmFsdWUgbG9va3VwLiBUaGVyZWZvcmUsIHdlXG4gICAgLy8gdHJpZWQgdG8gYmUgb3B0aW1pc3RpYyBhbmQgYXNzdW1lZCB0aGF0IHRoZSBjYWxsc2l0ZSB3aWxsIHJlc29sdmUgdG9cbiAgICAvLyBhcHBlbmRpbmcgYSBzaW1wbGUgdmFsdWUuXG4gICAgLy9cbiAgICAvLyBIb3dldmVyLCB3ZSBoYXZlIHJlYWNoZWQgaGVyZSBiZWNhdXNlIGF0IHJ1bnRpbWUsIHRoZSBndWFyZCBjb25kaXRpb25hbFxuICAgIC8vIGhhdmUgZGV0ZWN0ZWQgdGhhdCB0aGlzIGNhbGxzaXRlIGlzIGluZGVlZCByZWZlcnJpbmcgdG8gYSBjb21wb25lbnRcbiAgICAvLyBkZWZpbml0aW9uIG9iamVjdC4gU2luY2UgdGhpcyBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgdHJ1ZSBmb3Igb3RoZXJcbiAgICAvLyBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2FsbHNpdGUsIGl0IGlzIG5vdyBhcHByb3BpYXRlIHRvIGRlb3B0IGludG8gdGhlXG4gICAgLy8gZXhwYW5kZWQgdmVyc2lvbiB0aGF0IGhhbmRsZXMgYm90aCBjYXNlcy4gVGhlIGNvbXBpbGF0aW9uIHdvdWxkIGxvb2tcbiAgICAvLyBsaWtlIHRoaXM6XG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAgIEVudGVyKEJFR0lOLCBFTkQpXG4gICAgLy8gICBCRUdJTjogICAgICBOb29wXG4gICAgLy8gICAgICAgICAgICAgICBUZXN0KGlzLWNvbXBvbmVudC1kZWZpbml0aW9uKVxuICAgIC8vICAgICAgICAgICAgICAgSnVtcFVubGVzcyhWQUxVRSlcbiAgICAvLyAgIENPTVBPTkVOVDogIE5vb3BcbiAgICAvLyAgICAgICAgICAgICAgIFB1dER5bmFtaWNDb21wb25lbnREZWZpbml0aW9uT3Bjb2RlXG4gICAgLy8gICAgICAgICAgICAgICBPcGVuQ29tcG9uZW50XG4gICAgLy8gICAgICAgICAgICAgICBDbG9zZUNvbXBvbmVudFxuICAgIC8vICAgICAgICAgICAgICAgSnVtcChFTkQpXG4gICAgLy8gICBWQUxVRTogICAgICBOb29wXG4gICAgLy8gICAgICAgICAgICAgICBPcHRpbWl6ZWRBcHBlbmRcbiAgICAvLyAgIEVORDogICAgICAgIE5vb3BcbiAgICAvLyAgICAgICAgICAgICAgIEV4aXRcbiAgICAvL1xuICAgIC8vIEtlZXAgaW4gbWluZCB0aGF0IGV2ZW4gaWYgd2UgKmRvbid0KiByZWFjaCBoZXJlIGF0IGluaXRpYWwgcmVuZGVyIHRpbWUsXG4gICAgLy8gaXQgaXMgc3RpbGwgcG9zc2libGUgKGFsdGhvdWdoIHF1aXRlIHJhcmUpIHRoYXQgdGhlIHNpbXBsZSB2YWx1ZSB3ZVxuICAgIC8vIGVuY291bnRlciBkdXJpbmcgaW5pdGlhbCByZW5kZXIgY291bGQgbGF0ZXIgY2hhbmdlIGludG8gYSBjb21wb25lbnRcbiAgICAvLyBkZWZpbml0aW9uIG9iamVjdCBhdCB1cGRhdGUgdGltZS4gVGhhdCBpcyBoYW5kbGVkIGJ5IHRoZSBcImxhenkgZGVvcHRcIlxuICAgIC8vIGNvZGUgb24gdGhlIHVwZGF0ZSBzaWRlIChzY3JvbGwgZG93biBmb3IgdGhlIG5leHQgYmlnIGJsb2NrIG9mIGNvbW1lbnQpLlxuXG4gICAgbGV0IGJ1ZmZlciA9IG5ldyBDb21waWxlSW50b0xpc3QoZW52LCBudWxsKTtcbiAgICBsZXQgZHNsID0gbmV3IE9wY29kZUJ1aWxkZXJEU0woYnVmZmVyLCB0aGlzLnN5bWJvbFRhYmxlLCBlbnYpO1xuXG4gICAgZHNsLmJsb2NrKHsgdGVtcGxhdGVzOiBudWxsIH0sIChkc2wsIEJFR0lOLCBFTkQpID0+IHtcbiAgICAgIGRzbC5wdXRWYWx1ZSh0aGlzLmV4cHJlc3Npb24pO1xuICAgICAgZHNsLnRlc3QoSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlLmNyZWF0ZSk7XG4gICAgICBkc2wuanVtcFVubGVzcygnVkFMVUUnKTtcbiAgICAgIGRzbC5sYWJlbCgnQ09NUE9ORU5UJyk7XG4gICAgICBkc2wucHV0RHluYW1pY0NvbXBvbmVudERlZmluaXRpb24oKTtcbiAgICAgIGRzbC5vcGVuQ29tcG9uZW50KEFyZ3MuZW1wdHkoKSk7XG4gICAgICBkc2wuY2xvc2VDb21wb25lbnQoKTtcbiAgICAgIGRzbC5qdW1wKEVORCk7XG4gICAgICBkc2wubGFiZWwoJ1ZBTFVFJyk7XG4gICAgICBkc2wuYXBwZW5kKG5ldyB0aGlzLkFwcGVuZE9wY29kZSgpKTtcbiAgICB9KTtcblxuICAgIGxldCBkZW9wdGVkID0gdGhpcy5kZW9wdGVkID0gZHNsLnRvT3BTZXEoKTtcblxuICAgIC8vIEZyb20gdGhpcyBwb2ludCBvbiwgd2UgaGF2ZSBlc3NlbnRpYWxseSByZXBsYWNlZCBvdXJzZWx2ZSB3aXRoIGEgbmV3IHNldFxuICAgIC8vIG9mIG9wY29kZXMuIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGluZyB0aGUgbmV3L2Rlb3B0ZWQgY29kZSwgaXQnc1xuICAgIC8vIGEgZ29vZCBpZGVhIChhcyBhIHBhdHRlcm4pIHRvIG51bGwgb3V0IGFueSB1bm5lZWRlZCBmaWVsZHMgaGVyZSB0byBhdm9pZFxuICAgIC8vIGhvbGRpbmcgb24gdG8gdW5uZWVkZWQvc3RhbGUgb2JqZWN0czpcblxuICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7XG5cbiAgICByZXR1cm4gZGVvcHRlZDtcbiAgfVxuXG4gIHRvSlNPTigpOiBPcGNvZGVKU09OIHtcbiAgICBsZXQgeyBfZ3VpZDogZ3VpZCwgdHlwZSwgZGVvcHRlZCB9ID0gdGhpcztcblxuICAgIGlmIChkZW9wdGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBndWlkLFxuICAgICAgICB0eXBlLFxuICAgICAgICBkZW9wdGVkOiB0cnVlLFxuICAgICAgICBjaGlsZHJlbjogZGVvcHRlZC50b0FycmF5KCkubWFwKG9wID0+IG9wLnRvSlNPTigpKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ3VpZCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYXJnczogW3RoaXMuZXhwcmVzc2lvbi50b0pTT04oKV1cbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIElzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSBleHRlbmRzIENvbmRpdGlvbmFsUmVmZXJlbmNlIHtcbiAgc3RhdGljIGNyZWF0ZShpbm5lcjogUmVmZXJlbmNlPE9wYXF1ZT4pOiBJc0NvbXBvbmVudERlZmluaXRpb25SZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlKGlubmVyKTtcbiAgfVxuXG4gIHRvQm9vbCh2YWx1ZTogT3BhcXVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQ29tcG9uZW50RGVmaW5pdGlvbih2YWx1ZSk7XG4gIH1cbn1cblxuYWJzdHJhY3QgY2xhc3MgVXBkYXRlT3Bjb2RlPFQgZXh0ZW5kcyBJbnNlcnRpb24+IGV4dGVuZHMgVXBkYXRpbmdPcGNvZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY2FjaGU6IFJlZmVyZW5jZUNhY2hlPFQ+LFxuICAgIHByb3RlY3RlZCBib3VuZHM6IEZyYWdtZW50LFxuICAgIHByb3RlY3RlZCB1cHNlcnQ6IFVwc2VydFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFnID0gY2FjaGUudGFnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogVCk6IFVwc2VydDtcblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FjaGUucmV2YWxpZGF0ZSgpO1xuXG4gICAgaWYgKGlzTW9kaWZpZWQodmFsdWUpKSB7XG4gICAgICBsZXQgeyBib3VuZHMsIHVwc2VydCB9ID0gdGhpcztcbiAgICAgIGxldCB7IGRvbSB9ID0gdm07XG5cbiAgICAgIGlmKCF0aGlzLnVwc2VydC51cGRhdGUoZG9tLCB2YWx1ZSkpIHtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBDdXJzb3IoYm91bmRzLnBhcmVudEVsZW1lbnQoKSwgY2xlYXIoYm91bmRzKSk7XG4gICAgICAgIHVwc2VydCA9IHRoaXMudXBzZXJ0ID0gdGhpcy5pbnNlcnQodm0uZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKSwgY3Vyc29yLCB2YWx1ZSBhcyBUKTtcbiAgICAgIH1cblxuICAgICAgYm91bmRzLnVwZGF0ZSh1cHNlcnQuYm91bmRzKTtcbiAgICB9XG4gIH1cblxuICB0b0pTT04oKTogT3Bjb2RlSlNPTiB7XG4gICAgbGV0IHsgX2d1aWQ6IGd1aWQsIHR5cGUsIGNhY2hlIH0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGd1aWQsXG4gICAgICB0eXBlLFxuICAgICAgZGV0YWlsczogeyBsYXN0VmFsdWU6IEpTT04uc3RyaW5naWZ5KGNhY2hlLnBlZWsoKSkgfVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEd1YXJkZWRVcGRhdGVPcGNvZGU8VCBleHRlbmRzIEluc2VydGlvbj4gZXh0ZW5kcyBVcGRhdGVPcGNvZGU8VD4ge1xuICBwcml2YXRlIF90YWc6IFVwZGF0YWJsZVRhZztcbiAgcHJpdmF0ZSBkZW9wdGVkOiBUcnlPcGNvZGUgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPixcbiAgICBjYWNoZTogUmVmZXJlbmNlQ2FjaGU8VD4sXG4gICAgYm91bmRzOiBGcmFnbWVudCxcbiAgICB1cHNlcnQ6IFVwc2VydCxcbiAgICBwcml2YXRlIGFwcGVuZE9wY29kZTogR3VhcmRlZEFwcGVuZE9wY29kZTxUPixcbiAgICBwcml2YXRlIHN0YXRlOiBWTVN0YXRlXG4gICkge1xuICAgIHN1cGVyKGNhY2hlLCBib3VuZHMsIHVwc2VydCk7XG4gICAgdGhpcy50YWcgPSB0aGlzLl90YWcgPSBuZXcgVXBkYXRhYmxlVGFnKHRoaXMudGFnKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgaWYgKHRoaXMuZGVvcHRlZCkge1xuICAgICAgdm0uZXZhbHVhdGVPcGNvZGUodGhpcy5kZW9wdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcG9uZW50RGVmaW5pdGlvbih0aGlzLnJlZmVyZW5jZS52YWx1ZSgpKSkge1xuICAgICAgICB0aGlzLmxhenlEZW9wdCh2bSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXBlci5ldmFsdWF0ZSh2bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsYXp5RGVvcHQodm06IFVwZGF0aW5nVk0pIHtcbiAgICAvLyBEdXJpZ24gaW5pdGlhbCByZW5kZXIsIHdlIGtub3cgdGhhdCB0aGUgcmVmZXJlbmNlIGRvZXMgbm90IGNvbnRhaW4gYVxuICAgIC8vIGNvbXBvbmVudCBkZWZpbml0aW9uLCBzbyB3ZSBvcHRpbWlzdGljYWxseSBhc3N1bWVkIHRoYXQgdGhpcyBhcHBlbmRcbiAgICAvLyBpcyBqdXN0IGEgbm9ybWFsIGFwcGVuZC4gSG93ZXZlciwgYXQgdXBkYXRlIHRpbWUsIHdlIGRpc2NvdmVyZWQgdGhhdFxuICAgIC8vIHRoZSByZWZlcmVuY2UgaGFzIHN3aXRjaGVkIGludG8gY29udGFpbmluZyBhIGNvbXBvbmVudCBkZWZpbml0aW9uLCBzb1xuICAgIC8vIHdlIG5lZWQgdG8gZG8gYSBcImxhenkgZGVvcHRcIiwgc2ltdWxhdGluZyB3aGF0IHdvdWxkIGhhdmUgaGFwcGVuZWQgaWZcbiAgICAvLyB3ZSBoYWQgZGVjaWRlZCB0byBwZXJmb3JtIHRoZSBkZW9wdCBpbiB0aGUgZmlyc3QgcGxhY2UgZHVyaW5nIGluaXRpYWxcbiAgICAvLyByZW5kZXIuXG4gICAgLy9cbiAgICAvLyBNb3JlIGNvbmNyZXRlbHksIHdlIHdvdWxkIGhhdmUgZXhwYW5kZWQgdGhlIGN1cmx5IGludG8gYSBpZi9lbHNlLCBhbmRcbiAgICAvLyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBkZWZpbml0aW9uIG9yIG5vdCwgd2Ugd291bGRcbiAgICAvLyBoYXZlIGVudGVyZWQgZWl0aGVyIHRoZSBkeW5hbWljIGNvbXBvbmVudCBicmFuY2ggb3IgdGhlIHNpbXBsZSB2YWx1ZVxuICAgIC8vIGJyYW5jaC5cbiAgICAvL1xuICAgIC8vIFNpbmNlIHdlIHJlbmRlcmVkIGEgc2ltcGxlIHZhbHVlIGR1cmluZyBpbml0aWFsIHJlbmRlciAoYW5kIGFsbCB0aGVcbiAgICAvLyB1cGRhdGVzIHVwIHVudGlsIHRoaXMgcG9pbnQpLCB3ZSBuZWVkIHRvIHByZXRlbmQgdGhhdCB0aGUgcmVzdWx0IGlzXG4gICAgLy8gcHJvZHVjZWQgYnkgdGhlIFwiVkFMVUVcIiBicmFuY2ggb2YgdGhlIGRlb3B0ZWQgYXBwZW5kIG9wY29kZTpcbiAgICAvL1xuICAgIC8vICAgVHJ5KEJFR0lOLCBFTkQpXG4gICAgLy8gICAgIEFzc2VydChJc0NvbXBvbmVudERlZmluaXRpb24sIGV4cGVjdGVkPWZhbHNlKVxuICAgIC8vICAgICBPcHRpbWl6ZWRVcGRhdGVcbiAgICAvL1xuICAgIC8vIEluIHRoaXMgY2FzZSwgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGhhcyBzd2l0Y2hlZCBmcm9tIGJlaW5nIGEgc2ltcGxlXG4gICAgLy8gdmFsdWUgaW50byBhIGNvbXBvbmVudCBkZWZpbml0aW9uLCB3aGF0IHdvdWxkIGhhdmUgaGFwcGVuZWQgaXMgdGhhdFxuICAgIC8vIHRoZSBhc3NlcnQgd291bGQgdGhyb3csIGNhdXNpbmcgdGhlIFRyeSBvcGNvZGUgdG8gdGVhcmRvd24gdGhlIGJvdW5kc1xuICAgIC8vIGFuZCByZXJ1biB0aGUgb3JpZ2luYWwgYXBwZW5kIG9wY29kZS5cbiAgICAvL1xuICAgIC8vIFNpbmNlIHRoZSBUcnkgb3Bjb2RlIHdvdWxkIGhhdmUgbnVrZWQgdGhlIHVwZGF0aW5nIG9wY29kZXMgYW55d2F5LCB3ZVxuICAgIC8vIHdvdWxkbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2ltdWxhdGluZyB0aG9zZS4gQWxsIHdlIGhhdmUgdG8gZG8gaXMgdG9cbiAgICAvLyBleGVjdXRlIHRoZSBUcnkgb3Bjb2RlIGFuZCBpbW1lZGlhdGVseSB0aHJvdy5cblxuICAgIGxldCB7IGJvdW5kcywgYXBwZW5kT3Bjb2RlLCBzdGF0ZSB9ID0gdGhpcztcblxuICAgIGxldCBhcHBlbmRPcHMgPSBhcHBlbmRPcGNvZGUuZGVvcHQodm0uZW52KTtcbiAgICBsZXQgZW50ZXIgICAgID0gYXBwZW5kT3BzLmhlYWQoKSBhcyBFbnRlck9wY29kZTtcbiAgICBsZXQgb3BzICAgICAgID0gZW50ZXIuc2xpY2U7XG5cbiAgICBsZXQgdHJhY2tlciA9IG5ldyBVcGRhdGFibGVCbG9ja1RyYWNrZXIoYm91bmRzLnBhcmVudEVsZW1lbnQoKSk7XG4gICAgdHJhY2tlci5uZXdCb3VuZHModGhpcy5ib3VuZHMpO1xuXG4gICAgbGV0IGNoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8VXBkYXRpbmdPcGNvZGU+KCk7XG5cbiAgICBsZXQgZGVvcHRlZCA9IHRoaXMuZGVvcHRlZCA9IG5ldyBUcnlPcGNvZGUob3BzLCBzdGF0ZSwgdHJhY2tlciwgY2hpbGRyZW4pO1xuXG4gICAgdGhpcy5fdGFnLnVwZGF0ZShkZW9wdGVkLnRhZyk7XG5cbiAgICB2bS5ldmFsdWF0ZU9wY29kZShkZW9wdGVkKTtcbiAgICB2bS50aHJvdygpO1xuXG4gICAgLy8gRnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBoYXZlIGVzc2VudGlhbGx5IHJlcGxhY2VkIG91cnNlbHZlIHdpdGggYSBuZXdcbiAgICAvLyBvcGNvZGUuIFNpbmNlIHdlIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGluZyB0aGUgbmV3L2Rlb3B0ZWQgY29kZSwgaXQncyBhXG4gICAgLy8gZ29vZCBpZGVhIChhcyBhIHBhdHRlcm4pIHRvIG51bGwgb3V0IGFueSB1bm5lZWRlZCBmaWVsZHMgaGVyZSB0byBhdm9pZFxuICAgIC8vIGhvbGRpbmcgb24gdG8gdW5uZWVkZWQvc3RhbGUgb2JqZWN0czpcblxuICAgIHRoaXMuX3RhZyAgICAgICAgID0gbnVsbDtcbiAgICB0aGlzLnJlZmVyZW5jZSAgICA9IG51bGw7XG4gICAgdGhpcy5jYWNoZSAgICAgICAgPSBudWxsO1xuICAgIHRoaXMuYm91bmRzICAgICAgID0gbnVsbDtcbiAgICB0aGlzLnVwc2VydCAgICAgICA9IG51bGw7XG4gICAgdGhpcy5hcHBlbmRPcGNvZGUgPSBudWxsO1xuICAgIHRoaXMuc3RhdGUgICAgICAgID0gbnVsbDtcbiAgfVxuXG4gIHRvSlNPTigpOiBPcGNvZGVKU09OIHtcbiAgICBsZXQgeyBfZ3VpZDogZ3VpZCwgdHlwZSwgZGVvcHRlZCB9ID0gdGhpcztcblxuICAgIGlmIChkZW9wdGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBndWlkLFxuICAgICAgICB0eXBlLFxuICAgICAgICBkZW9wdGVkOiB0cnVlLFxuICAgICAgICBjaGlsZHJlbjogW2Rlb3B0ZWQudG9KU09OKCldXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIudG9KU09OKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZWRDYXV0aW91c0FwcGVuZE9wY29kZSBleHRlbmRzIEFwcGVuZE9wY29kZTxDYXV0aW91c0luc2VydGlvbj4ge1xuICB0eXBlID0gJ29wdGltaXplZC1jYXV0aW91cy1hcHBlbmQnO1xuXG4gIHByb3RlY3RlZCBub3JtYWxpemUocmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPik6IFJlZmVyZW5jZTxDYXV0aW91c0luc2VydGlvbj4ge1xuICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVWYWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5zZXJ0KGRvbTogRE9NVHJlZUNvbnN0cnVjdGlvbiwgY3Vyc29yOiBDdXJzb3IsIHZhbHVlOiBDYXV0aW91c0luc2VydGlvbik6IFVwc2VydCB7XG4gICAgcmV0dXJuIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlV2l0aCh2bTogVk0sIHJlZmVyZW5jZTogUmVmZXJlbmNlPE9wYXF1ZT4sIGNhY2hlOiBSZWZlcmVuY2VDYWNoZTxDYXV0aW91c0luc2VydGlvbj4sIGJvdW5kczogRnJhZ21lbnQsIHVwc2VydDogVXBzZXJ0KTogT3B0aW1pemVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUge1xuICAgIHJldHVybiBuZXcgT3B0aW1pemVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUoY2FjaGUsIGJvdW5kcywgdXBzZXJ0KTtcbiAgfVxufVxuXG5jbGFzcyBPcHRpbWl6ZWRDYXV0aW91c1VwZGF0ZU9wY29kZSBleHRlbmRzIFVwZGF0ZU9wY29kZTxDYXV0aW91c0luc2VydGlvbj4ge1xuICB0eXBlID0gJ29wdGltaXplZC1jYXV0aW91cy11cGRhdGUnO1xuXG4gIHByb3RlY3RlZCBpbnNlcnQoZG9tOiBET01UcmVlQ29uc3RydWN0aW9uLCBjdXJzb3I6IEN1cnNvciwgdmFsdWU6IENhdXRpb3VzSW5zZXJ0aW9uKTogVXBzZXJ0IHtcbiAgICByZXR1cm4gY2F1dGlvdXNJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR3VhcmRlZENhdXRpb3VzQXBwZW5kT3Bjb2RlIGV4dGVuZHMgR3VhcmRlZEFwcGVuZE9wY29kZTxDYXV0aW91c0luc2VydGlvbj4ge1xuICB0eXBlID0gJ2d1YXJkZWQtY2F1dGlvdXMtYXBwZW5kJztcblxuICBwcm90ZWN0ZWQgQXBwZW5kT3Bjb2RlID0gT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGU7XG5cbiAgcHJvdGVjdGVkIG5vcm1hbGl6ZShyZWZlcmVuY2U6IFJlZmVyZW5jZTxPcGFxdWU+KTogUmVmZXJlbmNlPENhdXRpb3VzSW5zZXJ0aW9uPiB7XG4gICAgcmV0dXJuIG1hcChyZWZlcmVuY2UsIG5vcm1hbGl6ZVZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNlcnQoZG9tOiBET01UcmVlQ29uc3RydWN0aW9uLCBjdXJzb3I6IEN1cnNvciwgdmFsdWU6IENhdXRpb3VzSW5zZXJ0aW9uKTogVXBzZXJ0IHtcbiAgICByZXR1cm4gY2F1dGlvdXNJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVXaXRoKHZtOiBWTSwgcmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPiwgY2FjaGU6IFJlZmVyZW5jZUNhY2hlPENhdXRpb3VzSW5zZXJ0aW9uPiwgYm91bmRzOiBGcmFnbWVudCwgdXBzZXJ0OiBVcHNlcnQpOiBHdWFyZGVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUge1xuICAgIHJldHVybiBuZXcgR3VhcmRlZENhdXRpb3VzVXBkYXRlT3Bjb2RlKHJlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0LCB0aGlzLCB2bS5jYXB0dXJlKCkpO1xuICB9XG59XG5cbmNsYXNzIEd1YXJkZWRDYXV0aW91c1VwZGF0ZU9wY29kZSBleHRlbmRzIEd1YXJkZWRVcGRhdGVPcGNvZGU8Q2F1dGlvdXNJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICdndWFyZGVkLWNhdXRpb3VzLXVwZGF0ZSc7XG5cbiAgcHJvdGVjdGVkIGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogQ2F1dGlvdXNJbnNlcnRpb24pOiBVcHNlcnQge1xuICAgIHJldHVybiBjYXV0aW91c0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcHRpbWl6ZWRUcnVzdGluZ0FwcGVuZE9wY29kZSBleHRlbmRzIEFwcGVuZE9wY29kZTxUcnVzdGluZ0luc2VydGlvbj4ge1xuICB0eXBlID0gJ29wdGltaXplZC10cnVzdGluZy1hcHBlbmQnO1xuXG4gIHByb3RlY3RlZCBub3JtYWxpemUocmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPik6IFJlZmVyZW5jZTxUcnVzdGluZ0luc2VydGlvbj4ge1xuICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVUcnVzdGVkVmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogVHJ1c3RpbmdJbnNlcnRpb24pOiBVcHNlcnQge1xuICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVdpdGgodm06IFZNLCByZWZlcmVuY2U6IFJlZmVyZW5jZTxPcGFxdWU+LCBjYWNoZTogUmVmZXJlbmNlQ2FjaGU8VHJ1c3RpbmdJbnNlcnRpb24+LCBib3VuZHM6IEZyYWdtZW50LCB1cHNlcnQ6IFVwc2VydCk6IE9wdGltaXplZFRydXN0aW5nVXBkYXRlT3Bjb2RlIHtcbiAgICByZXR1cm4gbmV3IE9wdGltaXplZFRydXN0aW5nVXBkYXRlT3Bjb2RlKGNhY2hlLCBib3VuZHMsIHVwc2VydCk7XG4gIH1cbn1cblxuY2xhc3MgT3B0aW1pemVkVHJ1c3RpbmdVcGRhdGVPcGNvZGUgZXh0ZW5kcyBVcGRhdGVPcGNvZGU8VHJ1c3RpbmdJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICdvcHRpbWl6ZWQtdHJ1c3RpbmctdXBkYXRlJztcblxuICBwcm90ZWN0ZWQgaW5zZXJ0KGRvbTogRE9NVHJlZUNvbnN0cnVjdGlvbiwgY3Vyc29yOiBDdXJzb3IsIHZhbHVlOiBUcnVzdGluZ0luc2VydGlvbik6IFVwc2VydCB7XG4gICAgcmV0dXJuIHRydXN0aW5nSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEd1YXJkZWRUcnVzdGluZ0FwcGVuZE9wY29kZSBleHRlbmRzIEd1YXJkZWRBcHBlbmRPcGNvZGU8VHJ1c3RpbmdJbnNlcnRpb24+IHtcbiAgdHlwZSA9ICdndWFyZGVkLXRydXN0aW5nLWFwcGVuZCc7XG5cbiAgcHJvdGVjdGVkIEFwcGVuZE9wY29kZSA9IE9wdGltaXplZFRydXN0aW5nQXBwZW5kT3Bjb2RlO1xuXG4gIHByb3RlY3RlZCBub3JtYWxpemUocmVmZXJlbmNlOiBSZWZlcmVuY2U8T3BhcXVlPik6IFJlZmVyZW5jZTxUcnVzdGluZ0luc2VydGlvbj4ge1xuICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVUcnVzdGVkVmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogVHJ1c3RpbmdJbnNlcnRpb24pOiBVcHNlcnQge1xuICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVdpdGgodm06IFZNLCByZWZlcmVuY2U6IFJlZmVyZW5jZTxPcGFxdWU+LCBjYWNoZTogUmVmZXJlbmNlQ2FjaGU8VHJ1c3RpbmdJbnNlcnRpb24+LCBib3VuZHM6IEZyYWdtZW50LCB1cHNlcnQ6IFVwc2VydCk6IEd1YXJkZWRUcnVzdGluZ1VwZGF0ZU9wY29kZSB7XG4gICAgcmV0dXJuIG5ldyBHdWFyZGVkVHJ1c3RpbmdVcGRhdGVPcGNvZGUocmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQsIHRoaXMsIHZtLmNhcHR1cmUoKSk7XG4gIH1cbn1cblxuY2xhc3MgR3VhcmRlZFRydXN0aW5nVXBkYXRlT3Bjb2RlIGV4dGVuZHMgR3VhcmRlZFVwZGF0ZU9wY29kZTxUcnVzdGluZ0luc2VydGlvbj4ge1xuICB0eXBlID0gJ3RydXN0aW5nLXVwZGF0ZSc7XG5cbiAgcHJvdGVjdGVkIGluc2VydChkb206IERPTVRyZWVDb25zdHJ1Y3Rpb24sIGN1cnNvcjogQ3Vyc29yLCB2YWx1ZTogVHJ1c3RpbmdJbnNlcnRpb24pOiBVcHNlcnQge1xuICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc1NhZmVTdHJpbmcsIGlzTm9kZSwgaXNTdHJpbmcsIGNhdXRpb3VzSW5zZXJ0LCB0cnVzdGluZ0luc2VydCB9IGZyb20gJy4uLy4uL3Vwc2VydCc7XG5pbXBvcnQgeyBpc0NvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb21wb25lbnQvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBPcGNvZGUsIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBUcnlPcGNvZGUgfSBmcm9tICcuLi8uLi92bS91cGRhdGUnO1xuaW1wb3J0IHsgUmVmZXJlbmNlQ2FjaGUsIFVwZGF0YWJsZVRhZywgaXNNb2RpZmllZCwgaXNDb25zdCwgbWFwIH0gZnJvbSAnZ2xpbW1lci1yZWZlcmVuY2UnO1xuaW1wb3J0IHsgTGlua2VkTGlzdCB9IGZyb20gJ2dsaW1tZXItdXRpbCc7XG5pbXBvcnQgeyBDdXJzb3IsIGNsZWFyIH0gZnJvbSAnLi4vLi4vYm91bmRzJztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAnLi4vLi4vYnVpbGRlcic7XG5pbXBvcnQgeyBDb21waWxlSW50b0xpc3QgfSBmcm9tICcuLi8uLi9jb21waWxlcic7XG5pbXBvcnQgT3Bjb2RlQnVpbGRlckRTTCBmcm9tICcuL2J1aWxkZXInO1xuaW1wb3J0IHsgQ29uZGl0aW9uYWxSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9yZWZlcmVuY2VzJztcbmltcG9ydCB7IEFyZ3MgfSBmcm9tICcuLi8uLi9zeW50YXgvY29yZSc7XG5pbXBvcnQgeyBVcGRhdGFibGVCbG9ja1RyYWNrZXIgfSBmcm9tICcuLi8uLi9idWlsZGVyJztcbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWVbJ3RvU3RyaW5nJ10gIT09ICdmdW5jdGlvbic7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGV4dFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVHJ1c3RlZFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1NhZmVTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0hUTUwoKTtcbiAgICB9XG4gICAgaWYgKGlzTm9kZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTYWZlU3RyaW5nKHZhbHVlKSB8fCBpc05vZGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5leHBvcnQgY2xhc3MgQXBwZW5kT3Bjb2RlIGV4dGVuZHMgT3Bjb2RlIHtcbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBsZXQgcmVmZXJlbmNlID0gdm0uZnJhbWUuZ2V0T3BlcmFuZCgpO1xuICAgICAgICBsZXQgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplKHJlZmVyZW5jZSk7XG4gICAgICAgIGxldCB2YWx1ZSwgY2FjaGU7XG4gICAgICAgIGlmIChpc0NvbnN0KHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbm9ybWFsaXplZC52YWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FjaGUgPSBuZXcgUmVmZXJlbmNlQ2FjaGUobm9ybWFsaXplZCk7XG4gICAgICAgICAgICB2YWx1ZSA9IGNhY2hlLnBlZWsoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhY2sgPSB2bS5zdGFjaygpO1xuICAgICAgICBsZXQgdXBzZXJ0ID0gdGhpcy5pbnNlcnQodm0uZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKSwgc3RhY2ssIHZhbHVlKTtcbiAgICAgICAgbGV0IGJvdW5kcyA9IG5ldyBGcmFnbWVudCh1cHNlcnQuYm91bmRzKTtcbiAgICAgICAgc3RhY2submV3Qm91bmRzKGJvdW5kcyk7XG4gICAgICAgIGlmIChjYWNoZSAvKiBpLmUuICFpc0NvbnN0KHJlZmVyZW5jZSkgKi8pIHtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgodGhpcy51cGRhdGVXaXRoKHZtLCByZWZlcmVuY2UsIGNhY2hlLCBib3VuZHMsIHVwc2VydCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGd1aWQ6IHRoaXMuX2d1aWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBhcmdzOiBbXCIkT1BFUkFORFwiXVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBHdWFyZGVkQXBwZW5kT3Bjb2RlIGV4dGVuZHMgQXBwZW5kT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uLCBzeW1ib2xUYWJsZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLnN5bWJvbFRhYmxlID0gc3ltYm9sVGFibGU7XG4gICAgICAgIHRoaXMuZGVvcHRlZCA9IG51bGw7XG4gICAgfVxuICAgIGV2YWx1YXRlKHZtKSB7XG4gICAgICAgIGlmICh0aGlzLmRlb3B0ZWQpIHtcbiAgICAgICAgICAgIHZtLnB1c2hFdmFsRnJhbWUodGhpcy5kZW9wdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZtLmV2YWx1YXRlT3BlcmFuZCh0aGlzLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdm0uZnJhbWUuZ2V0T3BlcmFuZCgpLnZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoaXNDb21wb25lbnREZWZpbml0aW9uKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZtLnB1c2hFdmFsRnJhbWUodGhpcy5kZW9wdCh2bS5lbnYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1cGVyLmV2YWx1YXRlKHZtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBkZW9wdChlbnYpIHtcbiAgICAgICAgLy8gQXQgY29tcGlsZSB0aW1lLCB3ZSBkZXRlcm1pbmVkIHRoYXQgdGhpcyBhcHBlbmQgY2FsbHNpdGUgbWlnaHQgcmVmZXJcbiAgICAgICAgLy8gdG8gYSBsb2NhbCB2YXJpYWJsZS9wcm9wZXJ0eSBsb29rdXAgdGhhdCByZXNvbHZlcyB0byBhIGNvbXBvbmVudFxuICAgICAgICAvLyBkZWZpbml0aW9uIGF0IHJ1bnRpbWUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIGNvdWxkIGhhdmUgZWFnZXJseSBjb21waWxlZCB0aGlzIGNhbGxzaXRlIGludG8gc29tZXRoaW5nIGxpa2UgdGhpczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICB7eyNpZiAoaXMtY29tcG9uZW50LWRlZmluaXRpb24gZm9vKX19XG4gICAgICAgIC8vICAgICB7e2NvbXBvbmVudCBmb299fVxuICAgICAgICAvLyAgIHt7ZWxzZX19XG4gICAgICAgIC8vICAgICB7e2Zvb319XG4gICAgICAgIC8vICAge3svaWZ9fVxuICAgICAgICAvL1xuICAgICAgICAvLyBIb3dldmVyLCBpbiBwcmFjdGljZSwgdGhlcmUgbWlnaHQgYmUgYSBsYXJnZSBhbW91dCBvZiB0aGVzZSBjYWxsc2l0ZXNcbiAgICAgICAgLy8gYW5kIG1vc3Qgb2YgdGhlbSB3b3VsZCByZXNvbHZlIHRvIGEgc2ltcGxlIHZhbHVlIGxvb2t1cC4gVGhlcmVmb3JlLCB3ZVxuICAgICAgICAvLyB0cmllZCB0byBiZSBvcHRpbWlzdGljIGFuZCBhc3N1bWVkIHRoYXQgdGhlIGNhbGxzaXRlIHdpbGwgcmVzb2x2ZSB0b1xuICAgICAgICAvLyBhcHBlbmRpbmcgYSBzaW1wbGUgdmFsdWUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEhvd2V2ZXIsIHdlIGhhdmUgcmVhY2hlZCBoZXJlIGJlY2F1c2UgYXQgcnVudGltZSwgdGhlIGd1YXJkIGNvbmRpdGlvbmFsXG4gICAgICAgIC8vIGhhdmUgZGV0ZWN0ZWQgdGhhdCB0aGlzIGNhbGxzaXRlIGlzIGluZGVlZCByZWZlcnJpbmcgdG8gYSBjb21wb25lbnRcbiAgICAgICAgLy8gZGVmaW5pdGlvbiBvYmplY3QuIFNpbmNlIHRoaXMgaXMgbGlrZWx5IGdvaW5nIHRvIGJlIHRydWUgZm9yIG90aGVyXG4gICAgICAgIC8vIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjYWxsc2l0ZSwgaXQgaXMgbm93IGFwcHJvcGlhdGUgdG8gZGVvcHQgaW50byB0aGVcbiAgICAgICAgLy8gZXhwYW5kZWQgdmVyc2lvbiB0aGF0IGhhbmRsZXMgYm90aCBjYXNlcy4gVGhlIGNvbXBpbGF0aW9uIHdvdWxkIGxvb2tcbiAgICAgICAgLy8gbGlrZSB0aGlzOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgICAgICAgIEVudGVyKEJFR0lOLCBFTkQpXG4gICAgICAgIC8vICAgQkVHSU46ICAgICAgTm9vcFxuICAgICAgICAvLyAgICAgICAgICAgICAgIFRlc3QoaXMtY29tcG9uZW50LWRlZmluaXRpb24pXG4gICAgICAgIC8vICAgICAgICAgICAgICAgSnVtcFVubGVzcyhWQUxVRSlcbiAgICAgICAgLy8gICBDT01QT05FTlQ6ICBOb29wXG4gICAgICAgIC8vICAgICAgICAgICAgICAgUHV0RHluYW1pY0NvbXBvbmVudERlZmluaXRpb25PcGNvZGVcbiAgICAgICAgLy8gICAgICAgICAgICAgICBPcGVuQ29tcG9uZW50XG4gICAgICAgIC8vICAgICAgICAgICAgICAgQ2xvc2VDb21wb25lbnRcbiAgICAgICAgLy8gICAgICAgICAgICAgICBKdW1wKEVORClcbiAgICAgICAgLy8gICBWQUxVRTogICAgICBOb29wXG4gICAgICAgIC8vICAgICAgICAgICAgICAgT3B0aW1pemVkQXBwZW5kXG4gICAgICAgIC8vICAgRU5EOiAgICAgICAgTm9vcFxuICAgICAgICAvLyAgICAgICAgICAgICAgIEV4aXRcbiAgICAgICAgLy9cbiAgICAgICAgLy8gS2VlcCBpbiBtaW5kIHRoYXQgZXZlbiBpZiB3ZSAqZG9uJ3QqIHJlYWNoIGhlcmUgYXQgaW5pdGlhbCByZW5kZXIgdGltZSxcbiAgICAgICAgLy8gaXQgaXMgc3RpbGwgcG9zc2libGUgKGFsdGhvdWdoIHF1aXRlIHJhcmUpIHRoYXQgdGhlIHNpbXBsZSB2YWx1ZSB3ZVxuICAgICAgICAvLyBlbmNvdW50ZXIgZHVyaW5nIGluaXRpYWwgcmVuZGVyIGNvdWxkIGxhdGVyIGNoYW5nZSBpbnRvIGEgY29tcG9uZW50XG4gICAgICAgIC8vIGRlZmluaXRpb24gb2JqZWN0IGF0IHVwZGF0ZSB0aW1lLiBUaGF0IGlzIGhhbmRsZWQgYnkgdGhlIFwibGF6eSBkZW9wdFwiXG4gICAgICAgIC8vIGNvZGUgb24gdGhlIHVwZGF0ZSBzaWRlIChzY3JvbGwgZG93biBmb3IgdGhlIG5leHQgYmlnIGJsb2NrIG9mIGNvbW1lbnQpLlxuICAgICAgICBsZXQgYnVmZmVyID0gbmV3IENvbXBpbGVJbnRvTGlzdChlbnYsIG51bGwpO1xuICAgICAgICBsZXQgZHNsID0gbmV3IE9wY29kZUJ1aWxkZXJEU0woYnVmZmVyLCB0aGlzLnN5bWJvbFRhYmxlLCBlbnYpO1xuICAgICAgICBkc2wuYmxvY2soeyB0ZW1wbGF0ZXM6IG51bGwgfSwgKGRzbCwgQkVHSU4sIEVORCkgPT4ge1xuICAgICAgICAgICAgZHNsLnB1dFZhbHVlKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICBkc2wudGVzdChJc0NvbXBvbmVudERlZmluaXRpb25SZWZlcmVuY2UuY3JlYXRlKTtcbiAgICAgICAgICAgIGRzbC5qdW1wVW5sZXNzKCdWQUxVRScpO1xuICAgICAgICAgICAgZHNsLmxhYmVsKCdDT01QT05FTlQnKTtcbiAgICAgICAgICAgIGRzbC5wdXREeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbigpO1xuICAgICAgICAgICAgZHNsLm9wZW5Db21wb25lbnQoQXJncy5lbXB0eSgpKTtcbiAgICAgICAgICAgIGRzbC5jbG9zZUNvbXBvbmVudCgpO1xuICAgICAgICAgICAgZHNsLmp1bXAoRU5EKTtcbiAgICAgICAgICAgIGRzbC5sYWJlbCgnVkFMVUUnKTtcbiAgICAgICAgICAgIGRzbC5hcHBlbmQobmV3IHRoaXMuQXBwZW5kT3Bjb2RlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGRlb3B0ZWQgPSB0aGlzLmRlb3B0ZWQgPSBkc2wudG9PcFNlcSgpO1xuICAgICAgICAvLyBGcm9tIHRoaXMgcG9pbnQgb24sIHdlIGhhdmUgZXNzZW50aWFsbHkgcmVwbGFjZWQgb3Vyc2VsdmUgd2l0aCBhIG5ldyBzZXRcbiAgICAgICAgLy8gb2Ygb3Bjb2Rlcy4gU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZXhlY3V0aW5nIHRoZSBuZXcvZGVvcHRlZCBjb2RlLCBpdCdzXG4gICAgICAgIC8vIGEgZ29vZCBpZGVhIChhcyBhIHBhdHRlcm4pIHRvIG51bGwgb3V0IGFueSB1bm5lZWRlZCBmaWVsZHMgaGVyZSB0byBhdm9pZFxuICAgICAgICAvLyBob2xkaW5nIG9uIHRvIHVubmVlZGVkL3N0YWxlIG9iamVjdHM6XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgIHJldHVybiBkZW9wdGVkO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCB7IF9ndWlkOiBndWlkLCB0eXBlLCBkZW9wdGVkIH0gPSB0aGlzO1xuICAgICAgICBpZiAoZGVvcHRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBndWlkLFxuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZGVvcHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogZGVvcHRlZC50b0FycmF5KCkubWFwKG9wID0+IG9wLnRvSlNPTigpKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZ3VpZCxcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmV4cHJlc3Npb24udG9KU09OKCldXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlIGV4dGVuZHMgQ29uZGl0aW9uYWxSZWZlcmVuY2Uge1xuICAgIHN0YXRpYyBjcmVhdGUoaW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJc0NvbXBvbmVudERlZmluaXRpb25SZWZlcmVuY2UoaW5uZXIpO1xuICAgIH1cbiAgICB0b0Jvb2wodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29tcG9uZW50RGVmaW5pdGlvbih2YWx1ZSk7XG4gICAgfVxufVxuY2xhc3MgVXBkYXRlT3Bjb2RlIGV4dGVuZHMgVXBkYXRpbmdPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlLCBib3VuZHMsIHVwc2VydCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgICAgIHRoaXMuYm91bmRzID0gYm91bmRzO1xuICAgICAgICB0aGlzLnVwc2VydCA9IHVwc2VydDtcbiAgICAgICAgdGhpcy50YWcgPSBjYWNoZS50YWc7XG4gICAgfVxuICAgIGV2YWx1YXRlKHZtKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FjaGUucmV2YWxpZGF0ZSgpO1xuICAgICAgICBpZiAoaXNNb2RpZmllZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGxldCB7IGJvdW5kcywgdXBzZXJ0IH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHsgZG9tIH0gPSB2bTtcbiAgICAgICAgICAgIGlmICghdGhpcy51cHNlcnQudXBkYXRlKGRvbSwgdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBDdXJzb3IoYm91bmRzLnBhcmVudEVsZW1lbnQoKSwgY2xlYXIoYm91bmRzKSk7XG4gICAgICAgICAgICAgICAgdXBzZXJ0ID0gdGhpcy51cHNlcnQgPSB0aGlzLmluc2VydCh2bS5lbnYuZ2V0QXBwZW5kT3BlcmF0aW9ucygpLCBjdXJzb3IsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvdW5kcy51cGRhdGUodXBzZXJ0LmJvdW5kcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgeyBfZ3VpZDogZ3VpZCwgdHlwZSwgY2FjaGUgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBndWlkLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGRldGFpbHM6IHsgbGFzdFZhbHVlOiBKU09OLnN0cmluZ2lmeShjYWNoZS5wZWVrKCkpIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgR3VhcmRlZFVwZGF0ZU9wY29kZSBleHRlbmRzIFVwZGF0ZU9wY29kZSB7XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQsIGFwcGVuZE9wY29kZSwgc3RhdGUpIHtcbiAgICAgICAgc3VwZXIoY2FjaGUsIGJvdW5kcywgdXBzZXJ0KTtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgICAgIHRoaXMuYXBwZW5kT3Bjb2RlID0gYXBwZW5kT3Bjb2RlO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuZGVvcHRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMudGFnID0gdGhpcy5fdGFnID0gbmV3IFVwZGF0YWJsZVRhZyh0aGlzLnRhZyk7XG4gICAgfVxuICAgIGV2YWx1YXRlKHZtKSB7XG4gICAgICAgIGlmICh0aGlzLmRlb3B0ZWQpIHtcbiAgICAgICAgICAgIHZtLmV2YWx1YXRlT3Bjb2RlKHRoaXMuZGVvcHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNDb21wb25lbnREZWZpbml0aW9uKHRoaXMucmVmZXJlbmNlLnZhbHVlKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXp5RGVvcHQodm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3VwZXIuZXZhbHVhdGUodm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxhenlEZW9wdCh2bSkge1xuICAgICAgICAvLyBEdXJpZ24gaW5pdGlhbCByZW5kZXIsIHdlIGtub3cgdGhhdCB0aGUgcmVmZXJlbmNlIGRvZXMgbm90IGNvbnRhaW4gYVxuICAgICAgICAvLyBjb21wb25lbnQgZGVmaW5pdGlvbiwgc28gd2Ugb3B0aW1pc3RpY2FsbHkgYXNzdW1lZCB0aGF0IHRoaXMgYXBwZW5kXG4gICAgICAgIC8vIGlzIGp1c3QgYSBub3JtYWwgYXBwZW5kLiBIb3dldmVyLCBhdCB1cGRhdGUgdGltZSwgd2UgZGlzY292ZXJlZCB0aGF0XG4gICAgICAgIC8vIHRoZSByZWZlcmVuY2UgaGFzIHN3aXRjaGVkIGludG8gY29udGFpbmluZyBhIGNvbXBvbmVudCBkZWZpbml0aW9uLCBzb1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvIGEgXCJsYXp5IGRlb3B0XCIsIHNpbXVsYXRpbmcgd2hhdCB3b3VsZCBoYXZlIGhhcHBlbmVkIGlmXG4gICAgICAgIC8vIHdlIGhhZCBkZWNpZGVkIHRvIHBlcmZvcm0gdGhlIGRlb3B0IGluIHRoZSBmaXJzdCBwbGFjZSBkdXJpbmcgaW5pdGlhbFxuICAgICAgICAvLyByZW5kZXIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE1vcmUgY29uY3JldGVseSwgd2Ugd291bGQgaGF2ZSBleHBhbmRlZCB0aGUgY3VybHkgaW50byBhIGlmL2Vsc2UsIGFuZFxuICAgICAgICAvLyBiYXNlZCBvbiB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBkZWZpbml0aW9uIG9yIG5vdCwgd2Ugd291bGRcbiAgICAgICAgLy8gaGF2ZSBlbnRlcmVkIGVpdGhlciB0aGUgZHluYW1pYyBjb21wb25lbnQgYnJhbmNoIG9yIHRoZSBzaW1wbGUgdmFsdWVcbiAgICAgICAgLy8gYnJhbmNoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTaW5jZSB3ZSByZW5kZXJlZCBhIHNpbXBsZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbCByZW5kZXIgKGFuZCBhbGwgdGhlXG4gICAgICAgIC8vIHVwZGF0ZXMgdXAgdW50aWwgdGhpcyBwb2ludCksIHdlIG5lZWQgdG8gcHJldGVuZCB0aGF0IHRoZSByZXN1bHQgaXNcbiAgICAgICAgLy8gcHJvZHVjZWQgYnkgdGhlIFwiVkFMVUVcIiBicmFuY2ggb2YgdGhlIGRlb3B0ZWQgYXBwZW5kIG9wY29kZTpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICBUcnkoQkVHSU4sIEVORClcbiAgICAgICAgLy8gICAgIEFzc2VydChJc0NvbXBvbmVudERlZmluaXRpb24sIGV4cGVjdGVkPWZhbHNlKVxuICAgICAgICAvLyAgICAgT3B0aW1pemVkVXBkYXRlXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGhhcyBzd2l0Y2hlZCBmcm9tIGJlaW5nIGEgc2ltcGxlXG4gICAgICAgIC8vIHZhbHVlIGludG8gYSBjb21wb25lbnQgZGVmaW5pdGlvbiwgd2hhdCB3b3VsZCBoYXZlIGhhcHBlbmVkIGlzIHRoYXRcbiAgICAgICAgLy8gdGhlIGFzc2VydCB3b3VsZCB0aHJvdywgY2F1c2luZyB0aGUgVHJ5IG9wY29kZSB0byB0ZWFyZG93biB0aGUgYm91bmRzXG4gICAgICAgIC8vIGFuZCByZXJ1biB0aGUgb3JpZ2luYWwgYXBwZW5kIG9wY29kZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2luY2UgdGhlIFRyeSBvcGNvZGUgd291bGQgaGF2ZSBudWtlZCB0aGUgdXBkYXRpbmcgb3Bjb2RlcyBhbnl3YXksIHdlXG4gICAgICAgIC8vIHdvdWxkbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2ltdWxhdGluZyB0aG9zZS4gQWxsIHdlIGhhdmUgdG8gZG8gaXMgdG9cbiAgICAgICAgLy8gZXhlY3V0ZSB0aGUgVHJ5IG9wY29kZSBhbmQgaW1tZWRpYXRlbHkgdGhyb3cuXG4gICAgICAgIGxldCB7IGJvdW5kcywgYXBwZW5kT3Bjb2RlLCBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IGFwcGVuZE9wcyA9IGFwcGVuZE9wY29kZS5kZW9wdCh2bS5lbnYpO1xuICAgICAgICBsZXQgZW50ZXIgPSBhcHBlbmRPcHMuaGVhZCgpO1xuICAgICAgICBsZXQgb3BzID0gZW50ZXIuc2xpY2U7XG4gICAgICAgIGxldCB0cmFja2VyID0gbmV3IFVwZGF0YWJsZUJsb2NrVHJhY2tlcihib3VuZHMucGFyZW50RWxlbWVudCgpKTtcbiAgICAgICAgdHJhY2tlci5uZXdCb3VuZHModGhpcy5ib3VuZHMpO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgICAgICBsZXQgZGVvcHRlZCA9IHRoaXMuZGVvcHRlZCA9IG5ldyBUcnlPcGNvZGUob3BzLCBzdGF0ZSwgdHJhY2tlciwgY2hpbGRyZW4pO1xuICAgICAgICB0aGlzLl90YWcudXBkYXRlKGRlb3B0ZWQudGFnKTtcbiAgICAgICAgdm0uZXZhbHVhdGVPcGNvZGUoZGVvcHRlZCk7XG4gICAgICAgIHZtLnRocm93KCk7XG4gICAgICAgIC8vIEZyb20gdGhpcyBwb2ludCBvbiwgd2UgaGF2ZSBlc3NlbnRpYWxseSByZXBsYWNlZCBvdXJzZWx2ZSB3aXRoIGEgbmV3XG4gICAgICAgIC8vIG9wY29kZS4gU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZXhlY3V0aW5nIHRoZSBuZXcvZGVvcHRlZCBjb2RlLCBpdCdzIGFcbiAgICAgICAgLy8gZ29vZCBpZGVhIChhcyBhIHBhdHRlcm4pIHRvIG51bGwgb3V0IGFueSB1bm5lZWRlZCBmaWVsZHMgaGVyZSB0byBhdm9pZFxuICAgICAgICAvLyBob2xkaW5nIG9uIHRvIHVubmVlZGVkL3N0YWxlIG9iamVjdHM6XG4gICAgICAgIHRoaXMuX3RhZyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRzID0gbnVsbDtcbiAgICAgICAgdGhpcy51cHNlcnQgPSBudWxsO1xuICAgICAgICB0aGlzLmFwcGVuZE9wY29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCB7IF9ndWlkOiBndWlkLCB0eXBlLCBkZW9wdGVkIH0gPSB0aGlzO1xuICAgICAgICBpZiAoZGVvcHRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBndWlkLFxuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZGVvcHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW2Rlb3B0ZWQudG9KU09OKCldXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTigpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9wdGltaXplZENhdXRpb3VzQXBwZW5kT3Bjb2RlIGV4dGVuZHMgQXBwZW5kT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ29wdGltaXplZC1jYXV0aW91cy1hcHBlbmQnO1xuICAgIH1cbiAgICBub3JtYWxpemUocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVWYWx1ZSk7XG4gICAgfVxuICAgIGluc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxuICAgIHVwZGF0ZVdpdGgodm0sIHJlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0KSB7XG4gICAgICAgIHJldHVybiBuZXcgT3B0aW1pemVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUoY2FjaGUsIGJvdW5kcywgdXBzZXJ0KTtcbiAgICB9XG59XG5jbGFzcyBPcHRpbWl6ZWRDYXV0aW91c1VwZGF0ZU9wY29kZSBleHRlbmRzIFVwZGF0ZU9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdvcHRpbWl6ZWQtY2F1dGlvdXMtdXBkYXRlJztcbiAgICB9XG4gICAgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY2F1dGlvdXNJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgR3VhcmRlZENhdXRpb3VzQXBwZW5kT3Bjb2RlIGV4dGVuZHMgR3VhcmRlZEFwcGVuZE9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdndWFyZGVkLWNhdXRpb3VzLWFwcGVuZCc7XG4gICAgICAgIHRoaXMuQXBwZW5kT3Bjb2RlID0gT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGU7XG4gICAgfVxuICAgIG5vcm1hbGl6ZShyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIG1hcChyZWZlcmVuY2UsIG5vcm1hbGl6ZVZhbHVlKTtcbiAgICB9XG4gICAgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY2F1dGlvdXNJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgdXBkYXRlV2l0aCh2bSwgcmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHdWFyZGVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUocmVmZXJlbmNlLCBjYWNoZSwgYm91bmRzLCB1cHNlcnQsIHRoaXMsIHZtLmNhcHR1cmUoKSk7XG4gICAgfVxufVxuY2xhc3MgR3VhcmRlZENhdXRpb3VzVXBkYXRlT3Bjb2RlIGV4dGVuZHMgR3VhcmRlZFVwZGF0ZU9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdndWFyZGVkLWNhdXRpb3VzLXVwZGF0ZSc7XG4gICAgfVxuICAgIGluc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9wdGltaXplZFRydXN0aW5nQXBwZW5kT3Bjb2RlIGV4dGVuZHMgQXBwZW5kT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ29wdGltaXplZC10cnVzdGluZy1hcHBlbmQnO1xuICAgIH1cbiAgICBub3JtYWxpemUocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVUcnVzdGVkVmFsdWUpO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICB1cGRhdGVXaXRoKHZtLCByZWZlcmVuY2UsIGNhY2hlLCBib3VuZHMsIHVwc2VydCkge1xuICAgICAgICByZXR1cm4gbmV3IE9wdGltaXplZFRydXN0aW5nVXBkYXRlT3Bjb2RlKGNhY2hlLCBib3VuZHMsIHVwc2VydCk7XG4gICAgfVxufVxuY2xhc3MgT3B0aW1pemVkVHJ1c3RpbmdVcGRhdGVPcGNvZGUgZXh0ZW5kcyBVcGRhdGVPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnb3B0aW1pemVkLXRydXN0aW5nLXVwZGF0ZSc7XG4gICAgfVxuICAgIGluc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRydXN0aW5nSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEd1YXJkZWRUcnVzdGluZ0FwcGVuZE9wY29kZSBleHRlbmRzIEd1YXJkZWRBcHBlbmRPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZ3VhcmRlZC10cnVzdGluZy1hcHBlbmQnO1xuICAgICAgICB0aGlzLkFwcGVuZE9wY29kZSA9IE9wdGltaXplZFRydXN0aW5nQXBwZW5kT3Bjb2RlO1xuICAgIH1cbiAgICBub3JtYWxpemUocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVUcnVzdGVkVmFsdWUpO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICB1cGRhdGVXaXRoKHZtLCByZWZlcmVuY2UsIGNhY2hlLCBib3VuZHMsIHVwc2VydCkge1xuICAgICAgICByZXR1cm4gbmV3IEd1YXJkZWRUcnVzdGluZ1VwZGF0ZU9wY29kZShyZWZlcmVuY2UsIGNhY2hlLCBib3VuZHMsIHVwc2VydCwgdGhpcywgdm0uY2FwdHVyZSgpKTtcbiAgICB9XG59XG5jbGFzcyBHdWFyZGVkVHJ1c3RpbmdVcGRhdGVPcGNvZGUgZXh0ZW5kcyBHdWFyZGVkVXBkYXRlT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3RydXN0aW5nLXVwZGF0ZSc7XG4gICAgfVxuICAgIGluc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRydXN0aW5nSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxufVxuIl19 enifed('glimmer-runtime/lib/compiled/opcodes/dom', ['exports', 'glimmer-runtime/lib/opcodes', 'glimmer-util', 'glimmer-reference', 'glimmer-runtime/lib/references', 'glimmer-runtime/lib/compiled/expressions/value'], function (exports, _glimmerRuntimeLibOpcodes, _glimmerUtil, _glimmerReference, _glimmerRuntimeLibReferences, _glimmerRuntimeLibCompiledExpressionsValue) { 'use strict'; var TextOpcode = (function (_Opcode) { babelHelpers.inherits(TextOpcode, _Opcode); @@ -19536,17 +18260,17 @@ } ; var PropertyChangeList = { setAttribute: function (env, element, attr, value, namespace) { - if (value !== null) { + if (value !== null && value !== undefined) { var normalized = attr.toLowerCase(); element[normalized] = _glimmerRuntimeLibDomProps.normalizePropertyValue(value); // TODO: This doesn't work } }, updateAttribute: function (env, element, attr, value, namespace) { - if (value === null) { + if (value === null || value === undefined) { var normalized = attr.toLowerCase(); element[normalized] = value; } else { this.setAttribute.apply(this, arguments); } @@ -19562,11 +18286,11 @@ dom.setAttribute(element, attr, _glimmerRuntimeLibCompiledOpcodesContent.normalizeTextValue(value), namespace); } }; _class.prototype.updateAttribute = function updateAttribute(env, element, attr, value, namespace) { - if (value === null) { + if (value === null || value === undefined) { if (namespace) { env.getDOM().removeAttributeNS(element, namespace, attr); } else { env.getDOM().removeAttribute(element, attr); } @@ -19653,11 +18377,11 @@ return _class5; })())(); exports.SafeHrefAttributeChangeList = SafeHrefAttributeChangeList; }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcnVudGltZS9saWIvZG9tL2NoYW5nZS1saXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWlCTSxhQUFBLGtCQUFBLENBQTZCLE9BQXVCLEVBQUUsSUFBWSxFQUFFLFVBQW1CLEVBQUUsU0FBaUIsRUFBQTtBQUM5RyxZQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQzlCLFlBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLGlDQVh6QixhQUFhLEFBVzhCLENBQUM7QUFFbkQsWUFBSSxLQUFLLEVBQUU7QUFDVCxtQkFBTywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkQ7O2lDQUVjLDJCQWxCUixpQkFBaUIsQ0FrQlMsT0FBTyxFQUFFLElBQUksQ0FBQzs7WUFBekMsSUFBSSxzQkFBSixJQUFJOztBQUVWLFlBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtBQUNuQixtQkFBTywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkQsTUFBTTtBQUNMLG1CQUFPLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNsRDtLQUNGOztBQUVLLGFBQUEsMEJBQUEsQ0FBcUMsT0FBZSxFQUFFLElBQVksRUFBQTtBQUN0RSxZQUFJLHFDQTlCSixvQkFBb0IsQ0E4QkssT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ3ZDLG1CQUFPLDBCQUEwQixDQUFDO1NBQ25DO0FBRUQsWUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDbkMsbUJBQU8sNEJBQTRCLENBQUM7U0FDckM7QUFFRCxZQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNuQyxtQkFBTyx3QkFBd0IsQ0FBQztTQUNqQztBQUVELGVBQU8sa0JBQWtCLENBQUM7S0FDM0I7O0FBRUssYUFBQSwyQkFBQSxDQUFzQyxPQUFlLEVB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QU8sRUFBRSxJQUFJLEVBQUUscUNBcEt2RCxzQkFBc0IsQ0FvS3dELEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekc7OzBCQUVELGVBQWUsR0FBQSx5QkFBQyxHQUFnQixFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFBQTtBQUM3RSxnQkFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5Qzs7O1dBQ0YsQ0FBQyIsImZpbGUiOiJjaGFuZ2UtbGlzdHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGSVhNRSwgT3BhcXVlIH0gZnJvbSAnZ2xpbW1lci11dGlsJztcbmltcG9ydCB7IERPTU5hbWVzcGFjZSB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCAqIGFzIFNpbXBsZSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZSxcbiAgcmVxdWlyZXNTYW5pdGl6YXRpb25cbn0gZnJvbSAnLi9zYW5pdGl6ZWQtdmFsdWVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVByb3BlcnR5LCBub3JtYWxpemVQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQgeyBTVkdfTkFNRVNQQUNFIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgbm9ybWFsaXplVGV4dFZhbHVlIH0gZnJvbSAnLi4vY29tcGlsZWQvb3Bjb2Rlcy9jb250ZW50JztcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGFuZ2VMaXN0IHtcbiAgc2V0QXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IFNpbXBsZS5FbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQ7XG4gIHVwZGF0ZUF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBFbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q2hhbmdlTGlzdHMoZWxlbWVudDogU2ltcGxlLkVsZW1lbnQsIGF0dHI6IHN0cmluZywgaXNUcnVzdGluZzogYm9vbGVhbiwgbmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgbGV0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7XG4gIGxldCBpc1NWRyA9IGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFO1xuXG4gIGlmIChpc1NWRykge1xuICAgIHJldHVybiBkZWZhdWx0QXR0cmlidXRlQ2hhbmdlTGlzdHModGFnTmFtZSwgYXR0cik7XG4gIH1cblxuICBsZXQgeyB0eXBlIH0gPSBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBhdHRyKTtcblxuICBpZiAodHlwZSA9PT0gJ2F0dHInKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRBdHRyaWJ1dGVDaGFuZ2VMaXN0cyh0YWdOYW1lLCBhdHRyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdFByb3BlcnR5Q2hhbmdlTGlzdHModGFnTmFtZSwgYXR0cik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQcm9wZXJ0eUNoYW5nZUxpc3RzKHRhZ05hbWU6IHN0cmluZywgYXR0cjogc3RyaW5nKSB7XG4gIGlmIChyZXF1aXJlc1Nhbml0aXphdGlvbih0YWdOYW1lLCBhdHRyKSkge1xuICAgIHJldHVybiBTYWZlSHJlZlByb3BlcnR5Q2hhbmdlTGlzdDtcbiAgfVxuXG4gIGlmIChpc1VzZXJJbnB1dFZhbHVlKHRhZ05hbWUsIGF0dHIpKSB7XG4gICAgcmV0dXJuIElucHV0VmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3Q7XG4gIH1cblxuICBpZiAoaXNPcHRpb25TZWxlY3RlZCh0YWdOYW1lLCBhdHRyKSkge1xuICAgIHJldHVybiBPcHRpb25TZWxlY3RlZENoYW5nZUxpc3Q7XG4gIH1cblxuICByZXR1cm4gUHJvcGVydHlDaGFuZ2VMaXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEF0dHJpYnV0ZUNoYW5nZUxpc3RzKHRhZ05hbWU6IHN0cmluZywgYXR0cjogc3RyaW5nKSB7XG4gIGlmIChyZXF1aXJlc1Nhbml0aXphdGlvbih0YWdOYW1lLCBhdHRyKSkge1xuICAgIHJldHVybiBTYWZlSHJlZkF0dHJpYnV0ZUNoYW5nZUxpc3Q7XG4gIH1cblxuICByZXR1cm4gQXR0cmlidXRlQ2hhbmdlTGlzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRET01BdHRyKGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZykge1xuICAgbGV0IGlzU1ZHID0gZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0U7XG4gICBsZXQgeyB0eXBlLCBub3JtYWxpemVkIH0gPSBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBhdHRyKTtcblxuICAgaWYgKGlzU1ZHKSB7XG4gICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShub3JtYWxpemVkKTtcbiAgIH1cblxuICAgaWYgKHR5cGUgPT09ICdhdHRyJykge1xuICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobm9ybWFsaXplZCk7XG4gICB9IHtcbiAgICAgcmV0dXJuIGVsZW1lbnRbbm9ybWFsaXplZF07XG4gICB9XG59O1xuXG5leHBvcnQgY29uc3QgUHJvcGVydHlDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IHtcbiAgc2V0QXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IFNpbXBsZS5FbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IERPTU5hbWVzcGFjZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgbGV0IG5vcm1hbGl6ZWQgPSBhdHRyLnRvTG93ZXJDYXNlKCk7XG4gICAgICBlbGVtZW50W25vcm1hbGl6ZWRdID0gbm9ybWFsaXplUHJvcGVydHlWYWx1ZSh2YWx1ZSk7IC8vIFRPRE86IFRoaXMgZG9lc24ndCB3b3JrXG4gICAgfVxuICB9LFxuXG4gIHVwZGF0ZUF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBFbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IERPTU5hbWVzcGFjZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgbGV0IG5vcm1hbGl6ZWQgPSBhdHRyLnRvTG93ZXJDYXNlKCk7XG4gICAgICBlbGVtZW50W25vcm1hbGl6ZWRdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKC4uLmFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgQXR0cmlidXRlQ2hhbmdlTGlzdDogSUNoYW5nZUxpc3QgPSBuZXcgY2xhc3Mge1xuICBzZXRBdHRyaWJ1dGUoZW52OiBFbnZpcm9ubWVudCwgZWxlbWVudDogU2ltcGxlLkVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSwgbmFtZXNwYWNlPzogRE9NTmFtZXNwYWNlKSB7XG4gICAgbGV0IGRvbSA9IGVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCk7XG5cbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZG9tLnNldEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyLCBub3JtYWxpemVUZXh0VmFsdWUodmFsdWUpLCBuYW1lc3BhY2UpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBFbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IERPTU5hbWVzcGFjZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICBlbnYuZ2V0RE9NKCkucmVtb3ZlQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudi5nZXRET00oKS5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgYXR0ciwgdmFsdWUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gaXNVc2VySW5wdXRWYWx1ZSh0YWdOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gIHJldHVybiAodGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09PSAnVEVYVEFSRUEnKSAmJiBhdHRyaWJ1dGUgPT09ICd2YWx1ZSc7XG59XG5cbmV4cG9ydCBjb25zdCBJbnB1dFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IG5ldyBjbGFzcyB7XG4gIHNldEF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBTaW1wbGUuRWxlbWVudCwgYXR0cjogc3RyaW5nLCB2YWx1ZTogT3BhcXVlKSB7XG4gICAgbGV0IGlucHV0ID0gZWxlbWVudCBhcyBGSVhNRTxIVE1MSW5wdXRFbGVtZW50LCBcIlRoaXMgYnJlYWtzIFNTUlwiPjtcbiAgICBpbnB1dC52YWx1ZSA9IG5vcm1hbGl6ZVRleHRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICB1cGRhdGVBdHRyaWJ1dGUoZW52OiBFbnZpcm9ubWVudCwgZWxlbWVudDogRWxlbWVudCwgYXR0cjogc3RyaW5nLCB2YWx1ZTogT3BhcXVlKSB7XG4gICAgbGV0IGlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWxlbWVudDtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVRleHRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gbm9ybWFsaXplZFZhbHVlKSB7XG4gICAgICBpbnB1dC52YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGlzT3B0aW9uU2VsZWN0ZWQodGFnTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICByZXR1cm4gdGFnTmFtZSA9PT0gJ09QVElPTicgJiYgYXR0cmlidXRlID09PSAnc2VsZWN0ZWQnO1xufVxuXG5leHBvcnQgY29uc3QgT3B0aW9uU2VsZWN0ZWRDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IG5ldyBjbGFzcyB7XG4gIHNldEF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBTaW1wbGUuRWxlbWVudCwgYXR0cjogc3RyaW5nLCB2YWx1ZTogT3BhcXVlKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICBlbnYuZ2V0QXBwZW5kT3BlcmF0aW9ucygpLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnc2VsZWN0ZWQnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSkge1xuICAgIGxldCBvcHRpb24gPSA8SFRNTE9wdGlvbkVsZW1lbnQ+ZWxlbWVudDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgU2FmZUhyZWZQcm9wZXJ0eUNoYW5nZUxpc3Q6IElDaGFuZ2VMaXN0ID0gbmV3IGNsYXNzIHtcbiAgc2V0QXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IFNpbXBsZS5FbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUpIHtcbiAgICBsZXQgdHJlZSA9IGVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCk7XG4gICAgUHJvcGVydHlDaGFuZ2VMaXN0LnNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIGF0dHIsIHNhbml0aXplQXR0cmlidXRlVmFsdWUoZW52LCBlbGVtZW50LCBhdHRyLCB2YWx1ZSkpO1xuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgYXR0ciwgdmFsdWUpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgU2FmZUhyZWZBdHRyaWJ1dGVDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IG5ldyBjbGFzcyB7XG4gIHNldEF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBFbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUpIHtcbiAgICBBdHRyaWJ1dGVDaGFuZ2VMaXN0LnNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIGF0dHIsIHNhbml0aXplQXR0cmlidXRlVmFsdWUoZW52LCBlbGVtZW50LCBhdHRyLCB2YWx1ZSkpO1xuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgYXR0ciwgdmFsdWUpO1xuICB9XG59O1xuIl19 +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcnVudGltZS9saWIvZG9tL2NoYW5nZS1saXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWlCTSxhQUFBLGtCQUFBLENBQTZCLE9BQXVCLEVBQUUsSUFBWSxFQUFFLFVBQW1CLEVBQUUsU0FBaUIsRUFBQTtBQUM5RyxZQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQzlCLFlBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLGlDQVh6QixhQUFhLEFBVzhCLENBQUM7QUFFbkQsWUFBSSxLQUFLLEVBQUU7QUFDVCxtQkFBTywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkQ7O2lDQUVjLDJCQWxCUixpQkFBaUIsQ0FrQlMsT0FBTyxFQUFFLElBQUksQ0FBQzs7WUFBekMsSUFBSSxzQkFBSixJQUFJOztBQUVWLFlBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtBQUNuQixtQkFBTywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkQsTUFBTTtBQUNMLG1CQUFPLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNsRDtLQUNGOztBQUVLLGFBQUEsMEJBQUEsQ0FBcUMsT0FBZSxFQUFFLElBQVksRUFBQTtBQUN0RSxZQUFJLHFDQTlCSixvQkFBb0IsQ0E4QkssT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO0FBQ3ZDLG1CQUFPLDBCQUEwQixDQUFDO1NBQ25DO0FBRUQsWUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDbkMsbUJBQU8sNEJBQTRCLENBQUM7U0FDckM7QUFFRCxZQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNuQyxtQkFBTyx3QkFBd0IsQ0FBQztTQUNqQztBQUVELGVBQU8sa0JBQWtCLENBQUM7S0FDM0I7O0FBRUssYUFBQSwyQkFBQSxDQUFzQyxPQUFlLEVB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SUFBWSxFQUFFLEtBQWEsRUFBQTtBQUMxRSwrQkFBbUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUscUNBcEt2RCxzQkFBc0IsQ0FvS3dELEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekc7OzBCQUVELGVBQWUsR0FBQSx5QkFBQyxHQUFnQixFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFBQTtBQUM3RSxnQkFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5Qzs7O1dBQ0YsQ0FBQyIsImZpbGUiOiJjaGFuZ2UtbGlzdHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGSVhNRSwgT3BhcXVlIH0gZnJvbSAnZ2xpbW1lci11dGlsJztcbmltcG9ydCB7IERPTU5hbWVzcGFjZSB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCAqIGFzIFNpbXBsZSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZSxcbiAgcmVxdWlyZXNTYW5pdGl6YXRpb25cbn0gZnJvbSAnLi9zYW5pdGl6ZWQtdmFsdWVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVByb3BlcnR5LCBub3JtYWxpemVQcm9wZXJ0eVZhbHVlIH0gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQgeyBTVkdfTkFNRVNQQUNFIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgbm9ybWFsaXplVGV4dFZhbHVlIH0gZnJvbSAnLi4vY29tcGlsZWQvb3Bjb2Rlcy9jb250ZW50JztcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGFuZ2VMaXN0IHtcbiAgc2V0QXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IFNpbXBsZS5FbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQ7XG4gIHVwZGF0ZUF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBFbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q2hhbmdlTGlzdHMoZWxlbWVudDogU2ltcGxlLkVsZW1lbnQsIGF0dHI6IHN0cmluZywgaXNUcnVzdGluZzogYm9vbGVhbiwgbmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgbGV0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7XG4gIGxldCBpc1NWRyA9IGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFO1xuXG4gIGlmIChpc1NWRykge1xuICAgIHJldHVybiBkZWZhdWx0QXR0cmlidXRlQ2hhbmdlTGlzdHModGFnTmFtZSwgYXR0cik7XG4gIH1cblxuICBsZXQgeyB0eXBlIH0gPSBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBhdHRyKTtcblxuICBpZiAodHlwZSA9PT0gJ2F0dHInKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRBdHRyaWJ1dGVDaGFuZ2VMaXN0cyh0YWdOYW1lLCBhdHRyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdFByb3BlcnR5Q2hhbmdlTGlzdHModGFnTmFtZSwgYXR0cik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQcm9wZXJ0eUNoYW5nZUxpc3RzKHRhZ05hbWU6IHN0cmluZywgYXR0cjogc3RyaW5nKSB7XG4gIGlmIChyZXF1aXJlc1Nhbml0aXphdGlvbih0YWdOYW1lLCBhdHRyKSkge1xuICAgIHJldHVybiBTYWZlSHJlZlByb3BlcnR5Q2hhbmdlTGlzdDtcbiAgfVxuXG4gIGlmIChpc1VzZXJJbnB1dFZhbHVlKHRhZ05hbWUsIGF0dHIpKSB7XG4gICAgcmV0dXJuIElucHV0VmFsdWVQcm9wZXJ0eUNoYW5nZUxpc3Q7XG4gIH1cblxuICBpZiAoaXNPcHRpb25TZWxlY3RlZCh0YWdOYW1lLCBhdHRyKSkge1xuICAgIHJldHVybiBPcHRpb25TZWxlY3RlZENoYW5nZUxpc3Q7XG4gIH1cblxuICByZXR1cm4gUHJvcGVydHlDaGFuZ2VMaXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEF0dHJpYnV0ZUNoYW5nZUxpc3RzKHRhZ05hbWU6IHN0cmluZywgYXR0cjogc3RyaW5nKSB7XG4gIGlmIChyZXF1aXJlc1Nhbml0aXphdGlvbih0YWdOYW1lLCBhdHRyKSkge1xuICAgIHJldHVybiBTYWZlSHJlZkF0dHJpYnV0ZUNoYW5nZUxpc3Q7XG4gIH1cblxuICByZXR1cm4gQXR0cmlidXRlQ2hhbmdlTGlzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRET01BdHRyKGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZykge1xuICAgbGV0IGlzU1ZHID0gZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0U7XG4gICBsZXQgeyB0eXBlLCBub3JtYWxpemVkIH0gPSBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBhdHRyKTtcblxuICAgaWYgKGlzU1ZHKSB7XG4gICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShub3JtYWxpemVkKTtcbiAgIH1cblxuICAgaWYgKHR5cGUgPT09ICdhdHRyJykge1xuICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobm9ybWFsaXplZCk7XG4gICB9IHtcbiAgICAgcmV0dXJuIGVsZW1lbnRbbm9ybWFsaXplZF07XG4gICB9XG59O1xuXG5leHBvcnQgY29uc3QgUHJvcGVydHlDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IHtcbiAgc2V0QXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IFNpbXBsZS5FbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IERPTU5hbWVzcGFjZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgbm9ybWFsaXplZCA9IGF0dHIudG9Mb3dlckNhc2UoKTtcbiAgICAgIGVsZW1lbnRbbm9ybWFsaXplZF0gPSBub3JtYWxpemVQcm9wZXJ0eVZhbHVlKHZhbHVlKTsgLy8gVE9ETzogVGhpcyBkb2Vzbid0IHdvcmtcbiAgICB9XG4gIH0sXG5cbiAgdXBkYXRlQXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSwgbmFtZXNwYWNlPzogRE9NTmFtZXNwYWNlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBub3JtYWxpemVkID0gYXR0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgZWxlbWVudFtub3JtYWxpemVkXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSguLi5hcmd1bWVudHMpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEF0dHJpYnV0ZUNoYW5nZUxpc3Q6IElDaGFuZ2VMaXN0ID0gbmV3IGNsYXNzIHtcbiAgc2V0QXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IFNpbXBsZS5FbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUsIG5hbWVzcGFjZT86IERPTU5hbWVzcGFjZSkge1xuICAgIGxldCBkb20gPSBlbnYuZ2V0QXBwZW5kT3BlcmF0aW9ucygpO1xuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ciwgbm9ybWFsaXplVGV4dFZhbHVlKHZhbHVlKSwgbmFtZXNwYWNlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVBdHRyaWJ1dGUoZW52OiBFbnZpcm9ubWVudCwgZWxlbWVudDogRWxlbWVudCwgYXR0cjogc3RyaW5nLCB2YWx1ZTogT3BhcXVlLCBuYW1lc3BhY2U/OiBET01OYW1lc3BhY2UpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICBlbnYuZ2V0RE9NKCkucmVtb3ZlQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudi5nZXRET00oKS5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgYXR0ciwgdmFsdWUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gaXNVc2VySW5wdXRWYWx1ZSh0YWdOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gIHJldHVybiAodGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09PSAnVEVYVEFSRUEnKSAmJiBhdHRyaWJ1dGUgPT09ICd2YWx1ZSc7XG59XG5cbmV4cG9ydCBjb25zdCBJbnB1dFZhbHVlUHJvcGVydHlDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IG5ldyBjbGFzcyB7XG4gIHNldEF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBTaW1wbGUuRWxlbWVudCwgYXR0cjogc3RyaW5nLCB2YWx1ZTogT3BhcXVlKSB7XG4gICAgbGV0IGlucHV0ID0gZWxlbWVudCBhcyBGSVhNRTxIVE1MSW5wdXRFbGVtZW50LCBcIlRoaXMgYnJlYWtzIFNTUlwiPjtcbiAgICBpbnB1dC52YWx1ZSA9IG5vcm1hbGl6ZVRleHRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICB1cGRhdGVBdHRyaWJ1dGUoZW52OiBFbnZpcm9ubWVudCwgZWxlbWVudDogRWxlbWVudCwgYXR0cjogc3RyaW5nLCB2YWx1ZTogT3BhcXVlKSB7XG4gICAgbGV0IGlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWxlbWVudDtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVRleHRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gbm9ybWFsaXplZFZhbHVlKSB7XG4gICAgICBpbnB1dC52YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGlzT3B0aW9uU2VsZWN0ZWQodGFnTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICByZXR1cm4gdGFnTmFtZSA9PT0gJ09QVElPTicgJiYgYXR0cmlidXRlID09PSAnc2VsZWN0ZWQnO1xufVxuXG5leHBvcnQgY29uc3QgT3B0aW9uU2VsZWN0ZWRDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IG5ldyBjbGFzcyB7XG4gIHNldEF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBTaW1wbGUuRWxlbWVudCwgYXR0cjogc3RyaW5nLCB2YWx1ZTogT3BhcXVlKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICBlbnYuZ2V0QXBwZW5kT3BlcmF0aW9ucygpLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnc2VsZWN0ZWQnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSkge1xuICAgIGxldCBvcHRpb24gPSA8SFRNTE9wdGlvbkVsZW1lbnQ+ZWxlbWVudDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgU2FmZUhyZWZQcm9wZXJ0eUNoYW5nZUxpc3Q6IElDaGFuZ2VMaXN0ID0gbmV3IGNsYXNzIHtcbiAgc2V0QXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IFNpbXBsZS5FbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUpIHtcbiAgICBsZXQgdHJlZSA9IGVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCk7XG4gICAgUHJvcGVydHlDaGFuZ2VMaXN0LnNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIGF0dHIsIHNhbml0aXplQXR0cmlidXRlVmFsdWUoZW52LCBlbGVtZW50LCBhdHRyLCB2YWx1ZSkpO1xuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgYXR0ciwgdmFsdWUpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgU2FmZUhyZWZBdHRyaWJ1dGVDaGFuZ2VMaXN0OiBJQ2hhbmdlTGlzdCA9IG5ldyBjbGFzcyB7XG4gIHNldEF0dHJpYnV0ZShlbnY6IEVudmlyb25tZW50LCBlbGVtZW50OiBFbGVtZW50LCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBPcGFxdWUpIHtcbiAgICBBdHRyaWJ1dGVDaGFuZ2VMaXN0LnNldEF0dHJpYnV0ZShlbnYsIGVsZW1lbnQsIGF0dHIsIHNhbml0aXplQXR0cmlidXRlVmFsdWUoZW52LCBlbGVtZW50LCBhdHRyLCB2YWx1ZSkpO1xuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlKGVudjogRW52aXJvbm1lbnQsIGVsZW1lbnQ6IEVsZW1lbnQsIGF0dHI6IHN0cmluZywgdmFsdWU6IE9wYXF1ZSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKGVudiwgZWxlbWVudCwgYXR0ciwgdmFsdWUpO1xuICB9XG59O1xuIl19 enifed('glimmer-runtime/lib/dom/helper', ['exports', 'glimmer-runtime/lib/bounds', 'glimmer-runtime/lib/compat/inner-html-fix', 'glimmer-runtime/lib/compat/svg-inner-html-fix', 'glimmer-runtime/lib/compat/text-node-merging-fix', 'glimmer-runtime/lib/dom/interfaces'], function (exports, _glimmerRuntimeLibBounds, _glimmerRuntimeLibCompatInnerHtmlFix, _glimmerRuntimeLibCompatSvgInnerHtmlFix, _glimmerRuntimeLibCompatTextNodeMergingFix, _glimmerRuntimeLibDomInterfaces) { 'use strict'; exports.isWhitespace = isWhitespace; exports.moveNodesBefore = moveNodesBefore; @@ -22924,18 +21648,10 @@ VM.prototype.pushEvalFrame = function pushEvalFrame(ops) { this.frame.push(ops); }; - VM.prototype.popFrame = function popFrame() { - var frame = this.frame; - - frame.pop(); - var current = frame.getCurrent(); - if (current === null) return; - }; - VM.prototype.pushChildScope = function pushChildScope() { this.scopeStack.push(this.scopeStack.current.child()); }; VM.prototype.pushCallerScope = function pushCallerScope() { @@ -23078,10 +21794,10 @@ return VM; })(); exports.default = VM; }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcnVudGltZS9saWIvdm0vYXBwZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztRQStDYyxFQUFBO0FBZVosaUJBZlksRUFBQSxDQWVBLElBQWdFLEVBQUE7Z0JBQTlELEdBQUcsR0FBTCxJQUFnRSxDQUE5RCxHQUFHO2dCQUFFLEtBQUssR0FBWixJQUFnRSxDQUF6RCxLQUFLO2dCQUFFLFlBQVksR0FBMUIsSUFBZ0UsQ0FBbEQsWUFBWTtnQkFBRSxZQUFZLEdBQXhDLElBQWdFLENBQXBDLFlBQVk7O0FBYjVDLGdCQUFBLENBQUEsaUJBQWlCLEdBQUcsaUJBL0NSLEtBQUssRUErQzRCLENBQUM7QUFDOUMsZ0JBQUEsQ0FBQSxVQUFVLEdBQUcsaUJBaERELEtBQUssRUFnRGMsQ0FBQztBQUVqQyxnQkFBQSxDQUFBLG1CQUFtQixHQUFHLGlCQWxEVCxLQUFLLEVBa0QyQyxDQUFDO0FBQzlELGdCQUFBLENBQUEsV0FBVyxHQUFHLGlCQW5ERCxLQUFLLEVBbUR1QixDQUFDO0FBQzFDLGdCQUFBLENBQUEsY0FBYyxHQUFHLGlCQXBESixLQUFLLEVBb0QyQixDQUFDO0FBQzlDLGdCQUFBLENBQUEsS0FBSyxHQUFHLDhCQXpDUixVQUFVLEVBeUNjLENBQUM7QUFROUIsZ0JBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2YsZ0JBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLGdCQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixnQkFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMzQzs7QUFwQlcsVUFBQSxDQVVMLE9BQU8sR0FBQSxpQkFBQyxHQUFnQixFQUFFLEtBQTRELEVBQUE7Z0JBQTFELFlBQVksR0FBZCxLQUE0RCxDQUExRCxZQUFZO2dCQUFFLElBQUksR0FBcEIsS0FBNEQsQ0FBNUMsSUFBSTtnQkFBRSxZQUFZLEdBQWxDLEtB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QUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFaEMseUJBcFhnRSxNQUFNLENBb1gvRCxJQUFJLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztBQUUxQyxnQkFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBRWhDLGlCQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsQyxxQkFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQztTQUNGOztlQTlVVyxFQUFBOzs7c0JBQUEsRUFBQSIsImZpbGUiOiJhcHBlbmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY29wZSwgRHluYW1pY1Njb3BlLCBFbnZpcm9ubWVudCB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB7IEVsZW1lbnRTdGFjayB9IGZyb20gJy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgRGVzdHJveWFibGUsIFN0YWNrLCBMaW5rZWRMaXN0LCBMaXN0U2xpY2UsIExPR0dFUiwgT3BhcXVlLCBhc3NlcnQgfSBmcm9tICdnbGltbWVyLXV0aWwnO1xuaW1wb3J0IHsgUGF0aFJlZmVyZW5jZSwgY29tYmluZVNsaWNlIH0gZnJvbSAnZ2xpbW1lci1yZWZlcmVuY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVzIH0gZnJvbSAnLi4vc3ludGF4L2NvcmUnO1xuaW1wb3J0IHsgSW5saW5lQmxvY2ssIENvbXBpbGVkQmxvY2sgfSBmcm9tICcuLi9jb21waWxlZC9ibG9ja3MnO1xuaW1wb3J0IHsgQ29tcGlsZWRFeHByZXNzaW9uIH0gZnJvbSAnLi4vY29tcGlsZWQvZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgQ29tcGlsZWRBcmdzLCBFdmFsdWF0ZWRBcmdzIH0gZnJvbSAnLi4vY29tcGlsZWQvZXhwcmVzc2lvbnMvYXJncyc7XG5pbXBvcnQgeyBPcGNvZGUsIE9wU2VxLCBVcGRhdGluZ09wY29kZSB9IGZyb20gJy4uL29wY29kZXMnO1xuaW1wb3J0IHsgTGFiZWxPcGNvZGUsIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlLCBEaWRNb2RpZnlPcGNvZGUgfSBmcm9tICcuLi9jb21waWxlZC9vcGNvZGVzL3ZtJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vY29tcG9uZW50L2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgVk1TdGF0ZSwgTGlzdEJsb2NrT3Bjb2RlLCBUcnlPcGNvZGUsIEJsb2NrT3Bjb2RlIH0gZnJvbSAnLi91cGRhdGUnO1xuaW1wb3J0IFJlbmRlclJlc3VsdCBmcm9tICcuL3JlbmRlci1yZXN1bHQnO1xuaW1wb3J0IHsgRnJhbWVTdGFjaywgQmxvY2tzIH0gZnJvbSAnLi9mcmFtZSc7XG5cbmludGVyZmFjZSBWTUluaXRpYWxPcHRpb25zIHtcbiAgc2VsZjogUGF0aFJlZmVyZW5jZTxPcGFxdWU+O1xuICBkeW5hbWljU2NvcGU6IER5bmFtaWNTY29wZTtcbiAgZWxlbWVudFN0YWNrOiBFbGVtZW50U3RhY2s7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZNQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgZW52OiBFbnZpcm9ubWVudDtcbiAgc2NvcGU6IFNjb3BlO1xuICBkeW5hbWljU2NvcGU6IER5bmFtaWNTY29wZTtcbiAgZWxlbWVudFN0YWNrOiBFbGVtZW50U3RhY2s7XG59XG5cbmludGVyZmFjZSBQdXNoRnJhbWVPcHRpb25zIHtcbiAgYmxvY2s6IENvbXBpbGVkQmxvY2s7XG4gIGFyZ3M/OiBFdmFsdWF0ZWRBcmdzO1xuICBibG9ja3M/OiBCbG9ja3M7XG4gIGNhbGxlclNjb3BlPzogU2NvcGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljVk0ge1xuICBlbnY6IEVudmlyb25tZW50O1xuICBnZXRBcmdzKCk6IEV2YWx1YXRlZEFyZ3M7XG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGU7XG4gIGdldFNlbGYoKTogUGF0aFJlZmVyZW5jZTxPcGFxdWU+O1xuICBuZXdEZXN0cm95YWJsZShkOiBEZXN0cm95YWJsZSk7XG59XG5cbnR5cGUgT3BMaXN0ID0gUmFuZ2U8T3Bjb2RlPjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVk0gaW1wbGVtZW50cyBQdWJsaWNWTSB7XG4gIHB1YmxpYyBlbnY6IEVudmlyb25tZW50O1xuICBwcml2YXRlIGR5bmFtaWNTY29wZVN0YWNrID0gbmV3IFN0YWNrPER5bmFtaWNTY29wZT4oKTtcbiAgcHJpdmF0ZSBzY29wZVN0YWNrID0gbmV3IFN0YWNrPFNjb3BlPigpO1xuICBwcml2YXRlIGVsZW1lbnRTdGFjazogRWxlbWVudFN0YWNrO1xuICBwdWJsaWMgdXBkYXRpbmdPcGNvZGVTdGFjayA9IG5ldyBTdGFjazxMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPj4oKTtcbiAgcHVibGljIGNhY2hlR3JvdXBzID0gbmV3IFN0YWNrPFVwZGF0aW5nT3Bjb2RlPigpO1xuICBwdWJsaWMgbGlzdEJsb2NrU3RhY2sgPSBuZXcgU3RhY2s8TGlzdEJsb2NrT3Bjb2RlPigpO1xuICBwdWJsaWMgZnJhbWUgPSBuZXcgRnJhbWVTdGFjaygpO1xuXG4gIHN0YXRpYyBpbml0aWFsKGVudjogRW52aXJvbm1lbnQsIHsgZWxlbWVudFN0YWNrLCBzZWxmLCBkeW5hbWljU2NvcGUsIHNpemUgfTogVk1Jbml0aWFsT3B0aW9ucykge1xuICAgIGxldCBzY29wZSA9IFNjb3BlLnJvb3Qoc2VsZiwgc2l6ZSk7XG4gICAgcmV0dXJuIG5ldyBWTSh7IGVudiwgc2NvcGUsIGR5bmFtaWNTY29wZSwgZWxlbWVudFN0YWNrIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoeyBlbnYsIHNjb3BlLCBkeW5hbWljU2NvcGUsIGVsZW1lbnRTdGFjayB9OiBWTUNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHRoaXMuZW52ID0gZW52O1xuICAgIHRoaXMuZWxlbWVudFN0YWNrID0gZWxlbWVudFN0YWNrO1xuICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKHNjb3BlKTtcbiAgICB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLnB1c2goZHluYW1pY1Njb3BlKTtcbiAgfVxuXG4gIGNhcHR1cmUoKTogVk1TdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICBzY29wZTogdGhpcy5zY29wZSgpLFxuICAgICAgZHluYW1pY1Njb3BlOiB0aGlzLmR5bmFtaWNTY29wZSgpXG4gICAgfTtcbiAgfVxuXG4gIGdvdG8ob3A6IExhYmVsT3Bjb2RlKSB7XG4gICAgLy8gYXNzZXJ0KHRoaXMuZnJhbWUuZ2V0T3BzKCkuY29udGFpbnMob3ApLCBgSWxsZWdhbCBqdW1wIHRvICR7b3AubGFiZWx9YCk7XG4gICAgdGhpcy5mcmFtZS5nb3RvKG9wKTtcbiAgfVxuXG4gIGJlZ2luQ2FjaGVHcm91cCgpIHtcbiAgICB0aGlzLmNhY2hlR3JvdXBzLnB1c2godGhpcy51cGRhdGluZ09wY29kZVN0YWNrLmN1cnJlbnQudGFpbCgpKTtcbiAgfVxuXG4gIGNvbW1pdENhY2hlR3JvdXAoKSB7XG4gICAgLy8gICAgICAgIEp1bXBJZk5vdE1vZGlmaWVkKEVORClcbiAgICAvLyAgICAgICAgKGhlYWQpXG4gICAgLy8gICAgICAgICguLi4uKVxuICAgIC8vICAgICAgICAodGFpbClcbiAgICAvLyAgICAgICAgRGlkTW9kaWZ5XG4gICAgLy8gRU5EOiAgIE5vb3BcblxuICAgIGxldCBFTkQgPSBuZXcgTGFiZWxPcGNvZGUoXCJFTkRcIik7XG5cbiAgICBsZXQgb3Bjb2RlcyA9IHRoaXMudXBkYXRpbmdPcGNvZGVTdGFjay5jdXJyZW50O1xuICAgIGxldCBtYXJrZXIgPSB0aGlzLmNhY2hlR3JvdXBzLnBvcCgpO1xuICAgIGxldCBoZWFkID0gbWFya2VyID8gb3Bjb2Rlcy5uZXh0Tm9kZShtYXJrZXIpIDogb3Bjb2Rlcy5oZWFkKCk7XG4gICAgbGV0IHRhaWwgPSBvcGNvZGVzLnRhaWwoKTtcbiAgICBsZXQgdGFnID0gY29tYmluZVNsaWNlKG5ldyBMaXN0U2xpY2UoaGVhZCwgdGFpbCkpO1xuXG4gICAgbGV0IGd1YXJkID0gbmV3IEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlKHsgdGFnLCB0YXJnZXQ6IEVORCB9KTtcblxuICAgIG9wY29kZXMuaW5zZXJ0QmVmb3JlKGd1YXJkLCBoZWFkKTtcbiAgICBvcGNvZGVzLmFwcGVuZChuZXcgRGlkTW9kaWZ5T3Bjb2RlKHsgdGFyZ2V0OiBndWFyZCB9KSk7XG4gICAgb3Bjb2Rlcy5hcHBlbmQoRU5EKTtcbiAgfVxuXG4gIGVudGVyKG9wczogT3BTZXEpIHtcbiAgICBsZXQgdXBkYXRpbmcgPSBuZXcgTGlua2VkTGlzdDxVcGRhdGluZ09wY29kZT4oKTtcblxuICAgIGxldCB0cmFja2VyID0gdGhpcy5zdGFjaygpLnB1c2hVcGRhdGFibGVCbG9jaygpO1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZSgpO1xuXG4gICAgbGV0IHRyeU9wY29kZSA9IG5ldyBUcnlPcGNvZGUob3BzLCBzdGF0ZSwgdHJhY2tlciwgdXBkYXRpbmcpO1xuXG4gICAgdGhpcy5kaWRFbnRlcih0cnlPcGNvZGUsIHVwZGF0aW5nKTtcbiAgfVxuXG4gIGVudGVyV2l0aEtleShrZXk6IHN0cmluZywgb3BzOiBPcFNlcSkge1xuICAgIGxldCB1cGRhdGluZyA9IG5ldyBMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPigpO1xuXG4gICAgbGV0IHRyYWNrZXIgPSB0aGlzLnN0YWNrKCkucHVzaFVwZGF0YWJsZUJsb2NrKCk7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKCk7XG5cbiAgICBsZXQgdHJ5T3Bjb2RlID0gbmV3IFRyeU9wY29kZShvcHMsIHN0YXRlLCB0cmFja2VyLCB1cGRhdGluZyk7XG5cbiAgICB0aGlzLmxpc3RCbG9ja1N0YWNrLmN1cnJlbnQubWFwW2tleV0gPSB0cnlPcGNvZGU7XG5cbiAgICB0aGlzLmRpZEVudGVyKHRyeU9wY29kZSwgdXBkYXRpbmcpO1xuICB9XG5cbiAgZW50ZXJMaXN0KG9wczogT3BTZXEpIHtcbiAgICBsZXQgdXBkYXRpbmcgPSBuZXcgTGlua2VkTGlzdDxCbG9ja09wY29kZT4oKTtcblxuICAgIGxldCB0cmFja2VyID0gdGhpcy5zdGFjaygpLnB1c2hCbG9ja0xpc3QodXBkYXRpbmcpO1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZSgpO1xuICAgIGxldCBhcnRpZmFjdHMgPSB0aGlzLmZyYW1lLmdldEl0ZXJhdG9yKCkuYXJ0aWZhY3RzO1xuXG4gICAgbGV0IG9wY29kZSA9IG5ldyBMaXN0QmxvY2tPcGNvZGUob3BzLCBzdGF0ZSwgdHJhY2tlciwgdXBkYXRpbmcsIGFydGlmYWN0cyk7XG5cbiAgICB0aGlzLmxpc3RCbG9ja1N0YWNrLnB1c2gob3Bjb2RlKTtcblxuICAgIHRoaXMuZGlkRW50ZXIob3Bjb2RlLCB1cGRhdGluZyk7XG4gIH1cblxuICBwcml2YXRlIGRpZEVudGVyKG9wY29kZTogQmxvY2tPcGNvZGUsIHVwZGF0aW5nOiBMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPikge1xuICAgIHRoaXMudXBkYXRlV2l0aChvcGNvZGUpO1xuICAgIHRoaXMudXBkYXRpbmdPcGNvZGVTdGFjay5wdXNoKHVwZGF0aW5nKTtcbiAgfVxuXG4gIGV4aXQoKSB7XG4gICAgdGhpcy5zdGFjaygpLnBvcEJsb2NrKCk7XG4gICAgdGhpcy51cGRhdGluZ09wY29kZVN0YWNrLnBvcCgpO1xuXG4gICAgbGV0IHBhcmVudCA9IHRoaXMudXBkYXRpbmdPcGNvZGVTdGFjay5jdXJyZW50LnRhaWwoKSBhcyBCbG9ja09wY29kZTtcblxuICAgIHBhcmVudC5kaWRJbml0aWFsaXplQ2hpbGRyZW4oKTtcbiAgfVxuXG4gIGV4aXRMaXN0KCkge1xuICAgIHRoaXMuZXhpdCgpO1xuICAgIHRoaXMubGlzdEJsb2NrU3RhY2sucG9wKCk7XG4gIH1cblxuICB1cGRhdGVXaXRoKG9wY29kZTogVXBkYXRpbmdPcGNvZGUpIHtcbiAgICB0aGlzLnVwZGF0aW5nT3Bjb2RlU3RhY2suY3VycmVudC5hcHBlbmQob3Bjb2RlKTtcbiAgfVxuXG4gIHN0YWNrKCk6IEVsZW1lbnRTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrO1xuICB9XG5cbiAgc2NvcGUoKTogU2NvcGUge1xuICAgIHJldHVybiB0aGlzLnNjb3BlU3RhY2suY3VycmVudDtcbiAgfVxuXG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGUge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLmN1cnJlbnQ7XG4gIH1cblxuICBwdXNoRnJhbWUoeyBibG9jaywgYXJncywgYmxvY2tzLCBjYWxsZXJTY29wZSB9OiBQdXNoRnJhbWVPcHRpb25zKSB7XG4gICAgdGhpcy5mcmFtZS5wdXNoKGJsb2NrLm9wcyk7XG5cbiAgICBpZiAoYXJncykgdGhpcy5mcmFtZS5zZXRBcmdzKGFyZ3MpO1xuICAgIGlmIChibG9ja3MpIHRoaXMuZnJhbWUuc2V0QmxvY2tzKGJsb2Nrcyk7XG4gICAgaWYgKGNhbGxlclNjb3BlKSB0aGlzLmZyYW1lLnNldENhbGxlclNjb3BlKGNhbGxlclNjb3BlKTtcbiAgfVxuXG4gIHB1c2hDb21wb25lbnRGcmFtZShcbiAgICBsYXlvdXQ6IENvbXBpbGVkQmxvY2ssXG4gICAgYXJnczogRXZhbHVhdGVkQXJncyxcbiAgICBibG9ja3M6IEJsb2NrcyxcbiAgICBjYWxsZXJTY29wZTogU2NvcGUsXG4gICAgY29tcG9uZW50OiBDb21wb25lbnQsXG4gICAgbWFuYWdlcjogQ29tcG9uZW50TWFuYWdlcjxDb21wb25lbnQ+LFxuICAgIHNoYWRvdzogc3RyaW5nW11cbiAgKSB7XG4gICAgdGhpcy5mcmFtZS5wdXNoKGxheW91dC5vcHMsIGNvbXBvbmVudCwgbWFuYWdlciwgc2hhZG93KTtcblxuICAgIGlmIChhcmdzKSB0aGlzLmZyYW1lLnNldEFyZ3MoYXJncyk7XG4gICAgaWYgKGJsb2NrcykgdGhpcy5mcmFtZS5zZXRCbG9ja3MoYmxvY2tzKTtcbiAgICBpZiAoY2FsbGVyU2NvcGUpIHRoaXMuZnJhbWUuc2V0Q2FsbGVyU2NvcGUoY2FsbGVyU2NvcGUpO1xuICB9XG5cbiAgcHVzaEV2YWxGcmFtZShvcHM6IE9wU2VxKSB7XG4gICAgdGhpcy5mcmFtZS5wdXNoKG9wcyk7XG4gIH1cblxuICBwb3BGcmFtZSgpIHtcbiAgICBsZXQgeyBmcmFtZSB9ID0gdGhpcztcblxuICAgIGZyYW1lLnBvcCgpO1xuICAgIGxldCBjdXJyZW50ID0gZnJhbWUuZ2V0Q3VycmVudCgpO1xuXG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHJldHVybjtcbiAgfVxuXG4gIHB1c2hDaGlsZFNjb3BlKCkge1xuICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKHRoaXMuc2NvcGVTdGFjay5jdXJyZW50LmNoaWxkKCkpO1xuICB9XG5cbiAgcHVzaENhbGxlclNjb3BlKCkge1xuICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKHRoaXMuc2NvcGUoKS5nZXRDYWxsZXJTY29wZSgpKTtcbiAgfVxuXG4gIHB1c2hEeW5hbWljU2NvcGUoKTogRHluYW1pY1Njb3BlIHtcbiAgICBsZXQgY2hpbGQgPSB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLmN1cnJlbnQuY2hpbGQoKTtcbiAgICB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHB1c2hSb290U2NvcGUoc2VsZjogUGF0aFJlZmVyZW5jZTxhbnk+LCBzaXplOiBudW1iZXIpOiBTY29wZSB7XG4gICAgbGV0IHNjb3BlID0gU2NvcGUucm9vdChzZWxmLCBzaXplKTtcbiAgICB0aGlzLnNjb3BlU3RhY2sucHVzaChzY29wZSk7XG4gICAgcmV0dXJuIHNjb3BlO1xuICB9XG5cbiAgcG9wU2NvcGUoKSB7XG4gICAgdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xuICB9XG5cbiAgcG9wRHluYW1pY1Njb3BlKCkge1xuICAgIHRoaXMuZHluYW1pY1Njb3BlU3RhY2sucG9wKCk7XG4gIH1cblxuICBuZXdEZXN0cm95YWJsZShkOiBEZXN0cm95YWJsZSkge1xuICAgIHRoaXMuc3RhY2soKS5uZXdEZXN0cm95YWJsZShkKTtcbiAgfVxuXG4gIC8vLyBTQ09QRSBIRUxQRVJTXG5cbiAgZ2V0U2VsZigpOiBQYXRoUmVmZXJlbmNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnNjb3BlKCkuZ2V0U2VsZigpO1xuICB9XG5cbiAgcmVmZXJlbmNlRm9yU3ltYm9sKHN5bWJvbDogbnVtYmVyKTogUGF0aFJlZmVyZW5jZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zY29wZSgpLmdldFN5bWJvbChzeW1ib2wpO1xuICB9XG5cbiAgZ2V0QXJncygpOiBFdmFsdWF0ZWRBcmdzIHtcbiAgICByZXR1cm4gdGhpcy5mcmFtZS5nZXRBcmdzKCk7XG4gIH1cblxuICAvLy8gRVhFQ1VUSU9OXG5cbiAgZXhlY3V0ZShvcGNvZGVzOiBPcFNlcSwgaW5pdGlhbGl6ZT86ICh2bTogVk0pID0+IHZvaWQpOiBSZW5kZXJSZXN1bHQge1xuICAgIExPR0dFUi5kZWJ1ZyhcIltWTV0gQmVnaW4gcHJvZ3JhbSBleGVjdXRpb25cIik7XG5cbiAgICBsZXQgeyBlbGVtZW50U3RhY2ssIGZyYW1lLCB1cGRhdGluZ09wY29kZVN0YWNrLCBlbnYgfSA9IHRoaXM7XG5cbiAgICBlbGVtZW50U3RhY2sucHVzaFNpbXBsZUJsb2NrKCk7XG5cbiAgICB1cGRhdGluZ09wY29kZVN0YWNrLnB1c2gobmV3IExpbmtlZExpc3Q8VXBkYXRpbmdPcGNvZGU+KCkpO1xuICAgIGZyYW1lLnB1c2gob3Bjb2Rlcyk7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZSkgaW5pdGlhbGl6ZSh0aGlzKTtcblxuICAgIGxldCBvcGNvZGU6IE9wY29kZTtcblxuICAgIHdoaWxlIChmcmFtZS5oYXNPcGNvZGVzKCkpIHtcbiAgICAgIGlmIChvcGNvZGUgPSBmcmFtZS5uZXh0U3RhdGVtZW50KCkpIHtcbiAgICAgICAgTE9HR0VSLmRlYnVnKGBbVk1dIE9QICR7b3Bjb2RlLnR5cGV9YCk7XG4gICAgICAgIExPR0dFUi50cmFjZShvcGNvZGUpO1xuICAgICAgICBvcGNvZGUuZXZhbHVhdGUodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTE9HR0VSLmRlYnVnKFwiW1ZNXSBDb21wbGV0ZWQgcHJvZ3JhbSBleGVjdXRpb25cIik7XG5cbiAgICByZXR1cm4gbmV3IFJlbmRlclJlc3VsdCh7XG4gICAgICBlbnYsXG4gICAgICB1cGRhdGluZzogdXBkYXRpbmdPcGNvZGVTdGFjay5wb3AoKSxcbiAgICAgIGJvdW5kczogZWxlbWVudFN0YWNrLnBvcEJsb2NrKClcbiAgICB9KTtcbiAgfVxuXG4gIGV2YWx1YXRlT3Bjb2RlKG9wY29kZTogT3Bjb2RlKSB7XG4gICAgb3Bjb2RlLmV2YWx1YXRlKHRoaXMpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHlvdSBoYXZlIG9wY29kZXMgdGhhdCBwdXNoIGFuZCBwb3AgYSBzY29wZSBhcm91bmQgdGhpcyBvcGNvZGVcbiAgLy8gaWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBzY29wZS5cbiAgaW52b2tlQmxvY2soYmxvY2s6IElubGluZUJsb2NrLCBhcmdzOiBFdmFsdWF0ZWRBcmdzKSB7XG4gICAgbGV0IGNvbXBpbGVkID0gYmxvY2suY29tcGlsZSh0aGlzLmVudik7XG4gICAgdGhpcy5wdXNoRnJhbWUoeyBibG9jazogY29tcGlsZWQsIGFyZ3MgfSk7XG4gIH1cblxuICBpbnZva2VMYXlvdXQoXG4gICAgYXJnczogRXZhbHVhdGVkQXJncyxcbiAgICBsYXlvdXQ6IENvbXBpbGVkQmxvY2ssXG4gICAgdGVtcGxhdGVzOiBUZW1wbGF0ZXMsXG4gICAgY2FsbGVyU2NvcGU6IFNjb3BlLFxuICAgIGNvbXBvbmVudDogQ29tcG9uZW50LFxuICAgIG1hbmFnZXI6IENvbXBvbmVudE1hbmFnZXI8Q29tcG9uZW50PixcbiAgICBzaGFkb3c6IHN0cmluZ1tdXG4gICkge1xuICAgIHRoaXMucHVzaENvbXBvbmVudEZyYW1lKGxheW91dCwgYXJncywgdGVtcGxhdGVzLCBjYWxsZXJTY29wZSwgY29tcG9uZW50LCBtYW5hZ2VyLCBzaGFkb3cpO1xuICB9XG5cbiAgZXZhbHVhdGVPcGVyYW5kKGV4cHI6IENvbXBpbGVkRXhwcmVzc2lvbjxhbnk+KSB7XG4gICAgdGhpcy5mcmFtZS5zZXRPcGVyYW5kKGV4cHIuZXZhbHVhdGUodGhpcykpO1xuICB9XG5cbiAgZXZhbHVhdGVBcmdzKGFyZ3M6IENvbXBpbGVkQXJncykge1xuICAgIGxldCBldmFsZWRBcmdzID0gdGhpcy5mcmFtZS5zZXRBcmdzKGFyZ3MuZXZhbHVhdGUodGhpcykpO1xuICAgIHRoaXMuZnJhbWUuc2V0T3BlcmFuZChldmFsZWRBcmdzLnBvc2l0aW9uYWwuYXQoMCkpO1xuICB9XG5cbiAgYmluZFBvc2l0aW9uYWxBcmdzKHN5bWJvbHM6IG51bWJlcltdKSB7XG4gICAgbGV0IGFyZ3MgPSB0aGlzLmZyYW1lLmdldEFyZ3MoKTtcblxuICAgIGFzc2VydChhcmdzLCBcIkNhbm5vdCBiaW5kIHBvc2l0aW9uYWwgYXJnc1wiKTtcblxuICAgIGxldCB7IHBvc2l0aW9uYWwgfSA9IGFyZ3M7XG5cbiAgICBsZXQgc2NvcGUgPSB0aGlzLnNjb3BlKCk7XG5cbiAgICBmb3IobGV0IGk9MDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjb3BlLmJpbmRTeW1ib2woc3ltYm9sc1tpXSwgcG9zaXRpb25hbC5hdChpKSk7XG4gICAgfVxuICB9XG5cbiAgYmluZE5hbWVkQXJncyhuYW1lczogc3RyaW5nW10sIHN5bWJvbHM6IG51bWJlcltdKSB7XG4gICAgbGV0IGFyZ3MgPSB0aGlzLmZyYW1lLmdldEFyZ3MoKTtcblxuICAgIGFzc2VydChhcmdzLCBcIkNhbm5vdCBiaW5kIG5hbWVkIGFyZ3NcIik7XG5cbiAgICBsZXQgeyBuYW1lZCB9ID0gYXJncztcblxuICAgIGxldCBzY29wZSA9IHRoaXMuc2NvcGUoKTtcblxuICAgIGZvcihsZXQgaT0wOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjb3BlLmJpbmRTeW1ib2woc3ltYm9sc1tpXSwgbmFtZWQuZ2V0KG5hbWVzW2ldKSk7XG4gICAgfVxuICB9XG5cbiAgYmluZEJsb2NrcyhuYW1lczogc3RyaW5nW10sIHN5bWJvbHM6IG51bWJlcltdKSB7XG4gICAgbGV0IGJsb2NrcyA9IHRoaXMuZnJhbWUuZ2V0QmxvY2tzKCk7XG4gICAgbGV0IGNhbGxlclNjb3BlID0gdGhpcy5mcmFtZS5nZXRDYWxsZXJTY29wZSgpO1xuXG4gICAgbGV0IHNjb3BlID0gdGhpcy5zY29wZSgpO1xuXG4gICAgc2NvcGUuYmluZENhbGxlclNjb3BlKGNhbGxlclNjb3BlKTtcblxuICAgIGZvcihsZXQgaT0wOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjb3BlLmJpbmRCbG9jayhzeW1ib2xzW2ldLCAoYmxvY2tzICYmIGJsb2Nrc1tuYW1lc1tpXV0pIHx8IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGJpbmREeW5hbWljU2NvcGUobmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IGFyZ3MgPSB0aGlzLmZyYW1lLmdldEFyZ3MoKTtcblxuICAgIGFzc2VydChhcmdzLCBcIkNhbm5vdCBiaW5kIGR5bmFtaWMgc2NvcGVcIik7XG5cbiAgICBsZXQgc2NvcGUgPSB0aGlzLmR5bmFtaWNTY29wZSgpO1xuXG4gICAgZm9yKGxldCBpPTA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgc2NvcGUuc2V0KG5hbWVzW2ldLCBhcmdzLm5hbWVkLmdldChuYW1lc1tpXSkpO1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgRXhjZXB0aW9uSGFuZGxlciB7XG4gIGhhbmRsZUV4Y2VwdGlvbihpbml0aWFsaXplPzogKHZtOiBWTSkgPT4gdm9pZCk7XG59XG5cbmludGVyZmFjZSBSZXR1cm5IYW5kbGVyIHtcbiAgc2V0UmVuZGVyUmVzdWx0KHJlbmRlclJlc3VsdDogUmVuZGVyUmVzdWx0KTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdsaW1tZXItcnVudGltZS9saWIvdm0vYXBwZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztRQStDYyxFQUFBO0FBZVosaUJBZlksRUFBQSxDQWVBLElBQWdFLEVBQUE7Z0JBQTlELEdBQUcsR0FBTCxJQUFnRSxDQUE5RCxHQUFHO2dCQUFFLEtBQUssR0FBWixJQUFnRSxDQUF6RCxLQUFLO2dCQUFFLFlBQVksR0FBMUIsSUFBZ0UsQ0FBbEQsWUFBWTtnQkFBRSxZQUFZLEdBQXhDLElBQWdFLENBQXBDLFlBQVk7O0FBYjVDLGdCQUFBLENBQUEsaUJBQWlCLEdBQUcsaUJBL0NSLEtBQUssRUErQzRCLENBQUM7QUFDOUMsZ0JBQUEsQ0FBQSxVQUFVLEdBQUcsaUJBaERELEtBQUssRUFnRGMsQ0FBQztBQUVqQyxnQkFBQSxDQUFBLG1CQUFtQixHQUFHLGlCQWxEVCxLQUFLLEVBa0QyQyxDQUFDO0FBQzlELGdCQUFBLENBQUEsV0FBVyxHQUFHLGlCQW5ERCxLQUFLLEVBbUR1QixDQUFDO0FBQzFDLGdCQUFBLENBQUEsY0FBYyxHQUFHLGlCQXBESixLQUFLLEVBb0QyQixDQUFDO0FBQzlDLGdCQUFBLENBQUEsS0FBSyxHQUFHLDhCQXpDUixVQUFVLEVBeUNjLENBQUM7QUFROUIsZ0JBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2YsZ0JBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLGdCQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixnQkFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMzQzs7QUFwQlcsVUFBQSxDQVVMLE9BQU8sR0FBQSxpQkFBQyxHQUFnQixFQUFFLEtBQTRELEVBQUE7Z0JBQTFELFlBQVksR0FBZCxLQUE0RCxDQUExRCxZQUFZO2dCQUFFLElBQUksR0FBcEIsS0FBNEQsQ0FBNUMsSUFBSTtnQkFBRSxZQUFZLEdBQWxDLEtB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QUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsQyxxQkFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQztTQUNGOztlQXJVVyxFQUFBOzs7c0JBQUEsRUFBQSIsImZpbGUiOiJhcHBlbmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY29wZSwgRHluYW1pY1Njb3BlLCBFbnZpcm9ubWVudCB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB7IEVsZW1lbnRTdGFjayB9IGZyb20gJy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgRGVzdHJveWFibGUsIFN0YWNrLCBMaW5rZWRMaXN0LCBMaXN0U2xpY2UsIExPR0dFUiwgT3BhcXVlLCBhc3NlcnQgfSBmcm9tICdnbGltbWVyLXV0aWwnO1xuaW1wb3J0IHsgUGF0aFJlZmVyZW5jZSwgY29tYmluZVNsaWNlIH0gZnJvbSAnZ2xpbW1lci1yZWZlcmVuY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVzIH0gZnJvbSAnLi4vc3ludGF4L2NvcmUnO1xuaW1wb3J0IHsgSW5saW5lQmxvY2ssIENvbXBpbGVkQmxvY2sgfSBmcm9tICcuLi9jb21waWxlZC9ibG9ja3MnO1xuaW1wb3J0IHsgQ29tcGlsZWRFeHByZXNzaW9uIH0gZnJvbSAnLi4vY29tcGlsZWQvZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgQ29tcGlsZWRBcmdzLCBFdmFsdWF0ZWRBcmdzIH0gZnJvbSAnLi4vY29tcGlsZWQvZXhwcmVzc2lvbnMvYXJncyc7XG5pbXBvcnQgeyBPcGNvZGUsIE9wU2VxLCBVcGRhdGluZ09wY29kZSB9IGZyb20gJy4uL29wY29kZXMnO1xuaW1wb3J0IHsgTGFiZWxPcGNvZGUsIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlLCBEaWRNb2RpZnlPcGNvZGUgfSBmcm9tICcuLi9jb21waWxlZC9vcGNvZGVzL3ZtJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vY29tcG9uZW50L2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgVk1TdGF0ZSwgTGlzdEJsb2NrT3Bjb2RlLCBUcnlPcGNvZGUsIEJsb2NrT3Bjb2RlIH0gZnJvbSAnLi91cGRhdGUnO1xuaW1wb3J0IFJlbmRlclJlc3VsdCBmcm9tICcuL3JlbmRlci1yZXN1bHQnO1xuaW1wb3J0IHsgRnJhbWVTdGFjaywgQmxvY2tzIH0gZnJvbSAnLi9mcmFtZSc7XG5cbmludGVyZmFjZSBWTUluaXRpYWxPcHRpb25zIHtcbiAgc2VsZjogUGF0aFJlZmVyZW5jZTxPcGFxdWU+O1xuICBkeW5hbWljU2NvcGU6IER5bmFtaWNTY29wZTtcbiAgZWxlbWVudFN0YWNrOiBFbGVtZW50U3RhY2s7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZNQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgZW52OiBFbnZpcm9ubWVudDtcbiAgc2NvcGU6IFNjb3BlO1xuICBkeW5hbWljU2NvcGU6IER5bmFtaWNTY29wZTtcbiAgZWxlbWVudFN0YWNrOiBFbGVtZW50U3RhY2s7XG59XG5cbmludGVyZmFjZSBQdXNoRnJhbWVPcHRpb25zIHtcbiAgYmxvY2s6IENvbXBpbGVkQmxvY2s7XG4gIGFyZ3M/OiBFdmFsdWF0ZWRBcmdzO1xuICBibG9ja3M/OiBCbG9ja3M7XG4gIGNhbGxlclNjb3BlPzogU2NvcGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljVk0ge1xuICBlbnY6IEVudmlyb25tZW50O1xuICBnZXRBcmdzKCk6IEV2YWx1YXRlZEFyZ3M7XG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGU7XG4gIGdldFNlbGYoKTogUGF0aFJlZmVyZW5jZTxPcGFxdWU+O1xuICBuZXdEZXN0cm95YWJsZShkOiBEZXN0cm95YWJsZSk7XG59XG5cbnR5cGUgT3BMaXN0ID0gUmFuZ2U8T3Bjb2RlPjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVk0gaW1wbGVtZW50cyBQdWJsaWNWTSB7XG4gIHB1YmxpYyBlbnY6IEVudmlyb25tZW50O1xuICBwcml2YXRlIGR5bmFtaWNTY29wZVN0YWNrID0gbmV3IFN0YWNrPER5bmFtaWNTY29wZT4oKTtcbiAgcHJpdmF0ZSBzY29wZVN0YWNrID0gbmV3IFN0YWNrPFNjb3BlPigpO1xuICBwcml2YXRlIGVsZW1lbnRTdGFjazogRWxlbWVudFN0YWNrO1xuICBwdWJsaWMgdXBkYXRpbmdPcGNvZGVTdGFjayA9IG5ldyBTdGFjazxMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPj4oKTtcbiAgcHVibGljIGNhY2hlR3JvdXBzID0gbmV3IFN0YWNrPFVwZGF0aW5nT3Bjb2RlPigpO1xuICBwdWJsaWMgbGlzdEJsb2NrU3RhY2sgPSBuZXcgU3RhY2s8TGlzdEJsb2NrT3Bjb2RlPigpO1xuICBwdWJsaWMgZnJhbWUgPSBuZXcgRnJhbWVTdGFjaygpO1xuXG4gIHN0YXRpYyBpbml0aWFsKGVudjogRW52aXJvbm1lbnQsIHsgZWxlbWVudFN0YWNrLCBzZWxmLCBkeW5hbWljU2NvcGUsIHNpemUgfTogVk1Jbml0aWFsT3B0aW9ucykge1xuICAgIGxldCBzY29wZSA9IFNjb3BlLnJvb3Qoc2VsZiwgc2l6ZSk7XG4gICAgcmV0dXJuIG5ldyBWTSh7IGVudiwgc2NvcGUsIGR5bmFtaWNTY29wZSwgZWxlbWVudFN0YWNrIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoeyBlbnYsIHNjb3BlLCBkeW5hbWljU2NvcGUsIGVsZW1lbnRTdGFjayB9OiBWTUNvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHRoaXMuZW52ID0gZW52O1xuICAgIHRoaXMuZWxlbWVudFN0YWNrID0gZWxlbWVudFN0YWNrO1xuICAgIHRoaXMuc2NvcGVTdGFjay5wdXNoKHNjb3BlKTtcbiAgICB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLnB1c2goZHluYW1pY1Njb3BlKTtcbiAgfVxuXG4gIGNhcHR1cmUoKTogVk1TdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICBzY29wZTogdGhpcy5zY29wZSgpLFxuICAgICAgZHluYW1pY1Njb3BlOiB0aGlzLmR5bmFtaWNTY29wZSgpXG4gICAgfTtcbiAgfVxuXG4gIGdvdG8ob3A6IExhYmVsT3Bjb2RlKSB7XG4gICAgLy8gYXNzZXJ0KHRoaXMuZnJhbWUuZ2V0T3BzKCkuY29udGFpbnMob3ApLCBgSWxsZWdhbCBqdW1wIHRvICR7b3AubGFiZWx9YCk7XG4gICAgdGhpcy5mcmFtZS5nb3RvKG9wKTtcbiAgfVxuXG4gIGJlZ2luQ2FjaGVHcm91cCgpIHtcbiAgICB0aGlzLmNhY2hlR3JvdXBzLnB1c2godGhpcy51cGRhdGluZ09wY29kZVN0YWNrLmN1cnJlbnQudGFpbCgpKTtcbiAgfVxuXG4gIGNvbW1pdENhY2hlR3JvdXAoKSB7XG4gICAgLy8gICAgICAgIEp1bXBJZk5vdE1vZGlmaWVkKEVORClcbiAgICAvLyAgICAgICAgKGhlYWQpXG4gICAgLy8gICAgICAgICguLi4uKVxuICAgIC8vICAgICAgICAodGFpbClcbiAgICAvLyAgICAgICAgRGlkTW9kaWZ5XG4gICAgLy8gRU5EOiAgIE5vb3BcblxuICAgIGxldCBFTkQgPSBuZXcgTGFiZWxPcGNvZGUoXCJFTkRcIik7XG5cbiAgICBsZXQgb3Bjb2RlcyA9IHRoaXMudXBkYXRpbmdPcGNvZGVTdGFjay5jdXJyZW50O1xuICAgIGxldCBtYXJrZXIgPSB0aGlzLmNhY2hlR3JvdXBzLnBvcCgpO1xuICAgIGxldCBoZWFkID0gbWFya2VyID8gb3Bjb2Rlcy5uZXh0Tm9kZShtYXJrZXIpIDogb3Bjb2Rlcy5oZWFkKCk7XG4gICAgbGV0IHRhaWwgPSBvcGNvZGVzLnRhaWwoKTtcbiAgICBsZXQgdGFnID0gY29tYmluZVNsaWNlKG5ldyBMaXN0U2xpY2UoaGVhZCwgdGFpbCkpO1xuXG4gICAgbGV0IGd1YXJkID0gbmV3IEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlKHsgdGFnLCB0YXJnZXQ6IEVORCB9KTtcblxuICAgIG9wY29kZXMuaW5zZXJ0QmVmb3JlKGd1YXJkLCBoZWFkKTtcbiAgICBvcGNvZGVzLmFwcGVuZChuZXcgRGlkTW9kaWZ5T3Bjb2RlKHsgdGFyZ2V0OiBndWFyZCB9KSk7XG4gICAgb3Bjb2Rlcy5hcHBlbmQoRU5EKTtcbiAgfVxuXG4gIGVudGVyKG9wczogT3BTZXEpIHtcbiAgICBsZXQgdXBkYXRpbmcgPSBuZXcgTGlua2VkTGlzdDxVcGRhdGluZ09wY29kZT4oKTtcblxuICAgIGxldCB0cmFja2VyID0gdGhpcy5zdGFjaygpLnB1c2hVcGRhdGFibGVCbG9jaygpO1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZSgpO1xuXG4gICAgbGV0IHRyeU9wY29kZSA9IG5ldyBUcnlPcGNvZGUob3BzLCBzdGF0ZSwgdHJhY2tlciwgdXBkYXRpbmcpO1xuXG4gICAgdGhpcy5kaWRFbnRlcih0cnlPcGNvZGUsIHVwZGF0aW5nKTtcbiAgfVxuXG4gIGVudGVyV2l0aEtleShrZXk6IHN0cmluZywgb3BzOiBPcFNlcSkge1xuICAgIGxldCB1cGRhdGluZyA9IG5ldyBMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPigpO1xuXG4gICAgbGV0IHRyYWNrZXIgPSB0aGlzLnN0YWNrKCkucHVzaFVwZGF0YWJsZUJsb2NrKCk7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jYXB0dXJlKCk7XG5cbiAgICBsZXQgdHJ5T3Bjb2RlID0gbmV3IFRyeU9wY29kZShvcHMsIHN0YXRlLCB0cmFja2VyLCB1cGRhdGluZyk7XG5cbiAgICB0aGlzLmxpc3RCbG9ja1N0YWNrLmN1cnJlbnQubWFwW2tleV0gPSB0cnlPcGNvZGU7XG5cbiAgICB0aGlzLmRpZEVudGVyKHRyeU9wY29kZSwgdXBkYXRpbmcpO1xuICB9XG5cbiAgZW50ZXJMaXN0KG9wczogT3BTZXEpIHtcbiAgICBsZXQgdXBkYXRpbmcgPSBuZXcgTGlua2VkTGlzdDxCbG9ja09wY29kZT4oKTtcblxuICAgIGxldCB0cmFja2VyID0gdGhpcy5zdGFjaygpLnB1c2hCbG9ja0xpc3QodXBkYXRpbmcpO1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2FwdHVyZSgpO1xuICAgIGxldCBhcnRpZmFjdHMgPSB0aGlzLmZyYW1lLmdldEl0ZXJhdG9yKCkuYXJ0aWZhY3RzO1xuXG4gICAgbGV0IG9wY29kZSA9IG5ldyBMaXN0QmxvY2tPcGNvZGUob3BzLCBzdGF0ZSwgdHJhY2tlciwgdXBkYXRpbmcsIGFydGlmYWN0cyk7XG5cbiAgICB0aGlzLmxpc3RCbG9ja1N0YWNrLnB1c2gob3Bjb2RlKTtcblxuICAgIHRoaXMuZGlkRW50ZXIob3Bjb2RlLCB1cGRhdGluZyk7XG4gIH1cblxuICBwcml2YXRlIGRpZEVudGVyKG9wY29kZTogQmxvY2tPcGNvZGUsIHVwZGF0aW5nOiBMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPikge1xuICAgIHRoaXMudXBkYXRlV2l0aChvcGNvZGUpO1xuICAgIHRoaXMudXBkYXRpbmdPcGNvZGVTdGFjay5wdXNoKHVwZGF0aW5nKTtcbiAgfVxuXG4gIGV4aXQoKSB7XG4gICAgdGhpcy5zdGFjaygpLnBvcEJsb2NrKCk7XG4gICAgdGhpcy51cGRhdGluZ09wY29kZVN0YWNrLnBvcCgpO1xuXG4gICAgbGV0IHBhcmVudCA9IHRoaXMudXBkYXRpbmdPcGNvZGVTdGFjay5jdXJyZW50LnRhaWwoKSBhcyBCbG9ja09wY29kZTtcblxuICAgIHBhcmVudC5kaWRJbml0aWFsaXplQ2hpbGRyZW4oKTtcbiAgfVxuXG4gIGV4aXRMaXN0KCkge1xuICAgIHRoaXMuZXhpdCgpO1xuICAgIHRoaXMubGlzdEJsb2NrU3RhY2sucG9wKCk7XG4gIH1cblxuICB1cGRhdGVXaXRoKG9wY29kZTogVXBkYXRpbmdPcGNvZGUpIHtcbiAgICB0aGlzLnVwZGF0aW5nT3Bjb2RlU3RhY2suY3VycmVudC5hcHBlbmQob3Bjb2RlKTtcbiAgfVxuXG4gIHN0YWNrKCk6IEVsZW1lbnRTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrO1xuICB9XG5cbiAgc2NvcGUoKTogU2NvcGUge1xuICAgIHJldHVybiB0aGlzLnNjb3BlU3RhY2suY3VycmVudDtcbiAgfVxuXG4gIGR5bmFtaWNTY29wZSgpOiBEeW5hbWljU2NvcGUge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLmN1cnJlbnQ7XG4gIH1cblxuICBwdXNoRnJhbWUoeyBibG9jaywgYXJncywgYmxvY2tzLCBjYWxsZXJTY29wZSB9OiBQdXNoRnJhbWVPcHRpb25zKSB7XG4gICAgdGhpcy5mcmFtZS5wdXNoKGJsb2NrLm9wcyk7XG5cbiAgICBpZiAoYXJncykgdGhpcy5mcmFtZS5zZXRBcmdzKGFyZ3MpO1xuICAgIGlmIChibG9ja3MpIHRoaXMuZnJhbWUuc2V0QmxvY2tzKGJsb2Nrcyk7XG4gICAgaWYgKGNhbGxlclNjb3BlKSB0aGlzLmZyYW1lLnNldENhbGxlclNjb3BlKGNhbGxlclNjb3BlKTtcbiAgfVxuXG4gIHB1c2hDb21wb25lbnRGcmFtZShcbiAgICBsYXlvdXQ6IENvbXBpbGVkQmxvY2ssXG4gICAgYXJnczogRXZhbHVhdGVkQXJncyxcbiAgICBibG9ja3M6IEJsb2NrcyxcbiAgICBjYWxsZXJTY29wZTogU2NvcGUsXG4gICAgY29tcG9uZW50OiBDb21wb25lbnQsXG4gICAgbWFuYWdlcjogQ29tcG9uZW50TWFuYWdlcjxDb21wb25lbnQ+LFxuICAgIHNoYWRvdzogc3RyaW5nW11cbiAgKSB7XG4gICAgdGhpcy5mcmFtZS5wdXNoKGxheW91dC5vcHMsIGNvbXBvbmVudCwgbWFuYWdlciwgc2hhZG93KTtcblxuICAgIGlmIChhcmdzKSB0aGlzLmZyYW1lLnNldEFyZ3MoYXJncyk7XG4gICAgaWYgKGJsb2NrcykgdGhpcy5mcmFtZS5zZXRCbG9ja3MoYmxvY2tzKTtcbiAgICBpZiAoY2FsbGVyU2NvcGUpIHRoaXMuZnJhbWUuc2V0Q2FsbGVyU2NvcGUoY2FsbGVyU2NvcGUpO1xuICB9XG5cbiAgcHVzaEV2YWxGcmFtZShvcHM6IE9wU2VxKSB7XG4gICAgdGhpcy5mcmFtZS5wdXNoKG9wcyk7XG4gIH1cblxuICBwdXNoQ2hpbGRTY29wZSgpIHtcbiAgICB0aGlzLnNjb3BlU3RhY2sucHVzaCh0aGlzLnNjb3BlU3RhY2suY3VycmVudC5jaGlsZCgpKTtcbiAgfVxuXG4gIHB1c2hDYWxsZXJTY29wZSgpIHtcbiAgICB0aGlzLnNjb3BlU3RhY2sucHVzaCh0aGlzLnNjb3BlKCkuZ2V0Q2FsbGVyU2NvcGUoKSk7XG4gIH1cblxuICBwdXNoRHluYW1pY1Njb3BlKCk6IER5bmFtaWNTY29wZSB7XG4gICAgbGV0IGNoaWxkID0gdGhpcy5keW5hbWljU2NvcGVTdGFjay5jdXJyZW50LmNoaWxkKCk7XG4gICAgdGhpcy5keW5hbWljU2NvcGVTdGFjay5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBwdXNoUm9vdFNjb3BlKHNlbGY6IFBhdGhSZWZlcmVuY2U8YW55Piwgc2l6ZTogbnVtYmVyKTogU2NvcGUge1xuICAgIGxldCBzY29wZSA9IFNjb3BlLnJvb3Qoc2VsZiwgc2l6ZSk7XG4gICAgdGhpcy5zY29wZVN0YWNrLnB1c2goc2NvcGUpO1xuICAgIHJldHVybiBzY29wZTtcbiAgfVxuXG4gIHBvcFNjb3BlKCkge1xuICAgIHRoaXMuc2NvcGVTdGFjay5wb3AoKTtcbiAgfVxuXG4gIHBvcER5bmFtaWNTY29wZSgpIHtcbiAgICB0aGlzLmR5bmFtaWNTY29wZVN0YWNrLnBvcCgpO1xuICB9XG5cbiAgbmV3RGVzdHJveWFibGUoZDogRGVzdHJveWFibGUpIHtcbiAgICB0aGlzLnN0YWNrKCkubmV3RGVzdHJveWFibGUoZCk7XG4gIH1cblxuICAvLy8gU0NPUEUgSEVMUEVSU1xuXG4gIGdldFNlbGYoKTogUGF0aFJlZmVyZW5jZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zY29wZSgpLmdldFNlbGYoKTtcbiAgfVxuXG4gIHJlZmVyZW5jZUZvclN5bWJvbChzeW1ib2w6IG51bWJlcik6IFBhdGhSZWZlcmVuY2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUoKS5nZXRTeW1ib2woc3ltYm9sKTtcbiAgfVxuXG4gIGdldEFyZ3MoKTogRXZhbHVhdGVkQXJncyB7XG4gICAgcmV0dXJuIHRoaXMuZnJhbWUuZ2V0QXJncygpO1xuICB9XG5cbiAgLy8vIEVYRUNVVElPTlxuXG4gIGV4ZWN1dGUob3Bjb2RlczogT3BTZXEsIGluaXRpYWxpemU/OiAodm06IFZNKSA9PiB2b2lkKTogUmVuZGVyUmVzdWx0IHtcbiAgICBMT0dHRVIuZGVidWcoXCJbVk1dIEJlZ2luIHByb2dyYW0gZXhlY3V0aW9uXCIpO1xuXG4gICAgbGV0IHsgZWxlbWVudFN0YWNrLCBmcmFtZSwgdXBkYXRpbmdPcGNvZGVTdGFjaywgZW52IH0gPSB0aGlzO1xuXG4gICAgZWxlbWVudFN0YWNrLnB1c2hTaW1wbGVCbG9jaygpO1xuXG4gICAgdXBkYXRpbmdPcGNvZGVTdGFjay5wdXNoKG5ldyBMaW5rZWRMaXN0PFVwZGF0aW5nT3Bjb2RlPigpKTtcbiAgICBmcmFtZS5wdXNoKG9wY29kZXMpO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemUodGhpcyk7XG5cbiAgICBsZXQgb3Bjb2RlOiBPcGNvZGU7XG5cbiAgICB3aGlsZSAoZnJhbWUuaGFzT3Bjb2RlcygpKSB7XG4gICAgICBpZiAob3Bjb2RlID0gZnJhbWUubmV4dFN0YXRlbWVudCgpKSB7XG4gICAgICAgIExPR0dFUi5kZWJ1ZyhgW1ZNXSBPUCAke29wY29kZS50eXBlfWApO1xuICAgICAgICBMT0dHRVIudHJhY2Uob3Bjb2RlKTtcbiAgICAgICAgb3Bjb2RlLmV2YWx1YXRlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIExPR0dFUi5kZWJ1ZyhcIltWTV0gQ29tcGxldGVkIHByb2dyYW0gZXhlY3V0aW9uXCIpO1xuXG4gICAgcmV0dXJuIG5ldyBSZW5kZXJSZXN1bHQoe1xuICAgICAgZW52LFxuICAgICAgdXBkYXRpbmc6IHVwZGF0aW5nT3Bjb2RlU3RhY2sucG9wKCksXG4gICAgICBib3VuZHM6IGVsZW1lbnRTdGFjay5wb3BCbG9jaygpXG4gICAgfSk7XG4gIH1cblxuICBldmFsdWF0ZU9wY29kZShvcGNvZGU6IE9wY29kZSkge1xuICAgIG9wY29kZS5ldmFsdWF0ZSh0aGlzKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB5b3UgaGF2ZSBvcGNvZGVzIHRoYXQgcHVzaCBhbmQgcG9wIGEgc2NvcGUgYXJvdW5kIHRoaXMgb3Bjb2RlXG4gIC8vIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgc2NvcGUuXG4gIGludm9rZUJsb2NrKGJsb2NrOiBJbmxpbmVCbG9jaywgYXJnczogRXZhbHVhdGVkQXJncykge1xuICAgIGxldCBjb21waWxlZCA9IGJsb2NrLmNvbXBpbGUodGhpcy5lbnYpO1xuICAgIHRoaXMucHVzaEZyYW1lKHsgYmxvY2s6IGNvbXBpbGVkLCBhcmdzIH0pO1xuICB9XG5cbiAgaW52b2tlTGF5b3V0KFxuICAgIGFyZ3M6IEV2YWx1YXRlZEFyZ3MsXG4gICAgbGF5b3V0OiBDb21waWxlZEJsb2NrLFxuICAgIHRlbXBsYXRlczogVGVtcGxhdGVzLFxuICAgIGNhbGxlclNjb3BlOiBTY29wZSxcbiAgICBjb21wb25lbnQ6IENvbXBvbmVudCxcbiAgICBtYW5hZ2VyOiBDb21wb25lbnRNYW5hZ2VyPENvbXBvbmVudD4sXG4gICAgc2hhZG93OiBzdHJpbmdbXVxuICApIHtcbiAgICB0aGlzLnB1c2hDb21wb25lbnRGcmFtZShsYXlvdXQsIGFyZ3MsIHRlbXBsYXRlcywgY2FsbGVyU2NvcGUsIGNvbXBvbmVudCwgbWFuYWdlciwgc2hhZG93KTtcbiAgfVxuXG4gIGV2YWx1YXRlT3BlcmFuZChleHByOiBDb21waWxlZEV4cHJlc3Npb248YW55Pikge1xuICAgIHRoaXMuZnJhbWUuc2V0T3BlcmFuZChleHByLmV2YWx1YXRlKHRoaXMpKTtcbiAgfVxuXG4gIGV2YWx1YXRlQXJncyhhcmdzOiBDb21waWxlZEFyZ3MpIHtcbiAgICBsZXQgZXZhbGVkQXJncyA9IHRoaXMuZnJhbWUuc2V0QXJncyhhcmdzLmV2YWx1YXRlKHRoaXMpKTtcbiAgICB0aGlzLmZyYW1lLnNldE9wZXJhbmQoZXZhbGVkQXJncy5wb3NpdGlvbmFsLmF0KDApKTtcbiAgfVxuXG4gIGJpbmRQb3NpdGlvbmFsQXJncyhzeW1ib2xzOiBudW1iZXJbXSkge1xuICAgIGxldCBhcmdzID0gdGhpcy5mcmFtZS5nZXRBcmdzKCk7XG5cbiAgICBhc3NlcnQoYXJncywgXCJDYW5ub3QgYmluZCBwb3NpdGlvbmFsIGFyZ3NcIik7XG5cbiAgICBsZXQgeyBwb3NpdGlvbmFsIH0gPSBhcmdzO1xuXG4gICAgbGV0IHNjb3BlID0gdGhpcy5zY29wZSgpO1xuXG4gICAgZm9yKGxldCBpPTA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzY29wZS5iaW5kU3ltYm9sKHN5bWJvbHNbaV0sIHBvc2l0aW9uYWwuYXQoaSkpO1xuICAgIH1cbiAgfVxuXG4gIGJpbmROYW1lZEFyZ3MobmFtZXM6IHN0cmluZ1tdLCBzeW1ib2xzOiBudW1iZXJbXSkge1xuICAgIGxldCBhcmdzID0gdGhpcy5mcmFtZS5nZXRBcmdzKCk7XG5cbiAgICBhc3NlcnQoYXJncywgXCJDYW5ub3QgYmluZCBuYW1lZCBhcmdzXCIpO1xuXG4gICAgbGV0IHsgbmFtZWQgfSA9IGFyZ3M7XG5cbiAgICBsZXQgc2NvcGUgPSB0aGlzLnNjb3BlKCk7XG5cbiAgICBmb3IobGV0IGk9MDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzY29wZS5iaW5kU3ltYm9sKHN5bWJvbHNbaV0sIG5hbWVkLmdldChuYW1lc1tpXSkpO1xuICAgIH1cbiAgfVxuXG4gIGJpbmRCbG9ja3MobmFtZXM6IHN0cmluZ1tdLCBzeW1ib2xzOiBudW1iZXJbXSkge1xuICAgIGxldCBibG9ja3MgPSB0aGlzLmZyYW1lLmdldEJsb2NrcygpO1xuICAgIGxldCBjYWxsZXJTY29wZSA9IHRoaXMuZnJhbWUuZ2V0Q2FsbGVyU2NvcGUoKTtcblxuICAgIGxldCBzY29wZSA9IHRoaXMuc2NvcGUoKTtcblxuICAgIHNjb3BlLmJpbmRDYWxsZXJTY29wZShjYWxsZXJTY29wZSk7XG5cbiAgICBmb3IobGV0IGk9MDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzY29wZS5iaW5kQmxvY2soc3ltYm9sc1tpXSwgKGJsb2NrcyAmJiBibG9ja3NbbmFtZXNbaV1dKSB8fCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBiaW5kRHluYW1pY1Njb3BlKG5hbWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBhcmdzID0gdGhpcy5mcmFtZS5nZXRBcmdzKCk7XG5cbiAgICBhc3NlcnQoYXJncywgXCJDYW5ub3QgYmluZCBkeW5hbWljIHNjb3BlXCIpO1xuXG4gICAgbGV0IHNjb3BlID0gdGhpcy5keW5hbWljU2NvcGUoKTtcblxuICAgIGZvcihsZXQgaT0wOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNjb3BlLnNldChuYW1lc1tpXSwgYXJncy5uYW1lZC5nZXQobmFtZXNbaV0pKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIEV4Y2VwdGlvbkhhbmRsZXIge1xuICBoYW5kbGVFeGNlcHRpb24oaW5pdGlhbGl6ZT86ICh2bTogVk0pID0+IHZvaWQpO1xufVxuXG5pbnRlcmZhY2UgUmV0dXJuSGFuZGxlciB7XG4gIHNldFJlbmRlclJlc3VsdChyZW5kZXJSZXN1bHQ6IFJlbmRlclJlc3VsdCk7XG59XG4iXX0= enifed("glimmer-runtime/lib/vm/frame", ["exports"], function (exports) { "use strict"; var Frame = function Frame(ops) { var component = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];